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}