b103f91d7e528c226cdb76157355debd3ce70603
[sdc/sdc-workflow-designer.git] /
1 /**\r
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
8  *\r
9  * Contributors:\r
10  *     ZTE - initial API and implementation and/or initial documentation\r
11  */\r
12 package org.onap.sdc.workflowdesigner.parser;\r
13 \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.Iterator;\r
19 import java.util.List;\r
20 \r
21 import org.onap.sdc.workflowdesigner.model.DataObject;\r
22 import org.onap.sdc.workflowdesigner.model.Element;\r
23 import org.onap.sdc.workflowdesigner.model.EndEvent;\r
24 import org.onap.sdc.workflowdesigner.model.ExclusiveGateway;\r
25 import org.onap.sdc.workflowdesigner.model.IntermediateCatchEvent;\r
26 import org.onap.sdc.workflowdesigner.model.ParallelGateway;\r
27 import org.onap.sdc.workflowdesigner.model.Parameter;\r
28 import org.onap.sdc.workflowdesigner.model.Process;\r
29 import org.onap.sdc.workflowdesigner.model.ScriptTask;\r
30 import org.onap.sdc.workflowdesigner.model.SequenceFlow;\r
31 import org.onap.sdc.workflowdesigner.model.ServiceTask;\r
32 import org.onap.sdc.workflowdesigner.model.StartEvent;\r
33 import org.slf4j.Logger;\r
34 import org.slf4j.LoggerFactory;\r
35 \r
36 import com.fasterxml.jackson.core.JsonParseException;\r
37 import com.fasterxml.jackson.databind.DeserializationFeature;\r
38 import com.fasterxml.jackson.databind.JsonMappingException;\r
39 import com.fasterxml.jackson.databind.JsonNode;\r
40 import com.fasterxml.jackson.databind.ObjectMapper;\r
41 import com.fasterxml.jackson.databind.SerializationFeature;\r
42 \r
43 public class Bpmn4ToscaJsonParser {\r
44 \r
45     private static Logger log = LoggerFactory.getLogger(Bpmn4ToscaJsonParser.class);\r
46 \r
47     private static ObjectMapper MAPPER = new ObjectMapper();\r
48 \r
49     static {\r
50         MAPPER.enable(SerializationFeature.INDENT_OUTPUT);\r
51         MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\r
52     }\r
53 \r
54     public Process parse(String processName, URI jsonFileUrl)\r
55             throws JsonParseException, JsonMappingException, MalformedURLException, IOException {\r
56         Process process = new Process(processName);\r
57 \r
58         JsonNode rootNode = MAPPER.readValue(jsonFileUrl.toURL(), JsonNode.class);\r
59 \r
60         log.debug("Creating Process models...");\r
61         JsonNode nodes = rootNode.get(JsonKeys.NODES);\r
62         if (nodes == null) {\r
63             return process;\r
64         }\r
65 \r
66         Iterator<JsonNode> iter = nodes.iterator();\r
67         while (iter.hasNext()) {\r
68             JsonNode jsonNode = (JsonNode) iter.next();\r
69 \r
70             // get element\r
71             Element element = createElementFromJson(jsonNode);\r
72             process.getElementList().add(element);\r
73 \r
74             // get sequence flows\r
75             List<SequenceFlow> flowList = getSequenceFlows(jsonNode);\r
76             process.getSequenceFlowList().addAll(flowList);\r
77 \r
78             // add dataObject\r
79             if (element instanceof StartEvent) {\r
80                 List<DataObject> dataObjects = this.getDataObject((StartEvent) element);\r
81                 process.getDataObjectList().addAll(dataObjects);\r
82             }\r
83         }\r
84 \r
85         return process;\r
86 \r
87     }\r
88 \r
89     private List<DataObject> getDataObject(StartEvent startEvent) {\r
90         List<DataObject> dataObjects = new ArrayList<DataObject>();\r
91 \r
92         for (Parameter parameter : startEvent.getParameters()) {\r
93             DataObject dataObject = new DataObject();\r
94             dataObject.setId(parameter.getName());\r
95             dataObject.setName(parameter.getName());\r
96             dataObject.setValue((String) parameter.getValue());\r
97 \r
98             dataObjects.add(dataObject);\r
99         }\r
100 \r
101         return dataObjects;\r
102     }\r
103 \r
104     private List<SequenceFlow> getSequenceFlows(JsonNode jsonNode) {\r
105         List<SequenceFlow> flowList = new ArrayList<SequenceFlow>();\r
106         JsonNode sequenceFlowNodes = jsonNode.get(JsonKeys.SEQUENCE_FLOWS);\r
107 \r
108         Iterator<JsonNode> iter = sequenceFlowNodes.iterator();\r
109         while (iter.hasNext()) {\r
110             JsonNode connectionEntry = (JsonNode) iter.next();\r
111             String sourceRef = getValueFromJsonNode(connectionEntry, JsonKeys.SOURCE_REF);\r
112             String targetRef = getValueFromJsonNode(connectionEntry, JsonKeys.TARGET_REF);\r
113             String condition = getValueFromJsonNode(connectionEntry, JsonKeys.CONDITION);\r
114             SequenceFlow flow = new SequenceFlow();\r
115             flow.setId(sourceRef + targetRef);\r
116             flow.setSourceRef(sourceRef);\r
117             flow.setTargetRef(targetRef);\r
118             flow.setCondition(condition);\r
119             flowList.add(flow);\r
120         }\r
121 \r
122         return flowList;\r
123     }\r
124 \r
125     protected Element createElementFromJson(JsonNode jsonNode)\r
126             throws JsonParseException, JsonMappingException, IOException {\r
127         String jsonObject = jsonNode.toString();\r
128         Element element;\r
129 \r
130         String nodeType = getValueFromJsonNode(jsonNode, JsonKeys.TYPE);\r
131         switch (nodeType) {\r
132         case "startEvent":\r
133             element = MAPPER.readValue(jsonObject, StartEvent.class);\r
134             break;\r
135         case "endEvent":\r
136             element = MAPPER.readValue(jsonObject, EndEvent.class);\r
137             break;\r
138         case "intermediateCatchEvent":\r
139             element = MAPPER.readValue(jsonObject, IntermediateCatchEvent.class);\r
140             break;\r
141         case "serviceTask":\r
142             element = MAPPER.readValue(jsonObject, ServiceTask.class);\r
143             break;\r
144         case "scriptTask":\r
145             element = MAPPER.readValue(jsonObject, ScriptTask.class);\r
146             break;\r
147         case "exclusiveGateway":\r
148             element = MAPPER.readValue(jsonObject, ExclusiveGateway.class);\r
149             break;\r
150         case "parallelGateway":\r
151             element = MAPPER.readValue(jsonObject, ParallelGateway.class);\r
152             break;\r
153         default:\r
154             log.warn("Ignoring node: type '" + nodeType + "' is unkown");\r
155             return null;\r
156         }\r
157 \r
158         return element;\r
159     }\r
160 \r
161     private String getValueFromJsonNode(JsonNode jsonNode, String key) {\r
162         return jsonNode.get(key) == null ? null : jsonNode.get(key).asText();\r
163     }\r
164 \r
165 }\r