package org.oddjob.sql;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import org.mockito.Mockito;
import org.oddjob.arooa.ArooaSession;
import org.oddjob.arooa.convert.ArooaConversionException;
import org.oddjob.arooa.reflect.ArooaClass;
import org.oddjob.arooa.reflect.BeanOverview;
import org.oddjob.arooa.reflect.PropertyAccessor;
import org.oddjob.arooa.standard.StandardArooaSession;
import org.oddjob.arooa.types.ArooaObject;
import org.oddjob.arooa.types.ValueType;
import org.oddjob.beanbus.BusConductor;
import org.oddjob.beanbus.BusCrashException;
public class ParameterisedExecutorText extends TestCase {
public void testHSQLDataTypes() throws SQLException, ClassNotFoundException, ArooaConversionException {
ConnectionType ct = new ConnectionType();
ct.setDriver("org.hsqldb.jdbcDriver");
ct.setUrl("jdbc:hsqldb:mem:test");
ct.setUsername("sa");
ct.setPassword("");
Statement stmt = ct.toValue().createStatement();
String create =
"create table numbers (" +
"myTinyInt TINYINT, " +
"mySmallInt SMALLINT, " +
"myInteger INTEGER, " +
"myBigInt BIGINT, " +
"myNumeric NUMERIC, " +
"myDecimal DECIMAL)";
stmt.execute(create);
String insert =
"insert into numbers values (1, 1, 1, 1, 1, 1)";
stmt.execute(insert);
String select =
"select * from numbers";
ResultSet rs = stmt.executeQuery(select);
ResultSetMetaData md = rs.getMetaData();
int c = md.getColumnCount();
rs.next();
try {
for (int i = 1; i <= c; ++i) {
assertEquals(md.getColumnName(i),
Class.forName(md.getColumnClassName(i)),
rs.getObject(i).getClass());
}
} catch (AssertionFailedError e) {
// expected because of hsql
}
stmt.execute("shutdown");
}
private class Results extends BeanFactoryResultHandler {
List<Object> beans = new ArrayList<Object>();
public Results(ArooaSession session) {
super(session);
}
@Override
public void accept(Object bean) {
if (!(bean instanceof UpdateCount)) {
beans.add(bean);
}
}
}
public void testBeanTypes() throws ArooaConversionException, BusCrashException {
BusConductor conducter = Mockito.mock(BusConductor.class);
ConnectionType ct = new ConnectionType();
ct.setDriver("org.hsqldb.jdbcDriver");
ct.setUrl("jdbc:hsqldb:mem:test");
ct.setUsername("sa");
ct.setPassword("");
ParameterisedExecutor test = new ParameterisedExecutor();
test.setBeanBus(conducter);
test.setConnection(ct.toValue());
StandardArooaSession session = new StandardArooaSession();
test.setArooaSession(session);
Results results = new Results(session);
test.setResultProcessor(results);
String create =
"create table numbers (" +
"myTinyInt TINYINT, " +
"mySmallInt SMALLINT, " +
"myInteger INTEGER, " +
"myBigInt BIGINT, " +
"myNumeric NUMERIC, " +
"myDecimal DECIMAL)";
test.add(create);
ValueType v1 = new ValueType();
v1.setValue(new ArooaObject("1"));
ValueType v2 = new ValueType();
v2.setValue(new ArooaObject("2"));
ValueType v3 = new ValueType();
v3.setValue(new ArooaObject("3"));
ValueType v4 = new ValueType();
v4.setValue(new ArooaObject("4"));
ValueType v5 = new ValueType();
v5.setValue(new ArooaObject("5"));
ValueType v6 = new ValueType();
v6.setValue(new ArooaObject("6"));
test.setParameters(0, v1);
test.setParameters(1, v2);
test.setParameters(2, v3);
test.setParameters(3, v4);
test.setParameters(4, v5);
test.setParameters(5, v6);
String insert =
"insert into numbers values (?, ?, ?, ?, ?, ?)";
test.add(insert);
String select =
"select * from numbers";
test.add(select);
Object bean = results.beans.get(0);
PropertyAccessor accessor = session.getTools().getPropertyAccessor();
ArooaClass arooaClass = accessor.getClassName(bean);
BeanOverview beanOverview = arooaClass.getBeanOverview(accessor);
String[] props = beanOverview.getProperties();
assertEquals(6, props.length);
assertEquals(Integer.class, beanOverview.getPropertyType("MYTINYINT"));
assertEquals(Integer.class, beanOverview.getPropertyType("MYSMALLINT"));
assertEquals(Integer.class, beanOverview.getPropertyType("MYINTEGER"));
assertEquals(Long.class, beanOverview.getPropertyType("MYBIGINT"));
assertEquals(BigDecimal.class, beanOverview.getPropertyType("MYNUMERIC"));
assertEquals(BigDecimal.class, beanOverview.getPropertyType("MYDECIMAL"));
test.add("shutdown");
}
public void testNullParameter() throws ArooaConversionException, BusCrashException {
BusConductor conducter = Mockito.mock(BusConductor.class);
ConnectionType ct = new ConnectionType();
ct.setDriver("org.hsqldb.jdbcDriver");
ct.setUrl("jdbc:hsqldb:mem:test");
ct.setUsername("sa");
ct.setPassword("");
ParameterisedExecutor test = new ParameterisedExecutor();
test.setBeanBus(conducter);
test.setConnection(ct.toValue());
StandardArooaSession session = new StandardArooaSession();
test.setArooaSession(session);
Results results = new Results(session);
test.setResultProcessor(results);
String create =
"create table thing(" +
"stuff VARCHAR(10))";
test.add(create);
ValueType v1 = new ValueType();
test.setParameters(0, v1);
String insert =
"insert into thing (stuff) values (?)";
test.add(insert);
String select =
"select * from thing";
test.add(select);
Object bean = results.beans.get(0);
PropertyAccessor accessor = session.getTools().getPropertyAccessor();
assertEquals(null, accessor.getProperty(bean, "STUFF"));
test.add("shutdown");
}
}