package org.simpleflatmapper.jdbc.test.samples;
import org.junit.Test;
import org.simpleflatmapper.jdbc.JdbcColumnKey;
import org.simpleflatmapper.jdbc.JdbcMapperFactory;
import org.simpleflatmapper.jdbc.MultiIndexFieldMapper;
import org.simpleflatmapper.jdbc.property.IndexedSetterProperty;
import org.simpleflatmapper.map.MapperBuildingException;
import org.simpleflatmapper.map.property.FieldMapperColumnDefinition;
import org.simpleflatmapper.jdbc.property.IndexedSetterFactoryProperty;
import org.simpleflatmapper.map.mapper.PropertyMapping;
import org.simpleflatmapper.reflect.IndexedSetter;
import org.simpleflatmapper.reflect.IndexedSetterFactory;
import java.sql.PreparedStatement;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
public class PsSetterNotFoundTest {
/*
* When we are setting a object with one property we will use that property to inject.
*/
public static class Foo {
private final BarOneProp bar;
public Foo(BarOneProp bar) {
this.bar = bar;
}
public BarOneProp getBar() {
return bar;
}
}
public static class BarOneProp {
private final String val;
public BarOneProp(String val) {
this.val = val;
}
public String getVal() {
return val;
}
}
public static class Crux {
private final Foo foo;
public Crux(Foo foo) {
this.foo = foo;
}
public Foo getFoo() {
return foo;
}
}
@Test
public void jdbcMapperExtrapolateGetterFromConstructor() throws Exception {
final MultiIndexFieldMapper<Foo>[] fieldMappers =
JdbcMapperFactory.newInstance().buildFrom(Foo.class).addColumn("bar").buildIndexFieldMappers();
assertEquals(1, fieldMappers.length);
PreparedStatement ps = mock(PreparedStatement.class);
fieldMappers[0].map(ps, new Foo(new BarOneProp("val")), 0);
verify(ps).setString(1, "val");
JdbcMapperFactory.newInstance().buildFrom(Crux.class).addColumn("foo").buildIndexFieldMappers();
}
/*
* When we are using a object with more than one property.
*/
public static class Foo2 {
private final Bar2Prop bar;
public Foo2(Bar2Prop bar) {
this.bar = bar;
}
public Bar2Prop getBar() {
return bar;
}
}
public static class Bar2Prop {
private final String val;
private final int i;
public Bar2Prop(String val, int i) {
this.val = val;
this.i = i;
}
public int getI() {
return i;
}
public String getVal() {
return val;
}
public String toString() {
return "toString";
}
}
/*
* the jdbc setter will fail to be found.
*/
@Test
public void jdbcMapperExtrapolateFailToFindSetter() {
try {
final MultiIndexFieldMapper<Foo2>[] indexFieldMappers =
JdbcMapperFactory.newInstance().buildFrom(Foo2.class).addColumn("bar").buildIndexFieldMappers();
fail();
} catch (MapperBuildingException e) {
// expected
}
}
/*
* you will need to provide you own setter via a SetterProperty or a SetterFactoryProperty
*/
@Test
public void jdbcMapperExtrapolateOverrideSetter() {
JdbcMapperFactory
.newInstance()
.addColumnProperty("bar", new IndexedSetterProperty(new IndexedSetter<PreparedStatement, Bar2Prop>() {
@Override
public void set(PreparedStatement target, Bar2Prop value, int index) throws Exception {
target.setString(index, value.getVal());
target.setInt(index + 1, value.getI());
}
}))
.buildFrom(Foo2.class)
.addColumn("bar")
.buildIndexFieldMappers();
}
@Test
public void jdbcMapperExtrapolateOverrideSetterFactory() {
JdbcMapperFactory
.newInstance()
.addColumnProperty("bar",
new IndexedSetterFactoryProperty(
new IndexedSetterFactory<PreparedStatement, PropertyMapping<?, ?, JdbcColumnKey, FieldMapperColumnDefinition<JdbcColumnKey>>>() {
@SuppressWarnings("unchecked")
@Override
public <P> IndexedSetter<PreparedStatement, P> getIndexedSetter(final PropertyMapping<?, ?, JdbcColumnKey, FieldMapperColumnDefinition<JdbcColumnKey>> arg) {
return (IndexedSetter<PreparedStatement, P>) new IndexedSetter<PreparedStatement, Bar2Prop>() {
@Override
public void set(PreparedStatement target, Bar2Prop value, int index) throws Exception {
target.setString(index, value.getVal());
target.setInt(index + 1, value.getI());
}
};
}
}
))
.buildFrom(Foo2.class)
.addColumn("bar")
.buildIndexFieldMappers();
}
}