Address issue 6076 where composite paths were not recorded correctly.
http://gwt-code-reviews.appspot.com/1364801/
Patch by: t.broyer
Review by: bobv


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9838 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java b/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
index fdb0427..e0c8b23 100644
--- a/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
+++ b/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
@@ -175,7 +175,7 @@
           sw.indent();
           sw.println("%s = new %s();", delegateFields.get(d), subDelegateType);
           sw.println("addSubDelegate(%s, appendPath(\"%s\"), editor.%s);",
-              delegateFields.get(d), d.getPropertyName(),
+              delegateFields.get(d), d.getDeclaredPath(),
               d.getSimpleExpression());
           sw.outdent();
           sw.println("}");
diff --git a/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java b/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
index 66d7c9f..b6cd3cb 100644
--- a/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
+++ b/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
@@ -33,8 +33,7 @@
  * AbstractEditorDriverGenerator.
  */
 public class SimpleBeanEditorTest extends GWTTestCase {
-  class AddressCoEditorView extends LeafAddressEditor implements
-      IsEditor<LeafAddressEditor> {
+  class AddressCoEditorView extends LeafAddressEditor implements IsEditor<LeafAddressEditor> {
     private LeafAddressEditor addressEditor = new LeafAddressEditor();
 
     public LeafAddressEditor asEditor() {
@@ -58,8 +57,7 @@
     }
   }
 
-  class LeafAddressEditor extends AddressEditor implements
-      LeafValueEditor<Address> {
+  class LeafAddressEditor extends AddressEditor implements LeafValueEditor<Address> {
     /*
      * These two fields are used to ensure that getValue() and setValue() aren't
      * called excessively.
@@ -79,8 +77,7 @@
     }
   }
 
-  interface ListEditorDriver
-      extends
+  interface ListEditorDriver extends
       SimpleBeanEditorDriver<List<String>, ListEditor<String, SimpleEditor<String>>> {
   }
 
@@ -118,8 +115,7 @@
       SimpleBeanEditorDriver<Person, PersonEditorWithCoAddressEditorView> {
   }
 
-  static class PersonEditorWithDelegate extends PersonEditor implements
-      HasEditorDelegate<Person> {
+  static class PersonEditorWithDelegate extends PersonEditor implements HasEditorDelegate<Person> {
     EditorDelegate<Person> delegate;
 
     public void setDelegate(EditorDelegate<Person> delegate) {
@@ -142,6 +138,16 @@
       SimpleBeanEditorDriver<Person, PersonEditorWithLeafAddressEditor> {
   }
 
+  class PersonEditorWithManagerNameWithDelegate implements Editor<Person> {
+    @Path("manager.name")
+    SimpleEditorWithDelegate<String> managerName = new SimpleEditorWithDelegate<String>(
+        UNINITIALIZED);
+  }
+
+  interface PersonEditorWithManagerNameWithDelegateDriver extends
+      SimpleBeanEditorDriver<Person, PersonEditorWithManagerNameWithDelegate> {
+  }
+
   class PersonEditorWithMultipleBindings implements Editor<Person> {
     @Editor.Path("address")
     AddressEditorPartOne one = new AddressEditorPartOne();
@@ -185,8 +191,7 @@
     SimpleEditor<String> managerName = SimpleEditor.of(UNINITIALIZED);
   }
 
-  interface PersonEditorWithValueAwareLeafAddressEditorDriver
-      extends
+  interface PersonEditorWithValueAwareLeafAddressEditorDriver extends
       SimpleBeanEditorDriver<Person, PersonEditorWithValueAwareLeafAddressEditor> {
   }
 
@@ -205,20 +210,32 @@
 
   class PersonWithListEditor implements Editor<PersonWithList> {
     SimpleEditor<String> nameEditor = SimpleEditor.of(UNINITIALIZED);
-    ListEditor<Address, AddressEditor> addressesEditor = ListEditor.of(new EditorSource<AddressEditor>() {
-      @Override
-      public AddressEditor create(int index) {
-        return new AddressEditor();
-      }
-    });
+    ListEditor<Address, AddressEditor> addressesEditor = ListEditor
+        .of(new EditorSource<AddressEditor>() {
+          @Override
+          public AddressEditor create(int index) {
+            return new AddressEditor();
+          }
+        });
   }
 
   interface PersonWithListEditorDriver extends
       SimpleBeanEditorDriver<PersonWithList, PersonWithListEditor> {
   }
 
-  class ValueAwareAddressEditor extends AddressEditor implements
-      ValueAwareEditor<Address> {
+  class SimpleEditorWithDelegate<T> extends SimpleEditor<T> implements HasEditorDelegate<T> {
+    EditorDelegate<T> delegate;
+
+    public SimpleEditorWithDelegate(T value) {
+      super(value);
+    }
+
+    public void setDelegate(EditorDelegate<T> delegate) {
+      this.delegate = delegate;
+    }
+  }
+
+  class ValueAwareAddressEditor extends AddressEditor implements ValueAwareEditor<Address> {
     int flushCalled;
     int setDelegateCalled;
     int setValueCalled;
@@ -244,8 +261,7 @@
   /**
    * All the mix-ins. Not that this seems like a good idea...
    */
-  class ValueAwareLeafAddressEditor extends LeafAddressEditor implements
-      ValueAwareEditor<Address> {
+  class ValueAwareLeafAddressEditor extends LeafAddressEditor implements ValueAwareEditor<Address> {
     int flushCalled;
     int setDelegateCalled;
 
@@ -300,7 +316,8 @@
 
   public void testAliasedEditors() {
     PersonEditorWithAliasedSubEditors editor = new PersonEditorWithAliasedSubEditors();
-    PersonEditorWithAliasedSubEditorsDriver driver = GWT.create(PersonEditorWithAliasedSubEditorsDriver.class);
+    PersonEditorWithAliasedSubEditorsDriver driver =
+        GWT.create(PersonEditorWithAliasedSubEditorsDriver.class);
     driver.initialize(editor);
     driver.edit(person);
 
@@ -321,6 +338,16 @@
     assertEquals("Should see this", person.getName());
   }
 
+  public void testDelegatePath() {
+    PersonEditorWithManagerNameWithDelegate editor = new PersonEditorWithManagerNameWithDelegate();
+    PersonEditorWithManagerNameWithDelegateDriver driver =
+        GWT.create(PersonEditorWithManagerNameWithDelegateDriver.class);
+    driver.initialize(editor);
+    driver.edit(person);
+
+    assertEquals("manager.name", editor.managerName.delegate.getPath());
+  }
+
   public void testEditorWithNullSubEditor() {
     PersonEditor editor = new PersonEditor();
     editor.addressEditor = null;
@@ -358,9 +385,9 @@
    */
   public void testIsEditorView() {
     PersonEditorWithAddressEditorView personEditor = new PersonEditorWithAddressEditorView();
-    PersonEditorWithAddressEditorViewDriver driver = GWT.create(PersonEditorWithAddressEditorViewDriver.class);
-    testLeafAddressEditor(driver, personEditor,
-        personEditor.addressEditor.asEditor(), true);
+    PersonEditorWithAddressEditorViewDriver driver =
+        GWT.create(PersonEditorWithAddressEditorViewDriver.class);
+    testLeafAddressEditor(driver, personEditor, personEditor.addressEditor.asEditor(), true);
   }
 
   /**
@@ -369,9 +396,9 @@
    */
   public void testIsEditorViewWithCoEditorA() {
     PersonEditorWithCoAddressEditorView personEditor = new PersonEditorWithCoAddressEditorView();
-    PersonEditorWithCoAddressEditorViewDriver driver = GWT.create(PersonEditorWithCoAddressEditorViewDriver.class);
-    testLeafAddressEditor(driver, personEditor, personEditor.addressEditor,
-        true);
+    PersonEditorWithCoAddressEditorViewDriver driver =
+        GWT.create(PersonEditorWithCoAddressEditorViewDriver.class);
+    testLeafAddressEditor(driver, personEditor, personEditor.addressEditor, true);
   }
 
   /**
@@ -380,9 +407,9 @@
    */
   public void testIsEditorViewWithCoEditorB() {
     PersonEditorWithCoAddressEditorView personEditor = new PersonEditorWithCoAddressEditorView();
-    PersonEditorWithCoAddressEditorViewDriver driver = GWT.create(PersonEditorWithCoAddressEditorViewDriver.class);
-    testLeafAddressEditor(driver, personEditor,
-        personEditor.addressEditor.asEditor(), true);
+    PersonEditorWithCoAddressEditorViewDriver driver =
+        GWT.create(PersonEditorWithCoAddressEditorViewDriver.class);
+    testLeafAddressEditor(driver, personEditor, personEditor.addressEditor.asEditor(), true);
   }
 
   /**
@@ -392,7 +419,8 @@
    */
   public void testLeafValueEditorDeclaredInSlot() {
     PersonEditorWithLeafAddressEditor personEditor = new PersonEditorWithLeafAddressEditor();
-    PersonEditorWithLeafAddressEditorDriver driver = GWT.create(PersonEditorWithLeafAddressEditorDriver.class);
+    PersonEditorWithLeafAddressEditorDriver driver =
+        GWT.create(PersonEditorWithLeafAddressEditorDriver.class);
     LeafAddressEditor addressEditor = personEditor.addressEditor;
 
     testLeafAddressEditor(driver, personEditor, addressEditor, true);
@@ -436,7 +464,8 @@
    * Test a top-level ListEditor.
    */
   public void testListEditor() {
-    final SortedMap<Integer, SimpleEditor<String>> positionMap = new TreeMap<Integer, SimpleEditor<String>>();
+    final SortedMap<Integer, SimpleEditor<String>> positionMap =
+        new TreeMap<Integer, SimpleEditor<String>>();
     @SuppressWarnings("unchecked")
     final SimpleEditor<String>[] disposed = new SimpleEditor[1];
     class StringSource extends EditorSource<SimpleEditor<String>> {
@@ -462,16 +491,14 @@
 
     driver.initialize(editor);
 
-    List<String> rawData = new ArrayList<String>(Arrays.asList("foo", "bar",
-        "baz"));
+    List<String> rawData = new ArrayList<String>(Arrays.asList("foo", "bar", "baz"));
     driver.edit(rawData);
 
     List<SimpleEditor<String>> editors = editor.getEditors();
     assertEquals(rawData.size(), editors.size());
-    assertEquals(rawData, Arrays.asList(editors.get(0).getValue(),
-        editors.get(1).getValue(), editors.get(2).getValue()));
-    assertEquals(editors,
-        new ArrayList<SimpleEditor<String>>(positionMap.values()));
+    assertEquals(rawData, Arrays.asList(editors.get(0).getValue(), editors.get(1).getValue(),
+        editors.get(2).getValue()));
+    assertEquals(editors, new ArrayList<SimpleEditor<String>>(positionMap.values()));
 
     List<String> mutableList = editor.getList();
     assertEquals(rawData, mutableList);
@@ -490,8 +517,7 @@
     mutableList.add("quux");
     assertEquals(4, editors.size());
     assertEquals("quux", editors.get(3).getValue());
-    assertEquals(editors,
-        new ArrayList<SimpleEditor<String>>(positionMap.values()));
+    assertEquals(editors, new ArrayList<SimpleEditor<String>>(positionMap.values()));
 
     // Delete an element
     SimpleEditor<String> expectedDisposed = editors.get(0);
@@ -499,8 +525,7 @@
     assertSame(expectedDisposed, disposed[0]);
     assertEquals(3, editors.size());
     assertEquals("quux", editors.get(2).getValue());
-    assertEquals(editors,
-        new ArrayList<SimpleEditor<String>>(positionMap.values()));
+    assertEquals(editors, new ArrayList<SimpleEditor<String>>(positionMap.values()));
   }
 
   /**
@@ -531,8 +556,7 @@
 
     // Edit
     driver.edit(person);
-    AddressEditor addressEditor = personEditor.addressesEditor.getEditors().get(
-        1);
+    AddressEditor addressEditor = personEditor.addressesEditor.getEditors().get(1);
     assertEquals("a2City", addressEditor.city.getValue());
     addressEditor.city.setValue("edited");
 
@@ -542,7 +566,8 @@
   }
 
   public void testMultipleBinding() {
-    PersonEditorWithMultipleBindingsDriver driver = GWT.create(PersonEditorWithMultipleBindingsDriver.class);
+    PersonEditorWithMultipleBindingsDriver driver =
+        GWT.create(PersonEditorWithMultipleBindingsDriver.class);
     PersonEditorWithMultipleBindings editor = new PersonEditorWithMultipleBindings();
 
     driver.initialize(editor);
@@ -559,12 +584,13 @@
   }
 
   public void testOptionalField() {
-    PersonEditorWithOptionalAddressDriver driver = GWT.create(PersonEditorWithOptionalAddressDriver.class);
+    PersonEditorWithOptionalAddressDriver driver =
+        GWT.create(PersonEditorWithOptionalAddressDriver.class);
     person.address = null;
 
     AddressEditor delegate = new AddressEditor();
-    PersonEditorWithOptionalAddressEditor editor = new PersonEditorWithOptionalAddressEditor(
-        delegate);
+    PersonEditorWithOptionalAddressEditor editor =
+        new PersonEditorWithOptionalAddressEditor(delegate);
     driver.initialize(editor);
 
     // Make sure we don't blow up with the null field
@@ -583,8 +609,10 @@
   }
 
   public void testValueAwareEditorInDeclaredSlot() {
-    PersonEditorWithValueAwareAddressEditorDriver driver = GWT.create(PersonEditorWithValueAwareAddressEditorDriver.class);
-    PersonEditorWithValueAwareAddressEditor personEditor = new PersonEditorWithValueAwareAddressEditor();
+    PersonEditorWithValueAwareAddressEditorDriver driver =
+        GWT.create(PersonEditorWithValueAwareAddressEditorDriver.class);
+    PersonEditorWithValueAwareAddressEditor personEditor =
+        new PersonEditorWithValueAwareAddressEditor();
     ValueAwareAddressEditor addressEditor = personEditor.addressEditor;
 
     testValueAwareAddressEditor(driver, personEditor, addressEditor);
@@ -606,8 +634,10 @@
   }
 
   public void testValueAwareLeafValueEditorInDeclaredSlot() {
-    PersonEditorWithValueAwareLeafAddressEditor personEditor = new PersonEditorWithValueAwareLeafAddressEditor();
-    PersonEditorWithValueAwareLeafAddressEditorDriver driver = GWT.create(PersonEditorWithValueAwareLeafAddressEditorDriver.class);
+    PersonEditorWithValueAwareLeafAddressEditor personEditor =
+        new PersonEditorWithValueAwareLeafAddressEditor();
+    PersonEditorWithValueAwareLeafAddressEditorDriver driver =
+        GWT.create(PersonEditorWithValueAwareLeafAddressEditorDriver.class);
     ValueAwareLeafAddressEditor addressEditor = personEditor.addressEditor;
 
     testLeafAddressEditor(driver, personEditor, addressEditor, true);
@@ -646,8 +676,8 @@
   }
 
   private <T extends Editor<Person>> void testLeafAddressEditor(
-      SimpleBeanEditorDriver<Person, T> driver, T personEditor,
-      LeafAddressEditor addressEditor, boolean declaredAsLeaf) {
+      SimpleBeanEditorDriver<Person, T> driver, T personEditor, LeafAddressEditor addressEditor,
+      boolean declaredAsLeaf) {
     Address oldAddress = person.address;
     // Initialize
     driver.initialize(personEditor);
diff --git a/user/test/com/google/gwt/editor/client/impl/DelegateMapTest.java b/user/test/com/google/gwt/editor/client/impl/DelegateMapTest.java
index 7391e05..5b738a1 100644
--- a/user/test/com/google/gwt/editor/client/impl/DelegateMapTest.java
+++ b/user/test/com/google/gwt/editor/client/impl/DelegateMapTest.java
@@ -19,6 +19,8 @@
 import com.google.gwt.editor.client.Address;
 import com.google.gwt.editor.client.AddressEditor;
 import com.google.gwt.editor.client.Editor;
+import com.google.gwt.editor.client.EditorDelegate;
+import com.google.gwt.editor.client.HasEditorDelegate;
 import com.google.gwt.editor.client.IsEditor;
 import com.google.gwt.editor.client.Person;
 import com.google.gwt.editor.client.SimpleBeanEditorDriver;
@@ -33,8 +35,7 @@
  * Tests for DelegateMap.
  */
 public class DelegateMapTest extends GWTTestCase {
-  class AddressCoEditorView extends AddressEditor implements
-      IsEditor<AddressEditor> {
+  class AddressCoEditorView extends AddressEditor implements IsEditor<AddressEditor> {
     private AddressEditor addressEditor = new AddressEditor();
 
     public AddressEditor asEditor() {
@@ -46,16 +47,24 @@
     AddressCoEditorView addressEditor = new AddressCoEditorView();
     SimpleEditor<String> name = SimpleEditor.of("uninitialized");
     @Path("manager.name")
-    SimpleEditor<String> managerName = SimpleEditor.of("uninitialized");
+    SimpleEditorWithDelegate<String> managerName = new SimpleEditorWithDelegate<String>(
+        "uninitialized");
   }
 
   interface PersonEditorWithCoAddressEditorViewDriver extends
       SimpleBeanEditorDriver<Person, PersonEditorWithCoAddressEditorView> {
   }
 
-  @Override
-  public String getModuleName() {
-    return "com.google.gwt.editor.Editor";
+  class SimpleEditorWithDelegate<T> extends SimpleEditor<T> implements HasEditorDelegate<T> {
+    EditorDelegate<T> delegate;
+
+    public SimpleEditorWithDelegate(T value) {
+      super(value);
+    }
+
+    public void setDelegate(EditorDelegate<T> delegate) {
+      this.delegate = delegate;
+    }
   }
 
   private AbstractSimpleBeanEditorDriver<Person, PersonEditorWithCoAddressEditorView> driver;
@@ -64,6 +73,29 @@
   private Person person;
 
   @Override
+  public String getModuleName() {
+    return "com.google.gwt.editor.Editor";
+  }
+
+  public void test() {
+    // Test by-object
+    assertEquals(Arrays.asList(editor), editors(map, person));
+    assertEquals(Arrays.asList(editor.addressEditor.addressEditor, editor.addressEditor), editors(
+        map, person.getAddress()));
+
+    // Test by-path
+    assertEquals(Arrays.asList(editor), editors(map, ""));
+    assertEquals(Arrays.asList(editor.addressEditor.addressEditor, editor.addressEditor), editors(
+        map, "address"));
+    assertEquals(Arrays.<Editor<?>> asList(editor.managerName), editors(map, "manager.name"));
+  }
+
+  public void testSimplePath() {
+    assertSame(editor.name, map.getEditorByPath("name").get(0));
+    assertSame(editor.managerName, map.getEditorByPath("manager.name").get(0));
+  }
+
+  @Override
   protected void gwtSetUp() throws Exception {
     Address a = new Address();
     a.setCity("city");
@@ -85,25 +117,6 @@
     map = DelegateMap.of(driver, DelegateMap.IDENTITY);
   }
 
-  public void test() {
-    // Test by-object
-    assertEquals(Arrays.asList(editor), editors(map, person));
-    assertEquals(
-        Arrays.asList(editor.addressEditor.addressEditor, editor.addressEditor),
-        editors(map, person.getAddress()));
-
-    // Test by-path
-    assertEquals(Arrays.asList(editor), editors(map, ""));
-    assertEquals(
-        Arrays.asList(editor.addressEditor.addressEditor, editor.addressEditor),
-        editors(map, "address"));
-  }
-
-  public void testSimplePath() {
-    assertSame(editor.name, map.getEditorByPath("name").get(0));
-    assertSame(editor.managerName, map.getEditorByPath("manager.name").get(0));
-  }
-
   private List<Editor<?>> editors(DelegateMap map, Object o) {
     List<Editor<?>> toReturn = new ArrayList<Editor<?>>();
     for (AbstractEditorDelegate<?, ?> delegate : map.get(o)) {