001package ca.uhn.hl7v2.model; 002 003import org.slf4j.Logger; 004import org.slf4j.LoggerFactory; 005 006import ca.uhn.hl7v2.HL7Exception; 007import ca.uhn.hl7v2.Version; 008import 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") 016public 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}