/*
* Copyright 2007 The Fornax Project Team, including the original
* author or authors.
*
* 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 org.sculptor.framework.util.db;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.datatype.IDataTypeFactory;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.sculptor.framework.util.ApplicationContextSingleton;
import org.sculptor.framework.util.FactoryHelper;
import org.springframework.context.ApplicationContext;
/**
* A development environment utility to export data from a
* database to DBUnit XML file. Not intended to be used in
* production.
*
*/
public class DatabaseExport {
private final ApplicationContext context = ApplicationContextSingleton.getApplicationContext();
private final DatabaseEnvironmentStrategy environmentStrategy;
public DatabaseExport() {
this(new HsqldbStrategy());
}
public DatabaseExport(DatabaseEnvironmentStrategy strategy) {
this.environmentStrategy = strategy;
}
public static void main(String[] args) {
System.out.println("Starting export from Database");
DatabaseExport dbe;
if (args.length == 1) {
DatabaseEnvironmentStrategy strategy = (DatabaseEnvironmentStrategy) FactoryHelper
.newInstanceFromName(args[0]);
dbe = new DatabaseExport(strategy);
} else {
// HSQLDB
dbe = new DatabaseExport();
}
dbe.export();
System.out.println("Ending export from Database. File full.xml is present in current directory.");
}
public Connection getConnection() throws SQLException {
DataSource ds = (DataSource) context.getBean(environmentStrategy.getDatasourceName());
return ds.getConnection();
}
public void export() {
try {
Connection dbCon = getConnection();
IDatabaseConnection connection = new DatabaseConnection(dbCon);
List<String> tables = getTables(dbCon);
// partial database export
QueryDataSet partialDataSet = new QueryDataSet(connection);
for (String table : tables) {
partialDataSet.addTable(table);
}
FlatXmlDataSet.write(partialDataSet, new BufferedOutputStream(new FileOutputStream("full.xml")));
} catch (Exception e) {
e.printStackTrace();
}
}
public List<String> getTables(Connection connection) {
List<String> tables = new ArrayList<String>();
PreparedStatement pstmt = null;
try {
pstmt = connection.prepareStatement(environmentStrategy.getSqlAllTables());
ResultSet rset = pstmt.executeQuery();
while (rset.next()) {
tables.add(rset.getString("table_name"));
}
} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
e.printStackTrace();
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException ignore) {
}
}
}
return tables;
}
public static String printDBUnitTables() {
return printDBUnitTables(new HsqldbStrategy());
}
public static String printDBUnitTables(DatabaseEnvironmentStrategy strategy) {
System.out.println("Starting export from database");
DatabaseExport dbe = new DatabaseExport(strategy);
String s = dbe.printTables();
System.out.println(s);
System.out.println("Ending export from database. ");
return s;
}
public static void executeSQL(String sql) {
executeSQL(new HsqldbStrategy(), sql);
}
public static void executeSQL(DatabaseEnvironmentStrategy strategy, String sql) {
DatabaseExport dbe = new DatabaseExport(strategy);
dbe.executeSQLImpl(sql);
}
private void executeSQLImpl(String sql) {
PreparedStatement pstmt = null;
try {
Connection connection = getConnection();
pstmt = connection.prepareStatement(sql);
ResultSet rset = pstmt.executeQuery();
while (rset.next()) {
System.out.println(rset.getString(0));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException ignore) {
}
}
}
}
private String printTables() {
try {
StringWriter stringWriter = new StringWriter();
PrintWriter out = new PrintWriter(stringWriter);
Connection dbCon = getConnection();
IDatabaseConnection connection = new DatabaseConnection(dbCon);
IDataTypeFactory dataTypeFactory = environmentStrategy.getDataTypeFactory();
if (dataTypeFactory != null) {
DatabaseConfig config = connection.getConfig();
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqlDataTypeFactory());
}
List<String> tables = getTables(dbCon);
for (String table : tables) {
out.println("------------ " + table + "------------ ");
QueryDataSet partialDataSet = new QueryDataSet(connection);
partialDataSet.addTable(table);
FlatXmlDataSet.write(partialDataSet, out);
}
return stringWriter.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
public static abstract class DatabaseEnvironmentStrategy {
protected abstract String getSqlAllTables();
protected abstract String getDatasourceName();
protected IDataTypeFactory getDataTypeFactory() {
return null;
}
}
public static class HsqldbStrategy extends DatabaseEnvironmentStrategy {
private final static String sqlAllTables_HSQLDB = "" + "select * from INFORMATION_SCHEMA.SYSTEM_tables "
+ "where table_name not like 'SYSTEM%' ";
@Override
protected String getDatasourceName() {
return "hsqldbDataSource";
}
@Override
protected String getSqlAllTables() {
return sqlAllTables_HSQLDB;
}
@Override
protected IDataTypeFactory getDataTypeFactory() {
return new HsqlDataTypeFactory();
}
}
public static class OracleStrategy extends DatabaseEnvironmentStrategy {
private final String sqlAllTables_ORACLE;
public OracleStrategy(String user) {
sqlAllTables_ORACLE = "" + "select * from all_tables " + "where owner = '" + user + "' "
+ "and table_name not in " + "('TOAD_PLAN_SQL','TOAD_PLAN_TABLE',"
+ "'PLSQL_PROFILER_UNITS','PLSQL_PROFILER_RUNS','PLSQL_PROFILER_DATA')";
}
@Override
protected String getDatasourceName() {
return "oracleDataSource";
}
@Override
protected String getSqlAllTables() {
return sqlAllTables_ORACLE;
}
}
}