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 }