2  * Copyright (c) 2017 ZTE Corporation.
\r 
   3  * All rights reserved. This program and the accompanying materials
\r 
   4  * are made available under the Apache License, Version 2.0
\r 
   5  * and the Eclipse Public License v1.0 which both accompany this distribution,
\r 
   6  * and are available at http://www.eclipse.org/legal/epl-v10.html
\r 
   7  * and http://www.apache.org/licenses/LICENSE-2.0
\r 
  10  *     ZTE - initial API and implementation and/or initial documentation
\r 
  12 package org.onap.sdc.workflowdesigner.parser;
\r 
  14 import java.io.IOException;
\r 
  15 import java.net.MalformedURLException;
\r 
  16 import java.net.URI;
\r 
  17 import java.util.ArrayList;
\r 
  18 import java.util.HashMap;
\r 
  19 import java.util.Iterator;
\r 
  20 import java.util.List;
\r 
  21 import java.util.Map;
\r 
  23 import org.onap.sdc.workflowdesigner.model.DataObject;
\r 
  24 import org.onap.sdc.workflowdesigner.model.Element;
\r 
  25 import org.onap.sdc.workflowdesigner.model.EndEvent;
\r 
  26 import org.onap.sdc.workflowdesigner.model.ExclusiveGateway;
\r 
  27 import org.onap.sdc.workflowdesigner.model.IntermediateCatchEvent;
\r 
  28 import org.onap.sdc.workflowdesigner.model.ParallelGateway;
\r 
  29 import org.onap.sdc.workflowdesigner.model.Parameter;
\r 
  30 import org.onap.sdc.workflowdesigner.model.Process;
\r 
  31 import org.onap.sdc.workflowdesigner.model.RestServiceTask;
\r 
  32 import org.onap.sdc.workflowdesigner.model.ScriptTask;
\r 
  33 import org.onap.sdc.workflowdesigner.model.SequenceFlow;
\r 
  34 import org.onap.sdc.workflowdesigner.model.ServiceTask;
\r 
  35 import org.onap.sdc.workflowdesigner.model.StartEvent;
\r 
  36 import org.slf4j.Logger;
\r 
  37 import org.slf4j.LoggerFactory;
\r 
  39 import com.fasterxml.jackson.core.JsonParseException;
\r 
  40 import com.fasterxml.jackson.databind.DeserializationFeature;
\r 
  41 import com.fasterxml.jackson.databind.JsonMappingException;
\r 
  42 import com.fasterxml.jackson.databind.JsonNode;
\r 
  43 import com.fasterxml.jackson.databind.ObjectMapper;
\r 
  44 import com.fasterxml.jackson.databind.SerializationFeature;
\r 
  46 public class Bpmn4ToscaJsonParser {
\r 
  48     private static Logger log = LoggerFactory.getLogger(Bpmn4ToscaJsonParser.class);
\r 
  50     private static ObjectMapper MAPPER = new ObjectMapper();
\r 
  52     private Map<String, JsonNode> restConfigMap = new HashMap<String, JsonNode>();
\r 
  55         MAPPER.enable(SerializationFeature.INDENT_OUTPUT);
\r 
  56         MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
\r 
  59     public Process parse(String processName, URI jsonFileUrl)
\r 
  60             throws JsonParseException, JsonMappingException, MalformedURLException, IOException {
\r 
  61         Process process = new Process(processName);
\r 
  63         JsonNode rootNode = MAPPER.readValue(jsonFileUrl.toURL(), JsonNode.class);
\r 
  65         log.debug("Creating Process models...");
\r 
  66         JsonNode nodes = rootNode.get(JsonKeys.NODES);
\r 
  67         if (nodes == null) {
\r 
  71         this.loadConfigs(rootNode.get(JsonKeys.CONFIGS));
\r 
  73         Iterator<JsonNode> iter = nodes.iterator();
\r 
  74         while (iter.hasNext()) {
\r 
  75             JsonNode jsonNode = (JsonNode) iter.next();
\r 
  78             Element element = createElementFromJson(jsonNode);
\r 
  79             process.getElementList().add(element);
\r 
  81             // get sequence flows
\r 
  82             List<SequenceFlow> flowList = getSequenceFlows(jsonNode);
\r 
  83             process.getSequenceFlowList().addAll(flowList);
\r 
  86             if (element instanceof StartEvent) {
\r 
  87                 List<DataObject> dataObjects = this.getDataObject((StartEvent) element);
\r 
  88                 process.getDataObjectList().addAll(dataObjects);
\r 
  96     private List<DataObject> getDataObject(StartEvent startEvent) {
\r 
  97         List<DataObject> dataObjects = new ArrayList<DataObject>();
\r 
  99         for (Parameter parameter : startEvent.getParameters()) {
\r 
 100             DataObject dataObject = new DataObject();
\r 
 101             dataObject.setId(parameter.getName());
\r 
 102             dataObject.setName(parameter.getName());
\r 
 103             dataObject.setValue((String) parameter.getValue());
\r 
 105             dataObjects.add(dataObject);
\r 
 108         return dataObjects;
\r 
 111     private void loadConfigs(JsonNode config) {
\r 
 112         if(config == null) {
\r 
 115         loadRestConfigs(config.get(JsonKeys.REST_CONFIGS));
\r 
 118     private void loadRestConfigs(JsonNode restConfigs) {
\r 
 119         if(restConfigs == null) {
\r 
 123         Iterator<JsonNode> iter = restConfigs.iterator();
\r 
 124         while (iter.hasNext()) {
\r 
 125             JsonNode restConfig = (JsonNode) iter.next();
\r 
 127             String configId = getValueFromJsonNode(restConfig, JsonKeys.ID); 
\r 
 128             restConfigMap.put(configId, restConfig);
\r 
 132     private List<SequenceFlow> getSequenceFlows(JsonNode jsonNode) {
\r 
 133         List<SequenceFlow> flowList = new ArrayList<SequenceFlow>();
\r 
 134         JsonNode sequenceFlowNodes = jsonNode.get(JsonKeys.SEQUENCE_FLOWS);
\r 
 136         Iterator<JsonNode> iter = sequenceFlowNodes.iterator();
\r 
 137         while (iter.hasNext()) {
\r 
 138             JsonNode connectionEntry = (JsonNode) iter.next();
\r 
 139             String sourceRef = getValueFromJsonNode(connectionEntry, JsonKeys.SOURCE_REF);
\r 
 140             String targetRef = getValueFromJsonNode(connectionEntry, JsonKeys.TARGET_REF);
\r 
 141             String condition = getValueFromJsonNode(connectionEntry, JsonKeys.CONDITION);
\r 
 142             SequenceFlow flow = new SequenceFlow();
\r 
 143             flow.setId(sourceRef + targetRef);
\r 
 144             flow.setSourceRef(sourceRef);
\r 
 145             flow.setTargetRef(targetRef);
\r 
 146             flow.setCondition(condition);
\r 
 147             flowList.add(flow);
\r 
 153     protected Element createElementFromJson(JsonNode jsonNode)
\r 
 154             throws JsonParseException, JsonMappingException, IOException {
\r 
 155         String jsonObject = jsonNode.toString();
\r 
 158         String nodeType = getValueFromJsonNode(jsonNode, JsonKeys.TYPE);
\r 
 159         switch (nodeType) {
\r 
 161             element = MAPPER.readValue(jsonObject, StartEvent.class);
\r 
 164             element = MAPPER.readValue(jsonObject, EndEvent.class);
\r 
 166         case "intermediateCatchEvent":
\r 
 167             element = MAPPER.readValue(jsonObject, IntermediateCatchEvent.class);
\r 
 169         case "serviceTask":
\r 
 170             element = MAPPER.readValue(jsonObject, ServiceTask.class);
\r 
 173             element = this.createRestServiceTask(jsonObject);
\r 
 176             element = MAPPER.readValue(jsonObject, ScriptTask.class);
\r 
 178         case "exclusiveGateway":
\r 
 179             element = MAPPER.readValue(jsonObject, ExclusiveGateway.class);
\r 
 181         case "parallelGateway":
\r 
 182             element = MAPPER.readValue(jsonObject, ParallelGateway.class);
\r 
 185             log.warn("Ignoring node: type '" + nodeType + "' is unkown");
\r 
 192     private RestServiceTask createRestServiceTask(String jsonObject) throws JsonParseException, JsonMappingException, IOException {
\r 
 193         RestServiceTask restServiceTask = MAPPER.readValue(jsonObject, RestServiceTask.class);
\r 
 195         // add baseUrl to relative url
\r 
 196         String restConfigId = restServiceTask.getRestConfigId();
\r 
 197         JsonNode restConfig = this.restConfigMap.get(restConfigId);
\r 
 199         if(restConfig != null) { // while create a new rest task and didnot set method, the restconfig info may be null
\r 
 200             restServiceTask.setUrl(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_URL));
\r 
 201             restServiceTask.setServiceName(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_NAME));
\r 
 202             restServiceTask.setServiceVersion(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_VERSION));
\r 
 205         for(Parameter parameter : restServiceTask.getParameters()) {
\r 
 206             if("body".equals(parameter.getPosition())) {
\r 
 207                 parameter.setValueSource(null);
\r 
 211         return restServiceTask;
\r 
 214     private String getValueFromJsonNode(JsonNode jsonNode, String key) {
\r 
 215         return jsonNode.get(key) == null ? null : jsonNode.get(key).asText();
\r