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 2011/09/22 21:07:08 UTC

svn commit: r1174323 - in /avro/trunk: ./ lang/java/avro/src/main/java/org/apache/avro/generic/ lang/java/avro/src/main/java/org/apache/avro/specific/ lang/java/ipc/src/test/java/org/apache/avro/

Author: cutting
Date: Thu Sep 22 19:07:08 2011
New Revision: 1174323

URL: http://svn.apache.org/viewvc?rev=1174323&view=rev
Log:
AVRO-891. Java: In SpecificDatumReader, when no reader schema is specified, use schema of currently loaded class.

Added:
    avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestDataFileSpecific.java
Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader.java
    avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumReader.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1174323&r1=1174322&r2=1174323&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Thu Sep 22 19:07:08 2011
@@ -71,6 +71,9 @@ Avro 1.6.0 (unreleased)
 
     AVRO-874. Remove experimental disclaimer from IDL documentation. (cutting)
 
+    AVRO-891. Java: In SpecificDatumReader, when no reader schema is
+    specified, use schema of currently loaded class.  (cutting) 
+
   BUG FIXES
 
     AVRO-824. Java: Fix usage message of BinaryFragmentToJsonTool.

Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader.java?rev=1174323&r1=1174322&r2=1174323&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader.java Thu Sep 22 19:07:08 2011
@@ -66,6 +66,9 @@ public class GenericDatumReader<D> imple
   /** Return the {@link GenericData} implementation. */
   public GenericData getData() { return data; }
 
+  /** Return the writer's schema. */
+  public Schema getSchema() { return actual; }
+
   @Override
   public void setSchema(Schema writer) {
     this.actual = writer;
@@ -75,8 +78,11 @@ public class GenericDatumReader<D> imple
     creatorResolver = null;
   }
 
+  /** Get the reader's schema. */
+  public Schema getExpected() { return expected; }
+
   /** Set the reader's schema. */
-  public void setExpected(Schema reader) throws IOException {
+  public void setExpected(Schema reader) {
     this.expected = reader;
     creatorResolver = null;
   }

Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumReader.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumReader.java?rev=1174323&r1=1174322&r2=1174323&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumReader.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificDatumReader.java Thu Sep 22 19:07:08 2011
@@ -51,6 +51,20 @@ public class SpecificDatumReader<T> exte
   public SpecificData getSpecificData() { return (SpecificData)getData(); }
 
   @Override
+  public void setSchema(Schema actual) {
+    // if expected is unset and actual is a specific record,
+    // then default expected to schema of currently loaded class
+    if (getExpected() == null && actual != null
+        && actual.getType() == Schema.Type.RECORD) {
+      SpecificData data = getSpecificData();
+      Class c = data.getClass(actual);
+      if (c != null && SpecificRecord.class.isAssignableFrom(c))
+        setExpected(data.getSchema(c));
+    }
+    super.setSchema(actual);
+  }
+
+  @Override
   @SuppressWarnings("unchecked")
   protected Object createEnum(String symbol, Schema schema) {
     Class c = getSpecificData().getClass(schema);

Added: avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestDataFileSpecific.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestDataFileSpecific.java?rev=1174323&view=auto
==============================================================================
--- avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestDataFileSpecific.java (added)
+++ avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestDataFileSpecific.java Thu Sep 22 19:07:08 2011
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.avro;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.avro.file.DataFileReader;
+import org.apache.avro.file.DataFileWriter;
+import org.apache.avro.generic.GenericData.Record;
+import org.apache.avro.generic.GenericDatumWriter;
+import org.apache.avro.specific.SpecificDatumReader;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.avro.Foo;
+
+public class TestDataFileSpecific {
+
+  private static final File DIR =
+    new File(System.getProperty("test.dir","/tmp"));
+  private static final File FILE = new File(DIR, "specific.avro");
+
+  /* Test when using SpecificDatumReader<T>() constructor to read from a file
+   * with a different schema that both reader & writer schemas are found.*/
+  @Test
+  public void testSpecificDatumReaderDefaultCtor() throws IOException {
+    // like the specific Foo, but with another field
+    Schema s1 = Schema.parse("{\"type\":\"record\",\"name\":\"Foo\","
+                             +"\"namespace\":\"org.apache.avro\",\"fields\":["
+                             +"{\"name\":\"label\",\"type\":\"string\"},"
+                             +"{\"name\":\"id\",\"type\":\"int\"}]}");
+
+    // write a file using generic objects
+    DataFileWriter<Record> writer
+      = new DataFileWriter<Record>(new GenericDatumWriter<Record>(s1))
+      .create(s1, FILE);
+    for (int i = 0; i < 10; i++) {
+      Record r = new Record(s1);
+      r.put("label", ""+i);
+      r.put("id", i);
+      writer.append(r);
+    }
+    writer.close();
+
+    // read using a 'new SpecificDatumReader<T>()' to force inference of
+    // reader's schema from runtime
+    DataFileReader<Foo> reader =
+      new DataFileReader<Foo>(FILE, new SpecificDatumReader<Foo>());
+    int i = 0;
+    for (Foo f : reader) 
+      Assert.assertEquals(""+(i++), f.getLabel().toString());
+    Assert.assertEquals(10, i);
+    reader.close();
+  }
+
+}