com.freetmp.maven.mbg.extend.plugin.SqlScriptRunner Maven / Gradle / Ivy
/*
* Copyright 2009 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.freetmp.maven.mbg.extend.plugin;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.mybatis.generator.internal.util.StringUtility;
import org.mybatis.generator.internal.util.messages.Messages;
/**
* This class is used to execute an SQL script before a code generation
* run if necessary. Note that this class mainly exists to support the
* MyBatis Generator build. It is intentionally not documented and not
* supported.
*
* @author Jeff Butler
*/
public class SqlScriptRunner {
private String driver;
private String url;
private String userid;
private String password;
private String sourceFile;
private Log log;
public SqlScriptRunner(String sourceFile, String driver, String url,
String userId, String password) throws MojoExecutionException {
if (!StringUtility.stringHasValue(sourceFile)) {
throw new MojoExecutionException("SQL script file is required");
}
if (!StringUtility.stringHasValue(driver)) {
throw new MojoExecutionException("JDBC Driver is required");
}
if (!StringUtility.stringHasValue(url)) {
throw new MojoExecutionException("JDBC URL is required");
}
this.sourceFile = sourceFile;
this.driver = driver;
this.url = url;
this.userid = userId;
this.password = password;
}
public void executeScript() throws MojoExecutionException {
Connection connection = null;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, userid, password);
Statement statement = connection.createStatement();
BufferedReader br = getScriptReader();
String sql;
while ((sql = readStatement(br)) != null) {
statement.execute(sql);
}
closeStatement(statement);
connection.commit();
br.close();
} catch (ClassNotFoundException e) {
throw new MojoExecutionException("Class not found: " + e.getMessage());
} catch (FileNotFoundException e) {
throw new MojoExecutionException("File note found: " + sourceFile);
} catch (SQLException e) {
throw new MojoExecutionException("SqlException: " + e.getMessage(), e);
} catch (IOException e) {
throw new MojoExecutionException("IOException: " + e.getMessage(), e);
} finally {
closeConnection(connection);
}
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private void closeConnection(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// ignore
;
}
}
}
private void closeStatement(Statement statement) {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
// ignore
;
}
}
}
private String readStatement(BufferedReader br) throws IOException {
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
if (line.startsWith("--")) { //$NON-NLS-1$
continue;
}
if (!StringUtility.stringHasValue(line)) {
continue;
}
if (line.endsWith(";")) { //$NON-NLS-1$
sb.append(line.substring(0, line.length() - 1));
break;
} else {
sb.append(' ');
sb.append(line);
}
}
String s = sb.toString().trim();
if (s.length() > 0) {
log.debug((Messages.getString("Progress.13", s))); //$NON-NLS-1$
}
return s.length() > 0 ? s : null;
}
public void setLog(Log log) {
this.log = log;
}
private BufferedReader getScriptReader() throws MojoExecutionException, FileNotFoundException {
BufferedReader answer;
if (sourceFile.startsWith("classpath:")) {
String resource = sourceFile.substring("classpath:".length());
InputStream is =
Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
if (is == null) {
throw new MojoExecutionException("SQL script file does not exist: " + resource);
}
answer = new BufferedReader(new InputStreamReader(is));
} else {
File file = new File(sourceFile);
if (!file.exists()) {
throw new MojoExecutionException("SQL script file does not exist");
}
answer = new BufferedReader(new FileReader(file));
}
return answer;
}
}