You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by ga...@apache.org on 2017/06/16 07:01:51 UTC
avro git commit: AVRO-1971: Allow alias annotation on fields
Repository: avro
Updated Branches:
refs/heads/master c04a17c86 -> edd8edda0
AVRO-1971: Allow alias annotation on fields
This closes #175
Project: http://git-wip-us.apache.org/repos/asf/avro/repo
Commit: http://git-wip-us.apache.org/repos/asf/avro/commit/edd8edda
Tree: http://git-wip-us.apache.org/repos/asf/avro/tree/edd8edda
Diff: http://git-wip-us.apache.org/repos/asf/avro/diff/edd8edda
Branch: refs/heads/master
Commit: edd8edda0659f802e203e36bcb9d8ec51d821f26
Parents: c04a17c
Author: baunz <jo...@gmail.com>
Authored: Sun Dec 18 21:48:33 2016 +0100
Committer: Gabor Szadovszky <ga...@apache.org>
Committed: Fri Jun 16 09:01:32 2017 +0200
----------------------------------------------------------------------
CHANGES.txt | 2 ++
.../java/org/apache/avro/reflect/AvroAlias.java | 2 +-
.../org/apache/avro/reflect/ReflectData.java | 15 +++++++++++
.../org/apache/avro/reflect/TestReflect.java | 28 +++++++++++++++++++-
4 files changed, 45 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/avro/blob/edd8edda/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index d908348..c387de6 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -50,6 +50,8 @@ Trunk (not yet released)
AVRO-1723. Add support for forward declarations in avro IDL (Zoltan Farcas via thiru)
+ AVRO-1971: Allow alias annotation on fields (Johannes Schulte via gabor)
+
BUG FIXES
AVRO-1741: Python3: Fix error when codec is not in the header.
http://git-wip-us.apache.org/repos/asf/avro/blob/edd8edda/lang/java/avro/src/main/java/org/apache/avro/reflect/AvroAlias.java
----------------------------------------------------------------------
diff --git a/lang/java/avro/src/main/java/org/apache/avro/reflect/AvroAlias.java b/lang/java/avro/src/main/java/org/apache/avro/reflect/AvroAlias.java
index d613350..66f51e8 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/reflect/AvroAlias.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/reflect/AvroAlias.java
@@ -28,7 +28,7 @@ import java.lang.annotation.Target;
* named by the alias.
*/
@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
+@Target({ElementType.TYPE, ElementType.FIELD})
public @interface AvroAlias {
String NULL = "NOT A VALID NAMESPACE";
http://git-wip-us.apache.org/repos/asf/avro/blob/edd8edda/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
----------------------------------------------------------------------
diff --git a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
index 60095ad..eb9f5fb 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
@@ -633,6 +633,9 @@ public class ReflectData extends SpecificData {
if (f.name().equals(fieldName))
throw new AvroTypeException("double field entry: "+ fieldName);
}
+
+ consumeFieldAlias(field, recordField);
+
fields.add(recordField);
}
if (error) // add Throwable message
@@ -877,6 +880,18 @@ public class ReflectData extends SpecificData {
}
}
+
+ private void consumeFieldAlias(Field field, Schema.Field recordField) {
+ AvroAlias alias = field.getAnnotation(AvroAlias.class);
+ if (alias != null) {
+ if (!alias.space().equals(AvroAlias.NULL)) {
+ throw new AvroRuntimeException(
+ "Namespaces are not allowed on field aliases. " + "Offending field: " + recordField.name());
+ }
+ recordField.addAlias(alias.alias());
+ }
+ }
+
@Override
public Object createFixed(Object old, Schema schema) {
// SpecificData will try to instantiate the type returned by getClass, but
http://git-wip-us.apache.org/repos/asf/avro/blob/edd8edda/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java
----------------------------------------------------------------------
diff --git a/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java b/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java
index 8b23730..afe7f08 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java
@@ -39,6 +39,7 @@ import org.apache.avro.AvroRuntimeException;
import org.apache.avro.AvroTypeException;
import org.apache.avro.Protocol;
import org.apache.avro.Schema;
+import org.apache.avro.SchemaBuilder;
import org.apache.avro.Schema.Field;
import org.apache.avro.generic.GenericData;
import org.apache.avro.io.Decoder;
@@ -1029,12 +1030,37 @@ public class TestReflect {
private static class AliasC { }
@Test
- public void testAvroAlias() {
+ public void testAvroAliasOnClass() {
check(AliasA.class, "{\"type\":\"record\",\"name\":\"AliasA\",\"namespace\":\"org.apache.avro.reflect.TestReflect$\",\"fields\":[],\"aliases\":[\"b.a\"]}");
check(AliasB.class, "{\"type\":\"record\",\"name\":\"AliasB\",\"namespace\":\"org.apache.avro.reflect.TestReflect$\",\"fields\":[],\"aliases\":[\"a\"]}");
check(AliasC.class, "{\"type\":\"record\",\"name\":\"AliasC\",\"namespace\":\"org.apache.avro.reflect.TestReflect$\",\"fields\":[],\"aliases\":[\"a\"]}");
}
+ private static class ClassWithAliasOnField {
+ @AvroAlias(alias = "aliasName")
+ int primitiveField;
+ }
+
+ private static class ClassWithAliasAndNamespaceOnField {
+ @AvroAlias(alias = "aliasName", space = "forbidden.space.entry")
+ int primitiveField;
+ }
+
+ @Test
+ public void testAvroAliasOnField() {
+
+ Schema expectedSchema = SchemaBuilder.record(ClassWithAliasOnField.class.getSimpleName())
+ .namespace("org.apache.avro.reflect.TestReflect$").fields().name("primitiveField").aliases("aliasName")
+ .type(Schema.create(org.apache.avro.Schema.Type.INT)).noDefault().endRecord();
+
+ check(ClassWithAliasOnField.class, expectedSchema.toString());
+ }
+
+ @Test(expected = AvroRuntimeException.class)
+ public void namespaceDefinitionOnFieldAliasMustThrowException() {
+ ReflectData.get().getSchema(ClassWithAliasAndNamespaceOnField.class);
+ }
+
private static class DefaultTest {
@AvroDefault("1")
int foo;