/* * #%L * ACS AEM Commons Bundle * %% * Copyright (C) 2016 Adobe * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package com.adobe.acs.commons.workflow.synthetic.impl.granite; import com.adobe.acs.commons.workflow.synthetic.SyntheticWorkflowModel; import com.adobe.acs.commons.workflow.synthetic.impl.granite.exceptions.SyntheticWorkflowModelException; import com.adobe.granite.workflow.WorkflowException; import com.adobe.granite.workflow.WorkflowSession; import com.adobe.granite.workflow.model.WorkflowModel; import com.adobe.granite.workflow.model.WorkflowNode; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class SyntheticWorkflowModelImpl implements SyntheticWorkflowModel { private static final Logger log = LoggerFactory.getLogger(SyntheticWorkflowModelImpl.class); private static final String WORKFLOW_MODEL_PATH_PREFIX = "/etc/workflow/models/"; private static final String WORKFLOW_MODEL_PATH_SUFFIX = "/jcr:content/model"; private Map<String, Map<String, Object>> syntheticWorkflowModel = new LinkedHashMap<String, Map<String, Object>>(); public SyntheticWorkflowModelImpl(WorkflowSession workflowSession, String modelId, boolean ignoredIncompatibleTypes) throws WorkflowException { if (!StringUtils.startsWith(modelId, WORKFLOW_MODEL_PATH_PREFIX)) { modelId = WORKFLOW_MODEL_PATH_PREFIX + modelId; } if (!StringUtils.endsWith(modelId, WORKFLOW_MODEL_PATH_SUFFIX)) { modelId = modelId + WORKFLOW_MODEL_PATH_SUFFIX; } final WorkflowModel model = workflowSession.getModel(modelId); log.debug("Located Workflow Model [ {} ] with modelId [ {} ]", model.getTitle(), modelId); final List<WorkflowNode> nodes = model.getNodes(); for (final WorkflowNode node : nodes) { if (!ignoredIncompatibleTypes && !this.isValidType(node)) { // Only Process Steps are allowed throw new SyntheticWorkflowModelException(node.getId() + " is of incompatible type " + node.getType()); } else if (node.getTransitions().size() > 1) { throw new SyntheticWorkflowModelException(node.getId() + " has unsupported decision based execution (more than 1 transitions is not allowed)"); } // No issues with Workflow Model; Collect the Process type log.debug("Workflow node title [ {} ]", node.getTitle()); if (this.isProcessType(node)) { final String processName = node.getMetaDataMap().get("PROCESS", ""); if (StringUtils.isNotBlank(processName)) { log.debug("Adding Workflow Process [ {} ] to Synthetic Workflow", processName); syntheticWorkflowModel.put(processName, node.getMetaDataMap()); } } } } public final String[] getWorkflowProcessNames() { return this.syntheticWorkflowModel.keySet().toArray(new String[this.syntheticWorkflowModel.keySet().size()]); } public final Map<String, Map<String, Object>> getSyntheticWorkflowModelData() { return this.syntheticWorkflowModel; } private boolean isValidType(WorkflowNode node) { return WorkflowNode.TYPE_START.equals(node.getType()) || WorkflowNode.TYPE_START.equals(node.getType()) || WorkflowNode.TYPE_PROCESS.equals(node.getType()); } private boolean isProcessType(WorkflowNode node) { return WorkflowNode.TYPE_PROCESS.equals(node.getType()); } }