diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java index d4321e0a7..09d893610 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java @@ -80,10 +80,13 @@ public static boolean isStringable(AnnotatedClass type) { protected static String getNamespace(JavaType type) { Class cls = type.getRawClass(); // 16-Feb-2017, tatu: Fixed as suggested by `baharclerode@github` + // 09-Mar-2016, tatu: Alas, need to undo for 2.8.8; will be in 2.9 + /* Class enclosing = cls.getEnclosingClass(); if (enclosing != null) { return enclosing.getName() + "$"; } + */ Package pkg = cls.getPackage(); return (pkg == null) ? "" : pkg.getName(); } diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/ApacheAvroInteropUtil.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/ApacheAvroInteropUtil.java index a4b7cc333..12acfa371 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/ApacheAvroInteropUtil.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/ApacheAvroInteropUtil.java @@ -15,7 +15,6 @@ import org.apache.avro.io.EncoderFactory; import org.apache.avro.reflect.ReflectData; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.dataformat.avro.AvroMapper; @@ -38,7 +37,7 @@ public byte[] apply(Schema schema, Object originalObject) { /** * Functor of {@link #getJacksonSchema(Type)} */ - public static final Function getJacksonSchema = new Function() { + public static final Function getJacksonSchema = new Function() { @Override public Schema apply(Type input) { return getJacksonSchema(input); @@ -48,7 +47,7 @@ public Schema apply(Type input) { * Functor of {@link #jacksonDeserialize(Schema, Type, byte[])} which uses {@link Object} as the target type, * requiring the use of native type IDs */ - public static final BiFunction jacksonDeserializer = new BiFunction() { + public static final BiFunction jacksonDeserializer = new BiFunction() { @Override public Object apply(Schema schema, byte[] originalObject) { return jacksonDeserialize(schema, Object.class, originalObject); @@ -57,7 +56,7 @@ public Object apply(Schema schema, byte[] originalObject) { /** * Functor of {@link #getApacheSchema(Type)} */ - public static final Function getApacheSchema = new Function() { + public static final Function getApacheSchema = new Function() { @Override public Schema apply(Type input) { return getApacheSchema(input); @@ -66,7 +65,7 @@ public Schema apply(Type input) { /** * Functor of {@link #apacheDeserialize(Schema, byte[])} */ - public static final BiFunction apacheDeserializer = new BiFunction() { + public static final BiFunction apacheDeserializer = new BiFunction() { @Override public Object apply(Schema first, byte[] second) { return apacheDeserialize(first, second); @@ -75,7 +74,7 @@ public Object apply(Schema first, byte[] second) { /** * Functor of {@link #apacheSerialize(Schema, Object)} */ - public static final BiFunction apacheSerializer = new BiFunction() { + public static final BiFunction apacheSerializer = new BiFunction() { @Override public byte[] apply(Schema schema, Object originalObject) { return apacheSerialize(schema, originalObject); @@ -93,8 +92,7 @@ public byte[] apply(Schema schema, Object originalObject) { @SuppressWarnings({"unchecked", "SuspiciousMethodCalls", "rawtypes"}) @Override protected Schema createSchema(Type type, Map names) { - /* - * Note, we abuse the fact that we can stick whatever we want into "names" and it won't interfere as long as we don't use String + /* Note, we abuse the fact that we can stick whatever we want into "names" and it won't interfere as long as we don't use String * keys. To persist and look up type variable information, we watch for ParameterizedTypes, TypeVariables, and Classes with * generic superclasses to extract type variable information and store it in the map. This allows full type variable resolution * when building a schema from reflection data. diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/InteropTestBase.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/InteropTestBase.java index 504130051..c158d310b 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/InteropTestBase.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/InteropTestBase.java @@ -5,10 +5,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; import org.apache.avro.Schema; +import org.junit.Assume; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -20,7 +18,22 @@ * interoperability between the implementations. */ @RunWith(Parameterized.class) -public abstract class InteropTestBase { +public abstract class InteropTestBase +{ + // To work around 2.8/2.9 difference wrt namespaces for enums + // See [dataformats-binary#58] for details + protected void assumeCompatibleNsForDeser() { + Assume.assumeTrue(deserializeFunctor != ApacheAvroInteropUtil.apacheDeserializer + || schemaFunctor != ApacheAvroInteropUtil.getJacksonSchema); + } + + // To work around 2.8/2.9 difference wrt namespaces for enums + // See [dataformats-binary#58] for details + protected void assumeCompatibleNsForSer() { + Assume.assumeTrue(serializeFunctor != ApacheAvroInteropUtil.apacheSerializer + || schemaFunctor != ApacheAvroInteropUtil.getJacksonSchema); + } + /** * Helper method for building a {@link ParameterizedType} for use with {@link #roundTrip(Type, Object)} * @@ -155,13 +168,32 @@ public enum DummyEnum { NORTH, SOUTH, EAST, WEST } - @Data - @NoArgsConstructor - @AllArgsConstructor public static class DummyRecord { @JsonProperty(required = true) private String firstValue; @JsonProperty(required = true) private int secondValue; + + public DummyRecord(String f, int s) { + firstValue = f; + secondValue = s; + } + protected DummyRecord() { } + + public String getFirstValue() { return firstValue; } + public int getSecondValue() { return secondValue; } + + @Override + public boolean equals(Object o) { + if (o == null || !(o instanceof DummyRecord)) return false; + DummyRecord other = (DummyRecord) o; + if (other.secondValue == secondValue) { + if (firstValue == null) { + return other.firstValue == null; + } + return firstValue.equals(other.firstValue); + } + return false; + } } } diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/AvroIgnoreTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/AvroIgnoreTest.java index ea9d771e7..5f7da7769 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/AvroIgnoreTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/AvroIgnoreTest.java @@ -1,12 +1,15 @@ package com.fasterxml.jackson.dataformat.avro.interop.annotations; -import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; import org.apache.avro.reflect.AvroIgnore; +import org.junit.Before; import org.junit.Test; import static org.hamcrest.CoreMatchers.*; + import static org.junit.Assert.assertThat; +import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; + public class AvroIgnoreTest extends InteropTestBase { static class RecordWithIgnoredField { @@ -18,6 +21,12 @@ public RecordWithIgnoredField() {} } + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + } + @Test public void testFieldIgnored() { RecordWithIgnoredField r = new RecordWithIgnoredField(); diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/AvroNameTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/AvroNameTest.java index 5eb559e43..3be4fe7eb 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/AvroNameTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/AvroNameTest.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; import org.apache.avro.reflect.AvroName; - +import org.junit.Before; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -32,6 +32,12 @@ public static class RecordWithNameCollision { public String otherField; } + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + } + @Test public void testRecordWithRenamedField() { RecordWithRenamed original = new RecordWithRenamed(); diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/arrays/ListWithComplexTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/arrays/ListWithComplexTest.java index 52e8371c9..e70def283 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/arrays/ListWithComplexTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/arrays/ListWithComplexTest.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; +import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; @@ -15,7 +16,14 @@ /** * Tests lists involving complex element types (Lists, Records, Maps, Enums) */ -public class ListWithComplexTest extends InteropTestBase { +public class ListWithComplexTest extends InteropTestBase +{ + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + } + @Test public void testEmptyListWithRecordElements() { List original = new ArrayList<>(); diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/maps/MapWithComplexTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/maps/MapWithComplexTest.java index fafc1927d..a2112d327 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/maps/MapWithComplexTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/maps/MapWithComplexTest.java @@ -2,6 +2,7 @@ import java.util.*; +import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; @@ -12,7 +13,13 @@ /** * Tests Maps involving complex value types (Lists, Records, Maps, Enums) */ -public class MapWithComplexTest extends InteropTestBase { +public class MapWithComplexTest extends InteropTestBase +{ + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + } @Test public void testMapWithRecordValues() { diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithComplexTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithComplexTest.java index 7e84836ed..e8c8d07dd 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithComplexTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithComplexTest.java @@ -10,6 +10,7 @@ import lombok.RequiredArgsConstructor; import lombok.ToString; import org.apache.avro.reflect.Nullable; +import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.annotation.JsonProperty; @@ -21,7 +22,8 @@ /** * Tests records involving complex value types (Lists, Records, Maps, Enums) */ -public class RecordWithComplexTest extends InteropTestBase { +public class RecordWithComplexTest extends InteropTestBase +{ @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) @@ -43,6 +45,13 @@ public RecursiveDummyRecord(String firstValue, Integer secondValue, DummyRecord } } + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + assumeCompatibleNsForSer(); + } + @Test public void testEmptyRecordWithRecordValues() { Map original = new HashMap<>(); diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveArrayTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveArrayTest.java index eb57dcdb0..ef5263889 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveArrayTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveArrayTest.java @@ -1,6 +1,8 @@ package com.fasterxml.jackson.dataformat.avro.interop.records; import lombok.Data; + +import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; @@ -10,7 +12,14 @@ /** * Tests serializing primitive array fields on records */ -public class RecordWithPrimitiveArrayTest extends InteropTestBase { +public class RecordWithPrimitiveArrayTest extends InteropTestBase +{ + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + } + @Data public static class TestRecord { private byte[] byteArrayField = new byte[0]; diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveTest.java index 0df9d45c1..fe331ff44 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveTest.java @@ -1,6 +1,8 @@ package com.fasterxml.jackson.dataformat.avro.interop.records; import lombok.Data; + +import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; @@ -10,7 +12,8 @@ /** * Tests serializing primitive fields on records */ -public class RecordWithPrimitiveTest extends InteropTestBase { +public class RecordWithPrimitiveTest extends InteropTestBase +{ @Data public static class TestRecord { private byte byteField; @@ -22,6 +25,12 @@ public static class TestRecord { private double doubleField; } + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + } + @Test public void testByteField() { TestRecord record = new TestRecord(); diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveWrapperArrayTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveWrapperArrayTest.java index 3259d36df..d022cca22 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveWrapperArrayTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveWrapperArrayTest.java @@ -1,6 +1,8 @@ package com.fasterxml.jackson.dataformat.avro.interop.records; import lombok.Data; + +import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; @@ -10,7 +12,8 @@ /** * Tests serializing primitive array fields on records */ -public class RecordWithPrimitiveWrapperArrayTest extends InteropTestBase { +public class RecordWithPrimitiveWrapperArrayTest extends InteropTestBase +{ @Data public static class TestRecord { private Byte[] byteArrayField = new Byte[0]; @@ -23,6 +26,12 @@ public static class TestRecord { private String[] stringArrayField = new String[0]; } + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + } + @Test public void testByteField() { TestRecord record = new TestRecord(); diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveWrapperTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveWrapperTest.java index b8257acaf..c05bf1d9b 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveWrapperTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/records/RecordWithPrimitiveWrapperTest.java @@ -1,6 +1,8 @@ package com.fasterxml.jackson.dataformat.avro.interop.records; import lombok.Data; + +import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.dataformat.avro.interop.InteropTestBase; @@ -10,7 +12,8 @@ /** * Tests serializing wrapper types for primitives on records */ -public class RecordWithPrimitiveWrapperTest extends InteropTestBase { +public class RecordWithPrimitiveWrapperTest extends InteropTestBase +{ @Data public static class TestRecord { private Byte byteField = 0; @@ -23,13 +26,17 @@ public static class TestRecord { private String stringField = ""; } + @Before + public void setup() { + // 2.8 doesn't generate schemas with compatible namespaces for Apache deserializer + assumeCompatibleNsForDeser(); + } + @Test public void testByteField() { TestRecord record = new TestRecord(); record.byteField = Byte.MAX_VALUE; - // TestRecord result = roundTrip(record); - // assertThat(result.byteField).isEqualTo(record.byteField); } diff --git a/release-notes/CREDITS b/release-notes/CREDITS index 0d2a1c190..e1879caac 100644 --- a/release-notes/CREDITS +++ b/release-notes/CREDITS @@ -10,5 +10,8 @@ Credits for individual projects, since 2.8.0 Michael Zeng (shotbythought@github) -* Contributes fix for #27: (protobuf) Fixed long deserialization problem for longs of ~13digit length +* Contributed fix for #27: (protobuf) Fixed long deserialization problem for longs of ~13digit length (2.8.2) + +* Reported #58 (avro): Regression due to changed namespace of inner enum types + (2.8.8) diff --git a/release-notes/VERSION b/release-notes/VERSION index ec00ab6c0..34baf4abc 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -14,6 +14,8 @@ Modules: 2.8.8 (not yet released) #54 (protobuf): Some fields are left null +#58 (avro): Regression due to changed namespace of inner enum types + (reported by Peter R) 2.8.7 (21-Feb-2017)