Return-Path: Delivered-To: apmail-avro-commits-archive@www.apache.org Received: (qmail 98696 invoked from network); 25 Aug 2010 17:52:32 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 25 Aug 2010 17:52:32 -0000 Received: (qmail 89235 invoked by uid 500); 25 Aug 2010 17:52:32 -0000 Delivered-To: apmail-avro-commits-archive@avro.apache.org Received: (qmail 89205 invoked by uid 500); 25 Aug 2010 17:52:32 -0000 Mailing-List: contact commits-help@avro.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@avro.apache.org Delivered-To: mailing list commits@avro.apache.org Received: (qmail 89197 invoked by uid 99); 25 Aug 2010 17:52:32 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 Aug 2010 17:52:32 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 Aug 2010 17:52:31 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E7F9F2388A5F; Wed, 25 Aug 2010 17:51:13 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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/ Date: Wed, 25 Aug 2010 17:51:13 -0000 To: commits@avro.apache.org From: cutting@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100825175113.E7F9F2388A5F@eris.apache.org> 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 fields = new ArrayList(); 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 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 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 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 fields = new ArrayList(); + 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(), + new ReflectDatumReader()); + } + }