package com.tddinaction.data.dbunit;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.dataset.Column;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.NoColumnsFoundException;
/**
* Utility methods for doing stuff with DbUnit.
*
* @author Lasse Koskela
*/
public class DbUnitUtils {
public static void print(Connection connection) throws DataSetException,
SQLException {
print(new DatabaseConnection(connection).createDataSet());
}
public static void print(IDataSet dataSet) throws DataSetException {
String[] tableNames = dataSet.getTableNames();
System.out.println("" + tableNames.length + " TABLES FOUND");
for (int i = 0; i < tableNames.length; i++) {
System.out.println();
try {
print(dataSet.getTable(tableNames[i]));
} catch (NoColumnsFoundException e) {
System.out.println("No columns found for " + e.getMessage());
}
}
}
private static void print(ITable table) throws DataSetException {
String[][] data = convertToStringArray(table);
trimColumnValues(data, 30);
Map<Integer, Integer> lengths = determineMaxColumnLengths(data);
padColumnsToMaxLength(data, lengths);
print(table.getTableMetaData().getTableName(), data, lengths);
}
private static void print(String tableName, String[][] tableData,
Map<Integer, Integer> columnLengths) {
String separator = makeLine(columnLengths, true);
System.out.println(makeLine(columnLengths, false));
System.out.println(makeTableNameLine(tableName, columnLengths));
printHorizontalLine(columnLengths);
int columnCount = tableData[0].length;
for (int j = 0; j < tableData.length; j++) {
System.out.print("| ");
for (int k = 0; k < columnCount; k++) {
String columnData = tableData[j][k];
if (k > 0) {
System.out.print(" | ");
}
System.out.print(columnData);
}
System.out.println(" |");
if (j < 1) {
System.out.println(separator);
}
}
if (tableData.length > 1) {
System.out.println(separator);
}
}
private static String makeTableNameLine(String tableName,
Map<Integer, Integer> columnLengths) {
String sep = makeLine(columnLengths, false);
sep = sep.replaceAll("\\+", "|");
sep = sep.replaceAll("\\-", " ");
while (sep.length() < (tableName.length() + 4)) {
sep = sep.substring(0, 2) + " " + sep.substring(2);
}
char[] line = sep.toCharArray();
char[] name = tableName.toCharArray();
System.arraycopy(name, 0, line, 2, name.length);
return new String(line);
}
private static void printHorizontalLine(Map<Integer, Integer> columnLengths) {
System.out.println(makeLine(columnLengths));
}
private static String makeLine(Map<Integer, Integer> columnLengths) {
return makeLine(columnLengths, true);
}
private static String makeLine(Map<Integer, Integer> columnLengths,
boolean columnSeparators) {
StringBuffer line = new StringBuffer();
line.append("+-");
for (int k = 0; k < columnLengths.size(); k++) {
int length = columnLengths.get(k);
if (k > 0) {
if (columnSeparators) {
line.append("-+-");
} else {
line.append("---");
}
}
line.append(pad("", length, '-'));
}
line.append("-+");
return line.toString();
}
private static void padColumnsToMaxLength(String[][] data,
Map<Integer, Integer> lengths) {
for (int j = 0; j < data.length; j++) {
for (int k = 0; k < data[0].length; k++) {
int length = lengths.get(k);
data[j][k] = pad(data[j][k], length, ' ');
}
}
}
private static Map<Integer, Integer> determineMaxColumnLengths(
String[][] data) {
Map<Integer, Integer> lengths = new HashMap<Integer, Integer>();
for (int j = 0; j < data.length; j++) {
for (int k = 0; k < data[0].length; k++) {
int oldMax = lengths.get(k) != null ? lengths.get(k) : 0;
int newMax = data[j][k].length();
lengths.put(k, Math.max(oldMax, newMax));
}
}
return lengths;
}
private static void trimColumnValues(String[][] data, int maxlength) {
for (int j = 0; j < data.length; j++) {
for (int k = 0; k < data[0].length; k++) {
if (data[j][k] != null && data[j][k].length() > maxlength) {
String oldValue = data[j][k];
String newValue = "";
if (oldValue.length() > maxlength - 3) {
} else {
newValue = oldValue.substring(0, maxlength);
}
data[j][k] = newValue;
}
}
}
}
private static String[][] convertToStringArray(ITable table)
throws DataSetException {
Column[] columns = table.getTableMetaData().getColumns();
String[][] data = new String[table.getRowCount() + 1][columns.length];
// populate column names
int i = 0;
for (Column column : columns) {
data[0][i++] = column.getColumnName();
}
// populate data rows
for (int row = 0; row < table.getRowCount(); row++) {
i = 0;
for (Column column : columns) {
String value = String.valueOf(table.getValue(row, column
.getColumnName()));
data[row + 1][i++] = value;
}
}
return data;
}
private static String pad(String string, int length, char padding) {
StringBuffer s = new StringBuffer(length);
s.append(string);
while (s.length() < length) {
s.append(padding);
}
return s.toString();
}
}