&& ((String) activity.getProperty("type")).toLowerCase()
.contains("gateway");
List<Integer> waypoints = ((TransitionImpl) sequenceFlow)
.getWaypoints();
ArrayNode xPointArray = new ObjectMapper().createArrayNode();
ArrayNode yPointArray = new ObjectMapper().createArrayNode();
for (int i = 0; i < waypoints.size(); i += 2) { // waypoints.size()
// minimally 4: x1, y1,
// x2, y2
xPointArray.add(waypoints.get(i));
yPointArray.add(waypoints.get(i + 1));
}
ObjectNode flowJSON = new ObjectMapper().createObjectNode();
flowJSON.put("id", sequenceFlow.getId());
flowJSON.put("name", flowName);
flowJSON.put("flow", "(" + sequenceFlow.getSource().getId() + ")--"
+ sequenceFlow.getId() + "-->("
+ sequenceFlow.getDestination().getId() + ")");
if (isConditional) {
flowJSON.put("isConditional", isConditional);
}
if (isDefault) {
flowJSON.put("isDefault", isDefault);
}
if (isHighLighted) {
flowJSON.put("isHighLighted", isHighLighted);
}
flowJSON.set("xPointArray", xPointArray);
flowJSON.set("yPointArray", yPointArray);
sequenceFlowArray.add(flowJSON);
}
// Nested activities (boundary events)
ArrayNode nestedActivityArray = new ObjectMapper().createArrayNode();
for (ActivityImpl nestedActivity : activity.getActivities()) {
nestedActivityArray.add(nestedActivity.getId());
}
Map<String, Object> properties = activity.getProperties();
ObjectNode propertiesJSON = new ObjectMapper().createObjectNode();
for (Map.Entry<String, Object> entry : properties.entrySet()) {
String key = entry.getKey();
Object prop = entry.getValue();
if (prop instanceof String) {
propertiesJSON.put(key, (String) properties.get(key));
} else if (prop instanceof Integer) {
propertiesJSON.put(key, (Integer) properties.get(key));
} else if (prop instanceof Boolean) {
propertiesJSON.put(key, (Boolean) properties.get(key));
} else if ("initial".equals(key)) {
ActivityImpl act = (ActivityImpl) properties.get(key);
propertiesJSON.put(key, act.getId());
} else if ("timerDeclarations".equals(key)) {
ArrayList<TimerDeclarationImpl> timerDeclarations = (ArrayList<TimerDeclarationImpl>) properties
.get(key);
ArrayNode timerDeclarationArray = new ObjectMapper()
.createArrayNode();
if (timerDeclarations != null) {
for (TimerDeclarationImpl timerDeclaration : timerDeclarations) {
ObjectNode timerDeclarationJSON = new ObjectMapper()
.createObjectNode();
timerDeclarationJSON.put("isExclusive",
timerDeclaration.isExclusive());
if (timerDeclaration.getRepeat() != null) {
timerDeclarationJSON.put("repeat",
timerDeclaration.getRepeat());
}
timerDeclarationJSON.put("retries",
String.valueOf(timerDeclaration.getRetries()));
timerDeclarationJSON.put("type",
timerDeclaration.getJobHandlerType());
timerDeclarationJSON.put("configuration",
timerDeclaration.getJobHandlerConfiguration());
timerDeclarationArray.add(timerDeclarationJSON);
}
}
if (timerDeclarationArray.size() > 0) {
propertiesJSON.set(key, timerDeclarationArray);
}
// TODO: implement getting description
} else if ("eventDefinitions".equals(key)) {
ArrayList<EventSubscriptionDeclaration> eventDefinitions = (ArrayList<EventSubscriptionDeclaration>) properties
.get(key);
ArrayNode eventDefinitionsArray = new ObjectMapper()
.createArrayNode();
if (eventDefinitions != null) {
for (EventSubscriptionDeclaration eventDefinition : eventDefinitions) {
ObjectNode eventDefinitionJSON = new ObjectMapper()
.createObjectNode();
if (eventDefinition.getActivityId() != null) {
eventDefinitionJSON.put("activityId",
eventDefinition.getActivityId());
}
eventDefinitionJSON.put("eventName",
eventDefinition.getEventName());
eventDefinitionJSON.put("eventType",
eventDefinition.getEventType());
eventDefinitionJSON.put("isAsync",
eventDefinition.isAsync());
eventDefinitionJSON.put("isStartEvent",
eventDefinition.isStartEvent());
eventDefinitionsArray.add(eventDefinitionJSON);
}
}
if (eventDefinitionsArray.size() > 0) {
propertiesJSON.set(key, eventDefinitionsArray);
}
// TODO: implement it
} else if ("errorEventDefinitions".equals(key)) {
ArrayList<ErrorEventDefinition> errorEventDefinitions = (ArrayList<ErrorEventDefinition>) properties
.get(key);
ArrayNode errorEventDefinitionsArray = new ObjectMapper()
.createArrayNode();
if (errorEventDefinitions != null) {
for (ErrorEventDefinition errorEventDefinition : errorEventDefinitions) {
ObjectNode errorEventDefinitionJSON = new ObjectMapper()
.createObjectNode();
if (errorEventDefinition.getErrorCode() != null) {
errorEventDefinitionJSON.put("errorCode",
errorEventDefinition.getErrorCode());
} else {
errorEventDefinitionJSON.putNull("errorCode");
}
errorEventDefinitionJSON.put("handlerActivityId",
errorEventDefinition.getHandlerActivityId());
errorEventDefinitionsArray
.add(errorEventDefinitionJSON);
}
}
if (errorEventDefinitionsArray.size() > 0) {
propertiesJSON.set(key, errorEventDefinitionsArray);
}
}
}
if ("callActivity".equals(properties.get("type"))) {
CallActivityBehavior callActivityBehavior = null;
if (activityBehavior instanceof CallActivityBehavior) {
callActivityBehavior = (CallActivityBehavior) activityBehavior;
}
if (callActivityBehavior != null) {
propertiesJSON.put("processDefinitonKey",
callActivityBehavior.getProcessDefinitonKey());
// get processDefinitonId from execution or get last processDefinitonId
// by key
ArrayNode processInstanceArray = new ObjectMapper()
.createArrayNode();
if (processInstance != null) {
List<Execution> executionList = runtimeService
.createExecutionQuery()
.processInstanceId(processInstanceId)
.activityId(activity.getId()).list();
if (executionList.size() > 0) {
for (Execution execution : executionList) {
ObjectNode processInstanceJSON = subProcessInstanceMap
.get(execution.getId());
processInstanceArray.add(processInstanceJSON);
}
}
}
// If active activities nas no instance of this callActivity then add
// last definition
if (processInstanceArray.size() == 0) {
// Get last definition by key
ProcessDefinition lastProcessDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey(
callActivityBehavior
.getProcessDefinitonKey())
.latestVersion().singleResult();
// TODO: unuseful fields there are processDefinitionName,
// processDefinitionKey
ObjectNode processInstanceJSON = new ObjectMapper()
.createObjectNode();
processInstanceJSON.put("processDefinitionId",
lastProcessDefinition.getId());
processInstanceJSON.put("processDefinitionKey",
lastProcessDefinition.getKey());
processInstanceJSON.put("processDefinitionName",
lastProcessDefinition.getName());
processInstanceArray.add(processInstanceJSON);
}
if (processInstanceArray.size() > 0) {
propertiesJSON.set("processDefinitons",
processInstanceArray);
}
}
}