Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

Identity payload type in workflow step/s

Avatar

Community Advisor

Hi All!

In workflow steps, is there any out of the box option to identify the payload type or MIME type (cq:page vs dam:asset)?

Goal is to make author execute workflow only in sites pages, and not on any of the dam assets.  

 

TIA,

1 Accepted Solution

Avatar

Correct answer by
Employee Advisor

Hi @Nitin_laad ,

 

I was exploring page lock operation using Page api and wrote this sample logic -

/**
*
*/
package com.aem.demo.core.workflows;

import java.util.Objects;

import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.WCMException;

/**
* @author debal This workflow step is responsible to lock AEM page.
*/

@Component(property = { Constants.SERVICE_DESCRIPTION + "=This workflow step is responsible to lock AEM page",
Constants.SERVICE_VENDOR + "=AEM Demo Debal", "process.label" + "=Page lock process" })
public class PageLockWorkflowStep implements WorkflowProcess {

private final Logger logger = LoggerFactory.getLogger(PageLockWorkflowStep.class);

@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metaDataMap)
throws WorkflowException {

String payloadPath = workItem.getWorkflowData().getPayload().toString();

ResourceResolver resourceResolver = workflowSession.adaptTo(ResourceResolver.class);

Resource resource = resourceResolver.getResource(payloadPath);

if (Objects.nonNull(resource) && resource.isResourceType("cq:Page")) {

Page page = resource.adaptTo(Page.class);
try {
page.lock();
} catch (WCMException e) {

logger.error("Unable to lock the given Page", e.getMessage());
}

} else {
logger.info("**** Resource isn't a page**** {} ");
}
}

}

 

In this sample workflow step, I was checking resource type cq:Page with following logic - resource.isResourceType("cq:Page") explicitly.

View solution in original post

3 Replies

Avatar

Community Advisor

Hi @Nitin_laad,

I am not aware about OOTB workflow step that will meet your requirement. However you can consider to use OOTB OR Split, with proper ecma script to recognize payload type and choose different workflow path. Here is an example of ecma script, that is checking node type base on path form payload:

function check() {
    if (workflowData.getPayloadType() == "JCR_PATH") {
        var path = workflowData.getPayload().toString();
        var jcrSession = workflowSession.getSession();
        if (jcrSession.nodeExists(path)) {
            var node = jcrSession.getNode(path);
            return node.getProperty("jcr:primaryType").getString().equals("cq:Page");
        }
    }
    return false;
}

Of course anything you can define as part of ecma script, you can implement via custom workflow step. Maybe this documentation will be useful if you would like to learn more about ecma script.

Avatar

Community Advisor

Thank you @lukasz-m , @DEBAL_DASI'm just avoiding writing any custom code (JAVA/ECMA script), so I decided to check here in the community if there is any OOB solution.   

Avatar

Correct answer by
Employee Advisor

Hi @Nitin_laad ,

 

I was exploring page lock operation using Page api and wrote this sample logic -

/**
*
*/
package com.aem.demo.core.workflows;

import java.util.Objects;

import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.WCMException;

/**
* @author debal This workflow step is responsible to lock AEM page.
*/

@Component(property = { Constants.SERVICE_DESCRIPTION + "=This workflow step is responsible to lock AEM page",
Constants.SERVICE_VENDOR + "=AEM Demo Debal", "process.label" + "=Page lock process" })
public class PageLockWorkflowStep implements WorkflowProcess {

private final Logger logger = LoggerFactory.getLogger(PageLockWorkflowStep.class);

@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metaDataMap)
throws WorkflowException {

String payloadPath = workItem.getWorkflowData().getPayload().toString();

ResourceResolver resourceResolver = workflowSession.adaptTo(ResourceResolver.class);

Resource resource = resourceResolver.getResource(payloadPath);

if (Objects.nonNull(resource) && resource.isResourceType("cq:Page")) {

Page page = resource.adaptTo(Page.class);
try {
page.lock();
} catch (WCMException e) {

logger.error("Unable to lock the given Page", e.getMessage());
}

} else {
logger.info("**** Resource isn't a page**** {} ");
}
}

}

 

In this sample workflow step, I was checking resource type cq:Page with following logic - resource.isResourceType("cq:Page") explicitly.