All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.day.cq.workflow.compatibility.CQWorkflowProcessRunner Maven / Gradle / Ivy

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * ___________________
 *
 *  Copyright 2012 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.day.cq.workflow.compatibility;

import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.StepExecutor;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.day.cq.workflow.WorkflowService;
import com.day.cq.workflow.exec.JavaProcess;
import com.day.cq.workflow.exec.JavaProcessExt;
import com.day.cq.workflow.exec.WorkflowProcess;
import com.day.cq.workflow.impl.CQWorkflowSessionWrapper;
import com.day.cq.workflow.impl.exec.CQWorkItemWrapper;
import com.day.cq.workflow.impl.metadata.CQMetaDataMap;
import com.day.cq.workflow.impl.model.CQWorkflowNodeWrapper;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.References;
import org.apache.felix.scr.annotations.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@Component(metatype = false, label = "%cq.workflow.compat.executor.name", description = "%cq.workflow.compat.executor.description")
@Property(name = "service.description", value="%cq.workflow.compat.executor.description")
@References({
    @Reference(name = "WorkflowProcess", cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, referenceInterface = WorkflowProcess.class, policy = ReferencePolicy.DYNAMIC),
    @Reference(name = "Process", cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, referenceInterface = JavaProcess.class, policy = ReferencePolicy.DYNAMIC)
})
@Service
public class CQWorkflowProcessRunner implements StepExecutor {
    protected final Logger log = LoggerFactory.getLogger(getClass());

    @Reference
    private WorkflowService cqWorkflowService;

    protected List workflowProcesses = new CopyOnWriteArrayList();
    protected List processes = new CopyOnWriteArrayList();

    public void bindWorkflowProcess(WorkflowProcess process) {
        workflowProcesses.add(process);
    }

    public void unbindWorkflowProcess(WorkflowProcess process) {
        workflowProcesses.remove(process);
    }

    // TODO remove after 5.4
    public void bindProcess(JavaProcess process) {
        processes.add(process);
    }

    // TODO remove after 5.4
    public void unbindProcess(JavaProcess process) {
        processes.remove(process);
    }

    public void execute(String resource, WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metaDataMap) throws WorkflowException {
        // search for process implementation to be executed
        Object toBeExecuted = evaluateExecutable(resource);
        if (toBeExecuted != null) {
            try {
                CQWorkflowSessionWrapper sessionWrapper = new CQWorkflowSessionWrapper(cqWorkflowService, workflowSession);
                CQWorkItemWrapper workItemWrapper = new CQWorkItemWrapper(workItem);
                CQMetaDataMap cqMetaDataMap = new CQMetaDataMap(metaDataMap);
                String args[] = getArgs(workItem);

                if (toBeExecuted instanceof WorkflowProcess) {
                    WorkflowProcess process = (WorkflowProcess) toBeExecuted;

                    process.execute(workItemWrapper, sessionWrapper, cqMetaDataMap);
                }
                else if (toBeExecuted instanceof JavaProcessExt) {
                    JavaProcessExt process = (JavaProcessExt) toBeExecuted;
                    process.execute(workItemWrapper, sessionWrapper, args);
                }
                else if (toBeExecuted instanceof JavaProcess) {
                    JavaProcess process = (JavaProcess) toBeExecuted;
                    process.execute(workItemWrapper, sessionWrapper);
                } else {
                    // should actually never happen
                    log.error("unsupported process instance " + toBeExecuted);
                }
            } catch (Throwable t) {
                log.error("Process execution resulted in an error: " + t.getMessage(), t);
                throw new WorkflowException("Failed to execute process", t);
            }
        }
    }

    public boolean canExecute(String resource) {
        return evaluateExecutable(resource)!=null;
    }

    /**
     * Attempts to evaluate the process implementation for the given resource.
     *
     * @param resource
     *            The name of the process implementation to search for.
     * @return The process implementation to use, or null if none
     *         can be evaluated.
     */
    private Object evaluateExecutable(String resource) {
        Object toBeExecuted = null;
        for (WorkflowProcess workfowProcess : workflowProcesses) {
            if (resource.equals(workfowProcess.getClass().getName())) {
                toBeExecuted = workfowProcess;
                break;
            }
        }

        // TODO remove after 5.4
        if (toBeExecuted == null) {
            for (JavaProcess javaProcess : processes) {
                if (resource.equals(javaProcess.getClass().getName())) {
                    toBeExecuted = javaProcess;
                    break;
                }
            }
        }

        return toBeExecuted;
    }

    protected String[] getArgs(WorkItem item) {
        String arguments = item.getNode().getMetaDataMap().get(CQWorkflowNodeWrapper.PROCESS_ARGS, String.class);
        if (arguments != null && !arguments.equals("")) {
            return arguments.split(",");
        }
        return new String[0];
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy