提交 90c0028a 编写于 作者: T Tijs Rademakers

Merge pull request #235 from mikedias/boundarymessage

ACT-1739: Added support to Message Boundary Events in Modeler
......@@ -51,6 +51,7 @@ public interface StencilConstants {
final String STENCIL_EVENT_BOUNDARY_TIMER = "BoundaryTimerEvent";
final String STENCIL_EVENT_BOUNDARY_ERROR = "BoundaryErrorEvent";
final String STENCIL_EVENT_BOUNDARY_SIGNAL = "BoundarySignalEvent";
final String STENCIL_EVENT_BOUNDARY_MESSAGE = "BoundaryMessageEvent";
final String STENCIL_EVENT_CATCH_SIGNAL = "CatchSignalEvent";
final String STENCIL_EVENT_CATCH_TIMER = "CatchTimerEvent";
......
......@@ -361,7 +361,21 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
} else if (eventDefinition instanceof MessageEventDefinition) {
MessageEventDefinition messageDefinition = (MessageEventDefinition) eventDefinition;
if (StringUtils.isNotEmpty(messageDefinition.getMessageRef())) {
propertiesNode.put(PROPERTY_MESSAGEREF, messageDefinition.getMessageRef());
String messageRef = messageDefinition.getMessageRef();
// remove the namespace from the message id if set
if (messageRef.startsWith(model.getTargetNamespace())) {
messageRef = messageRef.replace(model.getTargetNamespace(), "");
messageRef = messageRef.replaceFirst(":", "");
} else {
for (String prefix : model.getNamespaces().keySet()) {
String namespace = model.getNamespace(prefix);
if (messageRef.startsWith(namespace)) {
messageRef = messageRef.replace(model.getTargetNamespace(), "");
messageRef = prefix + messageRef;
}
}
}
propertiesNode.put(PROPERTY_MESSAGEREF, messageRef);
}
} else if (eventDefinition instanceof SignalEventDefinition) {
......@@ -650,6 +664,10 @@ public abstract class BaseBpmnJsonConverter implements EditorJsonConstants, Sten
return JsonConverterUtil.getPropertyValueAsBoolean(name, objectNode);
}
protected boolean getPropertyValueAsBoolean(String name, JsonNode objectNode, boolean defaultValue) {
return JsonConverterUtil.getPropertyValueAsBoolean(name, objectNode, defaultValue);
}
protected List<String> getPropertyValueAsList(String name, JsonNode objectNode) {
return JsonConverterUtil.getPropertyValueAsList(name, objectNode);
}
......
......@@ -21,6 +21,7 @@ import org.activiti.bpmn.model.ErrorEventDefinition;
import org.activiti.bpmn.model.EventDefinition;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.GraphicInfo;
import org.activiti.bpmn.model.MessageEventDefinition;
import org.activiti.bpmn.model.SignalEventDefinition;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ArrayNode;
......@@ -42,6 +43,7 @@ public class BoundaryEventJsonConverter extends BaseBpmnJsonConverter {
convertersToBpmnMap.put(STENCIL_EVENT_BOUNDARY_TIMER, BoundaryEventJsonConverter.class);
convertersToBpmnMap.put(STENCIL_EVENT_BOUNDARY_ERROR, BoundaryEventJsonConverter.class);
convertersToBpmnMap.put(STENCIL_EVENT_BOUNDARY_SIGNAL, BoundaryEventJsonConverter.class);
convertersToBpmnMap.put(STENCIL_EVENT_BOUNDARY_MESSAGE, BoundaryEventJsonConverter.class);
}
public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {
......@@ -61,6 +63,8 @@ public class BoundaryEventJsonConverter extends BaseBpmnJsonConverter {
return STENCIL_EVENT_BOUNDARY_ERROR;
} else if (eventDefinition instanceof SignalEventDefinition) {
return STENCIL_EVENT_BOUNDARY_SIGNAL;
} else if (eventDefinition instanceof MessageEventDefinition) {
return STENCIL_EVENT_BOUNDARY_MESSAGE;
} else {
return STENCIL_EVENT_BOUNDARY_TIMER;
}
......@@ -77,26 +81,27 @@ public class BoundaryEventJsonConverter extends BaseBpmnJsonConverter {
dockersArrayNode.add(dockNode);
flowElementNode.put("dockers", dockersArrayNode);
if (boundaryEvent.isCancelActivity() == false) {
propertiesNode.put(PROPERTY_CANCEL_ACTIVITY, PROPERTY_VALUE_NO);
}
propertiesNode.put(PROPERTY_CANCEL_ACTIVITY, boundaryEvent.isCancelActivity() ? PROPERTY_VALUE_YES : PROPERTY_VALUE_NO);
addEventProperties(boundaryEvent, propertiesNode);
}
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {
BoundaryEvent boundaryEvent = new BoundaryEvent();
boundaryEvent.setAttachedToRefId(lookForAttachedRef(elementNode.get(EDITOR_SHAPE_ID).asText(), modelNode.get(EDITOR_CHILD_SHAPES)));
boundaryEvent.setCancelActivity(getPropertyValueAsBoolean(PROPERTY_CANCEL_ACTIVITY, elementNode, true));
String stencilId = BpmnJsonConverterUtil.getStencilId(elementNode);
if (STENCIL_EVENT_BOUNDARY_TIMER.equals(stencilId)) {
boundaryEvent.setCancelActivity(getPropertyValueAsBoolean(PROPERTY_CANCEL_ACTIVITY, elementNode));
convertJsonToTimerDefinition(elementNode, boundaryEvent);
} else if (STENCIL_EVENT_BOUNDARY_ERROR.equals(stencilId)) {
boundaryEvent.setCancelActivity(true); //always true
convertJsonToErrorDefinition(elementNode, boundaryEvent);
} else if (STENCIL_EVENT_BOUNDARY_SIGNAL.equals(stencilId)) {
boundaryEvent.setCancelActivity(getPropertyValueAsBoolean(PROPERTY_CANCEL_ACTIVITY, elementNode));
convertJsonToSignalDefinition(elementNode, boundaryEvent);
} else if (STENCIL_EVENT_BOUNDARY_MESSAGE.equals(stencilId)) {
convertJsonToMessageDefinition(elementNode, boundaryEvent);
}
boundaryEvent.setAttachedToRefId(lookForAttachedRef(elementNode.get(EDITOR_SHAPE_ID).asText(), modelNode.get(EDITOR_CHILD_SHAPES)));
return boundaryEvent;
}
......
......@@ -117,6 +117,7 @@ public class BpmnJsonConverter implements EditorJsonConstants, StencilConstants,
DI_CIRCLES.add(STENCIL_EVENT_BOUNDARY_ERROR);
DI_CIRCLES.add(STENCIL_EVENT_BOUNDARY_SIGNAL);
DI_CIRCLES.add(STENCIL_EVENT_BOUNDARY_TIMER);
DI_CIRCLES.add(STENCIL_EVENT_BOUNDARY_MESSAGE);
DI_CIRCLES.add(STENCIL_EVENT_CATCH_MESSAGE);
DI_CIRCLES.add(STENCIL_EVENT_CATCH_SIGNAL);
......@@ -289,10 +290,7 @@ public class BpmnJsonConverter implements EditorJsonConstants, StencilConstants,
pool.setId(BpmnJsonConverterUtil.getElementId(shapeNode));
pool.setName(JsonConverterUtil.getPropertyValueAsString(PROPERTY_NAME, shapeNode));
pool.setProcessRef(JsonConverterUtil.getPropertyValueAsString(PROPERTY_PROCESS_ID, shapeNode));
JsonNode processExecutableNode = JsonConverterUtil.getProperty(PROPERTY_PROCESS_EXECUTABLE, shapeNode);
if (processExecutableNode != null && StringUtils.isNotEmpty(processExecutableNode.asText())) {
pool.setExecutable(JsonConverterUtil.getPropertyValueAsBoolean(PROPERTY_PROCESS_EXECUTABLE, shapeNode));
}
pool.setExecutable(JsonConverterUtil.getPropertyValueAsBoolean(PROPERTY_PROCESS_EXECUTABLE, shapeNode, true));
bpmnModel.getPools().add(pool);
Process process = new Process();
......
......@@ -19,11 +19,19 @@ public class JsonConverterUtil implements EditorJsonConstants, StencilConstants
}
public static boolean getPropertyValueAsBoolean(String name, JsonNode objectNode) {
boolean result = false;
return getPropertyValueAsBoolean(name, objectNode, false);
}
public static boolean getPropertyValueAsBoolean(String name, JsonNode objectNode, boolean defaultValue) {
boolean result = defaultValue;
String stringValue = getPropertyValueAsString(name, objectNode);
if (PROPERTY_VALUE_YES.equalsIgnoreCase(stringValue)) {
result = true;
} else if (PROPERTY_VALUE_NO.equalsIgnoreCase(stringValue)) {
result = false;
}
return result;
}
......
package org.activiti.editor.language;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import java.io.InputStream;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.Event;
import org.activiti.bpmn.model.EventDefinition;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
......@@ -24,5 +31,13 @@ public abstract class AbstractConverterTest {
return bpmnModel;
}
protected EventDefinition extractEventDefinition(FlowElement flowElement) {
assertNotNull(flowElement);
assertTrue(flowElement instanceof Event);
Event event = (Event)flowElement;
assertFalse(event.getEventDefinitions().isEmpty());
return event.getEventDefinitions().get(0);
}
protected abstract String getResource();
}
package org.activiti.editor.language;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BoundaryEvent;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.ErrorEventDefinition;
import org.activiti.bpmn.model.MessageEventDefinition;
import org.activiti.bpmn.model.SignalEventDefinition;
import org.activiti.bpmn.model.TimerEventDefinition;
import org.junit.Test;
......@@ -22,7 +25,6 @@ public class BoundaryEventConverterTest extends AbstractConverterTest {
public void doubleConversionValidation() throws Exception {
BpmnModel bpmnModel = readJsonFile();
bpmnModel = convertToJsonAndBack(bpmnModel);
System.out.println("xml " + new String(new BpmnXMLConverter().convertToXML(bpmnModel), "utf-8"));
validateModel(bpmnModel);
}
......@@ -33,24 +35,26 @@ public class BoundaryEventConverterTest extends AbstractConverterTest {
private void validateModel(BpmnModel model) {
FlowElement errorElement = model.getMainProcess().getFlowElement("errorEvent");
assertTrue(errorElement instanceof BoundaryEvent);
BoundaryEvent errorElement = (BoundaryEvent)model.getMainProcess().getFlowElement("errorEvent");
ErrorEventDefinition errorEvent = (ErrorEventDefinition)extractEventDefinition(errorElement);
assertTrue(errorElement.isCancelActivity()); //always true
assertEquals("errorRef", errorEvent.getErrorCode());
FlowElement signalElement = model.getMainProcess().getFlowElement("signalEvent");
assertTrue(signalElement instanceof BoundaryEvent);
BoundaryEvent signalElement = (BoundaryEvent)model.getMainProcess().getFlowElement("signalEvent");
SignalEventDefinition signalEvent = (SignalEventDefinition)extractEventDefinition(signalElement);
assertFalse(signalElement.isCancelActivity());
assertEquals("signalRef", signalEvent.getSignalRef());
FlowElement timerElement = model.getMainProcess().getFlowElement("timerEvent");
assertTrue(timerElement instanceof BoundaryEvent);
BoundaryEvent messageElement = (BoundaryEvent)model.getMainProcess().getFlowElement("messageEvent");
MessageEventDefinition messageEvent = (MessageEventDefinition)extractEventDefinition(messageElement);
assertFalse(messageElement.isCancelActivity());
assertEquals("messageRef", messageEvent.getMessageRef());
BoundaryEvent errorEvent = (BoundaryEvent) errorElement;
assertTrue(errorEvent.isCancelActivity()); //always true
BoundaryEvent timerElement = (BoundaryEvent)model.getMainProcess().getFlowElement("timerEvent");
TimerEventDefinition timerEvent = (TimerEventDefinition)extractEventDefinition(timerElement);
assertFalse(timerElement.isCancelActivity());
assertEquals("PT5M", timerEvent.getTimeDuration());
BoundaryEvent signalEvent = (BoundaryEvent) signalElement;
assertFalse(signalEvent.isCancelActivity());
BoundaryEvent timerEvent = (BoundaryEvent) timerElement;
assertFalse(timerEvent.isCancelActivity());
}
}
package org.activiti.editor.language;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.EventDefinition;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.IntermediateCatchEvent;
import org.activiti.bpmn.model.MessageEventDefinition;
import org.activiti.bpmn.model.SignalEventDefinition;
import org.activiti.bpmn.model.TimerEventDefinition;
......@@ -55,10 +53,4 @@ public class CatchEventConverterTest extends AbstractConverterTest {
}
private EventDefinition extractEventDefinition(FlowElement messageElement) {
assertNotNull(messageElement);
assertTrue(messageElement instanceof IntermediateCatchEvent);
IntermediateCatchEvent messageEvent = (IntermediateCatchEvent)messageElement;
return messageEvent.getEventDefinitions().get(0);
}
}
......@@ -1409,6 +1409,17 @@
"propertyPackages" : [ "elementbase", "baseattributes", "cancelactivityattribute", "signalrefdefinition" ],
"roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]
}, {
"type" : "node",
"id" : "BoundaryMessageEvent",
"title" : "Boundary message event",
"description" : "A boundary event with a message trigger",
"view" : "intermediateevent/message.catching.svg",
"icon" : "catching/message.png",
"groups" : [ "Boundary Events" ],
"propertyPackages" : [ "elementbase", "baseattributes", "cancelactivityattribute", "messagerefdefinition" ],
"roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]
},
{
"type" : "node",
"id" : "CatchTimerEvent",
"title" : "Intermediate timer catching event",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册