package org.simpleflatmapper.test.map; import org.junit.Test; import org.simpleflatmapper.map.FieldKey; import org.simpleflatmapper.map.IgnoreMapperBuilderErrorHandler; import org.simpleflatmapper.map.MapperBuilderErrorHandler; import org.simpleflatmapper.map.MapperBuildingException; import org.simpleflatmapper.map.MapperConfig; import org.simpleflatmapper.map.annotation.Key; import org.simpleflatmapper.map.property.FieldMapperColumnDefinition; import org.simpleflatmapper.map.mapper.PropertyMapping; import org.simpleflatmapper.map.mapper.PropertyMappingsBuilder; import org.simpleflatmapper.reflect.Getter; import org.simpleflatmapper.reflect.ReflectionService; import org.simpleflatmapper.reflect.meta.ArrayElementPropertyMeta; import org.simpleflatmapper.reflect.meta.ClassMeta; import org.simpleflatmapper.reflect.meta.PropertyMeta; import org.simpleflatmapper.reflect.meta.SubPropertyMeta; import org.simpleflatmapper.test.beans.DbObject; import org.simpleflatmapper.test.beans.Foo; import org.simpleflatmapper.test.map.mapper.MultiJoinMapperTest; import org.simpleflatmapper.tuple.Tuple2; import org.simpleflatmapper.util.ConstantPredicate; import org.simpleflatmapper.util.ForEachCallBack; import org.simpleflatmapper.util.TypeHelper; import org.simpleflatmapper.util.TypeReference; import java.lang.reflect.Type; import java.net.InetAddress; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; public class PropertyMappingsBuilderTest { public static class AnonymousElement { public List<String> phones; } @Test public void testStringInArray() { final ClassMeta<AnonymousElement> classMeta = ReflectionService.newInstance().getClassMeta(AnonymousElement.class); PropertyMappingsBuilder<AnonymousElement, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder = defaultPropertyMappingBuilder(classMeta); builder.addProperty(new SampleFieldKey("phones_str", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity()); assertIsPhonesElement(builder); } private <T> PropertyMappingsBuilder<T, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> defaultPropertyMappingBuilder(ClassMeta<T> classMeta) { return PropertyMappingsBuilder.<T, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>of(classMeta, MapperConfig.<SampleFieldKey>fieldMapperConfig(), ConstantPredicate.<PropertyMeta<?, ?>>truePredicate()); } //@Test causes issue with jdbc array public void testAnonymousInArray() { final ClassMeta<AnonymousElement> classMeta = ReflectionService.newInstance().getClassMeta(AnonymousElement.class); PropertyMappingsBuilder<AnonymousElement, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2 = defaultPropertyMappingBuilder(classMeta); builder2.addProperty(new SampleFieldKey("phones", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity()); assertIsPhonesElement(builder2); } @SuppressWarnings("unchecked") private void assertIsPhonesElement(PropertyMappingsBuilder<AnonymousElement, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder) { final List<PropertyMapping<AnonymousElement, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>> props = new ArrayList<PropertyMapping<AnonymousElement, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>>(); builder.forEachProperties(new ForEachCallBack<PropertyMapping<AnonymousElement, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>>() { @Override public void handle(PropertyMapping<AnonymousElement, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> pm) { props.add(pm); } }); assertEquals(1, props.size()); final PropertyMeta<AnonymousElement, ?> propertyMeta = props.get(0).getPropertyMeta(); assertTrue("Is sub property", propertyMeta.isSubProperty()); SubPropertyMeta<AnonymousElement, ?, ?> subPropertyMeta = (SubPropertyMeta<AnonymousElement, ?, ?>) propertyMeta; assertTrue(TypeHelper.isAssignable(List.class, subPropertyMeta.getOwnerProperty().getPropertyType())); assertTrue("expect ListElementPropertyMeta " + subPropertyMeta.getSubProperty(), subPropertyMeta.getSubProperty() instanceof ArrayElementPropertyMeta); } @Test public void testCustomSourceIncompatibility() { final ClassMeta<DbObject> classMeta = ReflectionService.newInstance().getClassMeta(DbObject.class); PropertyMappingsBuilder<DbObject, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2 = defaultPropertyMappingBuilder(classMeta); try { builder2.addProperty(new SampleFieldKey("id", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity().addGetter(new Getter<Object, String>() { @Override public String get(Object target) throws Exception { return null; } })); fail(); } catch(MapperBuildingException e) { } } @Test public void testCustomSourceIncompatibilityIgnoreError() { final ClassMeta<DbObject> classMeta = ReflectionService.newInstance().getClassMeta(DbObject.class); PropertyMappingsBuilder<DbObject, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2 = PropertyMappingsBuilder.of(classMeta, MapperConfig.<SampleFieldKey>fieldMapperConfig().mapperBuilderErrorHandler(IgnoreMapperBuilderErrorHandler.INSTANCE), ConstantPredicate.<PropertyMeta<?, ?>>truePredicate()); builder2.addProperty(new SampleFieldKey("id", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity().addGetter(new Getter<Object, String>() { @Override public String get(Object target) throws Exception { return null; } })); builder2.addProperty(new SampleFieldKey("name", 1), FieldMapperColumnDefinition.<SampleFieldKey>identity()); final List<PropertyMapping<DbObject, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>> props = getAllProperties(builder2); assertEquals(2, props.size()); assertNull(props.get(0)); } private List<PropertyMapping<DbObject, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>> getAllProperties(PropertyMappingsBuilder<DbObject, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2) { return builder2.currentProperties(); } @Test public void testAddPropertyIfPresent() { final ClassMeta<DbObject> classMeta = ReflectionService.newInstance().getClassMeta(DbObject.class); PropertyMappingsBuilder<DbObject, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2 = defaultPropertyMappingBuilder(classMeta); List<PropertyMapping<DbObject, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>> props; builder2.addPropertyIfPresent(new SampleFieldKey("id", 1), FieldMapperColumnDefinition.<SampleFieldKey>identity()); props = getAllProperties(builder2); assertEquals(1, props.size()); assertNotNull(props.get(0)); builder2.addPropertyIfPresent(new SampleFieldKey("not_id", 1), FieldMapperColumnDefinition.<SampleFieldKey>identity()); props = getAllProperties(builder2); assertEquals(2, props.size()); assertNotNull(props.get(0)); assertNull(props.get(1)); } @Test public void testAddFailedPropertyIgnoreError() { final ClassMeta<DbObject> classMeta = ReflectionService.newInstance().getClassMeta(DbObject.class); PropertyMappingsBuilder<DbObject, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2 = PropertyMappingsBuilder.of(classMeta, MapperConfig.<SampleFieldKey>fieldMapperConfig().mapperBuilderErrorHandler(IgnoreMapperBuilderErrorHandler.INSTANCE), ConstantPredicate.<PropertyMeta<?, ?>>truePredicate()); builder2.addProperty(new SampleFieldKey("id", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity()); builder2.addProperty(new SampleFieldKey("not_id", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity()); List<PropertyMapping<DbObject, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>> props = getAllProperties(builder2); assertEquals(2, props.size()); assertNull(props.get(1)); } @Test public void testAddPropertyIgnore() { final ClassMeta<DbObject> classMeta = ReflectionService.newInstance().getClassMeta(DbObject.class); PropertyMappingsBuilder<DbObject, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2 = defaultPropertyMappingBuilder(classMeta); builder2.addProperty(new SampleFieldKey("not_id", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity().addIgnore()); List<PropertyMapping<DbObject, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>> props = getAllProperties(builder2); assertEquals(1, props.size()); assertNull(props.get(0)); } @Test public void testSelfPropertyInvalidation() { final ClassMeta<DbObject> classMeta = ReflectionService.newInstance().getClassMeta(DbObject.class); MapperBuilderErrorHandler errorHandler = mock(MapperBuilderErrorHandler.class); PropertyMappingsBuilder<DbObject, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder = PropertyMappingsBuilder.of( classMeta, MapperConfig.<SampleFieldKey>fieldMapperConfig().mapperBuilderErrorHandler(errorHandler), ConstantPredicate.<PropertyMeta<?, ?>>truePredicate()); builder.addProperty(new SampleFieldKey("self", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity()); verify(errorHandler, never()).customFieldError(any(FieldKey.class), any(String.class)); verify(errorHandler, never()).accessorNotFound(any(String.class)); verify(errorHandler, never()).propertyNotFound(any(Type.class), any(String.class)); builder.addProperty(new SampleFieldKey("id", 1), FieldMapperColumnDefinition.<SampleFieldKey>identity()); verify(errorHandler).propertyNotFound(DbObject.class, "self"); } @Test public void testAnnotations() { final ClassMeta<ObjectWithAnnotation> classMeta = ReflectionService.newInstance().getClassMeta(ObjectWithAnnotation.class); PropertyMappingsBuilder<ObjectWithAnnotation, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2 = defaultPropertyMappingBuilder(classMeta); builder2.addProperty(new SampleFieldKey("id", 0), FieldMapperColumnDefinition.<SampleFieldKey>identity()); List<PropertyMapping<ObjectWithAnnotation, ?, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>>> propertyMappings = builder2.currentProperties(); assertTrue(propertyMappings.get(0).getColumnDefinition().isKey()); } public static class ObjectWithAnnotation { @Key public int id; } @Test public void test418() { ClassMeta<List<Tuple2<B, List<C>>>> classMeta2 = ReflectionService.newInstance().getClassMeta(new TypeReference<List<Tuple2<B, List<C>>>>() {}.getType()); PropertyMappingsBuilder<List<Tuple2<B, List<C>>>, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder2 = defaultPropertyMappingBuilder(classMeta2); PropertyMapping<List<Tuple2<B, List<C>>>, Object, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> pm1 = builder2.addProperty(new SampleFieldKey("id", 1), FieldMapperColumnDefinition.<SampleFieldKey>identity()); PropertyMapping<List<Tuple2<B, List<C>>>, Object, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> pm2 = builder2.addProperty(new SampleFieldKey("id", 1), FieldMapperColumnDefinition.<SampleFieldKey>identity()); assertEquals("0.element0.element1.0.element0.id", pm2.getPropertyMeta().getPath()); } public static class A { public int id; } public static class B { public int id; } public static class C { public int id; } // networks_network_ipv4 is map to networks[4] instead of networks[].network.ipv4 @Test public void test431() { ClassMeta<FooN> classMeta = ReflectionService.newInstance().getClassMeta(FooN.class); PropertyMappingsBuilder<FooN, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> builder = defaultPropertyMappingBuilder(classMeta); SampleFieldKey networks_network_ipv4 = new SampleFieldKey("networks_network_ipv4", 1); FieldMapperColumnDefinition<SampleFieldKey> identity = FieldMapperColumnDefinition.<SampleFieldKey>identity(); PropertyMapping<FooN, Object, SampleFieldKey, FieldMapperColumnDefinition<SampleFieldKey>> propertyMapping = builder.addProperty(networks_network_ipv4, identity); assertEquals("networks.0.element0.network.ipv4", propertyMapping.getPropertyMeta().getPath()); } public static class FooN { public List<BarN> networks; } public static class BarN { public ZooN network; } public static class ZooN { public InetAddress ipv4; } }