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