Generate bpmn for extend activities
[sdc/sdc-workflow-designer.git] / sdc-workflow-designer-server / src / main / java / org / onap / sdc / workflowdesigner / parser / Bpmn4ToscaJsonParser.java
1 /**\r
2  * Copyright (c) 2017-2018 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.HashMap;\r
19 import java.util.Iterator;\r
20 import java.util.List;\r
21 import java.util.Map;\r
22 \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.ErrorEndEvent;\r
27 import org.onap.sdc.workflowdesigner.model.ErrorStartEvent;\r
28 import org.onap.sdc.workflowdesigner.model.ExclusiveGateway;\r
29 import org.onap.sdc.workflowdesigner.model.IntermediateCatchEvent;\r
30 import org.onap.sdc.workflowdesigner.model.ParallelGateway;\r
31 import org.onap.sdc.workflowdesigner.model.Parameter;\r
32 import org.onap.sdc.workflowdesigner.model.Process;\r
33 import org.onap.sdc.workflowdesigner.model.RestServiceTask;\r
34 import org.onap.sdc.workflowdesigner.model.ScriptTask;\r
35 import org.onap.sdc.workflowdesigner.model.SequenceFlow;\r
36 import org.onap.sdc.workflowdesigner.model.ServiceTask;\r
37 import org.onap.sdc.workflowdesigner.model.StartEvent;\r
38 import org.slf4j.Logger;\r
39 import org.slf4j.LoggerFactory;\r
40 \r
41 import com.fasterxml.jackson.core.JsonParseException;\r
42 import com.fasterxml.jackson.databind.DeserializationFeature;\r
43 import com.fasterxml.jackson.databind.JsonMappingException;\r
44 import com.fasterxml.jackson.databind.JsonNode;\r
45 import com.fasterxml.jackson.databind.ObjectMapper;\r
46 import com.fasterxml.jackson.databind.SerializationFeature;\r
47 \r
48 public class Bpmn4ToscaJsonParser {\r
49 \r
50     private static Logger log = LoggerFactory.getLogger(Bpmn4ToscaJsonParser.class);\r
51 \r
52     private static ObjectMapper MAPPER = new ObjectMapper();\r
53     \r
54     private Map<String, JsonNode> restConfigMap = new HashMap<String, JsonNode>();\r
55 \r
56     static {\r
57         MAPPER.enable(SerializationFeature.INDENT_OUTPUT);\r
58         MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\r
59     }\r
60 \r
61     public Process parse(String processName, URI jsonFileUrl)\r
62             throws JsonParseException, JsonMappingException, MalformedURLException, IOException {\r
63         Process process = new Process(processName);\r
64 \r
65         JsonNode rootNode = MAPPER.readValue(jsonFileUrl.toURL(), JsonNode.class);\r
66 \r
67         log.debug("Creating Process models...");\r
68 //      JsonNode nodes = rootNode.get(JsonKeys.NODES);\r
69         JsonNode data = rootNode.get(JsonKeys.DATA);\r
70         if(null == data) {\r
71             return process;\r
72         }\r
73         JsonNode nodes = data.get(JsonKeys.NODES);\r
74         if (nodes == null) {\r
75             return process;\r
76         }\r
77         \r
78         this.loadConfigs(rootNode.get(JsonKeys.CONFIGS));\r
79 \r
80         Iterator<JsonNode> iter = nodes.iterator();\r
81         while (iter.hasNext()) {\r
82             JsonNode jsonNode = (JsonNode) iter.next();\r
83 \r
84             // get element\r
85             Element element = createElementFromJson(jsonNode);\r
86             process.getElementList().add(element);\r
87 \r
88             // get sequence flows\r
89             List<SequenceFlow> flowList = getSequenceFlows(jsonNode);\r
90             process.getSequenceFlowList().addAll(flowList);\r
91 \r
92             // add dataObject\r
93             if (element instanceof StartEvent) {\r
94                 List<DataObject> dataObjects = this.getDataObject((StartEvent) element);\r
95                 process.getDataObjectList().addAll(dataObjects);\r
96             }\r
97         }\r
98 \r
99         return process;\r
100 \r
101     }\r
102 \r
103     private List<DataObject> getDataObject(StartEvent startEvent) {\r
104         List<DataObject> dataObjects = new ArrayList<DataObject>();\r
105 \r
106         for (Parameter parameter : startEvent.getParameters()) {\r
107             DataObject dataObject = new DataObject();\r
108             dataObject.setId(parameter.getName());\r
109             dataObject.setName(parameter.getName());\r
110             dataObject.setValue((String) parameter.getValue());\r
111 \r
112             dataObjects.add(dataObject);\r
113         }\r
114 \r
115         return dataObjects;\r
116     }\r
117     \r
118     private void loadConfigs(JsonNode config) {\r
119         if(config == null) {\r
120             return;\r
121         }\r
122         loadRestConfigs(config.get(JsonKeys.REST_CONFIGS));\r
123     }\r
124     \r
125     private void loadRestConfigs(JsonNode restConfigs) {\r
126         if(restConfigs == null) {\r
127             return;\r
128         }\r
129         \r
130         Iterator<JsonNode> iter = restConfigs.iterator();\r
131         while (iter.hasNext()) {\r
132             JsonNode restConfig = (JsonNode) iter.next();\r
133 \r
134             String configId = getValueFromJsonNode(restConfig, JsonKeys.ID); \r
135             restConfigMap.put(configId, restConfig);\r
136         }\r
137     }\r
138 \r
139     private List<SequenceFlow> getSequenceFlows(JsonNode jsonNode) {\r
140         List<SequenceFlow> flowList = new ArrayList<SequenceFlow>();\r
141                 String elementId = getValueFromJsonNode(jsonNode, JsonKeys.ID);\r
142                 JsonNode connectionsNode = jsonNode.get(JsonKeys.CONNECTIONS);\r
143 \r
144                 Iterator<JsonNode> iter = connectionsNode.iterator();\r
145         while (iter.hasNext()) {\r
146             JsonNode connectionEntry = (JsonNode) iter.next();\r
147             String targetRef = getValueFromJsonNode(connectionEntry, JsonKeys.TARGET_REF);\r
148             String condition = getValueFromJsonNode(connectionEntry, JsonKeys.CONDITION);\r
149             SequenceFlow flow = new SequenceFlow();\r
150                         flow.setId(elementId + targetRef);\r
151                         flow.setSourceRef(elementId);\r
152             flow.setTargetRef(targetRef);\r
153             flow.setCondition(condition);\r
154             flowList.add(flow);\r
155         }\r
156 \r
157         return flowList;\r
158     }\r
159 \r
160     protected Element createElementFromJson(JsonNode jsonNode)\r
161             throws JsonParseException, JsonMappingException, IOException {\r
162         String jsonObject = jsonNode.toString();\r
163         Element element;\r
164 \r
165         String nodeType = getValueFromJsonNode(jsonNode, JsonKeys.TYPE);\r
166         if (nodeType == null) {\r
167           log.warn("Ignoring node: type is null");\r
168           return null;\r
169         }\r
170         \r
171         switch (nodeType) {\r
172         case "startEvent":\r
173             element = MAPPER.readValue(jsonObject, StartEvent.class);\r
174             break;\r
175         case "endEvent":\r
176             element = MAPPER.readValue(jsonObject, EndEvent.class);\r
177             break;\r
178         case "errorStartEvent":\r
179             element = MAPPER.readValue(jsonObject, ErrorStartEvent.class);\r
180             break;\r
181         case "errorEndEvent":\r
182             element = MAPPER.readValue(jsonObject, ErrorEndEvent.class);\r
183             break;\r
184         case "intermediateCatchEvent":\r
185             element = MAPPER.readValue(jsonObject, IntermediateCatchEvent.class);\r
186             break;\r
187         case "serviceTask":\r
188             element = MAPPER.readValue(jsonObject, ServiceTask.class);\r
189             break;\r
190         case "restTask":\r
191                         // element = this.createRestServiceTask(jsonObject);\r
192                         element = MAPPER.readValue(jsonObject, RestServiceTask.class);\r
193             break;\r
194         case "scriptTask":\r
195             element = MAPPER.readValue(jsonObject, ScriptTask.class);\r
196             break;\r
197         case "exclusiveGateway":\r
198             element = MAPPER.readValue(jsonObject, ExclusiveGateway.class);\r
199             break;\r
200         case "parallelGateway":\r
201             element = MAPPER.readValue(jsonObject, ParallelGateway.class);\r
202             break;\r
203         default:\r
204             log.warn("Ignoring node: type '" + nodeType + "' is unkown");\r
205             return null;\r
206         }\r
207 \r
208         return element;\r
209     }\r
210     \r
211 \r
212     private String getValueFromJsonNode(JsonNode jsonNode, String key) {\r
213         return jsonNode.get(key) == null ? null : jsonNode.get(key).asText();\r
214     }\r
215 \r
216 }\r