WorkflowOffloadingProcess.java 5.25 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.offloading.api.OffloadingJobProperties
 *  com.adobe.granite.workflow.WorkflowException
 *  com.adobe.granite.workflow.WorkflowSession
 *  com.adobe.granite.workflow.exec.WorkItem
 *  com.adobe.granite.workflow.exec.WorkflowData
 *  com.adobe.granite.workflow.exec.WorkflowExternalProcess
 *  com.adobe.granite.workflow.metadata.MetaDataMap
 *  org.apache.commons.lang.StringUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.api.wrappers.ValueMapDecorator
 *  org.apache.sling.event.jobs.Job
 *  org.apache.sling.event.jobs.JobManager
 */
package com.adobe.granite.offloading.workflow.impl;

import com.adobe.granite.offloading.api.OffloadingJobProperties;
import com.adobe.granite.offloading.workflow.api.WorkflowOffloadingHelper;
import com.adobe.granite.offloading.workflow.api.WorkflowOffloadingProperties;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowData;
import com.adobe.granite.workflow.exec.WorkflowExternalProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
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.Service;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.apache.sling.event.jobs.Job;
import org.apache.sling.event.jobs.JobManager;

@Component
@Service(value={WorkflowExternalProcess.class})
@Property(name="process.label", value={"%process.workflowExecutionProcess.label"})
public class WorkflowOffloadingProcess
implements WorkflowExternalProcess {
    @Reference
    private JobManager jobManager;

    public Serializable execute(WorkItem item, WorkflowSession session, MetaDataMap arguments) throws WorkflowException {
        if (item.getWorkflowData().getPayloadType().equals("JCR_PATH")) {
            ValueMap jobProperties = this.getAllJobProperties(item, arguments);
            String jobTopic = WorkflowOffloadingHelper.getJobTopic(arguments);
            if (StringUtils.isEmpty((String)jobTopic)) {
                throw new WorkflowException("job topic must not be empty");
            }
            Job offloadingJob = this.jobManager.addJob(jobTopic, (Map)jobProperties);
            if (offloadingJob == null) {
                throw new WorkflowException("not able to create job");
            }
            return offloadingJob.getId();
        }
        throw new WorkflowException("Can not execute step. Not a path based workflow payload");
    }

    public boolean hasFinished(Serializable externalProcessId, WorkItem item, WorkflowSession session, MetaDataMap arguments) {
        Job offloadingJob = this.jobManager.getJobById((String)((Object)externalProcessId));
        return offloadingJob == null;
    }

    public void handleResult(Serializable externalProcessId, WorkItem workItem, WorkflowSession session, MetaDataMap arguments) throws WorkflowException {
    }

    private ValueMap getAllJobProperties(WorkItem item, MetaDataMap arguments) throws WorkflowException {
        ValueMapDecorator allJobProperties = new ValueMapDecorator(new HashMap());
        String workflowModel = WorkflowOffloadingHelper.getWorkflowModel(arguments);
        if (StringUtils.isEmpty((String)workflowModel)) {
            throw new WorkflowException("No workflow model specified, cannot execute workflow.");
        }
        String fallbackPayload = (String)item.getWorkflowData().getPayload();
        String workflowPayload = WorkflowOffloadingHelper.getWorkflowPayload(fallbackPayload, arguments);
        if (StringUtils.isEmpty((String)workflowPayload)) {
            throw new WorkflowException("No workflow payload specified, cannot execute workflow.");
        }
        allJobProperties.put((Object)WorkflowOffloadingProperties.OFFLOADING_WORKFLOW_MODEL.getPropertyName(), (Object)workflowModel);
        allJobProperties.put((Object)WorkflowOffloadingProperties.OFFLOADING_WORKFLOW_PAYLOAD.getPropertyName(), (Object)workflowPayload);
        allJobProperties.putAll((Map)WorkflowOffloadingHelper.getJobProperties(arguments));
        allJobProperties.put((Object)OffloadingJobProperties.INPUT_PAYLOAD.propertyName(), (Object)WorkflowOffloadingHelper.getWorkflowOffloadingInput(arguments, workflowPayload, workflowModel));
        allJobProperties.put((Object)OffloadingJobProperties.OUTPUT_PAYLOAD.propertyName(), (Object)WorkflowOffloadingHelper.getWorkflowOffloadingOutput(arguments, workflowPayload, workflowModel));
        return allJobProperties;
    }

    protected void bindJobManager(JobManager jobManager) {
        this.jobManager = jobManager;
    }

    protected void unbindJobManager(JobManager jobManager) {
        if (this.jobManager == jobManager) {
            this.jobManager = null;
        }
    }
}