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; import org.atmosphere.annotation.Broadcast; import org.atmosphere.cpr.Broadcaster; import org.atmosphere.cpr.DefaultBroadcaster; import org.atmosphere.jersey.Broadcastable; import org.atmosphere.jersey.SuspendResponse; import com.sun.jersey.spi.container.servlet.PerSession; @Path("/") @Produces("text/html;charset=ISO-8859-1") @PerSession public class CometBindingHandler { private Broadcaster broadcaster; private Map endpoints; private Map operations; @Context private ServletContext sc; @GET public SuspendResponse connect() { System.out.println("Entering connect..."); broadcaster = new DefaultBroadcaster(); 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(@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[] {}); // TODO: replace with JSON return new Broadcastable(callbackMethod + "#" + response.toString(), "", broadcaster); } }