Author: cutting
Date: Mon Aug  4 20:08:11 2014
New Revision: 1615764

URL: http://svn.apache.org/r1615764
Log:
AVRO-1544. Java: Fix GenericData#validate for unions with null.  Contributed by 
Matthew Hayes.

Modified:
    avro/trunk/CHANGES.txt
    
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
    
avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java

Modified: avro/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1615764&r1=1615763&r2=1615764&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Mon Aug  4 20:08:11 2014
@@ -12,6 +12,9 @@ Trunk (not yet released)
 
     AVRO-1553. Java: MapReduce never uses MapOutputValueSchema (tomwhite)
 
+    AVRO-1544. Java: Fix GenericData#validate for unions with null.
+    (Matthew Hayes via cutting)
+
 Avro 1.7.7 (23 July 2014)
 
   NEW FEATURES

Modified: 
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
URL: 
http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java?rev=1615764&r1=1615763&r2=1615764&view=diff
==============================================================================
--- 
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
 (original)
+++ 
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
 Mon Aug  4 20:08:11 2014
@@ -375,6 +375,7 @@ public class GenericData {
       }
       return true;
     case ENUM:
+      if (datum == null) return false;
       return schema.getEnumSymbols().contains(datum.toString());
     case ARRAY:
       if (!(isArray(datum))) return false;

Modified: 
avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
URL: 
http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java?rev=1615764&r1=1615763&r2=1615764&view=diff
==============================================================================
--- 
avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
 (original)
+++ 
avro/trunk/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
 Mon Aug  4 20:08:11 2014
@@ -404,4 +404,40 @@ public class TestGenericData {
 
     assertEquals(buffer, buffer_copy);
   }
+
+  @Test
+  public void testValidateNullableEnum() {
+    List<Schema> unionTypes = new ArrayList<Schema>();
+    Schema schema;
+    Schema nullSchema = Schema.create(Type.NULL);
+    Schema enumSchema = Schema.createEnum("AnEnum", null, null, 
Arrays.asList("X","Y","Z"));
+    GenericEnumSymbol w = new GenericData.EnumSymbol(enumSchema, "W");
+    GenericEnumSymbol x = new GenericData.EnumSymbol(enumSchema, "X");
+    GenericEnumSymbol y = new GenericData.EnumSymbol(enumSchema, "Y");
+    GenericEnumSymbol z = new GenericData.EnumSymbol(enumSchema, "Z");
+
+    // null is first
+    unionTypes.clear();
+    unionTypes.add(nullSchema);
+    unionTypes.add(enumSchema);
+    schema = Schema.createUnion(unionTypes);
+
+    assertTrue(GenericData.get().validate(schema, z));
+    assertTrue(GenericData.get().validate(schema, y));
+    assertTrue(GenericData.get().validate(schema, x));
+    assertFalse(GenericData.get().validate(schema, w));
+    assertTrue(GenericData.get().validate(schema, null));
+
+    // null is last
+    unionTypes.clear();
+    unionTypes.add(enumSchema);
+    unionTypes.add(nullSchema);
+    schema = Schema.createUnion(unionTypes);
+
+    assertTrue(GenericData.get().validate(schema, z));
+    assertTrue(GenericData.get().validate(schema, y));
+    assertTrue(GenericData.get().validate(schema, x));
+    assertFalse(GenericData.get().validate(schema, w));
+    assertTrue(GenericData.get().validate(schema, null));
+  }
 }


Reply via email to