コード例 #1
0
ファイル: StateMachine.cs プロジェクト: uniba-dsg/wf2owfn
        private SMTransition parseTransition(Queue<IXamlElement> token)
        {
            // Transition
            SMTransition transition = new SMTransition();
            // Trigger
            SMTrigger trigger;
            // Reference
            String reference;
            String refTrigger;
            String condition;
            // [Start] Transition
            IXamlElement element = token.Dequeue();
            bool attRef = element.Attributes.TryGetValue("To", out reference);
            bool attTrigger = element.Attributes.TryGetValue("Trigger", out refTrigger);
            bool attCondition = element.Attributes.TryGetValue("Condition", out condition);
            // To
            if (attRef)
            {
                transition.To = extractReference(reference);
            }
            // Trigger
            if (attTrigger)
            {
                String id = extractReference(refTrigger);

                if (triggers.ContainsKey(id))
                {
                    triggers[id].Transitions.Add(transition);
                }
                else
                {
                    // Warning
                    log.Warn("Warning Trigger created before IActivity was found!");
                    trigger = new SMTrigger();
                    trigger.Transitions.Add(transition);
                    triggers.Add(id, trigger);
                }
            }
            // Condition
            if (attCondition)
            {
                transition.Condition = true;
            }

            while (!token.Peek().QName.Equals(createQName("Transition")))
            {
                if (token.Peek().QName.Equals(createQName("Transition.Trigger")))
                {
                    // [Start] Transition.Trigger
                    token.Dequeue();
                    // Trigger Reference
                    String triggerRef;
                    if (token.Peek().Attributes.TryGetValue("x:Name", out triggerRef))
                    {
                        // Activity
                        IActivity activity = moduleFactory.CreateActivity(token.Peek().QName);
                        IActivity triggerActivity;

                        if (activity != null)
                        {
                            triggerActivity = activity.Parse(token);
                        }
                        else
                        {
                            throw new ParseException(String.Format("No Module found for activity '{0}'", QName), initialTokenCount - token.Count, QName);
                        }

                        if (triggers.ContainsKey(triggerRef))
                        {
                            log.Warn("Warning trigger existent!");
                            triggers[triggerRef].Trigger = triggerActivity;
                            triggers[triggerRef].Transitions.Add(transition);
                        }
                        else
                        {
                            trigger = new SMTrigger();
                            trigger.Trigger = triggerActivity;
                            trigger.Transitions.Add(transition);
                            triggers.Add(triggerRef, trigger);
                        }
                    }
                    else
                    {
                        // Activity
                        IActivity activity = moduleFactory.CreateActivity(token.Peek().QName);
                        IActivity triggerActivity;

                        if (activity != null)
                        {
                            triggerActivity = activity.Parse(token);
                        }
                        else
                        {
                            throw new ParseException(String.Format("No Module found for activity '{0}'", QName), initialTokenCount - token.Count, QName);
                        }
                        trigger = new SMTrigger();
                        trigger.Trigger = triggerActivity;
                        trigger.Transitions.Add(transition);
                        triggerKey++;
                        triggers.Add(triggerKey.ToString(), trigger);
                    }

                    // [End] Transition.Trigger
                    token.Dequeue();
                }
                else if (token.Peek().QName.Equals(createQName("Transition.Condition")))
                {
                    // [Start] Transition.Condition
                    token.Dequeue();
                    transition.Condition = true;
                    // [End] Transition.Condition
                    token.Dequeue();
                }
                else if (token.Peek().QName.Equals(createQName("Transition.Action")))
                {
                    // [Start] Transition.Action
                    token.Dequeue();
                    // Activity
                    IActivity activity = moduleFactory.CreateActivity(token.Peek().QName);
                    if (activity != null)
                    {
                        transition.Action = activity.Parse(token);
                    }
                    else
                    {
                        throw new ParseException(String.Format("No Module found for activity '{0}'", QName), initialTokenCount - token.Count, QName);
                    }
                    // [End] Transition.Action
                    token.Dequeue();
                }
                else if (token.Peek().QName.Equals(createQName("Transition.To")))
                {
                    // [Start] Transition.To
                    token.Dequeue();

                    if (token.Peek().QName.Equals(createQName("State")))
                    {
                        transition.To = token.Peek().Attributes["x:Name"];
                        // Recursion
                        parseState(token);
                    }
                    else if (token.Peek().QName.Equals(createQName("Reference", ns_x)))
                    {
                        // [Start] Reference
                        element = token.Dequeue();
                        reference = element.Attributes["Reference"];
                        transition.To = reference;
                        // [End] Reference
                        token.Dequeue();
                    }
                    else
                    {
                        throw new ParseException(String.Format("Unknown tag found in activity '{0}'", QName), initialTokenCount - token.Count, QName);
                    }
                    // [End] Transition.To
                    token.Dequeue();
                }
                else
                {
                    throw new ParseException(String.Format("Unknown tag found in activity '{0}'", QName), initialTokenCount - token.Count, QName);
                }
            }
            // [End] Transition
            token.Dequeue();

            return transition;
        }