package net.sf.jxls;
import junit.framework.TestCase;
import net.sf.jxls.report.ReportManager;
import net.sf.jxls.report.ReportManagerImpl;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.*;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
* @author Leonid Vysochyn
*/
public class ReportManagerStressTest extends TestCase {
protected final Log log = LogFactory.getLog(getClass());
public static final String stressXLS = "/templates/stress.xls";
public static final String stressDestXLS = "target/stress_output.xls";
public static final String CREATE_EMPLOYEE_TABLE = "CREATE TABLE employee (\n" +
" name varchar(20) default NULL,\n" +
" age int default NULL,\n" +
" payment double default NULL,\n" +
" bonus double default NULL,\n" +
" birthDate date default NULL,\n" +
" id int NOT NULL PRIMARY KEY, \n" +
" depid int, FOREIGN KEY (depid) REFERENCES department (id) " +
");";
public static final String CREATE_DEPARTMENT_TABLE = "CREATE TABLE department (\n" +
" name varchar(20) NOT NULL, " +
"id int NOT NULL PRIMARY KEY );";
public static final String INSERT_EMPLOYEE = "INSERT INTO employee\n" +
" (name, age, payment, bonus, birthDate, depid, id)\n" +
"VALUES\n" +
" (?, ?, ?, ?, ?, ?, ? );";
public static final String INSERT_DEPARTMENT = "INSERT INTO department (name, id) VALUES (?, ?)";
String[] depNames = new String []{"IT", "HR", "BA"};
String[][] employeeNames = new String[][]{{"Elsa", "Oleg", "Neil", "Maria", "John"},
{"Olga", "Helen", "Keith", "Cat"},
{"Denise", "LeAnn", "Natali"}};
int[][] employeeAges = new int[][]{ {25, 30, 34, 25, 35},
{26, 24, 27, 28},
{30, 29, 26}};
double[][] employeePayments = new double[][]{{3000, 1500, 2300, 2400, 1800},
{1400, 2100, 1800, 1900},
{2400, 2200, 1700}};
double[][] employeeBonuses = new double[][]{ {0.3, 0.25, 0.25, 0.1, 0.2},
{0.15, 0.05, 0.2, 0.1},
{0.2, 0.1, 0.15}};
String[][] employeeBirthDates = new String[][]{
{"1970-12-02", "1980-02-15", "1976-07-20", "1974-10-24", "1972-06-05"},
{"1968-08-22", "1971-10-16", "1979-03-21", "1974-12-05"},
{"1976-12-02", "1981-05-25", "1983-06-17"}
};
Connection conn;
protected void setUp() throws Exception {
super.setUp();
}
private String generateEmployeeName(Random r, int max) {
return "Employee" + r.nextInt(max);
}
private String generateDepartmentName(Random r, int max){
return "Department " + r.nextInt(max);
}
public void testReportManagerTransformXLS() throws SQLException, IOException, InvalidFormatException, ClassNotFoundException {
setupDB();
Map beans = new HashMap();
ReportManager rm = new ReportManagerImpl( conn, beans );
beans.put("rm", rm);
beans.put("minDate", "1979-01-01");
InputStream is = new BufferedInputStream(getClass().getResourceAsStream(stressXLS));
XLSTransformer transformer = new XLSTransformer();
long start = System.currentTimeMillis();
Workbook resultWorkbook = transformer.transformXLS(is, beans);
long end = System.currentTimeMillis();
System.out.println( "Transformation time was: " + (end - start) );
is.close();
saveWorkbook( resultWorkbook, stressDestXLS );
dropDB();
}
private void saveWorkbook(Workbook resultWorkbook, String fileName) throws IOException {
String saveResultsProp = System.getProperty("saveResults");
if( "true".equalsIgnoreCase(saveResultsProp) ){
OutputStream os = new BufferedOutputStream(new FileOutputStream(fileName));
resultWorkbook.write(os);
os.flush();
os.close();
}
}
private void setupDB() throws SQLException, ClassNotFoundException {
Class.forName("org.hsqldb.jdbcDriver");
conn = DriverManager.getConnection("jdbc:hsqldb:mem:jxls", "sa", "");
Statement stmt = conn.createStatement();
stmt.executeUpdate( CREATE_DEPARTMENT_TABLE );
stmt.executeUpdate( CREATE_EMPLOYEE_TABLE );
PreparedStatement insertDep = conn.prepareStatement( INSERT_DEPARTMENT );
PreparedStatement insertStmt = conn.prepareStatement( INSERT_EMPLOYEE );
int depNum = 50;
int empNum = 100;
int maxAge = 50;
int minAge = 22;
int maxPayment = 4000;
int minPayment = 1000;
int k = 1;
int n = 1;
Random r = new Random( System.currentTimeMillis() );
for (int i = 0; i < depNum; i++) {
String depName = generateDepartmentName(r, depNum);
insertDep.setString(1, depName);
insertDep.setInt(2, n++);
insertDep.executeUpdate();
for (int j = 0; j < empNum; j++) {
insertStmt.setString(1, generateEmployeeName(r, empNum*10));
insertStmt.setInt(2, r.nextInt((maxAge - minAge)) + minAge );
insertStmt.setDouble(3, r.nextInt(maxPayment - minPayment) + minPayment );
insertStmt.setDouble(4, r.nextInt(30)/100);
insertStmt.setDate(5, new java.sql.Date(System.currentTimeMillis()) );
insertStmt.setInt(6, n - 1);
insertStmt.setInt(7, k++);
insertStmt.executeUpdate();
}
}
stmt.close();
insertStmt.close();
}
private void dropDB() throws SQLException {
Statement stmt = conn.createStatement();
stmt.executeUpdate("DROP TABLE employee");
stmt.executeUpdate("DROP TABLE department");
stmt.close();
}
}