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;
}