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.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
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
48 public class Bpmn4ToscaJsonParser {
\r
50 private static Logger log = LoggerFactory.getLogger(Bpmn4ToscaJsonParser.class);
\r
52 private static ObjectMapper MAPPER = new ObjectMapper();
\r
54 private Map<String, JsonNode> restConfigMap = new HashMap<String, JsonNode>();
\r
57 MAPPER.enable(SerializationFeature.INDENT_OUTPUT);
\r
58 MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
\r
61 public Process parse(String processName, URI jsonFileUrl)
\r
62 throws JsonParseException, JsonMappingException, MalformedURLException, IOException {
\r
63 Process process = new Process(processName);
\r
65 JsonNode rootNode = MAPPER.readValue(jsonFileUrl.toURL(), JsonNode.class);
\r
67 log.debug("Creating Process models...");
\r
68 JsonNode nodes = rootNode.get(JsonKeys.NODES);
\r
69 if (nodes == null) {
\r
73 this.loadConfigs(rootNode.get(JsonKeys.CONFIGS));
\r
75 Iterator<JsonNode> iter = nodes.iterator();
\r
76 while (iter.hasNext()) {
\r
77 JsonNode jsonNode = (JsonNode) iter.next();
\r
80 Element element = createElementFromJson(jsonNode);
\r
81 process.getElementList().add(element);
\r
83 // get sequence flows
\r
84 List<SequenceFlow> flowList = getSequenceFlows(jsonNode);
\r
85 process.getSequenceFlowList().addAll(flowList);
\r
88 if (element instanceof StartEvent) {
\r
89 List<DataObject> dataObjects = this.getDataObject((StartEvent) element);
\r
90 process.getDataObjectList().addAll(dataObjects);
\r
98 private List<DataObject> getDataObject(StartEvent startEvent) {
\r
99 List<DataObject> dataObjects = new ArrayList<DataObject>();
\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
107 dataObjects.add(dataObject);
\r
110 return dataObjects;
\r
113 private void loadConfigs(JsonNode config) {
\r
114 if(config == null) {
\r
117 loadRestConfigs(config.get(JsonKeys.REST_CONFIGS));
\r
120 private void loadRestConfigs(JsonNode restConfigs) {
\r
121 if(restConfigs == null) {
\r
125 Iterator<JsonNode> iter = restConfigs.iterator();
\r
126 while (iter.hasNext()) {
\r
127 JsonNode restConfig = (JsonNode) iter.next();
\r
129 String configId = getValueFromJsonNode(restConfig, JsonKeys.ID);
\r
130 restConfigMap.put(configId, restConfig);
\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
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
155 protected Element createElementFromJson(JsonNode jsonNode)
\r
156 throws JsonParseException, JsonMappingException, IOException {
\r
157 String jsonObject = jsonNode.toString();
\r
160 String nodeType = getValueFromJsonNode(jsonNode, JsonKeys.TYPE);
\r
161 if (nodeType == null) {
\r
162 log.warn("Ignoring node: type is null");
\r
166 switch (nodeType) {
\r
168 element = MAPPER.readValue(jsonObject, StartEvent.class);
\r
171 element = MAPPER.readValue(jsonObject, EndEvent.class);
\r
173 case "errorStartEvent":
\r
174 element = MAPPER.readValue(jsonObject, ErrorStartEvent.class);
\r
176 case "errorEndEvent":
\r
177 element = MAPPER.readValue(jsonObject, ErrorEndEvent.class);
\r
179 case "intermediateCatchEvent":
\r
180 element = MAPPER.readValue(jsonObject, IntermediateCatchEvent.class);
\r
182 case "serviceTask":
\r
183 element = MAPPER.readValue(jsonObject, ServiceTask.class);
\r
186 element = this.createRestServiceTask(jsonObject);
\r
189 element = MAPPER.readValue(jsonObject, ScriptTask.class);
\r
191 case "exclusiveGateway":
\r
192 element = MAPPER.readValue(jsonObject, ExclusiveGateway.class);
\r
194 case "parallelGateway":
\r
195 element = MAPPER.readValue(jsonObject, ParallelGateway.class);
\r
198 log.warn("Ignoring node: type '" + nodeType + "' is unkown");
\r
205 private RestServiceTask createRestServiceTask(String jsonObject) throws JsonParseException, JsonMappingException, IOException {
\r
206 RestServiceTask restServiceTask = MAPPER.readValue(jsonObject, RestServiceTask.class);
\r
208 // add baseUrl to relative url
\r
209 String restConfigId = restServiceTask.getRestConfigId();
\r
210 JsonNode restConfig = this.restConfigMap.get(restConfigId);
\r
212 if(restConfig != null) { // while create a new rest task and didnot set method, the restconfig info may be null
\r
213 restServiceTask.setUrl(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_URL));
\r
214 restServiceTask.setServiceName(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_NAME));
\r
215 restServiceTask.setServiceVersion(getValueFromJsonNode(restConfig, JsonKeys.MICROSERVICE_VERSION));
\r
218 for(Parameter parameter : restServiceTask.getParameters()) {
\r
219 if("body".equals(parameter.getPosition())) {
\r
220 parameter.setValueSource(null);
\r
224 return restServiceTask;
\r
227 private String getValueFromJsonNode(JsonNode jsonNode, String key) {
\r
228 return jsonNode.get(key) == null ? null : jsonNode.get(key).asText();
\r