Revision: 10288
Author: [email protected]
Date: Tue Jun 7 06:01:17 2011
Log: Support is/has methods in Editor framework.
Issue 6040.
Patch by: bobv
Review by: rjrjr
Review at http://gwt-code-reviews.appspot.com/1443812
http://code.google.com/p/google-web-toolkit/source/detail?r=10288
Modified:
/trunk/user/src/com/google/gwt/editor/rebind/model/EditorModel.java
/trunk/user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java
=======================================
--- /trunk/user/src/com/google/gwt/editor/rebind/model/EditorModel.java Tue
Jan 25 05:33:10 2011
+++ /trunk/user/src/com/google/gwt/editor/rebind/model/EditorModel.java Tue
Jun 7 06:01:17 2011
@@ -22,13 +22,13 @@
import com.google.gwt.core.ext.typeinfo.JGenericType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
-import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.editor.client.CompositeEditor;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.client.LeafValueEditor;
+import com.google.web.bindery.autobean.gwt.rebind.model.JBeanMethod;
import java.util.ArrayList;
import java.util.Arrays;
@@ -375,13 +375,6 @@
return toReturn.toArray(new EditorData[toReturn.size()]);
}
-
- private String camelCase(String prefix, String name) {
- StringBuilder sb = new StringBuilder();
- sb.append(prefix).append(Character.toUpperCase(name.charAt(0))).append(
- name, 1, name.length());
- return sb.toString();
- }
private List<EditorData> createEditorData(EditorAccess access)
throws UnableToCompleteException {
@@ -471,64 +464,73 @@
continue;
}
boolean lastPart = i == j - 1;
- String getterName = camelCase("get", parts[i]);
-
- for (JClassType search : lookingAt.getFlattenedSupertypeHierarchy())
{
- // If looking at the last element of the path, also look for a
setter
- if (i == j - 1 && setterName == null) {
- for (JMethod maybeSetter : search.getOverloads(camelCase("set",
- parts[i]))) {
- if (maybeSetter.getReturnType().equals(JPrimitiveType.VOID)
- && maybeSetter.getParameters().length == 1) {
+ boolean foundGetterForPart = false;
+
+ for (JMethod maybeSetter : lookingAt.getInheritableMethods()) {
+ JBeanMethod which = JBeanMethod.which(maybeSetter);
+ if (JBeanMethod.CALL.equals(which)) {
+ continue;
+ }
+ if (!which.inferName(maybeSetter).equals(parts[i])) {
+ continue;
+ }
+ switch (which) {
+ case GET: {
+ JType returnType = maybeSetter.getReturnType();
+ lookingAt = returnType.isClassOrInterface();
+ if (!lastPart && lookingAt == null) {
+ poison(foundPrimitiveMessage(returnType,
interstitialGetters.toString(), path));
+ return;
+ }
+
interstitialGetters.append(".").append(maybeSetter.getName()).append("()");
+ interstitialGuard.append("
&& %1$s").append(interstitialGetters).append(" != null");
+ builder.propertyOwnerType(maybeSetter.getEnclosingType());
+ foundGetterForPart = true;
+ if (!lastPart) {
+ continue part;
+ }
+ break;
+ }
+ case SET:
+ case SET_BUILDER: {
+ if (lastPart && setterName == null) {
+ /*
+ * If looking at the last element of the path, also look for
a
+ * setter.
+ */
+
JType setterParamType =
maybeSetter.getParameters()[0].getType();
// Handle the case of setFoo(int) vs. Editor<Integer>
if (setterParamType.isPrimitive() != null) {
// Replace the int with Integer
- setterParamType =
oracle.findType(setterParamType.isPrimitive().getQualifiedBoxedSourceName());
- }
- boolean matches =
setterParamType.isClassOrInterface().isAssignableFrom(
- propertyType);
+ setterParamType =
+
oracle.findType(setterParamType.isPrimitive().getQualifiedBoxedSourceName());
+ }
+ boolean matches =
setterParamType.isClassOrInterface().isAssignableFrom(propertyType);
if (matches) {
setterName = maybeSetter.getName();
- break;
}
}
+ break;
}
}
-
- JMethod getter = search.findMethod(getterName, new JType[0]);
- if (getter != null) {
- JType returnType = getter.getReturnType();
- lookingAt = returnType.isClassOrInterface();
- if (!lastPart && lookingAt == null) {
- poison(foundPrimitiveMessage(returnType,
- interstitialGetters.toString(), path));
- return;
- }
- interstitialGetters.append(".").append(getterName).append("()");
- interstitialGuard.append("
&& %1$s").append(interstitialGetters).append(
- " != null");
- builder.propertyOwnerType(search);
- continue part;
- }
- }
- poison(noGetterMessage(path, proxyType));
- return;
+ }
+ if (!foundGetterForPart) {
+ poison(noGetterMessage(path, proxyType));
+ return;
+ }
}
int idx = interstitialGetters.lastIndexOf(".");
- builder.beanOwnerExpression(idx <= 0 ? "" :
interstitialGetters.substring(
- 0, idx));
+ builder.beanOwnerExpression(idx <= 0 ? "" :
interstitialGetters.substring(0, idx));
if (parts.length > 1) {
// Strip after last && since null is a valid value
- interstitialGuard.delete(interstitialGuard.lastIndexOf(" &&"),
- interstitialGuard.length());
+ interstitialGuard.delete(interstitialGuard.lastIndexOf(" &&"),
interstitialGuard.length());
builder.beanOwnerGuard(interstitialGuard.substring(8));
}
if (interstitialGetters.length() > 0) {
builder.getterExpression("."
- + interstitialGetters.substring(idx + 1,
- interstitialGetters.length() - 2) + "()");
+ + interstitialGetters.substring(idx + 1,
interstitialGetters.length() - 2) + "()");
} else {
builder.getterExpression("");
}
=======================================
---
/trunk/user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java
Thu Apr 21 12:44:49 2011
+++
/trunk/user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java
Tue Jun 7 06:01:17 2011
@@ -188,7 +188,7 @@
types.findType("t.CompositeEditorDriver"), rfedType);
EditorData[] data = m.getEditorData();
- assertEquals(7, data.length);
+ assertEquals(9, data.length);
String[] paths = new String[data.length];
String[] expressions = new String[data.length];
@@ -196,20 +196,22 @@
paths[i] = data[i].getPath();
expressions[i] = data[i].getExpression();
}
- assertEquals(Arrays.asList("address", "address.city", "address.street",
- "person", "person.lastModified", "person.name", "person.readonly"),
- Arrays.asList(paths));
+
assertEquals(Arrays.asList("address", "address.city", "address.street", "person", "person.has",
+ "person.is", "person.lastModified", "person.name", "person.readonly"),
Arrays.asList(paths));
// address is a property, person is a method in CompositeEditor
- assertEquals(Arrays.asList("address", "address.city", "address.street",
- "person()", "person().lastModified", "person().name",
+
assertEquals(Arrays.asList("address", "address.city", "address.street", "person()",
+ "person().has", "person().is", "person().lastModified",
"person().name",
"person().readonly"), Arrays.asList(expressions));
assertTrue(data[0].isDelegateRequired());
assertFalse(data[0].isLeafValueEditor() ||
data[0].isValueAwareEditor());
assertTrue(data[3].isDelegateRequired());
assertFalse(data[3].isLeafValueEditor() ||
data[3].isValueAwareEditor());
- checkPersonLastModified(data[4]);
- checkPersonName(data[5]);
- checkPersonReadonly(data[6]);
+ int fieldNum = 4;
+ checkPersonHasHas(data[fieldNum++]);
+ checkPersonIsIs(data[fieldNum++]);
+ checkPersonLastModified(data[fieldNum++]);
+ checkPersonName(data[fieldNum++]);
+ checkPersonReadonly(data[fieldNum++]);
}
public void testCyclicDriver() {
@@ -259,14 +261,19 @@
EditorModel m = new EditorModel(logger,
types.findType("t.PersonEditorDriver"), rfedType);
EditorData[] fields = m.getEditorData();
- assertEquals(3, fields.length);
-
+ assertEquals(5, fields.length);
+
+ int fieldNum = 0;
+ // hasHas
+ checkPersonHasHas(fields[fieldNum++]);
+ // isIs
+ checkPersonIsIs(fields[fieldNum++]);
// lastModified
- checkPersonLastModified(fields[0]);
+ checkPersonLastModified(fields[fieldNum++]);
// name
- checkPersonName(fields[1]);
+ checkPersonName(fields[fieldNum++]);
// readonly
- checkPersonReadonly(fields[2]);
+ checkPersonReadonly(fields[fieldNum++]);
}
public void testFlatData() throws UnableToCompleteException {
@@ -282,10 +289,13 @@
assertEquals("person", composite[1].getPropertyName());
EditorData[] person =
m.getEditorData(types.findType("t.PersonEditor"));
- assertEquals(3, person.length);
- assertEquals("lastModified", person[0].getPropertyName());
- assertEquals("name", person[1].getPropertyName());
- assertEquals("readonly", person[2].getPropertyName());
+ assertEquals(5, person.length);
+ int fieldNum = 0;
+ assertEquals("has", person[fieldNum++].getPropertyName());
+ assertEquals("is", person[fieldNum++].getPropertyName());
+ assertEquals("lastModified", person[fieldNum++].getPropertyName());
+ assertEquals("name", person[fieldNum++].getPropertyName());
+ assertEquals("readonly", person[fieldNum++].getPropertyName());
EditorData[] address =
m.getEditorData(types.findType("t.AddressEditor"));
assertEquals("city", address[0].getPropertyName());
@@ -465,7 +475,29 @@
EditorModel m = new EditorModel(logger,
types.findType("t.PersonEditorWithAliasedSubEditorsDriver"),
rfedType);
EditorData[] fields = m.getEditorData();
- assertEquals(8, fields.length);
+ assertEquals(12, fields.length);
+ }
+
+ private void checkPersonHasHas(EditorData editorField) {
+ assertNotNull(editorField);
+ assertEquals(types.findType(SimpleEditor.class.getName()),
+ editorField.getEditorType().isParameterized().getBaseType());
+ assertTrue(editorField.isLeafValueEditor());
+ assertFalse(editorField.isDelegateRequired());
+ assertFalse(editorField.isValueAwareEditor());
+ assertEquals(".hasHas()", editorField.getGetterExpression());
+ assertEquals("setHas", editorField.getSetterName());
+ }
+
+ private void checkPersonIsIs(EditorData editorField) {
+ assertNotNull(editorField);
+ assertEquals(types.findType(SimpleEditor.class.getName()),
+ editorField.getEditorType().isParameterized().getBaseType());
+ assertTrue(editorField.isLeafValueEditor());
+ assertFalse(editorField.isDelegateRequired());
+ assertFalse(editorField.isValueAwareEditor());
+ assertEquals(".isIs()", editorField.getGetterExpression());
+ assertEquals("setIs", editorField.getSetterName());
}
private void checkPersonLastModified(EditorData editorField) {
@@ -676,6 +708,10 @@
code.append("String getName();\n");
code.append("long getLastModified();\n");
code.append("String getReadonly();\n");
+ code.append("boolean hasHas();\n");
+ code.append("boolean isIs();\n");
+ code.append("void setHas(boolean has);\n");
+ code.append("void setIs(boolean is);\n");
code.append("void setName(String name);\n");
code.append("void setLastModified(long value);\n");
code.append("}");
@@ -689,6 +725,8 @@
code.append("import " + Editor.class.getName() + ";\n");
code.append("import " + SimpleEditor.class.getName() + ";\n");
code.append("class PersonEditor implements Editor<PersonProxy>
{\n");
+ code.append("SimpleEditor<Boolean> has;\n");
+ code.append("SimpleEditor<Boolean> is;\n");
code.append("SimpleEditor<Long> lastModified;\n");
code.append("public SimpleEditor<String> name;\n");
code.append("SimpleEditor<String> readonly;\n");
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors