/// <summary> /// Check that the attribute transition@nextState is a valid state. /// </summary> /// <param name="reader">The Xml reader.</param> /// <param name="model">The State Machine Model</param> private void ValidateTransitionNextState(XmlReader reader, StateMachineType model) { string nextStateName = reader.Value; ts.TraceEvent(TraceEventType.Verbose, 1, "ValidateTransitionNextState next state {0}", nextStateName); StateType nextState = model.GetStateType(nextStateName); if (nextState == null) { string error = "Next state " + nextStateName + " does not exist"; ReportError(reader, ERROR_NEXT_STATE_DOES_NOT_EXIST, error); } }
/// <summary> /// Validate the state element. This is a recursive function. /// </summary> /// <param name="reader">The Xml reader.</param> /// <param name="model">The State Machine Model</param> private void ValidateState(XmlReader reader, StateMachineType model) { string stateName = reader[TAG_STATE_NAME]; StateType state = model.GetStateType(stateName); if (state == null) { string error = "Cannot find state " + stateName; ReportError(reader, ERROR_INTERNAL, error); return; } if (this.stateMap.ContainsKey(stateName) == true) { string error = "Duplicated state " + stateName; ReportError(reader, ERROR_STATE_DUPLICATED, error); return; } else { this.stateMap[stateName] = stateName; } ts.TraceEvent(TraceEventType.Verbose, 1, "ValidateState {0}", stateName); using (XmlReader subReader = reader.ReadSubtree()) { while (reader.MoveToNextAttribute()) { if (reader.Name == TAG_KIND) { ValidateStateKind(reader, model, state); } } while (subReader.Read()) { switch (subReader.NodeType) { case XmlNodeType.Element: if (subReader.Name == TAG_STATE) { ValidateState(subReader, model); } else if (reader.Name == TAG_TRANSITION) { ValidateTransition(subReader, model, state); } else if (reader.Name == TAG_ONENTRY) { ValidateEntryExit(subReader, model, state); } else if (reader.Name == TAG_ONEXIT) { ValidateEntryExit(subReader, model, state); } else if (reader.Name == TAG_PARALLEL) { ValidateParallel(subReader, model, state); } break; } } } }