Repository: cayenne Updated Branches: refs/heads/STABLE-4.0 859f459c2 -> 29c17b08f
CAY-2370 ValueObjectType for byte[] fails lookup Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/29c17b08 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/29c17b08 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/29c17b08 Branch: refs/heads/STABLE-4.0 Commit: 29c17b08fbeba73190afc887e0d86f3abfb22239 Parents: 859f459 Author: Nikita Timofeev <stari...@gmail.com> Authored: Fri Oct 13 15:06:05 2017 +0300 Committer: Nikita Timofeev <stari...@gmail.com> Committed: Fri Oct 13 15:06:05 2017 +0300 ---------------------------------------------------------------------- .../access/types/ValueObjectTypeFactory.java | 11 +-- .../types/ValueObjectTypeFactoryOrderTest.java | 70 ++++++++++++++++ .../types/ValueObjectTypeFactoryTest.java | 84 ++++++++++++++++++++ docs/doc/src/main/resources/RELEASE-NOTES.txt | 3 +- 4 files changed, 162 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/29c17b08/cayenne-server/src/main/java/org/apache/cayenne/access/types/ValueObjectTypeFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ValueObjectTypeFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ValueObjectTypeFactory.java index 5ce4273..bdcf863 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ValueObjectTypeFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ValueObjectTypeFactory.java @@ -22,6 +22,7 @@ package org.apache.cayenne.access.types; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.util.Objects; /** * @since 4.0 @@ -45,19 +46,19 @@ public class ValueObjectTypeFactory implements ExtendedTypeFactory { if(valueObjectType == null) { return null; } - ExtendedType<?> decorator = map.getExplictlyRegisteredType(valueObjectType.getTargetType().getName()); + ExtendedType<?> decorator = map.getExplictlyRegisteredType(valueObjectType.getTargetType().getCanonicalName()); return new ExtendedTypeConverter(decorator, valueObjectType); } static class ExtendedTypeConverter<T, E> implements ExtendedType<T> { - private ExtendedType<E> extendedType; - private ValueObjectType<T, E> valueObjectType; + ExtendedType<E> extendedType; + ValueObjectType<T, E> valueObjectType; ExtendedTypeConverter(ExtendedType<E> extendedType, ValueObjectType<T, E> valueObjectType) { - this.extendedType = extendedType; - this.valueObjectType = valueObjectType; + this.extendedType = Objects.requireNonNull(extendedType); + this.valueObjectType = Objects.requireNonNull(valueObjectType); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/29c17b08/cayenne-server/src/test/java/org/apache/cayenne/access/types/ValueObjectTypeFactoryOrderTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/types/ValueObjectTypeFactoryOrderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/types/ValueObjectTypeFactoryOrderTest.java new file mode 100644 index 0000000..41843a9 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/types/ValueObjectTypeFactoryOrderTest.java @@ -0,0 +1,70 @@ +package org.apache.cayenne.access.types; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ValueObjectTypeFactoryOrderTest { + ExtendedTypeMap extendedTypeMap; + ValueObjectType valueObjectType1, valueObjectType2; + ExtendedType tstType1, tstType2; + + @Before + public void setUpRegistry(){ + valueObjectType1 = createMockValueType(UUID.class, byte[].class); + valueObjectType2 = createMockValueType(UUID.class, String.class); + + extendedTypeMap = new ExtendedTypeMap(); + + tstType1 = mock(ExtendedType.class); + when(tstType1.getClassName()).thenReturn("byte[]"); + extendedTypeMap.registerType(tstType1); + + tstType2 = new MockExtendedType(String.class); + extendedTypeMap.registerType(tstType2); + } + + private ValueObjectType createMockValueType(Class<?> valueClass, Class<?> targetClass) { + ValueObjectType valueObjectType = mock(ValueObjectType.class); + when(valueObjectType.getValueType()).thenReturn(valueClass); + when(valueObjectType.getTargetType()).thenReturn(targetClass); + return valueObjectType; + } + + @Test + public void testByteFirstOrder(){ + List<ValueObjectType<?, ?>> list = new ArrayList<>(); + list.add(valueObjectType1); + list.add(valueObjectType2); + + DefaultValueObjectTypeRegistry registry = new DefaultValueObjectTypeRegistry(list); + ValueObjectTypeFactory factory = new ValueObjectTypeFactory(extendedTypeMap,registry); + + ValueObjectTypeFactory.ExtendedTypeConverter converter = (ValueObjectTypeFactory.ExtendedTypeConverter) factory.getType(UUID.class); + assertNotNull(converter); + assertNotSame(tstType1, converter.extendedType); + assertSame(tstType2,converter.extendedType); + } + + @Test + public void testStringFirstOrder(){ + List<ValueObjectType<?, ?>> list = new ArrayList<>(); + list.add(valueObjectType2); + list.add(valueObjectType1); + + DefaultValueObjectTypeRegistry registry = new DefaultValueObjectTypeRegistry(list); + ValueObjectTypeFactory factory = new ValueObjectTypeFactory(extendedTypeMap,registry); + + ValueObjectTypeFactory.ExtendedTypeConverter converter = (ValueObjectTypeFactory.ExtendedTypeConverter) factory.getType(UUID.class); + assertNotNull(converter); + assertNotSame(tstType2, converter.extendedType); + assertSame(tstType1,converter.extendedType); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/29c17b08/cayenne-server/src/test/java/org/apache/cayenne/access/types/ValueObjectTypeFactoryTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/types/ValueObjectTypeFactoryTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/types/ValueObjectTypeFactoryTest.java new file mode 100644 index 0000000..463bf76 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/types/ValueObjectTypeFactoryTest.java @@ -0,0 +1,84 @@ +package org.apache.cayenne.access.types; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ValueObjectTypeFactoryTest { + + ExtendedType tstType1, tstType2, tstType3, tstType4; + + ValueObjectTypeFactory factory; + + @Before + public void setUpRegistry(){ + List<ValueObjectType<?, ?>> list = new ArrayList<>(); + list.add(createMockValueType(UUID.class, byte[].class)); + list.add(createMockValueType(String.class, String.class)); + list.add(createMockValueType(int.class, int.class)); + list.add(createMockValueType(String[].class, String[].class)); + + DefaultValueObjectTypeRegistry registry = new DefaultValueObjectTypeRegistry(list); + + ExtendedTypeMap extendedTypeMap = new ExtendedTypeMap(); + + tstType1 = mock(ExtendedType.class); + when(tstType1.getClassName()).thenReturn("byte[]"); + extendedTypeMap.registerType(tstType1); + + tstType2 = new MockExtendedType(String.class); + extendedTypeMap.registerType(tstType2); + + tstType3 = new MockExtendedType(int.class); + extendedTypeMap.registerType(tstType3); + + tstType4 = mock(ExtendedType.class); + when(tstType4.getClassName()).thenReturn(String[].class.getCanonicalName()); + extendedTypeMap.registerType(tstType4); + + factory = new ValueObjectTypeFactory(extendedTypeMap,registry); + } + + private ValueObjectType createMockValueType(Class<?> valueClass, Class<?> targetClass) { + ValueObjectType valueObjectType = mock(ValueObjectType.class); + when(valueObjectType.getValueType()).thenReturn(valueClass); + when(valueObjectType.getTargetType()).thenReturn(targetClass); + return valueObjectType; + } + + @Test + public void testUUIDtoByteArray(){ + ValueObjectTypeFactory.ExtendedTypeConverter converter1 = (ValueObjectTypeFactory.ExtendedTypeConverter) factory.getType(UUID.class); + assertNotNull(converter1); + assertSame(tstType1, converter1.extendedType); + } + + @Test + public void testString(){ + ValueObjectTypeFactory.ExtendedTypeConverter converter2 = (ValueObjectTypeFactory.ExtendedTypeConverter) factory.getType(String.class); + assertNotNull(converter2); + assertSame(tstType2, converter2.extendedType); + } + + @Test + public void testInt(){ + ValueObjectTypeFactory.ExtendedTypeConverter converter3 = (ValueObjectTypeFactory.ExtendedTypeConverter) factory.getType(int.class); + assertNotNull(converter3); + assertSame(tstType3, converter3.extendedType); + } + + @Test + public void testStringArray(){ + ValueObjectTypeFactory.ExtendedTypeConverter converter4 = (ValueObjectTypeFactory.ExtendedTypeConverter) factory.getType(String[].class); + assertNotNull(converter4); + assertSame(tstType4, converter4.extendedType); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/29c17b08/docs/doc/src/main/resources/RELEASE-NOTES.txt ---------------------------------------------------------------------- diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt index 052fd2f..0687aad 100644 --- a/docs/doc/src/main/resources/RELEASE-NOTES.txt +++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt @@ -19,10 +19,11 @@ CAY-2364 Wrong logging in SQLTemplate CAY-2365 SQLExec query tries to convert (unexpected) result set into objects CAY-2367 ClassCastException reading object with an attribute of type 'char' CAY-2368 ColumnSelect: Property.self() translates into wrong SQL code +CAY-2370 ValueObjectType for byte[] fails lookup ---------------------------------- Release: 4.0.B2 -Date: +Date: October 06, 2017 ---------------------------------- Bug Fixes: