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 * 014 * @author Bryan Tripp 015 * @author Christian Ohr 016 */ 017@SuppressWarnings("serial") 018public abstract class GenericMessage extends AbstractMessage { 019 020 private static final Logger log = LoggerFactory.getLogger(GenericMessage.class); 021 022 /** 023 * Creates a new instance of GenericMessage. 024 * 025 * @param factory class factory for contained structures 026 */ 027 public GenericMessage(ModelClassFactory factory) { 028 super(factory); 029 try { 030 this.addNonstandardSegment("MSH"); 031 } catch(HL7Exception e) { 032 String message = "Unexpected error adding GenericSegment to GenericMessage."; 033 log.error(message, e); 034 throw new Error(message); // TODO better throw RuntimeException 035 } 036 } 037 038 /** 039 * Returns a subclass of GenericMessage corresponding to a certain version. 040 * This is needed so that version-specific segments can be added as the message 041 * is parsed. 042 * 043 * @param version the HL7 version 044 * @return the class of the generic message 045 */ 046 @SuppressWarnings("unchecked") 047 public static Class<? extends Message> getGenericMessageClass(String version) { 048 049 Version v = Version.versionOf(version); 050 if (v != null) { 051 try { 052 String className = GenericMessage.class.getName() + "$" + v.name(); 053 return (Class<? extends Message>)Class.forName(className); 054 } catch (ClassNotFoundException e) { 055 // should not happen as long Version corresponds with the static 056 // subclasses of GenericMessage 057 } 058 } 059 060 log.debug("Unknown version for generic type {}", version); 061 return UnknownVersion.class; 062 } 063 064 065 public static class UnknownVersion extends GenericMessage { 066 private static final long serialVersionUID = 4773366840392833956L; 067 068 public UnknownVersion(ModelClassFactory factory) { 069 super(factory); 070 } 071 public String getVersion() { 072 return Version.latestVersion().getVersion(); 073 } 074 075 } 076 077 public static class V21 extends GenericMessage { 078 private static final long serialVersionUID = 4773366840392833956L; 079 public V21(ModelClassFactory factory) { 080 super(factory); 081 } 082 public String getVersion() { return Version.V21.getVersion(); } 083 } 084 085 public static class V22 extends GenericMessage { 086 private static final long serialVersionUID = 7124224621400437244L; 087 public V22(ModelClassFactory factory) { 088 super(factory); 089 } 090 public String getVersion() { return Version.V22.getVersion(); } 091 } 092 093 public static class V23 extends GenericMessage { 094 private static final long serialVersionUID = -8794048442253389190L; 095 public V23(ModelClassFactory factory) { 096 super(factory); 097 } 098 public String getVersion() { return Version.V23.getVersion(); } 099 } 100 101 public static class V231 extends GenericMessage { 102 private static final long serialVersionUID = 5979370667795858995L; 103 public V231(ModelClassFactory factory) { 104 super(factory); 105 } 106 public String getVersion() { return Version.V231.getVersion(); } 107 } 108 109 public static class V24 extends GenericMessage { 110 private static final long serialVersionUID = -4944772617600551061L; 111 public V24(ModelClassFactory factory) { 112 super(factory); 113 } 114 public String getVersion() { return Version.V24.getVersion(); } 115 } 116 117 public static class V25 extends GenericMessage { 118 private static final long serialVersionUID = 3937051332672967947L; 119 public V25(ModelClassFactory factory) { 120 super(factory); 121 } 122 public String getVersion() { return Version.V25.getVersion(); } 123 } 124 125 public static class V251 extends GenericMessage { 126 private static final long serialVersionUID = -767282165482145544L; 127 public V251(ModelClassFactory factory) { 128 super(factory); 129 } 130 public String getVersion() { return Version.V251.getVersion(); } 131 } 132 133 public static class V26 extends GenericMessage { 134 private static final long serialVersionUID = -1693277295151324396L; 135 public V26(ModelClassFactory factory) { 136 super(factory); 137 } 138 public String getVersion() { return Version.V26.getVersion(); } 139 } 140 141}