com.day.cq.wcm.commons.UGCUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aem-sdk-api Show documentation
Show all versions of aem-sdk-api Show documentation
The Adobe Experience Manager SDK
/*************************************************************************
*
* ADOBE CONFIDENTIAL
* __________________
*
* Copyright 2012 Adobe Systems Incorporated
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe Systems Incorporated and its suppliers,
* if any. The intellectual and technical concepts contained
* herein are proprietary to Adobe Systems Incorporated and its
* suppliers and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe Systems Incorporated.
**************************************************************************/
package com.day.cq.wcm.commons;
import com.day.cq.commons.jcr.JcrUtil;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.WCMException;
import com.day.text.Text;
import org.apache.commons.lang.StringUtils;
import org.apache.jackrabbit.JcrConstants;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import java.util.StringTokenizer;
import static com.day.cq.commons.jcr.JcrConstants.JCR_CONTENT;
import static com.day.cq.wcm.commons.Constants.PATH_UGC;
/**
* Collection of utilities revolving around CQ Social Collaboration features.
*
* @since CQ 5.6
*/
public class UGCUtil {
/**
* This method maps the given resource
to its equivalent path in /usergenerated, e.g. as the
* relationship a page /content/test to its comment at /content/usergenerated/content/test.
*
* @param resource The resource to transpose to the comment's UCG path.
* @return A String
representing the equivalent UCG path.
*/
public static String resourceToUGCPath(final Resource resource) {
final StringBuilder path = new StringBuilder(PATH_UGC);
// append resource path without "/jcr:content/*"
path.append(getPagePath(resource));
// append resource name without any selectors / extension
path.append("/").append(JCR_CONTENT);
path.append("/").append(getIdFromResource(resource));
return path.toString();
}
/**
* This method maps the given resource
in /content/usergenerated to its equivalent path in the normal
* content tree, e.g. as the relationship of a comment in //content/usergenerated/content/test to its parent
* resource at /content/test.
*
* @param resource The resource to transpose.
* @return A String
representing the equivalent normal content path.
*/
public static String UGCToResourcePath(final Resource resource) {
final String pagePath = StringUtils.substringAfter(resource.getPath(), PATH_UGC);
return resource.getResourceResolver().map(pagePath);
}
/**
* Returns the given resource
's path without its potential /jcr:content/... suffix, thus
* representing a page path.
*
* @param resource The resource to check.
* @return A String
representing the page path.
*/
public static String getPagePath(final Resource resource) {
return StringUtils.substringBefore(resource.getPath(), "/" + JCR_CONTENT);
}
/**
* Gets or creates user generated content node
*
* @param resolver The resource resolver.
* @param pagePath The page path.
* @return A String
representing the UCG path.
* @throws WCMException If an error occurs while getting or creating user generated content node
*/
public static String prepareUserGeneratedContent(ResourceResolver resolver, String pagePath) throws WCMException {
String ugcPagePath = PATH_UGC;
StringTokenizer pathElems = new StringTokenizer(pagePath, "/");
while (pathElems.hasMoreTokens()) {
ugcPagePath += "/" + pathElems.nextToken();
if (resolver.getResource(ugcPagePath) != null) {
continue;
}
if (ugcPagePath.equals(PATH_UGC + "/content")) {
// special treatment for root node
createNode(resolver, ugcPagePath, "sling:Folder");
save(resolver);
} else {
// create pages for parents
createPage(resolver, ugcPagePath, null, null, null, null);
}
}
return ugcPagePath;
}
/**
* Returns the given resource
's name without selectors and / or file extension.
*
* @param resource The resource from which to retrieve its name.
* @return A String
representing the id.
*/
public static String getIdFromResource(final Resource resource) {
return StringUtils.substringBefore(ResourceUtil.getName(resource), ".");
}
protected static void save(ResourceResolver resolver) throws WCMException, IllegalArgumentException {
Session session = resolver.adaptTo(Session.class);
if (session == null) {
throw new IllegalArgumentException("resolver must be adaptable to session");
}
try {
session.save();
} catch (RepositoryException re) {
throw new WCMException("failed to save changes", re);
}
}
protected static Page createPage(ResourceResolver resolver,
String path,
String template,
String resourceTypeProp,
String resourceType,
String title) throws WCMException {
String parentPath = Text.getRelativeParent(path, 1);
String name = Text.getName(path);
return createPage(resolver, parentPath, name, template, resourceTypeProp, resourceType, title);
}
protected static Page createPage(ResourceResolver resolver,
String parentPath,
String name,
String template,
String resourceTypeProp,
String resourceType,
String title) throws WCMException {
Exception e;
try {
// ensure parent nodes
if (resolver.getResource(parentPath) == null) {
createNode(resolver, parentPath, JcrConstants.NT_UNSTRUCTURED);
save(resolver);
}
if (!JcrUtil.isValidName(name)) {
name = JcrUtil.createValidName(name, JcrUtil.HYPHEN_LABEL_CHAR_MAPPING);
}
Page page = resolver.adaptTo(PageManager.class).create(parentPath, name, template, title);
if (StringUtils.isNotEmpty(resourceTypeProp)) {
page.getContentResource().adaptTo(Node.class).setProperty(resourceTypeProp, resourceType);
}
return page;
} catch (RepositoryException re) {
e = re;
} catch (WCMException wcme) {
e = wcme;
}
throw new WCMException("failed to create page", e);
}
protected static Node createNode(ResourceResolver resolver, String path, String nodeType) throws WCMException {
if (path.startsWith("/")) {
path = path.substring(1);
}
try {
Node root = resolver.adaptTo(Session.class).getRootNode();
// check parents
StringTokenizer names = new StringTokenizer(Text.getRelativeParent(path, 1), "/");
while (names.hasMoreTokens()) {
String name = names.nextToken();
if (!root.hasNode(name)) {
root.addNode(name);
}
root = root.getNode(name);
}
// add node
return root.addNode(Text.getName(path), nodeType);
} catch (Exception e) {
throw new WCMException("failed to create node", e);
}
}
}