001    package org.mesopotamia.lang.java.util;
002    
003    import java.io.IOException;
004    import java.io.InputStream;
005    import java.io.InputStreamReader;
006    import java.io.Reader;
007    import java.sql.SQLException;
008    
009    import biz.hammurapi.sql.SQLExceptionEx;
010    import biz.hammurapi.sql.SQLProcessor;
011    import biz.hammurapi.sql.Transaction;
012    import biz.hammurapi.sql.hsqldb.HsqldbServerDataSource;
013    
014    
015    /**
016     * This utility class populates Mesopotamia table with Java-specific data.
017     * @author Pavel Vlasov
018     *
019     */
020    public class InitDatabase implements Transaction {
021    
022            public boolean execute(SQLProcessor processor) throws SQLException {
023                    // Populate database
024                    String[] sqlResources= {
025                                    // Set schema
026                                    "org/mesopotamia/Init.sql",
027                                    
028                                    // Java 1.3 
029                                    "org/mesopotamia/lang/java/v13/language.sql",
030                                    "org/mesopotamia/lang/java/v13/tokenTypes.sql",
031                                    "org/mesopotamia/lang/java/v13/tokenTypesUpdate.sql",
032                                    "org/mesopotamia/lang/java/v13/loaders.sql",
033                                    "org/mesopotamia/lang/java/v13/languageElementClass.sql",               
034                                    
035                                    // Java 1.4 
036                                    "org/mesopotamia/lang/java/v14/language.sql",
037                                    "org/mesopotamia/lang/java/v14/tokenTypes.sql",
038                                    "org/mesopotamia/lang/java/v14/tokenTypesUpdate.sql",
039                                    "org/mesopotamia/lang/java/v14/loaders.sql",
040                                    "org/mesopotamia/lang/java/v14/languageElementClass.sql",               
041                                    
042                                    // Java 5 
043                                    "org/mesopotamia/lang/java/v5/language.sql",
044                                    "org/mesopotamia/lang/java/v5/tokenTypes.sql",
045                                    "org/mesopotamia/lang/java/v5/tokenTypesUpdate.sql",
046                                    "org/mesopotamia/lang/java/v5/loaders.sql",
047                                    "org/mesopotamia/lang/java/v5/languageElementClass.sql"         
048                                    
049                    };
050                    
051                    ClassLoader classLoader=InitDatabase.class.getClassLoader();
052                    for (int i=0; i<sqlResources.length; i++) {
053                            String resourceName = sqlResources[i];
054                            System.out.println("Loading "+resourceName);
055                            InputStream rStream = classLoader.getResourceAsStream(resourceName);
056                            if (rStream==null) {
057                                    System.err.println("Resource not found: "+resourceName);
058                                    return false;
059                            }
060                            Reader r=new InputStreamReader(rStream);
061                            try {
062                                    try {
063                                            processor.executeScript(r);
064                                    } finally {
065                                            r.close();
066                                    }
067                            } catch (IOException e) {                               
068                                    throw new SQLExceptionEx("Cannot intialize database: "+e, e);
069                            }
070                    }       
071                    return true;
072            }
073            
074            /**
075             * Connects to database and initializes it.
076             * Connects to HSQLDB on localhost with user sa and empty password.
077             * @param args Optional first parameter is database name.
078             * @throws SQLException 
079             * @throws ClassNotFoundException 
080             */
081            public static void main(String[] args) throws Exception {
082                    System.out.println("Usage: java [options] org.mesopotamia.lang.java.util.InitDatabase ");
083                    // Create empty data source.
084                    HsqldbServerDataSource ds = new HsqldbServerDataSource(
085                                    args.length==0 ? "localhost" : args[0], 
086                                    args.length<2 ? "sa" : args[1], 
087                                    args.length<3 ? "" : args[2], 
088                                    null);
089                    
090                    SQLProcessor processor = new SQLProcessor(ds, null);
091                    processor.executeTransaction(new InitDatabase());
092                    ds.shutdown();
093            }
094    }