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}