001    package ca.uhn.hl7v2.model;
002    
003    import ca.uhn.hl7v2.parser.ModelClassFactory;
004    import ca.uhn.hl7v2.parser.Parser;
005    import ca.uhn.hl7v2.HL7Exception;
006    import ca.uhn.log.*;
007    
008    /**
009     * A generic HL7 message, meant for parsing message with unrecognized structures
010     * into a flat list of segments.
011     * @author Bryan Tripp
012     */
013    public abstract class GenericMessage extends AbstractMessage {
014        
015        /** 
016         * Creates a new instance of GenericMessage. 
017         * 
018         * @param factory class factory for contained structures 
019         */
020        public GenericMessage(ModelClassFactory factory) {
021            super(factory);
022            try {
023                this.addNonstandardSegment("MSH");
024            } catch(HL7Exception e) {
025                String message = "Unexpected error adding GenericSegment to GenericMessage.";
026                HapiLogFactory.getHapiLog(this.getClass()).error(message, e);
027                throw new Error(message);
028            }        
029        }
030        
031        /**
032         * Returns a subclass of GenericMessage corresponding to a certain version.  
033         * This is needed so that version-specific segments can be added as the message
034         * is parsed.  
035         */
036        public static Class getGenericMessageClass(String version) {
037            if (!Parser.validVersion(version))
038                throw new IllegalArgumentException("The version " + version + " is not recognized");
039            
040            Class c = null;
041            if (version.equals("2.1")) {
042                c = V21.class;
043            } else if (version.equals("2.2")) {
044                c = V22.class;
045            } else if (version.equals("2.3")) {
046                c = V23.class;
047            } else if (version.equals("2.3.1")) {
048                c = V231.class;
049            } else if (version.equals("2.4")) {
050                c = V24.class;
051            } else if (version.equals("2.5")) {
052                c = V25.class;
053            } else if (version.equals("2.5.1")) {
054                c = V251.class;
055            } else if (version.equals("2.6")) {
056                c = V26.class;
057            } else {
058                    return UnknownVersion.class;
059            }
060            return c;
061        }
062    
063        public static class UnknownVersion extends GenericMessage {
064                    private static final long serialVersionUID = 4773366840392833956L;
065    
066                    public UnknownVersion(ModelClassFactory factory) {
067                super(factory);
068            }
069            public String getVersion() {
070                    // FIXME: use from somewhere
071                    return "2.6";
072            }
073    
074        }
075    
076        public static class V21 extends GenericMessage {
077                    private static final long serialVersionUID = 4773366840392833956L;
078                    public V21(ModelClassFactory factory) {
079                super(factory);
080            }
081            public String getVersion() { return "2.1"; }
082        }
083        
084        public static class V22 extends GenericMessage {
085                    private static final long serialVersionUID = 7124224621400437244L;
086                    public V22(ModelClassFactory factory) {
087                super(factory);
088            }
089            public String getVersion() { return "2.2"; }
090        }
091        
092        public static class V23 extends GenericMessage {
093                    private static final long serialVersionUID = -8794048442253389190L;
094                    public V23(ModelClassFactory factory) {
095                super(factory);
096            }
097            public String getVersion() { return "2.3"; }
098        }
099        
100        public static class V231 extends GenericMessage {
101                    private static final long serialVersionUID = 5979370667795858995L;
102                    public V231(ModelClassFactory factory) {
103                super(factory);
104            }
105            public String getVersion() { return "2.3.1"; }
106        }
107        
108        public static class V24 extends GenericMessage {
109                    private static final long serialVersionUID = -4944772617600551061L;
110                    public V24(ModelClassFactory factory) {
111                super(factory);
112            }
113            public String getVersion() { return "2.4"; }
114        }
115        
116        public static class V25 extends GenericMessage {
117                    private static final long serialVersionUID = 3937051332672967947L;
118                    public V25(ModelClassFactory factory) {
119                super(factory);
120            }
121            public String getVersion() { return "2.5"; }
122        }
123        
124        public static class V251 extends GenericMessage {
125                    private static final long serialVersionUID = -767282165482145544L;
126                    public V251(ModelClassFactory factory) {
127                super(factory);
128            }
129            public String getVersion() { return "2.5.1"; }
130        }
131    
132        public static class V26 extends GenericMessage {
133                    private static final long serialVersionUID = -1693277295151324396L;
134                    public V26(ModelClassFactory factory) {
135                super(factory);
136            }
137            public String getVersion() { return "2.6"; }
138        }
139    
140    }