You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by to...@apache.org on 2014/02/28 11:44:10 UTC

svn commit: r1572912 - in /avro/trunk: CHANGES.txt lang/java/avro/src/main/java/org/apache/avro/reflect/FieldAccessUnsafe.java lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java

Author: tomwhite
Date: Fri Feb 28 10:44:09 2014
New Revision: 1572912

URL: http://svn.apache.org/r1572912
Log:
AVRO-1458. Java: Setting char record field via reflection affects other fields

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/FieldAccessUnsafe.java
    avro/trunk/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1572912&r1=1572911&r2=1572912&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Fri Feb 28 10:44:09 2014
@@ -31,6 +31,9 @@ Trunk (not yet released)
 
     AVRO-1436. C#: Fix tests to run multiple times. (David Taylor via cutting)
 
+    AVRO-1458. Java: Setting char record field via reflection affects other
+    fields. (tomwhite)
+
 Avro 1.7.6 (15 January 2014)
 
   NEW FEATURES

Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/FieldAccessUnsafe.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/FieldAccessUnsafe.java?rev=1572912&r1=1572911&r2=1572912&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/FieldAccessUnsafe.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/FieldAccessUnsafe.java Fri Feb 28 10:44:09 2014
@@ -236,7 +236,7 @@ class FieldAccessUnsafe extends FieldAcc
 
     @Override
     protected void set(Object object, Object value) {
-      UNSAFE.putInt(object, offset, (Character) value);
+      UNSAFE.putChar(object, offset, (Character) value);
     }
 
     @Override

Modified: avro/trunk/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java?rev=1572912&r1=1572911&r2=1572912&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java (original)
+++ avro/trunk/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java Fri Feb 28 10:44:09 2014
@@ -79,6 +79,11 @@ public class TestReflect {
     check(Short.class, "{\"type\":\"int\",\"java-class\":\"java.lang.Short\"}");
   }
 
+  @Test public void testChar() {
+    check(Character.TYPE, "{\"type\":\"int\",\"java-class\":\"java.lang.Character\"}");
+    check(Character.class, "{\"type\":\"int\",\"java-class\":\"java.lang.Character\"}");
+  }
+
   @Test public void testLong() {
     check(Long.TYPE, "\"long\"");
     check(Long.class, "\"long\"");
@@ -208,6 +213,7 @@ public class TestReflect {
     public short value;
     public short[] shorts;
     public byte b;
+    public char c;
     
     @Override
     public boolean equals(Object o) {
@@ -215,7 +221,8 @@ public class TestReflect {
       R4 that = (R4)o;
       return this.value == that.value
         && Arrays.equals(this.shorts, that.shorts)
-        && this.b == that.b;
+        && this.b == that.b
+        && this.c == that.c;
     }
   }
 
@@ -226,6 +233,7 @@ public class TestReflect {
     r5.value = 1;
     r5.shorts = new short[] {3,255,256,Short.MAX_VALUE,Short.MIN_VALUE};
     r5.b = 99;
+    r5.c = 'a';
     checkReadWrite(r5);
   }
 
@@ -457,6 +465,16 @@ public class TestReflect {
       reader.read(null, DecoderFactory.get().binaryDecoder(
           out.toByteArray(), null));
     assertEquals(object, after);
+
+    // check reflective setField works for records
+    if (s.getType().equals(Schema.Type.RECORD)) {
+      Object copy = object.getClass().newInstance();
+      for (Field f : s.getFields()) {
+        Object val = ReflectData.get().getField(object, f.name(), f.pos());
+        ReflectData.get().setField(copy, f.name(), f.pos(), val);
+      }
+      assertEquals("setField", object, copy);
+    }
   }
 
   public static enum E { A, B };