コード例 #1
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test @BpmnModelResource public void shouldFindReferenceWithNamespace()
        public virtual void shouldFindReferenceWithNamespace()
        {
            MessageEventDefinition messageEventDefinition = bpmnModelInstance.getModelElementById("message-event-definition");
            Message message = bpmnModelInstance.getModelElementById("message-id");

            assertThat(messageEventDefinition.Message).NotNull;
            assertThat(messageEventDefinition.Message).isEqualTo(message);
            message.Id = "changed-message";
            assertThat(messageEventDefinition.Message).NotNull;
            assertThat(messageEventDefinition.Message).isEqualTo(message);
            message.setAttributeValue("id", "again-changed-message", true);
            assertThat(messageEventDefinition.Message).NotNull;
            assertThat(messageEventDefinition.Message).isEqualTo(message);

            StartEvent startEvent = bpmnModelInstance.getModelElementById("start-event");
            ICollection <EventDefinition> eventDefinitionRefs = startEvent.EventDefinitionRefs;

            assertThat(eventDefinitionRefs).NotEmpty;
            assertThat(eventDefinitionRefs).contains(messageEventDefinition);
            messageEventDefinition.Id = "changed-message-event";
            assertThat(eventDefinitionRefs).NotEmpty;
            assertThat(eventDefinitionRefs).contains(messageEventDefinition);
            messageEventDefinition.setAttributeValue("id", "again-changed-message-event", true);
            assertThat(eventDefinitionRefs).NotEmpty;
            assertThat(eventDefinitionRefs).contains(messageEventDefinition);

            message.removeAttribute("id");
            assertThat(messageEventDefinition.Message).Null;
            messageEventDefinition.removeAttribute("id");
            assertThat(eventDefinitionRefs).doesNotContain(messageEventDefinition);
            assertThat(eventDefinitionRefs).Empty;
        }
コード例 #2
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Before public void createModel()
        public virtual void createModel()
        {
            testBpmnModelInstance = Bpmn.createEmptyModel();
            Definitions definitions = testBpmnModelInstance.newInstance(typeof(Definitions));

            testBpmnModelInstance.Definitions = definitions;

            message    = testBpmnModelInstance.newInstance(typeof(Message));
            message.Id = "message-id";
            definitions.RootElements.Add(message);

            Process process = testBpmnModelInstance.newInstance(typeof(Process));

            process.Id = "process-id";
            definitions.RootElements.Add(process);

            startEvent    = testBpmnModelInstance.newInstance(typeof(StartEvent));
            startEvent.Id = "start-event-id";
            process.FlowElements.Add(startEvent);

            messageEventDefinition         = testBpmnModelInstance.newInstance(typeof(MessageEventDefinition));
            messageEventDefinition.Id      = "msg-def-id";
            messageEventDefinition.Message = message;
            startEvent.EventDefinitions.Add(messageEventDefinition);

            startEvent.EventDefinitionRefs.Add(messageEventDefinition);
        }
コード例 #3
0
        public virtual void testRetryOnServiceTaskLikeMessageThrowEvent()
        {
            // given
            BpmnModelInstance bpmnModelInstance = Bpmn.createExecutableProcess("process").startEvent().intermediateThrowEvent().camundaAsyncBefore().camundaFailedJobRetryTimeCycle("R10/PT5S").messageEventDefinition("messageDefinition").message("message").messageEventDefinitionDone().endEvent().done();

            MessageEventDefinition messageDefinition = bpmnModelInstance.getModelElementById("messageDefinition");

//JAVA TO C# CONVERTER WARNING: The .NET Type.FullName property will not always yield results identical to the Java Class.getName method:
            messageDefinition.CamundaClass = typeof(FailingDelegate).FullName;

            deployment(bpmnModelInstance);

            runtimeService.startProcessInstanceByKey("process");

            Job job = managementService.createJobQuery().singleResult();

            // when job fails
            try
            {
                managementService.executeJob(job.Id);
            }
            catch (Exception)
            {
                // ignore
            }

            // then
            job = managementService.createJobQuery().singleResult();
            Assert.assertEquals(9, job.Retries);
        }
コード例 #4
0
        protected internal virtual MessageEventDefinition createMessageEventDefinition(string messageName)
        {
            Message message = findMessageForName(messageName);
            MessageEventDefinition messageEventDefinition = createInstance(typeof(MessageEventDefinition));

            messageEventDefinition.Message = message;
            return(messageEventDefinition);
        }
コード例 #5
0
        /// <summary>
        /// Sets an event definition for the given message name. If already a message
        /// with this name exists it will be used, otherwise a new message is created.
        /// </summary>
        /// <param name="messageName"> the name of the message </param>
        /// <returns> the builder object </returns>
        public virtual B message(string messageName)
        {
            MessageEventDefinition messageEventDefinition = createMessageEventDefinition(messageName);

            element.EventDefinitions.add(messageEventDefinition);

            return(myself);
        }
コード例 #6
0
        public override BaseElement Clone()
        {
            MessageEventDefinition clone = new MessageEventDefinition
            {
                Values = this
            };

            return(clone);
        }
コード例 #7
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void getEventDefinition()
        public virtual void getEventDefinition()
        {
            MessageEventDefinition eventDefinition = eventDefinitionQuery.filterByType(typeof(MessageEventDefinition)).singleResult();

            assertThat(eventDefinition).NotNull;
            assertThat(eventDefinition.Message.Id).isEqualTo("message");
            assertThat(eventDefinition.Operation).Null;
            assertThat(eventDefinition.CamundaTaskPriority).isEqualTo("5");
        }
コード例 #8
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldAddParentChildElementInCorrectOrder()
        public virtual void shouldAddParentChildElementInCorrectOrder()
        {
            // create empty model
            BpmnModelInstance bpmnModelInstance = Bpmn.createEmptyModel();

            // add definitions to model
            Definitions definitions = bpmnModelInstance.newInstance(typeof(Definitions));

            definitions.TargetNamespace   = "Examples";
            bpmnModelInstance.Definitions = definitions;

            // add process
            Process process = bpmnModelInstance.newInstance(typeof(Process));

            process.Id = "messageEventDefinition";
            definitions.RootElements.Add(process);

            // add start event
            StartEvent startEvent = bpmnModelInstance.newInstance(typeof(StartEvent));

            startEvent.Id = "theStart";
            process.FlowElements.Add(startEvent);

            // create and add message
            Message message = bpmnModelInstance.newInstance(typeof(Message));

            message.Id = "start-message-id";
            definitions.RootElements.Add(message);

            // add message event definition to start event
            MessageEventDefinition startEventMessageEventDefinition = bpmnModelInstance.newInstance(typeof(MessageEventDefinition));

            startEventMessageEventDefinition.Message = message;
            startEvent.EventDefinitions.Add(startEventMessageEventDefinition);

            // add property after message event definition
            Property property = bpmnModelInstance.newInstance(typeof(Property));

            startEvent.Properties.Add(property);

            // finally add an extensions element
            ExtensionElements extensionElements = bpmnModelInstance.newInstance(typeof(ExtensionElements));

            process.ExtensionElements = extensionElements;

            // validate model
            try
            {
                Bpmn.validateModel(bpmnModelInstance);
            }
            catch (ModelValidationException)
            {
                Assert.fail();
            }
        }
コード例 #9
0
        public override object Clone()
        {
            var result = new MessageEventDefinition
            {
                MessageRef   = MessageRef,
                OperationRef = OperationRef
            };

            FeedElt(result);
            return(result);
        }
コード例 #10
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void testShouldReplaceMessageEventDefinitionRefIfMessageEventDefinitionIsReplaced()
        public virtual void testShouldReplaceMessageEventDefinitionRefIfMessageEventDefinitionIsReplaced()
        {
            MessageEventDefinition otherMessageEventDefinition = testBpmnModelInstance.newInstance(typeof(MessageEventDefinition));

            otherMessageEventDefinition.Id = "other-message-event-definition-id";
            ICollection <EventDefinition> eventDefinitionRefs = startEvent.EventDefinitionRefs;

            assertThat(eventDefinitionRefs).contains(messageEventDefinition);
            messageEventDefinition.replaceWithElement(otherMessageEventDefinition);
            assertThat(eventDefinitionRefs).doesNotContain(messageEventDefinition);
            assertThat(eventDefinitionRefs).contains(otherMessageEventDefinition);
        }
コード例 #11
0
        /// <summary>
        /// Creates an empty message event definition with the given id
        /// and returns a builder for the message event definition.
        /// </summary>
        /// <param name="id"> the id of the message event definition </param>
        /// <returns> the message event definition builder object </returns>
        public virtual MessageEventDefinitionBuilder messageEventDefinition(string id)
        {
            MessageEventDefinition messageEventDefinition = createEmptyMessageEventDefinition();

            if (!string.ReferenceEquals(id, null))
            {
                messageEventDefinition.Id = id;
            }

            element.EventDefinitions.add(messageEventDefinition);
            return(new MessageEventDefinitionBuilder(modelInstance, messageEventDefinition));
        }
コード例 #12
0
        private void addMessageEventDefinition(CatchEvent catchEvent)
        {
            BpmnModelInstance modelInstance = (BpmnModelInstance)catchEvent.ModelInstance;
            Message           message       = modelInstance.newInstance(typeof(Message));

            message.Id   = MESSAGE_ID;
            message.Name = MESSAGE_NAME;
            modelInstance.Definitions.addChildElement(message);
            MessageEventDefinition messageEventDefinition = modelInstance.newInstance(typeof(MessageEventDefinition));

            messageEventDefinition.Message = message;
            catchEvent.EventDefinitions.add(messageEventDefinition);
        }
        public IntermediateThrowMessageEventActivityBehavior(MessageEventDefinition messageEventDefinition, Message message)
        {
            if (message != null)
            {
                messageEventName = message.Name;
            }
            else if (!string.IsNullOrWhiteSpace(messageEventDefinition.MessageRef))
            {
                messageEventName = messageEventDefinition.MessageRef;
            }
            else
            {
                messageExpression = messageEventDefinition.MessageExpression;
            }

            this.messageEventDefinition = messageEventDefinition;
        }
コード例 #14
0
        public override void ParseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model)
        {
            if (!(parentElement is Event))
            {
                return;
            }

            MessageEventDefinition eventDefinition = new MessageEventDefinition();

            BpmnXMLUtil.AddXMLLocation(eventDefinition, xtr);
            eventDefinition.MessageRef        = xtr.GetAttributeValue(BpmnXMLConstants.ATTRIBUTE_MESSAGE_REF);
            eventDefinition.MessageExpression = xtr.GetAttributeValue(BpmnXMLConstants.ACTIVITI_EXTENSIONS_NAMESPACE, BpmnXMLConstants.ATTRIBUTE_MESSAGE_EXPRESSION);

            if (!string.IsNullOrWhiteSpace(eventDefinition.MessageRef))
            {
                int indexOfP = eventDefinition.MessageRef.IndexOf(':');
                if (indexOfP != -1)
                {
                    string prefix            = eventDefinition.MessageRef.Substring(0, indexOfP);
                    string resolvedNamespace = model.GetNamespace(prefix);
                    string messageRef        = eventDefinition.MessageRef.Substring(indexOfP + 1);

                    if (resolvedNamespace is null)
                    {
                        // if it's an invalid prefix will consider this is not a namespace prefix so will be used as part of the stringReference
                        messageRef = prefix + ":" + messageRef;
                    }
                    else if (!resolvedNamespace.Equals(model.TargetNamespace, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // if it's a valid namespace prefix but it's not the targetNamespace then we'll use it as a valid namespace
                        // (even out editor does not support defining namespaces it is still a valid xml file)
                        messageRef = resolvedNamespace + ":" + messageRef;
                    }
                    eventDefinition.MessageRef = messageRef;
                }
                else
                {
                    eventDefinition.MessageRef = eventDefinition.MessageRef;
                }
            }

            BpmnXMLUtil.ParseChildElements(BpmnXMLConstants.ELEMENT_EVENT_MESSAGEDEFINITION, eventDefinition, xtr, model);

            ((Event)parentElement).EventDefinitions.Add(eventDefinition);
        }
コード例 #15
0
        protected internal virtual void HandleMessageEventDefinition(BpmnModel bpmnModel, Process process, Event @event, EventDefinition eventDefinition, IList <ValidationError> errors)
        {
            MessageEventDefinition messageEventDefinition = (MessageEventDefinition)eventDefinition;

            if (string.IsNullOrWhiteSpace(messageEventDefinition.MessageRef))
            {
                if (string.IsNullOrWhiteSpace(messageEventDefinition.MessageExpression))
                {
                    // message ref should be filled in
                    AddError(errors, ProblemsConstants.MESSAGE_EVENT_MISSING_MESSAGE_REF, process, @event, ProcessValidatorResource.MESSAGE_EVENT_MISSING_MESSAGE_REF);
                }
            }
            else if (!bpmnModel.ContainsMessageId(messageEventDefinition.MessageRef))
            {
                // message ref should exist
                AddError(errors, ProblemsConstants.MESSAGE_EVENT_INVALID_MESSAGE_REF, process, @event, ProcessValidatorResource.MESSAGE_EVENT_INVALID_MESSAGE_REF);
            }
        }
コード例 #16
0
        public virtual IProcessInstance CreateAndStartProcessInstanceByMessage(IProcessDefinition processDefinition, string messageName, IDictionary <string, object> variables, IDictionary <string, object> transientVariables)
        {
            _ = Context.CommandContext;
            // Do not start process a process instance if the process definition is suspended
            if (ProcessDefinitionUtil.IsProcessDefinitionSuspended(processDefinition.Id))
            {
                throw new ActivitiException("Cannot start process instance. Process definition " + processDefinition.Name + " (id = " + processDefinition.Id + ") is suspended");
            }

            // Get model from cache
            Process process = ProcessDefinitionUtil.GetProcess(processDefinition.Id);

            if (process == null)
            {
                throw new ActivitiException("Cannot start process instance. Process model " + processDefinition.Name + " (id = " + processDefinition.Id + ") could not be found");
            }

            FlowElement initialFlowElement = null;

            foreach (FlowElement flowElement in process.FlowElements)
            {
                if (flowElement is StartEvent startEvent)
                {
                    if (CollectionUtil.IsNotEmpty(startEvent.EventDefinitions) && startEvent.EventDefinitions[0] is MessageEventDefinition)
                    {
                        MessageEventDefinition messageEventDefinition = (MessageEventDefinition)startEvent.EventDefinitions[0];
                        if (messageEventDefinition.MessageRef.Equals(messageName))
                        {
                            initialFlowElement = flowElement;
                            break;
                        }
                    }
                }
            }
            if (initialFlowElement == null)
            {
                throw new ActivitiException("No message start event found for process definition " + processDefinition.Id + " and message name " + messageName);
            }

            return(CreateAndStartProcessInstanceWithInitialFlowElement(processDefinition, null, null, initialFlowElement, process, variables, transientVariables, true));
        }
コード例 #17
0
        protected internal virtual void InsertMessageEvent(MessageEventDefinition messageEventDefinition, StartEvent startEvent, IProcessDefinitionEntity processDefinition, BpmnModel bpmnModel)
        {
            ICommandContext commandContext = Context.CommandContext;

            if (bpmnModel.ContainsMessageId(messageEventDefinition.MessageRef))
            {
                Message message = bpmnModel.GetMessage(messageEventDefinition.MessageRef);
                messageEventDefinition.MessageRef = message.Name;
            }

            // look for subscriptions for the same name in db:
            IList <IEventSubscriptionEntity> subscriptionsForSameMessageName = commandContext.EventSubscriptionEntityManager.FindEventSubscriptionsByName(MessageEventHandler.EVENT_HANDLER_TYPE, messageEventDefinition.MessageRef, processDefinition.TenantId);

            foreach (IEventSubscriptionEntity eventSubscriptionEntity in subscriptionsForSameMessageName)
            {
                // throw exception only if there's already a subscription as start event
                if (eventSubscriptionEntity.ProcessInstanceId is null || eventSubscriptionEntity.ProcessInstanceId.Length == 0)
                {
                    // processInstanceId != null or not empty -> it's a message related to an execution
                    // the event subscription has no instance-id, so it's a message start event
                    throw new ActivitiException("Cannot deploy process definition '" + processDefinition.ResourceName + "': there already is a message event subscription for the message with name '" + messageEventDefinition.MessageRef + "'.");
                }
            }

            IMessageEventSubscriptionEntity newSubscription = commandContext.EventSubscriptionEntityManager.CreateMessageEventSubscription();

            newSubscription.EventName           = messageEventDefinition.MessageRef;
            newSubscription.ActivityId          = startEvent.Id;
            newSubscription.Configuration       = processDefinition.Id;
            newSubscription.ProcessDefinitionId = processDefinition.Id;

            if (processDefinition.TenantId is object)
            {
                newSubscription.TenantId = processDefinition.TenantId;
            }

            commandContext.EventSubscriptionEntityManager.Insert(newSubscription);
        }
コード例 #18
0
        protected internal virtual void restoreMessageStartEvent(IProcessDefinition previousProcessDefinition, BpmnModel bpmnModel, StartEvent startEvent, EventDefinition eventDefinition)
        {
            MessageEventDefinition messageEventDefinition = (MessageEventDefinition)eventDefinition;

            if (bpmnModel.ContainsMessageId(messageEventDefinition.MessageRef))
            {
                Message message = bpmnModel.GetMessage(messageEventDefinition.MessageRef);
                messageEventDefinition.MessageRef = message.Name;
            }

            IMessageEventSubscriptionEntity newSubscription = EventSubscriptionEntityManager.CreateMessageEventSubscription();

            newSubscription.EventName           = messageEventDefinition.MessageRef;
            newSubscription.ActivityId          = startEvent.Id;
            newSubscription.Configuration       = previousProcessDefinition.Id;
            newSubscription.ProcessDefinitionId = previousProcessDefinition.Id;

            if (!ReferenceEquals(previousProcessDefinition.TenantId, null))
            {
                newSubscription.TenantId = previousProcessDefinition.TenantId;
            }

            EventSubscriptionEntityManager.Insert(newSubscription);
        }
コード例 #19
0
        protected internal virtual void WriteMessageDefinition(Event parentEvent, MessageEventDefinition messageDefinition, BpmnModel model, XMLStreamWriter xtw)
        {
            xtw.WriteStartElement(BpmnXMLConstants.BPMN_PREFIX, BpmnXMLConstants.ELEMENT_EVENT_MESSAGEDEFINITION, BpmnXMLConstants.BPMN2_NAMESPACE);

            string messageRef = messageDefinition.MessageRef;

            if (!string.IsNullOrWhiteSpace(messageRef))
            {
                // remove the namespace from the message id if set
                if (messageRef.StartsWith(model.TargetNamespace, StringComparison.Ordinal))
                {
                    messageRef = messageRef.Replace(model.TargetNamespace, "");
                    messageRef = messageRef.ReplaceFirst(":", "");
                }
                else
                {
                    foreach (string prefix in model.Namespaces.Keys)
                    {
                        string @namespace = model.GetNamespace(prefix);
                        if (messageRef.StartsWith(@namespace, StringComparison.Ordinal))
                        {
                            messageRef = messageRef.Replace(model.TargetNamespace, "");
                            messageRef = prefix + messageRef;
                        }
                    }
                }
            }
            WriteDefaultAttribute(BpmnXMLConstants.ATTRIBUTE_MESSAGE_REF, messageRef, xtw);
            bool didWriteExtensionStartElement = BpmnXMLUtil.WriteExtensionElements(messageDefinition, false, xtw);

            if (didWriteExtensionStartElement)
            {
                xtw.WriteEndElement();
            }
            xtw.WriteEndElement();
        }
コード例 #20
0
 public virtual EventSubProcessMessageStartEventActivityBehavior CreateEventSubProcessMessageStartEventActivityBehavior(StartEvent startEvent, MessageEventDefinition messageEventDefinition)
 {
     return(new EventSubProcessMessageStartEventActivityBehavior(messageEventDefinition));
 }
 public EventSubProcessMessageStartEventActivityBehavior(MessageEventDefinition messageEventDefinition)
 {
     this.messageEventDefinition = messageEventDefinition;
 }
コード例 #22
0
        public override object Create(object parent, IParseContext context, XElement element)
        {
            EventDefinition eventDefinition = null;
            var             localName       = Helper.GetRealLocalName(element);

            switch (localName)
            {
            case "cancelEventDefinition":
                eventDefinition = new CancelEventDefinition();
                break;

            case "errorEventDefinition":
                var errorEventDefinition = new ErrorEventDefinition();
                eventDefinition = errorEventDefinition;
                var errorRef = element.GetAttribute("errorRef");
                if (errorRef != null)
                {
                    context.AddReferenceRequest <Error>(errorRef, x => errorEventDefinition.ErrorRef = x);
                }
                break;

            case "timerEventDefinition":
                eventDefinition = new TimerEventDefinition();
                break;

            case "terminateEventDefinition":
                eventDefinition = new TerminateEventDefinition();
                break;

            case "messageEventDefinition":
                var messageEventDefinition = new MessageEventDefinition();
                eventDefinition = messageEventDefinition;

                var operationRef = element.GetAttribute("operationRef");
                if (operationRef != null)
                {
                    context.AddReferenceRequest <Operation>(operationRef, x => messageEventDefinition.OperationRef = x);
                }

                var messageRef = element.GetAttribute("messageRef");
                if (messageRef != null)
                {
                    context.AddReferenceRequest <Message>(messageRef, x => messageEventDefinition.MessageRef = x);
                }
                break;

            case "conditionalEventDefinition":
                eventDefinition = new ConditionalEventDefinition();
                break;

            case "compensateEventDefinition":
                var compensateEventDefinition = new CompensateEventDefinition();
                eventDefinition = compensateEventDefinition;

                compensateEventDefinition.WaitForCompletion = element.GetBoolean("waitForCompletion");
                var activityRef = element.GetAttribute("activityRef");
                if (activityRef != null)
                {
                    context.AddReferenceRequest <Activity>(activityRef, x => compensateEventDefinition.ActivityRef = x);
                }
                break;

            case "signalEventDefinition":
                var signalEventDefinition = new SignalEventDefinition();
                eventDefinition = signalEventDefinition;

                var signalRef = element.GetAttribute("signalRef");
                if (signalRef != null)
                {
                    context.AddReferenceRequest <Signal>(signalRef, x => signalEventDefinition.SignalRef = x);
                }
                break;

            case "escalationEventDefinition":
                eventDefinition = new EscalationEventDefinition()
                {
                    EscalationRef = element.GetAttribute("escalationRef")
                };
                break;

            case "linkEventDefinition":
                eventDefinition = new LinkEventDefinition()
                {
                    Name   = element.GetAttribute("name"),
                    Target = element.GetAttribute("target")
                };
                break;
            }

            if (this.callback != null)
            {
                this.callback(parent, context, element, eventDefinition);
            }

            base.Init(eventDefinition, context, element);

            context.Push(eventDefinition);

            return(eventDefinition);
        }
コード例 #23
0
 public AbstractMessageEventDefinitionBuilder(BpmnModelInstance modelInstance, MessageEventDefinition element, Type selfType) : base(modelInstance, element, selfType)
 {
 }
コード例 #24
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldAddMessageAndMessageEventDefinition()
        public virtual void shouldAddMessageAndMessageEventDefinition()
        {
            // create empty model
            BpmnModelInstance bpmnModelInstance = Bpmn.createEmptyModel();

            // add definitions to model
            Definitions definitions = bpmnModelInstance.newInstance(typeof(Definitions));

            definitions.TargetNamespace   = "Examples";
            bpmnModelInstance.Definitions = definitions;

            // create and add message
            Message message = bpmnModelInstance.newInstance(typeof(Message));

            message.Id = "start-message-id";
            definitions.RootElements.Add(message);

            // create and add message event definition
            MessageEventDefinition messageEventDefinition = bpmnModelInstance.newInstance(typeof(MessageEventDefinition));

            messageEventDefinition.Id      = "message-event-def-id";
            messageEventDefinition.Message = message;
            definitions.RootElements.Add(messageEventDefinition);

            // test if message was set correctly
            Message setMessage = messageEventDefinition.Message;

            assertThat(setMessage).isEqualTo(message);

            // add process
            Process process = bpmnModelInstance.newInstance(typeof(Process));

            process.Id = "messageEventDefinition";
            definitions.RootElements.Add(process);

            // add start event
            StartEvent startEvent = bpmnModelInstance.newInstance(typeof(StartEvent));

            startEvent.Id = "theStart";
            process.FlowElements.Add(startEvent);

            // create and add message event definition to start event
            MessageEventDefinition startEventMessageEventDefinition = bpmnModelInstance.newInstance(typeof(MessageEventDefinition));

            startEventMessageEventDefinition.Message = message;
            startEvent.EventDefinitions.Add(startEventMessageEventDefinition);

            // create another message but do not add it
            Message anotherMessage = bpmnModelInstance.newInstance(typeof(Message));

            anotherMessage.Id = "another-message-id";

            // create a message event definition and try to add last create message
            MessageEventDefinition anotherMessageEventDefinition = bpmnModelInstance.newInstance(typeof(MessageEventDefinition));

            try
            {
                anotherMessageEventDefinition.Message = anotherMessage;
                Assert.fail("Message should not be added to message event definition, cause it is not part of the model");
            }
            catch (Exception e)
            {
                assertThat(e).isInstanceOf(typeof(ModelReferenceException));
            }

            // first add message to model than to event definition
            definitions.RootElements.Add(anotherMessage);
            anotherMessageEventDefinition.Message = anotherMessage;
            startEvent.EventDefinitions.Add(anotherMessageEventDefinition);

            // message event definition and add message by id to it
            anotherMessageEventDefinition = bpmnModelInstance.newInstance(typeof(MessageEventDefinition));
            startEvent.EventDefinitions.Add(anotherMessageEventDefinition);

            // validate model
            try
            {
                Bpmn.validateModel(bpmnModelInstance);
            }
            catch (ModelValidationException)
            {
                Assert.fail();
            }
        }
コード例 #25
0
 public BoundaryMessageEventActivityBehavior(MessageEventDefinition messageEventDefinition, bool interrupting) : base(interrupting)
 {
     this.messageEventDefinition = messageEventDefinition;
 }
コード例 #26
0
        protected internal override void ExecuteValidation(BpmnModel bpmnModel, Process process, IList <ValidationError> errors)
        {
            IList <BoundaryEvent> boundaryEvents = process.FindFlowElementsOfType <BoundaryEvent>();

            // Only one boundary event of type 'cancel' can be attached to the same
            // element, so we store the count temporarily here
            Dictionary <string, int> cancelBoundaryEventsCounts = new Dictionary <string, int>();

            // Only one boundary event of type 'compensate' can be attached to the
            // same element, so we store the count temporarily here
            Dictionary <string, int> compensateBoundaryEventsCounts = new Dictionary <string, int>();

            for (int i = 0; i < boundaryEvents.Count; i++)
            {
                BoundaryEvent boundaryEvent = boundaryEvents[i];

                if (boundaryEvent.EventDefinitions != null && boundaryEvent.EventDefinitions.Count > 0)
                {
                    EventDefinition eventDefinition = boundaryEvent.EventDefinitions[0];
                    if (!(eventDefinition is TimerEventDefinition) && !(eventDefinition is ErrorEventDefinition) && !(eventDefinition is SignalEventDefinition) && !(eventDefinition is CancelEventDefinition) && !(eventDefinition is MessageEventDefinition) && !(eventDefinition is CompensateEventDefinition))
                    {
                        AddError(errors, ProblemsConstants.BOUNDARY_EVENT_INVALID_EVENT_DEFINITION, process, boundaryEvent, ProcessValidatorResource.BOUNDARY_EVENT_INVALID_EVENT_DEFINITION);
                    }

                    if (eventDefinition is CancelEventDefinition)
                    {
                        FlowElement attachedToFlowElement = bpmnModel.GetFlowElement(boundaryEvent.AttachedToRefId);
                        if (!(attachedToFlowElement is Transaction))
                        {
                            AddError(errors, ProblemsConstants.BOUNDARY_EVENT_CANCEL_ONLY_ON_TRANSACTION, process, boundaryEvent, ProcessValidatorResource.BOUNDARY_EVENT_CANCEL_ONLY_ON_TRANSACTION);
                        }
                        else
                        {
                            if (!cancelBoundaryEventsCounts.ContainsKey(attachedToFlowElement.Id))
                            {
                                cancelBoundaryEventsCounts[attachedToFlowElement.Id] = 0;
                            }
                            cancelBoundaryEventsCounts[attachedToFlowElement.Id] = cancelBoundaryEventsCounts[attachedToFlowElement.Id] + 1;
                        }
                    }
                    else if (eventDefinition is CompensateEventDefinition)
                    {
                        if (!compensateBoundaryEventsCounts.ContainsKey(boundaryEvent.AttachedToRefId))
                        {
                            compensateBoundaryEventsCounts[boundaryEvent.AttachedToRefId] = 0;
                        }
                        compensateBoundaryEventsCounts[boundaryEvent.AttachedToRefId] = compensateBoundaryEventsCounts[boundaryEvent.AttachedToRefId] + 1;
                    }
                    else if (eventDefinition is MessageEventDefinition)
                    {
                        // Check if other message boundary events with same message
                        // id
                        for (int j = 0; j < boundaryEvents.Count; j++)
                        {
                            if (j != i)
                            {
                                BoundaryEvent otherBoundaryEvent = boundaryEvents[j];
                                if (otherBoundaryEvent.AttachedToRefId is object && otherBoundaryEvent.AttachedToRefId.Equals(boundaryEvent.AttachedToRefId))
                                {
                                    if (otherBoundaryEvent.EventDefinitions != null && otherBoundaryEvent.EventDefinitions.Count > 0)
                                    {
                                        EventDefinition otherEventDefinition = otherBoundaryEvent.EventDefinitions[0];
                                        if (otherEventDefinition is MessageEventDefinition)
                                        {
                                            MessageEventDefinition currentMessageEventDefinition = (MessageEventDefinition)eventDefinition;
                                            MessageEventDefinition otherMessageEventDefinition   = (MessageEventDefinition)otherEventDefinition;
                                            if (otherMessageEventDefinition.MessageRef is object && otherMessageEventDefinition.MessageRef.Equals(currentMessageEventDefinition.MessageRef))
                                            {
                                                AddError(errors, ProblemsConstants.MESSAGE_EVENT_MULTIPLE_ON_BOUNDARY_SAME_MESSAGE_ID, process, boundaryEvent, ProcessValidatorResource.MESSAGE_EVENT_MULTIPLE_ON_BOUNDARY_SAME_MESSAGE_ID);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    AddError(errors, ProblemsConstants.BOUNDARY_EVENT_NO_EVENT_DEFINITION, process, boundaryEvent, "Event definition is missing from boundary event");
                }
            }

            foreach (string elementId in cancelBoundaryEventsCounts.Keys)
            {
                if (cancelBoundaryEventsCounts[elementId] > 1)
                {
                    AddError(errors, ProblemsConstants.BOUNDARY_EVENT_MULTIPLE_CANCEL_ON_TRANSACTION, process, bpmnModel.GetFlowElement(elementId), "multiple boundary events with cancelEventDefinition not supported on same transaction subprocess.");
                }
            }

            foreach (string elementId in compensateBoundaryEventsCounts.Keys)
            {
                if (compensateBoundaryEventsCounts[elementId] > 1)
                {
                    AddError(errors, ProblemsConstants.COMPENSATE_EVENT_MULTIPLE_ON_BOUNDARY, process, bpmnModel.GetFlowElement(elementId), "Multiple boundary events of type 'compensate' is invalid");
                }
            }
        }
コード例 #27
0
 public IntermediateCatchMessageEventActivityBehavior(MessageEventDefinition messageEventDefinition)
 {
     this.messageEventDefinition = messageEventDefinition;
 }
コード例 #28
0
 public virtual BoundaryMessageEventActivityBehavior CreateBoundaryMessageEventActivityBehavior(BoundaryEvent boundaryEvent, MessageEventDefinition messageEventDefinition, bool interrupting)
 {
     return(new BoundaryMessageEventActivityBehavior(messageEventDefinition, interrupting));
 }
コード例 #29
0
 public virtual IntermediateThrowMessageEventActivityBehavior CreateIntermediateThrowMessgeEventActivityBehavior(ThrowEvent throwEvent, MessageEventDefinition messageEventDefinition, Message message)
 {
     return(new IntermediateThrowMessageEventActivityBehavior(messageEventDefinition, message));
 }
コード例 #30
0
 public virtual IntermediateCatchMessageEventActivityBehavior CreateIntermediateCatchMessageEventActivityBehavior(IntermediateCatchEvent intermediateCatchEvent, MessageEventDefinition messageEventDefinition)
 {
     return(new IntermediateCatchMessageEventActivityBehavior(messageEventDefinition));
 }