Wednesday, July 4, 2018
AEM 61 JcrPayloadPathBuilder Implementation to change Inbox Item Url from Touch to Classic
AEM 61 JcrPayloadPathBuilder Implementation to change Inbox Item Url from Touch to Classic
Goal
When a user clicks on Inbox item of Classic UI, by default the asset opens in Touch UI editor - /assetdetails.html
This post is on changing the url from Touch (/assetdetails.html) to Classic (/damadmin) for workflow started on assets in sample folder /content/dam/experience-aem
Demo | Source | Package Install
Solution
1) Create a OSGI service apps.experienceaem.inbox.ClassicUIAssetUrlPathBuilder implementing com.day.cq.workflow.ui.JcrPayloadPathBuilder with much lower ranking say -1306, installed in /apps/classicui-inbox-asset-url/install
package apps.experienceaem.inbox;
import com.day.cq.dam.api.Asset;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.ui.JcrPayloadPathBuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.*;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@Component(metatype = false)
@Service
@Properties({
@Property(name = Constants.SERVICE_DESCRIPTION, value = "Experience AEM Classic UI Inbox Asset Url"),
@Property(name = "service.ranking", intValue = -1306, propertyPrivate = false)
})
public class ClassicUIAssetUrlPathBuilder implements JcrPayloadPathBuilder {
private static final Logger log = LoggerFactory.getLogger(ClassicUIAssetUrlPathBuilder.class);
private static String EAEM_FOLDER = "/content/dam/experience-aem";
@Reference
private ResourceResolverFactory resolverFactory;
public String buildPath(WorkItem item) {
ResourceResolver srvResolver = null;
try {
if (!item.getWorkflowData().getPayloadType().equals("JCR_PATH")) {
return null;
}
String path = item.getWorkflowData().getPayload().toString();
Map<String, Object> authMap = new HashMap<String, Object>();
authMap.put(ResourceResolverFactory.SUBSERVICE, "pathbuilder");
srvResolver = resolverFactory.getServiceResourceResolver(authMap);
Resource res = srvResolver.getResource(path);
if (res == null || !StringUtils.startsWith(res.getPath(), EAEM_FOLDER)) {
return null;
}
if (res.adaptTo(Asset.class) != null) {
return "/damadmin#" + res.getPath();
}
} catch (Exception e) {
log.warn("Error creating inbox asset url", e);
} finally {
if (srvResolver != null) {
srvResolver.close();
}
}
return null;
}
}
2) Create a service user mapping for bundle apps.experienceaem.inbox.classicui-inbox-asset-url-bundle and sub service pathbuilder in folder /apps/classicui-inbox-asset-url/config, node org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-eaem of type sling:OsgiConfig
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root
jcr_primaryType="sling:OsgiConfig"
user.mapping="[apps.experienceaem.inbox.classicui-inbox-asset-url-bundle:pathbuilder=targetservice]"/>
3) Check the component registered in http://localhost:4502/system/console/components
