001    package org.mesopotamia.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 creates core Mesopotamia database structurs.
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                                    // Shared text
026                                    "biz/hammurapi/persistence/ChunkingStringStorage.sql",
027                                    
028                                    // Core Mesopotamia 
029                                    "org/mesopotamia/Mesopotamia.sql",
030                                    "org/mesopotamia/GlobalParameters.sql"
031                                    
032                    };
033                    
034                    ClassLoader classLoader=InitDatabase.class.getClassLoader();
035                    for (int i=0; i<sqlResources.length; i++) {
036                            String resourceName = sqlResources[i];
037                            System.out.println("Loading "+resourceName);
038                            InputStream rStream = classLoader.getResourceAsStream(resourceName);
039                            if (rStream==null) {
040                                    System.err.println("Resource not found: "+resourceName);
041                                    return false;
042                            }
043                            Reader r=new InputStreamReader(rStream);
044                            try {
045                                    try {
046                                            processor.executeScript(r);
047                                    } finally {
048                                            r.close();
049                                    }
050                            } catch (IOException e) {                               
051                                    throw new SQLExceptionEx("Cannot intialize database: "+e, e);
052                            }
053                    }       
054                    return true;
055            }
056            
057            /**
058             * Connects to database and initializes it.
059             * Connects to HSQLDB on localhost with user sa and empty password.
060             * @param args Optional first parameter is database name.
061             * @throws SQLException 
062             * @throws ClassNotFoundException 
063             */
064            public static void main(String[] args) throws Exception {
065                    System.out.println("Usage: java [options] org.mesopotamia.util.InitDatabase ");
066                    // Create empty data source.
067                    HsqldbServerDataSource ds = new HsqldbServerDataSource(args.length==0 ? "localhost" : args[0], args.length<2 ? "sa" : args[1], args.length<3 ? "" : args[2], null);
068                    SQLProcessor processor = new SQLProcessor(ds, null);
069                    processor.executeTransaction(new InitDatabase());
070                    ds.shutdown();
071            }
072    }