/// <seealso cref="Validator.validate">
		/// </seealso>
		public virtual NuGenHL7Exception[] validate(Message message, StaticDef profile)
		{
			System.Collections.ArrayList exList = new System.Collections.ArrayList(20);
			Terser t = new Terser(message);
			
			//check msg type, event type, msg struct ID
			System.String msgType = t.get_Renamed("/MSH-9-1");
			if (!msgType.Equals(profile.MsgType))
			{
				NuGenHL7Exception e = new NuGenProfileNotFollowedException("Message type " + msgType + " doesn't match profile type of " + profile.MsgType);
				exList.Add(e);
			}
			
			System.String evType = t.get_Renamed("/MSH-9-2");
			if (!evType.Equals(profile.EventType) && !profile.EventType.ToUpper().Equals("ALL".ToUpper()))
			{
				NuGenHL7Exception e = new NuGenProfileNotFollowedException("Event type " + evType + " doesn't match profile type of " + profile.EventType);
				exList.Add(e);
			}
			
			System.String msgStruct = t.get_Renamed("/MSH-9-3");
			if (msgStruct == null || !msgStruct.Equals(profile.MsgStructID))
			{
				NuGenHL7Exception e = new NuGenProfileNotFollowedException("Message structure " + msgStruct + " doesn't match profile type of " + profile.MsgStructID);
				exList.Add(e);
			}
			
			System.Exception[] childExceptions;
			childExceptions = testGroup(message, profile, profile.Identifier);
			for (int i = 0; i < childExceptions.Length; i++)
			{
				exList.Add(childExceptions[i]);
			}
			
			return toArray(exList);
		}
		/// <summary>This method builds a Conformance Message Class</summary>
		/// <param name="runtimeProfile">the profile which to genrate Conformance Classes for
		/// </param>
		/// <param name="depManager">the DeploymentManager
		/// </param>
		public virtual void  buildClass(RuntimeProfile runtimeProfile, DeploymentManager depManager)
		{
			this.depManager = depManager;
			this.runtimeProfile = runtimeProfile;
			this.msg = runtimeProfile.Message;
			this.confMsg = new GeneratedConformanceMessage();
			
			ProfileName profileName = new ProfileName(msg.MsgStructID, ProfileName.PS_MSG);
			
            String version = Regex.Replace(runtimeProfile.getHL7Version(), "\\.", "");

			System.String underlyingDataType = "Genetibase.NuGenHL7.model." + version + ".message." + msg.MsgStructID;
			
			ConformanceSegmentBuilder confSegBuilder = new ConformanceSegmentBuilder(packageName, version, depManager);
			ConformanceSegGroupBuilder confSegGroupBuilder = new ConformanceSegGroupBuilder(packageName, version, depManager, msg.MsgStructID);
			DocumentationBuilder docBuilder = DocumentationBuilder.getDocumentationBuilder();
			
			// Add class package and imports
			confMsg.ClassPackage = packageName;
			confMsg.addClassImport("Genetibase.NuGenHL7.conf.classes.abs.*");
			confMsg.addClassImport("Genetibase.NuGenHL7.conf.classes.exceptions.*");
			
			// Set class properties
			confMsg.Name = profileName.ClassName;
			confMsg.Properties = "extends AbstractConformanceContainer";
			
			// Decorate the class with comments
			docBuilder.decorateConformanceMessage(confMsg, runtimeProfile);
			docBuilder.decorateConstructor(confMsg.Constructor, msg.MsgType);
			
			// add hapi message
			confMsg.addHAPIMessage(underlyingDataType);
			
			for (int i = 1; i <= msg.Children; i++)
			{
				//don't build not supported, backward, or unknown types
				System.String usage = msg.getChild(i).Usage;
				if (usage.Equals("X") || usage.Equals("B") || usage.Equals("U"))
					continue;
				
				if (msg.getChild(i) is Seg)
				{
					ProfileName childProfileName = profileName.newInstance(msg.getChild(i).Name, ProfileName.PS_SEG);
					
					// Add the member variable vector to hold them
					confMsg.addMemberVariable("private FiniteList " + childProfileName.MemberName + ";");
					confMsg.Constructor.addToBody(childProfileName.MemberName + " = new FiniteList( " + childProfileName.ClassName + ".class, hapiMessage );");
					
					UnderlyingAccessor childAccessor = new UnderlyingAccessor(underlyingDataType, childProfileName.AccessorName);
					GeneratedRepGetter repGetter = new GeneratedRepGetter(childProfileName, childAccessor.AcceptsRep);
					
					docBuilder.decorateRepGetter(repGetter, (Seg) msg.getChild(i), childProfileName.AccessorName);
					
					confMsg.addMethod(repGetter);
					if (depManager.Verbose)
						System.Console.Out.WriteLine("Generating Segment: " + packageName + "." + confMsg.Name);
					
					confSegBuilder.buildClass((Seg) msg.getChild(i), underlyingDataType, childProfileName.clearNameMap());
				}
				else if (msg.getChild(i) is SegGroup)
				{
					ProfileName childProfileName = profileName.newInstance(msg.getChild(i).Name, ProfileName.PS_SEGG);
					
					// Add the member variable vector to hold them
					confMsg.addMemberVariable("private FiniteList " + childProfileName.MemberName + ";");
					confMsg.Constructor.addToBody(childProfileName.MemberName + " = new FiniteList( " + childProfileName.ClassName + ".class, hapiMessage );");
					
					System.String underlyingAccessorName = "get" + msg.MsgStructID + "_" + ConformanceSegGroupBuilder.generateSegGroupName((SegGroup) msg.getChild(i));
					UnderlyingAccessor childAccessor = new UnderlyingAccessor(underlyingDataType, underlyingAccessorName);
					GeneratedRepGetter repGetter = new GeneratedRepGetter(childProfileName, childAccessor.AcceptsRep);
					
					docBuilder.decorateRepGetter(repGetter, (SegGroup) msg.getChild(i), childProfileName.OriginalName);
					confMsg.addMethod(repGetter);
					if (depManager.Verbose)
						System.Console.Out.WriteLine("Generating SegGroup: " + packageName + "." + confMsg.Name);
					
					confSegGroupBuilder.buildClass((SegGroup) msg.getChild(i), underlyingDataType, childProfileName.clearNameMap());
				}
			}
			
			depManager.generateFile(confMsg, packageName, profileName.ClassName);
		}