DefaultPayloadMapper.java 6.05 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.aemfd.docmanager.Document
 *  com.adobe.granite.workflow.exec.Workflow
 *  javax.jcr.Binary
 *  javax.jcr.Node
 *  javax.jcr.NodeIterator
 *  javax.jcr.Property
 *  javax.jcr.PropertyIterator
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.ResourceResolver
 */
package com.adobe.aemfd.watchfolder.workflow;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.aemfd.watchfolder.util.JcrUtil;
import com.adobe.aemfd.watchfolder.workflow.api.payload.PayloadMapper;
import com.adobe.aemfd.watchfolder.workflow.api.payload.WorkflowExecutionContext;
import com.adobe.aemfd.watchfolder.workflow.api.payload.WorkflowInitializationContext;
import com.adobe.aemfd.watchfolder.workflow.api.payload.WorkflowVariable;
import com.adobe.granite.workflow.exec.Workflow;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.jcr.Binary;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
@Component(immediate=1)
@Service(value={PayloadMapper.class})
public class DefaultPayloadMapper
implements PayloadMapper {
    private static final String VAR_PROP_PREFIX = "var.";

    @Override
    public Node createPayload(WorkflowInitializationContext wfInitCtxt, Node stagingFolder, String uniquePayloadName, Map<String, Binary> inputs, Collection<WorkflowVariable> variableDefs) throws Exception {
        Node payloadNode = stagingFolder.addNode(uniquePayloadName, "sling:Folder");
        payloadNode.addNode("input", "nt:folder");
        for (Map.Entry<String, Binary> input : inputs.entrySet()) {
            this.initInput(payloadNode, input.getKey(), input.getValue());
        }
        payloadNode.addNode("output", "nt:folder");
        payloadNode.addNode("var", "nt:unstructured");
        for (WorkflowVariable var : variableDefs) {
            this.setVariable(payloadNode, var);
        }
        return payloadNode;
    }

    private void initInput(Node payload, String fileName, Binary contents) throws Exception {
        Node inputNode = payload.getNode("input");
        Node fileNode = inputNode.addNode(fileName, "nt:file");
        Node resNode = fileNode.addNode("jcr:content", "nt:resource");
        resNode.setProperty("jcr:data", contents);
    }

    @Override
    public Map<String, Document> getInputs(WorkflowInitializationContext wfInitCtxt, WorkflowExecutionContext wfExecCtxt, Node payload, ResourceResolver resourceResolver) throws Exception {
        return this.getDocuments(payload, "input", resourceResolver);
    }

    private Map<String, Document> getDocuments(Node payload, String folder, ResourceResolver resourceResolver) throws Exception {
        Node inFolder = payload.getNode(folder);
        NodeIterator ni = inFolder.getNodes();
        HashMap<String, Document> result = new HashMap<String, Document>();
        while (ni.hasNext()) {
            Node inFile = ni.nextNode();
            result.put(inFile.getName(), new Document(inFile.getPath(), resourceResolver));
        }
        return result;
    }

    @Override
    public Map<String, Document> getIntermediateOutputs(WorkflowInitializationContext wfInitCtxt, WorkflowExecutionContext wfExecCtxt, Node payload, ResourceResolver resourceResolver) throws Exception {
        return this.getOutputs(payload, resourceResolver);
    }

    @Override
    public Map<String, Document> getFinalOutputs(WorkflowInitializationContext wfInitCtxt, Workflow workflow, Node payload, ResourceResolver resourceResolver) throws Exception {
        return this.getOutputs(payload, resourceResolver);
    }

    private Map<String, Document> getOutputs(Node payload, ResourceResolver resourceResolver) throws Exception {
        return this.getDocuments(payload, "output", resourceResolver);
    }

    @Override
    public void setOutput(WorkflowInitializationContext wfInitCtxt, WorkflowExecutionContext wfExecCtxt, Node payload, String fileName, Binary contents, int outputMode) throws Exception {
        Node outFolder = payload.getNode("output");
        if (outputMode == 3) {
            outFolder.getNode(fileName).remove();
        } else {
            Node resNode;
            if (outputMode == 2) {
                resNode = outFolder.getNode(fileName).getNode("jcr:content");
            } else {
                Node fileNode = outFolder.addNode(fileName, "nt:file");
                resNode = fileNode.addNode("jcr:content", "nt:resource");
            }
            resNode.setProperty("jcr:data", contents);
        }
    }

    @Override
    public Map<String, Object> getVariables(WorkflowInitializationContext wfInitCtxt, WorkflowExecutionContext wfExecCtxt, Node payload) throws Exception {
        Node inFolder = payload.getNode("var");
        PropertyIterator pi = inFolder.getProperties();
        HashMap<String, Object> result = new HashMap<String, Object>();
        while (pi.hasNext()) {
            Property p = pi.nextProperty();
            String pName = p.getName();
            if (!pName.startsWith("var.")) continue;
            String varName = pName.substring("var.".length());
            result.put(varName, JcrUtil.getPropertyValue(p, null, false));
        }
        return result;
    }

    @Override
    public void setVariable(WorkflowInitializationContext wfInitCtxt, WorkflowExecutionContext wfExecCtxt, Node payload, WorkflowVariable variable) throws Exception {
        this.setVariable(payload, variable);
    }

    private void setVariable(Node payload, WorkflowVariable var) throws Exception {
        String propName = "var." + var.getName();
        Node varNode = payload.getNode("var");
        JcrUtil.setPropertyValue(varNode, propName, var.getType(), var.isMultiValued(), var.getValue());
    }
}