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    }