You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/02/07 15:03:14 UTC

svn commit: r1443485 - in /camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet: ./ osgi/

Author: davsclaus
Date: Thu Feb  7 14:03:14 2013
New Revision: 1443485

URL: http://svn.apache.org/viewvc?rev=1443485&view=rev
Log:
CAMEL-5206: Duplicate ServetlName now detected and fail to start servlet if detected. This can be an issue when people use shared bootstrap lib for sharing Camel JARs in a container such as Tomcat.

Added:
    camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletConsumer.java   (with props)
Modified:
    camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java
    camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/DefaultHttpRegistry.java
    camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/HttpRegistry.java
    camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
    camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
    camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/osgi/OsgiServletRegisterer.java

Modified: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java?rev=1443485&r1=1443484&r2=1443485&view=diff
==============================================================================
--- camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java (original)
+++ camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java Thu Feb  7 14:03:14 2013
@@ -21,6 +21,7 @@ import javax.servlet.ServletException;
 
 import org.apache.camel.component.http.CamelServlet;
 import org.apache.camel.component.http.HttpConsumer;
+import org.apache.camel.converter.ObjectConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,20 +33,53 @@ public class CamelHttpTransportServlet e
     private static final transient Logger LOG = LoggerFactory.getLogger(CamelHttpTransportServlet.class);
 
     private HttpRegistry httpRegistry;
+    private boolean ignoreDuplicateServletName;
 
     @Override
     public void init(ServletConfig config) throws ServletException {
         super.init(config);
+
+        String ignore = config.getInitParameter("ignoreDuplicateServletName");
+        Boolean bool = ObjectConverter.toBoolean(ignore);
+        if (bool != null) {
+            ignoreDuplicateServletName = bool;
+        } else {
+            // always log so people can see it easier
+            String msg = "Invalid parameter value for init-parameter ignoreDuplicateServletName with value: " + ignore;
+            LOG.error(msg);
+            throw new ServletException(msg);
+        }
+
+        String name = config.getServletName();
+        String contextPath = config.getServletContext().getContextPath();
+
         if (httpRegistry == null) {
-            httpRegistry = DefaultHttpRegistry.getSingletonHttpRegistry();
+            httpRegistry = DefaultHttpRegistry.getHttpRegistry(name);
+            CamelServlet existing = httpRegistry.getCamelServlet(name);
+            if (existing != null) {
+                String msg = "Duplicate ServetName detected: " + name + ". Existing: " + existing + " This: " + this.toString()
+                        + ". Its advised to use unique ServletName per Camel application.";
+                // always log so people can see it easier
+                if (isIgnoreDuplicateServletName()) {
+                    LOG.warn(msg);
+                } else {
+                    LOG.error(msg);
+                    throw new ServletException(msg);
+                }
+            }
+            httpRegistry.register(this);
         }
-        httpRegistry.register(this);
-        LOG.info("Initialized CamelHttpTransportServlet[{}]", getServletName());
+
+        LOG.info("Initialized CamelHttpTransportServlet[name={}, contextPath={}]", getServletName(), contextPath);
     }
     
     @Override
     public void destroy() {
-        httpRegistry.unregister(this);
+        DefaultHttpRegistry.removeHttpRegistry(getServletName());
+        if (httpRegistry != null) {
+            httpRegistry.unregister(this);
+            httpRegistry = null;
+        }
         LOG.info("Destroyed CamelHttpTransportServlet[{}]", getServletName());
     }
     
@@ -65,5 +99,13 @@ public class CamelHttpTransportServlet e
         }
     }
 
+    public boolean isIgnoreDuplicateServletName() {
+        return ignoreDuplicateServletName;
+    }
+
+    @Override
+    public String toString() {
+        return "CamelHttpTransportServlet[name=" + getServletName() + ", contextPath=" + getServletConfig().getServletContext().getContextPath() + "]";
+    }
 }
 

Modified: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/DefaultHttpRegistry.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/DefaultHttpRegistry.java?rev=1443485&r1=1443484&r2=1443485&view=diff
==============================================================================
--- camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/DefaultHttpRegistry.java (original)
+++ camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/DefaultHttpRegistry.java Thu Feb  7 14:03:14 2013
@@ -16,11 +16,11 @@
  */
 package org.apache.camel.component.servlet;
 
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
 import javax.servlet.Servlet;
 
 import org.apache.camel.component.http.CamelServlet;
@@ -31,30 +31,40 @@ import org.slf4j.LoggerFactory;
 public class DefaultHttpRegistry implements HttpRegistry {
     private static final transient Logger LOG = LoggerFactory.getLogger(DefaultHttpRegistry.class);
 
-    private static HttpRegistry singleton;
+    private static Map<String, HttpRegistry> registries = new HashMap<String, HttpRegistry>();
     
     private final Set<HttpConsumer> consumers;
     private final Set<CamelServlet> providers;
-    
+
     public DefaultHttpRegistry() {
         consumers = new HashSet<HttpConsumer>();
         providers = new HashSet<CamelServlet>();
     }
     
     /**
-     * Lookup or create a HttpRegistry
+     * Lookup or create a new registry if none exists with the given name
      */
-    public static synchronized HttpRegistry getSingletonHttpRegistry() {
-        if (singleton == null) {
-            singleton = new DefaultHttpRegistry();
+    public static synchronized HttpRegistry getHttpRegistry(String name) {
+        HttpRegistry answer = registries.get(name);
+        if (answer == null) {
+            answer = new DefaultHttpRegistry();
+            registries.put(name, answer);
         }
-        return singleton;
+        return answer;
+    }
+
+    /**
+     * Removes the http registry with the given name
+     */
+    public static synchronized void removeHttpRegistry(String name) {
+        registries.remove(name);
     }
     
     @Override
     public void register(HttpConsumer consumer) {
-        LOG.debug("Registering consumer for path {} providers present: {}",
-                consumer.getPath(), providers.size());
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Registering consumer for path {} providers present: {}", consumer.getPath(), providers.size());
+        }
         consumers.add(consumer);
         for (CamelServlet provider : providers) {
             provider.connect(consumer);
@@ -63,7 +73,9 @@ public class DefaultHttpRegistry impleme
     
     @Override
     public void unregister(HttpConsumer consumer) {
-        LOG.debug("Unregistering consumer for path {} ", consumer.getPath());
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Unregistering consumer for path {}", consumer.getPath());
+        }
         consumers.remove(consumer);
         for (CamelServlet provider : providers) {
             provider.disconnect(consumer);
@@ -72,7 +84,6 @@ public class DefaultHttpRegistry impleme
     
     @SuppressWarnings("rawtypes")
     public void register(CamelServlet provider, Map properties) {
-        LOG.debug("Registering provider through OSGi service listener {}", properties);
         CamelServlet camelServlet = provider;
         camelServlet.setServletName((String) properties.get("servlet-name"));
         register(camelServlet);
@@ -84,8 +95,9 @@ public class DefaultHttpRegistry impleme
     
     @Override
     public void register(CamelServlet provider) {
-        LOG.debug("Registering CamelServlet with name {} consumers present: {}", 
-                provider.getServletName(), consumers.size());
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Registering CamelServlet with name {} consumers present: {}", provider.getServletName(), consumers.size());
+        }
         providers.add(provider);
         for (HttpConsumer consumer : consumers) {
             provider.connect(consumer);
@@ -94,9 +106,22 @@ public class DefaultHttpRegistry impleme
 
     @Override
     public void unregister(CamelServlet provider) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Unregistering CamelServlet with name {}", provider.getServletName());
+        }
         providers.remove(provider);
     }
-    
+
+    @Override
+    public CamelServlet getCamelServlet(String servletName) {
+        for (CamelServlet provider : providers) {
+            if (provider.getServletName().equals(servletName)) {
+                return provider;
+            }
+        }
+        return null;
+    }
+
     public void setServlets(List<Servlet> servlets) {
         providers.clear();
         for (Servlet servlet : servlets) {

Modified: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/HttpRegistry.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/HttpRegistry.java?rev=1443485&r1=1443484&r2=1443485&view=diff
==============================================================================
--- camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/HttpRegistry.java (original)
+++ camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/HttpRegistry.java Thu Feb  7 14:03:14 2013
@@ -40,4 +40,6 @@ public interface HttpRegistry {
 
     void unregister(CamelServlet provider);
 
+    CamelServlet getCamelServlet(String servletName);
+
 }
\ No newline at end of file

Modified: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java?rev=1443485&r1=1443484&r2=1443485&view=diff
==============================================================================
--- camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java (original)
+++ camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletComponent.java Thu Feb  7 14:03:14 2013
@@ -37,7 +37,6 @@ import org.apache.commons.httpclient.par
 public class ServletComponent extends HttpComponent {
 
     private String servletName = "CamelServlet";
-    private HttpRegistry httpRegistry;
 
     public String getServletName() {
         return servletName;
@@ -47,16 +46,8 @@ public class ServletComponent extends Ht
         this.servletName = servletName;
     }
 
-    public void setHttpRegistry(HttpRegistry httpRegistry) {
-        this.httpRegistry = httpRegistry;
-    }
-
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
-        if (httpRegistry == null) {
-            httpRegistry = DefaultHttpRegistry.getSingletonHttpRegistry();
-        }
-
         HttpClientParams params = new HttpClientParams();
         IntrospectionSupport.setProperties(params, parameters, "httpClient.");
 
@@ -125,12 +116,18 @@ public class ServletComponent extends Ht
 
     @Override
     public void connect(HttpConsumer consumer) throws Exception {
-        httpRegistry.register(consumer);
+        ServletConsumer sc = (ServletConsumer) consumer;
+        String name = sc.getEndpoint().getServletName();
+        HttpRegistry registry = DefaultHttpRegistry.getHttpRegistry(name);
+        registry.register(consumer);
     }
 
     @Override
     public void disconnect(HttpConsumer consumer) throws Exception {
-        httpRegistry.unregister(consumer);
+        ServletConsumer sc = (ServletConsumer) consumer;
+        String name = sc.getEndpoint().getServletName();
+        HttpRegistry registry = DefaultHttpRegistry.getHttpRegistry(name);
+        registry.unregister(consumer);
     }
 
 }
\ No newline at end of file

Added: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletConsumer.java?rev=1443485&view=auto
==============================================================================
--- camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletConsumer.java (added)
+++ camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletConsumer.java Thu Feb  7 14:03:14 2013
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.servlet;
+
+import org.apache.camel.Processor;
+import org.apache.camel.component.http.HttpConsumer;
+
+/**
+ *
+ */
+public class ServletConsumer extends HttpConsumer {
+
+    public ServletConsumer(ServletEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+    }
+
+    @Override
+    public ServletEndpoint getEndpoint() {
+        return (ServletEndpoint) super.getEndpoint();
+    }
+}

Propchange: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletConsumer.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java?rev=1443485&r1=1443484&r2=1443485&view=diff
==============================================================================
--- camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java (original)
+++ camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletEndpoint.java Thu Feb  7 14:03:14 2013
@@ -23,7 +23,6 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.http.HttpClientConfigurer;
-import org.apache.camel.component.http.HttpConsumer;
 import org.apache.camel.component.http.HttpEndpoint;
 import org.apache.commons.httpclient.HttpConnectionManager;
 import org.apache.commons.httpclient.params.HttpClientParams;
@@ -55,7 +54,7 @@ public class ServletEndpoint extends Htt
 
     @Override
     public Consumer createConsumer(Processor processor) throws Exception {
-        return new HttpConsumer(this, processor);
+        return new ServletConsumer(this, processor);
     }
 
     @Override

Modified: camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/osgi/OsgiServletRegisterer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/osgi/OsgiServletRegisterer.java?rev=1443485&r1=1443484&r2=1443485&view=diff
==============================================================================
--- camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/osgi/OsgiServletRegisterer.java (original)
+++ camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/osgi/OsgiServletRegisterer.java Thu Feb  7 14:03:14 2013
@@ -59,6 +59,7 @@ public class OsgiServletRegisterer {
     public void setHttpService(HttpService httpService) {
         this.httpService = httpService;
     }
+
     public void setAlias(String alias) {
         this.alias = alias;
     }
@@ -66,6 +67,7 @@ public class OsgiServletRegisterer {
     public void setServletName(String servletName) {
         this.servletName = servletName;
     }
+
     public void setServlet(HttpServlet servlet) {
         this.servlet = servlet;
     }