Ejemplo n.º 1
0
        /// <summary> <p>Creates skeletal source code (without correct data structure but no business
        /// logic) for all segments found in the normative database.  </p>
        /// </summary>
        public static void MakeAll(string baseDirectory, string version)
        {
            // make base directory
            if (!(baseDirectory.EndsWith("\\") || baseDirectory.EndsWith("/")))
            {
                baseDirectory = baseDirectory + "/";
            }

            var targetDir =
                SourceGenerator.MakeDirectory(baseDirectory + PackageManager.GetVersionPackagePath(version) + "Segment");

            // get list of data types
            var conn = NormativeDatabase.Instance.Connection;
            var sql  =
                "SELECT seg_code, [section] from HL7Segments, HL7Versions where HL7Segments.version_id = HL7Versions.version_id AND hl7_version = '" +
                version + "'";
            DbCommand temp_OleDbCommand = conn.CreateCommand();

            temp_OleDbCommand.Connection  = conn;
            temp_OleDbCommand.CommandText = sql;
            var rs = temp_OleDbCommand.ExecuteReader();

            var segments = new ArrayList();

            while (rs.Read())
            {
                var segName = Convert.ToString(rs[1 - 1]);
                if (char.IsLetter(segName[0]))
                {
                    segments.Add(AltSegName(segName));
                }
            }

            temp_OleDbCommand.Dispose();
            NormativeDatabase.Instance.ReturnConnection(conn);

            if (segments.Count == 0)
            {
                Log.Warn($"No version {version} segments found in database {conn.Database}");
            }

            for (var i = 0; i < segments.Count; i++)
            {
                try
                {
                    var seg    = (string)segments[i];
                    var source = MakeSegment(seg, version);
                    using (var w = new StreamWriter(targetDir.ToString() + @"\" + GetSpecialFilename(seg) + ".cs"))
                    {
                        w.Write(source);
                        w.Write("}");
                    }
                }
                catch (Exception e)
                {
                    Console.Error.WriteLine($"Error creating source code for all segments: {e.Message}");
                    SupportClass.WriteStackTrace(e, Console.Error);
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary> Creates source code for a Group and returns a GroupDef object that
        /// describes the Group's name, optionality, repeatability.  The source
        /// code is written under the given directory.
        /// The structures list may contain [] and {} pairs representing
        /// nested groups and their optionality and repeatability.  In these cases
        /// this method is called recursively.
        /// If the given structures list begins and ends with repetition and/or
        /// optionality markers the repetition and optionality of the returned
        /// GroupDef are set accordingly.
        /// <param name="structures">a list of the structures that comprise this group - must
        /// be at least 2 long
        /// </param>
        /// <param name="groupName">The group name</param>
        /// <param name="version">The version of message</param>
        /// <param name="baseDirectory">the directory to which files should be written
        /// </param>
        /// <param name="message">the message to which this group belongs
        /// </param>
        /// <throws>  HL7Exception if the repetition and optionality markers are not  </throws>
        /// </summary>
        public static GroupDef writeGroup(IStructureDef[] structures, String groupName, String baseDirectory, String version,
                                          String message)
        {
            //make base directory
            if (!(baseDirectory.EndsWith("\\") || baseDirectory.EndsWith("/")))
            {
                baseDirectory = baseDirectory + "/";
            }
            FileInfo targetDir =
                SourceGenerator.makeDirectory(baseDirectory + PackageManager.GetVersionPackagePath(version) + "Group");

            // some group names are troublesome and have "/" which will cause problems when writing files
            groupName = groupName.Replace("/", "_");
            GroupDef group = getGroupDef(structures, groupName, baseDirectory, version, message);

            using (StreamWriter out_Renamed = new StreamWriter(targetDir.FullName + @"\" + group.Name + ".cs"))
            {
                out_Renamed.Write(makePreamble(group, version));
                out_Renamed.Write(makeConstructor(group, version));

                IStructureDef[] shallow = group.Structures;
                for (int i = 0; i < shallow.Length; i++)
                {
                    out_Renamed.Write(makeAccessor(group, i));
                }
                out_Renamed.Write("}\r\n");                 //Closing class
                out_Renamed.Write("}\r\n");                 //Closing namespace
            }
            return(group);
        }
Ejemplo n.º 3
0
        public static void makeAll(String baseDirectory, String version)
        {
            //make base directory
            if (!(baseDirectory.EndsWith("\\") || baseDirectory.EndsWith("/")))
            {
                baseDirectory = baseDirectory + "/";
            }
            FileInfo targetDir =
                SourceGenerator.makeDirectory(baseDirectory + PackageManager.GetVersionPackagePath(version) + "EventMapping");

            //get list of data types
            OdbcConnection conn = NormativeDatabase.Instance.Connection;
            String         sql  =
                "SELECT * from HL7EventMessageTypes inner join HL7Versions on HL7EventMessageTypes.version_id = HL7Versions.version_id where HL7Versions.hl7_version = '" +
                version + "'";
            DbCommand temp_OleDbCommand = conn.CreateCommand();

            temp_OleDbCommand.Connection  = conn;
            temp_OleDbCommand.CommandText = sql;
            DbDataReader rs = temp_OleDbCommand.ExecuteReader();


            using (StreamWriter sw = new StreamWriter(targetDir.FullName + @"\EventMap.properties", false))
            {
                sw.WriteLine("#event -> structure map for " + version);
                while (rs.Read())
                {
                    string messageType = string.Format("{0}_{1}", rs["message_typ_snd"], rs["event_code"]);
                    string structure   = (string)rs["message_structure_snd"];

                    sw.WriteLine(string.Format("{0} {1}", messageType, structure));
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary> Creates source code for a specific message structure and
        /// writes it under the specified directory.
        /// throws IllegalArgumentException if there is no message structure
        /// for this message in the normative database.
        /// </summary>
        public static void Make(string message, string baseDirectory, string chapter, string version)
        {
            try
            {
                var segments = GetSegments(message, version);

                // System.out.println("Making: " + message + " with " + segments.length + " segments (not writing message code - just groups)");
                var group = GroupGenerator.GetGroupDef(segments, null, baseDirectory, version, message);
                var contents = group.Structures;

                // make base directory
                if (!(baseDirectory.EndsWith("\\") || baseDirectory.EndsWith("/")))
                {
                    baseDirectory += Path.DirectorySeparatorChar;
                }

                var targetDir =
                    SourceGenerator.MakeDirectory(
                        Path.Combine(baseDirectory, PackageManager.GetVersionPackagePath(version), "Message"));

                var targetFile = Path.Combine(targetDir.FullName, $"{message}.cs");

                var stringBuilder = new StringBuilder();

                stringBuilder.Append(MakePreamble(contents, message, chapter, version));
                stringBuilder.Append(MakeConstructor(contents, message, version));
                for (var i = 0; i < contents.Length; i++)
                {
                    var groupAccessor = GroupGenerator.MakeAccessor(@group, i);
                    stringBuilder.Append(groupAccessor);
                }

                // add implementation of model.control interface, if any
                stringBuilder.Append("}\r\n"); // End class
                stringBuilder.Append("}\r\n"); // End namespace

                FileAbstraction.WriteAllBytes(targetFile, Encoding.UTF8.GetBytes(stringBuilder.ToString()));
            }
            catch (Exception e)
            {
                Log.Error("Error while creating source code", e);

                Log.Warn("Warning: could not write source code for message structure " + message + " - " + e.GetType().FullName +
                            ": " + e.Message);
            }
        }
Ejemplo n.º 5
0
        public static void MakeAll(string baseDirectory, string version)
        {
            // make base directory
            if (!(baseDirectory.EndsWith("\\") || baseDirectory.EndsWith("/")))
            {
                baseDirectory += Path.DirectorySeparatorChar;
            }

            var targetDir =
                SourceGenerator.MakeDirectory(
                    Path.Combine(baseDirectory, PackageManager.GetVersionPackagePath(version), "EventMapping"));

            // get list of data types
            var conn = NormativeDatabase.Instance.Connection;
            var sql  =
                "SELECT * from HL7EventMessageTypes inner join HL7Versions on HL7EventMessageTypes.version_id = HL7Versions.version_id where HL7Versions.hl7_version = '" +
                version + "'";
            DbCommand temp_OleDbCommand = conn.CreateCommand();

            temp_OleDbCommand.Connection  = conn;
            temp_OleDbCommand.CommandText = sql;
            var rs = temp_OleDbCommand.ExecuteReader();

            var targetFile = Path.Combine(targetDir.FullName, "EventMap.properties");

            var stringBuilder = new StringBuilder();

            stringBuilder.AppendLine($"#event -> structure map for {version}");
            if (version == "2.1" || version == "2.2")
            {
                stringBuilder.AppendLine("#note: no mappings are defined for 2.1 and 2.2");
            }
            else
            {
                while (rs.Read())
                {
                    var messageType = $"{rs["message_typ_snd"]}_{rs["event_code"]}";
                    var structure   = (string)rs["message_structure_snd"];

                    stringBuilder.AppendLine($"{messageType} {structure}");
                }
            }

            FileAbstraction.WriteAllBytes(targetFile, Encoding.UTF8.GetBytes(stringBuilder.ToString()));
        }
Ejemplo n.º 6
0
        /// <summary> Creates source code for a specific message structure and
        /// writes it under the specified directory.
        /// throws IllegalArgumentException if there is no message structure
        /// for this message in the normative database.
        /// </summary>
        public static void Make(string message, string baseDirectory, string chapter, string version)
        {
            try
            {
                var segments = GetSegments(message, version);

                // System.out.println("Making: " + message + " with " + segments.length + " segments (not writing message code - just groups)");
                var group    = GroupGenerator.GetGroupDef(segments, null, baseDirectory, version, message);
                var contents = group.Structures;

                // make base directory
                if (!(baseDirectory.EndsWith("\\") || baseDirectory.EndsWith("/")))
                {
                    baseDirectory = baseDirectory + "/";
                }

                var targetDir =
                    SourceGenerator.MakeDirectory(baseDirectory + PackageManager.GetVersionPackagePath(version) + "Message");
                Console.Out.WriteLine("Writing " + message + " to " + targetDir.FullName);
                using (var out_Renamed = new StreamWriter(targetDir.FullName + "/" + message + ".cs"))
                {
                    out_Renamed.Write(MakePreamble(contents, message, chapter, version));
                    out_Renamed.Write(MakeConstructor(contents, message, version));
                    for (var i = 0; i < contents.Length; i++)
                    {
                        var groupAccessor = GroupGenerator.MakeAccessor(@group, i);
                        out_Renamed.Write(groupAccessor);
                    }

                    // add implementation of model.control interface, if any
                    out_Renamed.Write("}\r\n"); // End class
                    out_Renamed.Write("}\r\n"); // End namespace
                }
            }
            catch (Exception e)
            {
                Log.Error("Error while creating source code", e);

                Log.Warn("Warning: could not write source code for message structure " + message + " - " + e.GetType().FullName +
                         ": " + e.Message);
            }
        }
Ejemplo n.º 7
0
        /// <summary> Creates source code for a Group and returns a GroupDef object that
        /// describes the Group's name, optionality, repeatability.  The source
        /// code is written under the given directory.
        /// The structures list may contain [] and {} pairs representing
        /// nested groups and their optionality and repeatability.  In these cases
        /// this method is called recursively.
        /// If the given structures list begins and ends with repetition and/or
        /// optionality markers the repetition and optionality of the returned
        /// GroupDef are set accordingly.
        /// <param name="structures">a list of the structures that comprise this group - must
        /// be at least 2 long
        /// </param>
        /// <param name="groupName">The group name</param>
        /// <param name="version">The version of message</param>
        /// <param name="baseDirectory">the directory to which files should be written
        /// </param>
        /// <param name="message">the message to which this group belongs
        /// </param>
        /// <throws>  HL7Exception if the repetition and optionality markers are not  </throws>
        /// </summary>
        public static GroupDef WriteGroup(
            IStructureDef[] structures,
            string groupName,
            string baseDirectory,
            string version,
            string message)
        {
            // make base directory
            if (!(baseDirectory.EndsWith("\\") || baseDirectory.EndsWith("/")))
            {
                baseDirectory += Path.DirectorySeparatorChar;
            }

            var targetDir =
                SourceGenerator.MakeDirectory(
                    Path.Combine(baseDirectory, PackageManager.GetVersionPackagePath(version), "Group"));

            // some group names are troublesome and have "/" which will cause problems when writing files
            groupName = groupName.Replace("/", "_");
            var group = GetGroupDef(structures, groupName, baseDirectory, version, message);

            var targetFile = Path.Combine(targetDir.FullName, $"{@group.Name}.cs");

            var stringBuilder = new StringBuilder();

            stringBuilder.Append(MakePreamble(group, version));
            stringBuilder.Append(MakeConstructor(group, version));

            var shallow = group.Structures;

            for (var i = 0; i < shallow.Length; i++)
            {
                stringBuilder.Append(MakeAccessor(group, i));
            }

            stringBuilder.Append("}\r\n"); // Closing class
            stringBuilder.Append("}\r\n"); // Closing namespace

            FileAbstraction.WriteAllBytes(targetFile, Encoding.UTF8.GetBytes(stringBuilder.ToString()));
            return(group);
        }
Ejemplo n.º 8
0
        /// <summary> Returns the Java source code for a class that represents the specified segment.</summary>
        public static string MakeSegment(string name, string version)
        {
            Console.WriteLine("Making segment " + name);
            var source = new StringBuilder();

            try
            {
                var            elements = new ArrayList();
                SegmentElement se;
                string         segDesc = null;
                var            conn    = NormativeDatabase.Instance.Connection;
                var            sql     = new StringBuilder();
                sql.Append("SELECT HL7SegmentDataElements.seg_code, HL7SegmentDataElements.seq_no, ");
                sql.Append("HL7SegmentDataElements.repetitional, HL7SegmentDataElements.repetitions, ");
                sql.Append("HL7DataElements.description, HL7DataElements.length_old, HL7DataElements.table_id, ");
                sql.Append("HL7SegmentDataElements.req_opt, HL7Segments.description, HL7DataElements.data_structure ");
                sql.Append(
                    "FROM HL7Versions RIGHT JOIN (HL7Segments INNER JOIN (HL7DataElements INNER JOIN HL7SegmentDataElements ");
                sql.Append("ON (HL7DataElements.version_id = HL7SegmentDataElements.version_id) ");
                sql.Append("AND (HL7DataElements.data_item = HL7SegmentDataElements.data_item)) ");
                sql.Append("ON (HL7Segments.version_id = HL7SegmentDataElements.version_id) ");
                sql.Append("AND (HL7Segments.seg_code = HL7SegmentDataElements.seg_code)) ");
                sql.Append("ON (HL7Versions.version_id = HL7Segments.version_id) ");
                sql.Append("WHERE HL7SegmentDataElements.seg_code = '");
                sql.Append(name);
                sql.Append("' and HL7Versions.hl7_version = '");
                sql.Append(version);
                sql.Append("' ORDER BY HL7SegmentDataElements.seg_code, HL7SegmentDataElements.seq_no;");
                var       stmt = TransactionManager.Manager.CreateStatement(conn);
                DbCommand temp_OleDbCommand;
                temp_OleDbCommand             = stmt;
                temp_OleDbCommand.CommandText = sql.ToString();
                var rs = temp_OleDbCommand.ExecuteReader();

                while (rs.Read())
                {
                    if (segDesc == null)
                    {
                        segDesc = Convert.ToString(rs[9 - 1]);
                    }

                    se       = new SegmentElement();
                    se.Field = Convert.ToInt32(rs.GetValue(2 - 1));
                    se.Rep   = Convert.ToString(rs[3 - 1]);
                    if (rs.IsDBNull(4 - 1))
                    {
                        se.Repetitions = 0;
                    }
                    else
                    {
                        se.Repetitions = Convert.ToInt32(rs.GetValue(4 - 1));
                    }

                    if (se.Repetitions == 0)
                    {
                        if (se.Rep == null || !se.Rep.ToUpper().Equals("Y".ToUpper()))
                        {
                            se.Repetitions = 1;
                        }
                    }

                    se.Desc = Convert.ToString(rs[5 - 1]);
                    if (!rs.IsDBNull(6 - 1))
                    {
                        se.Length = DetermineLength(rs);
                    }

                    se.Table = Convert.ToInt32(rs.GetValue(7 - 1));
                    se.Opt   = Convert.ToString(rs[8 - 1]);
                    se.Type  = Convert.ToString(rs[10 - 1]);

                    // shorten CE_x to CE
                    if (se.Type.StartsWith("CE"))
                    {
                        se.Type = "CE";
                    }

                    elements.Add(se);
                }

                rs.Close();
                stmt.Dispose();
                NormativeDatabase.Instance.ReturnConnection(conn);

                // write imports, class documentation, etc ...
                source.Append("using System;\r\n");
                source.Append("using NHapi.Base;\r\n");
                source.Append("using NHapi.Base.Parser;\r\n");
                source.Append("using NHapi.Base.Model;\r\n");
                source.Append("using ");
                source.Append((string)PackageManager.GetVersionPackageName(version));
                source.Append("Datatype;\r\n");
                source.Append("using NHapi.Base.Log;\r\n\r\n");

                source.Append("namespace ");
                source.Append((string)PackageManager.GetVersionPackageName(version));
                source.Append("Segment{\r\n\r\n");
                source.Append("///<summary>\r\n");
                source.Append("/// Represents an HL7 ");
                source.Append(name);
                source.Append(" message segment. \r\n");
                source.Append("/// This segment has the following fields:<ol>\r\n");

                PrepareAppendStringsForElementsWithDuplicateDescriptions(name, elements);

                for (var i = 0; i < elements.Count; i++)
                {
                    se = (SegmentElement)elements[i];
                    source.Append("///");
                    source.Append("<li>");
                    source.Append(name);
                    source.Append("-");
                    source.Append(se.Field);
                    source.Append(": ");
                    source.Append(se.GetDescriptionWithoutSpecialCharacters());
                    source.Append(" (");
                    source.Append(se.Type);
                    source.Append(")</li>\r\n");
                }

                source.Append("///</ol>\r\n");
                source.Append("/// The get...() methods return data from individual fields.  These methods \r\n");
                source.Append("/// do not throw exceptions and may therefore have to handle exceptions internally.  \r\n");
                source.Append("/// If an exception is handled internally, it is logged and null is returned.  \r\n");
                source.Append("/// This is not expected to happen - if it does happen this indicates not so much \r\n");
                source.Append("/// an exceptional circumstance as a bug in the code for this class.\r\n");
                source.Append("///</summary>\r\n");
                source.Append("[Serializable]\r\n");
                source.Append("public class ");
                source.Append(name);
                source.Append(" : AbstractSegment ");

                // implement interface from Model.control package if required

                /*Class correspondingControlInterface = Control.getInterfaceImplementedBy(name);
                 * if (correspondingControlInterface != null) {
                 * source.append("implements ");
                 * source.append(correspondingControlInterface.getName());
                 * } */

                source.Append(" {\r\n\r\n");
                source.Append("  /**\r\n");
                source.Append("   * Creates a ");
                source.Append(name);
                source.Append(" (");
                source.Append(segDesc);
                source.Append(") segment object that belongs to the given \r\n");
                source.Append("   * message.  \r\n");
                source.Append("   */\r\n");

                // write constructor
                source.Append("\tpublic ");
                source.Append(name);
                source.Append("(IGroup parent, IModelClassFactory factory) : base(parent,factory) {\r\n");
                source.Append("\tIMessage message = Message;\r\n");
                if (elements.Count > 0)
                {
                    source.Append("    try {\r\n");
                    for (var i = 0; i < elements.Count; i++)
                    {
                        se = (SegmentElement)elements[i];
                        var type = SourceGenerator.GetAlternateType(se.Type, version);
                        source.Append("       this.add(");
                        source.Append("typeof(" + type + ")");

                        // if (type.equalsIgnoreCase("Varies")) {
                        //                    } else {
                        //                        source.append("factory.getTypeClass(\"");
                        //                        source.append(type);
                        //                        source.append("\", \"");
                        //                        source.append(version);
                        //                        source.append("\")");
                        //                    }
                        source.Append(", ");
                        if (se.Opt == null)
                        {
                            source.Append("false");
                        }
                        else
                        {
                            if (se.Opt.ToUpper().Equals("R".ToUpper()))
                            {
                                source.Append("true");
                            }
                            else
                            {
                                source.Append("false");
                            }
                        }

                        source.Append(", ");
                        source.Append(se.Repetitions);
                        source.Append(", ");
                        source.Append(se.Length);
                        source.Append(", ");
                        if (se.Type.Equals("ID") || se.Type.Equals("IS"))
                        {
                            source.Append("new System.Object[]{message, ");
                            source.Append(se.Table);
                            source.Append("}");
                        }
                        else
                        {
                            source.Append("new System.Object[]{message}");
                        }

                        if (se.Desc != null && se.Desc.Trim().Length > 0)
                        {
                            source.Append(", ");

                            source.Append("\"" + se.GetDescriptionWithoutSpecialCharacters() + "\"");
                        }

                        source.Append(");\r\n");
                    }

                    source.Append("    } catch (HL7Exception he) {\r\n");
                    source.Append(
                        "        HapiLogFactory.GetHapiLog(GetType()).Error(\"Can't instantiate \" + GetType().Name, he);\r\n");
                    source.Append("    }\r\n");
                }

                source.Append("  }\r\n\r\n");

                // write a datatype-specific accessor for each field
                for (var i = 0; i < elements.Count; i++)
                {
                    se = (SegmentElement)elements[i];
                    if (!se.Desc.ToUpper().Equals("UNUSED".ToUpper()))
                    {
                        // some entries in 2.1 DB say "unused"
                        var type = SourceGenerator.GetAlternateType(se.Type, version);
                        source.Append("\t///<summary>\r\n");
                        source.Append("\t/// Returns ");
                        if (se.Repetitions != 1)
                        {
                            source.Append("a single repetition of ");
                        }

                        source.Append(se.GetDescriptionWithoutSpecialCharacters());
                        source.Append("(");
                        source.Append(name);
                        source.Append("-");
                        source.Append(se.Field);
                        source.Append(").\r\n");
                        if (se.Repetitions != 1)
                        {
                            source.Append("\t/// throws HL7Exception if the repetition number is invalid.\r\n");
                            source.Append("\t/// <param name=\"rep\">The repetition number (this is a repeating field)</param>\r\n");
                        }

                        source.Append("\t///</summary>\r\n");
                        source.Append("\tpublic ");
                        source.Append(type);
                        source.Append(" ");
                        source.Append(SourceGenerator.MakeAccessorName(se.Desc, se.Repetitions) + se.AccessorNameToAppend);
                        if (se.Repetitions != 1)
                        {
                            source.Append("(int rep)");
                        }

                        source.Append("\n\t{\r\n");
                        if (se.Repetitions == 1)
                        {
                            source.Append("\t\tget{\r\n");
                        }

                        source.Append("\t\t\t");
                        source.Append(type);
                        source.Append(" ret = null;\r\n");
                        source.Append("\t\t\ttry\n\t\t\t{\r\n");
                        source.Append("\t\t\tIType t = this.GetField(");
                        source.Append(se.Field);
                        source.Append(", ");
                        if (se.Repetitions == 1)
                        {
                            source.Append("0");
                        }
                        else
                        {
                            source.Append("rep");
                        }

                        source.Append(");\r\n");
                        source.Append("\t\t\t\tret = (");
                        source.Append(type);
                        source.Append(")t;\r\n");
                        if (se.Repetitions == 1)
                        {
                            source.Append("\t\t\t}\n\t\t\t catch (HL7Exception he) {\r\n");
                            source.Append(
                                "\t\t\tHapiLogFactory.GetHapiLog(GetType()).Error(\"Unexpected problem obtaining field value.  This is a bug.\", he);\r\n");
                            source.Append("\t\t\t\tthrow new System.Exception(\"An unexpected error occurred\", he);\r\n");
                        }

                        source.Append("\t\t} catch (System.Exception ex) {\r\n");
                        source.Append(
                            "\t\t\tHapiLogFactory.GetHapiLog(GetType()).Error(\"Unexpected problem obtaining field value.  This is a bug.\", ex);\r\n");
                        source.Append("\t\t\t\tthrow new System.Exception(\"An unexpected error occurred\", ex);\r\n");
                        source.Append("    }\r\n");
                        source.Append("\t\t\treturn ret;\r\n");
                        if (se.Repetitions == 1)
                        {
                            source.Append("\t}\r\n"); // End get
                        }

                        source.Append("  }\r\n\r\n");

                        // add an array accessor as well for repeating fields
                        if (se.Repetitions != 1)
                        {
                            source.Append("  ///<summary>\r\n");
                            source.Append("  /// Returns all repetitions of ");
                            source.Append(se.GetDescriptionWithoutSpecialCharacters());
                            source.Append(" (");
                            source.Append(name);
                            source.Append("-");
                            source.Append(se.Field);
                            source.Append(").\r\n");
                            source.Append("   ///</summary>\r\n");
                            source.Append("  public ");
                            source.Append(type);
                            source.Append("[] Get");
                            source.Append(SourceGenerator.MakeAccessorName(se.Desc) + se.AccessorNameToAppend);
                            source.Append("() {\r\n");
                            source.Append("     ");
                            source.Append(type);
                            source.Append("[] ret = null;\r\n");
                            source.Append("    try {\r\n");
                            source.Append("        IType[] t = this.GetField(");
                            source.Append(se.Field);
                            source.Append(");  \r\n");
                            source.Append("        ret = new ");
                            source.Append(type);
                            source.Append("[t.Length];\r\n");
                            source.Append("        for (int i = 0; i < ret.Length; i++) {\r\n");
                            source.Append("            ret[i] = (");
                            source.Append(type);
                            source.Append(")t[i];\r\n");
                            source.Append("        }\r\n");
                            source.Append("    } catch (HL7Exception he) {\r\n");
                            source.Append(
                                "        HapiLogFactory.GetHapiLog(this.GetType()).Error(\"Unexpected problem obtaining field value.  This is a bug.\", he);\r\n");
                            source.Append("        throw new System.Exception(\"An unexpected error occurred\", he);\r\n");
                            source.Append("    } catch (System.Exception cce) {\r\n");
                            source.Append(
                                "        HapiLogFactory.GetHapiLog(GetType()).Error(\"Unexpected problem obtaining field value.  This is a bug.\", cce);\r\n");
                            source.Append("        throw new System.Exception(\"An unexpected error occurred\", cce);\r\n");
                            source.Append("  }\r\n");
                            source.Append(" return ret;\r\n");
                            source.Append("}\r\n\r\n");

                            // Add property for the total repetitions of this object
                            source.Append("  ///<summary>\r\n");
                            source.Append("  /// Returns the total repetitions of ");
                            source.Append(se.GetDescriptionWithoutSpecialCharacters());
                            source.Append(" (");
                            source.Append(name);
                            source.Append("-");
                            source.Append(se.Field);
                            source.Append(").\r\n");
                            source.Append("   ///</summary>\r\n");
                            source.Append("  public int ");
                            source.Append(SourceGenerator.MakeName(se.Desc) + se.AccessorNameToAppend);
                            source.Append("RepetitionsUsed\r\n");
                            source.Append("{\r\n");
                            source.Append("get{\r\n");
                            source.Append("    try {\r\n");
                            source.Append("\treturn GetTotalFieldRepetitionsUsed(" + se.Field + ");\r\n");
                            source.Append("    }\r\n");
                            source.Append("catch (HL7Exception he) {\r\n");
                            source.Append(
                                "        HapiLogFactory.GetHapiLog(this.GetType()).Error(\"Unexpected problem obtaining field value.  This is a bug.\", he);\r\n");
                            source.Append("        throw new System.Exception(\"An unexpected error occurred\", he);\r\n");
                            source.Append("} catch (System.Exception cce) {\r\n");
                            source.Append(
                                "        HapiLogFactory.GetHapiLog(GetType()).Error(\"Unexpected problem obtaining field value.  This is a bug.\", cce);\r\n");
                            source.Append("        throw new System.Exception(\"An unexpected error occurred\", cce);\r\n");
                            source.Append("}\r\n");
                            source.Append("}\r\n");
                            source.Append("}\r\n");
                        }
                    }
                }

                // add adapter method code for control package if it exists
                // source.append(Control.getImplementation(correspondingControlInterface, version));
                source.Append("\n}");
            }
            catch (DbException sqle)
            {
                SupportClass.WriteStackTrace(sqle, Console.Error);
            }

            return(source.ToString());
        }
Ejemplo n.º 9
0
        /// <summary> Creates skeletal source code (without correct data structure but no business
        /// logic) for all data types found in the normative database.  For versions > 2.2, Primitive data types
        /// are not generated, because they are coded manually (as of HAPI 0.3).
        /// </summary>
        public static void makeAll(String baseDirectory, String version)
        {
            //make base directory
            if (!(baseDirectory.EndsWith("\\") || baseDirectory.EndsWith("/")))
            {
                baseDirectory = baseDirectory + "/";
            }
            FileInfo targetDir =
                SourceGenerator.makeDirectory(baseDirectory + PackageManager.GetVersionPackagePath(version) + "Datatype");

            SourceGenerator.makeDirectory(baseDirectory + PackageManager.GetVersionPackagePath(version) + "Datatype");
            //get list of data types
            ArrayList      types = new ArrayList();
            OdbcConnection conn  = NormativeDatabase.Instance.Connection;
            DbCommand      stmt  = TransactionManager.manager.CreateStatement(conn);
            //get normal data types ...
            DbCommand temp_OleDbCommand;

            temp_OleDbCommand             = stmt;
            temp_OleDbCommand.CommandText =
                "select data_type_code from HL7DataTypes, HL7Versions where HL7Versions.version_id = HL7DataTypes.version_id and HL7Versions.hl7_version = '" +
                version + "'";
            DbDataReader rs = temp_OleDbCommand.ExecuteReader();

            while (rs.Read())
            {
                types.Add(Convert.ToString(rs[1 - 1]));
            }
            rs.Close();
            //get CF, CK, CM, CN, CQ sub-types ...

            DbCommand temp_OleDbCommand2;

            temp_OleDbCommand2             = stmt;
            temp_OleDbCommand2.CommandText = "select data_structure from HL7DataStructures, HL7Versions where (" +
                                             "data_type_code  = 'CF' or " + "data_type_code  = 'CK' or " +
                                             "data_type_code  = 'CM' or " + "data_type_code  = 'CN' or " +
                                             "data_type_code  = 'CQ') and " +
                                             "HL7Versions.version_id = HL7DataStructures.version_id and  HL7Versions.hl7_version = '" +
                                             version + "'";
            rs = temp_OleDbCommand2.ExecuteReader();
            while (rs.Read())
            {
                types.Add(Convert.ToString(rs[1 - 1]));
            }

            stmt.Dispose();
            NormativeDatabase.Instance.returnConnection(conn);

            Console.Out.WriteLine("Generating " + types.Count + " datatypes for version " + version);
            if (types.Count == 0)
            {
                log.Warn("No version " + version + " data types found in database " + conn.Database);
            }

            foreach (string type in types.Cast <string>())
            {
                if (!type.Equals("*"))
                {
                    make(targetDir, type, version);
                }
            }
        }
Ejemplo n.º 10
0
        /// <summary> Returns a String containing source code for a Composite data type. The
        /// dataTypes array contains the data type names (e.g. ST) of each component.
        /// The descriptions array contains the corresponding descriptions (e.g. string).
        /// </summary>
        private static String makeComposite(String dataType, String description, String[] dataTypes, String[] descriptions,
                                            int[] tables, String version)
        {
            StringBuilder source = new StringBuilder();

            source.Append("using System;\n");
            source.Append("using NHapi.Base.Model;\n");
            source.Append("using NHapi.Base.Log;\n");
            source.Append("using NHapi.Base;\n");
            source.Append("using NHapi.Base.Model.Primitive;\r\n\r\n");
            source.Append("namespace ");
            source.Append((string)PackageManager.GetVersionPackageName(version));
            source.Append("Datatype\r\n");
            source.Append("{\r\n\r\n");
            source.Append("///<summary>\r\n");
            source.Append("/// <p>The HL7 ");
            source.Append(dataType);
            source.Append(" (");
            source.Append(description);
            source.Append(") data type.  Consists of the following components: </p><ol>\r\n");
            for (int i = 0; i < dataTypes.Length; i++)
            {
                source.Append("/// <li>");
                source.Append(GetDescription(descriptions[i]));
                source.Append(" (");
                source.Append(dataTypes[i]);
                source.Append(")</li>\r\n");
            }
            source.Append("/// </ol>\r\n");
            source.Append("///</summary>\r\n");
            source.Append("[Serializable]\r\n");
            source.Append("public class ");
            source.Append(dataType);
            source.Append(" : AbstractType, IComposite");
            source.Append("{\r\n");
            source.Append("\tprivate IType[] data;\r\n\r\n");
            source.Append("\t///<summary>\r\n");
            source.Append("\t/// Creates a ");
            source.Append(dataType);
            source.Append(".\r\n");
            source.Append("\t/// <param name=\"message\">The Message to which this Type belongs</param>\r\n");
            source.Append("\t///</summary>\r\n");
            source.Append("\tpublic ");
            source.Append(dataType);
            source.Append("(IMessage message) : this(message, null){}\r\n\r\n");
            source.Append("\t///<summary>\r\n");
            source.Append("\t/// Creates a ");
            source.Append(dataType);
            source.Append(".\r\n");
            source.Append("\t/// <param name=\"message\">The Message to which this Type belongs</param>\r\n");
            source.Append("\t/// <param name=\"description\">The description of this type</param>\r\n");
            source.Append("\t///</summary>\r\n");
            source.Append("\tpublic ");
            source.Append(dataType);
            source.Append("(IMessage message, string description) : base(message, description){\r\n");
            source.Append("\t\tdata = new IType[");
            source.Append(dataTypes.Length);
            source.Append("];\r\n");
            for (int i = 0; i < dataTypes.Length; i++)
            {
                source.Append("\t\tdata[");
                source.Append(i);
                source.Append("] = new ");
                source.Append(SourceGenerator.getAlternateType(dataTypes[i], version));
                if (dataTypes[i].Equals("ID") || dataTypes[i].Equals("IS"))
                {
                    source.Append("(message, ");
                    source.Append(tables[i]);
                }
                else
                {
                    source.Append("(message");
                }
                if (descriptions[i] != null && descriptions[i].Trim().Length > 0)
                {
                    string desc = descriptions[i];
                    desc = desc.Replace("\"", "'");
                    desc = desc.Substring(0, 1).ToUpper() + desc.Substring(1);
                    source.Append(",\"" + desc + "\"");
                }
                source.Append(")");
                source.Append(";\r\n");
            }
            source.Append("\t}\r\n\r\n");
            source.Append("\t///<summary>\r\n");
            source.Append("\t/// Returns an array containing the data elements.\r\n");
            source.Append("\t///</summary>\r\n");
            source.Append("\tpublic IType[] Components\r\n");
            source.Append("\t{ \r\n");
            source.Append("\t\tget{\r\n");
            source.Append("\t\t\treturn this.data; \r\n");
            source.Append("\t\t}\r\n");
            source.Append("\t}\r\n\r\n");
            source.Append("\t///<summary>\r\n");
            source.Append("\t/// Returns an individual data component.\r\n");
            source.Append("\t/// @throws DataTypeException if the given element number is out of range.\r\n");
            source.Append("\t///<param name=\"index\">The index item to get (zero based)</param>\r\n");
            source.Append("\t///<returns>The data component (as a type) at the requested number (ordinal)</returns>\r\n");
            source.Append("\t///</summary>\r\n");
            source.Append("\tpublic IType this[int index] { \r\n\r\n");
            source.Append("get{\r\n");
            source.Append("\t\ttry { \r\n");
            source.Append("\t\t\treturn this.data[index]; \r\n");
            source.Append("\t\t} catch (System.ArgumentOutOfRangeException) { \r\n");
            source.Append("\t\t\tthrow new DataTypeException(\"Element \" + index + \" doesn't exist in ");
            source.Append(dataTypes.Length);
            source.Append(" element ");
            source.Append(dataType);
            source.Append(" composite\"); \r\n");
            source.Append("\t\t} \r\n");
            source.Append("\t} \r\n");
            source.Append("\t} \r\n");
            //make type-specific accessors ...
            for (int i = 0; i < dataTypes.Length; i++)
            {
                String dtName = SourceGenerator.getAlternateType(dataTypes[i], version);
                source.Append("\t///<summary>\r\n");
                source.Append("\t/// Returns ");
                source.Append(GetDescription(descriptions[i]));
                source.Append(" (component #");
                source.Append(i);
                source.Append(").  This is a convenience method that saves you from \r\n");
                source.Append("\t/// casting and handling an exception.\r\n");
                source.Append("\t///</summary>\r\n");
                source.Append("\tpublic ");
                source.Append(dtName);
                source.Append(" ");
                source.Append(SourceGenerator.MakeAccessorName(descriptions[i]));
                bool duplicateField = descriptions.Count(element => GetDescription(element) == GetDescription(descriptions[i])) > 1;
                if (duplicateField)
                {
                    source.Append("_" + i);
                }
                source.Append(" {\r\n");
                source.Append("get{\r\n");
                source.Append("\t   ");
                source.Append(dtName);
                source.Append(" ret = null;\r\n");
                source.Append("\t   try {\r\n");
                source.Append("\t      ret = (");
                source.Append(dtName);
                source.Append(")this[");
                source.Append(i);
                source.Append("];\r\n");
                source.Append("\t   } catch (DataTypeException e) {\r\n");
                source.Append(
                    "\t      HapiLogFactory.GetHapiLog(this.GetType()).Error(\"Unexpected problem accessing known data type component - this is a bug.\", e);\r\n");
                source.Append("\t      throw new System.Exception(\"An unexpected error ocurred\",e);\r\n");
                source.Append("\t   }\r\n");
                source.Append("\t   return ret;\r\n");
                source.Append("}\r\n\r\n");
                source.Append("}\r\n");
            }

            /*if (correspondingControlInterface != null) {
             * source.append(Control.getImplementation(correspondingControlInterface, version));
             * } */
            source.Append("}");

            return(source.ToString());
        }