This is an automated email from the ASF dual-hosted git repository.
fokko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/avro.git
The following commit(s) were added to refs/heads/master by this push:
new 4a3609c AVRO-1810: Fix GenericDatumWriter w/ enums (#462)
4a3609c is described below
commit 4a3609cd854e9ef5bdda5b43e188a3309a93aef9
Author: ivangreene <[email protected]>
AuthorDate: Mon Mar 4 16:44:48 2019 -0600
AVRO-1810: Fix GenericDatumWriter w/ enums (#462)
---
.../java/org/apache/avro/generic/GenericData.java | 4 +-
.../org/apache/avro/generic/GenericEnumSymbol.java | 4 +-
.../src/test/java/org/apache/avro/TypeEnum.java | 3 +-
.../avro/generic/TestGenericConcreteEnum.java | 89 ++++++++++++++++++++++
.../specific/templates/java/classic/enum.vm | 3 +-
.../src/test/compiler/output-string/Position.java | 3 +-
.../avro/examples/baseball/Position.java | 3 +-
.../tools/src/test/compiler/output/Position.java | 3 +-
8 files changed, 103 insertions(+), 9 deletions(-)
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
index 4d95ae5..f26b88e 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
@@ -397,7 +397,7 @@ public class GenericData {
/** Default implementation of {@link GenericEnumSymbol}. */
public static class EnumSymbol
- implements GenericEnumSymbol, Comparable<GenericEnumSymbol> {
+ implements GenericEnumSymbol<EnumSymbol> {
private Schema schema;
private String symbol;
@@ -430,7 +430,7 @@ public class GenericData {
public String toString() { return symbol; }
@Override
- public int compareTo(GenericEnumSymbol that) {
+ public int compareTo(EnumSymbol that) {
return GenericData.get().compare(this, that, schema);
}
}
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericEnumSymbol.java
b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericEnumSymbol.java
index fc82a53..3661f10 100644
---
a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericEnumSymbol.java
+++
b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericEnumSymbol.java
@@ -18,8 +18,8 @@
package org.apache.avro.generic;
/** An enum symbol. */
-public interface GenericEnumSymbol
- extends GenericContainer, Comparable<GenericEnumSymbol> {
+public interface GenericEnumSymbol<E extends GenericEnumSymbol<E>>
+ extends GenericContainer, Comparable<E> {
/** Return the symbol. */
String toString();
}
diff --git a/lang/java/avro/src/test/java/org/apache/avro/TypeEnum.java
b/lang/java/avro/src/test/java/org/apache/avro/TypeEnum.java
index de91bb3..e677b66 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/TypeEnum.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/TypeEnum.java
@@ -22,8 +22,9 @@
package org.apache.avro;
@SuppressWarnings("all")
@org.apache.avro.specific.AvroGenerated
-public enum TypeEnum {
+public enum TypeEnum implements
org.apache.avro.generic.GenericEnumSymbol<TypeEnum> {
a, b, c ;
public static final org.apache.avro.Schema SCHEMA$ = new
org.apache.avro.Schema.Parser().parse("{\"type\":\"enum\",\"name\":\"TypeEnum\",\"namespace\":\"org.apache.avro\",\"symbols\":[\"a\",\"b\",\"c\"]}");
public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+ public org.apache.avro.Schema getSchema() { return SCHEMA$; }
}
diff --git
a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericConcreteEnum.java
b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericConcreteEnum.java
new file mode 100644
index 0000000..cd21c7b
--- /dev/null
+++
b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericConcreteEnum.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.avro.generic;
+
+import org.apache.avro.FooBarSpecificRecord;
+import org.apache.avro.TypeEnum;
+import org.apache.avro.io.Decoder;
+import org.apache.avro.io.DecoderFactory;
+import org.apache.avro.io.Encoder;
+import org.apache.avro.io.EncoderFactory;
+import org.apache.avro.specific.SpecificDatumReader;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * See AVRO-1810: GenericDatumWriter broken with Enum
+ */
+public class TestGenericConcreteEnum {
+
+ private static byte[] serializeRecord(FooBarSpecificRecord
fooBarSpecificRecord) throws IOException {
+ GenericDatumWriter<FooBarSpecificRecord> datumWriter =
+ new GenericDatumWriter<>(FooBarSpecificRecord.SCHEMA$);
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ Encoder encoder =
EncoderFactory.get().binaryEncoder(byteArrayOutputStream, null);
+ datumWriter.write(fooBarSpecificRecord, encoder);
+ encoder.flush();
+ return byteArrayOutputStream.toByteArray();
+ }
+
+ @Test
+ public void testGenericWriteAndRead() throws IOException {
+ FooBarSpecificRecord specificRecord = getRecord();
+
+ byte[] bytes = serializeRecord(specificRecord);
+
+ Decoder decoder = DecoderFactory.get().binaryDecoder(bytes, null);
+
+ GenericDatumReader<IndexedRecord> genericDatumReader = new
GenericDatumReader<>(FooBarSpecificRecord.SCHEMA$);
+ IndexedRecord deserialized = new
GenericData.Record(FooBarSpecificRecord.SCHEMA$);
+ genericDatumReader.read(deserialized, decoder);
+
+ assertEquals(0, GenericData.get().compare(specificRecord, deserialized,
FooBarSpecificRecord.SCHEMA$));
+ }
+
+ @Test
+ public void testGenericWriteSpecificRead() throws IOException {
+ FooBarSpecificRecord specificRecord = getRecord();
+
+ byte[] bytes = serializeRecord(specificRecord);
+
+ Decoder decoder = DecoderFactory.get().binaryDecoder(bytes, null);
+
+ SpecificDatumReader<FooBarSpecificRecord> specificDatumReader = new
SpecificDatumReader<>(FooBarSpecificRecord.SCHEMA$);
+ FooBarSpecificRecord deserialized = new FooBarSpecificRecord();
+ specificDatumReader.read(deserialized, decoder);
+
+ assertEquals(specificRecord, deserialized);
+ }
+
+ private FooBarSpecificRecord getRecord() {
+ return FooBarSpecificRecord.newBuilder()
+ .setId(42)
+ .setName("foo")
+ .setNicknames(Collections.singletonList("bar"))
+ .setRelatedids(Collections.singletonList(3))
+ .setTypeEnum(TypeEnum.a)
+ .build();
+ }
+}
diff --git
a/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/enum.vm
b/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/enum.vm
index 07e6746..b999e80 100644
---
a/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/enum.vm
+++
b/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/enum.vm
@@ -25,9 +25,10 @@ package $schema.getNamespace();
@$annotation
#end
@org.apache.avro.specific.AvroGenerated
-public enum ${this.mangle($schema.getName())} {
+public enum ${this.mangle($schema.getName())} implements
org.apache.avro.generic.GenericEnumSymbol<${this.mangle($schema.getName())}> {
#foreach ($symbol in ${schema.getEnumSymbols()})${this.mangle($symbol)}#if
($foreach.hasNext), #end#end
;
public static final org.apache.avro.Schema SCHEMA$ = new
org.apache.avro.Schema.Parser().parse("${this.javaEscape($schema.toString())}");
public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+ public org.apache.avro.Schema getSchema() { return SCHEMA$; }
}
diff --git a/lang/java/tools/src/test/compiler/output-string/Position.java
b/lang/java/tools/src/test/compiler/output-string/Position.java
index 5aa206b..a4504bb 100644
--- a/lang/java/tools/src/test/compiler/output-string/Position.java
+++ b/lang/java/tools/src/test/compiler/output-string/Position.java
@@ -5,8 +5,9 @@
*/
package avro.examples.baseball;
@org.apache.avro.specific.AvroGenerated
-public enum Position {
+public enum Position implements
org.apache.avro.generic.GenericEnumSymbol<Position> {
P, C, B1, B2, B3, SS, LF, CF, RF, DH ;
public static final org.apache.avro.Schema SCHEMA$ = new
org.apache.avro.Schema.Parser().parse("{\"type\":\"enum\",\"name\":\"Position\",\"namespace\":\"avro.examples.baseball\",\"symbols\":[\"P\",\"C\",\"B1\",\"B2\",\"B3\",\"SS\",\"LF\",\"CF\",\"RF\",\"DH\"]}");
public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+ public org.apache.avro.Schema getSchema() { return SCHEMA$; }
}
diff --git
a/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/Position.java
b/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/Position.java
index 5aa206b..a4504bb 100644
---
a/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/Position.java
+++
b/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/Position.java
@@ -5,8 +5,9 @@
*/
package avro.examples.baseball;
@org.apache.avro.specific.AvroGenerated
-public enum Position {
+public enum Position implements
org.apache.avro.generic.GenericEnumSymbol<Position> {
P, C, B1, B2, B3, SS, LF, CF, RF, DH ;
public static final org.apache.avro.Schema SCHEMA$ = new
org.apache.avro.Schema.Parser().parse("{\"type\":\"enum\",\"name\":\"Position\",\"namespace\":\"avro.examples.baseball\",\"symbols\":[\"P\",\"C\",\"B1\",\"B2\",\"B3\",\"SS\",\"LF\",\"CF\",\"RF\",\"DH\"]}");
public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+ public org.apache.avro.Schema getSchema() { return SCHEMA$; }
}
diff --git a/lang/java/tools/src/test/compiler/output/Position.java
b/lang/java/tools/src/test/compiler/output/Position.java
index 5aa206b..a4504bb 100644
--- a/lang/java/tools/src/test/compiler/output/Position.java
+++ b/lang/java/tools/src/test/compiler/output/Position.java
@@ -5,8 +5,9 @@
*/
package avro.examples.baseball;
@org.apache.avro.specific.AvroGenerated
-public enum Position {
+public enum Position implements
org.apache.avro.generic.GenericEnumSymbol<Position> {
P, C, B1, B2, B3, SS, LF, CF, RF, DH ;
public static final org.apache.avro.Schema SCHEMA$ = new
org.apache.avro.Schema.Parser().parse("{\"type\":\"enum\",\"name\":\"Position\",\"namespace\":\"avro.examples.baseball\",\"symbols\":[\"P\",\"C\",\"B1\",\"B2\",\"B3\",\"SS\",\"LF\",\"CF\",\"RF\",\"DH\"]}");
public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+ public org.apache.avro.Schema getSchema() { return SCHEMA$; }
}