You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ro...@apache.org on 2008/11/17 14:18:58 UTC

svn commit: r718242 - in /activemq/camel/trunk/components/camel-jetty/src: main/java/org/apache/camel/component/jetty/ test/java/org/apache/camel/component/jetty/

Author: romkal
Date: Mon Nov 17 05:18:58 2008
New Revision: 718242

URL: http://svn.apache.org/viewvc?rev=718242&view=rev
Log:
CAMEL-1091 : camel jetty looks at host specified in URL now

Added:
    activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/InterfacesTest.java   (with props)
Modified:
    activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java
    activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java

Modified: activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java?rev=718242&r1=718241&r2=718242&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java (original)
+++ activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java Mon Nov 17 05:18:58 2008
@@ -26,7 +26,6 @@
 import org.apache.camel.component.http.CamelServlet;
 import org.apache.camel.component.http.HttpConsumer;
 import org.apache.camel.component.http.HttpExchange;
-
 import org.mortbay.util.ajax.Continuation;
 import org.mortbay.util.ajax.ContinuationSupport;
 
@@ -35,6 +34,8 @@
  */
 public class CamelContinuationServlet extends CamelServlet {
 
+    private static final long serialVersionUID = 1L;
+
     @Override
     protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         try {

Modified: activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java?rev=718242&r1=718241&r2=718242&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java (original)
+++ activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java Mon Nov 17 05:18:58 2008
@@ -25,9 +25,12 @@
 import org.apache.camel.component.http.HttpComponent;
 import org.apache.camel.component.http.HttpConsumer;
 import org.apache.camel.component.http.HttpEndpoint;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.mortbay.jetty.Connector;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.client.HttpClient;
+import org.mortbay.jetty.handler.ContextHandlerCollection;
 import org.mortbay.jetty.nio.SelectChannelConnector;
 import org.mortbay.jetty.security.SslSocketConnector;
 import org.mortbay.jetty.servlet.Context;
@@ -44,10 +47,12 @@
 
     class ConnectorRef {
         Connector connector;
+        CamelServlet servlet;
         int refCount;
 
-        public ConnectorRef(Connector connector) {
+        public ConnectorRef(Connector connector, CamelServlet servlet) {
             this.connector = connector;
+            this.servlet = servlet;
             increment();
         }
 
@@ -59,10 +64,11 @@
             return --refCount;
         }
     }
-
-    private CamelServlet camelServlet;
+    
+    private static final Log LOGGER = LogFactory.getLog(JettyHttpComponent.class);
+    
     private Server server;
-    private final HashMap<String, ConnectorRef> connectors = new HashMap<String, ConnectorRef>();
+    private HashMap<String, ConnectorRef> connectors = new HashMap<String, ConnectorRef>();
     private HttpClient httpClient;
     private String sslKeyPassword;
     private String sslPassword;
@@ -87,7 +93,7 @@
 
         // Make sure that there is a connector for the requested endpoint.
         JettyHttpEndpoint endpoint = (JettyHttpEndpoint)consumer.getEndpoint();
-        String connectorKey = endpoint.getProtocol() + ":" + endpoint.getPort();
+        String connectorKey = endpoint.getProtocol() + ":" + endpoint.getHttpUri().getHost() + ":" + endpoint.getPort();
 
         synchronized (connectors) {
             ConnectorRef connectorRef = connectors.get(connectorKey);
@@ -99,26 +105,27 @@
                     connector = new SelectChannelConnector();
                 }
                 connector.setPort(endpoint.getPort());
-                getServer().addConnector(connector);
-                // check the session support
-                if (endpoint.isSessionSupport()) {
-                    enableSessionSupport();
+                connector.setHost(endpoint.getHttpUri().getHost());
+                if ("localhost".equalsIgnoreCase(endpoint.getHttpUri().getHost())) {
+                    LOGGER.warn("You use localhost interface! It means that no external connections will be available. Don't you want to use 0.0.0.0 instead (all network interfaces)?");
                 }
+                getServer().addConnector(connector);
+
+                connectorRef = new ConnectorRef(connector, createServletForConnector(connector));
                 connector.start();
-                connectorRef = new ConnectorRef(connector);
+                
                 connectors.put(connectorKey, connectorRef);
+                
             } else {
                 // ref track the connector
                 connectorRef.increment();
-                // check the session support
-                if (endpoint.isSessionSupport()) {
-                    enableSessionSupport();
-                }
             }
-
+            // check the session support
+            if (endpoint.isSessionSupport()) {
+                enableSessionSupport();
+            }
+            connectorRef.servlet.connect(consumer);
         }
-
-        camelServlet.connect(consumer);
     }
 
     private void enableSessionSupport() throws Exception {
@@ -141,8 +148,6 @@
      */
     @Override
     public void disconnect(HttpConsumer consumer) throws Exception {
-        camelServlet.disconnect(consumer);
-
         // If the connector is not needed anymore then stop it
         HttpEndpoint endpoint = consumer.getEndpoint();
         String connectorKey = endpoint.getProtocol() + ":" + endpoint.getPort();
@@ -150,6 +155,7 @@
         synchronized (connectors) {
             ConnectorRef connectorRef = connectors.get(connectorKey);
             if (connectorRef != null) {
+                connectorRef.servlet.disconnect(consumer);
                 if (connectorRef.decrement() == 0) {
                     getServer().removeConnector(connectorRef.connector);
                     connectorRef.connector.stop();
@@ -215,22 +221,32 @@
         sslSocketConnector = connector;
     }
 
-    // Implementation methods
-    // -------------------------------------------------------------------------
+    protected CamelServlet createServletForConnector(Connector connector) throws Exception {
+        CamelServlet camelServlet = new CamelContinuationServlet();
+        
+        Context context = new Context(server, "/", Context.NO_SECURITY | Context.NO_SESSIONS);
+        context.setConnectorNames(new String[] {connector.getName()});
 
-    protected Server createServer() throws Exception {
-        camelServlet = new CamelContinuationServlet();
-
-        Server server = new Server();
-        Context context = new Context(Context.NO_SECURITY | Context.NO_SESSIONS);
-
-        context.setContextPath("/");
         ServletHolder holder = new ServletHolder();
         holder.setServlet(camelServlet);
         context.addServlet(holder, "/*");
-        server.setHandler(context);
+        connector.start();
+        context.start();
+        
 
+        return camelServlet;
+    }
+    
+    // Implementation methods
+    // -------------------------------------------------------------------------
+
+    protected Server createServer() throws Exception {
+        Server server = new Server();
+        ContextHandlerCollection collection = new ContextHandlerCollection();
+        collection.setServer(server);
+        server.addHandler(collection);
         server.start();
+
         return server;
     }
 

Added: activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/InterfacesTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/InterfacesTest.java?rev=718242&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/InterfacesTest.java (added)
+++ activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/InterfacesTest.java Mon Nov 17 05:18:58 2008
@@ -0,0 +1,74 @@
+package org.apache.camel.component.jetty;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.commons.io.IOUtils;
+
+public class InterfacesTest extends ContextTestSupport {
+    
+    private String remoteInterfaceAddress;
+
+    public InterfacesTest() throws SocketException {
+        // retirieve an address of some remote network interface
+        Enumeration<NetworkInterface> interfaces =  NetworkInterface.getNetworkInterfaces();
+        
+        while(interfaces.hasMoreElements()) {
+            NetworkInterface interfaze = interfaces.nextElement();
+            if (!interfaze.isUp() || interfaze.isLoopback()) {
+                continue;
+            }
+            Enumeration<InetAddress> addresses =  interfaze.getInetAddresses();
+            if(addresses.hasMoreElements()) {
+                remoteInterfaceAddress = addresses.nextElement().getHostAddress();
+            }
+        };
+        
+    }
+    
+    public void testLocalInterfaceHandled() throws IOException, InterruptedException {
+        getMockEndpoint("mock:endpoint").expectedMessageCount(3);
+        
+        URL localUrl = new URL("http://localhost:4567/testRoute");
+        String localResponse = IOUtils.toString(localUrl.openStream());
+        assertEquals("local", localResponse);
+
+        // 127.0.0.1 is an alias of localhost so should work
+        localUrl = new URL("http://127.0.0.1:4568/testRoute");
+        localResponse = IOUtils.toString(localUrl.openStream());
+        assertEquals("local-differentPort", localResponse);
+        
+        URL url = new URL("http://" + remoteInterfaceAddress + ":4567/testRoute");
+        String remoteResponse = IOUtils.toString(url.openStream());
+        assertEquals("remote", remoteResponse);
+        
+        assertMockEndpointsSatisfied();
+    }
+    
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+        
+            @Override
+            public void configure() throws Exception {
+                from("jetty:http://localhost:4567/testRoute")
+                    .setBody().constant("local")
+                    .to("mock:endpoint");
+                
+                from("jetty:http://localhost:4568/testRoute")
+                    .setBody().constant("local-differentPort")
+                    .to("mock:endpoint");
+                
+                from("jetty:http://" + remoteInterfaceAddress + ":4567/testRoute")
+                    .setBody().constant("remote")
+                    .to("mock:endpoint");
+            }
+        };
+    }
+}

Propchange: activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/InterfacesTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain