Revision: 9537
Author: rj...@google.com
Date: Thu Jan 13 09:40:51 2011
Log: Cherry picking r9536 releases/[rel_#] for issue 4781

http://code.google.com/p/google-web-toolkit/source/detail?r=9537

Modified:
/releases/2.2/user/src/com/google/gwt/uibinder/rebind/model/OwnerFieldClass.java /releases/2.2/user/test/com/google/gwt/uibinder/rebind/model/OwnerFieldClassTest.java

=======================================
--- /releases/2.2/user/src/com/google/gwt/uibinder/rebind/model/OwnerFieldClass.java Tue Nov 2 04:47:58 2010 +++ /releases/2.2/user/src/com/google/gwt/uibinder/rebind/model/OwnerFieldClass.java Thu Jan 13 09:40:51 2011
@@ -28,6 +28,7 @@
 import com.google.gwt.uibinder.rebind.MortalLogger;
 import com.google.gwt.uibinder.rebind.UiBinderContext;

+import java.beans.Introspector;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -44,8 +45,8 @@
  */
 public class OwnerFieldClass {

-  private static final int defaultCost = 4;
-  private static final Map<String, Integer> typeRank;
+  private static final int DEFAULT_COST = 4;
+  private static final Map<String, Integer> TYPE_RANK;
   static {
     HashMap<String, Integer> tmpTypeRank = new HashMap<String, Integer>();
     tmpTypeRank.put("java.lang.String", 1);
@@ -65,7 +66,7 @@
     tmpTypeRank.put("java.lang.Integer", 3);
     tmpTypeRank.put("java.lang.Long", 3);
     tmpTypeRank.put("java.lang.Short", 3);
-    typeRank = Collections.unmodifiableMap(tmpTypeRank);
+    TYPE_RANK = Collections.unmodifiableMap(tmpTypeRank);
   }

   /**
@@ -156,6 +157,24 @@
   public JConstructor getUiConstructor() {
     return uiConstructor;
   }
+
+  /**
+   * Adds a setter for a given property to the given map of setters.
+   *
+   * @param allSetters the map of setters (keyed by property name)
+   * @param propertyName the property name to use
+   * @param method the setter to use
+   */
+  private void addSetter(Map<String, Collection<JMethod>> allSetters,
+      String propertyName, JMethod method) {
+    Collection<JMethod> propertyMethods = allSetters.get(propertyName);
+    if (propertyMethods == null) {
+      propertyMethods = new ArrayList<JMethod>();
+      allSetters.put(propertyName, propertyMethods);
+    }
+
+    propertyMethods.add(method);
+  }

   /**
* Given a collection of setters for the same property, picks which one to
@@ -230,16 +249,15 @@
       String propertyName = method.getName().substring(3);

       // turn "PropertyName" into "propertyName"
-      propertyName = propertyName.substring(0, 1).toLowerCase()
-          + propertyName.substring(1);
-
-      Collection<JMethod> propertyMethods = allSetters.get(propertyName);
-      if (propertyMethods == null) {
-        propertyMethods = new ArrayList<JMethod>();
-        allSetters.put(propertyName, propertyMethods);
-      }
-
-      propertyMethods.add(method);
+      String beanPropertyName = Introspector.decapitalize(propertyName);
+      addSetter(allSetters, beanPropertyName, method);
+
+ // keep backwards compatibility (i.e. hTML instead of HTML for setHTML) + String legacyPropertyName = propertyName.substring(0, 1).toLowerCase()
+          + propertyName.substring(1);
+      if (!legacyPropertyName.equals(beanPropertyName)) {
+        addSetter(allSetters, legacyPropertyName, method);
+      }
     }

     return allSetters;
@@ -349,7 +367,7 @@
    * types, it will not be considered ambiguous.
    *
    * The cost mapping is defined in
-   * {@link #typeRank typeRank }
+   * {@link #TYPE_RANK typeRank }
    * @param method.
    * @return the rank of the method.
    */
@@ -358,9 +376,9 @@
     int rank = 0;
     for (int i = 0; i < Math.min(params.length, 10); i++) {
       JType paramType = params[i].getType();
-      int cost = defaultCost;
-      if (typeRank.containsKey(paramType.getQualifiedSourceName())) {
-        cost = typeRank.get(paramType.getQualifiedSourceName());
+      int cost = DEFAULT_COST;
+      if (TYPE_RANK.containsKey(paramType.getQualifiedSourceName())) {
+        cost = TYPE_RANK.get(paramType.getQualifiedSourceName());
       }
       assert (cost >= 0 && cost <= 0x07);
       rank = rank | (cost << (3 * i));
=======================================
--- /releases/2.2/user/test/com/google/gwt/uibinder/rebind/model/OwnerFieldClassTest.java Tue Nov 2 04:47:58 2010 +++ /releases/2.2/user/test/com/google/gwt/uibinder/rebind/model/OwnerFieldClassTest.java Thu Jan 13 09:40:51 2011
@@ -29,7 +29,7 @@
 import com.google.gwt.uibinder.rebind.MortalLogger;
 import com.google.gwt.uibinder.rebind.UiBinderContext;
 import com.google.gwt.user.client.ui.CheckBox;
-import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.HTML;

 import junit.framework.TestCase;

@@ -51,23 +51,35 @@
   }

   public void testOwnerFieldClass() throws Exception {
-    // Get the JType for a Label
-    JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class);
+    // Get the JType for an HTML
+    JClassType htmlType = gwtTypeAdapter.adaptJavaClass(HTML.class);

     // Now get its field class model
-    OwnerFieldClass fieldClass = OwnerFieldClass.getFieldClass(labelType,
+    OwnerFieldClass fieldClass = OwnerFieldClass.getFieldClass(htmlType,
         MortalLogger.NULL, uiBinderCtx);

     // Check the class model properties
-    assertEquals(labelType, fieldClass.getRawType());
+    assertEquals(htmlType, fieldClass.getRawType());
     assertNull(fieldClass.getUiConstructor());

-    JMethod setter = fieldClass.getSetter("visible");
-    assertMethod(setter, "setVisible", JPrimitiveType.BOOLEAN);
+    // simple property: visible="" maps to setVisible
+    JMethod visibleSetter = fieldClass.getSetter("visible");
+    assertMethod(visibleSetter, "setVisible", JPrimitiveType.BOOLEAN);
+
+    // all-upper-case property, Java Bean naming (all-upper-cased)
+    JMethod htmlSetter = fieldClass.getSetter("HTML");
+    assertMethod(htmlSetter, "setHTML",
+        gwtTypeAdapter.adaptJavaClass(String.class));
+
+    // all-upper-case property, GWT-legacy naming with the first char
+    // lower-cased
+    htmlSetter = fieldClass.getSetter("hTML");
+    assertMethod(htmlSetter, "setHTML",
+        gwtTypeAdapter.adaptJavaClass(String.class));

     // Check that the same instance of the model is returned if asked again
-    assertSame(fieldClass, OwnerFieldClass.getFieldClass(labelType,
-        MortalLogger.NULL, uiBinderCtx));
+    assertSame(fieldClass,
+ OwnerFieldClass.getFieldClass(htmlType, MortalLogger.NULL, uiBinderCtx));

     gwtTypeAdapter.verifyAll();
   }
@@ -153,47 +165,47 @@
     }

     // setvalue1 is not ambiguous
-    public void setValue1(boolean b) {
+    public void setValue1(@SuppressWarnings("unused") boolean b) {
     }

-    public void setValue1(Boolean b) {
+    public void setValue1(@SuppressWarnings("unused") Boolean b) {
     }

     // derived wins
-    public void setValue2(Integer b) {
+    public void setValue2(@SuppressWarnings("unused") Integer b) {
     }

     // this overload wins
-    public void setValue3(int b) {
+    public void setValue3(@SuppressWarnings("unused") int b) {
     }

     // this is not ambiguous since derived
     // has the exact same signature
-    public void setValue4(int b) {
+    public void setValue4(@SuppressWarnings("unused") int b) {
     }

     // setvalue5 is ambiguous
-    public void setValue5(float f) {
+    public void setValue5(@SuppressWarnings("unused") float f) {
     }

-    public void setValue5(double d) {
+    public void setValue5(@SuppressWarnings("unused") double d) {
     }

     // string always wins
-    public void setValue6(String s) {
+    public void setValue6(@SuppressWarnings("unused") String s) {
     }

-    public void setValue6(char s) {
+    public void setValue6(@SuppressWarnings("unused") char s) {
     }

-    public void setValue6(Object s) {
+    public void setValue6(@SuppressWarnings("unused") Object s) {
     }

     // primitive wins
-    public void setValue7(int s) {
+    public void setValue7(@SuppressWarnings("unused") int s) {
     }

-    public void setValue7(StringBuffer s) {
+    public void setValue7(@SuppressWarnings("unused") StringBuffer s) {
     }
   }

@@ -207,10 +219,10 @@
       super();
     }

-    public void setValue2(int b) {
+    public void setValue2(@SuppressWarnings("unused") int b) {
     }

-    public void setValue3(Integer b) {
+    public void setValue3(@SuppressWarnings("unused") Integer b) {
     }

     public void setValue4(int b) {
@@ -498,8 +510,7 @@
   public void testOwnerFieldClass_withBadlyNamedMethod() {
JClassType parentType = gwtTypeAdapter.adaptJavaClass(UiChildWithPoorMethodNames.class);
     try {
- OwnerFieldClass parentClass = OwnerFieldClass.getFieldClass(parentType,
-          MortalLogger.NULL, uiBinderCtx);
+ OwnerFieldClass.getFieldClass(parentType, MortalLogger.NULL, uiBinderCtx); fail("Class should error because @UiChild method has invalid name (and no tag specified).");
     } catch (UnableToCompleteException expected) {
       gwtTypeAdapter.verifyAll();
@@ -553,7 +564,7 @@
     }
   }

- public void testOwnerFieldClass_withMultipleUiConstructors() throws Exception {
+  public void testOwnerFieldClass_withMultipleUiConstructors() {
JClassType constructorsType = gwtTypeAdapter.adaptJavaClass(MultiUiConstructorsClass.class);

     try {

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

Reply via email to