I am trying to create a process with the Intermediate Catching event with conditional expression. I can see that SignalEventDefinition
has a property called signalExpression
. But somehow I am not able to use it.
Here is the code from BaseBpmnXMLConverter.
protected void writeSignalDefinition(Event parentEvent, SignalEventDefinition signalDefinition, XMLStreamWriter xtw) throws Exception {
xtw.writeStartElement(ELEMENT_EVENT_SIGNALDEFINITION);
writeDefaultAttribute(ATTRIBUTE_SIGNAL_REF, signalDefinition.getSignalRef(), xtw);
if (parentEvent instanceof ThrowEvent && signalDefinition.isAsync()) {
BpmnXMLUtil.writeQualifiedAttribute(ATTRIBUTE_ACTIVITY_ASYNCHRONOUS, "true", xtw);
}
boolean didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(signalDefinition, false, xtw);
if (didWriteExtensionStartElement) {
xtw.writeEndElement();
}
xtw.writeEndElement();
}
I don't see how can we create signalExpression inside signalEventDefinition
.
I can even see the signalExpression is considered in IntermediateCatchSignalEventActivityBehavior
as well as in EventValidator
. So It looks like I don't know how to use signalExpression inside catching event. Can someone please help me find the right way.
I am using Activiti 6.0 and my own custom UI to create BPMN model which in turn calls activiti-bpmn-converter to generate the process definition XML.
This is how I was able to get it working
BpmnXMLConverter.addConverter(new CatchEventXMLConverter() {
@Override
protected void writeSignalDefinition(Event parentEvent,
SignalEventDefinition signalDefinition, XMLStreamWriter xtw) throws Exception {
xtw.writeStartElement(ELEMENT_EVENT_SIGNALDEFINITION);
writeDefaultAttribute("activiti:"+ATTRIBUTE_SIGNAL_EXPRESSION, signalDefinition.getSignalExpression(), xtw);
if (parentEvent instanceof ThrowEvent && signalDefinition.isAsync()) {
BpmnXMLUtil.writeQualifiedAttribute(ATTRIBUTE_ACTIVITY_ASYNCHRONOUS, "true", xtw);
}
boolean didWriteExtensionStartElement =
BpmnXMLUtil.writeExtensionElements(signalDefinition, false, xtw);
if (didWriteExtensionStartElement) {
xtw.writeEndElement();
}
xtw.writeEndElement();
}
});
((ProcessEngineConfigurationImpl) activitiRule.getProcessEngine()
.getProcessEngineConfiguration())
.setActivityBehaviorFactory(new DefaultActivityBehaviorFactory() {
@Override
public IntermediateCatchSignalEventActivityBehavior createIntermediateCatchSignalEventActivityBehavior(
IntermediateCatchEvent intermediateCatchEvent,
SignalEventDefinition signalEventDefinition, Signal signal) {
return new IntermediateCatchSignalEventActivityBehavior(signalEventDefinition,
signal) {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void execute(DelegateExecution execution) {
CommandContext commandContext = Context.getCommandContext();
ExecutionEntity executionEntity = (ExecutionEntity) execution;
String signalName = null;
Expression signalExpression =
commandContext.getProcessEngineConfiguration().getExpressionManager()
.createExpression(signalEventDefinition.getSignalExpression());
signalName = signalExpression.getValue(execution).toString();
commandContext.getEventSubscriptionEntityManager().insertSignalEvent(signalName,
signal, executionEntity);
}
};
}
});