提交 422fe63a 编写于 作者: F Frederik Heremans

Merge branch 'master' of https://github.com/Activiti/Activiti.git

......@@ -37,6 +37,7 @@ public interface BpmnXMLConstants {
public static final String ATTRIBUTE_ID = "id";
public static final String ATTRIBUTE_NAME = "name";
public static final String ATTRIBUTE_TYPE = "type";
public static final String ELEMENT_DOCUMENTATION = "documentation";
public static final String ELEMENT_SIGNAL = "signal";
......@@ -66,6 +67,9 @@ public interface BpmnXMLConstants {
public static final String ATTRIBUTE_ACTIVITY_EXCLUSIVE = "exclusive";
public static final String ATTRIBUTE_ACTIVITY_DEFAULT = "default";
// fake element for mail task
public static final String ELEMENT_TASK_MAIL = "mailTask";
public static final String ELEMENT_TASK_BUSINESSRULE = "businessRuleTask";
public static final String ELEMENT_TASK_MANUAL = "manualTask";
public static final String ELEMENT_TASK_RECEIVE = "receiveTask";
......
......@@ -41,6 +41,7 @@ import org.activiti.bpmn.model.BoundaryEvent;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.Event;
import org.activiti.bpmn.model.EventDefinition;
import org.activiti.bpmn.model.EventSubProcess;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.GraphicInfo;
import org.activiti.bpmn.model.Lane;
......@@ -218,10 +219,10 @@ public class BpmnXMLConverter implements BpmnXMLConstants {
if (activeSubProcessList.size() > 0 && ELEMENT_EXTENSIONS.equalsIgnoreCase(xtr.getLocalName())) {
new ExecutionListenerParser().parseChildElement(xtr, activeSubProcessList.get(activeSubProcessList.size() - 1));
} else if (activeSubProcessList.size() > 0 && "multiInstanceLoopCharacteristics".equalsIgnoreCase(xtr.getLocalName())) {
} else if (activeSubProcessList.size() > 0 && ELEMENT_MULTIINSTANCE.equalsIgnoreCase(xtr.getLocalName())) {
new MultiInstanceParser().parseChildElement(xtr, activeSubProcessList.get(activeSubProcessList.size() - 1));
} else if (convertersToBpmnMap.containsKey(xtr.getLocalName())) {
Class<? extends BaseBpmnXMLConverter> converter = convertersToBpmnMap.get(xtr.getLocalName());
converter.newInstance().convertToBpmnModel(xtr, model, activeProcess, activeSubProcessList);
......@@ -444,6 +445,10 @@ public class BpmnXMLConverter implements BpmnXMLConstants {
xtw.writeAttribute(ATTRIBUTE_NAME, "subProcess");
}
if (subProcess instanceof EventSubProcess) {
xtw.writeAttribute(ATTRIBUTE_TRIGGERED_BY, "true");
}
if (StringUtils.isNotEmpty(subProcess.getDocumentation())) {
xtw.writeStartElement(ELEMENT_DOCUMENTATION);
......
......@@ -56,6 +56,7 @@ public class ServiceTaskXMLConverter extends BaseBpmnXMLConverter {
}
serviceTask.setResultVariableName(xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE, ATTRIBUTE_TASK_SERVICE_RESULTVARIABLE));
serviceTask.setType(xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE, ATTRIBUTE_TYPE));
parseChildElements(getXMLElementName(), serviceTask, xtr);
......@@ -78,6 +79,9 @@ public class ServiceTaskXMLConverter extends BaseBpmnXMLConverter {
if (StringUtils.isNotEmpty(serviceTask.getResultVariableName())) {
writeQualifiedAttribute(ATTRIBUTE_TASK_SERVICE_RESULTVARIABLE, serviceTask.getResultVariableName(), xtw);
}
if (StringUtils.isNotEmpty(serviceTask.getType())) {
writeQualifiedAttribute(ATTRIBUTE_TYPE, serviceTask.getType(), xtw);
}
}
@Override
......
......@@ -50,7 +50,7 @@ public class ThrowEventXMLConverter extends BaseBpmnXMLConverter {
@Override
protected void writeAdditionalChildElements(BaseElement element, XMLStreamWriter xtw) throws Exception {
ThrowEvent throwEvent = new ThrowEvent();
ThrowEvent throwEvent = (ThrowEvent) element;
writeEventDefinitions(throwEvent.getEventDefinitions(), xtw);
}
}
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.bpmn.model;
/**
* @author Tijs Rademakers
*/
public class MailTask extends Task {
protected String to;
protected String subject;
protected String text;
protected String html;
protected String from;
protected String cc;
protected String bcc;
protected String charset;
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getHtml() {
return html;
}
public void setHtml(String html) {
this.html = html;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getCc() {
return cc;
}
public void setCc(String cc) {
this.cc = cc;
}
public String getBcc() {
return bcc;
}
public void setBcc(String bcc) {
this.bcc = bcc;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
}
......@@ -23,6 +23,7 @@ public class ServiceTask extends Task {
protected String implementation;
protected String implementationType;
protected String resultVariableName;
protected String type;
protected List<FieldExtension> fieldExtensions = new ArrayList<FieldExtension>();
protected List<CustomProperty> customProperties = new ArrayList<CustomProperty>();
......@@ -44,6 +45,12 @@ public class ServiceTask extends Task {
public void setResultVariableName(String resultVariableName) {
this.resultVariableName = resultVariableName;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<FieldExtension> getFieldExtensions() {
return fieldExtensions;
}
......
......@@ -304,6 +304,10 @@ public class ProcessDiagramCanvas {
public void drawThrowingSignalEvent(int x, int y, int width, int height) {
drawCatchingEvent(x, y, width, height, false, SIGNAL_THROW_IMAGE);
}
public void drawThrowingNoneEvent(int x, int y, int width, int height) {
drawCatchingEvent(x, y, width, height, false, null);
}
public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional) {
drawSequenceflow(srcX, srcY, targetX, targetY, conditional, false);
......
......@@ -75,6 +75,14 @@ public class ProcessDiagramGenerator {
}
});
// none throw
activityDrawInstructions.put("intermediateThrowEvent", new ActivityDrawInstruction() {
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawThrowingNoneEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight());
}
});
// end event
activityDrawInstructions.put("endEvent", new ActivityDrawInstruction() {
......@@ -325,6 +333,7 @@ public class ProcessDiagramGenerator {
protected static void drawActivity(ProcessDiagramCanvas processDiagramCanvas, ActivityImpl activity, List<String> highLightedActivities, List<String> highLightedFlows) {
String type = (String) activity.getProperty("type");
ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(type);
if (drawInstruction != null) {
......
......@@ -6,7 +6,9 @@ alter table ACT_RE_PROCDEF
alter table ACT_RU_TASK
add SUSPENSION_STATE_ integer;
Call Sysproc.admin_cmd ('REORG TABLE ACT_RU_TASK');
update ACT_RU_TASK set SUSPENSION_STATE_ = 1;
alter table ACT_RU_EXECUTION
......
......@@ -28,9 +28,11 @@ public interface StencilConstants {
final String STENCIL_EVENT_END_ERROR = "EndErrorEvent";
final String STENCIL_SUB_PROCESS = "SubProcess";
final String STENCIL_EVENT_SUB_PROCESS = "EventSubProcess";
final String STENCIL_CALL_ACTIVITY = "CallActivity";
final String STENCIL_TASK_BUSINESS_RULE = "BusinessRule";
final String STENCIL_TASK_MAIL = "MailTask";
final String STENCIL_TASK_MANUAL = "ManualTask";
final String STENCIL_TASK_RECEIVE = "ReceiveTask";
final String STENCIL_TASK_SCRIPT = "ScriptTask";
......@@ -55,6 +57,8 @@ public interface StencilConstants {
final String STENCIL_EVENT_THROW_NONE = "ThrowNoneEvent";
final String STENCIL_SEQUENCE_FLOW = "SequenceFlow";
final String STENCIL_TEXT_ANNOTATION = "TextAnnotation";
final String PROPERTY_VALUE_YES = "Yes";
final String PROPERTY_VALUE_NO = "No";
......@@ -141,6 +145,15 @@ public interface StencilConstants {
final String PROPERTY_RULETASK_RULES = "ruletask_rules";
final String PROPERTY_RULETASK_EXCLUDE = "ruletask_exclude";
final String PROPERTY_MAILTASK_TO = "mailtaskto";
final String PROPERTY_MAILTASK_FROM = "mailtaskfrom";
final String PROPERTY_MAILTASK_SUBJECT= "mailtasksubject";
final String PROPERTY_MAILTASK_CC= "mailtaskcc";
final String PROPERTY_MAILTASK_BCC= "mailtaskbcc";
final String PROPERTY_MAILTASK_TEXT= "mailtasktext";
final String PROPERTY_MAILTASK_HTML= "mailtaskhtml";
final String PROPERTY_MAILTASK_CHARSET= "mailtaskcharset";
final String PROPERTY_CALLACTIVITY_CALLEDELEMENT = "callactivitycalledelement";
final String PROPERTY_CALLACTIVITY_IN = "callactivityinparameters";
final String PROPERTY_CALLACTIVITY_OUT = "callactivityoutparameters";
......
......@@ -12,11 +12,12 @@
*/
package org.activiti.editor.language.json.converter;
import java.util.Collection;
import java.util.Map;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.FlowElement;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ArrayNode;
......@@ -25,7 +26,7 @@ import org.codehaus.jackson.node.ArrayNode;
*/
public interface ActivityProcessor {
public void processFlowElements(Process process, BpmnModel model, ArrayNode shapesArrayNode,
public void processFlowElements(Collection<FlowElement> flowElements, BpmnModel model, ArrayNode shapesArrayNode,
double subProcessX, double subProcessY);
public void processJsonElements(JsonNode shapesArrayNode, JsonNode modelNode, BaseElement parentElement, Map<String, JsonNode> shapeMap);
......
......@@ -26,6 +26,7 @@ import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.ErrorEventDefinition;
import org.activiti.bpmn.model.Event;
import org.activiti.bpmn.model.EventDefinition;
import org.activiti.bpmn.model.FieldExtension;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.GraphicInfo;
......@@ -34,6 +35,7 @@ import org.activiti.bpmn.model.MessageEventDefinition;
import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.ServiceTask;
import org.activiti.bpmn.model.SignalEventDefinition;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.SubProcess;
......@@ -57,23 +59,34 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
protected ObjectMapper objectMapper = new ObjectMapper();
protected ActivityProcessor processor;
protected BpmnModel model;
protected Process process;
protected ObjectNode flowElementNode;
protected double subProcessX;
protected double subProcessY;
protected ArrayNode shapesArrayNode;
public void convertToJson(FlowElement flowElement, ActivityProcessor processor, Process process, BpmnModel model,
public void convertToJson(FlowElement flowElement, ActivityProcessor processor, BpmnModel model,
ArrayNode shapesArrayNode, double subProcessX, double subProcessY) {
this.model = model;
this.processor = processor;
this.process = process;
this.subProcessX = subProcessX;
this.subProcessY = subProcessY;
this.shapesArrayNode = shapesArrayNode;
GraphicInfo graphicInfo = model.getGraphicInfo(flowElement.getId());
flowElementNode = BpmnJsonConverterUtil.createChildShape(flowElement.getId(), getStencilId(flowElement),
String stencilId = null;
if (flowElement instanceof ServiceTask) {
ServiceTask serviceTask = (ServiceTask) flowElement;
if ("mail".equalsIgnoreCase(serviceTask.getType())) {
stencilId = STENCIL_TASK_MAIL;
} else {
stencilId = getStencilId(flowElement);
}
} else {
stencilId = getStencilId(flowElement);
}
flowElementNode = BpmnJsonConverterUtil.createChildShape(flowElement.getId(), stencilId,
graphicInfo.x - subProcessX + graphicInfo.width,
graphicInfo.y - subProcessY + graphicInfo.height,
graphicInfo.x - subProcessX, graphicInfo.y - subProcessY);
......@@ -133,6 +146,12 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
}
}
}
if (activity instanceof UserTask) {
addListeners(((UserTask) activity).getTaskListeners(), false, propertiesNode);
} else {
addListeners(activity.getExecutionListeners(), true, propertiesNode);
}
}
flowElementNode.put("outgoing", outgoingArrayNode);
......@@ -153,7 +172,7 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
if (flowElement instanceof Activity) {
Activity activity = (Activity) flowElement;
activity.setAsynchronous(getPropertyValueAsBoolean(PROPERTY_ASYNCHRONOUS, elementNode));
activity.setNotExclusive(getPropertyValueAsBoolean(PROPERTY_EXCLUSIVE, elementNode));
activity.setNotExclusive(!getPropertyValueAsBoolean(PROPERTY_EXCLUSIVE, elementNode));
String multiInstanceCardinality = getPropertyValueAsString(PROPERTY_MULTIINSTANCE_CARDINALITY, elementNode);
String multiInstanceCollection = getPropertyValueAsString(PROPERTY_MULTIINSTANCE_COLLECTION, elementNode);
......@@ -186,6 +205,12 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
protected abstract String getStencilId(FlowElement flowElement);
protected void setPropertyValue(String name, String value, ObjectNode propertiesNode) {
if (StringUtils.isNotEmpty(value)) {
propertiesNode.put(name, value);
}
}
protected void addFormProperties(List<FormProperty> formProperties, ObjectNode propertiesNode) {
ObjectNode formPropertiesNode = objectMapper.createObjectNode();
ArrayNode itemsNode = objectMapper.createArrayNode();
......@@ -213,6 +238,72 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
propertiesNode.put("formproperties", formPropertiesNode);
}
protected void addListeners(List<ActivitiListener> listeners, boolean isExecutionListener, ObjectNode propertiesNode) {
String propertyName = null;
String eventType = null;
String listenerClass = null;
String listenerExpression = null;
String listenerDelegateExpression = null;
if (isExecutionListener) {
propertyName = PROPERTY_EXECUTION_LISTENERS;
eventType = PROPERTY_EXECUTION_LISTENER_EVENT;
listenerClass = PROPERTY_EXECUTION_LISTENER_CLASS;
listenerExpression = PROPERTY_EXECUTION_LISTENER_EXPRESSION;
listenerDelegateExpression = PROPERTY_EXECUTION_LISTENER_DELEGATEEXPRESSION;
} else {
propertyName = PROPERTY_TASK_LISTENERS;
eventType = PROPERTY_TASK_LISTENER_EVENT;
listenerClass = PROPERTY_TASK_LISTENER_CLASS;
listenerExpression = PROPERTY_TASK_LISTENER_EXPRESSION;
listenerDelegateExpression = PROPERTY_TASK_LISTENER_DELEGATEEXPRESSION;
}
ObjectNode listenersNode = objectMapper.createObjectNode();
ArrayNode itemsNode = objectMapper.createArrayNode();
for (ActivitiListener listener : listeners) {
ObjectNode propertyItemNode = objectMapper.createObjectNode();
propertyItemNode.put(eventType, listener.getEvent());
if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equals(listener.getImplementationType())) {
propertyItemNode.put(listenerClass, listener.getImplementation());
} else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equals(listener.getImplementationType())) {
propertyItemNode.put(listenerExpression, listener.getImplementation());
} else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equals(listener.getImplementationType())) {
propertyItemNode.put(listenerDelegateExpression, listener.getImplementation());
}
itemsNode.add(propertyItemNode);
}
listenersNode.put("totalCount", itemsNode.size());
listenersNode.put(EDITOR_PROPERTIES_GENERAL_ITEMS, itemsNode);
propertiesNode.put(propertyName, listenersNode);
}
protected void addFieldExtensions(List<FieldExtension> extensions, ObjectNode propertiesNode) {
ObjectNode fieldExtensionsNode = objectMapper.createObjectNode();
ArrayNode itemsNode = objectMapper.createArrayNode();
for (FieldExtension extension : extensions) {
ObjectNode propertyItemNode = objectMapper.createObjectNode();
propertyItemNode.put(PROPERTY_SERVICETASK_FIELD_NAME, extension.getFieldName());
if (StringUtils.isNotEmpty(extension.getStringValue())) {
propertyItemNode.put(PROPERTY_SERVICETASK_FIELD_VALUE, extension.getStringValue());
}
if (StringUtils.isNotEmpty(extension.getExpression())) {
propertyItemNode.put(PROPERTY_SERVICETASK_FIELD_EXPRESSION, extension.getExpression());
}
itemsNode.add(propertyItemNode);
}
fieldExtensionsNode.put("totalCount", itemsNode.size());
fieldExtensionsNode.put(EDITOR_PROPERTIES_GENERAL_ITEMS, itemsNode);
propertiesNode.put(PROPERTY_SERVICETASK_FIELDS, fieldExtensionsNode);
}
protected void addEventProperties(Event event, ObjectNode propertiesNode) {
List<EventDefinition> eventDefinitions = event.getEventDefinitions();
if (eventDefinitions.size() == 1) {
......@@ -299,14 +390,16 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
listenersNode = getProperty(propertyName, objectNode);
if (listenersNode != null && StringUtils.isNotEmpty(listenersNode.asText())) {
if (listenersNode != null) {
try {
listenersNode = objectMapper.readTree(listenersNode.asText());
} catch (Exception e) {
LOGGER.log(Level.INFO, "Listeners node can not be read", e);
if (listenersNode.isValueNode() && StringUtils.isNotEmpty(listenersNode.asText())) {
try {
listenersNode = objectMapper.readTree(listenersNode.asText());
} catch (Exception e) {
LOGGER.log(Level.INFO, "Listeners node can not be read", e);
}
}
JsonNode itemsArrayNode = listenersNode.get(EDITOR_PROPERTIES_GENERAL_ITEMS);
if (itemsArrayNode != null) {
for (JsonNode itemNode : itemsArrayNode) {
......@@ -397,7 +490,7 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
protected String getValueAsString(String name, JsonNode objectNode) {
String propertyValue = null;
JsonNode propertyNode = objectNode.get(name);
if (propertyNode != null) {
if (propertyNode != null && "null".equalsIgnoreCase(propertyNode.asText()) == false) {
propertyValue = propertyNode.asText();
}
return propertyValue;
......@@ -418,11 +511,12 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
protected String getPropertyValueAsString(String name, JsonNode objectNode) {
String propertyValue = null;
JsonNode propertyNode = getProperty(name, objectNode);
if (propertyNode != null) {
if (propertyNode != null && "null".equalsIgnoreCase(propertyNode.asText()) == false) {
propertyValue = propertyNode.asText();
}
return propertyValue;
}
protected boolean getPropertyValueAsBoolean(String name, JsonNode objectNode) {
boolean result = false;
String stringValue = getPropertyValueAsString(name, objectNode);
......@@ -435,7 +529,7 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
protected List<String> getPropertyValueAsList(String name, JsonNode objectNode) {
List<String> resultList = new ArrayList<String>();
JsonNode propertyNode = getProperty(name, objectNode);
if (propertyNode != null) {
if (propertyNode != null && "null".equalsIgnoreCase(propertyNode.asText()) == false) {
String propertyValue = propertyNode.asText();
String[] valueList = propertyValue.split(",");
for (String value : valueList) {
......
......@@ -68,6 +68,7 @@ public class BpmnJsonConverter implements EditorJsonConstants, StencilConstants,
// task types
BusinessRuleTaskJsonConverter.fillTypes(convertersToBpmnMap, convertersToJsonMap);
MailTaskJsonConverter.fillTypes(convertersToBpmnMap, convertersToJsonMap);
ManualTaskJsonConverter.fillTypes(convertersToBpmnMap, convertersToJsonMap);
ReceiveTaskJsonConverter.fillTypes(convertersToBpmnMap, convertersToJsonMap);
ScriptTaskJsonConverter.fillTypes(convertersToBpmnMap, convertersToJsonMap);
......@@ -83,6 +84,7 @@ public class BpmnJsonConverter implements EditorJsonConstants, StencilConstants,
// scope constructs
SubProcessJsonConverter.fillTypes(convertersToBpmnMap, convertersToJsonMap);
EventSubProcessJsonConverter.fillTypes(convertersToBpmnMap, convertersToJsonMap);
// catch events
CatchEventJsonConverter.fillTypes(convertersToBpmnMap, convertersToJsonMap);
......@@ -102,7 +104,6 @@ public class BpmnJsonConverter implements EditorJsonConstants, StencilConstants,
DI_CIRCLES.add(STENCIL_EVENT_START_ERROR);
DI_CIRCLES.add(STENCIL_EVENT_START_MESSAGE);
DI_CIRCLES.add(STENCIL_EVENT_START_NONE);
DI_CIRCLES.add(STENCIL_EVENT_START_SIGNAL);
DI_CIRCLES.add(STENCIL_EVENT_START_TIMER);
DI_CIRCLES.add(STENCIL_EVENT_BOUNDARY_ERROR);
......@@ -121,11 +122,12 @@ public class BpmnJsonConverter implements EditorJsonConstants, StencilConstants,
DI_RECTANGLES.add(STENCIL_CALL_ACTIVITY);
DI_RECTANGLES.add(STENCIL_SUB_PROCESS);
DI_RECTANGLES.add(STENCIL_EVENT_SUB_PROCESS);
DI_RECTANGLES.add(STENCIL_TASK_BUSINESS_RULE);
DI_RECTANGLES.add(STENCIL_TASK_MAIL);
DI_RECTANGLES.add(STENCIL_TASK_MANUAL);
DI_RECTANGLES.add(STENCIL_TASK_RECEIVE);
DI_RECTANGLES.add(STENCIL_TASK_SCRIPT);
DI_RECTANGLES.add(STENCIL_TASK_SEND);
DI_RECTANGLES.add(STENCIL_TASK_SERVICE);
DI_RECTANGLES.add(STENCIL_TASK_USER);
......@@ -164,20 +166,20 @@ public class BpmnJsonConverter implements EditorJsonConstants, StencilConstants,
propertiesNode.put(PROPERTY_DOCUMENTATION, process.getDocumentation());
}
modelNode.put(EDITOR_SHAPE_PROPERTIES, propertiesNode);
processFlowElements(process, model, shapesArrayNode, 0.0, 0.0);
processFlowElements(process.getFlowElements(), model, shapesArrayNode, 0.0, 0.0);
modelNode.put(EDITOR_CHILD_SHAPES, shapesArrayNode);
return modelNode;
}
public void processFlowElements(Process process, BpmnModel model, ArrayNode shapesArrayNode,
public void processFlowElements(Collection<FlowElement> flowElements, BpmnModel model, ArrayNode shapesArrayNode,
double subProcessX, double subProcessY) {
for (FlowElement flowElement : process.getFlowElements()) {
for (FlowElement flowElement : flowElements) {
Class<? extends BaseBpmnJsonConverter> converter = convertersToJsonMap.get(flowElement.getClass());
if (converter != null) {
try {
converter.newInstance().convertToJson(flowElement, this, process, model, shapesArrayNode,
converter.newInstance().convertToJson(flowElement, this, model, shapesArrayNode,
subProcessX, subProcessY);
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error converting " + flowElement, e);
......@@ -375,6 +377,16 @@ public class BpmnJsonConverter implements EditorJsonConstants, StencilConstants,
JsonNode sourceRefNode = sourceAndTargetList.get(0);
JsonNode targetRefNode = sourceAndTargetList.get(1);
if (sourceRefNode == null) {
LOGGER.log(Level.INFO, "Skipping edge " + edgeId + " because source ref is null");
continue;
}
if (targetRefNode == null) {
LOGGER.log(Level.INFO, "Skipping edge " + edgeId + " because target ref is null");
continue;
}
JsonNode dockersNode = edgeNode.get(EDITOR_DOCKERS);
double sourceDockersX = dockersNode.get(0).get(EDITOR_BOUNDS_X).getDoubleValue();
double sourceDockersY = dockersNode.get(0).get(EDITOR_BOUNDS_Y).getDoubleValue();
......
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.editor.language.json.converter;
import java.util.Map;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.EventSubProcess;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.GraphicInfo;
import org.activiti.bpmn.model.SubProcess;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
/**
* @author Tijs Rademakers
*/
public class EventSubProcessJsonConverter extends BaseBpmnJsonConverter {
public static void fillTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap,
Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {
fillJsonTypes(convertersToBpmnMap);
fillBpmnTypes(convertersToJsonMap);
}
public static void fillJsonTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap) {
convertersToBpmnMap.put(STENCIL_EVENT_SUB_PROCESS, EventSubProcessJsonConverter.class);
}
public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {
convertersToJsonMap.put(EventSubProcess.class, EventSubProcessJsonConverter.class);
}
protected String getStencilId(FlowElement flowElement) {
return STENCIL_EVENT_SUB_PROCESS;
}
protected void convertElementToJson(ObjectNode propertiesNode, FlowElement flowElement) {
SubProcess subProcess = (SubProcess) flowElement;
propertiesNode.put("activitytype", "Event-Sub-Process");
propertiesNode.put("subprocesstype", "Embedded");
ArrayNode subProcessShapesArrayNode = objectMapper.createArrayNode();
GraphicInfo graphicInfo = model.getGraphicInfo(flowElement.getId());
processor.processFlowElements(subProcess.getFlowElements(), model, subProcessShapesArrayNode,
graphicInfo.x + subProcessX, graphicInfo.y + subProcessY);
flowElementNode.put("childShapes", subProcessShapesArrayNode);
}
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {
EventSubProcess subProcess = new EventSubProcess();
JsonNode childShapesArray = elementNode.get(EDITOR_CHILD_SHAPES);
processor.processJsonElements(childShapesArray, modelNode, subProcess, shapeMap);
return subProcess;
}
}
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.editor.language.json.converter;
import java.util.Map;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.FieldExtension;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.ServiceTask;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ObjectNode;
/**
* @author Tijs Rademakers
*/
public class MailTaskJsonConverter extends BaseBpmnJsonConverter {
public static void fillTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap,
Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {
fillJsonTypes(convertersToBpmnMap);
fillBpmnTypes(convertersToJsonMap);
}
public static void fillJsonTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap) {
convertersToBpmnMap.put(STENCIL_TASK_MAIL, MailTaskJsonConverter.class);
}
public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {
// will be handled by ServiceTaskJsonConverter
}
protected String getStencilId(FlowElement flowElement) {
return STENCIL_TASK_MAIL;
}
protected void convertElementToJson(ObjectNode propertiesNode, FlowElement flowElement) {
// will be handled by ServiceTaskJsonConverter
}
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {
ServiceTask task = new ServiceTask();
task.setType("mail");
addField(PROPERTY_MAILTASK_TO, elementNode, task);
addField(PROPERTY_MAILTASK_FROM, elementNode, task);
addField(PROPERTY_MAILTASK_SUBJECT, elementNode, task);
addField(PROPERTY_MAILTASK_CC, elementNode, task);
addField(PROPERTY_MAILTASK_BCC, elementNode, task);
addField(PROPERTY_MAILTASK_TEXT, elementNode, task);
addField(PROPERTY_MAILTASK_HTML, elementNode, task);
addField(PROPERTY_MAILTASK_CHARSET, elementNode, task);
return task;
}
protected void addField(String name, JsonNode elementNode, ServiceTask task) {
FieldExtension field = new FieldExtension();
field.setFieldName(name.substring(8));
String value = getPropertyValueAsString(name, elementNode);
if (StringUtils.isNotEmpty(value)) {
if ((value.contains("${") || value.contains("#{")) && value.contains("}")) {
field.setExpression(value);
} else {
field.setStringValue(value);
}
}
task.getFieldExtensions().add(field);
}
}
......@@ -18,7 +18,6 @@ import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.GraphicInfo;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SequenceFlow;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonNode;
......@@ -52,8 +51,7 @@ public class SequenceFlowJsonConverter extends BaseBpmnJsonConverter {
@Override
public void convertToJson(FlowElement flowElement, ActivityProcessor processor,
Process process, BpmnModel model, ArrayNode shapesArrayNode,
double subProcessX, double subProcessY) {
BpmnModel model, ArrayNode shapesArrayNode, double subProcessX, double subProcessY) {
SequenceFlow sequenceFlow = (SequenceFlow) flowElement;
ObjectNode flowNode = BpmnJsonConverterUtil.createChildShape(sequenceFlow.getId(), STENCIL_SEQUENCE_FLOW, 172, 212, 128, 212);
......
......@@ -49,13 +49,30 @@ public class ServiceTaskJsonConverter extends BaseBpmnJsonConverter {
protected void convertElementToJson(ObjectNode propertiesNode, FlowElement flowElement) {
ServiceTask serviceTask = (ServiceTask) flowElement;
if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equals(serviceTask.getImplementationType())) {
propertiesNode.put(PROPERTY_SERVICETASK_CLASS, serviceTask.getImplementation());
} else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equals(serviceTask.getImplementationType())) {
propertiesNode.put(PROPERTY_SERVICETASK_EXPRESSION, serviceTask.getImplementation());
} else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equals(serviceTask.getImplementationType())) {
propertiesNode.put(PROPERTY_SERVICETASK_DELEGATE_EXPRESSION, serviceTask.getImplementation());
}
if ("mail".equalsIgnoreCase(serviceTask.getType())) {
setPropertyFieldValue(PROPERTY_MAILTASK_TO, serviceTask, propertiesNode);
setPropertyFieldValue(PROPERTY_MAILTASK_FROM, serviceTask, propertiesNode);
setPropertyFieldValue(PROPERTY_MAILTASK_SUBJECT, serviceTask, propertiesNode);
setPropertyFieldValue(PROPERTY_MAILTASK_CC, serviceTask, propertiesNode);
setPropertyFieldValue(PROPERTY_MAILTASK_BCC, serviceTask, propertiesNode);
setPropertyFieldValue(PROPERTY_MAILTASK_TEXT, serviceTask, propertiesNode);
setPropertyFieldValue(PROPERTY_MAILTASK_HTML, serviceTask, propertiesNode);
setPropertyFieldValue(PROPERTY_MAILTASK_CHARSET, serviceTask, propertiesNode);
} else {
if (ImplementationType.IMPLEMENTATION_TYPE_CLASS.equals(serviceTask.getImplementationType())) {
propertiesNode.put(PROPERTY_SERVICETASK_CLASS, serviceTask.getImplementation());
} else if (ImplementationType.IMPLEMENTATION_TYPE_EXPRESSION.equals(serviceTask.getImplementationType())) {
propertiesNode.put(PROPERTY_SERVICETASK_EXPRESSION, serviceTask.getImplementation());
} else if (ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equals(serviceTask.getImplementationType())) {
propertiesNode.put(PROPERTY_SERVICETASK_DELEGATE_EXPRESSION, serviceTask.getImplementation());
}
addFieldExtensions(serviceTask.getFieldExtensions(), propertiesNode);
}
}
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {
......@@ -96,4 +113,16 @@ public class ServiceTaskJsonConverter extends BaseBpmnJsonConverter {
return task;
}
protected void setPropertyFieldValue(String name, ServiceTask task, ObjectNode propertiesNode) {
for (FieldExtension extension : task.getFieldExtensions()) {
if (name.substring(8).equalsIgnoreCase(extension.getFieldName())) {
if (StringUtils.isNotEmpty(extension.getStringValue())) {
setPropertyValue(name, extension.getStringValue(), propertiesNode);
} else if (StringUtils.isNotEmpty(extension.getExpression())) {
setPropertyValue(name, extension.getExpression(), propertiesNode);
}
}
}
}
}
......@@ -47,13 +47,14 @@ public class SubProcessJsonConverter extends BaseBpmnJsonConverter {
}
protected void convertElementToJson(ObjectNode propertiesNode, FlowElement flowElement) {
SubProcess subProcess = (SubProcess) flowElement;
propertiesNode.put("activitytype", "Sub-Process");
propertiesNode.put("subprocesstype", "Embedded");
ArrayNode subProcessshapesArrayNode = objectMapper.createArrayNode();
ArrayNode subProcessShapesArrayNode = objectMapper.createArrayNode();
GraphicInfo graphicInfo = model.getGraphicInfo(flowElement.getId());
processor.processFlowElements(process, model, shapesArrayNode,
processor.processFlowElements(subProcess.getFlowElements(), model, subProcessShapesArrayNode,
graphicInfo.x + subProcessX, graphicInfo.y + subProcessY);
flowElementNode.put("childShapes", subProcessshapesArrayNode);
flowElementNode.put("childShapes", subProcessShapesArrayNode);
}
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {
......
......@@ -86,6 +86,12 @@ public class UserTaskJsonConverter extends BaseBpmnJsonConverter {
propertiesNode.put(PROPERTY_USERTASK_ASSIGNMENT, assignmentNode);
}
if (userTask.getPriority() != null) {
setPropertyValue(PROPERTY_USERTASK_PRIORITY, userTask.getPriority().toString(), propertiesNode);
}
setPropertyValue(PROPERTY_USERTASK_FORMKEY, userTask.getFormKey(), propertiesNode);
setPropertyValue(PROPERTY_USERTASK_DUEDATE, userTask.getDueDate(), propertiesNode);
addFormProperties(userTask.getFormProperties(), propertiesNode);
}
......@@ -104,21 +110,23 @@ public class UserTaskJsonConverter extends BaseBpmnJsonConverter {
task.setDueDate(getPropertyValueAsString(PROPERTY_USERTASK_DUEDATE, elementNode));
JsonNode assignmentNode = getProperty(PROPERTY_USERTASK_ASSIGNMENT, elementNode);
JsonNode itemsNode = assignmentNode.get(EDITOR_PROPERTIES_GENERAL_ITEMS);
if (itemsNode != null) {
Iterator<JsonNode> assignmentIterator = itemsNode.getElements();
while (assignmentIterator.hasNext()) {
JsonNode assignmentItemNode = assignmentIterator.next();
if (assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_TYPE) != null &&
assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION) != null) {
String assignmentType = assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_TYPE).asText();
if (PROPERTY_USERTASK_ASSIGNEE.equals(assignmentType)) {
task.setAssignee(assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION).asText());
} else if (PROPERTY_USERTASK_CANDIDATE_USERS.equals(assignmentType)) {
task.setCandidateUsers(getValueAsList(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, assignmentItemNode));
} else if (PROPERTY_USERTASK_CANDIDATE_GROUPS.equals(assignmentType)) {
task.setCandidateGroups(getValueAsList(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, assignmentItemNode));
if (assignmentNode != null) {
JsonNode itemsNode = assignmentNode.get(EDITOR_PROPERTIES_GENERAL_ITEMS);
if (itemsNode != null) {
Iterator<JsonNode> assignmentIterator = itemsNode.getElements();
while (assignmentIterator.hasNext()) {
JsonNode assignmentItemNode = assignmentIterator.next();
if (assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_TYPE) != null &&
assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION) != null) {
String assignmentType = assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_TYPE).asText();
if (PROPERTY_USERTASK_ASSIGNEE.equals(assignmentType)) {
task.setAssignee(assignmentItemNode.get(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION).asText());
} else if (PROPERTY_USERTASK_CANDIDATE_USERS.equals(assignmentType)) {
task.setCandidateUsers(getValueAsList(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, assignmentItemNode));
} else if (PROPERTY_USERTASK_CANDIDATE_GROUPS.equals(assignmentType)) {
task.setCandidateGroups(getValueAsList(PROPERTY_USERTASK_ASSIGNMENT_EXPRESSION, assignmentItemNode));
}
}
}
}
......
......@@ -6,6 +6,7 @@ import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;
public abstract class AbstractConverterTest {
......@@ -16,5 +17,11 @@ public abstract class AbstractConverterTest {
return bpmnModel;
}
protected BpmnModel convertToJsonAndBack(BpmnModel bpmnModel) {
ObjectNode modelNode = new BpmnJsonConverter().convertToJson(bpmnModel);
bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode);
return bpmnModel;
}
protected abstract String getResource();
}
......@@ -20,6 +20,13 @@ public class CallActivityConverterTest extends AbstractConverterTest {
validateModel(bpmnModel);
}
@Test
public void doubleConversionValidation() throws Exception {
BpmnModel bpmnModel = readJsonFile();
bpmnModel = convertToJsonAndBack(bpmnModel);
validateModel(bpmnModel);
}
protected String getResource() {
return "test.callactivitymodel.json";
}
......
......@@ -21,6 +21,13 @@ public class CompleteConverterTest extends AbstractConverterTest {
validateModel(bpmnModel);
}
@Test
public void doubleConversionValidation() throws Exception {
BpmnModel bpmnModel = readJsonFile();
bpmnModel = convertToJsonAndBack(bpmnModel);
validateModel(bpmnModel);
}
protected String getResource() {
return "test.completemodel.json";
}
......
......@@ -21,6 +21,13 @@ public class ScopedConverterTest extends AbstractConverterTest {
validateModel(bpmnModel);
}
@Test
public void doubleConversionValidation() throws Exception {
BpmnModel bpmnModel = readJsonFile();
bpmnModel = convertToJsonAndBack(bpmnModel);
validateModel(bpmnModel);
}
protected String getResource() {
return "test.scopedmodel.json";
}
......
......@@ -22,6 +22,13 @@ public class ServiceTaskConverterTest extends AbstractConverterTest {
validateModel(bpmnModel);
}
@Test
public void doubleConversionValidation() throws Exception {
BpmnModel bpmnModel = readJsonFile();
bpmnModel = convertToJsonAndBack(bpmnModel);
validateModel(bpmnModel);
}
protected String getResource() {
return "test.servicetaskmodel.json";
}
......
......@@ -20,6 +20,13 @@ public class SimpleConverterTest extends AbstractConverterTest {
validateModel(bpmnModel);
}
@Test
public void doubleConversionValidation() throws Exception {
BpmnModel bpmnModel = readJsonFile();
bpmnModel = convertToJsonAndBack(bpmnModel);
validateModel(bpmnModel);
}
protected String getResource() {
return "test.simplemodel.json";
}
......
......@@ -21,6 +21,13 @@ public class SubProcessConverterTest extends AbstractConverterTest {
validateModel(bpmnModel);
}
@Test
public void doubleConversionValidation() throws Exception {
BpmnModel bpmnModel = readJsonFile();
bpmnModel = convertToJsonAndBack(bpmnModel);
validateModel(bpmnModel);
}
protected String getResource() {
return "test.subprocessmodel.json";
}
......
......@@ -23,6 +23,13 @@ public class UserTaskConverterTest extends AbstractConverterTest {
validateModel(bpmnModel);
}
@Test
public void doubleConversionValidation() throws Exception {
BpmnModel bpmnModel = readJsonFile();
bpmnModel = convertToJsonAndBack(bpmnModel);
validateModel(bpmnModel);
}
protected String getResource() {
return "test.usertaskmodel.json";
}
......
......@@ -427,6 +427,65 @@
"value" : "Yes"
} ]
} ]
}, {
"name" : "mailtaskbase",
"properties" : [ {
"id" : "mailtaskto",
"type" : "Text",
"title" : "To",
"value" : "",
"description" : "The recipients if the e-mail. Multiple recipients are defined in a comma-separated list.",
"popular" : true
}, {
"id" : "mailtaskfrom",
"type" : "Text",
"title" : "From",
"value" : "",
"description" : "The sender e-mail address. If not provided, the default configured from address is used.",
"popular" : true
}, {
"id" : "mailtasksubject",
"type" : "Text",
"title" : "Subject",
"value" : "",
"description" : "The subject of the e-mail.",
"popular" : true
}, {
"id" : "mailtaskcc",
"type" : "Text",
"title" : "Cc",
"value" : "",
"description" : "The cc's of the e-mail. Multiple recipients are defined in a comma-separated list",
"popular" : true
}, {
"id" : "mailtaskbcc",
"type" : "Text",
"title" : "Bcc",
"value" : "",
"description" : "The bcc's of the e-mail. Multiple recipients are defined in a comma-separated list",
"popular" : true
}, {
"id" : "mailtasktext",
"type" : "Text",
"title" : "Text",
"value" : "",
"description" : "The content of the e-mail, in case one needs to send plain none-rich e-mails. Can be used in combination with html, for e-mail clients that don't support rich content. The client will then fall back to this text-only alternative.",
"popular" : true
}, {
"id" : "mailtaskhtml",
"type" : "Text",
"title" : "Html",
"value" : "",
"description" : "A piece of HTML that is the content of the e-mail.",
"popular" : true
}, {
"id" : "mailtaskcharset",
"type" : "String",
"title" : "Charset",
"value" : "",
"description" : "Allows to change the charset of the email, which is necessary for many non-English languages. ",
"popular" : true
} ]
}, {
"name" : "callactivitybase",
"properties" : [ {
......@@ -608,6 +667,17 @@
"description" : "Initiator of the process.",
"popular" : true
} ]
}, {
"name" : "textannotationbase",
"properties" : [ {
"id" : "text",
"type" : "String",
"title" : "Text",
"value" : "",
"description" : "The text of the text annotation.",
"popular" : true,
"refToView" : "text"
} ]
}, {
"name" : "asynchronousbase",
"properties" : [ {
......@@ -888,16 +958,6 @@
"groups" : [ "Start Events" ],
"propertyPackages" : [ "elementbase", "baseattributes", "messagerefdefinition", "executionlistenersbase" ],
"roles" : [ "Startevents_all", "sequence_start", "StartEventsMorph", "all" ]
}, {
"type" : "node",
"id" : "StartSignalEvent",
"title" : "Start signal event",
"description" : "A start event with a signal trigger",
"view" : "startevent/signal.svg",
"icon" : "startevent/signal.png",
"groups" : [ "Start Events" ],
"propertyPackages" : [ "elementbase", "baseattributes", "signalrefdefinition", "executionlistenersbase" ],
"roles" : [ "Startevents_all", "sequence_start", "StartEventsMorph", "all" ]
}, {
"type" : "node",
"id" : "StartErrorEvent",
......@@ -916,7 +976,7 @@
"view" : "activity/usertask.svg",
"icon" : "activity/list/type.user.png",
"groups" : [ "Activities" ],
"propertyPackages" : [ "elementbase", "baseattributes", "usertaskbase", "usertaskassignment", "formdefinition", "tasklistenersbase", "asynchronousbase", "customformdefinition", "loopcharacteristics", "activity" ],
"propertyPackages" : [ "elementbase", "baseattributes", "usertaskbase", "usertaskassignment", "formdefinition", "tasklistenersbase", "asynchronousbase", "loopcharacteristics", "activity" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "ActivitiesMorph", "all" ]
}, {
"type" : "node",
......@@ -958,16 +1018,6 @@
"groups" : [ "Activities" ],
"propertyPackages" : [ "elementbase", "baseattributes", "asynchronousbase", "executionlistenersbase", "loopcharacteristics", "activity" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "ActivitiesMorph", "all" ]
}, {
"type" : "node",
"id" : "SendTask",
"title" : "Send task",
"description" : "An automatic task that sends a message",
"view" : "activity/sendtask.svg",
"icon" : "activity/list/type.send.png",
"groups" : [ "Activities" ],
"propertyPackages" : [ "elementbase", "baseattributes", "asynchronousbase", "executionlistenersbase", "loopcharacteristics", "activity" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "ActivitiesMorph", "all" ]
}, {
"type" : "node",
"id" : "ManualTask",
......@@ -978,6 +1028,16 @@
"groups" : [ "Activities" ],
"propertyPackages" : [ "elementbase", "baseattributes", "asynchronousbase", "executionlistenersbase", "loopcharacteristics", "activity" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "ActivitiesMorph", "all" ]
}, {
"type" : "node",
"id" : "MailTask",
"title" : "Mail task",
"description" : "An mail task",
"view" : "activity/sendtask.svg",
"icon" : "activity/list/type.send.png",
"groups" : [ "Activities" ],
"propertyPackages" : [ "elementbase", "baseattributes", "mailtaskbase", "asynchronousbase", "executionlistenersbase", "loopcharacteristics", "activity" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "ActivitiesMorph", "all" ]
}, {
"type" : "node",
"id" : "SubProcess",
......@@ -988,6 +1048,16 @@
"groups" : [ "Structural" ],
"propertyPackages" : [ "elementbase", "baseattributes", "asynchronousbase", "executionlistenersbase" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "all" ]
}, {
"type" : "node",
"id" : "EventSubProcess",
"title" : "Event sub process",
"description" : "A event sub process scope",
"view" : "activity/event.subprocess.svg",
"icon" : "activity/event.subprocess.png",
"groups" : [ "Structural" ],
"propertyPackages" : [ "elementbase", "baseattributes", "asynchronousbase", "executionlistenersbase" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "all" ]
}, {
"type" : "node",
"id" : "CallActivity",
......@@ -1151,6 +1221,29 @@
} ],
"propertyPackages" : [ "elementbase", "baseattributes", "sequenceflowbase" ],
"roles" : [ "ConnectingObjectsMorph", "all" ]
}, {
"type" : "edge",
"id" : "Association",
"title" : "Association",
"description" : "Associates a text annotation with an element.",
"view" : "connector/association.undirected.svg",
"icon" : "connector/association.undirected.png",
"groups" : [ "Connecting Objects" ],
"layout" : [ {
"type" : "layout.bpmn2_0.sequenceflow"
} ],
"propertyPackages" : [ "elementbase", "baseattributes" ],
"roles" : [ "ConnectingObjectsMorph", "all" ]
}, {
"type" : "node",
"id" : "TextAnnotation",
"title" : "Text annotation",
"description" : "Annotates elements with description text.",
"view" : "artifact/text.annotation.svg",
"icon" : "artifact/text.annotation.png",
"groups" : [ "Artifacts" ],
"propertyPackages" : [ "elementbase", "baseattributes", "textannotationbase" ],
"roles" : [ "all" ]
} ],
"rules" : {
"cardinalityRules" : [ {
......@@ -1172,6 +1265,18 @@
"from" : "sequence_start",
"to" : [ "sequence_end" ]
} ]
}, {
"role" : "Association",
"connects" : [ {
"from" : "sequence_start",
"to" : [ "TextAnnotation" ]
} ]
}, {
"role" : "Association",
"connects" : [ {
"from" : "TextAnnotation",
"to" : [ "sequence_end" ]
} ]
}, {
"role" : "IntermediateEventOnActivityBoundary",
"connects" : [ {
......@@ -1185,6 +1290,9 @@
}, {
"role" : "SubProcess",
"contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "EventSubprocess", "TextAnnotation" ]
}, {
"role" : "EventSubProcess",
"contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "TextAnnotation" ]
} ],
"morphingRules" : [ {
"role" : "ActivitiesMorph",
......@@ -1199,6 +1307,15 @@
}, {
"role" : "EndEventsMorph",
"baseMorphs" : [ "StartNoneEvent" ]
}, {
"role" : "CatchEventsMorph",
"baseMorphs" : [ "CatchTimerEvent" ]
}, {
"role" : "ThrowEventsMorph",
"baseMorphs" : [ "ThrowNoneEvent" ]
}, {
"role" : "TextAnnotation",
"baseMorphs" : [ "TextAnnotation" ]
} ]
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册