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();