4041a9ae619bcb989372a9b2d39b51e250776635
[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.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
38 \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
45 \r
46 public class Bpmn4ToscaJsonParser {\r
47 \r
48     private static Logger log = LoggerFactory.getLogger(Bpmn4ToscaJsonParser.class);\r
49 \r
50     private static ObjectMapper MAPPER = new ObjectMapper();\r
51     \r
52     private Map<String, JsonNode> restConfigMap = new HashMap<String, JsonNode>();\r
53 \r
54     static {\r
55         MAPPER.enable(SerializationFeature.INDENT_OUTPUT);\r
56         MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\r
57     }\r
58 \r
59     public Process parse(String processName, URI jsonFileUrl)\r
60             throws JsonParseException, JsonMappingException, MalformedURLException, IOException {\r
61         Process process = new Process(processName);\r
62 \r
63         JsonNode rootNode = MAPPER.readValue(jsonFileUrl.toURL(), JsonNode.class);\r
64 \r
65         log.debug("Creating Process models...");\r
66         JsonNode nodes = rootNode.get(JsonKeys.NODES);\r
67         if (nodes == null) {\r
68             return process;\r
69         }\r
70         \r
71         this.loadConfigs(rootNode.get(JsonKeys.CONFIGS));\r
72 \r
73         Iterator<JsonNode> iter = nodes.iterator();\r
74         while (iter.hasNext()) {\r
75             JsonNode jsonNode = (JsonNode) iter.next();\r
76 \r
77             // get element\r
78             Element element = createElementFromJson(jsonNode);\r
79             process.getElementList().add(element);\r
80 \r
81             // get sequence flows\r
82             List<SequenceFlow> flowList = getSequenceFlows(jsonNode);\r
83             process.getSequenceFlowList().addAll(flowList);\r
84 \r
85             // add dataObject\r
86             if (element instanceof StartEvent) {\r
87                 List<DataObject> dataObjects = this.getDataObject((StartEvent) element);\r
88                 process.getDataObjectList().addAll(dataObjects);\r
89             }\r
90         }\r
91 \r
92         return process;\r
93 \r
94     }\r
95 \r
96     private List<DataObject> getDataObject(StartEvent startEvent) {\r
97         List<DataObject> dataObjects = new ArrayList<DataObject>();\r
98 \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
104 \r
105             dataObjects.add(dataObject);\r
106         }\r
107 \r
108         return dataObjects;\r
109     }\r
110     \r
111     private void loadConfigs(JsonNode config) {\r
112         if(config == null) {\r
113             return;\r
114         }\r
115         loadRestConfigs(config.get(JsonKeys.REST_CONFIGS));\r
116     }\r
117     \r
118     private void loadRestConfigs(JsonNode restConfigs) {\r
119         if(restConfigs == null) {\r
120             return;\r
121         }\r
122         \r
123         Iterator<JsonNode> iter = restConfigs.iterator();\r
124         while (iter.hasNext()) {\r
125             JsonNode restConfig = (JsonNode) iter.next();\r
126 \r
127             String configId = getValueFromJsonNode(restConfig, JsonKeys.ID); \r
128             restConfigMap.put(configId, restConfig);\r
129         }\r
130     }\r
131 \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
135 \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
148         }\r
149 \r
150         return flowList;\r
151     }\r
152 \r
153     protected Element createElementFromJson(JsonNode jsonNode)\r
154             throws JsonParseException, JsonMappingException, IOException {\r
155         String jsonObject = jsonNode.toString();\r
156         Element element;\r
157 \r
158         String nodeType = getValueFromJsonNode(jsonNode, JsonKeys.TYPE);\r
159         switch (nodeType) {\r
160         case "startEvent":\r
161             element = MAPPER.readValue(jsonObject, StartEvent.class);\r
162             break;\r
163         case "endEvent":\r
164             element = MAPPER.readValue(jsonObject, EndEvent.class);\r
165             break;\r
166         case "intermediateCatchEvent":\r
167             element = MAPPER.readValue(jsonObject, IntermediateCatchEvent.class);\r
168             break;\r
169         case "serviceTask":\r
170             element = MAPPER.readValue(jsonObject, ServiceTask.class);\r
171             break;\r
172         case "restTask":\r
173             element = this.createRestServiceTask(jsonObject);\r
174             break;\r
175         case "scriptTask":\r
176             element = MAPPER.readValue(jsonObject, ScriptTask.class);\r
177             break;\r
178         case "exclusiveGateway":\r
179             element = MAPPER.readValue(jsonObject, ExclusiveGateway.class);\r
180             break;\r
181         case "parallelGateway":\r
182             element = MAPPER.readValue(jsonObject, ParallelGateway.class);\r
183             break;\r
184         default:\r
185             log.warn("Ignoring node: type '" + nodeType + "' is unkown");\r
186             return null;\r
187         }\r
188 \r
189         return element;\r
190     }\r
191     \r
192     private RestServiceTask createRestServiceTask(String jsonObject) throws JsonParseException, JsonMappingException, IOException {\r
193         RestServiceTask restServiceTask = MAPPER.readValue(jsonObject, RestServiceTask.class);\r
194         \r
195         // add baseUrl to relative url\r
196         String restConfigId = restServiceTask.getRestConfigId();\r
197         JsonNode restConfig = this.restConfigMap.get(restConfigId);\r
198         \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
203         }\r
204         \r
205         for(Parameter parameter : restServiceTask.getParameters()) {\r
206             if("body".equals(parameter.getPosition())) {\r
207                 parameter.setValueSource(null);\r
208             }\r
209         }\r
210         \r
211         return restServiceTask;\r
212     }\r
213 \r
214     private String getValueFromJsonNode(JsonNode jsonNode, String key) {\r
215         return jsonNode.get(key) == null ? null : jsonNode.get(key).asText();\r
216     }\r
217 \r
218 }\r