/* * Copyright 2012 david gonzalez. * * 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. */ package com.activecq.samples.workflow.impl; import com.day.cq.workflow.WorkflowException; 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 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.sling.api.resource.ResourceResolverFactory; import org.osgi.framework.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.Session; import java.util.Arrays; import java.util.logging.Level; /** * @author david */ @Component( label = "Samples - CQ Workflow Process", description = "Sample Workflow Process implementation", metatype = false, immediate = false ) @Properties({ @Property( name = Constants.SERVICE_DESCRIPTION, value = "Sample Workflow Process implementation.", propertyPrivate = true ), @Property( label = "Vendor", name = Constants.SERVICE_VENDOR, value = "ActiveCQ", propertyPrivate = true ), @Property( label = "Workflow Label", name = "process.label", value = "Sample Workflow Process", description = "Label which will appear in the Adobe CQ Workflow interface" ) }) @Service public class SampleProcessWorkflow implements WorkflowProcess { /** * OSGi Service References * */ @Reference ResourceResolverFactory resourceResolverFactory; /** * Fields * */ private static final Logger log = LoggerFactory.getLogger(SampleProcessWorkflow.class); /** * Work flow execute method * */ @Override public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap args) throws WorkflowException { // Get the Workflow data (the data that is being passed through for this work item) final WorkflowData workflowData = workItem.getWorkflowData(); final String type = workflowData.getPayloadType(); // Check if the payload is a path in the JCR if (!StringUtils.equals(type, "JCR_PATH")) { return; } Session session = workflowSession.getSession(); // Get the path to the JCR resource from the payload final String path = workflowData.getPayload().toString(); // Get data from a previous WF Step String previouslySetVal = getPersistedData(workItem, "set-in-previous-wf-step", "a default value"); try { // Get the node in the JCR the payload points to Node node = session.getNode(path); // Do things to the node } catch (PathNotFoundException ex) { java.util.logging.Logger.getLogger(SampleProcessWorkflow.class.getName()).log(Level.SEVERE, null, ex); } catch (RepositoryException ex) { java.util.logging.Logger.getLogger(SampleProcessWorkflow.class.getName()).log(Level.SEVERE, null, ex); } // Standard Arguments metadata String argument = args.get("PROCESS_ARGS", "default value"); // No parse "argument" as needed to extract delimited values // Custom WF inputs stored under ./metaData/argSingle and ./metadata/argMulti String singleValue = args.get("argSingle", "not set"); String[] multiValue = args.get("argMulti", new String[]{"not set"}); log.debug("Single Value: {}", singleValue); log.debug("Multi Value: {}", Arrays.toString(multiValue)); // Save data for use in a subsequent Workflow step persistData(workItem, workflowSession, "set-for-next-workflow", "whatever data you want"); throw new UnsupportedOperationException("Not supported yet."); } /** * Helper methods * */ private <T> boolean persistData(WorkItem workItem, WorkflowSession workflowSession, String key, T val) { WorkflowData data = workItem.getWorkflow().getWorkflowData(); if (data.getMetaDataMap() == null) { return false; } data.getMetaDataMap().put(key, val); workflowSession.updateWorkflowData(workItem.getWorkflow(), data); return true; } private <T> T getPersistedData(WorkItem workItem, String key, Class<T> type) { MetaDataMap map = workItem.getWorkflow().getWorkflowData().getMetaDataMap(); return map.get(key, type); } private <T> T getPersistedData(WorkItem workItem, String key, T defaultValue) { MetaDataMap map = workItem.getWorkflow().getWorkflowData().getMetaDataMap(); return map.get(key, defaultValue); } }