1b3a8779d16cba9073c07006f01ffebc59a73d7e
[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.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         if (nodes == null) {\r
70             return process;\r
71         }\r
72         \r
73         this.loadConfigs(rootNode.get(JsonKeys.CONFIGS));\r
74 \r
75         Iterator<JsonNode> iter = nodes.iterator();\r
76         while (iter.hasNext()) {\r
77             JsonNode jsonNode = (JsonNode) iter.next();\r
78 \r
79             // get element\r
80             Element element = createElementFromJson(jsonNode);\r
81             process.getElementList().add(element);\r
82 \r
83             // get sequence flows\r
84             List<SequenceFlow> flowList = getSequenceFlows(jsonNode);\r
85             process.getSequenceFlowList().addAll(flowList);\r
86 \r
87             // add dataObject\r
88             if (element instanceof StartEvent) {\r
89                 List<DataObject> dataObjects = this.getDataObject((StartEvent) element);\r
90                 process.getDataObjectList().addAll(dataObjects);\r
91             }\r
92         }\r
93 \r
94         return process;\r
95 \r
96     }\r
97 \r
98     private List<DataObject> getDataObject(StartEvent startEvent) {\r
99         List<DataObject> dataObjects = new ArrayList<DataObject>();\r
100 \r
101         for (Parameter parameter : startEvent.getParameters()) {\r
102             DataObject dataObject = new DataObject();\r
103             dataObject.setId(parameter.getName());\r
104             dataObject.setName(parameter.getName());\r
105             dataObject.setValue((String) parameter.getValue());\r
106 \r
107             dataObjects.add(dataObject);\r
108         }\r
109 \r
110         return dataObjects;\r
111     }\r
112     \r
113     private void loadConfigs(JsonNode config) {\r
114         if(config == null) {\r
115             return;\r
116         }\r
117         loadRestConfigs(config.get(JsonKeys.REST_CONFIGS));\r
118     }\r
119     \r
120     private void loadRestConfigs(JsonNode restConfigs) {\r
121         if(restConfigs == null) {\r
122             return;\r
123         }\r
124         \r
125         Iterator<JsonNode> iter = restConfigs.iterator();\r
126         while (iter.hasNext()) {\r
127             JsonNode restConfig = (JsonNode) iter.next();\r
128 \r
129             String configId = getValueFromJsonNode(restConfig, JsonKeys.ID); \r
130             restConfigMap.put(configId, restConfig);\r
131         }\r
132     }\r
133 \r
134     private List<SequenceFlow> getSequenceFlows(JsonNode jsonNode) {\r
135         List<SequenceFlow> flowList = new ArrayList<SequenceFlow>();\r
136         JsonNode sequenceFlowNodes = jsonNode.get(JsonKeys.SEQUENCE_FLOWS);\r
137 \r
138         Iterator<JsonNode> iter = sequenceFlowNodes.iterator();\r
139         while (iter.hasNext()) {\r
140             JsonNode connectionEntry = (JsonNode) iter.next();\r
141             String sourceRef = getValueFromJsonNode(connectionEntry, JsonKeys.SOURCE_REF);\r
142             String targetRef = getValueFromJsonNode(connectionEntry, JsonKeys.TARGET_REF);\r
143             String condition = getValueFromJsonNode(connectionEntry, JsonKeys.CONDITION);\r
144             SequenceFlow flow = new SequenceFlow();\r
145             flow.setId(sourceRef + targetRef);\r
146             flow.setSourceRef(sourceRef);\r
147             flow.setTargetRef(targetRef);\r
148             flow.setCondition(condition);\r
149             flowList.add(flow);\r
150         }\r
151 \r
152         return flowList;\r
153     }\r
154 \r
155     protected Element createElementFromJson(JsonNode jsonNode)\r
156             throws JsonParseException, JsonMappingException, IOException {\r
157         String jsonObject = jsonNode.toString();\r
158         Element element;\r
159 \r
160         String nodeType = getValueFromJsonNode(jsonNode, JsonKeys.TYPE);\r
161         switch (nodeType) {\r
162         case "startEvent":\r
163             element = MAPPER.readValue(jsonObject, StartEvent.class);\r
164             break;\r
165         case "endEvent":\r
166             element = MAPPER.readValue(jsonObject, EndEvent.class);\r
167             break;\r
168         case "errorStartEvent":\r
169             element = MAPPER.readValue(jsonObject, ErrorStartEvent.class);\r
170             break;\r
171         case "errorEndEvent":\r
172             element = MAPPER.readValue(jsonObject, ErrorEndEvent.class);\r
173             break;\r
174         case "intermediateCatchEvent":\r
175             element = MAPPER.readValue(jsonObject, IntermediateCatchEvent.class);\r
176             break;\r
177         case "serviceTask":\r
178             element = MAPPER.readValue(jsonObject, ServiceTask.class);\r
179             break;\r
180         case "restTask":\r
181             element = this.createRestServiceTask(jsonObject);\r
182             break;\r
183         case "scriptTask":\r
184             element = MAPPER.readValue(jsonObject, ScriptTask.class);\r
185             break;\r
186         case "exclusiveGateway":\r
187             element = MAPPER.readValue(jsonObject, ExclusiveGateway.class);\r
188             break;\r
189         case "parallelGateway":\r
190             element = MAPPER.readValue(jsonObject, ParallelGateway.class);\r
191             break;\r
192         default:\r
193             log.warn("Ignoring node: type '" + nodeType + "' is unkown");\r
194             return null;\r
195         }\r
196 \r
197         return element;\r
198     }\r
199     \r
200     private RestServiceTask createRestServiceTask(String jsonObject) throws JsonParseException, JsonMappingException, IOException {\r
201         RestServiceTask restServiceTask = MAPPER.readValue(jsonObject, RestServiceTask.class);\r
202         \r
203         // add baseUrl to relative url\r
204         String restConfigId = restServiceTask.getRestConfigId();\r
205         JsonNode restConfig = this.restConfigMap.get(restConfigId);\r
206         \r
207         if(restConfig != null) { // while create a new rest task and didnot set method, the restconfig info may be null\r
208             restServiceTask.setUrl(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_URL));\r
209             restServiceTask.setServiceName(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_NAME));\r
210             restServiceTask.setServiceVersion(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_VERSION));\r
211         }\r
212         \r
213         for(Parameter parameter : restServiceTask.getParameters()) {\r
214             if("body".equals(parameter.getPosition())) {\r
215                 parameter.setValueSource(null);\r
216             }\r
217         }\r
218         \r
219         return restServiceTask;\r
220     }\r
221 \r
222     private String getValueFromJsonNode(JsonNode jsonNode, String key) {\r
223         return jsonNode.get(key) == null ? null : jsonNode.get(key).asText();\r
224     }\r
225 \r
226 }\r