001    /**
002    The contents of this file are subject to the Mozilla Public License Version 1.1 
003    (the "License"); you may not use this file except in compliance with the License. 
004    You may obtain a copy of the License at http://www.mozilla.org/MPL/ 
005    Software distributed under the License is distributed on an "AS IS" basis, 
006    WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the 
007    specific language governing rights and limitations under the License. 
008    
009    The Original Code is "DefinitionLoader.java".  Description: 
010    "Loads definitions for RIM classes, attributes, and data types from the RIM database" 
011    
012    The Initial Developer of the Original Code is University Health Network. Copyright (C) 
013    2001.  All Rights Reserved. 
014    
015    Contributor(s): ______________________________________. 
016    
017    Alternatively, the contents of this file may be used under the terms of the 
018    GNU General Public License (the "GPL"), in which case the provisions of the GPL are 
019    applicable instead of those above.  If you wish to allow use of your version of this 
020    file only under the terms of the GPL and not to allow others to use your version 
021    of this file under the MPL, indicate your decision by deleting  the provisions above 
022    and replace  them with the notice and other provisions required by the GPL License.  
023    If you do not delete the provisions above, a recipient may use your version of 
024    this file under either the MPL or the GPL. 
025    
026    */
027    
028    package ca.uhn.hl7v3.sourcegen;
029    
030    import java.sql.*;
031    import java.util.ArrayList;
032    
033    /**
034     * Loads definitions for RIM classes, attributes, and data types from the RIM database.  
035     * The definition objects are used to generate source code for RIM classes.  
036     * @author Bryan Tripp
037     * @deprecated
038     */ 
039    public class DefinitionLoader {
040        
041        Connection conn;
042        
043        /** Creates a new instance of DefinitionLoader */
044        public DefinitionLoader(Connection conn) {
045            this.conn = conn;
046        }
047        
048        /** Looks up a list of RIM class names in the DB. */
049        public String[] getRIMClassNames() throws SQLException {
050            return getList("className", "RIM_class", null);
051        }
052        
053        /** Looks up a list of RIM data type names in the DB. */
054        public String[] getRIMDataTypeNames() throws SQLException {
055            return getList("datatype", "DT_datatypes", "where (datatypeKind = 'Composite' or datatypeKind = 'Generic' or datatypeKind = 'Primitive' or datatypeKind = 'Instance')");        
056        }
057        
058        /** 
059         * Looks up a list of items from the given table and field in the DB, using the 
060         * given where clause. The <code>where</code> argument should be null if there is 
061         * no where clause. 
062         */
063        private String[] getList(String field, String table, String where) throws SQLException {
064            String[] items = null;
065            Statement stmt = conn.createStatement();
066            StringBuffer sql = new StringBuffer();
067            sql.append("select ");
068            sql.append(field);
069            sql.append(" from ");
070            sql.append(table);
071            sql.append(" ");
072            if (where != null) sql.append(where);
073            
074            ResultSet rs = stmt.executeQuery(sql.toString());
075            ArrayList<String> tmpList = new ArrayList<String>(150);
076            while (rs.next()) {
077                tmpList.add(rs.getString(field));
078            }
079            items = new String[tmpList.size()];
080            for (int i = 0; i < items.length; i++) {
081                items[i] = (String) tmpList.get(i);
082            }
083            return items;                
084        }
085        
086        /** Creates a ClassDefinition for the given RIM class by looking up the required information in the DB. */
087        public ClassDefinition getRIMClassDef(String className) throws SQLException {
088            ClassDefinition def = new ClassDefinition();
089            StringBuffer sql = new StringBuffer();
090            sql.append("select description, isAbstractClass from RIM_class where className = '");
091            sql.append(className);
092            sql.append("'");
093            
094            Statement stmt = conn.createStatement();
095            ResultSet rs = stmt.executeQuery(sql.toString());
096            if (rs.next()) {
097                def.setName(className);
098                def.setDescription(rs.getString("description"));
099                def.setIsAbstract(rs.getBoolean("isAbstractClass"));
100                def.setSuperClass(getRIMSuperClass(className));
101            } else {
102                stmt.close();
103                throw new SQLException("RIM class " + className + " not found in database");
104            }
105            def.setAttributes(getRIMAttributes(className));
106            return def;
107        }
108        
109        /** Looks up a list of attributes for the given class and creates AttributeDefinitions by calling getRIMAttributeDef. */
110        public AttributeDefinition[] getRIMAttributes(String className) throws SQLException {
111            AttributeDefinition[] defs = null;
112            StringBuffer sql = new StringBuffer();
113            sql.append("select attName from RIM_attribute where className = '");
114            sql.append(className);
115            sql.append("'");
116            
117            Statement stmt = conn.createStatement();
118            ResultSet rs = stmt.executeQuery(sql.toString());
119            ArrayList<String> attNames = new ArrayList<String>(20);
120            while (rs.next()) {
121                attNames.add(rs.getString("attName"));
122            }
123            stmt.close();
124            
125            defs = new AttributeDefinition[attNames.size()];
126            for (int i = 0; i < defs.length; i++) {
127                defs[i] = getRIMAttributeDef(className, (String) attNames.get(i));
128            }
129                
130            return defs;
131        }
132        
133        /** Creates an AttributeDefinition for the given attribute by looking up the required information in the DB. */
134        public AttributeDefinition getRIMAttributeDef(String className, String attributeName) throws SQLException {
135            AttributeDefinition def = new AttributeDefinition();
136            StringBuffer sql = new StringBuffer();
137            sql.append("select attDatatype, description from RIM_attribute where className = '");
138            sql.append(className);
139            sql.append("' and attName = '");
140            sql.append(attributeName);
141            sql.append("'");
142            
143            Statement stmt = conn.createStatement();
144            ResultSet rs = stmt.executeQuery(sql.toString());
145            if (rs.next()) {        
146                def.setDataType(rs.getString("attDatatype"));
147                def.setName(attributeName);
148                def.setDescription(rs.getString("description"));
149            } else {
150                stmt.close();
151                throw new SQLException("Attribute " + attributeName + " of RIM class " + className + " not found in database");
152            }
153            stmt.close();
154            return def;
155        }
156        
157        /** Looks up and returns this RIM class' superclass. */
158        public String getRIMSuperClass(String className) throws SQLException {
159            String superClass = null;
160            StringBuffer sql = new StringBuffer();
161            sql.append("select sourceClassName from RIM_relationship where destClassName = '");
162            sql.append(className);
163            sql.append("' and relnName = 'generalizes'");
164            
165            Statement stmt = conn.createStatement();
166            ResultSet rs = stmt.executeQuery(sql.toString());
167            if (rs.next()) {
168                superClass = rs.getString("sourceClassName");
169            }
170            stmt.close();
171            return superClass;
172        }
173        
174        public DataTypeDefinition getDataTypeDef(String className) throws SQLException {
175            DataTypeDefinition def = null;
176            StringBuffer sql = new StringBuffer();
177            sql.append("select datatypeName, description, datatypeKind from DT_datatypes where datatype = '");
178            sql.append(className);
179            sql.append("'");
180            
181            Statement stmt = conn.createStatement();
182            ResultSet rs = stmt.executeQuery(sql.toString());
183            if (rs.next()) {
184                def = new DataTypeDefinition();
185                def.setName(className);
186                def.setLongName(rs.getString("datatypeName"));
187                def.setDescription(rs.getString("description"));
188                def.setType(rs.getString("datatypeKind"));
189                if (def.getType().equalsIgnoreCase("Composite")) {
190                    def.setComponents(getComponentDefs(className));
191                }
192                def.setSuperClass(getDTSuperClass(className));
193            }
194            stmt.close();
195            
196            return def;
197        }
198        
199        public ComponentDefinition[] getComponentDefs(String className) throws SQLException {
200            StringBuffer sql = new StringBuffer(); 
201            sql.append("select componentName, componentDT, description from DT_component where parentDT = '");
202            sql.append(className);
203            sql.append("'");
204    
205            Statement stmt = conn.createStatement();
206            ResultSet rs = stmt.executeQuery(sql.toString());
207            ArrayList<ComponentDefinition> list = new ArrayList<ComponentDefinition>();
208            while (rs.next()) {
209                ComponentDefinition def = new ComponentDefinition();
210                def.setName(rs.getString("componentName"));
211                def.setDataType(rs.getString("componentDT"));
212                def.setDescription(rs.getString("description"));
213                list.add(def);
214            }
215    
216            ComponentDefinition[] defs = new ComponentDefinition[list.size()];        
217            for (int i = 0; i < defs.length; i++) {
218                defs[i] = (ComponentDefinition) list.get(i);
219            }
220            
221            return defs; 
222        }
223        
224        /** Looks up the superclass of the given RIM datatype, returns null if there isn't one. */
225        public String getDTSuperClass(String dataType) throws SQLException {
226            String superClass = null;
227            StringBuffer sql = new StringBuffer();
228            sql.append("select superDT from DT_generalization where subDT = '");
229            sql.append(dataType);
230            sql.append("'");
231            
232            Statement stmt = conn.createStatement();
233            ResultSet rs = stmt.executeQuery(sql.toString());
234            if (rs.next()) {
235                superClass = rs.getString("superDT");
236            }
237            stmt.close();
238            
239            return superClass;
240        }
241            
242        public static void main(String args[]) {
243            if (args.length != 1) {
244                System.out.println("Usage: DefinitionLoader RIM_class");
245                System.exit(1);
246            }
247            
248            try {
249                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
250                Connection conn = DriverManager.getConnection("jdbc:odbc:RIM");
251                DefinitionLoader dl = new DefinitionLoader(conn);
252                //CMPAttributeGenerator gen = new CMPAttributeGenerator();
253                //AttributeDefinition def = dl.getRIMAttributeDef(args[0], args[1]);
254                //System.out.println(gen.makeBeanCode(def));
255                /*ClassDefinition cd = dl.getRIMClassDef(args[0]);
256                CMPClassGenerator gen = new CMPClassGenerator();
257                System.out.println(gen.makeRemoteCode(cd));
258                System.out.println(gen.makeHomeCode(cd));
259                System.out.println(gen.makeBeanCode(cd));
260                */
261                
262                DataTypeDefinition def = dl.getDataTypeDef(args[0]);
263                DataTypeGenerator gen = new DataTypeGenerator();
264                System.out.println(gen.makeDataType(def));
265            } catch (Exception e) {
266                e.printStackTrace();
267            }
268            
269        }
270        
271        
272    }