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 {
>>
>>
>>
>