/// <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);
        }
Exemplo n.º 2
0
        /// <summary> Tests a segment against a segment section of a profile.</summary>
        public virtual NuGenHL7Exception[] testSegment(Genetibase.NuGenHL7.model.Segment segment, Seg profile, System.String profileID)
        {
            System.Collections.ArrayList exList        = new System.Collections.ArrayList(20);
            System.Collections.ArrayList allowedFields = new System.Collections.ArrayList(20);

            for (int i = 1; i <= profile.Fields; i++)
            {
                Field field = profile.getField(i);

                //only test a field in detail if it isn't X
                if (!field.Usage.ToUpper().Equals("X".ToUpper()))
                {
                    allowedFields.Add((System.Int32)i);

                    //see which instances have content
                    try
                    {
                        Genetibase.NuGenHL7.model.Type[] instances            = segment.getField(i);
                        System.Collections.ArrayList     instancesWithContent = new System.Collections.ArrayList(10);
                        for (int j = 0; j < instances.Length; j++)
                        {
                            if (hasContent(instances[j]))
                            {
                                instancesWithContent.Add(instances[j]);
                            }
                        }

                        NuGenHL7Exception ce = testCardinality(instancesWithContent.Count, field.Min, field.Max, field.Usage, field.Name);
                        if (ce != null)
                        {
                            ce.FieldPosition = i;
                            exList.Add(ce);
                        }

                        //test field instances with content
                        for (int j = 0; j < instancesWithContent.Count; j++)
                        {
                            Genetibase.NuGenHL7.model.Type s = (Genetibase.NuGenHL7.model.Type)instancesWithContent[j];

                            bool escape = true;                             //escape field value when checking length
                            if (profile.Name.ToUpper().Equals("MSH".ToUpper()) && i < 3)
                            {
                                escape = false;
                            }
                            NuGenHL7Exception[] childExceptions = testField(s, field, escape, profileID);
                            for (int k = 0; k < childExceptions.Length; k++)
                            {
                                childExceptions[k].FieldPosition = i;
                            }
                            addToList(childExceptions, exList);
                        }
                    }
                    catch (NuGenHL7Exception)
                    {
                        exList.Add(new NuGenProfileNotHL7CompliantException("Field " + i + " not found in message"));
                    }
                }
            }

            //complain about X fields with content
            this.addToList(checkForExtraFields(segment, allowedFields), exList);

            NuGenHL7Exception[] ret = toArray(exList);
            for (int i = 0; i < ret.Length; i++)
            {
                ret[i].SegmentName = profile.Name;
            }
            return(ret);
        }