Add ServerFailure.getRequestContext().
Provide getters for Request -> RequestContext -> RequestFactory ->
RequestTransport.
Add fakes for modified interfaces.
Issue 6469.
Review at http://gwt-code-reviews.appspot.com/1451815/
Patch by: bobv
Review by: rjrjr
Suggested by: jasonhall
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10316 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/Request.java b/user/src/com/google/web/bindery/requestfactory/shared/Request.java
index 5ad763d..e763440 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/Request.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/Request.java
@@ -16,9 +16,14 @@
package com.google.web.bindery.requestfactory.shared;
/**
- * Implemented by the request objects created by this factory.
+ * A Request represents a single method invocation on the server. It
+ * encapsulates the arguments provided to the Request factory method declared in
+ * a RequestContext as well as a set of object paths to return from the server.
+ * The returned data is provided to an optional {@link Receiver} object,
+ * specified by the {@link #to(Receiver)} method.
*
* @param <T> The return type of objects in the corresponding response.
+ * @see com.google.web.bindery.requestfactory.shared.testing.FakeRequest
*/
public interface Request<T> {
@@ -36,6 +41,11 @@
void fire(Receiver<? super T> receiver);
/**
+ * Returns the RequestContext associated with the Request.
+ */
+ RequestContext getRequestContext();
+
+ /**
* Specify the object that will receive the result of the method invocation.
*
* @param receiver a {@link Receiver} instance
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/RequestContext.java b/user/src/com/google/web/bindery/requestfactory/shared/RequestContext.java
index 72062c5..a9175b9 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/RequestContext.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/RequestContext.java
@@ -91,6 +91,11 @@
void fire(Receiver<Void> receiver);
/**
+ * Returns the {@link RequestFactory} that created the RequestContext.
+ */
+ RequestFactory getRequestFactory();
+
+ /**
* Returns true if any changes have been made to proxies mutable under this
* context. Note that vacuous changes — e.g. foo.setName(foo.getName()
* — will not trip the changed flag. Similarly, "unmaking" a change will
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/RequestFactory.java b/user/src/com/google/web/bindery/requestfactory/shared/RequestFactory.java
index fd0f2f9..e1873b4 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/RequestFactory.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/RequestFactory.java
@@ -40,6 +40,7 @@
* supertypes of value types is not supported (e.g. Object, Enum, Number).
* </p>
*
+ * @see com.google.web.bindery.requestfactory.shared.testing.FakeRequestFactory
* @see com.google.web.bindery.requestfactory.server.testing.InProcessRequestTransport
*/
public interface RequestFactory {
@@ -118,6 +119,13 @@
<T extends EntityProxy> EntityProxyId<T> getProxyId(String historyToken);
/**
+ * Returns the RequestTransport set via {@link #initialize}.
+ *
+ * @return the {@link RequestTransport} associated with this instance
+ */
+ RequestTransport getRequestTransport();
+
+ /**
* Returns a ProxySerializer that can encode and decode the various
* EntityProxy and ValueProxy types reachable from the RequestFactory.
*
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/RequestTransport.java b/user/src/com/google/web/bindery/requestfactory/shared/RequestTransport.java
index 4346f61..8cbec6a 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/RequestTransport.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/RequestTransport.java
@@ -20,6 +20,7 @@
* payload to the backend.
*
* @see com.google.web.bindery.requestfactory.gwt.client.DefaultRequestTransport
+ * @see com.google.web.bindery.requestfactory.shared.testing.FakeRequestTransport
*/
public interface RequestTransport {
/**
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/ServerFailure.java b/user/src/com/google/web/bindery/requestfactory/shared/ServerFailure.java
index a4b3e56..3106483 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/ServerFailure.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/ServerFailure.java
@@ -27,6 +27,7 @@
private final String stackTraceString;
private final String exceptionType;
private final boolean fatal;
+ private RequestContext requestContext;
/**
* Constructs a ServerFailure with null properties.
@@ -75,6 +76,13 @@
}
/**
+ * Returns the RequestContext that triggered the ServerFailure.
+ */
+ public RequestContext getRequestContext() {
+ return requestContext;
+ }
+
+ /**
* Return the failure stack trace.
*
* @return the stack trace as a String
@@ -92,4 +100,11 @@
public boolean isFatal() {
return fatal;
}
+
+ /**
+ * Sets the RequestContext to return via {@link #getRequestContext()}.
+ */
+ public void setRequestContext(RequestContext requestContext) {
+ this.requestContext = requestContext;
+ }
}
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequest.java b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequest.java
index 0a83bdc..ea36479 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequest.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequest.java
@@ -36,8 +36,7 @@
*
* @param <T> return type
*/
-public abstract class AbstractRequest<T> implements Request<T>,
- InstanceRequest<BaseProxy, T> {
+public abstract class AbstractRequest<T> implements Request<T>, InstanceRequest<BaseProxy, T> {
/**
* Used by generated subtypes.
@@ -67,6 +66,11 @@
return Collections.unmodifiableSet(propertyRefs);
}
+ @Override
+ public RequestContext getRequestContext() {
+ return requestContext;
+ }
+
public RequestData getRequestData() {
if (requestData == null) {
requestData = makeRequestData();
@@ -119,8 +123,9 @@
// The user may not have called to()
if (receiver != null) {
@SuppressWarnings("unchecked")
- T result = (T) EntityCodex.decode(requestContext,
- requestData.getReturnType(), requestData.getElementType(), split);
+ T result =
+ (T) EntityCodex.decode(requestContext, requestData.getReturnType(), requestData
+ .getElementType(), split);
receiver.onSuccess(result);
}
}
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
index 912c62b..c7bc3f0 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
@@ -661,6 +661,7 @@
*/
protected void fail(Receiver<Void> receiver, ServerFailure failure) {
reuse();
+ failure.setRequestContext(this);
Set<Throwable> causes = null;
for (AbstractRequest<?> request : new ArrayList<AbstractRequest<?>>(state.invocations)) {
try {
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequest.java b/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequest.java
new file mode 100644
index 0000000..dbc204c
--- /dev/null
+++ b/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2011 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.web.bindery.requestfactory.shared.testing;
+
+import com.google.web.bindery.requestfactory.shared.Receiver;
+import com.google.web.bindery.requestfactory.shared.Request;
+import com.google.web.bindery.requestfactory.shared.RequestContext;
+
+/**
+ * A no-op implementation of Request that can be used as a base type for writing
+ * unit tests.
+ *
+ * @param <T> The return type of objects in the corresponding response.
+ */
+public class FakeRequest<T> implements Request<T> {
+
+ /**
+ * No-op.
+ */
+ @Override
+ public void fire() {
+ }
+
+ /**
+ * No-op.
+ */
+ @Override
+ public void fire(Receiver<? super T> receiver) {
+ }
+
+ /**
+ * Returns {@code null}.
+ */
+ @Override
+ public RequestContext getRequestContext() {
+ return null;
+ }
+
+ /**
+ * Returns {@code null}.
+ */
+ @Override
+ public RequestContext to(Receiver<? super T> receiver) {
+ return null;
+ }
+
+ /**
+ * Returns {@code this}.
+ */
+ @Override
+ public Request<T> with(String... propertyRefs) {
+ return this;
+ }
+}
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestContext.java b/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestContext.java
index 5194fcb..4549951 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestContext.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestContext.java
@@ -21,6 +21,7 @@
import com.google.web.bindery.requestfactory.shared.Receiver;
import com.google.web.bindery.requestfactory.shared.Request;
import com.google.web.bindery.requestfactory.shared.RequestContext;
+import com.google.web.bindery.requestfactory.shared.RequestFactory;
/**
* A no-op implementation of RequestConext that can be used as a base type for
@@ -75,6 +76,14 @@
}
/**
+ * Returns {@code null}.
+ */
+ @Override
+ public RequestFactory getRequestFactory() {
+ return null;
+ }
+
+ /**
* Always returns {@code false}.
*/
@Override
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestFactory.java b/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestFactory.java
new file mode 100644
index 0000000..ddd07f5
--- /dev/null
+++ b/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestFactory.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2011 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.web.bindery.requestfactory.shared.testing;
+
+import com.google.web.bindery.event.shared.EventBus;
+import com.google.web.bindery.requestfactory.shared.EntityProxy;
+import com.google.web.bindery.requestfactory.shared.EntityProxyId;
+import com.google.web.bindery.requestfactory.shared.ProxySerializer;
+import com.google.web.bindery.requestfactory.shared.ProxyStore;
+import com.google.web.bindery.requestfactory.shared.Request;
+import com.google.web.bindery.requestfactory.shared.RequestFactory;
+import com.google.web.bindery.requestfactory.shared.RequestTransport;
+
+/**
+ * A no-op implementation of {@link RequestFactory} that can be used for
+ * building mocks.
+ */
+public class FakeRequestFactory implements RequestFactory {
+
+ private EventBus eventBus;
+ private RequestTransport requestTransport;
+
+ /**
+ * Returns {@code null}.
+ */
+ @Override
+ public <P extends EntityProxy> Request<P> find(EntityProxyId<P> proxyId) {
+ return null;
+ }
+
+ /**
+ * Returns the last value passed to
+ * {@link #initialize(EventBus, RequestTransport)}.
+ */
+ @Override
+ public EventBus getEventBus() {
+ return eventBus;
+ }
+
+ /**
+ * Returns {@code null}.
+ */
+ @Override
+ public String getHistoryToken(Class<? extends EntityProxy> clazz) {
+ return null;
+ }
+
+ /**
+ * Returns {@code null}.
+ */
+ @Override
+ public String getHistoryToken(EntityProxyId<?> proxy) {
+ return null;
+ }
+
+ /**
+ * Returns {@code null}.
+ */
+ @Override
+ public Class<? extends EntityProxy> getProxyClass(String historyToken) {
+ return null;
+ }
+
+ /**
+ * Returns {@code null}.
+ */
+ @Override
+ public <T extends EntityProxy> EntityProxyId<T> getProxyId(String historyToken) {
+ return null;
+ }
+
+ /**
+ * Returns the last value passed to
+ * {@link #initialize(EventBus, RequestTransport)}.
+ */
+ @Override
+ public RequestTransport getRequestTransport() {
+ return requestTransport;
+ }
+
+ /**
+ * Returns {@code null}.
+ */
+ @Override
+ public ProxySerializer getSerializer(ProxyStore store) {
+ return null;
+ }
+
+ /**
+ * Equivalent to {@code initialize(eventBus, new FakeRequestTransport())}.
+ */
+ @Override
+ public void initialize(EventBus eventBus) {
+ initialize(eventBus, new FakeRequestTransport());
+ }
+
+ /**
+ * Saves the parameters for later retrieval.
+ */
+ @Override
+ public void initialize(EventBus eventBus, RequestTransport transport) {
+ this.eventBus = eventBus;
+ this.requestTransport = transport;
+ }
+}
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestTransport.java b/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestTransport.java
new file mode 100644
index 0000000..bb40eb6
--- /dev/null
+++ b/user/src/com/google/web/bindery/requestfactory/shared/testing/FakeRequestTransport.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2011 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.web.bindery.requestfactory.shared.testing;
+
+import com.google.web.bindery.requestfactory.shared.RequestTransport;
+
+/**
+ * A no-op implementation of {@link RequestTransport} that can be used for unit
+ * testing.
+ */
+public class FakeRequestTransport implements RequestTransport {
+ /**
+ * No-op.
+ */
+ @Override
+ public void send(String payload, TransportReceiver receiver) {
+ }
+}
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
index 00cc001..df32514 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
@@ -74,6 +74,7 @@
@Override
public void onFailure(ServerFailure error) {
+ assertSame(persistRequest.getRequestContext(), error.getRequestContext());
assertEquals(expectedException, error.getExceptionType());
if (expectedException != null) {
assertFalse(error.getStackTraceString().length() == 0);