001 package ca.uhn.hl7v2.model; 002 003 import ca.uhn.hl7v2.parser.ModelClassFactory; 004 import ca.uhn.hl7v2.parser.Parser; 005 import ca.uhn.hl7v2.HL7Exception; 006 import ca.uhn.log.*; 007 008 /** 009 * A generic HL7 message, meant for parsing message with unrecognized structures 010 * into a flat list of segments. 011 * @author Bryan Tripp 012 */ 013 public abstract class GenericMessage extends AbstractMessage { 014 015 /** 016 * Creates a new instance of GenericMessage. 017 * 018 * @param factory class factory for contained structures 019 */ 020 public GenericMessage(ModelClassFactory factory) { 021 super(factory); 022 try { 023 this.addNonstandardSegment("MSH"); 024 } catch(HL7Exception e) { 025 String message = "Unexpected error adding GenericSegment to GenericMessage."; 026 HapiLogFactory.getHapiLog(this.getClass()).error(message, e); 027 throw new Error(message); 028 } 029 } 030 031 /** 032 * Returns a subclass of GenericMessage corresponding to a certain version. 033 * This is needed so that version-specific segments can be added as the message 034 * is parsed. 035 */ 036 public static Class getGenericMessageClass(String version) { 037 if (!Parser.validVersion(version)) 038 throw new IllegalArgumentException("The version " + version + " is not recognized"); 039 040 Class c = null; 041 if (version.equals("2.1")) { 042 c = V21.class; 043 } else if (version.equals("2.2")) { 044 c = V22.class; 045 } else if (version.equals("2.3")) { 046 c = V23.class; 047 } else if (version.equals("2.3.1")) { 048 c = V231.class; 049 } else if (version.equals("2.4")) { 050 c = V24.class; 051 } else if (version.equals("2.5")) { 052 c = V25.class; 053 } else if (version.equals("2.5.1")) { 054 c = V251.class; 055 } else if (version.equals("2.6")) { 056 c = V26.class; 057 } else { 058 return UnknownVersion.class; 059 } 060 return c; 061 } 062 063 public static class UnknownVersion extends GenericMessage { 064 private static final long serialVersionUID = 4773366840392833956L; 065 066 public UnknownVersion(ModelClassFactory factory) { 067 super(factory); 068 } 069 public String getVersion() { 070 // FIXME: use from somewhere 071 return "2.6"; 072 } 073 074 } 075 076 public static class V21 extends GenericMessage { 077 private static final long serialVersionUID = 4773366840392833956L; 078 public V21(ModelClassFactory factory) { 079 super(factory); 080 } 081 public String getVersion() { return "2.1"; } 082 } 083 084 public static class V22 extends GenericMessage { 085 private static final long serialVersionUID = 7124224621400437244L; 086 public V22(ModelClassFactory factory) { 087 super(factory); 088 } 089 public String getVersion() { return "2.2"; } 090 } 091 092 public static class V23 extends GenericMessage { 093 private static final long serialVersionUID = -8794048442253389190L; 094 public V23(ModelClassFactory factory) { 095 super(factory); 096 } 097 public String getVersion() { return "2.3"; } 098 } 099 100 public static class V231 extends GenericMessage { 101 private static final long serialVersionUID = 5979370667795858995L; 102 public V231(ModelClassFactory factory) { 103 super(factory); 104 } 105 public String getVersion() { return "2.3.1"; } 106 } 107 108 public static class V24 extends GenericMessage { 109 private static final long serialVersionUID = -4944772617600551061L; 110 public V24(ModelClassFactory factory) { 111 super(factory); 112 } 113 public String getVersion() { return "2.4"; } 114 } 115 116 public static class V25 extends GenericMessage { 117 private static final long serialVersionUID = 3937051332672967947L; 118 public V25(ModelClassFactory factory) { 119 super(factory); 120 } 121 public String getVersion() { return "2.5"; } 122 } 123 124 public static class V251 extends GenericMessage { 125 private static final long serialVersionUID = -767282165482145544L; 126 public V251(ModelClassFactory factory) { 127 super(factory); 128 } 129 public String getVersion() { return "2.5.1"; } 130 } 131 132 public static class V26 extends GenericMessage { 133 private static final long serialVersionUID = -1693277295151324396L; 134 public V26(ModelClassFactory factory) { 135 super(factory); 136 } 137 public String getVersion() { return "2.6"; } 138 } 139 140 }