Server side code will now also check for java.io.Serializable when determining if a type is GWT serializable.  Added unit tests to cross-check.  TEst failed before the modification to ServerSerializableTypeOracleImpl and passed afterwards.

Patch by: mmendez
Review by: bruce (desk check)



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1178 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializableTypeOracleImpl.java b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializableTypeOracleImpl.java
index 88c45d8..43d7e6a 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializableTypeOracleImpl.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializableTypeOracleImpl.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
+import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
@@ -213,7 +214,8 @@
     if (instanceType.isPrimitive()) {
       return true;
     }
-    if (IsSerializable.class.isAssignableFrom(instanceType)) {
+    if (IsSerializable.class.isAssignableFrom(instanceType) ||
+        Serializable.class.isAssignableFrom(instanceType)) {
       return true;
     }
     return hasCustomFieldSerializer(instanceType) != null;
diff --git a/user/test/com/google/gwt/user/client/rpc/InheritanceTest.java b/user/test/com/google/gwt/user/client/rpc/InheritanceTest.java
index d08d122..8f180af 100644
--- a/user/test/com/google/gwt/user/client/rpc/InheritanceTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/InheritanceTest.java
@@ -29,6 +29,8 @@
   // private static final int TEST_DELAY = Integer.MAX_VALUE;
   private static final int TEST_DELAY = 5000;
 
+  private InheritanceTestServiceAsync inheritanceTestService;
+
   public String getModuleName() {
     return "com.google.gwt.user.RPCSuite";
   }
@@ -88,6 +90,26 @@
   }
 
   /**
+   * Tests that transient fields do not prevent serializability.
+   */
+  public void testJavaSerializableClass() {
+    delayTestFinish(TEST_DELAY);
+
+    InheritanceTestServiceAsync service = getServiceAsync();
+    service.echo(new InheritanceTestSetFactory.JavaSerializableClass(3),
+        new AsyncCallback() {
+          public void onFailure(Throwable caught) {
+            fail(caught.toString());
+          }
+
+          public void onSuccess(Object result) {
+            assertNotNull(result);
+            finishTest();
+          }
+        });
+  }
+
+  /**
    * Test that non-static inner classes are not serializable.
    */
   public void testNonStaticInnerClass() {
@@ -197,6 +219,4 @@
     }
     return inheritanceTestService;
   }
-
-  private InheritanceTestServiceAsync inheritanceTestService;
 }
diff --git a/user/test/com/google/gwt/user/client/rpc/InheritanceTestService.java b/user/test/com/google/gwt/user/client/rpc/InheritanceTestService.java
index c3790ed..8e4f309 100644
--- a/user/test/com/google/gwt/user/client/rpc/InheritanceTestService.java
+++ b/user/test/com/google/gwt/user/client/rpc/InheritanceTestService.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.AnonymousClassInterface;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.Circle;
+import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.JavaSerializableClass;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.SerializableClass;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.SerializableClassWithTransientField;
 
@@ -28,6 +29,8 @@
 
   Circle echo(Circle circle);
 
+  JavaSerializableClass echo(JavaSerializableClass javaSerializableClass);
+  
   SerializableClass echo(SerializableClass serializableClass);
 
   SerializableClassWithTransientField echo(
diff --git a/user/test/com/google/gwt/user/client/rpc/InheritanceTestServiceAsync.java b/user/test/com/google/gwt/user/client/rpc/InheritanceTestServiceAsync.java
index 2c5926d..f19010f 100644
--- a/user/test/com/google/gwt/user/client/rpc/InheritanceTestServiceAsync.java
+++ b/user/test/com/google/gwt/user/client/rpc/InheritanceTestServiceAsync.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.AnonymousClassInterface;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.Circle;
+import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.JavaSerializableClass;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.SerializableClass;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.SerializableClassWithTransientField;
 
@@ -28,6 +29,8 @@
 
   void echo(Circle circle, AsyncCallback callback);
   
+  void echo(JavaSerializableClass javaSerializableClass, AsyncCallback callback);
+  
   void echo(SerializableClass serializableClass, AsyncCallback callback);
 
   void echo(SerializableClassWithTransientField serializableClass,
diff --git a/user/test/com/google/gwt/user/client/rpc/InheritanceTestSetFactory.java b/user/test/com/google/gwt/user/client/rpc/InheritanceTestSetFactory.java
index 0c8b78c..4c1b448 100644
--- a/user/test/com/google/gwt/user/client/rpc/InheritanceTestSetFactory.java
+++ b/user/test/com/google/gwt/user/client/rpc/InheritanceTestSetFactory.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.user.client.rpc;
 
+import java.io.Serializable;
+
 /**
  * TODO: document me.
  */
@@ -23,16 +25,8 @@
   /**
    * TODO: document me.
    */
-  public static class Shape implements IsSerializable {
-    private String name;
-
-    public String getName() {
-      return name;
-    }
-
-    public void setName(String name) {
-      this.name = name;
-    }
+  public static interface AnonymousClassInterface extends IsSerializable {
+    void foo();
   }
 
   /**
@@ -40,16 +34,38 @@
    */
   public static class Circle extends Shape {
     private String name;
+
     public native void doStuff() /*-{
-      alert("foo");
-    }-*/;
+     alert("foo");
+     }-*/;
+  }
+
+  /**
+   * TODO: document me.
+   */  
+  public static class JavaSerializableBaseClass implements Serializable {
+    private int field1 = -1;
+
+    public JavaSerializableBaseClass() {
+    }
+
+    public JavaSerializableBaseClass(int field1) {
+      this.field1 = field1;
+    }
   }
 
   /**
    * TODO: document me.
    */
-  public static interface AnonymousClassInterface extends IsSerializable {
-    void foo();
+  public static class JavaSerializableClass extends JavaSerializableBaseClass {
+    private int field2 = -2;
+
+    public JavaSerializableClass() {
+    }
+
+    public JavaSerializableClass(int field2) {
+      this.field2 = field2;
+    }
   }
 
   /**
@@ -65,6 +81,16 @@
    * TODO: document me.
    */
   public static class SerializableClass implements IsSerializable {
+    protected int d = 4;
+
+    int e = 5;
+
+    private int a = 1;
+
+    private int b = 2;
+
+    private int c = 3;
+
     public int getA() {
       return a;
     }
@@ -88,16 +114,6 @@
     public void setC(int c) {
       this.c = c;
     }
-
-    private int a = 1;
-
-    private int b = 2;
-
-    private int c = 3;
-
-    protected int d = 4;
-
-    int e = 5;
   }
 
   /**
@@ -105,6 +121,8 @@
    */
   public static class SerializableClassWithTransientField extends
       SerializableClass {
+    private transient Object obj;
+
     public Object getObj() {
       return obj;
     }
@@ -112,14 +130,14 @@
     public void setObj(Object obj) {
       this.obj = obj;
     }
-
-    private transient Object obj;
   }
 
   /**
    * TODO: document me.
    */
   public static class SerializableSubclass extends SerializableClass {
+    private int d = 4;
+
     public int getD() {
       return d;
     }
@@ -127,8 +145,21 @@
     public void setD(int d) {
       this.d = d;
     }
+  }
 
-    private int d = 4;
+  /**
+   * TODO: document me.
+   */
+  public static class Shape implements IsSerializable {
+    private String name;
+
+    public String getName() {
+      return name;
+    }
+
+    public void setName(String name) {
+      this.name = name;
+    }
   }
 
   public static Circle createCircle() {
@@ -137,6 +168,14 @@
     return circle;
   }
 
+  public static SerializableClass createNonStaticInnerClass() {
+    return new SerializableClass() {
+      public String toString() {
+        return "foo";
+      }
+    };
+  }
+
   public static SerializableClass createSerializableClass() {
     return new SerializableClass();
   }
@@ -147,14 +186,6 @@
     return cls;
   }
 
-  public static SerializableClass createNonStaticInnerClass() {
-    return new SerializableClass() {
-      public String toString() {
-        return "foo";
-      }
-    };
-  }
-
   public static SerializableClass createSerializableSubclass() {
     return new SerializableSubclass();
   }
diff --git a/user/test/com/google/gwt/user/server/rpc/InheritanceTestServiceImpl.java b/user/test/com/google/gwt/user/server/rpc/InheritanceTestServiceImpl.java
index bba012e..ec64347 100644
--- a/user/test/com/google/gwt/user/server/rpc/InheritanceTestServiceImpl.java
+++ b/user/test/com/google/gwt/user/server/rpc/InheritanceTestServiceImpl.java
@@ -20,6 +20,7 @@
 import com.google.gwt.user.client.rpc.InheritanceTestServiceSubtype;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.AnonymousClassInterface;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.Circle;
+import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.JavaSerializableClass;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.SerializableClass;
 import com.google.gwt.user.client.rpc.InheritanceTestSetFactory.SerializableClassWithTransientField;
 
@@ -37,6 +38,10 @@
     return circle;
   }
 
+  public JavaSerializableClass echo(JavaSerializableClass javaSerializableClass) {
+    return javaSerializableClass;
+  }
+
   public SerializableClass echo(SerializableClass serializableClass) {
     if (!InheritanceTestSetValidator.isValid(serializableClass)) {
       throw new RuntimeException();
@@ -64,4 +69,4 @@
   public SerializableClass getUnserializableClass() {
     return InheritanceTestSetFactory.createNonStaticInnerClass();
   }
-}
+}
\ No newline at end of file