This patch appears to have confused Guice. Starting Shindig with mvn
-Prun and attempting to run the sample gadget gives this stack trace:
2008-10-02 10:17:28.374::WARN: /social/rest/samplecontainer/setstate
java.lang.RuntimeException: com.google.inject.ConfigurationException:
Tried proxying org.apache.shindig.social.opensocial.service.HandlerProvider
to support a circular dependency, but it is not an interface.
at
com.google.inject.InjectorImpl$SingleMethodInjector.inject(InjectorImpl.java:578)
at com.google.inject.InjectorImpl.injectMembers(InjectorImpl.java:674)
at com.google.inject.InjectorImpl$8.call(InjectorImpl.java:682)
at com.google.inject.InjectorImpl$8.call(InjectorImpl.java:681)
at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:747)
at com.google.inject.InjectorImpl.injectMembers(InjectorImpl.java:680)
at
org.apache.shindig.common.servlet.InjectedServlet.init(InjectedServlet.java:46)
at
org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:433)
at
org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:342)
at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:463)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
at
org.apache.shindig.auth.AuthenticationServletFilter.doFilter(AuthenticationServletFilter.java:66)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at
org.apache.shindig.auth.AuthenticationServletFilter.doFilter(AuthenticationServletFilter.java:66)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
at
org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:842)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at
org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)
Caused by: com.google.inject.ConfigurationException: Tried proxying
org.apache.shindig.social.opensocial.service.HandlerProvider to
support a circular dependency, but it is not an interface.
at
com.google.inject.ConstructionContext.createProxy(ConstructionContext.java:70)
at
com.google.inject.ConstructorInjector.construct(ConstructorInjector.java:126)
at
com.google.inject.InjectorImpl$ImplicitBinding.get(InjectorImpl.java:1006)
at
com.google.inject.BoundProviderFactory.get(BoundProviderFactory.java:60)
at
com.google.inject.InjectorImpl$SingleParameterInjector.inject(InjectorImpl.java:640)
at com.google.inject.InjectorImpl.getParameters(InjectorImpl.java:666)
at
com.google.inject.ConstructorInjector.construct(ConstructorInjector.java:140)
at
com.google.inject.InjectorImpl$ImplicitBinding.get(InjectorImpl.java:1006)
at
com.google.inject.BoundProviderFactory.get(BoundProviderFactory.java:60)
at
com.google.inject.InjectorImpl$SingleParameterInjector.inject(InjectorImpl.java:640)
at com.google.inject.InjectorImpl.getParameters(InjectorImpl.java:666)
at
com.google.inject.InjectorImpl$SingleMethodInjector.inject(InjectorImpl.java:575)
... 30 more
On Thu, Oct 2, 2008 at 4:38 AM, <[EMAIL PROTECTED]> wrote:
> Author: ieb
> Date: Thu Oct 2 04:38:38 2008
> New Revision: 701087
>
> URL: http://svn.apache.org/viewvc?rev=701087&view=rev
> Log:
> SHINDIG-638
> Patch from Adam Winer
>
> HandlerProvider gives Class<? extends DataRequestHandlers>, then ApiServlet
> uses Injector.getInstance().
>
> It'd be cleaner if HandlerProvider gave Provider<? extends
> DataRequestHandler>, so ApiServlet didn't need to use the Injector at all.
>
> Thanks
>
> Removed:
>
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/service/SampleContainerHandlerProvider.java
> Modified:
>
> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java
>
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java
>
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/ApiServlet.java
>
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/HandlerProvider.java
>
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
>
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
>
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java
>
> Modified:
> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java?rev=701087&r1=701086&r2=701087&view=diff
> ==============================================================================
> ---
> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java
> (original)
> +++
> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndModule.java
> Thu Oct 2 04:38:38 2008
> @@ -59,7 +59,5 @@
>
> bind(new TypeLiteral<List<AuthenticationHandler>>(){}).toProvider(
> AuthenticationHandlerProvider.class);
> -
> -
> bind(HandlerProvider.class).toInstance(HandlerProvider.defaultProviders());
> }
> }
>
> Modified:
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java?rev=701087&r1=701086&r2=701087&view=diff
> ==============================================================================
> ---
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java
> (original)
> +++
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java
> Thu Oct 2 04:38:38 2008
> @@ -28,9 +28,11 @@
> import org.apache.shindig.social.opensocial.service.BeanConverter;
> import
> org.apache.shindig.social.opensocial.service.DataServiceServletFetcher;
> import org.apache.shindig.social.opensocial.service.HandlerProvider;
> -import
> org.apache.shindig.social.sample.service.SampleContainerHandlerProvider;
> +import org.apache.shindig.social.sample.service.SampleContainerHandler;
>
> import com.google.inject.AbstractModule;
> +import com.google.inject.Inject;
> +import com.google.inject.Provider;
> import com.google.inject.TypeLiteral;
> import com.google.inject.name.Names;
>
> @@ -47,7 +49,7 @@
> /** [EMAIL PROTECTED] */
> @Override
> protected void configure() {
> - bind(HandlerProvider.class).to(SampleContainerHandlerProvider.class);
> + bind(HandlerProvider.class).toProvider(HandlerProviderProvider.class);
>
>
> bind(ParameterFetcher.class).annotatedWith(Names.named("DataServiceServlet"))
> .to(DataServiceServletFetcher.class);
> @@ -69,4 +71,25 @@
> bind(new TypeLiteral<List<AuthenticationHandler>>(){}).toProvider(
> AuthenticationHandlerProvider.class);
> }
> +
> + /**
> + * Provider for the HandlerProvider. Adds the sample container handler
> + * at "samplecontainer".
> + */
> + static class HandlerProviderProvider implements Provider<HandlerProvider> {
> + private final HandlerProvider handlerProvider;
> + private final Provider<SampleContainerHandler> sampleHandler;
> +
> + @Inject
> + public HandlerProviderProvider(HandlerProvider handlerProvider,
> + Provider<SampleContainerHandler> sampleHandler) {
> + this.handlerProvider = handlerProvider;
> + this.sampleHandler = sampleHandler;
> + }
> +
> + public HandlerProvider get() {
> + handlerProvider.addHandler("samplecontainer", sampleHandler);
> + return handlerProvider;
> + }
> + }
> }
>
> Modified:
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/ApiServlet.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/ApiServlet.java?rev=701087&r1=701086&r2=701087&view=diff
> ==============================================================================
> ---
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/ApiServlet.java
> (original)
> +++
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/ApiServlet.java
> Thu Oct 2 04:38:38 2008
> @@ -26,7 +26,7 @@
> import org.apache.shindig.social.opensocial.spi.SocialSpiException;
>
> import com.google.inject.Inject;
> -import com.google.inject.Injector;
> +import com.google.inject.Provider;
> import com.google.inject.name.Named;
>
> import java.io.IOException;
> @@ -43,7 +43,7 @@
> public abstract class ApiServlet extends InjectedServlet {
> protected static final String DEFAULT_ENCODING = "UTF-8";
>
> - private Map<String, Class<? extends DataRequestHandler>> handlers;
> + private Map<String, Provider<? extends DataRequestHandler>> handlers;
> protected BeanJsonConverter jsonConverter;
> protected BeanConverter xmlConverter;
> protected BeanConverter atomConverter;
> @@ -64,11 +64,6 @@
> this.atomConverter = atomConverter;
> }
>
> - // Only for testing use. Do not override the injector.
> - public void setInjector(Injector injector) {
> - this.injector = injector;
> - }
> -
> protected SecurityToken getSecurityToken(HttpServletRequest servletRequest)
> {
> return new AuthInfo(servletRequest).getSecurityToken();
> }
> @@ -85,15 +80,16 @@
> /**
> * Delivers a request item to the appropriate DataRequestHandler.
> */
> - protected Future<?> handleRequestItem(RequestItem requestItem,
> HttpServletRequest servletRequest) {
> - Class<? extends DataRequestHandler> handlerClass =
> handlers.get(requestItem.getService());
> + protected Future<?> handleRequestItem(RequestItem requestItem,
> + HttpServletRequest servletRequest) {
> + Provider<? extends DataRequestHandler> handlerProvider =
> handlers.get(requestItem.getService());
>
> - if (handlerClass == null) {
> + if (handlerProvider == null) {
> return ImmediateFuture.errorInstance(new
> SocialSpiException(ResponseError.NOT_IMPLEMENTED,
> "The service " + requestItem.getService() + " is not implemented"));
> }
>
> - DataRequestHandler handler = injector.getInstance(handlerClass);
> + DataRequestHandler handler = handlerProvider.get();
> return handler.handleItem(requestItem);
> }
>
>
> Modified:
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/HandlerProvider.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/HandlerProvider.java?rev=701087&r1=701086&r2=701087&view=diff
> ==============================================================================
> ---
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/HandlerProvider.java
> (original)
> +++
> incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/HandlerProvider.java
> Thu Oct 2 04:38:38 2008
> @@ -18,9 +18,11 @@
>
> package org.apache.shindig.social.opensocial.service;
>
> +import com.google.inject.Inject;
> import com.google.inject.Provider;
> import com.google.common.collect.Maps;
>
> +import java.util.Collections;
> import java.util.Map;
>
> /**
> @@ -33,34 +35,31 @@
> * Provider<Map<String, Class<? extends DataRequestHandler>>> along
> * with a default set of handlers.
> */
> -public class HandlerProvider implements Provider<Map<String,
> - Class<? extends DataRequestHandler>>> {
> -
> - private Map<String, Class<? extends DataRequestHandler>> handlers;
> -
> - private static Map<String, Class<? extends DataRequestHandler>>
> DEFAULT_HANDLERS =
> - Maps.immutableMap(
> - DataServiceServlet.PEOPLE_ROUTE, PersonHandler.class,
> - DataServiceServlet.ACTIVITY_ROUTE, ActivityHandler.class,
> - DataServiceServlet.APPDATA_ROUTE, AppDataHandler.class);
> -
> - protected HandlerProvider(boolean useDefaultProviders) {
> - handlers = Maps.newHashMap(useDefaultProviders ? DEFAULT_HANDLERS :
> null);
> - }
> -
> - public void addHandler(String path, Class<? extends DataRequestHandler>
> handler) {
> - handlers.put(path, handler);
> +public class HandlerProvider implements Provider<Map<String, Provider<?
> extends DataRequestHandler>>> {
> + private final Map<String, Provider<? extends DataRequestHandler>> handlers;
> +
> + /**
> + * Constructor for the default handlers.
> + */
> + @Inject
> + public HandlerProvider(Provider<PersonHandler> personHandlerProvider,
> + Provider<ActivityHandler> activityHandlerProvider,
> + Provider<AppDataHandler> appDataHandlerProvider) {
> + this(Maps.immutableMap(
> + DataServiceServlet.PEOPLE_ROUTE, personHandlerProvider,
> + DataServiceServlet.ACTIVITY_ROUTE, activityHandlerProvider,
> + DataServiceServlet.APPDATA_ROUTE, appDataHandlerProvider));
> }
> -
> - public HandlerProvider(Map<String,Class<? extends DataRequestHandler>>
> handlers) {
> +
> + public HandlerProvider(Map<String,Provider<? extends DataRequestHandler>>
> handlers) {
> this.handlers = Maps.newHashMap(handlers);
> }
> -
> - public Map<String, Class<? extends DataRequestHandler>> get() {
> - return handlers;
> +
> + public void addHandler(String path, Provider<? extends DataRequestHandler>
> handler) {
> + handlers.put(path, handler);
> }
>
> - public static HandlerProvider defaultProviders() {
> - return new HandlerProvider(DEFAULT_HANDLERS);
> + public Map<String, Provider<? extends DataRequestHandler>> get() {
> + return Collections.unmodifiableMap(handlers);
> }
> }
>
> Modified:
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java?rev=701087&r1=701086&r2=701087&view=diff
> ==============================================================================
> ---
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
> (original)
> +++
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
> Thu Oct 2 04:38:38 2008
> @@ -31,6 +31,8 @@
>
> import com.google.common.collect.Maps;
> import com.google.inject.Guice;
> +import com.google.inject.Injector;
> +
> import junit.framework.TestCase;
> import org.easymock.classextension.EasyMock;
> import org.json.JSONObject;
> @@ -63,13 +65,12 @@
>
> @Override
> protected void setUp() throws Exception {
> - Map<String, Class<? extends DataRequestHandler>> handlers =
> Maps.newHashMap();
> + Injector injector = Guice.createInjector(new
> SocialApiTestsGuiceModule());
>
> servlet = new DataServiceServlet();
> - servlet.setHandlers(HandlerProvider.defaultProviders());
> - servlet.setInjector(Guice.createInjector(new
> SocialApiTestsGuiceModule()));
> - servlet.setBeanConverters(new BeanJsonConverter(
> - Guice.createInjector(new SocialApiTestsGuiceModule())), new
> BeanXmlConverter(),
> +
> + servlet.setHandlers(injector.getInstance(HandlerProvider.class));
> + servlet.setBeanConverters(new BeanJsonConverter(injector), new
> BeanXmlConverter(),
> new BeanAtomConverter());
>
> req = EasyMock.createMock(HttpServletRequest.class);
>
> Modified:
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java?rev=701087&r1=701086&r2=701087&view=diff
> ==============================================================================
> ---
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
> (original)
> +++
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
> Thu Oct 2 04:38:38 2008
> @@ -29,7 +29,8 @@
>
> import com.google.common.collect.Maps;
> import com.google.inject.Guice;
> -import com.google.inject.Injector;
> +import com.google.inject.Provider;
> +
> import junit.framework.TestCase;
> import org.easymock.classextension.EasyMock;
>
> @@ -52,7 +53,6 @@
> private PersonHandler peopleHandler;
> private ActivityHandler activityHandler;
> private AppDataHandler appDataHandler;
> - private Injector injector;
> private BeanJsonConverter jsonConverter;
>
> private final ServletInputStream dummyPostData = new ServletInputStream() {
> @@ -72,18 +72,19 @@
> activityHandler = EasyMock.createMock(ActivityHandler.class);
> appDataHandler = EasyMock.createMock(AppDataHandler.class);
>
> - injector = EasyMock.createMock(Injector.class);
> - servlet.setInjector(injector);
> -
> - servlet.setHandlers(HandlerProvider.defaultProviders());
> + servlet.setHandlers(new HandlerProvider(constant(peopleHandler),
> + constant(activityHandler), constant(appDataHandler)));
>
> servlet.setBeanConverters(jsonConverter, xmlConverter, atomConverter);
> }
>
> - private void setupInjector() {
> -
> EasyMock.expect(injector.getInstance(PersonHandler.class)).andStubReturn(peopleHandler);
> -
> EasyMock.expect(injector.getInstance(ActivityHandler.class)).andStubReturn(activityHandler);
> -
> EasyMock.expect(injector.getInstance(AppDataHandler.class)).andStubReturn(appDataHandler);
> + // TODO: replace with Providers.of() when Guice version is upgraded
> + private static <T> Provider<T> constant(final T value) {
> + return new Provider<T>() {
> + public T get() {
> + return value;
> + }
> + };
> }
>
> public void testPeopleUriRecognition() throws Exception {
> @@ -118,8 +119,6 @@
> public void testFailedRequest() throws Exception {
> String route = '/' + DataServiceServlet.APPDATA_ROUTE;
> setupRequest(route, "GET", null);
> -
> EasyMock.expect(injector.getInstance(AppDataHandler.class)).andStubReturn(appDataHandler);
> - setupInjector();
>
>
> EasyMock.expect(appDataHandler.handleItem(EasyMock.isA(RestfulRequestItem.class)));
> EasyMock.expectLastCall().andReturn(
> @@ -128,10 +127,10 @@
> res.sendError(500, "FAILED");
> res.setCharacterEncoding("UTF-8");
>
> - EasyMock.replay(req, res, appDataHandler, injector, jsonConverter);
> + EasyMock.replay(req, res, appDataHandler, jsonConverter);
> servlet.service(req, res);
> - EasyMock.verify(req, res, appDataHandler, injector, jsonConverter);
> - EasyMock.reset(req, res, appDataHandler, injector, jsonConverter);
> + EasyMock.verify(req, res, appDataHandler, jsonConverter);
> + EasyMock.reset(req, res, appDataHandler, jsonConverter);
> }
>
> private void verifyHandlerWasFoundForPathInfo(String peoplePathInfo,
> DataRequestHandler handler)
> @@ -143,7 +142,6 @@
> private void verifyHandlerWasFoundForPathInfo(String pathInfo,
> DataRequestHandler handler,
> String actualMethod, String overrideMethod, String expectedMethod)
> throws Exception {
> setupRequest(pathInfo, actualMethod, overrideMethod);
> - setupInjector();
>
> String jsonObject = "my lovely json";
>
> @@ -158,10 +156,10 @@
> writerMock.write(jsonObject);
> res.setCharacterEncoding("UTF-8");
>
> - EasyMock.replay(req, res, handler, injector, jsonConverter);
> + EasyMock.replay(req, res, handler, jsonConverter);
> servlet.service(req, res);
> - EasyMock.verify(req, res, handler, injector, jsonConverter);
> - EasyMock.reset(req, res, handler, injector, jsonConverter);
> + EasyMock.verify(req, res, handler, jsonConverter);
> + EasyMock.reset(req, res, handler, jsonConverter);
> }
>
> private void setupRequest(String pathInfo, String actualMethod, String
> overrideMethod)
>
> Modified:
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java?rev=701087&r1=701086&r2=701087&view=diff
> ==============================================================================
> ---
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java
> (original)
> +++
> incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java
> Thu Oct 2 04:38:38 2008
> @@ -24,7 +24,8 @@
> import org.apache.shindig.social.core.util.BeanXmlConverter;
>
> import com.google.common.collect.Maps;
> -import com.google.inject.Injector;
> +import com.google.inject.Provider;
> +
> import junit.framework.TestCase;
> import org.easymock.classextension.EasyMock;
> import org.json.JSONArray;
> @@ -55,8 +56,6 @@
> private ActivityHandler activityHandler;
> private AppDataHandler appDataHandler;
>
> - private Injector injector;
> -
> private BeanJsonConverter jsonConverter;
> private BeanXmlConverter xmlConverter;
>
> @@ -72,18 +71,19 @@
> activityHandler = EasyMock.createMock(ActivityHandler.class);
> appDataHandler = EasyMock.createMock(AppDataHandler.class);
>
> - injector = EasyMock.createMock(Injector.class);
> - servlet.setInjector(injector);
> -
> - servlet.setHandlers(HandlerProvider.defaultProviders());
> + servlet.setHandlers(new HandlerProvider(constant(peopleHandler),
> constant(activityHandler),
> + constant(appDataHandler)));
>
> servlet.setBeanConverters(jsonConverter, xmlConverter, atomConverter);
> }
>
> - private void setupInjector() {
> -
> EasyMock.expect(injector.getInstance(PersonHandler.class)).andStubReturn(peopleHandler);
> -
> EasyMock.expect(injector.getInstance(ActivityHandler.class)).andStubReturn(activityHandler);
> -
> EasyMock.expect(injector.getInstance(AppDataHandler.class)).andStubReturn(appDataHandler);
> + // TODO: replace with Providers.of() when Guice version is upgraded
> + private static <T> Provider<T> constant(final T value) {
> + return new Provider<T>() {
> + public T get() {
> + return value;
> + }
> + };
> }
>
> public void testPeopleMethodRecognition() throws Exception {
> @@ -104,7 +104,6 @@
> public void testInvalidService() throws Exception {
> String json = "{method:junk.get,id:id,params:{userId:5,groupId:@self}}";
> setupRequest(json);
> - setupInjector();
>
> JSONObject err = new JSONObject(
> "{id:id,error:{message:'notImplemented: The service junk is not
> implemented',code:501}}");
> @@ -114,10 +113,10 @@
> writerMock.write(EasyMock.eq(err.toString()));
> EasyMock.expectLastCall();
>
> - EasyMock.replay(req, res, injector, jsonConverter, writerMock);
> + EasyMock.replay(req, res, jsonConverter, writerMock);
> servlet.service(req, res);
> - EasyMock.verify(req, res, injector, jsonConverter, writerMock);
> - EasyMock.reset(req, res, injector, jsonConverter);
> + EasyMock.verify(req, res, jsonConverter, writerMock);
> + EasyMock.reset(req, res, jsonConverter);
> }
>
>
> @@ -127,9 +126,6 @@
> */
> public void testFailedRequest() throws Exception {
> setupRequest("{id:id,method:appdata.get}");
> -
> EasyMock.expect(injector.getInstance(AppDataHandler.class)).andStubReturn(appDataHandler);
> - setupInjector();
> -
>
> EasyMock.expect(appDataHandler.handleItem(EasyMock.isA(RpcRequestItem.class)));
> EasyMock.expectLastCall().andReturn(
> ImmediateFuture.errorInstance(new RuntimeException("FAILED")));
> @@ -142,16 +138,15 @@
> writerMock.write(EasyMock.eq(err.toString()));
> EasyMock.expectLastCall();
>
> - EasyMock.replay(req, res, appDataHandler, injector, jsonConverter,
> writerMock);
> + EasyMock.replay(req, res, appDataHandler, jsonConverter, writerMock);
> servlet.service(req, res);
> - EasyMock.verify(req, res, appDataHandler, injector, jsonConverter,
> writerMock);
> - EasyMock.reset(req, res, appDataHandler, injector, jsonConverter);
> + EasyMock.verify(req, res, appDataHandler, jsonConverter, writerMock);
> + EasyMock.reset(req, res, appDataHandler, jsonConverter);
> }
>
> private void verifyHandlerWasFoundForMethod(String json, DataRequestHandler
> handler)
> throws Exception {
> setupRequest(json);
> - setupInjector();
>
> String resultObject = "my lovely json";
>
> @@ -169,17 +164,16 @@
> writerMock.write(EasyMock.eq(result.toString()));
> EasyMock.expectLastCall();
>
> - EasyMock.replay(req, res, handler, injector, jsonConverter, writerMock);
> + EasyMock.replay(req, res, handler, jsonConverter, writerMock);
> servlet.service(req, res);
> - EasyMock.verify(req, res, handler, injector, jsonConverter, writerMock);
> - EasyMock.reset(req, res, handler, injector, jsonConverter);
> + EasyMock.verify(req, res, handler, jsonConverter, writerMock);
> + EasyMock.reset(req, res, handler, jsonConverter);
> }
>
> public void testBasicBatch() throws Exception {
> String batchJson =
> "[{method:people.get,id:'1'},{method:activities.get,id:'2'}]";
> setupRequest(batchJson);
> - setupInjector();
>
> String resultObject = "my lovely json";
> Future<?> responseItemFuture = ImmediateFuture.newInstance(resultObject);
> @@ -197,10 +191,10 @@
> writerMock.write(EasyMock.eq(result.toString()));
> EasyMock.expectLastCall();
>
> - EasyMock.replay(req, res, peopleHandler, activityHandler, injector,
> jsonConverter, writerMock);
> + EasyMock.replay(req, res, peopleHandler, activityHandler, jsonConverter,
> writerMock);
> servlet.service(req, res);
> - EasyMock.verify(req, res, peopleHandler, activityHandler, injector,
> jsonConverter, writerMock);
> - EasyMock.reset(req, res, peopleHandler, activityHandler, injector,
> jsonConverter);
> + EasyMock.verify(req, res, peopleHandler, activityHandler, jsonConverter,
> writerMock);
> + EasyMock.reset(req, res, peopleHandler, activityHandler, jsonConverter);
> }
>
> public void testGetExecution() throws Exception {
> @@ -210,7 +204,6 @@
>
> EasyMock.expect(req.getAttribute(EasyMock.isA(String.class))).andReturn(FAKE_GADGET_TOKEN);
> EasyMock.expect(req.getCharacterEncoding()).andStubReturn("UTF-8");
> res.setCharacterEncoding("UTF-8");
> - setupInjector();
>
> String resultObject = "my lovely json";
>
> @@ -227,10 +220,10 @@
> writerMock.write(EasyMock.eq(result.toString()));
> EasyMock.expectLastCall();
>
> - EasyMock.replay(req, res, peopleHandler, activityHandler, injector,
> jsonConverter, writerMock);
> + EasyMock.replay(req, res, peopleHandler, activityHandler, jsonConverter,
> writerMock);
> servlet.service(req, res);
> - EasyMock.verify(req, res, peopleHandler, activityHandler, injector,
> jsonConverter, writerMock);
> - EasyMock.reset(req, res, peopleHandler, activityHandler, injector,
> jsonConverter);
> + EasyMock.verify(req, res, peopleHandler, activityHandler, jsonConverter,
> writerMock);
> + EasyMock.reset(req, res, peopleHandler, activityHandler, jsonConverter);
> }
>
> private void setupRequest(String json) throws IOException {
>
>
>