Add partial support for Record types as method parameters
- Currently, Record has to already have been persisted on the server
Added missing support for String as a RF method return type
Fixed bugs with cast exceptions in DevMode
Review at http://gwt-code-reviews.appspot.com/780801
Review by: rjrjr@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8572 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
index a4fed52..1f82e1a 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.math.BigDecimal;
@@ -37,7 +38,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(new BigDecimal(responseText),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
index 3f586e2..8bfd778 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.math.BigDecimal;
@@ -38,7 +39,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(new BigDecimal(responseText).toBigInteger(),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
index 42c3c4c..29c39dc 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -36,7 +37,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(Boolean.valueOf(responseText),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
index 68a61ea..e1b0f46 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -36,7 +37,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(Integer.valueOf(responseText).byteValue(),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
index 11a3254..4ed98fe 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -36,7 +37,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(responseText.charAt(0),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
index 551bb6f..d87264c 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -37,7 +38,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(new Date(Long.valueOf(responseText)),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
index c9f8dd8..52deeef 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -36,7 +37,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(Double.valueOf(responseText),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
index c08a0c7..f25c997 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -41,7 +42,8 @@
this.enumValues = enumValues;
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
int ordinal = Integer.valueOf(responseText);
for (E e : enumValues) {
if (ordinal == e.ordinal()) {
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
index 2c279a2..a082a035 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -36,7 +37,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(Float.valueOf(responseText),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
index ac18103..fa091c4 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -36,7 +37,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(Integer.valueOf(responseText),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
index 10571cb..3880847 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
@@ -50,9 +50,9 @@
this.schema = schema;
}
- public void handleJsonResult(JavaScriptObject jsoResult) {
+ public void handleResult(Object jsoResult, JavaScriptObject sideEffects) {
- JsArray<RecordJsoImpl> valueJsos = jsoResult.cast();
+ JsArray<RecordJsoImpl> valueJsos = (JsArray<RecordJsoImpl>) jsoResult;
List<T> valueList = new ArrayList<T>(valueJsos.length());
for (int i = 0; i < valueJsos.length(); i++) {
RecordJsoImpl jso = valueJsos.get(i);
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
index 0197276..7f9cc2b 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
@@ -44,9 +44,9 @@
this.schema = schema;
}
- public void handleJsonResult(JavaScriptObject jsoResult) {
+ public void handleResult(Object jsoResult, JavaScriptObject sideEffects) {
- RecordJsoImpl jso = jsoResult.cast();
+ RecordJsoImpl jso = (RecordJsoImpl) jsoResult;
jso.setSchema(schema);
requestFactory.getValueStore().setRecord(jso, requestFactory);
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
index 04fb0a1..d72fee2 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -36,7 +37,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(Long.valueOf(responseText),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
index 2595345..0e797ca 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
@@ -36,9 +36,10 @@
super(requestFactory);
}
- public void handleJsonResult(JavaScriptObject result) {
- handlePrimitiveResult(asString(result));
+ public void handleResult(Object result, JavaScriptObject sideEffects) {
+ handlePrimitiveResult(asString(result), sideEffects);
}
- protected abstract void handlePrimitiveResult(String responseText);
+ protected abstract void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects);
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
index 5ab7916..651b8c9 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
@@ -53,9 +53,9 @@
requestFactory);
}
- public native String asString(JavaScriptObject jso) /*-{
- return String(jso);
- }-*/;
+ protected String asString(Object jso) {
+ return String.valueOf(jso);
+ }
public void clearUsed() {
deltaValueStore.clearUsed();
@@ -97,7 +97,7 @@
public void handleResponseText(String responseText) {
RecordJsoImpl.JsonResults results = RecordJsoImpl.fromResults(responseText);
processRelated(results.getRelated());
- handleJsonResult(results.getJavascriptResult());
+ handleResult(results.getResult(), results.getSideEffects());
}
public boolean isChanged() {
@@ -127,7 +127,8 @@
*/
protected abstract R getThis();
- protected abstract void handleJsonResult(JavaScriptObject result);
+ protected abstract void handleResult(Object result,
+ JavaScriptObject sideEffects);
protected native void processRelated(JavaScriptObject related) /*-{
for(var recordKey in related) {
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
index da9a35b..9450caf 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Collections;
@@ -36,7 +37,8 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
receiver.onSuccess(Short.valueOf(responseText),
Collections.<SyncResult> emptySet());
}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java
new file mode 100644
index 0000000..c15cd1c
--- /dev/null
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.requestfactory.client.impl;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.valuestore.shared.SyncResult;
+
+import java.util.Collections;
+
+/**
+ * <p>
+ * <span style="color:red">Experimental API: This class is still under rapid
+ * development, and is very likely to be deleted. Use it at your own risk.
+ * </span>
+ * </p>
+ * Abstract implementation of
+ * {@link com.google.gwt.requestfactory.shared.RequestFactory.RequestObject
+ * RequestFactory.RequestObject} for requests that return String.
+ */
+public abstract class AbstractStringRequest extends
+ AbstractPrimitiveRequest<String, AbstractStringRequest> {
+
+ public AbstractStringRequest(RequestFactoryJsonImpl requestFactory) {
+ super(requestFactory);
+ }
+
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
+ receiver.onSuccess(responseText,
+ Collections.<SyncResult> emptySet());
+ }
+
+ @Override
+ protected AbstractStringRequest getThis() {
+ return this;
+ }
+}
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
index ad657c2..2ac72e9 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
@@ -15,6 +15,7 @@
*/
package com.google.gwt.requestfactory.client.impl;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.valuestore.shared.SyncResult;
import java.util.Set;
@@ -36,8 +37,9 @@
super(requestFactory);
}
- public void handlePrimitiveResult(String responseText) {
- Set<SyncResult> syncResults = deltaValueStore.commit(responseText);
+ public void handlePrimitiveResult(String responseText,
+ JavaScriptObject sideEffects) {
+ Set<SyncResult> syncResults = deltaValueStore.commit(sideEffects);
receiver.onSuccess(null, syncResults);
}
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 f7cc91c..68aca5b 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
@@ -136,9 +136,8 @@
used = false;
}
- public Set<SyncResult> commit(String response) {
+ public Set<SyncResult> commit(JavaScriptObject returnedJso) {
Set<SyncResult> syncResults = new HashSet<SyncResult>();
- JavaScriptObject returnedJso = ReturnRecord.getJsoResponse(response);
HashSet<String> keys = new HashSet<String>();
ReturnRecord.fillKeys(returnedJso, keys);
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 4cf57e4..e7082c9 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
@@ -43,10 +43,6 @@
protected JsonResults() {
}
- public final native JavaScriptObject getJavascriptResult() /*-{
- return this.result;
- }-*/;
-
public final native JsArray<RecordJsoImpl> getListResult() /*-{
return this.result;
}-*/;
@@ -58,6 +54,14 @@
public final native JavaScriptObject getRelated() /*-{
return this.related;
}-*/;
+
+ public final native Object getResult() /*-{
+ return Object(this.result);
+ }-*/;
+
+ public final native JavaScriptObject getSideEffects() /*-{
+ return this.sideEffects;
+ }-*/;
}
public static native JsArray<RecordJsoImpl> arrayFromJson(String json) /*-{
diff --git a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
index c956745..2e43866 100644
--- a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
+++ b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
@@ -42,6 +42,7 @@
import com.google.gwt.requestfactory.client.impl.AbstractJsonObjectRequest;
import com.google.gwt.requestfactory.client.impl.AbstractLongRequest;
import com.google.gwt.requestfactory.client.impl.AbstractShortRequest;
+import com.google.gwt.requestfactory.client.impl.AbstractStringRequest;
import com.google.gwt.requestfactory.client.impl.AbstractVoidRequest;
import com.google.gwt.requestfactory.client.impl.RecordImpl;
import com.google.gwt.requestfactory.client.impl.RecordJsoImpl;
@@ -531,6 +532,8 @@
requestClassName = asInnerImplClass("ListRequestImpl", returnType);
} else if (isRecordRequest(typeOracle, requestType)) {
requestClassName = asInnerImplClass("ObjectRequestImpl", returnType);
+ } else if (isStringRequest(typeOracle, requestType)) {
+ requestClassName = AbstractStringRequest.class.getName();
} else if (isLongRequest(typeOracle, requestType)) {
requestClassName = AbstractLongRequest.class.getName();
} else if (isIntegerRequest(typeOracle, requestType)) {
@@ -627,18 +630,29 @@
if (sb.length() > 0) {
sb.append(", ");
}
+ JClassType classType = parameter.getType().isClassOrInterface();
+
+ JType paramType = parameter.getType();
+ boolean isRef =
+ "com.google.gwt.valuestore.shared.PropertyReference".equals(
+ paramType.getQualifiedBinaryName());
+ JParameterizedType params = paramType.isParameterized();
+ if (params != null) {
+ classType = params.getTypeArgs()[0];
+ }
+ if (classType != null
+ && classType.isAssignableTo(typeOracle.findType(Record.class.getName()))) {
+ sb.append("((" + classType.getQualifiedBinaryName() + "Impl" + ")");
+ }
sb.append(parameter.getName());
// TODO No. This defeats the entire purpose of PropertyReference. It's
// supposed
// to be dereferenced server side, not client side.
- if ("com.google.gwt.valuestore.shared.PropertyReference".equals(
- parameter.getType().getQualifiedBinaryName())) {
+ if (isRef) {
sb.append(".get()");
}
- JClassType classType = parameter.getType().isClassOrInterface();
if (classType != null
&& classType.isAssignableTo(typeOracle.findType(Record.class.getName()))) {
- sb.insert(0, "((" + classType.getQualifiedBinaryName() + "Impl" + ")");
sb.append(").getUniqueId()");
}
}
@@ -715,6 +729,11 @@
return requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.findType(Short.class.getName()));
}
+ private boolean isStringRequest(TypeOracle typeOracle,
+ JClassType requestType) {
+ return requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.findType(String.class.getName()));
+ }
+
private boolean isVoidRequest(TypeOracle typeOracle, JClassType requestType) {
return requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.findType(Void.class.getName()));
}
diff --git a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
index 2ea103a..a530606 100644
--- a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
+++ b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
@@ -17,8 +17,8 @@
import com.google.gwt.requestfactory.shared.DataTransferObject;
import com.google.gwt.requestfactory.shared.RequestData;
-import com.google.gwt.requestfactory.shared.Service;
import com.google.gwt.valuestore.shared.Property;
+import com.google.gwt.valuestore.shared.PropertyReference;
import com.google.gwt.valuestore.shared.Record;
import com.google.gwt.valuestore.shared.WriteOperation;
@@ -30,6 +30,8 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
@@ -195,8 +197,18 @@
/**
* Encodes parameter value.
*/
- public Object decodeParameterValue(Class<?> parameterType,
+ public Object decodeParameterValue(Type genericParameterType,
String parameterValue) {
+ Class<?>parameterType = null;
+ if (genericParameterType instanceof Class) {
+ parameterType = (Class<?>) genericParameterType;
+ }
+ if (genericParameterType instanceof ParameterizedType) {
+ ParameterizedType pType = (ParameterizedType) genericParameterType;
+ if (PropertyReference.class == pType.getRawType()) {
+ parameterType = (Class<?>) pType.getActualTypeArguments()[0];
+ }
+ }
if (String.class == parameterType) {
return parameterValue;
}
@@ -272,18 +284,17 @@
* 2. Merge the following and the object resolution code in getEntityKey.
* 3. Update the involvedKeys set.
*/
- // TODO(amitmanjhi): shouldn't this be DataTransferObject.class?
- Service service = parameterType.getAnnotation(Service.class);
+ DataTransferObject service = parameterType.getAnnotation(DataTransferObject.class);
if (service != null) {
Class<?> sClass = service.value();
- String schemaAndId[] = parameterValue.toString().split("-", 2);
+ String schemaAndId[] = parameterValue.toString().split("-", 3);
// ignore schema for now and use Property type
String findMeth = null;
try {
findMeth = getMethodNameFromPropertyName(sClass.getSimpleName(),
"find");
Method meth = sClass.getMethod(findMeth, Long.class);
- return meth.invoke(null, Long.valueOf(schemaAndId[1]));
+ return meth.invoke(null, Long.valueOf(schemaAndId[0]));
} catch (NoSuchMethodException e) {
e.printStackTrace();
throw new IllegalArgumentException(
@@ -522,7 +533,7 @@
* or null if it is a static method. Returns Object[1] as the params array.
*/
public Object[][] getObjectsFromParameterMap(boolean isInstanceMethod,
- Map<String, String> parameterMap, Class<?> parameterClasses[]) {
+ Map<String, String> parameterMap, Type parameterClasses[]) {
// TODO: create an EntityMethodCall (instance, args) instead.
assert parameterClasses != null;
Object args[][] = new Object[2][];
@@ -537,9 +548,9 @@
// TODO: update the involvedKeys for other params
int offset = (isInstanceMethod ? 1 : 0);
- args[1] = new Object[parameterClasses.length];
- for (int i = 0; i < parameterClasses.length; i++) {
- args[1][i] = decodeParameterValue(parameterClasses[i],
+ args[1] = new Object[parameterClasses.length - offset];
+ for (int i = 0; i < parameterClasses.length - offset; i++) {
+ args[1][i] = decodeParameterValue(parameterClasses[i + offset],
parameterMap.get(RequestData.PARAM_TOKEN + (i + offset)));
}
return args;
@@ -655,11 +666,8 @@
}
// get the domain object (for instance methods) and args.
Object args[][] = getObjectsFromParameterMap(operation.isInstance(),
- getParameterMap(topLevelJsonObject), domainMethod.getParameterTypes());
-
- // the involvedKeys set is complete at this point.
-
- // Construct beforeDataMap
+ getParameterMap(topLevelJsonObject), operation.getRequestParameterTypes());
+ // Construct beforeDataMap
constructBeforeDataMap();
// Construct afterDvsDataMap.
constructAfterDvsDataMap();
diff --git a/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java b/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
index 1dc2734..fddd605 100644
--- a/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
+++ b/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
@@ -73,6 +73,10 @@
return domainMethod.getParameterTypes();
}
+ public Type[] getRequestParameterTypes() {
+ return requestMethod.getGenericParameterTypes();
+ }
+
public Class<?> getReturnType() {
Class<?> domainReturnType = getReturnTypeFromParameter(domainMethod,
domainMethod.getGenericReturnType());
diff --git a/user/src/com/google/gwt/requestfactory/server/RequestDefinition.java b/user/src/com/google/gwt/requestfactory/server/RequestDefinition.java
index f0ec51c..0c707df 100644
--- a/user/src/com/google/gwt/requestfactory/server/RequestDefinition.java
+++ b/user/src/com/google/gwt/requestfactory/server/RequestDefinition.java
@@ -15,6 +15,8 @@
*/
package com.google.gwt.requestfactory.server;
+import java.lang.reflect.Type;
+
/**
* <p>
* <span style="color:red">Experimental API: This class is still under rapid
@@ -41,6 +43,8 @@
*/
Class<?>[] getParameterTypes();
+ Type[] getRequestParameterTypes();
+
/**
* Returns the return type of the method to be invoked on the server.
*/
diff --git a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
index 5833934..1fa3c73 100644
--- a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
+++ b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
@@ -118,4 +118,28 @@
}
});
}
-}
\ No newline at end of file
+
+ public void testRecordsAsInstanceMethodParams() {
+
+ final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+ HandlerManager hm = new HandlerManager(null);
+ req.init(hm);
+ delayTestFinish(5000);
+ req.simpleFooRequest().findSimpleFooById(999L).fire(
+ new Receiver<SimpleFooRecord>() {
+ public void onSuccess(SimpleFooRecord response,
+ Set<SyncResult> syncResult) {
+ SimpleBarRecord bar = (SimpleBarRecord) req.create(SimpleBarRecord.class);
+ RequestObject<String> helloReq = req.simpleFooRequest().hello(response, bar);
+ bar = helloReq.edit(bar);
+ helloReq.fire(new Receiver<String>() {
+ public void onSuccess(String response,
+ Set<SyncResult> syncResults) {
+ assertEquals("Greetings FOO from GWT", response);
+ finishTest();
+ }
+ });
+ }
+ });
+ }
+}
diff --git a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
index bd0a625..d7c6639 100644
--- a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
+++ b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
@@ -52,6 +52,10 @@
return singleton;
}
+ public String hello(SimpleBar bar) {
+ return "Greetings " + bar.getUserName() + " from " + getUserName();
+ }
+
public static void reset() {
singleton = new SimpleFoo();
}
diff --git a/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java b/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
index b532b99..76ed88f 100644
--- a/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
+++ b/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
@@ -36,4 +36,7 @@
@Instance
RequestObject<Void> persist(SimpleFooRecord record);
+
+ @Instance
+ RequestObject<String> hello(SimpleFooRecord instance, SimpleBarRecord record);
}