You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2007/07/31 07:55:21 UTC

svn commit: r561235 - in /incubator/tuscany/java/sca/modules: binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/ http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/ http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/m...

Author: jsdelfino
Date: Mon Jul 30 22:55:20 2007
New Revision: 561235

URL: http://svn.apache.org/viewvc?view=rev&rev=561235
Log:
Support multiple ports in JettyServer.

Modified:
    incubator/tuscany/java/sca/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCService.java
    incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/JettyServer.java
    incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/module/JettyRuntimeModuleActivator.java
    incubator/tuscany/java/sca/modules/http-jetty/src/test/java/org/apache/tuscany/sca/http/jetty/JettyServerTestCase.java

Modified: incubator/tuscany/java/sca/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCService.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCService.java?view=diff&rev=561235&r1=561234&r2=561235
==============================================================================
--- incubator/tuscany/java/sca/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCService.java (original)
+++ incubator/tuscany/java/sca/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCService.java Mon Jul 30 22:55:20 2007
@@ -19,6 +19,8 @@
 
 package org.apache.tuscany.sca.binding.jsonrpc;
 
+import java.net.URI;
+
 import org.apache.tuscany.sca.assembly.Binding;
 import org.apache.tuscany.sca.http.ServletHost;
 import org.apache.tuscany.sca.interfacedef.Interface;
@@ -68,19 +70,26 @@
         Class<?> serviceInterface = getTargetJavaClass(service.getInterfaceContract().getInterface());
         Object instance = component.createSelfReference(serviceInterface).getService();
         JSONRPCServiceServlet serviceServlet = new JSONRPCServiceServlet(binding.getName(), serviceInterface, instance);
+        int port;
         if (binding.getURI() != null) {
             servletHost.addServletMapping(binding.getURI(), serviceServlet);
+            URI uri = URI.create(binding.getURI());
+            port = uri.getPort();
+            if (port == -1)
+                port = 8080;
         } else {
             servletHost.addServletMapping(SERVICE_PREFIX + binding.getName(), serviceServlet);
+            port = 8080;
         }
 
         // get the ScaDomainScriptServlet, if it doesn't yet exist create one
         // this uses removeServletMapping / addServletMapping as theres no getServletMapping facility
-        ScaDomainScriptServlet scaDomainServlet = (ScaDomainScriptServlet) servletHost.removeServletMapping(SCA_DOMAIN_SCRIPT);
+        URI domainURI = URI.create("http://localhost:" + port + SCA_DOMAIN_SCRIPT);
+        ScaDomainScriptServlet scaDomainServlet = (ScaDomainScriptServlet) servletHost.removeServletMapping(domainURI.toString());
         if (scaDomainServlet == null) {
             scaDomainServlet = new ScaDomainScriptServlet();
         }
-        servletHost.addServletMapping(SCA_DOMAIN_SCRIPT, scaDomainServlet);
+        servletHost.addServletMapping(domainURI.toString(), scaDomainServlet);
         
         // Add this service to the scadomain script servlet
         scaDomainServlet.addService(binding.getName());
@@ -90,20 +99,27 @@
     public void stop() {
 
         // Unregister from the service servlet mapping
+        int port;
         if (binding.getURI() != null) {
             servletHost.removeServletMapping(binding.getURI());
+            URI uri = URI.create(binding.getURI());
+            port = uri.getPort();
+            if (port == -1)
+                port = 8080;
         } else {
             servletHost.removeServletMapping(SERVICE_PREFIX + binding.getName());
+            port = 8080;
         }
 
         // Unregister the service from the scaDomain script servlet
         // don't unregister the scaDomain script servlet if it still has other service names
-        ScaDomainScriptServlet scaDomainServlet = (ScaDomainScriptServlet) servletHost.removeServletMapping(SCA_DOMAIN_SCRIPT);
+        URI domainURI = URI.create("http://localhost:" + port + SCA_DOMAIN_SCRIPT);
+        ScaDomainScriptServlet scaDomainServlet = (ScaDomainScriptServlet) servletHost.removeServletMapping(domainURI.toString());
         if (scaDomainServlet != null) {
             scaDomainServlet.removeService(binding.getName());
             // put it back if there are still other services registered with the servlet
             if (scaDomainServlet.getServiceNames().size() > 0) {
-                servletHost.addServletMapping(SCA_DOMAIN_SCRIPT, scaDomainServlet);
+                servletHost.addServletMapping(domainURI.toString(), scaDomainServlet);
             }
         }
     }

Modified: incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/JettyServer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/JettyServer.java?view=diff&rev=561235&r1=561234&r2=561235
==============================================================================
--- incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/JettyServer.java (original)
+++ incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/JettyServer.java Mon Jul 30 22:55:20 2007
@@ -21,7 +21,12 @@
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
 
 import javax.servlet.Servlet;
 import javax.servlet.ServletException;
@@ -40,8 +45,6 @@
 import org.mortbay.jetty.servlet.ServletHolder;
 import org.mortbay.jetty.servlet.ServletMapping;
 import org.mortbay.jetty.servlet.SessionHandler;
-import org.mortbay.log.Log;
-import org.mortbay.log.Logger;
 import org.mortbay.thread.ThreadPool;
 
 /**
@@ -53,55 +56,51 @@
 public class JettyServer implements ServletHost {
 
     private static final String ROOT = "/";
-    private static final int ERROR = 0;
-    private static final int UNINITIALIZED = 0;
-    private static final int STARTING = 1;
-    private static final int STARTED = 2;
-    private static final int STOPPING = 3;
-    private static final int STOPPED = 4;
     private static final int DEFAULT_PORT = 8080;
 
     private final Object joinLock = new Object();
-    private int state = UNINITIALIZED;
     private String keystore;
     private String certPassword;
     private String keyPassword;
     private boolean sendServerVersion;
-    private boolean https;
-    private int httpsPort = 8484;
-    private boolean debug;
-    private Server server;
-    private Connector connector;
-    private ServletHandler servletHandler;
     private WorkScheduler workScheduler;
 
+    /**
+     * Represents a port and the server that serves it.
+     */
+    private class Port {
+        private Server server;
+        private ServletHandler servletHandler;
+        
+        private Port(Server server, ServletHandler servletHandler) {
+            this.server = server;
+            this.servletHandler = servletHandler;
+        }
+
+        public Server getServer() {
+            return server;
+        }
+        
+        public ServletHandler getServletHandler() {
+            return servletHandler;
+        }
+    }
+    
+    private Map<Integer, Port> ports = new HashMap<Integer, Port>();
+
     static {
-        // hack to replace the static Jetty logger
+        // Hack to replace the static Jetty logger
         System.setProperty("org.mortbay.log.class", JettyLogger.class.getName());
-
     }
 
     public JettyServer(WorkScheduler workScheduler) {
         this.workScheduler = workScheduler;
-
-        // Configure the Jetty logger
-        Logger logger = Log.getLogger(null);
-        if (logger instanceof JettyLogger) {
-            JettyLogger jettyLogger = (JettyLogger)logger;
-            if (debug) {
-                jettyLogger.setDebugEnabled(true);
-            }
-        }
     }
 
     public void setSendServerVersion(boolean sendServerVersion) {
         this.sendServerVersion = sendServerVersion;
     }
 
-    public void setHttps(boolean https) {
-        this.https = https;
-    }
-
     public void setKeystore(String keystore) {
         this.keystore = keystore;
     }
@@ -114,83 +113,83 @@
         this.keyPassword = keyPassword;
     }
 
-    public void setDebug(boolean val) {
-        debug = val;
-    }
-
-    public void init() {
-        state = STARTING;
-    }
-
-    public void destroy() {
-        if (state == STARTED) {
-            state = STOPPING;
+    /**
+     * Stop all the started servers.
+     */
+    public void stop() {
+        if (!ports.isEmpty()) {
             synchronized (joinLock) {
                 joinLock.notifyAll();
             }
             try {
-                server.stop();
+                Set<Entry<Integer, Port>> entries = new HashSet<Entry<Integer, Port>>(ports.entrySet());
+                for (Entry<Integer, Port> entry: entries) {
+                    entry.getValue().getServer().stop();
+                    ports.remove(entry.getKey());
+                }
             } catch (Exception e) {
                 throw new ServletMappingException(e);
             }
-            state = STOPPED;
         }
     }
 
     public void addServletMapping(String uriStr, Servlet servlet) throws ServletMappingException {
         URI uri = URI.create(uriStr);
-        int port = uri.getPort();
-        if (state == STARTING) {
+        
+        // Get the URI port
+        int portNumber = uri.getPort();
+        if (portNumber == -1) {
+            portNumber = DEFAULT_PORT;
+        }
 
-            if (port == -1) {
-                port = DEFAULT_PORT;
-            }
+        // Get the port object associated with the given port number
+        Port port = ports.get(portNumber);
+        if (port == null) {
 
+            // Create an start a new server
             try {
-                server = new Server();
+                Server server = new Server();
                 server.setThreadPool(new WorkSchedulerThreadPool());
-                if (connector == null) {
-                    if (https) {
-                        Connector httpConnector = new SelectChannelConnector();
-                        httpConnector.setPort(port);
-                        SslSocketConnector sslConnector = new SslSocketConnector();
-                        sslConnector.setPort(httpsPort);
-                        sslConnector.setKeystore(keystore);
-                        sslConnector.setPassword(certPassword);
-                        sslConnector.setKeyPassword(keyPassword);
-                        server.setConnectors(new Connector[] {httpConnector, sslConnector});
-                    } else {
-                        SelectChannelConnector selectConnector = new SelectChannelConnector();
-                        selectConnector.setPort(port);
-                        server.setConnectors(new Connector[] {selectConnector});
-                    }
+                if ("https".equals(uri.getScheme())) {
+                    Connector httpConnector = new SelectChannelConnector();
+                    httpConnector.setPort(portNumber);
+                    SslSocketConnector sslConnector = new SslSocketConnector();
+                    sslConnector.setPort(portNumber);
+                    sslConnector.setKeystore(keystore);
+                    sslConnector.setPassword(certPassword);
+                    sslConnector.setKeyPassword(keyPassword);
+                    server.setConnectors(new Connector[] {httpConnector, sslConnector});
                 } else {
-                    connector.setPort(port);
-                    server.setConnectors(new Connector[] {connector});
+                    SelectChannelConnector selectConnector = new SelectChannelConnector();
+                    selectConnector.setPort(portNumber);
+                    server.setConnectors(new Connector[] {selectConnector});
                 }
-
+    
                 ContextHandler contextHandler = new ContextHandler();
                 contextHandler.setContextPath(ROOT);
                 server.setHandler(contextHandler);
-
+    
                 SessionHandler sessionHandler = new SessionHandler();
-                servletHandler = new ServletHandler();
+                ServletHandler servletHandler = new ServletHandler();
                 sessionHandler.addHandler(servletHandler);
-
+    
                 contextHandler.setHandler(sessionHandler);
-
+    
                 server.setStopAtShutdown(true);
                 server.setSendServerVersion(sendServerVersion);
-                // monitor.started();
                 server.start();
-                state = STARTED;
+                
+                // Keep track of the new server and servlet handler 
+                port = new Port(server, servletHandler);
+                ports.put(portNumber, port);
+                
             } catch (Exception e) {
-                state = ERROR;
                 throw new ServletMappingException(e);
             }
         }
 
         // Register the servlet mapping
+        ServletHandler servletHandler = port.getServletHandler();
         ServletHolder holder;
         if (servlet instanceof DefaultResourceServlet) {
             
@@ -216,14 +215,31 @@
         String path = uri.getPath();
         mapping.setPathSpec(path);
         servletHandler.addServletMapping(mapping);
-        System.out.println("addServletMapping port: " + port + " path: " + path);
+        
+        System.out.println("addServletMapping port: " + portNumber + " path: " + path);
     }
 
-    public Servlet removeServletMapping(String uri) {
+    public Servlet removeServletMapping(String uriStr) {
+        URI uri = URI.create(uriStr);
+        
+        // Get the URI port
+        int portNumber = uri.getPort();
+        if (portNumber == -1) {
+            portNumber = DEFAULT_PORT;
+        }
+
+        // Get the port object associated with the given port number
+        Port port = ports.get(portNumber);
+        if (port == null) {
+            throw new IllegalStateException("No servlet registered at this URI: " + uriStr);
+        }
+        
+        // Remove the servlet mapping for the given servlet 
+        ServletHandler servletHandler = port.getServletHandler();
         Servlet removedServlet = null;
         List<ServletMapping> mappings =
             new ArrayList<ServletMapping>(Arrays.asList(servletHandler.getServletMappings()));
-        String path = URI.create(uri).getPath();
+        String path = uri.getPath();
         for (ServletMapping mapping : mappings) {
             if (Arrays.asList(mapping.getPathSpecs()).contains(path)) {
                 try {
@@ -242,7 +258,7 @@
     }
 
     /**
-     * An integration wrapper to enable use of a {@link WorkScheduler} with Jetty
+     * A wrapper to enable use of a WorkScheduler with Jetty
      */
     private class WorkSchedulerThreadPool implements ThreadPool {
 
@@ -266,34 +282,7 @@
         }
 
         public boolean isLowOnThreads() {
-            // TODO FIXME
             return false;
-        }
-
-        public void start() throws Exception {
-        }
-
-        public void stop() throws Exception {
-        }
-
-        public boolean isRunning() {
-            return state == STARTING || state == STARTED;
-        }
-
-        public boolean isStarted() {
-            return state == STARTED;
-        }
-
-        public boolean isStarting() {
-            return state == STARTING;
-        }
-
-        public boolean isStopping() {
-            return state == STOPPING;
-        }
-
-        public boolean isFailed() {
-            return state == ERROR;
         }
     }
 

Modified: incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/module/JettyRuntimeModuleActivator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/module/JettyRuntimeModuleActivator.java?view=diff&rev=561235&r1=561234&r2=561235
==============================================================================
--- incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/module/JettyRuntimeModuleActivator.java (original)
+++ incubator/tuscany/java/sca/modules/http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/module/JettyRuntimeModuleActivator.java Mon Jul 30 22:55:20 2007
@@ -44,11 +44,10 @@
         WorkScheduler workScheduler = extensionPointRegistry.getExtensionPoint(WorkScheduler.class);
         server = new JettyServer(workScheduler);
         servletHosts.addServletHost(server);
-        server.init();
     }
 
     public void stop(ExtensionPointRegistry registry) {
-        server.destroy();
+        server.stop();
     }
 
 }

Modified: incubator/tuscany/java/sca/modules/http-jetty/src/test/java/org/apache/tuscany/sca/http/jetty/JettyServerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/http-jetty/src/test/java/org/apache/tuscany/sca/http/jetty/JettyServerTestCase.java?view=diff&rev=561235&r1=561234&r2=561235
==============================================================================
--- incubator/tuscany/java/sca/modules/http-jetty/src/test/java/org/apache/tuscany/sca/http/jetty/JettyServerTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/http-jetty/src/test/java/org/apache/tuscany/sca/http/jetty/JettyServerTestCase.java Mon Jul 30 22:55:20 2007
@@ -79,7 +79,6 @@
      */
     public void testRegisterServletMapping() throws Exception {
         JettyServer service = new JettyServer(workScheduler);
-        service.init();
         TestServlet servlet = new TestServlet();
         service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet);
         Socket client = new Socket("127.0.0.1", HTTP_PORT);
@@ -87,13 +86,12 @@
         os.write(REQUEST1.getBytes());
         os.flush();
         read(client);
-        service.destroy();
+        service.stop();
         assertTrue(servlet.invoked);
     }
 
     public void testUnregisterMapping() throws Exception {
         JettyServer service = new JettyServer(workScheduler);
-        service.init();
         TestServlet servlet = new TestServlet();
         String uri = "http://127.0.0.1:" + HTTP_PORT + "/foo";
         service.addServletMapping(uri, servlet);
@@ -103,14 +101,12 @@
         os.write(REQUEST1.getBytes());
         os.flush();
         read(client);
-        service.destroy();
+        service.stop();
         assertFalse(servlet.invoked);
     }
 
     public void testRequestSession() throws Exception {
         JettyServer service = new JettyServer(workScheduler);
-        service.setDebug(true);
-        service.init();
         TestServlet servlet = new TestServlet();
         service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet);
         Socket client = new Socket("127.0.0.1", HTTP_PORT);
@@ -118,22 +114,19 @@
         os.write(REQUEST1.getBytes());
         os.flush();
         read(client);
-        service.destroy();
+        service.stop();
         assertTrue(servlet.invoked);
         assertNotNull(servlet.sessionId);
     }
 
     public void testRestart() throws Exception {
         JettyServer service = new JettyServer(workScheduler);
-        service.init();
-        service.destroy();
-        service.init();
-        service.destroy();
+        service.stop();
+        service.stop();
     }
 
     public void testNoMappings() throws Exception {
         JettyServer service = new JettyServer(workScheduler);
-        service.init();
         Exception ex = null;
         try {
             new Socket("127.0.0.1", HTTP_PORT);
@@ -141,12 +134,11 @@
             ex = e;
         }
         assertNotNull(ex);
-        service.destroy();
+        service.stop();
     }
     
     public void testResourceServlet() throws Exception {
         JettyServer service = new JettyServer(workScheduler);
-        service.init();
         
         String documentRoot = getClass().getClassLoader().getResource("content/test.html").toString();
         documentRoot = documentRoot.substring(0, documentRoot.lastIndexOf('/'));
@@ -162,12 +154,11 @@
         String document = read(client);
         assertTrue(document.indexOf("<body><p>hello</body>") != -1);
         
-        service.destroy();
+        service.stop();
     }
 
     public void testDefaultServlet() throws Exception {
         JettyServer service = new JettyServer(workScheduler);
-        service.init();
         
         String documentRoot = getClass().getClassLoader().getResource("content/test.html").toString();
         documentRoot = documentRoot.substring(0, documentRoot.lastIndexOf('/'));
@@ -182,7 +173,7 @@
         String document = read(client);
         assertTrue(document.indexOf("<body><p>hello</body>") != -1);
         
-        service.destroy();
+        service.stop();
     }
 
     private static String read(Socket socket) throws IOException {



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org