summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/contrib/modules/binding-websocket/src/main/java/org/apache/tuscany/sca/binding/websocket/runtime/WebsocketServiceBindingProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/contrib/modules/binding-websocket/src/main/java/org/apache/tuscany/sca/binding/websocket/runtime/WebsocketServiceBindingProvider.java')
-rw-r--r--sca-java-2.x/contrib/modules/binding-websocket/src/main/java/org/apache/tuscany/sca/binding/websocket/runtime/WebsocketServiceBindingProvider.java78
1 files changed, 44 insertions, 34 deletions
diff --git a/sca-java-2.x/contrib/modules/binding-websocket/src/main/java/org/apache/tuscany/sca/binding/websocket/runtime/WebsocketServiceBindingProvider.java b/sca-java-2.x/contrib/modules/binding-websocket/src/main/java/org/apache/tuscany/sca/binding/websocket/runtime/WebsocketServiceBindingProvider.java
index fe5efcffef..7f89a523c3 100644
--- a/sca-java-2.x/contrib/modules/binding-websocket/src/main/java/org/apache/tuscany/sca/binding/websocket/runtime/WebsocketServiceBindingProvider.java
+++ b/sca-java-2.x/contrib/modules/binding-websocket/src/main/java/org/apache/tuscany/sca/binding/websocket/runtime/WebsocketServiceBindingProvider.java
@@ -19,65 +19,75 @@
package org.apache.tuscany.sca.binding.websocket.runtime;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
+import org.apache.tuscany.sca.binding.websocket.WebsocketBinding;
+import org.apache.tuscany.sca.host.http.ServletHost;
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
import org.apache.tuscany.sca.interfacedef.Operation;
import org.apache.tuscany.sca.provider.ServiceBindingProvider;
import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
-import org.apache.websocket.ServerWebSocket;
public class WebsocketServiceBindingProvider implements ServiceBindingProvider {
- private static Map<String, WebSocketOperationDispatcher> dispatchers = new HashMap<String, WebSocketOperationDispatcher>();
-
+ private static final String JAVASCRIPT_RESOURCE_PATH = "/org.apache.tuscany.sca.WebsocketComponentContext.js";
+ private static Map<Integer, WebSocketServer> servers = new HashMap<Integer, WebSocketServer>();
private RuntimeEndpoint endpoint;
+ private ServletHost servletHost;
- public WebsocketServiceBindingProvider(RuntimeEndpoint endpoint) {
+ public WebsocketServiceBindingProvider(RuntimeEndpoint endpoint, ServletHost servletHost) {
this.endpoint = endpoint;
+ this.servletHost = servletHost;
}
public void start() {
- String uri = endpoint.getBinding().getURI();
- WebSocketOperationDispatcher dispatcher = initDispatcherForURI(uri);
- String component = endpoint.getComponent().getName();
- String service = endpoint.getService().getName();
- for (Operation op : getBindingInterfaceContract().getInterface().getOperations()) {
- String operation = op.getName();
- dispatcher.addOperation(component + "/" + service + "/" + operation, endpoint, op);
+ WebsocketBinding binding = (WebsocketBinding) endpoint.getBinding();
+ int port = Integer.parseInt(binding.getPort());
+ try {
+ WebSocketServer server = initServerForURI(port);
+ String component = endpoint.getComponent().getName();
+ String service = endpoint.getService().getName();
+ for (Operation op : getBindingInterfaceContract().getInterface().getOperations()) {
+ String operation = op.getName();
+ server.getDispatcher().addOperation(component + "." + service + "." + operation, endpoint, op);
+ }
+ JavascriptGenerator.generateServiceProxy(component, service, getBindingInterfaceContract().getInterface()
+ .getOperations(), port);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
}
+ initJavascriptResource();
+ }
+ private WebSocketServer initServerForURI(int port) throws Exception {
+ WebSocketServer server = servers.get(port);
+ if (server == null) {
+ server = new WebSocketServer(port);
+ server.start();
+ servers.put(port, server);
+ }
+ return server;
}
- private WebSocketOperationDispatcher initDispatcherForURI(String uri) {
- WebSocketOperationDispatcher dispatcher = dispatchers.get(uri);
- if (dispatcher == null) {
- try {
- ServerWebSocket server = new ServerWebSocket(new URI(uri));
- System.out.println("Starting websocket server " + server + " at " + uri + "...");
- dispatcher = new WebSocketOperationDispatcher(server);
- System.out.println("Created new dispatcher for " + uri + " " + dispatcher);
- dispatchers.put(uri, dispatcher);
- server.register("/", dispatcher);
- new Thread(server).start();
- } catch (IOException e) {
- throw new RuntimeException(e);
- } catch (URISyntaxException e) {
- throw new RuntimeException(e);
- }
+ private void initJavascriptResource() {
+ if (servletHost.getServletMapping(JAVASCRIPT_RESOURCE_PATH) == null) {
+ System.out.println("Adding javascript servlet");
+ servletHost.addServletMapping(JAVASCRIPT_RESOURCE_PATH, new JavascriptResourceServlet());
}
- return dispatcher;
}
public void stop() {
- for (WebSocketOperationDispatcher dispatcher : dispatchers.values()) {
- dispatcher.shutdown();
+ for (WebSocketServer server : servers.values()) {
+ try {
+ server.stop();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
}
- dispatchers.clear();
+ servers.clear();
+ servletHost.removeServletMapping(JAVASCRIPT_RESOURCE_PATH);
+ JavascriptGenerator.clear();
}
public InterfaceContract getBindingInterfaceContract() {