From eff7bb9dd439b9d9d74cb54b4cf0733e6b3ca0cf Mon Sep 17 00:00:00 2001 From: fmoga Date: Sat, 14 Aug 2010 00:34:27 +0000 Subject: Added ServletFactory in order to keep a singleton servlet for all comet services in a scdl so that the two connection limit issue with the browsers is avoided. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@985414 13f79535-47bb-0310-9956-ffa450edef68 --- .../binding/comet/runtime/CometBindingHandler.java | 38 ++++++++++++------- .../comet/runtime/CometServiceBindingProvider.java | 12 +----- .../sca/binding/comet/runtime/ServletFactory.java | 43 ++++++++++++++++++++++ 3 files changed, 70 insertions(+), 23 deletions(-) create mode 100644 sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/ServletFactory.java (limited to 'sca-java-2.x') diff --git a/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometBindingHandler.java b/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometBindingHandler.java index a597d86f3a..f8e6470c4c 100644 --- a/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometBindingHandler.java +++ b/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometBindingHandler.java @@ -1,13 +1,18 @@ package org.apache.tuscany.sca.binding.comet.runtime; import java.lang.reflect.InvocationTargetException; +import java.util.Map; import javax.servlet.ServletContext; +import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; +import javax.ws.rs.core.Request; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.runtime.RuntimeEndpoint; @@ -25,29 +30,36 @@ import com.sun.jersey.spi.container.servlet.PerSession; public class CometBindingHandler { private Broadcaster broadcaster; - public static final String ENDPOINT_KEY = "org.apache.tuscany.sca.binding.comet.endpoint"; - public static final String OPERATION_KEY = "org.apache.tuscany.sca.binding.comet.operation"; + private Map endpoints; + private Map operations; @Context private ServletContext sc; - + @GET public SuspendResponse connect() { + System.out.println("Entering connect..."); broadcaster = new DefaultBroadcaster(); - return new SuspendResponse.SuspendResponseBuilder() - .broadcaster(broadcaster) - .outputComments(true) - // .addListener(new EventsLogger()) - .build(); + endpoints = (Map)sc.getAttribute(ServletFactory.ENDPOINTS_KEY); + operations = (Map)sc.getAttribute(ServletFactory.OPERATIONS_KEY); + return new SuspendResponse.SuspendResponseBuilder().broadcaster(broadcaster).outputComments(true) + .addListener(new EventsLogger()).build(); } @POST + @Path("/{component}/{service}/{method}") @Broadcast - public Broadcastable callAndRespond() throws InvocationTargetException { - RuntimeEndpoint wire = (RuntimeEndpoint)sc.getAttribute(ENDPOINT_KEY); - Operation operation = (Operation)sc.getAttribute(OPERATION_KEY); + public Broadcastable callAndRespond(@PathParam("component") String component, + @PathParam("service") String service, + @PathParam("method") String method, + @FormParam("callback") String callbackMethod) throws InvocationTargetException { + String url = "/" + component + "/" + service + "/" + method; + System.out.println("Entered callAndRespond with url: " + url); + System.out.println("Callback method: " + callbackMethod); + RuntimeEndpoint wire = endpoints.get(url); + Operation operation = operations.get(url); Object response = wire.invoke(operation, new Object[] {}); - return new Broadcastable(response.toString(), "", broadcaster); + // TODO: replace with JSON + return new Broadcastable(callbackMethod + "#" + response.toString(), "", broadcaster); } - } diff --git a/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometServiceBindingProvider.java b/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometServiceBindingProvider.java index effbb8d49d..bd7a570955 100644 --- a/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometServiceBindingProvider.java +++ b/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometServiceBindingProvider.java @@ -30,9 +30,6 @@ import org.atmosphere.cpr.AtmosphereServlet; public class CometServiceBindingProvider implements ServiceBindingProvider { - private static final String PACKAGE_KEY = "com.sun.jersey.config.property.packages"; - private static final String PACKAGE_VALUE = "org.apache.tuscany.sca.binding.comet.runtime"; - private RuntimeEndpoint endpoint; private ServletHost servletHost; @@ -44,13 +41,8 @@ public class CometServiceBindingProvider implements ServiceBindingProvider { public void start() { ComponentService service = endpoint.getService(); Interface serviceInterface = service.getInterfaceContract().getInterface(); - for (Operation op : serviceInterface.getOperations()) { - String path = endpoint.getBinding().getURI() + "/" + op.getName() + "/*"; - AtmosphereServlet servlet = new AtmosphereServlet(); - servlet.addInitParameter(PACKAGE_KEY, PACKAGE_VALUE); - servletHost.addServletMapping(path, servlet); - servlet.getServletContext().setAttribute(CometBindingHandler.ENDPOINT_KEY, endpoint); - servlet.getServletContext().setAttribute(CometBindingHandler.OPERATION_KEY, op); + for (Operation operation : serviceInterface.getOperations()) { + ServletFactory.registerServlet(servletHost, endpoint, operation); } } diff --git a/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/ServletFactory.java b/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/ServletFactory.java new file mode 100644 index 0000000000..6a89bf8a06 --- /dev/null +++ b/sca-java-2.x/contrib/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/ServletFactory.java @@ -0,0 +1,43 @@ +package org.apache.tuscany.sca.binding.comet.runtime; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.runtime.RuntimeEndpoint; +import org.atmosphere.cpr.AtmosphereServlet; + +public class ServletFactory { + + private static final String PACKAGE_KEY = "com.sun.jersey.config.property.packages"; + private static final String PACKAGE_VALUE = "org.apache.tuscany.sca.binding.comet.runtime"; + public static final String ENDPOINTS_KEY = "org.apache.tuscany.sca.binding.comet.endpoints"; + public static final String OPERATIONS_KEY = "org.apache.tuscany.sca.binding.comet.operations"; + public static final String PATH = "/tuscany-comet/*"; + + private static AtmosphereServlet servlet = null; + + public static synchronized void registerServlet(ServletHost servletHost, + RuntimeEndpoint endpoint, + Operation operation) { + if (servlet == null) { + servlet = new AtmosphereServlet(); + servlet.addInitParameter(PACKAGE_KEY, PACKAGE_VALUE); + servletHost.addServletMapping(PATH, servlet); + Map endpoints = new HashMap(); + servlet.getServletContext().setAttribute(ENDPOINTS_KEY, endpoints); + Map operations = new HashMap(); + servlet.getServletContext().setAttribute(OPERATIONS_KEY, operations); + } + String url = endpoint.getBinding().getURI() + "/" + operation.getName(); + System.out.println("Adding endpoint and operation for url: " + url); + Map endpoints = + (Map)servlet.getServletContext().getAttribute(ENDPOINTS_KEY); + endpoints.put(url, endpoint); + Map operations = + (Map)servlet.getServletContext().getAttribute(OPERATIONS_KEY); + operations.put(url, operation); + } + +} -- cgit v1.2.3