Reputation: 1
I would like to create an aem workflow model programmatically due to the business requirement, and i used below code to implement it, but it throws an exception,this problem has tortured for a week. Could you please give some hints? Thanks in advance.
The code is below!
package com.sample.mms.workflow;
import java.util.Iterator;
import java.util.List;
import javax.jcr.RepositoryException;
import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.sling.api.resource.LoginException;
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 com.sample.mms.service.ConfigurationService;
import com.sample.mms.service.TopicOwnerBizService;
import com.sample.mms.util.WorkflowUtil;
import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowService;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.exec.WorkflowProcess;
import com.day.cq.workflow.metadata.MetaDataMap;
import com.day.cq.workflow.model.WorkflowModel;
import com.day.cq.workflow.model.WorkflowNode;
import com.day.cq.workflow.model.WorkflowTransition;
@Component
@Service
@Properties({
@Property(name = Constants.SERVICE_DESCRIPTION, value = "general topic owner mark and approval each topic page step"),
@Property(name = Constants.SERVICE_VENDOR, value = "Someone"),
@Property(name = "process.label", value = "SAMPLE MMS NL - General Topic Owner Approval Process Step") })
public class TopicOwnerHandleProcessStep implements WorkflowProcess {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Reference
ResourceResolverFactory resourceResolverFactory;
@Reference
private ConfigurationService configurationService;
@Reference
private TopicOwnerBizService topicOwnerBizService;
@Reference
private WorkflowService workflowService;
@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metaDataMap)
throws WorkflowException {
final WorkflowData workflowData = workItem.getWorkflowData();
final String payLoadType = workflowData.getPayloadType();
if(!StringUtils.equals(payLoadType, "JCR_PATH")){
return;
}
final String payLoad = workflowData.getPayload().toString();
String topicOwnerGroup = configurationService.getTopic_owner_participant_group();
ResourceResolver resourceResolver = null;
UserManager userManager = null;
try {
resourceResolver = WorkflowUtil.getResourceResolver(resourceResolverFactory);
userManager = resourceResolver.adaptTo(UserManager.class);
List<User> list = WorkflowUtil.getUsersByGroup(userManager, topicOwnerGroup);
User user = null;
//create a model for each topic owner approval
WorkflowModel wm = workflowSession.createNewModel("sample mms topic owner review each topic page_" + System.currentTimeMillis());
WorkflowData wd = workflowSession.newWorkflowData("JCR_PATH", payLoad);
//get start node
WorkflowNode startNode = wm.getRootNode();
//wm.createNode("start",WorkflowNode.TYPE_START,"");
//get end node
WorkflowNode endNode = wm.getEndNode();
//wm.createNode("end",WorkflowNode.TYPE_END,"");
//create and split node
WorkflowNode andSplitNode = wm.createNode("and split",WorkflowNode.TYPE_AND_SPLIT,null);
//create and join node
WorkflowNode andJoinNode = wm.createNode("and join",WorkflowNode.TYPE_AND_JOIN,"");
wm.validate();
//create transition between start node and split node
wm.createTransition();
//wm.createTransition(startNode,andSplitNode,null);
//create transition between split node and end node
wm.createTransition(andJoinNode,endNode,null);
for(int i=0;i<list.size();i++){
user = list.get(i);
Iterator<Resource> resources = topicOwnerBizService.getResourceByTopicOwner(resourceResolver, payLoad, user.getID());
if(resources.hasNext()){
// ResourceResolver resourceResolver1 = WorkflowUtil.getResourceResolver(resourceResolverFactory);
// Session session = resourceResolver1.adaptTo(Session.class);
// WorkflowSession workflowSession1 = workflowService.getWorkflowSession(session);
// WorkflowModel wm = workflowSession1.getModel(configurationService.getTopicOwnerHandleSubsequentWorkflow());
// WorkflowData wd = workflowSession1.newWorkflowData("JCR_PATH", payLoad);
// wd.getMetaDataMap().put("topicOwnerParticipant", user.getID());
// workflowSession1.startWorkflow(wm, wd);
//create branch node for and split node
WorkflowNode topicOwnerParticipantNode = wm.createNode("topic owner participant",WorkflowNode.TYPE_PARTICIPANT,"");
//{timeoutMillis=0, timeoutHandler=com.sample.mms.workflow.TopicOwnerTimeoutHandler, PARTICIPANT=hunter.liang}
topicOwnerParticipantNode.getMetaDataMap().put("timeoutMillis", 0L);
topicOwnerParticipantNode.getMetaDataMap().put("timeoutHandler", "com.sample.mms.workflow.TopicOwnerTimeoutHandler");
topicOwnerParticipantNode.getMetaDataMap().put("PARTICIPANT", user.getID());
WorkflowNode orSplitNode = wm.createNode("or split",WorkflowNode.TYPE_OR_SPLIT,"");
WorkflowNode orJoinNode = wm.createNode("or join",WorkflowNode.TYPE_OR_JOIN,"");
//{PROCESS_AUTO_ADVANCE=true, PROCESS=com.sample.mms.workflow.TopicOwnerApprovalProcessStep, PROCESS_ARGS=approval}
WorkflowNode topicOwnerApprovalNode = wm.createNode("topic owner approval",WorkflowNode.TYPE_PROCESS,"");
topicOwnerApprovalNode.getMetaDataMap().put("PROCESS_AUTO_ADVANCE", true);
topicOwnerApprovalNode.getMetaDataMap().put("PROCESS", "com.sample.mms.workflow.TopicOwnerApprovalProcessStep");
topicOwnerApprovalNode.getMetaDataMap().put("PROCESS_ARGS", "approval");
//{PROCESS_AUTO_ADVANCE=true, PROCESS=com.sample.mms.workflow.TopicOwnerApprovalProcessStep, PROCESS_ARGS=reject}
WorkflowNode topicOwnerRejectNode = wm.createNode("topic owner reject",WorkflowNode.TYPE_PROCESS,"");
topicOwnerRejectNode.getMetaDataMap().put("PROCESS_AUTO_ADVANCE", true);
topicOwnerRejectNode.getMetaDataMap().put("PROCESS", "com.sample.mms.workflow.TopicOwnerApprovalProcessStep");
topicOwnerRejectNode.getMetaDataMap().put("PROCESS_ARGS", "reject");
WorkflowNode timeoutNode = wm.createNode("time out join",WorkflowNode.TYPE_PROCESS,"");
//wm.createTransition(andSplitNode,orSplitNode,"");
wm.createTransition(orSplitNode,topicOwnerApprovalNode,null);
wm.createTransition(orSplitNode,topicOwnerRejectNode,null);
WorkflowTransition orSplitAndTimeOutTransition = wm.createTransition(orSplitNode,timeoutNode,null);
orSplitAndTimeOutTransition.setRule("function check(){return false;}");
wm.createTransition(topicOwnerApprovalNode,orJoinNode,null);
wm.createTransition(topicOwnerRejectNode,orJoinNode,null);
wm.createTransition(timeoutNode,orJoinNode,null);
wm.createTransition(andSplitNode,orSplitNode,null);
wm.createTransition(orJoinNode,andJoinNode,null);
}
}
workflowSession.startWorkflow(wm, wd);
} catch (LoginException e) {
e.printStackTrace();
} catch (RepositoryException e) {
e.printStackTrace();
}
}
}
The error log is below!
20.04.2016 17:35:24.054 *INFO* [JobHandler: /etc/workflow/instances/2016-04-20/model_27918689599044:/content/samplemms/2016/02/index] com.adobe.granite.workflow.core.WorkflowSessionImpl Workflow model deployed: /etc/workflow/models/sample_mms_topic_owner_175(Version: 1.0)
20.04.2016 17:35:36.015 *ERROR* [JobHandler: /etc/workflow/instances/2016-04-20/model_27918689599044:/content/samplemms/2016/02/index] com.day.cq.workflow.compatibility.CQWorkflowProcessRunner Process execution resulted in an error: null
java.lang.NullPointerException: null
at com.adobe.granite.workflow.core.model.WorkflowModelImpl.createTransition(WorkflowModelImpl.java:155)
at com.adobe.granite.workflow.core.model.WorkflowModelImpl.createTransition(WorkflowModelImpl.java:149)
at com.day.cq.workflow.impl.model.CQWorkflowModelWrapper.createTransition(CQWorkflowModelWrapper.java:145)
at com.sample.mms.workflow.TopicOwnerHandleProcessStep.execute(TopicOwnerHandleProcessStep.java:105)
at com.day.cq.workflow.compatibility.CQWorkflowProcessRunner.execute(CQWorkflowProcessRunner.java:93)
at com.adobe.granite.workflow.core.job.HandlerBase.executeProcess(HandlerBase.java:215)
at com.adobe.granite.workflow.core.job.JobHandler.process(JobHandler.java:140)
at org.apache.sling.event.jobs.JobUtil$1.run(JobUtil.java:365)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
20.04.2016 17:35:36.015 *ERROR* [JobHandler: /etc/workflow/instances/2016-04-20/model_27918689599044:/content/samplemms/2016/02/index] com.adobe.granite.workflow.core.job.JobHandler Process execution resulted in an error
com.adobe.granite.workflow.WorkflowException: Process execution resulted in an error
at com.adobe.granite.workflow.core.job.HandlerBase.executeProcess(HandlerBase.java:225)
at com.adobe.granite.workflow.core.job.JobHandler.process(JobHandler.java:140)
at org.apache.sling.event.jobs.JobUtil$1.run(JobUtil.java:365)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.adobe.granite.workflow.WorkflowException: Failed to execute process
at com.day.cq.workflow.compatibility.CQWorkflowProcessRunner.execute(CQWorkflowProcessRunner.java:108)
at com.adobe.granite.workflow.core.job.HandlerBase.executeProcess(HandlerBase.java:215)
... 5 common frames omitted
Caused by: java.lang.NullPointerException: null
at com.adobe.granite.workflow.core.model.WorkflowModelImpl.createTransition(WorkflowModelImpl.java:155)
at com.adobe.granite.workflow.core.model.WorkflowModelImpl.createTransition(WorkflowModelImpl.java:149)
at com.day.cq.workflow.impl.model.CQWorkflowModelWrapper.createTransition(CQWorkflowModelWrapper.java:145)
at com.sample.mms.workflow.TopicOwnerHandleProcessStep.execute(TopicOwnerHandleProcessStep.java:105)
at com.day.cq.workflow.compatibility.CQWorkflowProcessRunner.execute(CQWorkflowProcessRunner.java:93)
... 6 common frames omitted
Upvotes: 0
Views: 2264
Reputation: 11
Instead of com.day.cq.workflow APIs,Can you try using the com.adobe.granite.workflow APIs.
Upvotes: 0