You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by Brian Eaton <be...@google.com> on 2008/10/02 20:07:23 UTC

Re: svn commit: r701087 - in /incubator/shindig/trunk/java: server/src/test/java/org/apache/shindig/server/endtoend/ social-api/src/main/java/org/apache/shindig/social/core/config/ social-api/src/main/java/org/apache/shindig/social/opensocial/service

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,  <ie...@apache.org> 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 @@
>   /** {@inheritDoc} */
>   @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 {
>
>
>

Re: svn commit: r701087 - in /incubator/shindig/trunk/java: server/src/test/java/org/apache/shindig/server/endtoend/ social-api/src/main/java/org/apache/shindig/social/core/config/ social-api/src/main/java/org/apache/shindig/social/opensocial/service

Posted by Ian Boston <ie...@tfd.co.uk>.
you may see a conflict on the next update, also applied to trunk and  
comitted
however should be identical.
Ian

On 2 Oct 2008, at 20:30, Brian Eaton wrote:

> Applied, thanks.
>
> On Thu, Oct 2, 2008 at 12:10 PM, Adam Winer <aw...@google.com> wrote:
>> I've attached a patch that fixes this to
>> http://issues.apache.org/jira/browse/SHINDIG-638.
>>
>> On Thu, Oct 2, 2008 at 11:58 AM, Adam Winer <aw...@google.com>  
>> wrote:
>>> Repro'd the problem, looking at it now.
>>>
>>> On Thu, Oct 2, 2008 at 11:07 AM, Brian Eaton <be...@google.com>  
>>> wrote:
>>>> 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,  <ie...@apache.org> 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.DataServiceServletFet 
>>>>> cher;
>>>>>  import  
>>>>> org.apache.shindig.social.opensocial.service.HandlerProvider;
>>>>> -import  
>>>>> org.apache.shindig.social.sample.service.SampleContainerHandlerPro 
>>>>> vider;
>>>>> +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 @@
>>>>>   /** {@inheritDoc} */
>>>>>   @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 {
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>


Re: svn commit: r701087 - in /incubator/shindig/trunk/java: server/src/test/java/org/apache/shindig/server/endtoend/ social-api/src/main/java/org/apache/shindig/social/core/config/ social-api/src/main/java/org/apache/shindig/social/opensocial/service

Posted by Brian Eaton <be...@google.com>.
Applied, thanks.

On Thu, Oct 2, 2008 at 12:10 PM, Adam Winer <aw...@google.com> wrote:
> I've attached a patch that fixes this to
> http://issues.apache.org/jira/browse/SHINDIG-638.
>
> On Thu, Oct 2, 2008 at 11:58 AM, Adam Winer <aw...@google.com> wrote:
>> Repro'd the problem, looking at it now.
>>
>> On Thu, Oct 2, 2008 at 11:07 AM, Brian Eaton <be...@google.com> wrote:
>>> 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,  <ie...@apache.org> 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 @@
>>>>   /** {@inheritDoc} */
>>>>   @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 {
>>>>
>>>>
>>>>
>>>
>>
>

Re: svn commit: r701087 - in /incubator/shindig/trunk/java: server/src/test/java/org/apache/shindig/server/endtoend/ social-api/src/main/java/org/apache/shindig/social/core/config/ social-api/src/main/java/org/apache/shindig/social/opensocial/service

Posted by Adam Winer <aw...@google.com>.
I've attached a patch that fixes this to
http://issues.apache.org/jira/browse/SHINDIG-638.

On Thu, Oct 2, 2008 at 11:58 AM, Adam Winer <aw...@google.com> wrote:
> Repro'd the problem, looking at it now.
>
> On Thu, Oct 2, 2008 at 11:07 AM, Brian Eaton <be...@google.com> wrote:
>> 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,  <ie...@apache.org> 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 @@
>>>   /** {@inheritDoc} */
>>>   @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 {
>>>
>>>
>>>
>>
>

Re: svn commit: r701087 - in /incubator/shindig/trunk/java: server/src/test/java/org/apache/shindig/server/endtoend/ social-api/src/main/java/org/apache/shindig/social/core/config/ social-api/src/main/java/org/apache/shindig/social/opensocial/service

Posted by Adam Winer <aw...@google.com>.
Repro'd the problem, looking at it now.

On Thu, Oct 2, 2008 at 11:07 AM, Brian Eaton <be...@google.com> wrote:
> 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,  <ie...@apache.org> 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 @@
>>   /** {@inheritDoc} */
>>   @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 {
>>
>>
>>
>