View Javadoc

1   /*
2    * Copyright 2007 The Kuali Foundation
3    * 
4    * Licensed under the Educational Community License, Version 2.0 (the "License"); you may not use this file except in
5    * compliance with the License. You may obtain a copy of the License at
6    * 
7    * http://www.opensource.org/licenses/ecl2.php
8    * 
9    * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS
10   * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
11   * language governing permissions and limitations under the License.
12   */
13  package org.kuali.rice.test;
14  
15  import java.io.BufferedReader;
16  import java.io.InputStreamReader;
17  import java.sql.Connection;
18  import java.sql.SQLException;
19  import java.sql.Statement;
20  
21  import org.apache.commons.lang.StringUtils;
22  import org.apache.log4j.Logger;
23  import org.springframework.core.io.DefaultResourceLoader;
24  import org.springframework.jdbc.core.ConnectionCallback;
25  import org.springframework.jdbc.core.JdbcTemplate;
26  import org.springframework.transaction.TransactionStatus;
27  import org.springframework.transaction.support.TransactionCallback;
28  import org.springframework.transaction.support.TransactionTemplate;
29  
30  public class SQLDataLoader {
31  
32      private static final Logger LOG = Logger.getLogger(SQLDataLoader.class);
33      public static final String SQL_LINE_COMMENT_PREFIX = "--";
34  
35      private String fileLoc;
36      private String seperatorChar;
37      private String statement;
38  
39      public SQLDataLoader(String statement) {
40          this.fileLoc = null;
41          this.seperatorChar = null;
42          this.statement = statement;
43      }
44  
45      public SQLDataLoader(String fileLoc, String seperatorChar) {
46          this.fileLoc = fileLoc;
47          this.seperatorChar = seperatorChar;
48          this.statement = null;
49      }
50  
51      public void runSql() throws Exception {
52          String[] sqlStatements = null;
53          if (statement == null) {
54              String sqlStatementsContent = getContentsAsString(fileLoc);
55              // separator char must be the last non-whitespace char on the line
56              // to avoid splitting in the middle of data that might contain the separator char
57              sqlStatements = sqlStatementsContent.split("(?m)" + getSeperatorChar() + "\\s*$");
58          } else {
59              sqlStatements = new String[]{statement};
60          }
61          final String[] finalSqlStatements = sqlStatements;
62          new TransactionTemplate(TestHarnessServiceLocator.getJtaTransactionManager()).execute(new TransactionCallback() {
63              public Object doInTransaction(TransactionStatus status) {
64                  return new JdbcTemplate(TestHarnessServiceLocator.getDataSource()).execute(new ConnectionCallback() {
65                      public Object doInConnection(Connection connection) throws SQLException {
66                          Statement statement = connection.createStatement();
67                          LOG.info("################################");
68                          LOG.info(fileLoc != null ? "#" + fileLoc : "#");
69                          LOG.info("#");
70                          for (String sqlStatement : finalSqlStatements) {
71                              if (StringUtils.isNotBlank(sqlStatement)) {
72                                  LOG.info("# Executing sql statement ->" + sqlStatement + "<-");
73                                  statement.execute(sqlStatement);
74                              }
75                          }
76                          LOG.info("#");
77                          LOG.info("#");
78                          LOG.info("################################");
79                          statement.close();
80                          return null;
81                      }
82                  });
83              }
84          });
85      }
86  
87      private String getContentsAsString(String fileLoc) throws Exception {
88          DefaultResourceLoader resourceLoader = new DefaultResourceLoader();
89          String data = "";
90          BufferedReader reader = null;
91          try {
92              reader = new BufferedReader(new InputStreamReader(resourceLoader.getResource(fileLoc).getInputStream()));
93              String line = "";
94              while ((line = reader.readLine()) != null) {
95                  // discard comments...commented single line statements
96                  // will result in errors when executed because there are no
97                  // results
98                  if (!line.trim().startsWith(SQL_LINE_COMMENT_PREFIX)) {
99                      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 }