Search code examples
javaactiviti

SignalExpression in Activiti 6.0 Intermediate Catching event


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.


Solution

  • 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);
                  }
    
                };
              }
    
            });