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 2013/09/04 22:59:57 UTC

svn commit: r1520141 - in /avro/trunk: CHANGES.txt lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumWriter.java lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java

Author: cutting
Date: Wed Sep  4 20:59:57 2013
New Revision: 1520141

URL: http://svn.apache.org/r1520141
Log:
AVRO-1368. Fix SpecificDatumWriter to, when writing a string schema, not silently convert any object to a string.  Contributed by Christophe Taton.

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumWriter.java
    avro/trunk/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1520141&r1=1520140&r2=1520141&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Wed Sep  4 20:59:57 2013
@@ -13,6 +13,10 @@ Trunk (not yet released)
 
   BUG FIXES
 
+    AVRO-1368. Fix SpecificDatumWriter to, when writing a string
+    schema, not silently convert any object to a string.
+    (Christophe Taton via cutting)
+
 Avro 1.7.5 (12 August 2013)
 
   NEW FEATURES

Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumWriter.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumWriter.java?rev=1520141&r1=1520140&r2=1520141&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumWriter.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumWriter.java Wed Sep  4 20:59:57 2013
@@ -45,6 +45,11 @@ public class SpecificDatumWriter<T> exte
     super(specificData);
   }
   
+  /** Returns the {@link SpecificData} implementation used by this writer. */
+  public SpecificData getSpecificData() {
+    return (SpecificData) getData();
+  }
+
   @Override
   protected void writeEnum(Schema schema, Object datum, Encoder out)
     throws IOException {
@@ -57,8 +62,10 @@ public class SpecificDatumWriter<T> exte
   @Override
   protected void writeString(Schema schema, Object datum, Encoder out)
     throws IOException {
-    if (!(datum instanceof CharSequence))         // Stringable
-      datum = datum.toString();                   // call toString()
+    if (!(datum instanceof CharSequence)
+        && getSpecificData().isStringable(datum.getClass())) {
+      datum = datum.toString();                   // convert to string
+    }
     writeString(datum, out);
   }
 

Modified: avro/trunk/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java?rev=1520141&r1=1520140&r2=1520141&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java (original)
+++ avro/trunk/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java Wed Sep  4 20:59:57 2013
@@ -22,7 +22,9 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
+import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -30,6 +32,9 @@ import java.util.List;
 import org.apache.avro.Schema;
 import org.apache.avro.Schema.Field;
 import org.apache.avro.Schema.Type;
+import org.apache.avro.io.DatumWriter;
+import org.apache.avro.io.Encoder;
+import org.apache.avro.io.EncoderFactory;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -125,4 +130,19 @@ public class TestSpecificData {
     assertEquals(1, record.get("x"));
     assertEquals("str", record.get("y"));
   }
+
+  /** Tests that non Stringable datum are rejected by specific writers. */
+  @Test
+  public void testNonStringable() throws Exception {
+    final Schema string = Schema.create(Type.STRING);
+    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    final Encoder encoder = EncoderFactory.get().directBinaryEncoder(baos, null);
+    final DatumWriter<Object> writer = new SpecificDatumWriter<Object>(string);
+    try {
+      writer.write(new Object(), encoder);
+      fail("Non stringable object should be rejected.");
+    } catch (ClassCastException cce) {
+      // Expected error
+    }
+  }
 }