Revision: 8806
Author: [email protected]
Date: Thu Sep 16 13:48:34 2010
Log: Finish botched roll-back of r8752 and r8762.

This finished the roll-back start in r8804.

Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=8806

Modified:
 /trunk/user/src/com/google/gwt/user/rebind/rpc/FieldSerializerCreator.java
 /trunk/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java

=======================================
--- /trunk/user/src/com/google/gwt/user/rebind/rpc/FieldSerializerCreator.java Thu Sep 16 12:36:47 2010 +++ /trunk/user/src/com/google/gwt/user/rebind/rpc/FieldSerializerCreator.java Thu Sep 16 13:48:34 2010
@@ -21,20 +21,16 @@
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.typeinfo.JArrayType;
 import com.google.gwt.core.ext.typeinfo.JClassType;
-import com.google.gwt.core.ext.typeinfo.JConstructor;
 import com.google.gwt.core.ext.typeinfo.JEnumType;
 import com.google.gwt.core.ext.typeinfo.JField;
-import com.google.gwt.core.ext.typeinfo.JMethod;
 import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
 import com.google.gwt.core.ext.typeinfo.JType;
-import com.google.gwt.core.ext.typeinfo.JTypeParameter;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.dev.javac.TypeOracleMediator;
 import com.google.gwt.user.client.rpc.SerializationException;
 import com.google.gwt.user.client.rpc.SerializationStreamReader;
 import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.google.gwt.user.client.rpc.core.java.lang.Object_Array_CustomFieldSerializer;
-import com.google.gwt.user.client.rpc.impl.TypeHandler;
 import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
 import com.google.gwt.user.rebind.SourceWriter;

@@ -54,14 +50,6 @@

private static final String WEAK_MAPPING_CLASS_NAME = WeakMapping.class.getName();

-  private final JClassType customFieldSerializer;
-
-  private final boolean customFieldSerializerHasInstantiate;
-
-  private final String fieldSerializerName;
-
-  private final boolean isJRE;
-
   private final JClassType serializableClass;

   private final JField[] serializableFields;
@@ -79,9 +67,7 @@
    */
   public FieldSerializerCreator(TypeOracle typeOracle,
       SerializableTypeOracle typesSentFromBrowser,
-      SerializableTypeOracle typesSentToBrowser, JClassType requestedClass,
-      JClassType customFieldSerializer) {
-    this.customFieldSerializer = customFieldSerializer;
+ SerializableTypeOracle typesSentToBrowser, JClassType requestedClass) {
     assert (requestedClass != null);
assert (requestedClass.isClass() != null || requestedClass.isArray() != null);

@@ -91,10 +77,6 @@
     serializableClass = requestedClass;
serializableFields = SerializationUtils.getSerializableFields(typeOracle,
         requestedClass);
- this.fieldSerializerName = SerializationUtils.getStandardSerializerName(serializableClass); - this.isJRE = SerializableTypeOracleBuilder.isInStandardJavaPackage(serializableClass.getQualifiedSourceName()); - this.customFieldSerializerHasInstantiate = (customFieldSerializer != null && CustomFieldSerializerValidator.hasInstantiationMethod(
-        customFieldSerializer, serializableClass));
   }

   public String realize(TreeLogger logger, GeneratorContext ctx) {
@@ -105,18 +87,17 @@
         "Generating a field serializer for type '"
             + serializableClass.getQualifiedSourceName() + "'", null);

+    String fieldSerializerName = SerializationUtils.getFieldSerializerName(
+        typeOracle, serializableClass);
+
     sourceWriter = getSourceWriter(logger, ctx);
     if (sourceWriter == null) {
       return fieldSerializerName;
     }
     assert sourceWriter != null;

-    maybeWriteTypeHandlerClass();
-
     writeFieldAccessors();

-    writeConcreteTypeMethod();
-
     writeDeserializeMethod();

     maybeWriteInstatiateMethod();
@@ -128,17 +109,6 @@
     return fieldSerializerName;
   }

-  private boolean classIsAccessible() {
-    JClassType testClass = serializableClass;
-    while (testClass != null) {
-      if (testClass.isPrivate() || (isJRE && !testClass.isPublic())) {
-        return false;
-      }
-      testClass = testClass.getEnclosingType();
-    }
-    return true;
-  }
-
   private String createArrayInstantiationExpression(JArrayType array) {
     StringBuilder sb = new StringBuilder();

@@ -151,15 +121,7 @@

     return sb.toString();
   }
-
-  private boolean ctorIsAccessible() {
-    JConstructor ctor = serializableClass.findConstructor(new JType[0]);
-    if (ctor.isPrivate() || (isJRE && !ctor.isPublic())) {
-      return false;
-    }
-    return true;
-  }
-
+
   /**
    * Returns the depth of the given class in the class hierarchy
    * (where the depth of java.lang.Object == 0).
@@ -173,14 +135,16 @@
   }

private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContext ctx) {
-    int packageNameEnd = fieldSerializerName.lastIndexOf('.');
+ String qualifiedSerializerName = SerializationUtils.getFieldSerializerName(
+        typeOracle, serializableClass);
+    int packageNameEnd = qualifiedSerializerName.lastIndexOf('.');
     String className;
     String packageName;
     if (packageNameEnd != -1) {
-      className = fieldSerializerName.substring(packageNameEnd + 1);
-      packageName = fieldSerializerName.substring(0, packageNameEnd);
+      className = qualifiedSerializerName.substring(packageNameEnd + 1);
+      packageName = qualifiedSerializerName.substring(0, packageNameEnd);
     } else {
-      className = fieldSerializerName;
+      className = qualifiedSerializerName;
       packageName = "";
     }

@@ -191,28 +155,9 @@

ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(
         packageName, className);
- composerFactory.addImport(SerializationException.class.getCanonicalName()); - composerFactory.addImport(SerializationStreamReader.class.getCanonicalName()); - composerFactory.addImport(SerializationStreamWriter.class.getCanonicalName()); composerFactory.addAnnotationDeclaration("@SuppressWarnings(\"deprecation\")");
     return composerFactory.createSourceWriter(ctx, printWriter);
   }
-
-  private String getTypeSig(JMethod deserializationMethod) {
- JTypeParameter[] typeParameters = deserializationMethod.getTypeParameters();
-    String typeSig = "";
-    if (typeParameters.length > 0) {
-      StringBuilder sb = new StringBuilder();
-      sb.append('<');
-      for (JTypeParameter typeParameter : typeParameters) {
-        sb.append(typeParameter.getFirstBound().getQualifiedSourceName());
-        sb.append(',');
-      }
-      sb.setCharAt(sb.length() - 1, '>');
-      typeSig = sb.toString();
-    }
-    return typeSig;
-  }

   private void maybeSuppressLongWarnings(JType fieldType) {
     if (fieldType == JPrimitiveType.LONG) {
@@ -244,26 +189,18 @@
        */
       return;
     }
-
-    if (customFieldSerializerHasInstantiate) {
-      // The custom field serializer already defined it.
-      return;
-    }

     JArrayType isArray = serializableClass.isArray();
     JEnumType isEnum = serializableClass.isEnum();
-    JClassType isClass = serializableClass.isClass();
-
-    boolean useViolator = false;
-    if (isEnum == null && isClass != null) {
-      useViolator = !classIsAccessible() || !ctorIsAccessible();
-    }
-
-    sourceWriter.print("public static" + (useViolator ? " native " : " "));
+    boolean isNative = (isArray == null) && (isEnum == null);
+
+    sourceWriter.print("public static" + (isNative ? " native " : " "));
String qualifiedSourceName = serializableClass.getQualifiedSourceName();
     sourceWriter.print(qualifiedSourceName);
- sourceWriter.print(" instantiate(SerializationStreamReader streamReader) throws SerializationException "
-        + (useViolator ? "/*-{" : "{"));
+    sourceWriter.print(" instantiate(");
+    sourceWriter.print(SerializationStreamReader.class.getName());
+    sourceWriter.println(" streamReader) throws "
+ + SerializationException.class.getName() + (isNative ? "/*-{" : "{"));
     sourceWriter.indent();

     if (isArray != null) {
@@ -276,99 +213,14 @@
           + qualifiedSourceName + ".values();");
sourceWriter.println("assert (ordinal >= 0 && ordinal < values.length);");
       sourceWriter.println("return values[ordinal];");
-    } else if (useViolator) {
- sourceWriter.println("return @" + qualifiedSourceName + "::new()();");
     } else {
-      sourceWriter.println("return new " + qualifiedSourceName + "();");
+ sourceWriter.println("return @" + qualifiedSourceName + "::new()();");
     }

     sourceWriter.outdent();
-    sourceWriter.println(useViolator ? "}-*/;" : "}");
+    sourceWriter.println(isNative ? "}-*/;" : "}");
     sourceWriter.println();
   }
-
-  private void maybeWriteTypeHandlerClass() {
- if (serializableClass.isEnum() == null && serializableClass.isAbstract()) {
-      /*
- * Field serializers are shared by all of the RemoteService proxies in a - * compilation. Therefore, we have to generate an instantiate method even - * if the type is not instantiable relative to the RemoteService which
-       * caused this field serializer to be created. If the type is not
- * instantiable relative to any of the RemoteService proxies, dead code - * optimizations will cause the method to be removed from the compiled
-       * output.
-       *
-       * Enumerated types require an instantiate method even if they are
- * abstract. You will have an abstract enum in cases where the enum type
-       * is sub-classed. Non-default instantiable classes cannot have
-       * instantiate methods.
-       */
-      return;
-    }
-    sourceWriter.println("public static class Handler implements "
-        + TypeHandler.class.getCanonicalName() + " {");
-    sourceWriter.indent();
-
-    // Deserialization method
- sourceWriter.println("public void deserialize(SerializationStreamReader reader, Object object) throws SerializationException {");
-    if (customFieldSerializer != null) {
- JMethod deserializationMethod = CustomFieldSerializerValidator.getDeserializationMethod(
-          customFieldSerializer, serializableClass);
-      JType castType = deserializationMethod.getParameters()[1].getType();
-      String typeSig = getTypeSig(deserializationMethod);
-      sourceWriter.indentln(customFieldSerializer.getQualifiedSourceName()
-          + "." + typeSig + "deserialize(reader, ("
-          + castType.getQualifiedSourceName() + ")object);");
-    } else {
-      sourceWriter.indentln(fieldSerializerName + ".deserialize(reader, ("
-          + serializableClass.getQualifiedSourceName() + ")object);");
-    }
-    sourceWriter.println("}");
-
-    // Instantiation method
- sourceWriter.println("public Object instantiate(SerializationStreamReader reader) throws SerializationException {");
-    sourceWriter.indent();
-    if (serializableClass.isEnum() != null
-        || serializableClass.isDefaultInstantiable()
-        || customFieldSerializerHasInstantiate) {
-      sourceWriter.print("return ");
-      String typeSig;
- if (customFieldSerializer != null && customFieldSerializerHasInstantiate) {
-        sourceWriter.print(customFieldSerializer.getQualifiedSourceName());
- JMethod instantiationMethod = CustomFieldSerializerValidator.getInstantiationMethod(
-            customFieldSerializer, serializableClass);
-        typeSig = getTypeSig(instantiationMethod);
-      } else {
-        sourceWriter.print(fieldSerializerName);
-        typeSig = "";
-      }
-      sourceWriter.print("." + typeSig + "instantiate");
-      sourceWriter.println("(reader);");
-    } else {
-      sourceWriter.println("return null;");
-    }
-    sourceWriter.outdent();
-    sourceWriter.println("}");
-
-    // Serialization method
- sourceWriter.println("public void serialize(SerializationStreamWriter writer, Object object) throws SerializationException {");
-    if (customFieldSerializer != null) {
- JMethod serializationMethod = CustomFieldSerializerValidator.getSerializationMethod(
-          customFieldSerializer, serializableClass);
-      JType castType = serializationMethod.getParameters()[1].getType();
-      String typeSig = getTypeSig(serializationMethod);
-      sourceWriter.indentln(customFieldSerializer.getQualifiedSourceName()
-          + "." + typeSig + "serialize(writer, ("
-          + castType.getQualifiedSourceName() + ")object);");
-    } else {
-      sourceWriter.indentln(fieldSerializerName + ".serialize(writer, ("
-          + serializableClass.getQualifiedSourceName() + ")object);");
-    }
-
-    sourceWriter.println("}");
-    sourceWriter.outdent();
-    sourceWriter.println("}");
-  }

   /**
    * Returns true if we will need a get/set method pair for a field.
@@ -467,9 +319,9 @@
     JClassType superClass = serializableClass.getSuperclass();
     if (superClass != null
&& (typesSentFromBrowser.isSerializable(superClass) || typesSentToBrowser.isSerializable(superClass))) { - String superFieldSerializer = SerializationUtils.getFieldSerializerName( + String fieldSerializerName = SerializationUtils.getFieldSerializerName(
           typeOracle, superClass);
-      sourceWriter.print(superFieldSerializer);
+      sourceWriter.print(fieldSerializerName);
       sourceWriter.println(".deserialize(streamReader, instance);");
     }
   }
@@ -511,41 +363,20 @@
     JClassType superClass = serializableClass.getSuperclass();
     if (superClass != null
&& (typesSentFromBrowser.isSerializable(superClass) || typesSentToBrowser.isSerializable(superClass))) { - String superFieldSerializer = SerializationUtils.getFieldSerializerName( + String fieldSerializerName = SerializationUtils.getFieldSerializerName(
           typeOracle, superClass);
-      sourceWriter.print(superFieldSerializer);
+      sourceWriter.print(fieldSerializerName);
       sourceWriter.println(".serialize(streamWriter, instance);");
     }
   }
-
-  private void writeConcreteTypeMethod() {
-    if (customFieldSerializer != null
- && CustomFieldSerializerValidator.getConcreteTypeMethod(customFieldSerializer) != null) {
-      return;
-    }
-
-    if (classIsAccessible()) {
-      sourceWriter.println("public static Class<?> concreteType() {");
-      sourceWriter.indentln("return "
-          + serializableClass.getQualifiedSourceName() + ".class;");
-      sourceWriter.println("}");
-      sourceWriter.println();
-    } else {
- String jsniTypeRef = TypeOracleMediator.computeBinaryClassName(serializableClass); - sourceWriter.println("public static native Class<?> concreteType() /*-{");
-      sourceWriter.indentln("return @" + jsniTypeRef + "::class;");
-      sourceWriter.println("}-*/;");
-      sourceWriter.println();
-    }
-  }

   private void writeDeserializeMethod() {
-    if (customFieldSerializer != null) {
-      return;
-    }
- sourceWriter.print("public static void deserialize(SerializationStreamReader streamReader, ");
+    sourceWriter.print("public static void deserialize(");
+    sourceWriter.print(SerializationStreamReader.class.getName());
+    sourceWriter.print(" streamReader, ");
     sourceWriter.print(serializableClass.getQualifiedSourceName());
-    sourceWriter.println(" instance) throws SerializationException {");
+    sourceWriter.println(" instance) throws "
+        + SerializationException.class.getName() + "{");
     sourceWriter.indent();

     JArrayType isArray = serializableClass.isArray();
@@ -577,9 +408,6 @@
    * external class to access the field's value.
    */
   private void writeFieldAccessors() {
-    if (customFieldSerializer != null) {
-      return;
-    }
     for (JField serializableField : serializableFields) {
       if (!needsAccessorMethods(serializableField)) {
         continue;
@@ -651,12 +479,12 @@
   }

   private void writeSerializeMethod() {
-    if (customFieldSerializer != null) {
-      return;
-    }
- sourceWriter.print("public static void serialize(SerializationStreamWriter streamWriter, ");
+    sourceWriter.print("public static void serialize(");
+    sourceWriter.print(SerializationStreamWriter.class.getName());
+    sourceWriter.print(" streamWriter, ");
     sourceWriter.print(serializableClass.getQualifiedSourceName());
-    sourceWriter.println(" instance) throws SerializationException {");
+    sourceWriter.println(" instance) throws "
+        + SerializationException.class.getName() + " {");
     sourceWriter.indent();

     JArrayType isArray = serializableClass.isArray();
=======================================
--- /trunk/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java Thu Sep 16 12:36:47 2010 +++ /trunk/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java Thu Sep 16 13:48:34 2010
@@ -16,7 +16,7 @@

 package com.google.gwt.user.rebind.rpc;

-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArrayString;
 import com.google.gwt.core.ext.BadPropertyValueException;
 import com.google.gwt.core.ext.ConfigurationProperty;
@@ -32,8 +32,8 @@
 import com.google.gwt.user.client.rpc.SerializationException;
 import com.google.gwt.user.client.rpc.SerializationStreamReader;
 import com.google.gwt.user.client.rpc.SerializationStreamWriter;
+import com.google.gwt.user.client.rpc.impl.Serializer;
 import com.google.gwt.user.client.rpc.impl.SerializerBase;
-import com.google.gwt.user.client.rpc.impl.TypeHandler;
 import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
 import com.google.gwt.user.rebind.SourceWriter;

@@ -41,7 +41,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.List;
@@ -103,28 +102,24 @@

   private final boolean elideTypeNames;

-  private final JType[] serializableTypes;
-
   private final SerializableTypeOracle serializationOracle;

+  private final JType[] serializableTypes;
+
   private final SourceWriter srcWriter;

   private final TypeOracle typeOracle;

   private final String typeSerializerClassName;

-  private final String typeSerializerSimpleName;
-
private final Map<JType, String> typeStrings = new IdentityHashMap<JType, String>();

   public TypeSerializerCreator(TreeLogger logger,
       SerializableTypeOracle serializationOracle,
SerializableTypeOracle deserializationOracle, GeneratorContext context,
-      String typeSerializerClassName, String typeSerializerSimpleName)
-      throws UnableToCompleteException {
+      String typeSerializerClassName) throws UnableToCompleteException {
     this.context = context;
     this.typeSerializerClassName = typeSerializerClassName;
-    this.typeSerializerSimpleName = typeSerializerSimpleName;
     this.serializationOracle = serializationOracle;
     this.deserializationOracle = deserializationOracle;

@@ -164,41 +159,29 @@
   public String realize(TreeLogger logger) {
     logger = logger.branch(TreeLogger.DEBUG,
         "Generating TypeSerializer for service interface '"
-            + typeSerializerClassName + "'", null);
+            + getTypeSerializerClassName() + "'", null);
+    String typeSerializerName = getTypeSerializerClassName();
+    if (srcWriter == null) {
+      return typeSerializerName;
+    }

     createFieldSerializers(logger, context);

-    int index = 0;
-    for (JType type : getSerializableTypes()) {
-
-      String typeString;
-      if (elideTypeNames) {
-        typeString = Integer.toString(++index, Character.MAX_RADIX);
-      } else {
-        typeString = getTypeString(type);
-      }
-      typeStrings.put(type, typeString);
-    }
-
-    if (srcWriter != null) {
-      writeStaticFields();
-
-      writeStaticInitializer();
-
-      writeLoadMethodsJava();
-
-      writeLoadMethodsNative();
-
-      writeLoadSignaturesJava();
-
-      writeLoadSignaturesNative();
-
-      writeConstructor();
-
-      srcWriter.commit(logger);
-    }
-
-    return typeSerializerClassName;
+    writeStaticFields();
+
+    writeStaticInitializer();
+
+    writeCreateMethods();
+
+    writeRegisterSignatures();
+
+    writeRegisterMethods();
+
+    writeRaiseSerializationException();
+
+    srcWriter.commit(logger);
+
+    return typeSerializerName;
   }

   /*
@@ -215,6 +198,12 @@
       createFieldSerializer(logger, ctx, parameterizedType.getRawType());
       return;
     }
+
+ JClassType customFieldSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
+        typeOracle, type);
+    if (customFieldSerializer != null) {
+      return;
+    }

     /*
* Only a JClassType can reach this point in the code. JPrimitives have been
@@ -224,11 +213,8 @@
      */
     assert (type.isClass() != null || type.isArray() != null);

- JClassType customFieldSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
-        typeOracle, type);
     FieldSerializerCreator creator = new FieldSerializerCreator(typeOracle,
-        serializationOracle, deserializationOracle, (JClassType) type,
-        customFieldSerializer);
+        serializationOracle, deserializationOracle, (JClassType) type);
     creator.realize(logger, ctx);
   }

@@ -245,6 +231,14 @@
       createFieldSerializer(logger, ctx, type);
     }
   }
+
+  private String getCreateMethodName(JType type) {
+    assert (type.isArray() == null);
+
+    return "create_"
+ + SerializationUtils.getFieldSerializerName(typeOracle, type).replace(
+            '.', '_');
+  }

   private String[] getPackageAndClassName(String fullClassName) {
     String className = fullClassName;
@@ -262,7 +256,7 @@
   }

private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContext ctx) {
-    String name[] = getPackageAndClassName(typeSerializerClassName);
+    String name[] = getPackageAndClassName(getTypeSerializerClassName());
     String packageName = name[0];
     String className = name[1];
PrintWriter printWriter = ctx.tryCreate(logger, packageName, className);
@@ -273,18 +267,20 @@
ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(
         packageName, className);

-    composerFactory.addImport(GWT.class.getName());
+    composerFactory.addImport(JavaScriptObject.class.getName());
     composerFactory.addImport(JsArrayString.class.getName());
+    composerFactory.addImport(Serializer.class.getName());
     composerFactory.addImport(SerializationException.class.getName());
     composerFactory.addImport(SerializationStreamReader.class.getName());
     composerFactory.addImport(SerializationStreamWriter.class.getName());
-    composerFactory.addImport(TypeHandler.class.getName());
-    composerFactory.addImport(HashMap.class.getName());
-    composerFactory.addImport(Map.class.getName());

     composerFactory.setSuperclass(SerializerBase.class.getName());
     return composerFactory.createSourceWriter(ctx, printWriter);
   }
+
+  private String getTypeSerializerClassName() {
+    return typeSerializerClassName;
+  }

   /**
    * @param type
@@ -297,56 +293,78 @@
   }

   /**
- * Return <code>true</code> if the custom field serializer has an instantiate
-   * method.
+ * Return <code>true</code> if this type is concrete and has a custom field
+   * serializer that does not declare an instantiate method.
+   *
+   * @param type
+   * @return
    */
- private boolean hasInstantiateMethod(JClassType customSerializer, JType type) {
-    return CustomFieldSerializerValidator.getInstantiationMethod(
-        customSerializer, (JClassType) type) != null;
-  }
-
-  private void writeConstructor() {
-    srcWriter.println("public " + typeSerializerSimpleName + "() {");
- srcWriter.indentln("super(methodMapJava, methodMapNative, signatureMapJava, signatureMapNative);");
-    srcWriter.println("}");
-    srcWriter.println();
-  }
-
-  private void writeLoadMethodsJava() {
- srcWriter.println("private static Map<String, TypeHandler> loadMethodsJava() {");
-    srcWriter.indent();
- srcWriter.println("Map<String, TypeHandler> result = new HashMap<String, TypeHandler>();");
-
-    List<JType> filteredTypes = new ArrayList<JType>();
+  private boolean needsCreateMethod(JType type) {
+    // If this type is abstract it will not be serialized into the stream
+    //
+    if (!deserializationOracle.maybeInstantiated(type)) {
+      return false;
+    }
+
+    if (type.isArray() != null) {
+      return false;
+    }
+
+ JClassType customSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
+        typeOracle, type);
+    if (customSerializer == null) {
+      return false;
+    }
+
+    JMethod customInstantiate = customSerializer.findMethod(
+        "instantiate",
+ new JType[] {typeOracle.findType(SerializationStreamReader.class.getName())});
+    if (customInstantiate != null) {
+      return false;
+    }
+
+    return true;
+  }
+
+  private void writeCreateMethods() {
     JType[] types = getSerializableTypes();
-    int n = types.length;
-    for (int index = 0; index < n; ++index) {
-      JType type = types[index];
-      if (serializationOracle.maybeInstantiated(type)
-          || deserializationOracle.maybeInstantiated(type)) {
-        filteredTypes.add(type);
-      }
-    }
-
-    for (JType type : filteredTypes) {
-      String typeString = typeStrings.get(type);
-      assert typeString != null : "Missing type signature for "
-          + type.getQualifiedSourceName();
-      srcWriter.println("result.put(\"" + typeString + "\", new "
-          + SerializationUtils.getStandardSerializerName((JClassType) type)
-          + ".Handler());");
-    }
-
-    srcWriter.println("return result;");
-    srcWriter.outdent();
+    for (int typeIndex = 0; typeIndex < types.length; ++typeIndex) {
+      JType type = types[typeIndex];
+ assert (serializationOracle.isSerializable(type) || deserializationOracle.isSerializable(type));
+
+      if (!needsCreateMethod(type)) {
+        continue;
+      }
+
+      /*
+       * Only classes with custom field serializers that do no declare
+       * instantiate methods get here
+       */
+      srcWriter.print("private static native ");
+      srcWriter.print(type.getQualifiedSourceName());
+      srcWriter.print(" ");
+      srcWriter.print(getCreateMethodName(type));
+ srcWriter.println("(SerializationStreamReader streamReader) throws SerializationException /*-{");
+      srcWriter.indent();
+      srcWriter.print("return @");
+      srcWriter.print(type.getQualifiedSourceName());
+      srcWriter.println("::new()();");
+      srcWriter.outdent();
+      srcWriter.println("}-*/;");
+      srcWriter.println();
+    }
+  }
+
+  private void writeRaiseSerializationException() {
+ srcWriter.println("private static void raiseSerializationException(String msg) throws SerializationException {");
+    srcWriter.indentln("throw new SerializationException(msg);");
     srcWriter.println("}");
     srcWriter.println();
   }

-  private void writeLoadMethodsNative() {
- srcWriter.println("private static native MethodMap loadMethodsNative() /*-{");
+  private void writeRegisterMethods() {
+    srcWriter.println("private static native void registerMethods() /*-{");
     srcWriter.indent();
-    srcWriter.println("var result = {};");

     List<JType> filteredTypes = new ArrayList<JType>();
     JType[] types = getSerializableTypes();
@@ -371,17 +389,24 @@
         srcWriter.println("})();");
         srcWriter.println("(function() {");
       }
+
+ srcWriter.println("@com.google.gwt.user.client.rpc.impl.SerializerBase"
+          + "::registerMethods("
+ + "Lcom/google/gwt/user/client/rpc/impl/SerializerBase$MethodMap;" + + "Ljava/lang/String;" + "Lcom/google/gwt/core/client/JsArray;)(");
+
+      srcWriter.indentln("@" + typeSerializerClassName + "::methodMap,");

       String typeString = typeStrings.get(type);
       assert typeString != null : "Missing type signature for "
           + type.getQualifiedSourceName();
-      srcWriter.println("result[\"" + typeString + "\"] = [");
+      srcWriter.indentln("\"" + typeString + "\" , [");

       srcWriter.indent();
-      writeTypeMethodsNative(type);
+      writeTypeMethods(type);
       srcWriter.outdent();

-      srcWriter.indentln("];");
+      srcWriter.indentln("]);");
       srcWriter.println();
     }

@@ -389,57 +414,16 @@
       srcWriter.println("})();");
     }

-    srcWriter.println("return result;");
     srcWriter.outdent();
     srcWriter.println("}-*/;");
     srcWriter.println();
   }

-  private void writeLoadSignaturesJava() {
- srcWriter.println("private static Map<Class<?>, String> loadSignaturesJava() {");
+  private void writeRegisterSignatures() {
+ srcWriter.println("private static native void registerSignatures() /*-{");
     srcWriter.indent();
- srcWriter.println("Map<Class<?>, String> result = new HashMap<Class<?>, String>();");
-
-    for (JType type : getSerializableTypes()) {
-      String typeString = typeStrings.get(type);
-
-      if (!serializationOracle.maybeInstantiated(type)
-          && !deserializationOracle.maybeInstantiated(type)) {
-        continue;
-      }
-
-      String typeRef;
- JClassType customSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
-          typeOracle, type);
-      if (customSerializer != null
- && CustomFieldSerializerValidator.getConcreteTypeMethod(customSerializer) != null) { - typeRef = customSerializer.getQualifiedSourceName() + ".concreteType()";
-      } else if (type instanceof JClassType) {
- typeRef = SerializationUtils.getStandardSerializerName((JClassType) type)
-            + ".concreteType()";
-      } else {
-        typeRef = type.getLeafType().getQualifiedSourceName();
-        while (type.isArray() != null) {
-          typeRef += "[]";
-          type = type.isArray().getComponentType();
-        }
-        typeRef += ".class";
-      }
-
- srcWriter.println("result.put(" + typeRef + ", \"" + typeString + "\");");
-    }
-
-    srcWriter.println("return result;");
-    srcWriter.outdent();
-    srcWriter.println("}");
-    srcWriter.println();
-  }
-
-  private void writeLoadSignaturesNative() {
- srcWriter.println("private static native JsArrayString loadSignaturesNative() /*-{");
-    srcWriter.indent();
-    srcWriter.println("var result = [];");
-
+
+    int index = 0;
boolean shard = shardSize > 0 && getSerializableTypes().length > shardSize;
     int shardCount = 0;

@@ -448,7 +432,14 @@
     }

     for (JType type : getSerializableTypes()) {
-      String typeString = typeStrings.get(type);
+
+      String typeString;
+      if (elideTypeNames) {
+        typeString = Integer.toString(++index, Character.MAX_RADIX);
+      } else {
+        typeString = getTypeString(type);
+      }
+      typeStrings.put(type, typeString);

       if (!serializationOracle.maybeInstantiated(type)
           && !deserializationOracle.maybeInstantiated(type)) {
@@ -467,80 +458,71 @@
         srcWriter.println("(function() {");
       }

- srcWriter.println("[email protected]::getHashCode(Ljava/lang/Object;)(@"
-          + jsniTypeRef + "::class)] = \"" + typeString + "\";");
+ srcWriter.println("@com.google.gwt.user.client.rpc.impl.SerializerBase"
+          + "::registerSignature("
+ + "Lcom/google/gwt/core/client/JsArrayString;" + "Ljava/lang/Class;"
+          + "Ljava/lang/String;)(");
+      srcWriter.indent();
+      srcWriter.println("@" + typeSerializerClassName + "::signatureMap,");
+      srcWriter.println("@" + jsniTypeRef + "::class,");
+      srcWriter.println("\"" + typeString + "\");");
+      srcWriter.outdent();
+      srcWriter.println();
     }

     if (shard) {
       srcWriter.println("})();");
     }

-    srcWriter.println("return result;");
     srcWriter.outdent();
     srcWriter.println("}-*/;");
     srcWriter.println();
   }

   private void writeStaticFields() {
- srcWriter.println("private static final Map<String, TypeHandler> methodMapJava;");
-    srcWriter.println("private static final MethodMap methodMapNative;");
- srcWriter.println("private static final Map<Class<?>, String> signatureMapJava;"); - srcWriter.println("private static final JsArrayString signatureMapNative;"); + srcWriter.println("private static final MethodMap methodMap = JavaScriptObject.createObject().cast();"); + srcWriter.println("private static final JsArrayString signatureMap = JavaScriptObject.createArray().cast();"); + srcWriter.println("protected MethodMap getMethodMap() { return methodMap; }"); + srcWriter.println("protected JsArrayString getSignatureMap() { return signatureMap; }");
     srcWriter.println();
   }

   private void writeStaticInitializer() {
     srcWriter.println("static {");
-    srcWriter.indent();
-    srcWriter.println("if (GWT.isScript()) {");
-    srcWriter.indent();
-    srcWriter.println("methodMapJava = null;");
-    srcWriter.println("methodMapNative = loadMethodsNative();");
-    srcWriter.println("signatureMapJava = null;");
-    srcWriter.println("signatureMapNative = loadSignaturesNative();");
-    srcWriter.outdent();
-    srcWriter.println("} else {");
-    srcWriter.indent();
-    srcWriter.println("methodMapJava = loadMethodsJava();");
-    srcWriter.println("methodMapNative = null;");
-    srcWriter.println("signatureMapJava = loadSignaturesJava();");
-    srcWriter.println("signatureMapNative = null;");
-    srcWriter.outdent();
+    srcWriter.indentln("registerMethods();");
+    srcWriter.indentln("registerSignatures();");
     srcWriter.println("}");
-    srcWriter.outdent();
-    srcWriter.println("}");
   }

   /**
-   * Write an entry in the methodMapNative for one type.
+   * Write an entry in the createMethodMap method for one type.
    *
    * @param type type to generate entry for
    */
-  private void writeTypeMethodsNative(JType type) {
+  private void writeTypeMethods(JType type) {
     srcWriter.indent();
     String serializerName = SerializationUtils.getFieldSerializerName(
         typeOracle, type);
- JClassType customSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
-        typeOracle, type);

     // First the initialization method
     if (deserializationOracle.maybeInstantiated(type)) {
       srcWriter.print("@");
-      if (customSerializer != null) {
-        if (hasInstantiateMethod(customSerializer, type)) {
-          srcWriter.print(serializerName);
-        } else {
- srcWriter.print(SerializationUtils.getStandardSerializerName((JClassType) type));
-        }
+      if (needsCreateMethod(type)) {
+        srcWriter.print(getTypeSerializerClassName());
+        srcWriter.print("::");
+        srcWriter.print(getCreateMethodName(type));
       } else {
         srcWriter.print(serializerName);
-      }
-      srcWriter.print("::instantiate");
+        srcWriter.print("::instantiate");
+      }
       srcWriter.print("(L"
+ SerializationStreamReader.class.getName().replace('.', '/') + ";)");
     }
     srcWriter.println(",");

+ JClassType customSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
+        typeOracle, type);
+
     // Now the deserialization method
     if (deserializationOracle.isSerializable(type)) {
       // Assume param type is the concrete type of the serialized type.

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to