001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    
018    package org.apache.geronimo.connector;
019    
020    import java.io.BufferedReader;
021    import java.io.InputStream;
022    import java.io.InputStreamReader;
023    import java.net.URL;
024    import java.sql.Connection;
025    import java.sql.SQLException;
026    import java.sql.Statement;
027    
028    import javax.sql.DataSource;
029    
030    import org.apache.geronimo.connector.outbound.ConnectionFactorySource;
031    import org.apache.geronimo.gbean.GBeanInfo;
032    import org.apache.geronimo.gbean.GBeanInfoBuilder;
033    import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
034    
035    /**
036     * @version $Rev: 550546 $ $Date: 2007-06-25 12:52:11 -0400 (Mon, 25 Jun 2007) $
037     */
038    public class DatabaseInitializationGBean {
039    
040    
041        public DatabaseInitializationGBean(String testSQL, String path, ConnectionFactorySource cfSource, ClassLoader classLoader) throws Exception {
042    
043            DataSource ds = (DataSource) cfSource.$getResource();
044            Connection c = ds.getConnection();
045            try {
046                Statement s = c.createStatement();
047                try {
048                    try {
049                        s.execute(testSQL);
050                        //script does not need to be run
051                        return;
052                    } catch (SQLException e) {
053                        //script needs to be run
054                    }
055                    URL sourceURL = classLoader.getResource(path);
056                    InputStream ins = sourceURL.openStream();
057                    BufferedReader r = new BufferedReader(new InputStreamReader(ins));
058                    try {
059                        String line;
060                        StringBuffer buf = new StringBuffer();
061                        while ((line = r.readLine()) != null) {
062                            line = line.trim();
063                            if (!line.startsWith("--") && line.length() > 0) {
064                                buf.append(line).append(" ");
065                                if (line.endsWith(";")) {
066                                    int size = buf.length();
067                                    buf.delete(size - 2, size - 1);
068                                    String sql = buf.toString();
069                                    s.execute(sql);
070                                    buf = new StringBuffer();
071                                }
072                            }
073                        }
074                    } finally {
075                        r.close();
076                    }
077                } finally {
078                    s.close();
079                }
080            } finally {
081                c.close();
082            }
083    
084        }
085    
086        public static final GBeanInfo GBEAN_INFO;
087    
088        static {
089            GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(DatabaseInitializationGBean.class, "GBean");
090            infoBuilder.addAttribute("testSQL", String.class, true);
091            infoBuilder.addAttribute("path", String.class, true);
092            infoBuilder.addReference("DataSource", ConnectionFactorySource.class, NameFactory.JCA_MANAGED_CONNECTION_FACTORY);
093            infoBuilder.addAttribute("classLoader", ClassLoader.class, false);
094    
095            infoBuilder.setConstructor(new String[]{"testSQL", "path", "DataSource", "classLoader"});
096    
097            GBEAN_INFO = infoBuilder.getBeanInfo();
098        }
099    
100        public static GBeanInfo getGBeanInfo() {
101            return GBEAN_INFO;
102        }
103    
104    }