JsonSerializer.java 6.8 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.workflow.model.WorkflowModel
 *  com.adobe.granite.workflow.model.WorkflowModelSerializer
 *  com.day.cq.workflow.WorkflowException
 *  com.day.cq.workflow.metadata.MetaDataMap
 *  com.day.cq.workflow.model.WorkflowModel
 *  com.day.cq.workflow.model.WorkflowModelSerializer
 *  com.day.cq.workflow.model.WorkflowNode
 *  com.day.cq.workflow.model.WorkflowTransition
 *  javax.jcr.RepositoryException
 *  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.commons.json.JSONArray
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.JSONObject
 *  org.osgi.service.component.ComponentContext
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.workflow.impl.model;

import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.impl.model.CQWorkflowModelWrapper;
import com.day.cq.workflow.metadata.MetaDataMap;
import com.day.cq.workflow.model.WorkflowModel;
import com.day.cq.workflow.model.WorkflowModelSerializer;
import com.day.cq.workflow.model.WorkflowNode;
import com.day.cq.workflow.model.WorkflowTransition;
import java.util.Dictionary;
import java.util.List;
import java.util.Set;
import javax.jcr.RepositoryException;
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.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0)
@Service
@Property(name="service.description", value={"JSON Workflow Model Serializer"})
public class JsonSerializer
implements WorkflowModelSerializer {
    private static Logger log = LoggerFactory.getLogger(JsonSerializer.class);
    @Property(value={"JSON"}, propertyPrivate=1)
    private static final String TYPE = "com.day.cq.workflow.serialzer.type";
    @Property(value={"application/json"}, propertyPrivate=1)
    private static final String MIME_TYPE = "com.day.cq.workflow.serialzer.mime";
    @Reference
    private com.adobe.granite.workflow.model.WorkflowModelSerializer graniteJSONSerializerService;
    private Dictionary<String, Object> config;

    public JsonSerializer() {
    }

    public JsonSerializer(com.adobe.granite.workflow.model.WorkflowModelSerializer graniteJSONSerializerService) {
        this.graniteJSONSerializerService = graniteJSONSerializerService;
    }

    protected void activate(ComponentContext context) throws WorkflowException, RepositoryException {
        this.config = context.getProperties();
    }

    public String getType() {
        return (String)this.config.get("com.day.cq.workflow.serialzer.type");
    }

    public String getMimeType() {
        return (String)this.config.get("com.day.cq.workflow.serialzer.mime");
    }

    public String serialize(WorkflowModel model) throws Exception {
        log.debug("Start building JSON for model ...");
        JSONObject modelObj = new JSONObject();
        try {
            modelObj.put("id", (Object)model.getId());
            modelObj.put("title", (Object)model.getTitle());
            modelObj.put("version", (Object)model.getVersion());
            modelObj.put("description", (Object)model.getDescription());
            modelObj.put("metaData", (Object)this.serializeMetaData(model.getMetaDataMap()));
            JSONArray nodes = new JSONArray();
            for (WorkflowNode node : model.getNodes()) {
                JSONObject nodeObj = new JSONObject();
                nodeObj.put("id", (Object)node.getId());
                nodeObj.put("type", (Object)node.getType());
                nodeObj.put("title", (Object)node.getTitle());
                nodeObj.put("description", (Object)node.getDescription());
                nodeObj.put("metaData", (Object)this.serializeMetaData(node.getMetaDataMap()));
                nodes.put((Object)nodeObj);
            }
            modelObj.put("nodes", (Object)nodes);
            JSONArray transitions = new JSONArray();
            for (WorkflowTransition transition : model.getTransitions()) {
                JSONObject transitionObject = new JSONObject();
                transitionObject.put("from", (Object)transition.getFrom().getId());
                transitionObject.put("to", (Object)transition.getTo().getId());
                if (transition.getRule() != null) {
                    transitionObject.put("rule", (Object)transition.getRule());
                }
                transitionObject.put("metaData", (Object)this.serializeMetaData(transition.getMetaDataMap()));
                transitions.put((Object)transitionObject);
            }
            modelObj.put("transitions", (Object)transitions);
        }
        catch (JSONException e) {
            throw new WorkflowException("Can not create JSON string.", (Throwable)e);
        }
        log.debug("... building JSON for model done.");
        return modelObj.toString();
    }

    public WorkflowModel deserialize(String modelDefinition) throws Exception {
        com.adobe.granite.workflow.model.WorkflowModel model = this.graniteJSONSerializerService.deserialize(modelDefinition);
        if (model != null) {
            return new CQWorkflowModelWrapper(model);
        }
        return null;
    }

    private JSONObject serializeMetaData(MetaDataMap metaDataMap) throws JSONException {
        JSONObject metaDataJSON = new JSONObject();
        for (String key : metaDataMap.keySet()) {
            String value = (String)metaDataMap.get(key, String.class);
            if (value != null) {
                metaDataJSON.put(key, (Object)value);
                continue;
            }
            String[] values = (String[])metaDataMap.get(key, String[].class);
            if (values == null || values.length <= 1) continue;
            JSONArray array = new JSONArray();
            for (String singleValue : values) {
                array.put((Object)singleValue);
            }
            metaDataJSON.put(key, (Object)array);
        }
        return metaDataJSON;
    }

    protected void bindGraniteJSONSerializerService(com.adobe.granite.workflow.model.WorkflowModelSerializer workflowModelSerializer) {
        this.graniteJSONSerializerService = workflowModelSerializer;
    }

    protected void unbindGraniteJSONSerializerService(com.adobe.granite.workflow.model.WorkflowModelSerializer workflowModelSerializer) {
        if (this.graniteJSONSerializerService == workflowModelSerializer) {
            this.graniteJSONSerializerService = null;
        }
    }
}