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