You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by li...@apache.org on 2010/05/13 01:39:52 UTC

svn commit: r943752 - in /shindig/trunk: ./ config/ java/gadgets/src/main/java/org/apache/shindig/gadgets/ java/server/src/main/webapp/WEB-INF/ java/server/src/test/java/org/apache/shindig/server/ java/server/src/test/java/org/apache/shindig/server/end...

Author: lindner
Date: Wed May 12 23:39:51 2010
New Revision: 943752

URL: http://svn.apache.org/viewvc?rev=943752&view=rev
Log:
Refactor the way we configure REST/RPC handlers by using Guice multibindings

This allows for easier extension by multiple guice modules.  Thus it
now becomes possible to write shindig plugins (for the most part...)

Also remove JettyLauncher (we have mvn jetty:run now..)

Removed:
    shindig/trunk/java/server/src/test/java/org/apache/shindig/server/JettyLauncher.java
Modified:
    shindig/trunk/UPGRADING
    shindig/trunk/config/container.js
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
    shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml
    shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java
    shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/SampleModule.java
    shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
    shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java

Modified: shindig/trunk/UPGRADING
URL: http://svn.apache.org/viewvc/shindig/trunk/UPGRADING?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/UPGRADING (original)
+++ shindig/trunk/UPGRADING Wed May 12 23:39:51 2010
@@ -4,12 +4,25 @@ FROM 1.0.x TO 1.1.x
 Almost all interfaces have been updated from 1.0.x -> 1.1.x.  The 
 following information is not complete.
 
+
+
 == container.js config changes ==
 
-* gadgets.parentOrigins: Default ["*"]
+* gadgets.parentOrigins: Default ["*"] (NEW)
 
 An array of valid origin domains for the container.
 
+* Endpoint Changes for rpc
+
+The default RPC endpoints used for json-rpc were moved from /gadgets/api/rpc and /social/rpc to just /rpc
+
+
+== Java Dependency Changes ==
+
+Too many to mention.  Check the top-level pom.xml for all the new versions
+
+* servlet-api is upgraded to 2.5
+
 == Java Interface Changes ==
 
 * AbstractContainerConfig
@@ -44,6 +57,14 @@ Tag handler.
 
   Multibinder.newSetBinder(binder(), TagHandler.class).addBinding().to(MyCustomTagHandler.class);
 
+* SocialApiGuiceModule, DefaultGuiceModule
+
+Configuring a new Rest/RPC handler now uses Multibindings.  Adding a new binding
+is easy, just use the following syntax:
+
+    Multibinder.newSetBinder(binder(), Object.class, Names.named("org.apache.shindig.handlers"))
+        .addBinding().toInstance(MyHandler.class);
+
 == PHP Changes ==
 
 TBD

Modified: shindig/trunk/config/container.js
URL: http://svn.apache.org/viewvc/shindig/trunk/config/container.js?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/config/container.js (original)
+++ shindig/trunk/config/container.js Wed May 12 23:39:51 2010
@@ -84,7 +84,7 @@
 // Config param to load Opensocial data for social
 // preloads in data pipelining.  %host% will be
 // substituted with the current host.
-"gadgets.osDataUri" : "http://%host%/social/rpc",
+"gadgets.osDataUri" : "http://%host%/rpc",
 
 // Uncomment these to switch to a secure version
 //
@@ -148,7 +148,7 @@
     // Must be on the same domain as the gadget rendering server
     "path" : "http://%host%/social/rpc",
     // Path to issue invalidate calls
-    "invalidatePath" : "http://%host%/gadgets/api/rpc",
+    "invalidatePath" : "http://%host%/rpc",
     "domain" : "shindig",
     "enableCaja" : false,
     "supportedFields" : {
@@ -168,7 +168,7 @@
   },
   "osapi" : {
     // The endpoints to query for available JSONRPC/REST services
-    "endPoints" : [ "http://%host%/social/rpc", "http://%host%/gadgets/api/rpc" ]                   
+    "endPoints" : [ "http://%host%/rpc" ]                   
   },
   "osml": {
     // OSML library resource.  Can be set to null or the empty string to disable OSML

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java Wed May 12 23:39:51 2010
@@ -23,7 +23,9 @@ import com.google.common.collect.Immutab
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Named;
+import com.google.inject.name.Names;
 
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.InvalidationHandler;
@@ -73,16 +75,15 @@ public class DefaultGuiceModule extends 
 
     // We perform static injection on HttpResponse for cache TTLs.
     requestStaticInjection(HttpResponse.class);
-  }
-
 
-  @Provides
-  @Singleton
-  @Named("org.apache.shindig.gadgets.handlers")
-  protected Set<Object> provideGadgetHandlers() {
-    return ImmutableSet.<Object>of(InvalidationHandler.class, HttpRequestHandler.class);
+    registerGadgetHandlers();
   }
 
+  protected void registerGadgetHandlers() {
+    Multibinder<Object> handlerBinder = Multibinder.newSetBinder(binder(), Object.class, Names.named("org.apache.shindig.handlers"));
+    handlerBinder.addBinding().to(InvalidationHandler.class);
+    handlerBinder.addBinding().to(HttpRequestHandler.class);
+  }
 
   public static final ThreadFactory DAEMON_THREAD_FACTORY =
     new ThreadFactory() {

Modified: shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml (original)
+++ shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml Wed May 12 23:39:51 2010
@@ -31,6 +31,7 @@
     <param-value>
       org.apache.shindig.common.PropertiesModule:
       org.apache.shindig.gadgets.DefaultGuiceModule:
+      org.apache.shindig.social.core.config.SocialApiGuiceModule:
       org.apache.shindig.social.sample.SampleModule:
       org.apache.shindig.gadgets.oauth.OAuthModule:
       org.apache.shindig.common.cache.ehcache.EhCacheModule:
@@ -91,6 +92,8 @@
     <url-pattern>/gadgets/makeRequest</url-pattern>
     <url-pattern>/gadgets/api/rpc/*</url-pattern>
     <url-pattern>/gadgets/api/rest/*</url-pattern>
+    <url-pattern>/rpc/*</url-pattern>
+    <url-pattern>/rest/*</url-pattern>
   </filter-mapping>
 
   <listener>
@@ -158,50 +161,26 @@
     <servlet-class>org.apache.shindig.gadgets.servlet.JsServlet</servlet-class>
   </servlet>
 
-  <!-- Serve social REST api -->
   <servlet>
-    <servlet-name>socialRestapiServlet</servlet-name>
+    <servlet-name>restapiServlet</servlet-name>
     <servlet-class>
       org.apache.shindig.protocol.DataServiceServlet
     </servlet-class>
     <init-param>
       <param-name>handlers</param-name>
-      <param-value>org.apache.shindig.social.handlers</param-value>
+      <param-value>org.apache.shindig.handlers</param-value>
     </init-param>
   </servlet>
 
   <!-- Serve social RPC api -->
   <servlet>
-    <servlet-name>socialJsonRpcServlet</servlet-name>
+    <servlet-name>jsonRpcServlet</servlet-name>
     <servlet-class>
       org.apache.shindig.protocol.JsonRpcServlet
     </servlet-class>
     <init-param>
       <param-name>handlers</param-name>
-      <param-value>org.apache.shindig.social.handlers</param-value>
-    </init-param>
-  </servlet>
-
-  <!-- Serve gadgets RPC api -->
-  <servlet>
-    <servlet-name>gadgetsJsonRpcServlet</servlet-name>
-    <servlet-class>
-      org.apache.shindig.protocol.JsonRpcServlet
-    </servlet-class>
-    <init-param>
-      <param-name>handlers</param-name>
-      <param-value>org.apache.shindig.gadgets.handlers</param-value>
-    </init-param>
-  </servlet>
-
-  <servlet>
-    <servlet-name>gadgetsRestapiServlet</servlet-name>
-    <servlet-class>
-      org.apache.shindig.protocol.DataServiceServlet
-    </servlet-class>
-    <init-param>
-      <param-name>handlers</param-name>
-      <param-value>org.apache.shindig.gadgets.handlers</param-value>
+      <param-value>org.apache.shindig.handlers</param-value>
     </init-param>
   </servlet>
 
@@ -229,13 +208,17 @@
   </servlet-mapping>
 
   <servlet-mapping>
-    <servlet-name>gadgetsJsonRpcServlet</servlet-name>
+    <servlet-name>jsonRpcServlet</servlet-name>
+    <url-pattern>/rpc/*</url-pattern>
     <url-pattern>/gadgets/api/rpc/*</url-pattern>
+    <url-pattern>/social/rpc/*</url-pattern>
   </servlet-mapping>
 
   <servlet-mapping>
-    <servlet-name>gadgetsRestapiServlet</servlet-name>
+    <servlet-name>restapiServlet</servlet-name>
+    <url-pattern>/rest/*</url-pattern>
     <url-pattern>/gadgets/api/rest/*</url-pattern>
+    <url-pattern>/social/rest/*</url-pattern>
   </servlet-mapping>
 
   <servlet-mapping>
@@ -264,16 +247,6 @@
   </servlet-mapping>
 
   <servlet-mapping>
-    <servlet-name>socialRestapiServlet</servlet-name>
-    <url-pattern>/social/rest/*</url-pattern>
-  </servlet-mapping>
-
-  <servlet-mapping>
-    <servlet-name>socialJsonRpcServlet</servlet-name>
-    <url-pattern>/social/rpc/*</url-pattern>
-  </servlet-mapping>
-
-  <servlet-mapping>
     <servlet-name>sampleOAuth</servlet-name>
     <url-pattern>/oauth/*</url-pattern>
   </servlet-mapping>

Modified: shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java (original)
+++ shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java Wed May 12 23:39:51 2010
@@ -29,6 +29,7 @@ import org.apache.shindig.gadgets.servle
 import org.apache.shindig.gadgets.servlet.MakeRequestServlet;
 import org.apache.shindig.protocol.DataServiceServlet;
 import org.apache.shindig.protocol.JsonRpcServlet;
+import org.apache.shindig.social.core.config.SocialApiGuiceModule;
 import org.apache.shindig.social.sample.SampleModule;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.handler.ResourceHandler;
@@ -114,8 +115,12 @@ public class EndToEndServer {
 
     Map<String, String> initParams = Maps.newHashMap();
     String modules = Joiner.on(":")
-        .join(SampleModule.class.getName(), DefaultGuiceModule.class.getName(),
-            PropertiesModule.class.getName(), OAuthModule.class.getName());
+        .join(SocialApiGuiceModule.class.getName(),
+              SampleModule.class.getName(), 
+              DefaultGuiceModule.class.getName(),
+              PropertiesModule.class.getName(), 
+              OAuthModule.class.getName()
+             );
 
     initParams.put(GuiceServletContextListener.MODULES_ATTRIBUTE, modules);
     context.setInitParams(initParams);
@@ -127,13 +132,13 @@ public class EndToEndServer {
     // Attach DataServiceServlet, wrapped in a proxy to fake errors
     ServletHolder restServletHolder = new ServletHolder(new ForceErrorServlet(
         new DataServiceServlet()));
-    restServletHolder.setInitParameter("handlers", "org.apache.shindig.social.handlers");
+    restServletHolder.setInitParameter("handlers", "org.apache.shindig.handlers");
     context.addServlet(restServletHolder, REST_BASE);
     context.addFilter(AuthenticationServletFilter.class, REST_BASE, 0);
 
     // Attach JsonRpcServlet, wrapped in a proxy to fake errors
     ServletHolder rpcServletHolder = new ServletHolder(new ForceErrorServlet(new JsonRpcServlet()));
-    rpcServletHolder.setInitParameter("handlers", "org.apache.shindig.social.handlers");
+    rpcServletHolder.setInitParameter("handlers", "org.apache.shindig.handlers");
     context.addServlet(rpcServletHolder, JSON_RPC_BASE);
     context.addFilter(AuthenticationServletFilter.class, JSON_RPC_BASE, 0);
 
@@ -143,7 +148,7 @@ public class EndToEndServer {
 
     // Attach the Gadget 
     ServletHolder gadgetsJsonRpcServletHolder = new ServletHolder(new JsonRpcServlet());
-    gadgetsJsonRpcServletHolder.setInitParameter("handlers", "org.apache.shindig.gadgets.handlers");
+    gadgetsJsonRpcServletHolder.setInitParameter("handlers", "org.apache.shindig.handlers");
     context.addServlet(gadgetsJsonRpcServletHolder, GADGET_RPC_BASE);
     context.addFilter(AuthenticationServletFilter.class, GADGET_RPC_BASE, 0);
 

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/config/SocialApiGuiceModule.java Wed May 12 23:39:51 2010
@@ -40,6 +40,7 @@ import java.util.Set;
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.AbstractModule;
 import com.google.inject.TypeLiteral;
+import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 
 /**
@@ -70,8 +71,10 @@ public class SocialApiGuiceModule extend
     bind(new TypeLiteral<List<AuthenticationHandler>>(){}).toProvider(
         AuthenticationHandlerProvider.class);
 
-    bind(new TypeLiteral<Set<Object>>(){}).annotatedWith(Names.named("org.apache.shindig.social.handlers"))
-        .toInstance(getHandlers());
+    Multibinder<Object> handlerBinder = Multibinder.newSetBinder(binder(), Object.class, Names.named("org.apache.shindig.handlers"));
+    for (Class handler : getHandlers()) {
+      handlerBinder.addBinding().toInstance(handler);
+    }
 
     bind(Long.class).annotatedWith(Names.named("org.apache.shindig.serviceExpirationDurationMinutes")).toInstance(60L);
   }
@@ -80,8 +83,8 @@ public class SocialApiGuiceModule extend
    * Hook to provide a Set of request handlers.  Subclasses may override
    * to add or replace additional handlers.
    */
-  protected Set<Object> getHandlers() {
-    return ImmutableSet.<Object>of(ActivityHandler.class, AppDataHandler.class,
+  protected Set<Class<?>> getHandlers() {
+    return ImmutableSet.<Class<?>>of(ActivityHandler.class, AppDataHandler.class,
         PersonHandler.class, MessageHandler.class);
   }
 }

Modified: shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/SampleModule.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/SampleModule.java?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/SampleModule.java (original)
+++ shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/SampleModule.java Wed May 12 23:39:51 2010
@@ -17,7 +17,6 @@
  */
 package org.apache.shindig.social.sample;
 
-import org.apache.shindig.social.core.config.SocialApiGuiceModule;
 import org.apache.shindig.social.opensocial.oauth.OAuthDataStore;
 import org.apache.shindig.social.opensocial.spi.ActivityService;
 import org.apache.shindig.social.opensocial.spi.AppDataService;
@@ -30,6 +29,9 @@ import org.apache.shindig.social.sample.
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 
 /**
@@ -38,12 +40,10 @@ import com.google.inject.name.Names;
  * but does provide a good overview of the pieces of Shindig that require
  * custom container implementations.
  */
-public class SampleModule extends SocialApiGuiceModule {
+public class SampleModule extends AbstractModule {
 
   @Override
   protected void configure() {
-    super.configure();
-    
     bind(String.class).annotatedWith(Names.named("shindig.canonical.json.db"))
         .toInstance("sampledata/canonicaldb.json");
     bind(ActivityService.class).to(JsonDbOpensocialService.class);
@@ -53,13 +53,7 @@ public class SampleModule extends Social
     
     bind(OAuthDataStore.class).to(SampleOAuthDataStore.class);
 
-  }
-
-  @Override
-  protected Set<Object> getHandlers() {
-    ImmutableSet.Builder<Object> handlers = ImmutableSet.builder();
-    handlers.addAll(super.getHandlers());
-    handlers.add(SampleContainerHandler.class);
-    return handlers.build();
+    Multibinder<Object> handlerBinder = Multibinder.newSetBinder(binder(), Object.class, Names.named("org.apache.shindig.handlers"));
+    handlerBinder.addBinding().toInstance(SampleContainerHandler.class);
   }
 }

Modified: shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java (original)
+++ shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java Wed May 12 23:39:51 2010
@@ -69,7 +69,7 @@ public class SocialApiTestsGuiceModule e
         BeanJsonConverter.class);
 
     bind(new TypeLiteral<Set<Object>>(){}).annotatedWith(
-        Names.named("org.apache.shindig.social.handlers"))
+        Names.named("org.apache.shindig.handlers"))
         .toInstance(ImmutableSet.<Object>of(ActivityHandler.class, AppDataHandler.class,
             PersonHandler.class, MessageHandler.class));
 

Modified: shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java?rev=943752&r1=943751&r2=943752&view=diff
==============================================================================
--- shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java (original)
+++ shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java Wed May 12 23:39:51 2010
@@ -96,7 +96,7 @@ public abstract class AbstractLargeRestf
 
     HandlerRegistry dispatcher = injector.getInstance(HandlerRegistry.class);
     dispatcher.addHandlers(injector.getInstance(Key.get(new TypeLiteral<Set<Object>>(){},
-        Names.named("org.apache.shindig.social.handlers"))));
+        Names.named("org.apache.shindig.handlers"))));
     servlet.setHandlerRegistry(dispatcher);
     ContainerConfig containerConfig = EasyMock.createMock(ContainerConfig.class);
     EasyMock.expect(containerConfig.<String>getList(null, "gadgets.parentOrigins")).andReturn(Collections.<String>singletonList("*")).anyTimes();