/// <summary>This method will build all the field children for this Segment</summary>
		/// <param name="segGroup">the SegGroup to build
		/// </param>
		/// <param name="parentUnderlyingType">the data type of the parent Message for this field
		/// example "Genetibase.NuGenHL7.model.v24.group.ADR_A19_..."  
		/// </param>
		/// <param name="profileName">this is the profile name associated with this Class
		/// </param>
		public virtual void  buildClass(SegGroup segGroup, System.String parentUnderlyingType, ProfileName profileName)
		{
			GeneratedConformanceContainer gcc = new GeneratedConformanceContainer();
			ConformanceSegmentBuilder confSegBuilder = new ConformanceSegmentBuilder(packageName + "." + profileName.PackageName, version, depManager);
			ConformanceSegGroupBuilder confSegGroupBuilder = new ConformanceSegGroupBuilder(packageName + "." + profileName.PackageName, version, depManager, structID);
			
			System.String underlyingDataType = structID + "_" + generateSegGroupName(segGroup);
			System.String underlyingPackageType = "Genetibase.NuGenHL7.model." + version + ".group." + underlyingDataType;
			
			// Set up class
			gcc.ClassPackage = packageName;
			gcc.addClassImport("Genetibase.NuGenHL7.conf.classes.abs.*");
			gcc.addClassImport("Genetibase.NuGenHL7.conf.classes.exceptions.*");
			gcc.addClassImport("Genetibase.NuGenHL7.*");
			gcc.addClassImport(packageName + "." + profileName.PackageName + ".*");
			
			gcc.Name = profileName.ClassName;
			gcc.Properties = "extends AbstractConformanceContainer implements Repeatable";
			gcc.setMinMaxReps(segGroup.Min, segGroup.Max);
			gcc.addMemberVariable("private " + underlyingPackageType + " hapiSegGroup;");
			
			// Set up underlying Segment type
			GeneratedMethod theConstructor = gcc.Constructor;
			docBuilder.decorateConstructor(theConstructor, profileName.ClassName);
			theConstructor.addParam(parentUnderlyingType + " underlyingMessage", "The underlying message object");
			theConstructor.addParam("int rep", "The underlying rep number");
			theConstructor.addToThrows("HL7Exception");
			
			UnderlyingAccessor underlyingAccessor = new UnderlyingAccessor(parentUnderlyingType, "get" + underlyingDataType);
			theConstructor.addToBody("this.hapiSegGroup = underlyingMessage." + underlyingAccessor.ToString() + ";");
			
			for (int i = 1; i <= segGroup.Children; i++)
			{
				//don't build not supported, backward, or unknown types
				System.String usage = segGroup.getChild(i).Usage;
				if (usage != null && (usage.Equals("X") || usage.Equals("B") || usage.Equals("U")))
					continue;
				
				if (segGroup.getChild(i) is Seg)
				{
					ProfileName childProfileName = profileName.newInstance(segGroup.getChild(i).Name, ProfileName.PS_SEG);
					
					// Add the member variable vector to hold them
					gcc.addMemberVariable("private FiniteList " + childProfileName.MemberName + ";");
					theConstructor.addToBody(childProfileName.MemberName + " = new FiniteList( " + childProfileName.ClassName + ".class, hapiSegGroup );");
					UnderlyingAccessor childAccessor = new UnderlyingAccessor(underlyingPackageType, childProfileName.AccessorName);
					GeneratedRepGetter repGetter = new GeneratedRepGetter(childProfileName, childAccessor.AcceptsRep);
					
					docBuilder.decorateRepGetter(repGetter, (Seg) segGroup.getChild(i), childProfileName.OriginalName);
					gcc.addMethod(repGetter);
					if (depManager.Verbose)
						System.Console.Out.WriteLine("Generating Segment: " + packageName + "." + gcc.Name);
					
					confSegBuilder.buildClass((Seg) segGroup.getChild(i), underlyingPackageType, childProfileName.clearNameMap());
				}
				else if (segGroup.getChild(i) is SegGroup)
				{
					ProfileName childProfileName = profileName.newInstance(segGroup.getChild(i).Name, ProfileName.PS_SEGG);
					
					// Add the member variable vector to hold them
					gcc.addMemberVariable("private FiniteList " + childProfileName.MemberName + ";");
					theConstructor.addToBody(childProfileName.MemberName + " = new FiniteList( " + childProfileName.ClassName + ".class, hapiSegGroup );");
					
					System.String underlyingAccessorName = "get" + structID + "_" + ConformanceSegGroupBuilder.generateSegGroupName((SegGroup) segGroup.getChild(i));
					UnderlyingAccessor childAccessor = new UnderlyingAccessor(underlyingPackageType, underlyingAccessorName);
					GeneratedRepGetter repGetter = new GeneratedRepGetter(childProfileName, childAccessor.AcceptsRep);
					
					docBuilder.decorateRepGetter(repGetter, (SegGroup) segGroup.getChild(i), childProfileName.OriginalName);
					gcc.addMethod(repGetter);
					if (depManager.Verbose)
						System.Console.Out.WriteLine("Generating SegGroup: " + packageName + "." + gcc.Name);
					
					confSegGroupBuilder.buildClass((SegGroup) segGroup.getChild(i), underlyingPackageType, childProfileName.clearNameMap());
				}
			}
			
			depManager.generateFile(gcc, packageName, profileName.ClassName);
		}
		/// <summary>This method builds a Conformance Segment Class</summary>
		/// <param name="seg">the Segment to build
		/// </param>
		/// <param name="parentUnderlyingType">the data type of the parent Message or SegGroup for this segment
		/// example "Genetibase.NuGenHL7.model.v24.group.ADR_A19_..."    
		/// </param>
		/// <param name="profileName">this is the profile name associated with this Class
		/// </param>
		public virtual void  buildClass(Seg seg, System.String parentUnderlyingType, ProfileName profileName)
		{
			GeneratedConformanceContainer gcc = new GeneratedConformanceContainer();
			System.String underlyingDataType; // The underlying HAPI Type
			
			// Check for possible snags in the Runtime Profile Segment
			if (seg.Name == null || seg.Name.Length < 1)
				throw new ConformanceError("Error building ConformanceSegment: Runtime Segment does not contain a name.");
			
			// Set up class
			gcc.ClassPackage = packageName;
			gcc.addClassImport("Genetibase.NuGenHL7.conf.classes.abs.*");
			gcc.addClassImport("Genetibase.NuGenHL7.conf.classes.exceptions.*");
			gcc.addClassImport("Genetibase.NuGenHL7.*");
			gcc.addClassImport(packageName + "." + profileName.PackageName + ".*");
			
			gcc.Name = profileName.ClassName;
			gcc.Properties = "extends AbstractConformanceContainer implements Repeatable";
			gcc.setMinMaxReps(seg.Min, seg.Max);
			underlyingDataType = "Genetibase.NuGenHL7.model." + versionString + ".segment." + seg.Name;
			
			System.String segClassName = UnderlyingAccessor.getHapiModelClass(underlyingDataType).FullName;
			gcc.addMemberVariable("private " + segClassName + " hapiSegment;");
			
			docBuilder.decorateConstructor(gcc.Constructor, profileName.ClassName);
			
			// Set up underlying Segment type
			GeneratedMethod theConstructor = gcc.Constructor;
			theConstructor.addParam(parentUnderlyingType + " underlyingMessage", "The underlying message object");
			theConstructor.addParam("int rep", "The underlying rep number");
			UnderlyingAccessor underlyingAccessor = new UnderlyingAccessor(parentUnderlyingType, profileName.AccessorName);
			theConstructor.addToBody("this.hapiSegment = (" + segClassName + ") underlyingMessage." + underlyingAccessor.ToString() + ";");
			theConstructor.addToThrows("HL7Exception");
			
			// Loop through each child. Note that array is 1-offset
			for (int i = 1; i <= seg.Fields; i++)
			{
				//don't build not supported, backward, or unknown types
				System.String usage = seg.getField(i).Usage;
				if (usage != null && (usage.Equals("X") || usage.Equals("B") || usage.Equals("U")))
					continue;
				
				// Create the names for each type of child
				//         //CHANGED to use field # instead of name, in support of Z-segments 
				//         ProfileName childProfileName = profileName.newInstance(String.valueOf(i), ProfileName.PS_FIELD);
				ProfileName childProfileName = profileName.newInstance(seg.getField(i).Name, ProfileName.PS_FIELD);
				
				// Add the member variable vector to hold them
				gcc.addMemberVariable("private FiniteList " + childProfileName.MemberName + ";");
				
				// Set up the constructor
				theConstructor.addToBody(childProfileName.MemberName + " = new FiniteList( " + childProfileName.ClassName + ".class, hapiSegment );");
				
				// Add the getter
				UnderlyingAccessor childAccessor = new UnderlyingAccessor(underlyingDataType, childProfileName.AccessorName);
				GeneratedRepGetter repGetter = new GeneratedRepGetter(childProfileName, childAccessor.AcceptsRep);
				docBuilder.decorateRepGetter(repGetter, seg.getField(i), childProfileName.ClassName);
				gcc.addMethod(repGetter);
				
				// If the field has no components it is a primitive, so build as such.
				if (seg.getField(i).Components > 0)
				{
					ConformanceFieldBuilder childBuilder = new ConformanceFieldBuilder(packageName + "." + profileName.PackageName, versionString, depManager);
					childBuilder.buildClass(seg.getField(i), segClassName, childProfileName.clearNameMap());
				}
				else
				{
					ConformancePrimitiveBuilder childBuilder = new ConformancePrimitiveBuilder(packageName + "." + profileName.PackageName, depManager);
					childBuilder.buildClass(seg.getField(i), segClassName, childProfileName.clearNameMap());
				}
			}
			
			// Decorate with comments
			docBuilder.decorateSegment(gcc, seg);
			
			if (depManager.Verbose)
				System.Console.Out.WriteLine("Generating Segment: " + packageName + "." + gcc.Name);
			
			depManager.generateFile(gcc, packageName, profileName.ClassName);
		}
		/// <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);
		}