We were broken by both -XdisableClassMetaData and plain old web
mode. Fixed.

Review at http://gwt-code-reviews.appspot.com/787801

Review by: cromwellian@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8589 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
index 24d9529..1b9961d 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
@@ -371,7 +371,7 @@
         requestData.append(",");
       }
       requestData.append("{\""
-          + entry.getValue().getSchema().getToken().getName() + "\":");
+          + entry.getValue().getSchema().getToken() + "\":");
       if (writeOperation != WriteOperation.DELETE) {
         requestData.append(impl.toJson());
       } else {
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RecordImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordImpl.java
index 33bb57d..ae7e1b0 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RecordImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordImpl.java
@@ -65,7 +65,7 @@
 
   public String getUniqueId() {
     return jso.getId() + "-" + (isFuture ? "IS" : "NO") + "-"
-        + getSchema().getToken().getName();
+        + getSchema().getToken();
   }
 
   public Integer getVersion() {
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
index 38c2a9f..4209d0a 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
@@ -314,9 +314,6 @@
     }
 
     if (value instanceof RecordImpl) {
-      RequestFactoryJsonImpl requestFactory = getRequestFactory();
-      RecordSchema<?> schema = ((RecordImpl)value).getSchema();
-      Class<?> token = schema.getToken();
       setString(property.getName(), ((RecordImpl) value).getUniqueId());
       return;
     }
@@ -358,9 +355,15 @@
 
     var key = this.__key;
     delete this.__key;
+    var rf = this.__rf;
+    delete this.__rf;
+    var vs = this.__vs;
+    delete this.__vs;
     // TODO verify that the stringify() from json2.js works on IE
     var rtn = $wnd.JSON.stringify(this);
     this.__key = key;
+    this.__rf = rf;
+    this.__vs = vs;
     return rtn;
   }-*/;
 
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RecordSchema.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordSchema.java
index fd2b05e..06449c5 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RecordSchema.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordSchema.java
@@ -39,14 +39,21 @@
  * @param <R> the type of the Records this schema describes
  */
 public abstract class RecordSchema<R extends Record> {
+  
+  private final String token;
+  
   private final Set<Property<?>> allProperties;
+  
   {
     Set<Property<?>> set = new HashSet<Property<?>>();
     set.add(Record.id);
     set.add(Record.version);
     allProperties = Collections.unmodifiableSet(set);
   }
-
+  
+  public RecordSchema(String token) {
+    this.token = token;
+  }
   public Set<Property<?>> allProperties() {
     return allProperties;
   }
@@ -60,6 +67,9 @@
   public abstract RecordChangedEvent<?, ?> createChangeEvent(Record record,
       WriteOperation writeOperation);
 
-  // TODO(rjrjr) rename getProxyClass
-  public abstract Class<? extends Record> getToken();
+  public abstract Class<? extends Record> getProxyClass();
+
+  public String getToken() {
+    return token;
+  }
 }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RecordToTypeMap.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordToTypeMap.java
index c002ba4..232be49 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RecordToTypeMap.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordToTypeMap.java
@@ -27,6 +27,7 @@
  * Record class to its internal "type" representation.
  */
 public interface RecordToTypeMap {
+  String getClassToken(Class<?> recordClass);
   <R extends Record> RecordSchema<R> getType(Class<R> recordClass);
   RecordSchema<? extends Record> getType(String token);
 }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
index 01388b0..5b4af09 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
@@ -123,21 +123,11 @@
   }
 
   public Class<? extends Record> getClass(Record proxy) {
-    return ((RecordImpl) proxy).getSchema().getToken();
+    return ((RecordImpl) proxy).getSchema().getProxyClass();
   }
 
   public abstract RecordSchema<?> getSchema(String token);
 
-  public String getToken(Record record) {
-    String rtn = ((RecordImpl) record).getSchema().getToken().getName() + "-";
-    if (((RecordImpl) record).isFuture()) {
-      rtn += "0-FUTURE";
-    } else {
-      rtn += record.getId();
-    }
-    return rtn;
-  }
-
   /**
    * @param eventBus
    */
@@ -156,7 +146,7 @@
     if (schema == null) {
       return null;
     }
-    return schema.getToken();
+    return schema.getProxyClass();
   }
 
   protected Record getProxy(String token, RecordToTypeMap recordToTypeMap) {
@@ -184,9 +174,15 @@
     return schema.create(RecordJsoImpl.create(id, -1, schema));
   }
 
-  protected String getToken(Class<? extends Record> clazz,
-      RecordToTypeMap recordToTypeMap) {
-    return recordToTypeMap.getType(clazz).getToken().getName();
+  protected String getToken(Record record, RecordToTypeMap recordToTypeMap) {
+    Class<? extends Record> proxyClass = ((RecordImpl) record).getSchema().getProxyClass();
+    String rtn = recordToTypeMap.getClassToken(proxyClass) + "-";
+    if (((RecordImpl) record).isFuture()) {
+      rtn += "0-FUTURE";
+    } else {
+      rtn += record.getId();
+    }
+    return rtn;
   }
 
   ValueStoreJsonImpl getValueStore() {
diff --git a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
index d2633da..da852e9 100644
--- a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
+++ b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
@@ -364,10 +364,18 @@
     sw.println("}");
     sw.println();
 
+    // write getToken(Record)
+    sw.println("public String getToken(Record record) {");
+    sw.indent();
+    sw.println("return getToken(record, new " + recordToTypeMapName + "());");
+    sw.outdent();
+    sw.println("}");
+    sw.println();
+
     // write getToken(Class)
     sw.println("public String getToken(Class clazz) {");
     sw.indent();
-    sw.println("return getToken(clazz, new " + recordToTypeMapName + "());");
+    sw.println("return new " + recordToTypeMapName + "().getClassToken(clazz);");
     sw.outdent();
     sw.println("}");
     sw.println();
@@ -438,21 +446,19 @@
     SourceWriter sw = f.createSourceWriter(generatorContext, out);
     sw.println();
 
-    sw.println("public RecordSchema<? extends Record> getType(Class token) {");
+    sw.println("public <R extends Record> RecordSchema<R> getType(Class<R> recordClass) {");
     sw.indent();
     for (JClassType publicRecordType : generatedRecordTypes) {
       String qualifiedSourceName = publicRecordType.getQualifiedSourceName();
-      sw.println("if (token == " + qualifiedSourceName + ".class) {");
+      sw.println("if (recordClass == " + qualifiedSourceName + ".class) {");
       sw.indent();
-      sw.println("return " + qualifiedSourceName + "Impl.SCHEMA;");
+      sw.println("return (RecordSchema<R>) " + qualifiedSourceName + "Impl.SCHEMA;");
       sw.outdent();
       sw.println("}");
     }
-
     sw.println(
-        "throw new IllegalArgumentException(\"Unknown token \" + token + ");
+        "throw new IllegalArgumentException(\"Unknown recordClass \" + recordClass);");
     sw.indent();
-    sw.println("\", does not match any of the TOKEN variables of a Record\");");
     sw.outdent();
     sw.outdent();
     sw.println("}");
@@ -468,11 +474,28 @@
       sw.outdent();
       sw.println("}");
     }
-
     sw.println("throw new IllegalArgumentException(\"Unknown string token: \" + token);");
     sw.outdent();
     sw.println("}");
 
+    sw.println("public String getClassToken(Class<?> recordClass) {");
+    sw.indent();
+    for (JClassType publicRecordType : generatedRecordTypes) {
+      String qualifiedSourceName = publicRecordType.getQualifiedSourceName();
+      sw.println("if (recordClass == " + qualifiedSourceName + ".class) {");
+      sw.indent();
+      sw.println("return \"" + qualifiedSourceName + "\";");
+      sw.outdent();
+      sw.println("}");
+    }
+    sw.println(
+        "throw new IllegalArgumentException(\"Unknown recordClass \" + recordClass);");
+    sw.indent();
+    sw.outdent();
+    sw.outdent();
+    sw.println("}");
+
+
     sw.outdent();
     sw.println("}");
     sw.println();
@@ -820,6 +843,13 @@
     sw.println("}");
 
     sw.println();
+    sw.println("public MySchema() {");
+    sw.indent();
+    sw.println("super(\"" + publicRecordType.getQualifiedSourceName() + "\");");
+    sw.outdent();
+    sw.println("}");
+
+    sw.println();
     sw.println("@Override");
     sw.println(String.format("public %s create(RecordJsoImpl jso, boolean isFuture) {",
         recordImplTypeName));
@@ -840,7 +870,7 @@
     sw.println("}");
 
     sw.println();
-    sw.println("public Class getToken() {");
+    sw.println("public Class getProxyClass() {");
     sw.indent();
     sw.println("return " + publicRecordType.getQualifiedSourceName() + ".class;"
         + " // special field");
diff --git a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
index ffc4dd8..5609aba 100644
--- a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
+++ b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
@@ -365,11 +365,6 @@
     return encodePropertyValue(returnValue);
   }
 
-  @SuppressWarnings("unchecked")
-  private Class<? extends Record> castToRecordClass(Class<?> propertyType) {
-    return (Class<? extends Record>) propertyType;
-  }
-
   /**
    * Generate an ID for a new record. The default behavior is to return null and
    * let the data store generate the ID automatically.
@@ -432,7 +427,7 @@
          * configured.
          */
         log.info(String.format(
-            "Ingnoring exception caught initializing bean validation framework. "
+            "Ignoring exception caught initializing bean validation framework. "
                 + "It is probably unconfigured or misconfigured. [%s] %s ",
             e.getClass().getName(), e.getLocalizedMessage()));
       }
@@ -782,6 +777,11 @@
         propertyContext));
   }
 
+  @SuppressWarnings("unchecked")
+  private Class<? extends Record> castToRecordClass(Class<?> propertyType) {
+    return (Class<? extends Record>) propertyType;
+  }
+
   /**
    * @throws JSONException 
    * 
diff --git a/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java b/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
index 72dc579..c3d1fb2 100644
--- a/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
+++ b/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
@@ -66,6 +66,7 @@
     ensureConfig();
     String jsonRequestString = RPCServletUtils.readContent(
         request, JSON_CONTENT_TYPE, JSON_CHARSET);
+    System.err.println(jsonRequestString);
     response.setStatus(HttpServletResponse.SC_OK);
     PrintWriter writer = response.getWriter();
 
diff --git a/user/test/com/google/gwt/requestfactory/RequestFactorySuiteDisabled.java b/user/test/com/google/gwt/requestfactory/RequestFactorySuite.java
similarity index 96%
rename from user/test/com/google/gwt/requestfactory/RequestFactorySuiteDisabled.java
rename to user/test/com/google/gwt/requestfactory/RequestFactorySuite.java
index 1faf64a..f84d0a1 100644
--- a/user/test/com/google/gwt/requestfactory/RequestFactorySuiteDisabled.java
+++ b/user/test/com/google/gwt/requestfactory/RequestFactorySuite.java
@@ -25,7 +25,7 @@
  * Tests of RequestFactory that require GWT.
  * @see com.google.gwt.valuestore.ValueStoreSuite
  */
-public class RequestFactorySuiteDisabled {
+public class RequestFactorySuite {
   public static Test suite() {
     GWTTestSuite suite = new GWTTestSuite(
         "Test suite for requestfactory gwt code.");
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java b/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
index af40b95..0921b4d 100644
--- a/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
@@ -54,11 +54,18 @@
 
      public RecordSchema<? extends Record> getType(
        String recordClass) {
-      if (recordClass.equals(SimpleFooRecord.class.getName())) {
+      if (recordClass.equals("simple-foo-class-token")) {
         return SimpleFooRecordImpl.SCHEMA;
       }
       throw new IllegalArgumentException("Unknown token " + recordClass);
     }
+
+    public String getClassToken(Class<?> recordClass) {
+      if (recordClass.equals(SimpleFooRecord.class)) {
+        return "simple-foo-class-token";
+      }
+      throw new IllegalArgumentException("Unknown token " + recordClass);
+    }
   };
   ValueStoreJsonImpl valueStore = null;
   RequestFactoryJsonImpl requestFactory = null;
@@ -104,6 +111,10 @@
       public String getToken(Class<? extends Record> clazz) {
         throw new UnsupportedOperationException("Auto-generated method stub");
       }
+
+      public String getToken(Record proxy) {
+        throw new UnsupportedOperationException("Auto-generated method stub");
+      }
     };
 
     // add a record
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/SimpleBazRecordImpl.java b/user/test/com/google/gwt/requestfactory/client/impl/SimpleBazRecordImpl.java
index 876478f..eec9afa 100644
--- a/user/test/com/google/gwt/requestfactory/client/impl/SimpleBazRecordImpl.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/SimpleBazRecordImpl.java
@@ -33,12 +33,17 @@
    * The Schema class.
    */
   public static class MySchema extends RecordSchema<SimpleBazRecordImpl> {
+    
     private final Set<Property<?>> allProperties;
     {
       Set<Property<?>> set = new HashSet<Property<?>>();
       set.addAll(super.allProperties());
       allProperties = Collections.unmodifiableSet(set);
     }
+    
+    public MySchema() {
+      super(SimpleBazRecordImpl.class.getName());
+    }
 
     @Override
     public Set<Property<?>> allProperties() {
@@ -58,7 +63,7 @@
     }
 
     @Override
-    public Class<? extends Record> getToken() {
+    public Class<? extends Record> getProxyClass() {
       // ignore
       return null;
     }
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java b/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
index 787350c..301bb8d 100644
--- a/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
@@ -39,7 +39,9 @@
    * The Schema class.
    */
   public static class MySchema extends RecordSchema<SimpleFooRecordImpl> {
+    
     private final Set<Property<?>> allProperties;
+    
     {
       Set<Property<?>> set = new HashSet<Property<?>>();
       set.addAll(super.allProperties());
@@ -52,6 +54,9 @@
       set.add(enumField);
       allProperties = Collections.unmodifiableSet(set);
     }
+    public MySchema() {
+      super(SimpleFooRecord.class.getName());
+    }
 
     @Override
     public Set<Property<?>> allProperties() {
@@ -71,7 +76,7 @@
     }
 
     @Override
-    public Class<? extends Record> getToken() {
+    public Class<? extends Record> getProxyClass() {
       return SimpleFooRecord.class; // special field
     }
   }
diff --git a/user/test/com/google/gwt/valuestore/ValueStoreSuiteDisabled.java b/user/test/com/google/gwt/valuestore/ValueStoreSuite.java
similarity index 90%
rename from user/test/com/google/gwt/valuestore/ValueStoreSuiteDisabled.java
rename to user/test/com/google/gwt/valuestore/ValueStoreSuite.java
index 53992fb..e6a5a93 100644
--- a/user/test/com/google/gwt/valuestore/ValueStoreSuiteDisabled.java
+++ b/user/test/com/google/gwt/valuestore/ValueStoreSuite.java
@@ -22,9 +22,9 @@
 
 /**
  * Tests of the valuestore package that require GWT.
- * @see com.google.gwt.requestfactory.RequestFactorySuiteDisabled
+ * @see com.google.gwt.requestfactory.RequestFactorySuite
  */
-public class ValueStoreSuiteDisabled {
+public class ValueStoreSuite {
   public static Test suite() {
     GWTTestSuite suite = new GWTTestSuite(
         "Test suite for all valuestore code.");