JSONStartWorkflowServlet.java 6.73 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.workflow.WorkflowException
 *  com.day.cq.workflow.WorkflowService
 *  com.day.cq.workflow.WorkflowSession
 *  com.day.cq.workflow.exec.Workflow
 *  com.day.cq.workflow.exec.WorkflowData
 *  com.day.cq.workflow.model.WorkflowModel
 *  javax.jcr.Node
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.servlet.ServletException
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.sling.SlingServlet
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestParameter
 *  org.apache.sling.api.request.RequestParameterMap
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.io.JSONWriter
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.mcm.campaign.servlets;

import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowService;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.Workflow;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.model.WorkflowModel;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.ServletException;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.request.RequestParameterMap;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.io.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(paths={"/libs/mcm/campaign/content/startWorkflow"}, methods={"POST"})
public class JSONStartWorkflowServlet
extends SlingAllMethodsServlet {
    private static final String PAYLOAD_TYPE_PARAM_NAME = "payloadType";
    private static final String PAYLOAD_PARAM_NAME = "payload";
    private static final String MODEL_PARAM_NAME = "model";
    private final Logger log;
    private static final String[] META_DATA_EXCLUDES = new String[]{"_charset_", ":status", "payloadType", "payload", "model"};
    @Reference
    private WorkflowService workflowService;

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

    protected String getUrl(SlingHttpServletRequest request, String internalPath) {
        String protocol = request.isSecure() ? "https" : "http";
        return protocol + "://" + request.getLocalName() + ":" + request.getLocalPort() + request.getContextPath() + internalPath;
    }

    protected void updateMetaData(RequestParameterMap params, Map<String, Object> metaData) {
        List<String> excludes = Arrays.asList(META_DATA_EXCLUDES);
        for (String key : params.keySet()) {
            if (excludes.contains(key)) continue;
            RequestParameter para = params.getValue(key);
            metaData.put(key, para.getString());
        }
    }

    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        block9 : {
            try {
                RequestParameterMap params = request.getRequestParameterMap();
                ResourceResolver resolver = request.getResourceResolver();
                Resource instanceResource = resolver.getResource("/etc/workflow/instances");
                WorkflowSession wfSession = this.workflowService.getWorkflowSession(((Node)instanceResource.adaptTo(Node.class)).getSession());
                RequestParameter modelParam = params.getValue("model");
                RequestParameter typeParam = params.getValue("payloadType");
                RequestParameter[] payloadParams = params.getValues("payload");
                if (modelParam != null && payloadParams != null && typeParam != null) {
                    String modelId = modelParam.getString();
                    String payloadType = typeParam.getString();
                    String url = "";
                    for (RequestParameter payloadParam : payloadParams) {
                        try {
                            WorkflowModel model = wfSession.getModel(modelId);
                            if (model != null) {
                                WorkflowData data = wfSession.newWorkflowData(payloadType, (Object)payloadParam.getString());
                                HashMap<String, Object> metaData = new HashMap<String, Object>();
                                this.updateMetaData(params, metaData);
                                Workflow workflow = wfSession.startWorkflow(model, data, metaData);
                                url = this.getUrl(request, workflow.getId());
                                continue;
                            }
                            response.sendError(400, "workflow model not found");
                            return;
                        }
                        catch (WorkflowException e) {
                            response.sendError(500, e.getMessage());
                            return;
                        }
                    }
                    response.setContentType("application/json");
                    JSONWriter writer = new JSONWriter((Writer)response.getWriter());
                    try {
                        writer.object();
                        writer.key("url").value((Object)url);
                        writer.endObject();
                        break block9;
                    }
                    catch (JSONException je) {
                        throw new ServletException((Throwable)je);
                    }
                }
                response.sendError(400, "Invalid parameters");
            }
            catch (RepositoryException re) {
                response.sendError(500);
            }
        }
    }

    protected void bindWorkflowService(WorkflowService workflowService) {
        this.workflowService = workflowService;
    }

    protected void unbindWorkflowService(WorkflowService workflowService) {
        if (this.workflowService == workflowService) {
            this.workflowService = null;
        }
    }
}