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 18:50:11 UTC

svn commit: r561391 - in /incubator/tuscany/java/sca/modules: http-jetty/src/main/java/org/apache/tuscany/sca/http/jetty/ http-jetty/src/test/java/org/apache/tuscany/sca/http/jetty/ http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/ http-tom...

Author: jsdelfino
Date: Tue Jul 31 09:50:09 2007
New Revision: 561391

URL: http://svn.apache.org/viewvc?view=rev&rev=561391
Log:
Fixed Jetty and Tomcat embedded servers to use the specified port number when registering servlets.

Modified:
    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/test/java/org/apache/tuscany/sca/http/jetty/JettyServerTestCase.java
    incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/TomcatServer.java
    incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/module/TomcatRuntimeModuleActivator.java
    incubator/tuscany/java/sca/modules/http-tomcat/src/test/java/org/apache/tuscany/sca/http/tomcat/TomcatServerTestCase.java

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=561391&r1=561390&r2=561391
==============================================================================
--- 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 Tue Jul 31 09:50:09 2007
@@ -146,7 +146,7 @@
         Port port = ports.get(portNumber);
         if (port == null) {
 
-            // Create an start a new server
+            // Create and start a new server
             try {
                 Server server = new Server();
                 server.setThreadPool(new WorkSchedulerThreadPool());

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=561391&r1=561390&r2=561391
==============================================================================
--- 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 Tue Jul 31 09:50:09 2007
@@ -90,6 +90,35 @@
         assertTrue(servlet.invoked);
     }
 
+    /**
+     * Verifies that servlets can be registered with multiple ports
+     */
+    public void testRegisterMultiplePorts() throws Exception {
+        JettyServer service = new JettyServer(workScheduler);
+        TestServlet servlet = new TestServlet();
+        service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet);
+        TestServlet servlet2 = new TestServlet();
+        service.addServletMapping("http://127.0.0.1:" + (HTTP_PORT + 1) + "/", servlet2);
+        {
+            Socket client = new Socket("127.0.0.1", HTTP_PORT);
+            OutputStream os = client.getOutputStream();
+            os.write(REQUEST1.getBytes());
+            os.flush();
+            read(client);
+        }
+        {
+            Socket client = new Socket("127.0.0.1", HTTP_PORT + 1);
+            OutputStream os = client.getOutputStream();
+            os.write(REQUEST1.getBytes());
+            os.flush();
+            read(client);
+        }
+        
+        service.stop();
+        assertTrue(servlet.invoked);
+        assertTrue(servlet2.invoked);
+    }
+
     public void testUnregisterMapping() throws Exception {
         JettyServer service = new JettyServer(workScheduler);
         TestServlet servlet = new TestServlet();

Modified: incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/TomcatServer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/TomcatServer.java?view=diff&rev=561391&r1=561390&r2=561391
==============================================================================
--- incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/TomcatServer.java (original)
+++ incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/TomcatServer.java Tue Jul 31 09:50:09 2007
@@ -19,6 +19,11 @@
 package org.apache.tuscany.sca.http.tomcat;
 
 import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
 import java.util.concurrent.Executor;
 
 import javax.servlet.Servlet;
@@ -49,78 +54,37 @@
 public class TomcatServer implements ServletHost {
 
     private static final int DEFAULT_PORT = 8080;
-    private StandardEngine engine;
-    private StandardHost host;
-    private Connector connector;
-    private WorkScheduler workScheduler;
-
+    
     /**
-     * A custom connector that uses our WorkScheduler to schedule
-     * worker threads.
+     * Represents a port and the server that serves it.
      */
-    private class CustomConnector extends Connector {
-
-        private class CustomHttpProtocolHandler extends Http11Protocol {
-
-            /**
-             * An Executor wrappering our WorkScheduler
-             */
-            private class WorkSchedulerExecutor implements Executor {
-                public void execute(Runnable command) {
-                    workScheduler.scheduleWork(command);
-                }
-            }
-
-            /**
-             * A custom Endpoint that waits for its acceptor thread to
-             * terminate before stopping.
-             */
-            private class CustomEndpoint extends JIoEndpoint {
-                private Thread acceptorThread;
-
-                private class CustomAcceptor extends Acceptor {
-                    CustomAcceptor() {
-                        super();
-                    }
-                }
-
-                public void start() throws Exception {
-                    if (!initialized)
-                        init();
-                    if (!running) {
-                        running = true;
-                        paused = false;
-                        acceptorThread = new Thread(new CustomAcceptor(), getName() + "-Acceptor-" + 0);
-                        acceptorThread.setPriority(threadPriority);
-                        acceptorThread.setDaemon(daemon);
-                        acceptorThread.start();
-                    }
-                }
-
-                public void stop() {
-                    super.stop();
-                    try {
-                        acceptorThread.join();
-                    } catch (InterruptedException e) {
-                        throw new RuntimeException(e);
-                    }
-                }
-
-                public int getCurrentThreadsBusy() {
-                    return 0;
-                }
-            }
-
-            CustomHttpProtocolHandler() {
-                endpoint = new CustomEndpoint();
-                endpoint.setExecutor(new WorkSchedulerExecutor());
-            }
+    private class Port {
+        private StandardEngine engine;
+        private StandardHost host;
+        private Connector connector;
+        
+        private Port(StandardEngine engine, StandardHost host, Connector connector) {
+            this.engine = engine;
+            this.host = host;
+            this.connector = connector;
         }
 
-        CustomConnector() throws Exception {
-            protocolHandler = new CustomHttpProtocolHandler();
+        public StandardEngine getEngine() {
+            return engine;
+        }
+        
+        public StandardHost getHost() {
+            return host;
+        }
+        
+        public Connector getConnector() {
+            return connector;
         }
     }
+    
+    private Map<Integer, Port> ports = new HashMap<Integer, Port>();
+
+    private WorkScheduler workScheduler;
 
     /**
      * Constructs a new embedded Tomcat server.
@@ -131,61 +95,73 @@
         this.workScheduler = workScheduler;
     }
 
-    public void init() throws ServletMappingException {
-
-        // Create an engine
-        engine = new StandardEngine();
-        engine.setBaseDir("");
-        engine.setDefaultHost("localhost");
-
-        // Create a host
-        host = new StandardHost();
-        host.setAppBase("");
-        host.setName("localhost");
-        engine.addChild(host);
-
-        // Create the root context
-        StandardContext context = new StandardContext();
-        context.setDocBase("");
-        context.setPath("");
-        ContextConfig config = new ContextConfig();
-        ((Lifecycle)context).addLifecycleListener(config);
-        host.addChild(context);
-    }
-
-    public void destroy() throws ServletMappingException {
-
-        // Stop the server
-        try {
-            if (connector !=null) {
-                connector.stop();
-                engine.stop();
+    /**
+     * Stop all the started servers.
+     */
+    public void stop() throws ServletMappingException {
+        if (!ports.isEmpty()) {
+            try {
+                Set<Entry<Integer, Port>> entries = new HashSet<Entry<Integer, Port>>(ports.entrySet());
+                for (Entry<Integer, Port> entry: entries) {
+                    entry.getValue().getConnector().stop();
+                    entry.getValue().getEngine().stop();
+                    ports.remove(entry.getKey());
+                }
+            } catch (Exception e) {
+                throw new ServletMappingException(e);
             }
-        } catch (Exception e) {
-            throw new ServletMappingException(e);
         }
     }
 
     public void addServletMapping(String strURI, Servlet servlet) {
         URI uri = URI.create(strURI);
+        
+        // Get the URI port
+        int portNumber = uri.getPort();
+        if (portNumber == -1) {
+            portNumber = DEFAULT_PORT;
+        }
 
-        int port = uri.getPort();
-        if (port == -1) {
-            port = DEFAULT_PORT;
-        }
-        // Install a default HTTP connector
-        if (connector == null) {
-            //TODO support multiple connectors on different ports
+        // Get the port object associated with the given port number
+        Port port = ports.get(portNumber);
+        if (port == null) {
+
+            // Create an engine
+            StandardEngine engine = new StandardEngine();
+            engine.setBaseDir("");
+            engine.setDefaultHost("localhost");
+            engine.setName("engine/" + portNumber);
+
+            // Create a host
+            StandardHost host = new StandardHost();
+            host.setAppBase("");
+            host.setName("localhost");
+            engine.addChild(host);
+
+            // Create the root context
+            StandardContext context = new StandardContext();
+            context.setDocBase("");
+            context.setPath("");
+            ContextConfig config = new ContextConfig();
+            ((Lifecycle)context).addLifecycleListener(config);
+            host.addChild(context);
+            
+            // Install an HTTP connector
+            Connector connector;
             try {
                 engine.start();
                 connector = new CustomConnector();
-                connector.setPort(port);
+                connector.setPort(portNumber);
                 connector.setContainer(engine);
                 connector.initialize();
                 connector.start();
             } catch (Exception e) {
-                throw new RuntimeException(e);
+                throw new ServletMappingException(e);
             }
+            
+            // Keep track of the running server
+            port = new Port(engine, host, connector);
+            ports.put(portNumber, port);
         }
 
         // Register the servlet mapping
@@ -209,14 +185,12 @@
             wrapper = new ServletWrapper(servlet);
         }
         String mapping = uri.getPath();
-        Context context = host.map(mapping);
+        Context context = port.getHost().map(mapping);
         wrapper.setName(mapping);
         wrapper.addMapping(mapping);
         context.addChild(wrapper);
         context.addServletMapping(mapping, mapping);
-        connector.getMapper().addWrapper("localhost", "", mapping, wrapper);
-
-        System.out.println("addServletMapping port: " + port + " path: " + mapping);
+        port.getConnector().getMapper().addWrapper("localhost", "", mapping, wrapper);
 
         // Initialize the servlet
         try {
@@ -224,11 +198,27 @@
         } catch (ServletException e) {
             throw new ServletMappingException(e);
         }
+
+        System.out.println("addServletMapping port: " + portNumber + " path: " + mapping);
     }
 
-    public Servlet removeServletMapping(String uri) {
-        String mapping = URI.create(uri).getPath();
-        Context context = host.map(mapping);
+    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);
+        }
+        
+        String mapping = uri.getPath();
+        Context context = port.getHost().map(mapping);
         MappingData md = new MappingData();
         MessageBytes mb = MessageBytes.newInstance();
         mb.setString(mapping);
@@ -245,6 +235,74 @@
             return servletWrapper.getServlet();
         } else {
             return null;
+        }
+    }
+
+    /**
+     * A custom connector that uses our WorkScheduler to schedule
+     * worker threads.
+     */
+    private class CustomConnector extends Connector {
+
+        private class CustomHttpProtocolHandler extends Http11Protocol {
+
+            /**
+             * An Executor wrappering our WorkScheduler
+             */
+            private class WorkSchedulerExecutor implements Executor {
+                public void execute(Runnable command) {
+                    workScheduler.scheduleWork(command);
+                }
+            }
+
+            /**
+             * A custom Endpoint that waits for its acceptor thread to
+             * terminate before stopping.
+             */
+            private class CustomEndpoint extends JIoEndpoint {
+                private Thread acceptorThread;
+
+                private class CustomAcceptor extends Acceptor {
+                    CustomAcceptor() {
+                        super();
+                    }
+                }
+
+                public void start() throws Exception {
+                    if (!initialized)
+                        init();
+                    if (!running) {
+                        running = true;
+                        paused = false;
+                        acceptorThread = new Thread(new CustomAcceptor(), getName() + "-Acceptor-" + 0);
+                        acceptorThread.setPriority(threadPriority);
+                        acceptorThread.setDaemon(daemon);
+                        acceptorThread.start();
+                    }
+                }
+
+                public void stop() {
+                    super.stop();
+                    try {
+                        acceptorThread.join();
+                    } catch (InterruptedException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+
+                public int getCurrentThreadsBusy() {
+                    return 0;
+                }
+            }
+
+            CustomHttpProtocolHandler() {
+                endpoint = new CustomEndpoint();
+                endpoint.setExecutor(new WorkSchedulerExecutor());
+            }
+        }
+
+        CustomConnector() throws Exception {
+            protocolHandler = new CustomHttpProtocolHandler();
         }
     }
 

Modified: incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/module/TomcatRuntimeModuleActivator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/module/TomcatRuntimeModuleActivator.java?view=diff&rev=561391&r1=561390&r2=561391
==============================================================================
--- incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/module/TomcatRuntimeModuleActivator.java (original)
+++ incubator/tuscany/java/sca/modules/http-tomcat/src/main/java/org/apache/tuscany/sca/http/tomcat/module/TomcatRuntimeModuleActivator.java Tue Jul 31 09:50:09 2007
@@ -43,12 +43,11 @@
             extensionPointRegistry.getExtensionPoint(ServletHostExtensionPoint.class);
         WorkScheduler workScheduler = extensionPointRegistry.getExtensionPoint(WorkScheduler.class);
         server = new TomcatServer(workScheduler);
-        server.init();
         servletHosts.addServletHost(server);
     }
 
     public void stop(ExtensionPointRegistry registry) {
-        server.destroy();
+        server.stop();
     }
 
 }

Modified: incubator/tuscany/java/sca/modules/http-tomcat/src/test/java/org/apache/tuscany/sca/http/tomcat/TomcatServerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/http-tomcat/src/test/java/org/apache/tuscany/sca/http/tomcat/TomcatServerTestCase.java?view=diff&rev=561391&r1=561390&r2=561391
==============================================================================
--- incubator/tuscany/java/sca/modules/http-tomcat/src/test/java/org/apache/tuscany/sca/http/tomcat/TomcatServerTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/http-tomcat/src/test/java/org/apache/tuscany/sca/http/tomcat/TomcatServerTestCase.java Tue Jul 31 09:50:09 2007
@@ -78,7 +78,6 @@
      */
     public void testRegisterServletMapping() throws Exception {
         TomcatServer service = new TomcatServer(workScheduler);
-        service.init();
         TestServlet servlet = new TestServlet();
         service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/foo", servlet);
         Socket client = new Socket("127.0.0.1", HTTP_PORT);
@@ -86,13 +85,41 @@
         os.write(REQUEST1.getBytes());
         os.flush();
         read(client);
-        service.destroy();
+        service.stop();
         assertTrue(servlet.invoked);
     }
 
+    /**
+     * Verifies that servlets can be registered with multiple ports
+     */
+    public void testRegisterMultiplePorts() throws Exception {
+        TomcatServer service = new TomcatServer(workScheduler);
+        TestServlet servlet = new TestServlet();
+        service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet);
+        TestServlet servlet2 = new TestServlet();
+        service.addServletMapping("http://127.0.0.1:" + (HTTP_PORT + 1) + "/", servlet2);
+        {
+            Socket client = new Socket("127.0.0.1", HTTP_PORT);
+            OutputStream os = client.getOutputStream();
+            os.write(REQUEST1.getBytes());
+            os.flush();
+            read(client);
+        }
+        {
+            Socket client = new Socket("127.0.0.1", HTTP_PORT + 1);
+            OutputStream os = client.getOutputStream();
+            os.write(REQUEST1.getBytes());
+            os.flush();
+            read(client);
+        }
+        
+        service.stop();
+        assertTrue(servlet.invoked);
+        assertTrue(servlet2.invoked);
+    }
+
     public void testUnregisterMapping() throws Exception {
         TomcatServer service = new TomcatServer(workScheduler);
-        service.init();
         TestServlet servlet = new TestServlet();
         service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/foo", servlet);
         service.removeServletMapping("http://127.0.0.1:" + HTTP_PORT + "/foo");
@@ -101,13 +128,12 @@
         os.write(REQUEST1.getBytes());
         os.flush();
         read(client);
-        service.destroy();
+        service.stop();
         assertFalse(servlet.invoked);
     }
 
     public void testRequestSession() throws Exception {
         TomcatServer service = new TomcatServer(workScheduler);
-        service.init();
         TestServlet servlet = new TestServlet();
         service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/foo", servlet);
         Socket client = new Socket("127.0.0.1", HTTP_PORT);
@@ -115,22 +141,19 @@
         os.write(REQUEST1.getBytes());
         os.flush();
         read(client);
-        service.destroy();
+        service.stop();
         assertTrue(servlet.invoked);
         assertNotNull(servlet.sessionId);
     }
 
     public void testRestart() throws Exception {
         TomcatServer service = new TomcatServer(workScheduler);
-        service.init();
-        service.destroy();
-        service.init();
-        service.destroy();
+        service.stop();
+        service.stop();
     }
 
     public void testNoMappings() throws Exception {
         TomcatServer service = new TomcatServer(workScheduler);
-        service.init();
         Exception ex = null;
         try {
             Socket client = new Socket("127.0.0.1", HTTP_PORT);
@@ -141,12 +164,11 @@
             ex = e;
         }
         assertNotNull(ex);
-        service.destroy();
+        service.stop();
     }
 
     public void testResourceServlet() throws Exception {
         TomcatServer service = new TomcatServer(workScheduler);
-        service.init();
         
         String documentRoot = getClass().getClassLoader().getResource("content/test.html").toString();
         documentRoot = documentRoot.substring(0, documentRoot.lastIndexOf('/'));
@@ -162,12 +184,11 @@
         String document = read(client);
         assertTrue(document.indexOf("<body><p>hello</body>") != -1);
         
-        service.destroy();
+        service.stop();
     }
 
     public void testDefaultServlet() throws Exception {
         TomcatServer service = new TomcatServer(workScheduler);
-        service.init();
         
         String documentRoot = getClass().getClassLoader().getResource("content/test.html").toString();
         documentRoot = documentRoot.substring(0, documentRoot.lastIndexOf('/'));
@@ -182,7 +203,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