AssetOffloadingProcess.java 7.86 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.offloading.api.OffloadingJobProperties
 *  com.adobe.granite.offloading.workflow.api.WorkflowOffloadingHelper
 *  com.adobe.granite.offloading.workflow.api.WorkflowOffloadingProcessArguments
 *  com.adobe.granite.offloading.workflow.api.WorkflowOffloadingProperties
 *  com.adobe.granite.workflow.WorkflowException
 *  com.adobe.granite.workflow.WorkflowSession
 *  com.adobe.granite.workflow.exec.WorkItem
 *  com.adobe.granite.workflow.exec.Workflow
 *  com.adobe.granite.workflow.exec.WorkflowData
 *  com.adobe.granite.workflow.exec.WorkflowExternalProcess
 *  com.adobe.granite.workflow.metadata.MetaDataMap
 *  com.day.cq.dam.api.Asset
 *  com.day.cq.dam.api.Rendition
 *  com.day.cq.dam.commons.util.DamUtil
 *  org.apache.commons.lang.StringUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.api.wrappers.ValueMapDecorator
 *  org.apache.sling.event.jobs.Job
 *  org.apache.sling.event.jobs.JobManager
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.dam.core.process;

import com.adobe.granite.offloading.api.OffloadingJobProperties;
import com.adobe.granite.offloading.workflow.api.WorkflowOffloadingHelper;
import com.adobe.granite.offloading.workflow.api.WorkflowOffloadingProcessArguments;
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.Workflow;
import com.adobe.granite.workflow.exec.WorkflowData;
import com.adobe.granite.workflow.exec.WorkflowExternalProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.day.cq.dam.api.Asset;
import com.day.cq.dam.api.Rendition;
import com.day.cq.dam.commons.util.DamUtil;
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.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service
public class AssetOffloadingProcess
implements WorkflowExternalProcess {
    private static final String TYPE_JCR_PATH = "JCR_PATH";
    private final Logger log;
    @Reference
    private JobManager jobManager;

    public AssetOffloadingProcess() {
        this.log = LoggerFactory.getLogger(this.getClass());
    }

    public Serializable execute(WorkItem item, WorkflowSession wfSession, MetaDataMap arguments) throws WorkflowException {
        String[] includeMimeTypes = (String[])arguments.get(Arguments.INCLUDE_MIME_TYPES.name(), String[].class);
        Asset asset = this.getAsset(item, wfSession, arguments);
        if (!this.doProcess(asset, includeMimeTypes)) {
            this.log.debug("Skipping for asset " + asset.getPath());
            return null;
        }
        if (asset != null) {
            ValueMap jobProperties = this.getAllJobProperties(asset, item, arguments);
            String jobTopic = WorkflowOffloadingHelper.getJobTopic((MetaDataMap)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 {
    }

    protected Asset getAsset(WorkItem item, WorkflowSession wfSession, MetaDataMap arguments) {
        ResourceResolver resolver;
        Resource resource;
        Asset asset = null;
        String payload = (String)arguments.get(WorkflowOffloadingProcessArguments.WORKFLOW_PAYLOAD.getArgumentName(), String.class);
        if (StringUtils.isBlank((String)payload) && item.getWorkflowData().getPayloadType().equals("JCR_PATH")) {
            payload = item.getWorkflowData().getPayload().toString();
        }
        if (null != (resource = (resolver = (ResourceResolver)wfSession.adaptTo(ResourceResolver.class)).getResource(payload))) {
            asset = DamUtil.resolveToAsset((Resource)resource);
        } else {
            this.log.error("getAsset: asset [{}] in payload of workflow [{}] does not exist.", (Object)payload, (Object)item.getWorkflow().getId());
        }
        return asset;
    }

    private ValueMap getAllJobProperties(Asset asset, WorkItem item, MetaDataMap arguments) throws WorkflowException {
        ValueMapDecorator allJobProperties = new ValueMapDecorator(new HashMap());
        String workflowModel = WorkflowOffloadingHelper.getWorkflowModel((MetaDataMap)arguments);
        if (StringUtils.isEmpty((String)workflowModel)) {
            throw new WorkflowException("No workflow model specified, cannot execute workflow.");
        }
        String workflowPayload = asset.getOriginal().getPath();
        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((MetaDataMap)arguments));
        String workflowOffloadingInput = WorkflowOffloadingHelper.getWorkflowOffloadingInput((MetaDataMap)arguments, (String)asset.getPath(), (String)workflowModel);
        allJobProperties.put((Object)OffloadingJobProperties.INPUT_PAYLOAD.propertyName(), (Object)workflowOffloadingInput);
        String workflowOffloadingOutput = WorkflowOffloadingHelper.getWorkflowOffloadingOutput((MetaDataMap)arguments, (String)asset.getPath(), (String)workflowModel);
        allJobProperties.put((Object)OffloadingJobProperties.OUTPUT_PAYLOAD.propertyName(), (Object)workflowOffloadingOutput);
        return allJobProperties;
    }

    private boolean doProcess(Asset asset, String[] includeMimeTypes) {
        if (asset == null) {
            return false;
        }
        if (includeMimeTypes == null) {
            return true;
        }
        String mimeType = asset.getMimeType();
        for (int i = 0; i < includeMimeTypes.length; ++i) {
            if (!includeMimeTypes[i].equalsIgnoreCase(mimeType) && !includeMimeTypes[i].equals("*")) continue;
            return true;
        }
        return false;
    }

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

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

    public static enum Arguments {
        INCLUDE_MIME_TYPES;
        

        private Arguments() {
        }
    }

}