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