You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2010/08/18 23:44:22 UTC

svn commit: r986959 - in /avro/trunk: CHANGES.txt lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java lang/java/src/test/java/org/apache/avro/TestSchema.java

Author: cutting
Date: Wed Aug 18 21:44:22 2010
New Revision: 986959

URL: http://svn.apache.org/viewvc?rev=986959&view=rev
Log:
AVRO-615. Java: Improve error message for NullPointerException while writing data.

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=986959&r1=986958&r2=986959&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Wed Aug 18 21:44:22 2010
@@ -122,6 +122,9 @@ Avro 1.4.0 (unreleased)
     AVRO-616. Java: Add comment to generated source files noting that
     they should not be edited. (Patrick Wendell via cutting)
 
+    AVRO-615. Java: Improve error message for NullPointerException
+    when writing data.  (cutting)
+
   BUG FIXES
 
     AVRO-502. Memory leak from parsing JSON schema.

Modified: avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java?rev=986959&r1=986958&r2=986959&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java Wed Aug 18 21:44:22 2010
@@ -58,35 +58,50 @@ public class GenericDatumWriter<D> imple
   /** Called to write data.*/
   protected void write(Schema schema, Object datum, Encoder out)
     throws IOException {
-    switch (schema.getType()) {
-    case RECORD: writeRecord(schema, datum, out); break;
-    case ENUM:   writeEnum(schema, datum, out);   break;
-    case ARRAY:  writeArray(schema, datum, out);  break;
-    case MAP:    writeMap(schema, datum, out);    break;
-    case UNION:
-      int index = data.resolveUnion(schema, datum);
-      out.writeIndex(index);
-      write(schema.getTypes().get(index), datum, out);
-      break;
-    case FIXED:   writeFixed(schema, datum, out);   break;
-    case STRING:  writeString(schema, datum, out);  break;
-    case BYTES:   writeBytes(datum, out);           break;
-    case INT:     out.writeInt((Integer)datum);     break;
-    case LONG:    out.writeLong((Long)datum);       break;
-    case FLOAT:   out.writeFloat((Float)datum);     break;
-    case DOUBLE:  out.writeDouble((Double)datum);   break;
-    case BOOLEAN: out.writeBoolean((Boolean)datum); break;
-    case NULL:    out.writeNull();                  break;
-    default: error(schema,datum);
+    try {
+      switch (schema.getType()) {
+      case RECORD: writeRecord(schema, datum, out); break;
+      case ENUM:   writeEnum(schema, datum, out);   break;
+      case ARRAY:  writeArray(schema, datum, out);  break;
+      case MAP:    writeMap(schema, datum, out);    break;
+      case UNION:
+        int index = data.resolveUnion(schema, datum);
+        out.writeIndex(index);
+        write(schema.getTypes().get(index), datum, out);
+        break;
+      case FIXED:   writeFixed(schema, datum, out);   break;
+      case STRING:  writeString(schema, datum, out);  break;
+      case BYTES:   writeBytes(datum, out);           break;
+      case INT:     out.writeInt((Integer)datum);     break;
+      case LONG:    out.writeLong((Long)datum);       break;
+      case FLOAT:   out.writeFloat((Float)datum);     break;
+      case DOUBLE:  out.writeDouble((Double)datum);   break;
+      case BOOLEAN: out.writeBoolean((Boolean)datum); break;
+      case NULL:    out.writeNull();                  break;
+      default: error(schema,datum);
+      }
+    } catch (NullPointerException e) {
+      throw npe(e, " of "+schema.getName());
     }
   }
 
+  private NullPointerException npe(NullPointerException e, String s) {
+    NullPointerException result = new NullPointerException(e.getMessage()+s);
+    result.initCause(e.getCause() == null ? e : e.getCause());
+    return result;
+  }
+
   /** Called to write a record.  May be overridden for alternate record
    * representations.*/
   protected void writeRecord(Schema schema, Object datum, Encoder out)
     throws IOException {
-    for (Field field : schema.getFields()) {
-      write(field.schema(), getField(datum, field.name(), field.pos()), out);
+    for (Field f : schema.getFields()) {
+      Object value = getField(datum, f.name(), f.pos());
+      try {
+        write(f.schema(), value, out);
+      } catch (NullPointerException e) {
+        throw npe(e, " in field "+f.name());
+      }
     }
   }
   

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java?rev=986959&r1=986958&r2=986959&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java Wed Aug 18 21:44:22 2010
@@ -331,6 +331,21 @@ public class TestSchema {
     assertEquals("q.Z", ys.getField("f").schema().getFullName());
   }
 
+  @Test
+  public void testNullPointer() throws Exception {
+    String recordJson = "{\"type\":\"record\", \"name\":\"Test\", \"fields\":"
+      +"[{\"name\":\"x\", \"type\":\"string\"}]}";
+    Schema schema = Schema.parse(recordJson);
+    GenericData.Record record = new GenericData.Record(schema);
+    try {
+      checkBinary(schema, record,
+                  new GenericDatumWriter<Object>(),
+                  new GenericDatumReader<Object>());
+    } catch (NullPointerException e) {
+      assertEquals("null of string in field x of Test", e.getMessage());
+    }
+  }
+
   private static void checkParseError(String json) {
     try {
       Schema.parse(json);