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





visit link download