package org.simpleflatmapper.jdbc.test.samples;
import org.junit.Test;
import org.simpleflatmapper.jdbc.JdbcColumnKey;
import org.simpleflatmapper.jdbc.JdbcMapperFactory;
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.property.SetterFactoryProperty;
import org.simpleflatmapper.map.property.SetterProperty;
import org.simpleflatmapper.map.mapper.PropertyMapping;
import org.simpleflatmapper.reflect.IndexedSetter;
import org.simpleflatmapper.reflect.IndexedSetterFactory;
import org.simpleflatmapper.reflect.Setter;
import org.simpleflatmapper.reflect.SetterFactory;
import java.sql.PreparedStatement;
import static org.junit.Assert.fail;
public class CtfmSetterNotFoundTest {
/*
* 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() {
JdbcMapperFactory.newInstance().buildFrom(Foo.class).addColumn("bar").mapper();
JdbcMapperFactory.newInstance().buildFrom(Crux.class).addColumn("foo").mapper();
}
/*
* 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 {
JdbcMapperFactory.newInstance().buildFrom(Foo2.class).addColumn("bar").mapper();
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 SetterProperty(new Setter<PreparedStatement, Bar2Prop>() {
@Override
public void set(PreparedStatement target, Bar2Prop value) throws Exception {
target.setString(3, value.getVal());
target.setInt(4, value.getI());
}
}))
.buildFrom(Foo2.class)
.addColumn("bar")
.mapper();
}
@Test
public void jdbcMapperExtrapolateOverrideSetterFactory() {
JdbcMapperFactory
.newInstance()
.addColumnProperty("bar",
new SetterFactoryProperty(
new SetterFactory<PreparedStatement, PropertyMapping<?, ?, JdbcColumnKey, FieldMapperColumnDefinition<JdbcColumnKey>>>() {
@SuppressWarnings("unchecked")
@Override
public <P> Setter<PreparedStatement, P> getSetter(final PropertyMapping<?, ?, JdbcColumnKey, FieldMapperColumnDefinition<JdbcColumnKey>> arg) {
return (Setter<PreparedStatement, P>) new Setter<PreparedStatement, Bar2Prop>() {
@Override
public void set(PreparedStatement target, Bar2Prop value) throws Exception {
target.setString(arg.getColumnKey().getIndex(), value.getVal());
target.setInt(arg.getColumnKey().getIndex() + 1, value.getI());
}
};
}
}
))
.buildFrom(Foo2.class)
.addColumn("bar")
.mapper();
}
@Test
public void jdbcMapperExtrapolateOverrideIndexedSetter() {
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")
.mapper();
}
@Test
public void jdbcMapperExtrapolateOverrideIndexedSetterFactory() {
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")
.mapper();
}
}