001    /*
002     * Copyright 2007 The Kuali Foundation
003     * 
004     * Licensed under the Educational Community License, Version 2.0 (the "License"); you may not use this file except in
005     * compliance with the License. You may obtain a copy of the License at
006     * 
007     * http://www.opensource.org/licenses/ecl2.php
008     * 
009     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS
010     * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
011     * language governing permissions and limitations under the License.
012     */
013    package org.kuali.rice.test;
014    
015    import java.io.BufferedReader;
016    import java.io.InputStreamReader;
017    import java.sql.Connection;
018    import java.sql.SQLException;
019    import java.sql.Statement;
020    
021    import org.apache.commons.lang.StringUtils;
022    import org.apache.log4j.Logger;
023    import org.springframework.core.io.DefaultResourceLoader;
024    import org.springframework.jdbc.core.ConnectionCallback;
025    import org.springframework.jdbc.core.JdbcTemplate;
026    import org.springframework.transaction.TransactionStatus;
027    import org.springframework.transaction.support.TransactionCallback;
028    import org.springframework.transaction.support.TransactionTemplate;
029    
030    public class SQLDataLoader {
031    
032        private static final Logger LOG = Logger.getLogger(SQLDataLoader.class);
033        public static final String SQL_LINE_COMMENT_PREFIX = "--";
034    
035        private String fileLoc;
036        private String seperatorChar;
037        private String statement;
038    
039        public SQLDataLoader(String statement) {
040            this.fileLoc = null;
041            this.seperatorChar = null;
042            this.statement = statement;
043        }
044    
045        public SQLDataLoader(String fileLoc, String seperatorChar) {
046            this.fileLoc = fileLoc;
047            this.seperatorChar = seperatorChar;
048            this.statement = null;
049        }
050    
051        public void runSql() throws Exception {
052            String[] sqlStatements = null;
053            if (statement == null) {
054                String sqlStatementsContent = getContentsAsString(fileLoc);
055                // separator char must be the last non-whitespace char on the line
056                // to avoid splitting in the middle of data that might contain the separator char
057                sqlStatements = sqlStatementsContent.split("(?m)" + getSeperatorChar() + "\\s*$");
058            } else {
059                sqlStatements = new String[]{statement};
060            }
061            final String[] finalSqlStatements = sqlStatements;
062            new TransactionTemplate(TestHarnessServiceLocator.getJtaTransactionManager()).execute(new TransactionCallback() {
063                public Object doInTransaction(TransactionStatus status) {
064                    return new JdbcTemplate(TestHarnessServiceLocator.getDataSource()).execute(new ConnectionCallback() {
065                        public Object doInConnection(Connection connection) throws SQLException {
066                            Statement statement = connection.createStatement();
067                            LOG.info("################################");
068                            LOG.info(fileLoc != null ? "#" + fileLoc : "#");
069                            LOG.info("#");
070                            for (String sqlStatement : finalSqlStatements) {
071                                if (StringUtils.isNotBlank(sqlStatement)) {
072                                    LOG.info("# Executing sql statement ->" + sqlStatement + "<-");
073                                    statement.execute(sqlStatement);
074                                }
075                            }
076                            LOG.info("#");
077                            LOG.info("#");
078                            LOG.info("################################");
079                            statement.close();
080                            return null;
081                        }
082                    });
083                }
084            });
085        }
086    
087        private String getContentsAsString(String fileLoc) throws Exception {
088            DefaultResourceLoader resourceLoader = new DefaultResourceLoader();
089            String data = "";
090            BufferedReader reader = null;
091            try {
092                reader = new BufferedReader(new InputStreamReader(resourceLoader.getResource(fileLoc).getInputStream()));
093                String line = "";
094                while ((line = reader.readLine()) != null) {
095                    // discard comments...commented single line statements
096                    // will result in errors when executed because there are no
097                    // results
098                    if (!line.trim().startsWith(SQL_LINE_COMMENT_PREFIX)) {
099                        data += line + "\r\n ";
100                    }
101                }
102            } finally {
103                if (reader != null) {
104                    try {
105                        reader.close();
106                    } catch (Exception e) {
107                        LOG.error(e);
108                    }
109                }
110    
111            }
112            return data;
113        }
114    
115        public String getSeperatorChar() {
116            if (this.seperatorChar == null) {
117                return ";";
118            }
119            return seperatorChar;
120        }
121    
122    }