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/03/24 20:49:37 UTC

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

Author: cutting
Date: Wed Mar 24 19:49:36 2010
New Revision: 927167

URL: http://svn.apache.org/viewvc?rev=927167&view=rev
Log:
AVRO-487. Fix Java reflect protocols to transmit error messages.

Added:
    hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleException.java
      - copied, changed from r926257, hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleError.java
Removed:
    hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleError.java
Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java
    hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolReflect.java
    hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java

Modified: hadoop/avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=927167&r1=927166&r2=927167&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Wed Mar 24 19:49:36 2010
@@ -25,6 +25,8 @@ Avro 1.3.2 (unreleased)
     AVRO-479. Fix 'sign' target in top-level build.sh to generate md5
     checksums. (cutting)
 
+    AVRO-487. Fix Java reflect protocols to transmit error messages. (cutting)
+
 Avro 1.3.1 (16 March 2010)
 
   NEW FEATURES

Modified: hadoop/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java?rev=927167&r1=927166&r2=927167&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java (original)
+++ hadoop/avro/trunk/lang/java/src/java/org/apache/avro/reflect/ReflectData.java Wed Mar 24 19:49:36 2010
@@ -271,8 +271,8 @@ public class ReflectData extends Specifi
           schema = Schema.createFixed(name, null /* doc */, space, size);
         } else {                                             // record
           List<Schema.Field> fields = new ArrayList<Schema.Field>();
-          schema = Schema.createRecord(name, null /* doc */, space, 
-                                       Throwable.class.isAssignableFrom(c));
+          boolean error = Throwable.class.isAssignableFrom(c);
+          schema = Schema.createRecord(name, null /* doc */, space, error);
           names.put(c.getName(), schema);
           for (Field field : getFields(c))
             if ((field.getModifiers()&(Modifier.TRANSIENT|Modifier.STATIC))==0){
@@ -280,6 +280,9 @@ public class ReflectData extends Specifi
               fields.add(new Schema.Field(field.getName(),
                   fieldSchema, null /* doc */, null));
             }
+          if (error)                              // add Throwable message
+            fields.add(new Schema.Field("detailMessage", THROWABLE_MESSAGE,
+                                        null, null));
           schema.setFields(fields);
         }
         names.put(fullName, schema);
@@ -289,6 +292,9 @@ public class ReflectData extends Specifi
     return super.createSchema(type, names);
   }
 
+  private static final Schema THROWABLE_MESSAGE =
+    makeNullable(Schema.create(Schema.Type.STRING));
+
   // if array element type is a class with a union annotation, note it
   // this is required because we cannot set a property on the union itself 
   @SuppressWarnings(value="unchecked")

Copied: hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleException.java (from r926257, hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleError.java)
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleException.java?p2=hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleException.java&p1=hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleError.java&r1=926257&r2=927167&rev=927167&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleError.java (original)
+++ hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/SimpleException.java Wed Mar 24 19:49:36 2010
@@ -19,4 +19,7 @@ package org.apache.avro;
 
 /** This should be a static nested class in TestProtocolReflect, but that
  * breaks CheckStyle (http://jira.codehaus.org/browse/MPCHECKSTYLE-20). */
-public class SimpleError extends Exception {}
+public class SimpleException extends Exception {
+  SimpleException() {}
+  SimpleException(String message) { super(message) ; }
+}

Modified: hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolReflect.java
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolReflect.java?rev=927167&r1=927166&r2=927167&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolReflect.java (original)
+++ hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestProtocolReflect.java Wed Mar 24 19:49:36 2010
@@ -50,7 +50,7 @@ public class TestProtocolReflect {
     TestRecord echo(TestRecord record);
     int add(int arg1, int arg2);
     byte[] echoBytes(byte[] data);
-    void error() throws SimpleError;
+    void error() throws SimpleException;
   }
   
   public static class TestImpl implements Simple {
@@ -58,7 +58,9 @@ public class TestProtocolReflect {
     public int add(int arg1, int arg2) { return arg1 + arg2; }
     public TestRecord echo(TestRecord record) { return record; }
     public byte[] echoBytes(byte[] data) { return data; }
-    public void error() throws SimpleError { throw new SimpleError(); }
+    public void error() throws SimpleException {
+      throw new SimpleException("foo");
+    }
   }
 
   protected static Server server;
@@ -105,13 +107,14 @@ public class TestProtocolReflect {
 
   @Test
   public void testError() throws IOException {
-    SimpleError error = null;
+    SimpleException error = null;
     try {
       proxy.error();
-    } catch (SimpleError e) {
+    } catch (SimpleException e) {
       error = e;
     }
     assertNotNull(error);
+    assertEquals("foo", error.getMessage());
   }
 
   @After

Modified: hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java?rev=927167&r1=927166&r2=927167&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java (original)
+++ hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestReflect.java Wed Mar 24 19:49:36 2010
@@ -19,6 +19,7 @@ package org.apache.avro;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -320,6 +321,32 @@ public class TestReflect {
     assertEquals(String.class, ReflectData.get().getClass(param));
   }
 
+  // test error
+  public static class E1 extends Exception {}
+  public static interface P2 {
+    void error() throws E1;
+  }
+
+  @Test public void testP2() throws Exception {
+    Schema e1 = ReflectData.get().getSchema(E1.class);
+    assertEquals(Schema.Type.RECORD, e1.getType());
+    assertTrue(e1.isError());
+    Field message = e1.getField("detailMessage");
+    assertNotNull("field 'detailMessage' should not be null", message);
+    Schema messageSchema = message.schema();
+    assertEquals(Schema.Type.UNION, messageSchema.getType());
+    assertEquals(Schema.Type.NULL, messageSchema.getTypes().get(0).getType());
+    assertEquals(Schema.Type.STRING, messageSchema.getTypes().get(1).getType());
+
+    Protocol p2 = ReflectData.get().getProtocol(P2.class);
+    Protocol.Message m = p2.getMessages().get("error");
+    // check error schema is union
+    Schema response = m.getErrors();
+    assertEquals(Schema.Type.UNION, response.getType());
+    assertEquals(Schema.Type.STRING, response.getTypes().get(0).getType());
+    assertEquals(e1, response.getTypes().get(1));
+  }
+
   void checkReadWrite(Object object) throws Exception {
     checkReadWrite(object, ReflectData.get().getSchema(object.getClass()));
   }