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/25 19:51:13 UTC

svn commit: r989263 - in /avro/trunk: ./ lang/java/src/java/org/apache/avro/generic/ lang/java/src/java/org/apache/avro/reflect/ lang/java/src/test/java/org/apache/avro/

Author: cutting
Date: Wed Aug 25 17:51:13 2010
New Revision: 989263

URL: http://svn.apache.org/viewvc?rev=989263&view=rev
Log:
AVRO-598. Use generic data structures when reading with reflect API and classes are not defined.

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java
    avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java
    avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumReader.java
    avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=989263&r1=989262&r2=989263&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Wed Aug 25 17:51:13 2010
@@ -136,6 +136,9 @@ Avro 1.4.0 (unreleased)
 
     AVRO-617. Java: Detect erroneous default field values. (cutting)
 
+    AVRO-598. Java: Use generic data structures when reading with
+    reflect API and classes are not defined. (cutting)
+
   BUG FIXES
 
     AVRO-622. python avro.ipc doesn't work with python2.4 (philz)

Modified: avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java?rev=989263&r1=989262&r2=989263&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericData.java Wed Aug 25 17:51:13 2010
@@ -479,6 +479,8 @@ public class GenericData {
     if (o1 == o2) return 0;
     switch (s.getType()) {
     case RECORD:
+      if (!(o1 instanceof IndexedRecord))
+        return ((Comparable)o1).compareTo(o2);
       IndexedRecord r1 = (IndexedRecord)o1;
       IndexedRecord r2 = (IndexedRecord)o2;
       for (Field f : s.getFields()) {

Modified: avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java?rev=989263&r1=989262&r2=989263&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java Wed Aug 25 17:51:13 2010
@@ -38,6 +38,7 @@ import org.apache.avro.AvroTypeException
 import org.apache.avro.Protocol;
 import org.apache.avro.Schema;
 import org.apache.avro.Protocol.Message;
+import org.apache.avro.generic.IndexedRecord;
 import org.apache.avro.generic.GenericFixed;
 import org.apache.avro.specific.SpecificData;
 import org.apache.avro.specific.FixedSize;
@@ -264,6 +265,8 @@ public class ReflectData extends Specifi
         } else if (GenericFixed.class.isAssignableFrom(c)) { // fixed
           int size = c.getAnnotation(FixedSize.class).value();
           schema = Schema.createFixed(name, null /* doc */, space, size);
+        } else if (IndexedRecord.class.isAssignableFrom(c)) { // specific
+          return super.createSchema(type, names);
         } else {                                             // record
           List<Schema.Field> fields = new ArrayList<Schema.Field>();
           boolean error = Throwable.class.isAssignableFrom(c);

Modified: avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumReader.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumReader.java?rev=989263&r1=989262&r2=989263&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumReader.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumReader.java Wed Aug 25 17:51:13 2010
@@ -26,6 +26,7 @@ import java.nio.ByteBuffer;
 
 import org.apache.avro.AvroRuntimeException;
 import org.apache.avro.Schema;
+import org.apache.avro.generic.IndexedRecord;
 import org.apache.avro.specific.SpecificDatumReader;
 import org.apache.avro.io.Decoder;
 
@@ -46,7 +47,11 @@ public class ReflectDatumReader<T> exten
 
   @Override
   protected void setField(Object record, String name, int position, Object o) {
-    try {
+    if (record instanceof IndexedRecord) {
+      super.setField(record, name, position, o);
+      return;
+    }
+      try {
       ReflectData.getField(record.getClass(), name).set(record, o);
     } catch (IllegalAccessException e) {
       throw new AvroRuntimeException(e);
@@ -55,6 +60,8 @@ public class ReflectDatumReader<T> exten
 
   @Override
   protected Object getField(Object record, String name, int position) {
+    if (record instanceof IndexedRecord)
+      return super.getField(record, name, position);
     try {
       return ReflectData.getField(record.getClass(), name).get(record);
     } catch (IllegalAccessException e) {

Modified: avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java?rev=989263&r1=989262&r2=989263&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectDatumWriter.java Wed Aug 25 17:51:13 2010
@@ -24,6 +24,7 @@ import java.util.Collection;
 
 import org.apache.avro.AvroRuntimeException;
 import org.apache.avro.Schema;
+import org.apache.avro.generic.IndexedRecord;
 import org.apache.avro.specific.SpecificDatumWriter;
 import org.apache.avro.io.Encoder;
 
@@ -58,6 +59,8 @@ public class ReflectDatumWriter<T> exten
   
   @Override
   protected Object getField(Object record, String name, int position) {
+    if (record instanceof IndexedRecord)
+      return super.getField(record, name, position);
     try {
       return ReflectData.getField(record.getClass(), name).get(record);
     } catch (IllegalAccessException e) {

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java?rev=989263&r1=989262&r2=989263&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java Wed Aug 25 17:51:13 2010
@@ -37,6 +37,7 @@ import org.apache.avro.TestReflect.Sampl
 import org.apache.avro.io.DecoderFactory;
 import org.apache.avro.io.BinaryEncoder;
 import org.apache.avro.io.Decoder;
+import org.apache.avro.generic.GenericData;
 import org.apache.avro.reflect.ReflectData;
 import org.apache.avro.reflect.ReflectDatumReader;
 import org.apache.avro.reflect.ReflectDatumWriter;
@@ -522,4 +523,32 @@ public class TestReflect {
     ReflectData.get().getProtocol(Class.forName("NoPackage"));
   }
 
+  public static class Y implements Comparable {
+    int i;
+    @Override public boolean equals(Object o) { return ((Y)o).i == this.i; }
+    @Override public int compareTo(Object o) { return ((Y)o).i - this.i; }
+  }
+
+  @Test
+  /** Test nesting of reflect data within generic. */
+  public void testReflectWithinGeneric() throws Exception {
+    ReflectData data = ReflectData.get();
+    // define a record with a field that's a specific Y
+    Schema schema = Schema.createRecord("Foo", "", "x.y.z", false);
+    List<Schema.Field> fields = new ArrayList<Schema.Field>();
+    fields.add(new Schema.Field("f", data.getSchema(Y.class), "", null));
+    schema.setFields(fields);
+
+    // create a generic instance of this record
+    Y y = new Y();
+    y.i = 1;
+    GenericData.Record record = new GenericData.Record(schema);
+    record.put("f", y);
+
+    // test that this instance can be written & re-read
+    TestSchema.checkBinary(schema, record,
+                           new ReflectDatumWriter<Object>(),
+                           new ReflectDatumReader<Object>());
+  }
+
 }