hunter.liang
hunter.liang

Reputation: 1

how to create workflow model programmatically in aem

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

Answers (1)

Sajeev V. Joseph
Sajeev V. Joseph

Reputation: 11

Instead of com.day.cq.workflow APIs,Can you try using the com.adobe.granite.workflow APIs.

Upvotes: 0

Related Questions