[maven-release-plugin] copy for tag camel-2.10.0
git-svn-id: https://svn.apache.org/repos/asf/camel/tags/camel-2.10.0@1354763 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ThreadPoolBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ThreadPoolBuilder.java
index e4e2065..52acdb2 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ThreadPoolBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ThreadPoolBuilder.java
@@ -17,6 +17,7 @@
package org.apache.camel.builder;
import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.camel.CamelContext;
@@ -103,4 +104,37 @@
return context.getExecutorServiceManager().newThreadPool(source, name, profile);
}
+ /**
+ * Builds the new scheduled thread pool
+ *
+ * @return the created scheduled thread pool
+ * @throws Exception is thrown if error building the scheduled thread pool
+ */
+ public ScheduledExecutorService buildScheduled() throws Exception {
+ return buildScheduled(null, null);
+ }
+
+ /**
+ * Builds the new scheduled thread pool
+ *
+ * @param name name which is appended to the thread name
+ * @return the created scheduled thread pool
+ * @throws Exception is thrown if error building the scheduled thread pool
+ */
+ public ScheduledExecutorService buildScheduled(String name) throws Exception {
+ return buildScheduled(null, name);
+ }
+
+ /**
+ * Builds the new scheduled thread pool
+ *
+ * @param source the source object, usually it should be <tt>this</tt> passed in as parameter
+ * @param name name which is appended to the thread name
+ * @return the created scheduled thread pool
+ * @throws Exception is thrown if error building the scheduled thread pool
+ */
+ public ScheduledExecutorService buildScheduled(Object source, String name) throws Exception {
+ return context.getExecutorServiceManager().newScheduledThreadPool(source, name, profile);
+ }
+
}
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index ce83e10..c8b6a19 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -113,7 +113,6 @@
import org.apache.camel.spi.RouteStartupOrder;
import org.apache.camel.spi.ServicePool;
import org.apache.camel.spi.ShutdownStrategy;
-import org.apache.camel.spi.ThreadPoolProfile;
import org.apache.camel.spi.TypeConverterRegistry;
import org.apache.camel.spi.UuidGenerator;
import org.apache.camel.support.ServiceSupport;
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
index 9ccfd4b..670664b 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
@@ -41,7 +41,7 @@
public abstract class ScheduledPollConsumer extends DefaultConsumer implements Runnable, SuspendableService, PollingConsumerPollingStrategy {
private static final transient Logger LOG = LoggerFactory.getLogger(ScheduledPollConsumer.class);
- private ScheduledExecutorService executor;
+ private ScheduledExecutorService scheduledExecutorService;
private boolean shutdownExecutor;
private ScheduledFuture<?> future;
@@ -60,12 +60,12 @@
super(endpoint, processor);
}
- public ScheduledPollConsumer(Endpoint endpoint, Processor processor, ScheduledExecutorService executor) {
+ public ScheduledPollConsumer(Endpoint endpoint, Processor processor, ScheduledExecutorService scheduledExecutorService) {
super(endpoint, processor);
// we have been given an existing thread pool, so we should not manage its lifecycle
// so we should keep shutdownExecutor as false
- this.executor = executor;
- ObjectHelper.notNull(executor, "executor");
+ this.scheduledExecutorService = scheduledExecutorService;
+ ObjectHelper.notNull(scheduledExecutorService, "scheduledExecutorService");
}
/**
@@ -283,6 +283,23 @@
return sendEmptyMessageWhenIdle;
}
+ public ScheduledExecutorService getScheduledExecutorService() {
+ return scheduledExecutorService;
+ }
+
+ /**
+ * Sets a custom shared {@link ScheduledExecutorService} to use as thread pool
+ * <p/>
+ * <b>Notice: </b> When using a custom thread pool, then the lifecycle of this thread
+ * pool is not controlled by this consumer (eg this consumer will not start/stop the thread pool
+ * when the consumer is started/stopped etc.)
+ *
+ * @param scheduledExecutorService the custom thread pool to use
+ */
+ public void setScheduledExecutorService(ScheduledExecutorService scheduledExecutorService) {
+ this.scheduledExecutorService = scheduledExecutorService;
+ }
+
// Implementation methods
// -------------------------------------------------------------------------
@@ -299,15 +316,15 @@
super.doStart();
// if no existing executor provided, then create a new thread pool ourselves
- if (executor == null) {
+ if (scheduledExecutorService == null) {
// we only need one thread in the pool to schedule this task
- this.executor = getEndpoint().getCamelContext().getExecutorServiceManager()
+ this.scheduledExecutorService = getEndpoint().getCamelContext().getExecutorServiceManager()
.newScheduledThreadPool(this, getEndpoint().getEndpointUri(), 1);
// and we should shutdown the thread pool when no longer needed
this.shutdownExecutor = true;
}
- ObjectHelper.notNull(executor, "executor", this);
+ ObjectHelper.notNull(scheduledExecutorService, "scheduledExecutorService", this);
ObjectHelper.notNull(pollStrategy, "pollStrategy", this);
if (isStartScheduler()) {
@@ -321,13 +338,13 @@
LOG.debug("Scheduling poll (fixed delay) with initialDelay: {}, delay: {} ({}) for: {}",
new Object[]{getInitialDelay(), getDelay(), getTimeUnit().name().toLowerCase(Locale.ENGLISH), getEndpoint()});
}
- future = executor.scheduleWithFixedDelay(this, getInitialDelay(), getDelay(), getTimeUnit());
+ future = scheduledExecutorService.scheduleWithFixedDelay(this, getInitialDelay(), getDelay(), getTimeUnit());
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("Scheduling poll (fixed rate) with initialDelay: {}, delay: {} ({}) for: {}",
new Object[]{getInitialDelay(), getDelay(), getTimeUnit().name().toLowerCase(Locale.ENGLISH), getEndpoint()});
}
- future = executor.scheduleAtFixedRate(this, getInitialDelay(), getDelay(), getTimeUnit());
+ future = scheduledExecutorService.scheduleAtFixedRate(this, getInitialDelay(), getDelay(), getTimeUnit());
}
}
@@ -342,9 +359,9 @@
@Override
protected void doShutdown() throws Exception {
- if (shutdownExecutor && executor != null) {
- getEndpoint().getCamelContext().getExecutorServiceManager().shutdownNow(executor);
- executor = null;
+ if (shutdownExecutor && scheduledExecutorService != null) {
+ getEndpoint().getCamelContext().getExecutorServiceManager().shutdownNow(scheduledExecutorService);
+ scheduledExecutorService = null;
future = null;
}
super.doShutdown();
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
index 4aa4337..1d4aa85 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
@@ -62,13 +62,14 @@
Object pollStrategy = options.remove("pollStrategy");
Object runLoggingLevel = options.remove("runLoggingLevel");
Object sendEmptyMessageWhenIdle = options.remove("sendEmptyMessageWhenIdle");
+ Object scheduledExecutorService = options.remove("scheduledExecutorService");
boolean setConsumerProperties = false;
// the following is split into two if statements to satisfy the checkstyle max complexity constraint
if (initialDelay != null || delay != null || timeUnit != null || useFixedDelay != null || pollStrategy != null) {
setConsumerProperties = true;
}
- if (runLoggingLevel != null || startScheduler != null || sendEmptyMessageWhenIdle != null) {
+ if (runLoggingLevel != null || startScheduler != null || sendEmptyMessageWhenIdle != null || scheduledExecutorService != null) {
setConsumerProperties = true;
}
@@ -101,6 +102,9 @@
if (sendEmptyMessageWhenIdle != null) {
consumerProperties.put("sendEmptyMessageWhenIdle", sendEmptyMessageWhenIdle);
}
+ if (scheduledExecutorService != null) {
+ consumerProperties.put("scheduledExecutorService", scheduledExecutorService);
+ }
}
}
diff --git a/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java b/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
index a3f1d71..0ce036e 100644
--- a/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
+++ b/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
@@ -19,6 +19,7 @@
import java.util.List;
import java.util.Map;
+import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
import org.apache.camel.Expression;
@@ -37,28 +38,41 @@
/**
* Evaluates an expression using a bean method invocation
- *
- * @version
*/
public class BeanExpression implements Expression, Predicate {
- private Object bean;
- private String beanName;
- private Class<?> type;
- private String method;
+ private final Object bean;
+ private final String beanName;
+ private final Class<?> type;
+ private final String method;
+ private volatile BeanHolder beanHolder;
public BeanExpression(Object bean, String method) {
this.bean = bean;
this.method = method;
+ this.beanName = null;
+ this.type = null;
}
public BeanExpression(String beanName, String method) {
this.beanName = beanName;
this.method = method;
+ this.bean = null;
+ this.type = null;
}
public BeanExpression(Class<?> type, String method) {
this.type = type;
this.method = method;
+ this.bean = null;
+ this.beanName = null;
+ }
+
+ public BeanExpression(BeanHolder beanHolder, String method) {
+ this.beanHolder = beanHolder;
+ this.method = method;
+ this.bean = null;
+ this.beanName = null;
+ this.type = null;
}
@Override
@@ -79,16 +93,10 @@
}
public Object evaluate(Exchange exchange) {
- // either use registry lookup or a constant bean
- BeanHolder holder;
- if (bean != null) {
- holder = new ConstantBeanHolder(bean, exchange.getContext());
- } else if (beanName != null) {
- holder = new RegistryBean(exchange.getContext(), beanName);
- } else if (type != null) {
- holder = new ConstantTypeBeanHolder(type, exchange.getContext());
- } else {
- throw new IllegalArgumentException("Either bean, beanName or type should be set on " + this);
+
+ // if the bean holder doesn't exist then create it using the context from the exchange
+ if (beanHolder == null) {
+ beanHolder = createBeanHolder(exchange.getContext());
}
// invoking the bean can either be the easy way or using OGNL
@@ -101,7 +109,7 @@
if (OgnlHelper.isValidOgnlExpression(method)) {
// okay the method is an ognl expression
- OgnlInvokeProcessor ognl = new OgnlInvokeProcessor(holder, method);
+ OgnlInvokeProcessor ognl = new OgnlInvokeProcessor(beanHolder, method);
try {
ognl.process(exchange);
return ognl.getResult();
@@ -110,7 +118,7 @@
}
} else {
// regular non ognl invocation
- InvokeProcessor invoke = new InvokeProcessor(holder, method);
+ InvokeProcessor invoke = new InvokeProcessor(beanHolder, method);
try {
invoke.process(exchange);
return invoke.getResult();
@@ -131,6 +139,25 @@
}
/**
+ * Optimize to create the bean holder once, so we can reuse it for further
+ * evaluation, which is faster.
+ */
+ private synchronized BeanHolder createBeanHolder(CamelContext context) {
+ // either use registry lookup or a constant bean
+ BeanHolder holder;
+ if (bean != null) {
+ holder = new ConstantBeanHolder(bean, context);
+ } else if (beanName != null) {
+ holder = new RegistryBean(context, beanName);
+ } else if (type != null) {
+ holder = new ConstantTypeBeanHolder(type, context);
+ } else {
+ throw new IllegalArgumentException("Either bean, beanName or type should be set on " + this);
+ }
+ return holder;
+ }
+
+ /**
* Invokes a given bean holder. The method name is optional.
*/
private final class InvokeProcessor implements Processor {
diff --git a/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java b/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java
index eab5bc2..3fa3c9f 100644
--- a/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java
@@ -43,7 +43,7 @@
*/
@XmlRootElement(name = "wireTap")
@XmlAccessorType(XmlAccessType.FIELD)
-public class WireTapDefinition<Type extends ProcessorDefinition<Type>> extends NoOutputDefinition<Type> implements ExecutorServiceAwareDefinition<WireTapDefinition<Type>> {
+public class WireTapDefinition<Type extends ProcessorDefinition<Type>> extends NoOutputDefinition<WireTapDefinition<Type>> implements ExecutorServiceAwareDefinition<WireTapDefinition<Type>> {
@XmlAttribute
protected String uri;
@XmlAttribute
diff --git a/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java b/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
index bfb2450..d888755 100644
--- a/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
+++ b/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
@@ -28,6 +28,8 @@
import org.apache.camel.Predicate;
import org.apache.camel.component.bean.BeanHolder;
import org.apache.camel.component.bean.BeanInfo;
+import org.apache.camel.component.bean.ConstantBeanHolder;
+import org.apache.camel.component.bean.ConstantTypeBeanHolder;
import org.apache.camel.component.bean.MethodNotFoundException;
import org.apache.camel.component.bean.RegistryBean;
import org.apache.camel.language.bean.BeanExpression;
@@ -38,7 +40,7 @@
* For expressions and predicates using the
* <a href="http://camel.apache.org/bean-language.html">bean language</a>
*
- * @version
+ * @version
*/
@XmlRootElement(name = "method")
@XmlAccessorType(XmlAccessType.FIELD)
@@ -68,11 +70,11 @@
super(beanName);
this.method = method;
}
-
+
public MethodCallExpression(Object instance) {
this(instance, null);
}
-
+
public MethodCallExpression(Object instance, String method) {
super(ObjectHelper.className(instance));
// must use setter as they have special logic
@@ -83,7 +85,7 @@
public MethodCallExpression(Class<?> type) {
this(type, null);
}
-
+
public MethodCallExpression(Class<?> type, String method) {
super(type.getName());
this.beanType = type;
@@ -162,25 +164,30 @@
}
}
+ BeanHolder holder;
if (beanType != null) {
// create a bean if there is a default public no-arg constructor
if (ObjectHelper.hasDefaultPublicNoArgConstructor(beanType)) {
instance = camelContext.getInjector().newInstance(beanType);
- answer = new BeanExpression(instance, getMethod());
+ holder = new ConstantBeanHolder(instance, camelContext);
} else {
- answer = new BeanExpression(beanType, getMethod());
+ holder = new ConstantTypeBeanHolder(beanType, camelContext);
}
} else if (instance != null) {
- answer = new BeanExpression(instance, getMethod());
+ holder = new ConstantBeanHolder(instance, camelContext);
} else {
String ref = beanName();
// if its a ref then check that the ref exists
- BeanHolder holder = new RegistryBean(camelContext, ref);
+ BeanHolder regHolder = new RegistryBean(camelContext, ref);
// get the bean which will check that it exists
- instance = holder.getBean();
- answer = new BeanExpression(instance, getMethod());
+ instance = regHolder.getBean();
+ holder = new ConstantBeanHolder(instance, camelContext);
}
+ // create answer using the holder
+ answer = new BeanExpression(holder, getMethod());
+
+ // and do sanity check that if a method name was given, that it exists
validateHasMethod(camelContext, instance, beanType, getMethod());
return answer;
}
diff --git a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
index 1e1df1b..0b336bc 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
@@ -112,7 +112,7 @@
// Properties
// -----------------------------------------------------------------------
- public synchronized Schema getSchema() throws IOException, SAXException {
+ public Schema getSchema() throws IOException, SAXException {
if (schema == null) {
schema = createSchema();
}
@@ -131,7 +131,7 @@
this.schemaLanguage = schemaLanguage;
}
- public synchronized Source getSchemaSource() throws IOException {
+ public Source getSchemaSource() throws IOException {
if (schemaSource == null) {
schemaSource = createSchemaSource();
}
@@ -158,7 +158,7 @@
this.schemaFile = schemaFile;
}
- public synchronized SchemaFactory getSchemaFactory() {
+ public SchemaFactory getSchemaFactory() {
if (schemaFactory == null) {
schemaFactory = createSchemaFactory();
}
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/BaseSSLContextParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/BaseSSLContextParameters.java
index 8484750..f92d815 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/BaseSSLContextParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/BaseSSLContextParameters.java
@@ -68,6 +68,20 @@
private static final Logger LOG = LoggerFactory.getLogger(BaseSSLContextParameters.class);
+ private static final String LS = System.getProperty("line.separator");
+
+ private static final String SSL_ENGINE_CIPHER_SUITE_LOG_MSG = createCipherSuiteLogMessage("SSLEngine");
+
+ private static final String SSL_SOCKET_CIPHER_SUITE_LOG_MSG = createCipherSuiteLogMessage("SSLSocket");
+
+ private static final String SSL_SERVER_SOCKET_CIPHER_SUITE_LOG_MSG = createCipherSuiteLogMessage("SSLServerSocket");
+
+ private static final String SSL_ENGINE_PROTOCOL_LOG_MSG = createProtocolLogMessage("SSLEngine");
+
+ private static final String SSL_SOCKET_PROTOCOL_LOG_MSG = createProtocolLogMessage("SSLSocket");
+
+ private static final String SSL_SERVER_SOCKET_PROTOCOL_LOG_MSG = createProtocolLogMessage("SSLServerSocket");
+
/**
* The optional explicitly configured cipher suites for this configuration.
*/
@@ -242,15 +256,16 @@
* @throws GeneralSecurityException if there is an error configuring the context
*/
protected void configureSSLContext(SSLContext context) throws GeneralSecurityException {
- LOG.trace("Configuring client and server side SSLContext parameters...");
+ LOG.trace("Configuring client and server side SSLContext parameters on SSLContext [{}]...", context);
if (this.getSessionTimeout() != null) {
- LOG.debug("Configuring client and server side SSLContext session timeout: {}", this.getSessionTimeout());
+ LOG.debug("Configuring client and server side SSLContext session timeout on SSLContext [{}] to [{}]",
+ context, this.getSessionTimeout());
this.configureSessionContext(context.getClientSessionContext(), this.getSessionTimeout());
this.configureSessionContext(context.getServerSessionContext(), this.getSessionTimeout());
}
- LOG.trace("Configured client and server side SSLContext parameters.");
+ LOG.trace("Configured client and server side SSLContext parameters on SSLContext [{}].", context);
}
protected FilterParameters getDefaultCipherSuitesFilter() {
@@ -325,7 +340,17 @@
enabledCipherSuitePatterns, defaultEnabledCipherSuitePatterns,
!allowPassthrough);
- LOG.trace("Enabled ChiperSuites: {}", filteredCipherSuites);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(SSL_ENGINE_CIPHER_SUITE_LOG_MSG,
+ new Object[] {engine,
+ enabledCipherSuites,
+ enabledCipherSuitePatterns,
+ engine.getSSLParameters().getCipherSuites(),
+ engine.getEnabledCipherSuites(),
+ defaultEnabledCipherSuitePatterns,
+ filteredCipherSuites});
+ }
+
engine.setEnabledCipherSuites(filteredCipherSuites.toArray(new String[filteredCipherSuites.size()]));
Collection<String> filteredSecureSocketProtocols = BaseSSLContextParameters.this
@@ -334,9 +359,19 @@
enabledSecureSocketProtocolsPatterns, defaultEnabledSecureSocketProtocolsPatterns,
!allowPassthrough);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(SSL_ENGINE_PROTOCOL_LOG_MSG,
+ new Object[] {engine,
+ enabledSecureSocketProtocols,
+ enabledSecureSocketProtocolsPatterns,
+ engine.getSSLParameters().getProtocols(),
+ engine.getEnabledProtocols(),
+ defaultEnabledSecureSocketProtocolsPatterns,
+ filteredSecureSocketProtocols});
+ }
+
engine.setEnabledProtocols(filteredSecureSocketProtocols.toArray(new String[filteredSecureSocketProtocols.size()]));
- LOG.trace("Enabled Protocols: {}", filteredSecureSocketProtocols);
-
+
return engine;
}
};
@@ -482,6 +517,16 @@
Arrays.asList(socket.getEnabledCipherSuites()),
enabledCipherSuitePatterns, defaultEnabledCipherSuitePatterns,
!allowPassthrough);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(SSL_SOCKET_CIPHER_SUITE_LOG_MSG,
+ new Object[] {socket,
+ enabledCipherSuites,
+ enabledCipherSuitePatterns,
+ socket.getSSLParameters().getCipherSuites(),
+ socket.getEnabledCipherSuites(),
+ defaultEnabledCipherSuitePatterns,
+ filteredCipherSuites});
+ }
socket.setEnabledCipherSuites(filteredCipherSuites.toArray(new String[filteredCipherSuites.size()]));
@@ -491,6 +536,17 @@
enabledSecureSocketProtocolsPatterns, defaultEnabledSecureSocketProtocolsPatterns,
!allowPassthrough);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(SSL_SOCKET_PROTOCOL_LOG_MSG,
+ new Object[] {socket,
+ enabledSecureSocketProtocols,
+ enabledSecureSocketProtocolsPatterns,
+ socket.getSSLParameters().getProtocols(),
+ socket.getEnabledProtocols(),
+ defaultEnabledSecureSocketProtocolsPatterns,
+ filteredSecureSocketProtocols});
+ }
+
socket.setEnabledProtocols(filteredSecureSocketProtocols.toArray(new String[filteredSecureSocketProtocols.size()]));
return socket;
}
@@ -561,6 +617,17 @@
enabledCipherSuitePatterns, defaultEnabledCipherSuitePatterns,
!allowPassthrough);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(SSL_SERVER_SOCKET_CIPHER_SUITE_LOG_MSG,
+ new Object[] {socket,
+ enabledCipherSuites,
+ enabledCipherSuitePatterns,
+ socket.getSupportedCipherSuites(),
+ socket.getEnabledCipherSuites(),
+ defaultEnabledCipherSuitePatterns,
+ filteredCipherSuites});
+ }
+
socket.setEnabledCipherSuites(filteredCipherSuites.toArray(new String[filteredCipherSuites.size()]));
Collection<String> filteredSecureSocketProtocols = BaseSSLContextParameters.this
@@ -568,6 +635,17 @@
Arrays.asList(socket.getEnabledProtocols()),
enabledSecureSocketProtocolsPatterns, defaultEnabledSecureSocketProtocolsPatterns,
!allowPassthrough);
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(SSL_SERVER_SOCKET_PROTOCOL_LOG_MSG,
+ new Object[] {socket,
+ enabledSecureSocketProtocols,
+ enabledSecureSocketProtocolsPatterns,
+ socket.getSupportedProtocols(),
+ socket.getEnabledProtocols(),
+ defaultEnabledSecureSocketProtocolsPatterns,
+ filteredSecureSocketProtocols});
+ }
socket.setEnabledProtocols(filteredSecureSocketProtocols.toArray(new String[filteredSecureSocketProtocols.size()]));
return socket;
@@ -732,13 +810,14 @@
public SSLContextDecorator(SSLContextSpiDecorator decorator) {
super(decorator, decorator.getDelegate().getProvider(), decorator.getDelegate().getProtocol());
+ LOG.debug("SSLContextDecorator [{}] decorating SSLContext [{}].", this, decorator.getDelegate());
}
@Override
public String toString() {
- return String.format("SSLContext[provider=%s, protocol=%s, needClientAuth=%s, "
+ return String.format("SSLContext[hash=%h, provider=%s, protocol=%s, needClientAuth=%s, "
+ "wantClientAuth=%s\n\tdefaultProtocols=%s\n\tdefaultChiperSuites=%s\n\tsupportedProtocols=%s\n\tsupportedChiperSuites=%s\n]",
- getProvider(), getProtocol(), getDefaultSSLParameters().getNeedClientAuth(), getDefaultSSLParameters().getWantClientAuth(),
+ hashCode(), getProvider(), getProtocol(), getDefaultSSLParameters().getNeedClientAuth(), getDefaultSSLParameters().getWantClientAuth(),
collectionAsCommaDelimitedString(getDefaultSSLParameters().getProtocols()),
collectionAsCommaDelimitedString(getDefaultSSLParameters().getCipherSuites()),
collectionAsCommaDelimitedString(getSupportedSSLParameters().getProtocols()),
@@ -776,6 +855,7 @@
@Override
protected SSLEngine engineCreateSSLEngine() {
SSLEngine engine = this.context.createSSLEngine();
+ LOG.debug("SSLEngine [{}] created from SSLContext [{}].", engine, context);
this.configureSSLEngine(engine);
return engine;
}
@@ -783,6 +863,7 @@
@Override
protected SSLEngine engineCreateSSLEngine(String peerHost, int peerPort) {
SSLEngine engine = this.context.createSSLEngine(peerHost, peerPort);
+ LOG.debug("SSLEngine [{}] created from SSLContext [{}].", engine, context);
return this.configureSSLEngine(engine);
}
@@ -799,12 +880,14 @@
@Override
protected SSLServerSocketFactory engineGetServerSocketFactory() {
SSLServerSocketFactory factory = this.context.getServerSocketFactory();
+ LOG.debug("SSLServerSocketFactoryEngine [{}] created from SSLContext [{}].", factory, context);
return this.configureSSLServerSocketFactory(factory);
}
@Override
protected SSLSocketFactory engineGetSocketFactory() {
- SSLSocketFactory factory = this.context.getSocketFactory();
+ SSLSocketFactory factory = this.context.getSocketFactory();
+ LOG.debug("SSLSocketFactory [{}] created from SSLContext [{}].", factory, context);
return this.configureSSLSocketFactory(factory);
}
@@ -932,6 +1015,8 @@
private ServerSocket configureSocket(ServerSocket s) {
SSLServerSocket workingSocket = (SSLServerSocket) s;
+
+ LOG.debug("Created ServerSocket [{}] from SslServerSocketFactory [{}].", s, sslServerSocketFactory);
for (Configurer<SSLServerSocket> configurer : this.sslServerSocketConfigurers) {
workingSocket = configurer.configure(workingSocket);
@@ -1006,6 +1091,8 @@
private Socket configureSocket(Socket s) {
SSLSocket workingSocket = (SSLSocket) s;
+
+ LOG.debug("Created Socket [{}] from SocketFactory [{}].", s, sslSocketFactory);
for (Configurer<SSLSocket> configurer : this.sslSocketConfigurers) {
workingSocket = configurer.configure(workingSocket);
@@ -1015,4 +1102,23 @@
}
}
+ private static String createCipherSuiteLogMessage(String entityName) {
+ return "Configuring " + entityName + " [{}] with " + LS
+ + "\t explicitly set cipher suites [{}]," + LS
+ + "\t cipher suite patterns [{}]," + LS
+ + "\t available cipher suites [{}]," + LS
+ + "\t currently enabled cipher suites [{}]," + LS
+ + "\t and default cipher suite patterns [{}]." + LS
+ + "\t Resulting enabled cipher suites are [{}].";
+ }
+
+ private static String createProtocolLogMessage(String entityName) {
+ return "Configuring " + entityName + " [{}] with " + LS
+ + "\t explicitly set protocols [{}]," + LS
+ + "\t protocol patterns [{}]," + LS
+ + "\t available protocols [{}]," + LS
+ + "\t currently enabled protocols [{}]," + LS
+ + "\t and default protocol patterns [{}]." + LS
+ + "\t Resulting enabled protocols are [{}].";
+ }
}
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/FilterParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/FilterParameters.java
index 74974fd..409fb78 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/FilterParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/FilterParameters.java
@@ -126,7 +126,18 @@
public List<Pattern> getExcludes() {
return excludes;
- }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Patterns [includes=");
+ builder.append(includes);
+ builder.append(", excludes=");
+ builder.append(excludes);
+ builder.append("]");
+ return builder.toString();
+ }
}
@Override
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/JsseParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/JsseParameters.java
index a8ebba2..4b08b18 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/JsseParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/JsseParameters.java
@@ -121,54 +121,60 @@
InputStream is = null;
try {
- LOG.trace("Trying to open resource as a file.");
+ LOG.trace("Trying to open resource [{}] as a file.", resource);
is = new FileInputStream(resource);
- LOG.debug("Loaded resource as file {}", resource);
+ LOG.debug("Opened resource [{}] as a file.", resource);
} catch (FileNotFoundException e) {
- LOG.trace("Could not open resource as a file.", e);
+ LOG.trace("Could not open resource [" + resource + "] as a file.", e);
}
if (is == null && Thread.currentThread().getContextClassLoader() != null) {
- LOG.trace("Trying to open resource as a class path resource with the TCCL {}.",
- Thread.currentThread().getContextClassLoader());
+ LOG.trace("Trying to open resource [{}] as a class path resource with the TCCL [{}].",
+ resource, Thread.currentThread().getContextClassLoader());
is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
+
if (is == null) {
- LOG.trace("Could not open resource as a class path resource using the TCCL {}.",
- Thread.currentThread().getContextClassLoader());
+ LOG.trace("Could not open resource [{}] as a class path resource using the TCCL [{}].",
+ resource, Thread.currentThread().getContextClassLoader());
} else {
- LOG.debug("Loaded resource from TCCL ClassLoader {}", resource);
+ LOG.debug("Opened resource [{}] as a class path resource with the TCCL [{}].",
+ resource, Thread.currentThread().getContextClassLoader());
}
}
if (is == null) {
- LOG.trace("Trying to open resource as a class path resource using the classloader {}.",
+ LOG.trace("Trying to open resource [{}] as a class path resource using the classloader [{}].",
this.getClass().getClassLoader());
is = this.getClass().getResourceAsStream(resource);
+
if (is == null) {
- LOG.trace("Could not open resource as a class path resource using the classloader {}.",
- this.getClass().getClassLoader());
+ LOG.trace("Could not open resource [{}] as a class path resource using the classloader [{}].",
+ resource, this.getClass().getClassLoader());
} else {
- LOG.debug("Loaded resource from JsseParameter ClassLoader {}", resource);
+ LOG.debug("Opened resource [{}] as a class path resource with the classloader [{}].",
+ resource, this.getClass().getClassLoader());
}
}
if (is == null) {
try {
- LOG.trace("Trying to open resource as a URL.");
+ LOG.trace("Trying to open resource [{}] as a URL.", resource);
is = new URL(resource).openStream();
- LOG.debug("Loaded resource as URL {}", resource);
+ LOG.debug("Opened resource [{}] as a URL.", resource);
} catch (IOException e) {
- LOG.trace("Could not open resource as a URL", e);
+ LOG.trace("Could not open resource [" + resource + "] as a URL.", e);
}
}
if (is == null && this.context != null) {
- LOG.trace("Trying to open resource using the CamelContext ClassResolver {}", context.getClassResolver());
+ LOG.trace("Trying to open resource using the CamelContext ClassResolver [{}].", context.getClassResolver());
is = context.getClassResolver().loadResourceAsStream(resource);
if (is == null) {
- LOG.trace("Could not to open resource using the CamelContext ClassResolver {}.", context.getClassResolver());
+ LOG.trace("Could not to open resource [{}] using the CamelContext ClassResolver [{}].",
+ resource, context.getClassResolver());
} else {
- LOG.debug("Loaded resource using the CamelContext ClassResolver {}", resource);
+ LOG.debug("Opened resource [{}] using the CamelContext ClassResolver [{}].",
+ resource, this.getClass().getClassLoader());
}
}
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/KeyManagersParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/KeyManagersParameters.java
index 8474b0d..6db4d1f 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/KeyManagersParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/KeyManagersParameters.java
@@ -81,10 +81,10 @@
*/
public KeyManager[] createKeyManagers() throws GeneralSecurityException, IOException {
- LOG.debug("Creating KeyManager[] from KeyManagersParameters: {}", this);
+ LOG.trace("Creating KeyManager[] from KeyManagersParameters [{}].", this);
KeyManager[] keyManagers;
-
+
String kmfAlgorithm = this.parsePropertyValue(this.getAlgorithm());
if (kmfAlgorithm == null) {
kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
@@ -96,7 +96,9 @@
} else {
kmf = KeyManagerFactory.getInstance(kmfAlgorithm, this.parsePropertyValue(this.getProvider()));
}
-
+
+ LOG.debug("KeyManagerFactory [{}], initialized from [{}], is using provider [{}] and algorithm [{}].",
+ new Object[] {kmf, this, kmf.getProvider(), kmf.getAlgorithm()});
char[] kmfPassword = null;
if (this.getKeyPassword() != null) {
@@ -108,6 +110,8 @@
kmf.init(ks, kmfPassword);
keyManagers = kmf.getKeyManagers();
+ LOG.debug("KeyManager[] [{}], initialized from KeyManagerFactory [{}].", keyManagers, kmf);
+
return keyManagers;
}
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/KeyStoreParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/KeyStoreParameters.java
index 16d8107..380f190 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/KeyStoreParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/KeyStoreParameters.java
@@ -21,6 +21,9 @@
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.Security;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -146,7 +149,7 @@
* resource to an input stream
*/
public KeyStore createKeyStore() throws GeneralSecurityException, IOException {
- LOG.debug("Creating KeyStore instance from KeyStoreParameters: {}", this);
+ LOG.trace("Creating KeyStore instance from KeyStoreParameters [{}].", this);
String ksType = this.parsePropertyValue(this.type);
if (ksType == null) {
@@ -164,14 +167,26 @@
} else {
ks = KeyStore.getInstance(ksType, this.parsePropertyValue(this.provider));
}
-
+
if (this.resource == null) {
ks.load(null, ksPassword);
} else {
InputStream is = this.resolveResource(this.parsePropertyValue(this.resource));
ks.load(is, ksPassword);
}
-
+
+ if (LOG.isDebugEnabled()) {
+ List<String> aliases = new LinkedList<String>();
+
+ Enumeration<String> aliasEnum = ks.aliases();
+ while (aliasEnum.hasMoreElements()) {
+ aliases.add(aliasEnum.nextElement());
+ }
+
+ LOG.debug("KeyStore [{}], initialized from [{}], is using provider [{}], has type [{}], and contains aliases {}.",
+ new Object[] {ks, this, ks.getProvider(), ks.getType(), aliases});
+ }
+
return ks;
}
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextClientParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextClientParameters.java
index 2e807b5..a05c3da 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextClientParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextClientParameters.java
@@ -41,12 +41,12 @@
@Override
protected void configureSSLContext(SSLContext context) throws GeneralSecurityException {
- LOG.trace("Configuring client-side SSLContext parameters...");
+ LOG.trace("Configuring client-side SSLContext parameters on SSLContext [{}]...", context);
if (this.getSessionTimeout() != null) {
- LOG.debug("Configuring client-side SSLContext session timeout: " + this.getSessionTimeout());
+ LOG.info("Configuring client-side SSLContext session timeout on SSLContext [{}] to [{}].", context, this.getSessionTimeout());
this.configureSessionContext(context.getClientSessionContext(), this.getSessionTimeout());
}
- LOG.trace("Configured client-side SSLContext parameters.");
+ LOG.trace("Configured client-side SSLContext parameters on SSLContext [{}].", context);
}
/**
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextParameters.java
index 5cb7519..aa8b49b 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextParameters.java
@@ -229,7 +229,9 @@
*/
public SSLContext createSSLContext() throws GeneralSecurityException, IOException {
- LOG.trace("Creating SSLContext from SSLContextParameters: {}", this);
+ LOG.trace("Creating SSLContext from SSLContextParameters [{}].", this);
+
+ LOG.info("Available providers: {}.", Security.getProviders());
KeyManager[] keyManagers = this.keyManagers == null ? null : this.keyManagers.createKeyManagers();
TrustManager[] trustManagers = this.trustManagers == null ? null : this.trustManagers.createTrustManagers();
@@ -243,6 +245,9 @@
this.parsePropertyValue(this.getProvider()));
}
+ LOG.debug("SSLContext [{}], initialized from [{}], is using provider [{}], protocol [{}], key managers {}, trust managers {}, and secure random [{}].",
+ new Object[] {context, this, context.getProvider(), context.getProtocol(), keyManagers, trustManagers, secureRandom});
+
context.init(keyManagers, trustManagers, secureRandom);
this.configureSSLContext(context);
@@ -254,74 +259,80 @@
this.getSSLEngineConfigurers(context),
this.getSSLSocketFactoryConfigurers(context),
this.getSSLServerSocketFactoryConfigurers(context)));
- LOG.debug("Created {}", context);
+
return context;
}
@Override
protected void configureSSLContext(SSLContext context) throws GeneralSecurityException {
- LOG.trace("Configuring client and server side SSLContext parameters...");
+ LOG.trace("Configuring client and server side SSLContext parameters on SSLContext [{}]...", context);
super.configureSSLContext(context);
if (this.getClientParameters() != null) {
- LOG.trace("Overriding client-side SSLContext parameters with configured client parameters.");
+ LOG.trace("Overriding client-side SSLContext parameters on SSLContext [{}] with configured client parameters.",
+ context);
this.getClientParameters().configureSSLContext(context);
}
if (this.getServerParameters() != null) {
- LOG.trace("Overriding server-side SSLContext parameters with configured server parameters.");
+ LOG.trace("Overriding server-side SSLContext parameters on SSLContext [{}] with configured server parameters.",
+ context);
this.getServerParameters().configureSSLContext(context);
}
- LOG.trace("Configured client and server side SSLContext parameters.");
+ LOG.trace("Configured client and server side SSLContext parameters on SSLContext [{}].", context);
}
@Override
protected List<Configurer<SSLEngine>> getSSLEngineConfigurers(SSLContext context) {
- LOG.trace("Collecting client and server side SSLEngine configurers...");
+ LOG.trace("Collecting client and server side SSLEngine configurers on SSLContext [{}]...", context);
List<Configurer<SSLEngine>> configurers = super.getSSLEngineConfigurers(context);
if (this.getClientParameters() != null) {
- LOG.trace("Augmenting SSLEngine configurers with configurers from client parameters.");
+ LOG.trace("Augmenting SSLEngine configurers with configurers from client parameters on SSLContext [{}].",
+ context);
configurers.addAll(this.getClientParameters().getSSLEngineConfigurers(context));
}
if (this.getServerParameters() != null) {
- LOG.trace("Augmenting SSLEngine configurers with configurers from server parameters.");
+ LOG.trace("Augmenting SSLEngine configurers with configurers from server parameters on SSLContext [{}].",
+ context);
configurers.addAll(this.getServerParameters().getSSLEngineConfigurers(context));
}
- LOG.trace("Collected client and server side SSLEngine configurers.");
+ LOG.trace("Collected client and server side SSLEngine configurers on SSLContext [{}].", context);
return configurers;
}
@Override
protected List<Configurer<SSLSocketFactory>> getSSLSocketFactoryConfigurers(SSLContext context) {
- LOG.trace("Collecting SSLSocketFactory configurers...");
+ LOG.trace("Collecting SSLSocketFactory configurers on SSLContext [{}]...", context);
List<Configurer<SSLSocketFactory>> configurers = super.getSSLSocketFactoryConfigurers(context);
if (this.getClientParameters() != null) {
- LOG.trace("Augmenting SSLSocketFactory configurers with configurers from client parameters.");
+ LOG.trace("Augmenting SSLSocketFactory configurers with configurers from client parameters on SSLContext [{}].",
+ context);
configurers.addAll(this.getClientParameters().getSSLSocketFactoryConfigurers(context));
}
- LOG.trace("Collected SSLSocketFactory configurers.");
+ LOG.trace("Collected SSLSocketFactory configurers on SSLContext [{}].", context);
return configurers;
}
@Override
protected List<Configurer<SSLServerSocketFactory>> getSSLServerSocketFactoryConfigurers(SSLContext context) {
- LOG.trace("Collecting SSLServerSocketFactory configurers...");
+ LOG.trace("Collecting SSLServerSocketFactory configurers for SSLContext [{}]...", context);
List<Configurer<SSLServerSocketFactory>> configurers = super.getSSLServerSocketFactoryConfigurers(context);
if (this.getServerParameters() != null) {
- LOG.trace("Augmenting SSLServerSocketFactory configurers with configurers from server parameters.");
+ LOG.trace("Augmenting SSLServerSocketFactory configurers with configurers from server parameters for SSLContext [{}].",
+ context);
configurers.addAll(this.getServerParameters().getSSLServerSocketFactoryConfigurers(context));
}
- LOG.trace("Collected client and server side SSLServerSocketFactory configurers.");
+ LOG.trace("Collected client and server side SSLServerSocketFactory configurers for SSLContext [{}].", context);
return configurers;
}
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextServerParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextServerParameters.java
index a966cf9..8087a62 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextServerParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextServerParameters.java
@@ -63,12 +63,12 @@
@Override
protected void configureSSLContext(SSLContext context) throws GeneralSecurityException {
- LOG.trace("Configuring server-side SSLContext parameters...");
+ LOG.trace("Configuring server-side SSLContext parameters on SSLContext [{}]...", context);
if (this.getSessionTimeout() != null) {
- LOG.debug("Configuring server-side SSLContext session timeout: " + this.getSessionTimeout());
+ LOG.debug("Configuring server-side SSLContext session timeout on SSLContext [{}] to [{}].", context, this.getSessionTimeout());
this.configureSessionContext(context.getServerSessionContext(), this.getSessionTimeout());
}
- LOG.trace("Configured server-side SSLContext parameters.");
+ LOG.trace("Configured server-side SSLContext parameters on SSLContext [{}].", context);
}
/**
@@ -97,6 +97,7 @@
Configurer<SSLEngine> sslEngineConfigurer = new Configurer<SSLEngine>() {
@Override
public SSLEngine configure(SSLEngine engine) {
+ LOG.info("Configuring client-auth on SSLEngine [{}] to [{}].", engine, clientAuthValue);
switch (clientAuthValue) {
case NONE:
engine.setWantClientAuth(false);
@@ -135,6 +136,7 @@
Configurer<SSLServerSocket> sslServerSocketConfigurer = new Configurer<SSLServerSocket>() {
@Override
public SSLServerSocket configure(SSLServerSocket socket) {
+ LOG.info("Configuring client-auth on SSLServerSocket [{}] to [{}].", socket, clientAuthValue);
switch (clientAuthValue) {
case NONE:
socket.setWantClientAuth(false);
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/SecureRandomParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/SecureRandomParameters.java
index ebb9c2a..1e5d15e 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/SecureRandomParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/SecureRandomParameters.java
@@ -65,6 +65,9 @@
} else {
secureRandom = SecureRandom.getInstance(this.parsePropertyValue(this.getAlgorithm()));
}
+
+ LOG.debug("SecureRandom [{}] is using provider [{}] and algorithm [{}].",
+ new Object[] {secureRandom, secureRandom.getProvider(), secureRandom.getAlgorithm()});
return secureRandom;
}
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/TrustManagersParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/TrustManagersParameters.java
index 74daffa..f71db16 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/TrustManagersParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/TrustManagersParameters.java
@@ -71,7 +71,7 @@
*/
public TrustManager[] createTrustManagers() throws GeneralSecurityException, IOException {
- LOG.trace("Creating TrustManager[] from TrustManagersParameters: {}", this);
+ LOG.trace("Creating TrustManager[] from TrustManagersParameters [{}]", this);
TrustManager[] trustManagers = null;
@@ -88,9 +88,14 @@
tmf = TrustManagerFactory.getInstance(tmfAlgorithm, this.parsePropertyValue(this.getProvider()));
}
+ LOG.debug("TrustManagerFactory [{}] is using provider [{}] and algorithm [{}].",
+ new Object[] {tmf, tmf.getProvider(), tmf.getAlgorithm()});
+
KeyStore ks = this.getKeyStore() == null ? null : this.getKeyStore().createKeyStore();
tmf.init(ks);
trustManagers = tmf.getTrustManagers();
+
+ LOG.debug("TrustManager[] [{}], initialized from TrustManagerFactory [{}].", trustManagers, tmf);
}
return trustManagers;
diff --git a/camel-core/src/test/java/org/apache/camel/builder/ThreadPoolBuilderTest.java b/camel-core/src/test/java/org/apache/camel/builder/ThreadPoolBuilderTest.java
index 46dddca..112ac11 100644
--- a/camel-core/src/test/java/org/apache/camel/builder/ThreadPoolBuilderTest.java
+++ b/camel-core/src/test/java/org/apache/camel/builder/ThreadPoolBuilderTest.java
@@ -18,6 +18,7 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.camel.ContextTestSupport;
@@ -125,4 +126,39 @@
assertEquals(true, executor2.isShutdown());
}
+ public void testThreadPoolBuilderScheduled() throws Exception {
+ ThreadPoolBuilder builder = new ThreadPoolBuilder(context);
+ ScheduledExecutorService executor = builder.poolSize(5).maxQueueSize(2000)
+ .buildScheduled();
+ assertNotNull(executor);
+
+ assertEquals(false, executor.isShutdown());
+ context.stop();
+ assertEquals(true, executor.isShutdown());
+ }
+
+ public void testThreadPoolBuilderScheduledName() throws Exception {
+ ThreadPoolBuilder builder = new ThreadPoolBuilder(context);
+ ScheduledExecutorService executor = builder.poolSize(5).maxQueueSize(2000)
+ .buildScheduled("myScheduledPool");
+ assertNotNull(executor);
+
+ assertEquals(false, executor.isShutdown());
+ context.stop();
+ assertEquals(true, executor.isShutdown());
+ }
+
+
+ public void testThreadPoolBuilderScheduledSourceName() throws Exception {
+ ThreadPoolBuilder builder = new ThreadPoolBuilder(context);
+ ScheduledExecutorService executor = builder.poolSize(5).maxQueueSize(2000)
+ .buildScheduled(this, "myScheduledPool");
+ assertNotNull(executor);
+
+ assertEquals(false, executor.isShutdown());
+ context.stop();
+ assertEquals(true, executor.isShutdown());
+ }
+
+
}
diff --git a/camel-core/src/test/java/org/apache/camel/component/bean/BeanExpressionConcurrentTest.java b/camel-core/src/test/java/org/apache/camel/component/bean/BeanExpressionConcurrentTest.java
new file mode 100644
index 0000000..6b7674f
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/bean/BeanExpressionConcurrentTest.java
@@ -0,0 +1,128 @@
+/**
+ * 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.bean;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ * @version
+ */
+public class BeanExpressionConcurrentTest extends ContextTestSupport {
+
+ public void testBeanConcurrent() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMessageCount(1000);
+ mock.expectsNoDuplicates(body());
+
+ // start from 1000 to be 4 digit always (easier to string compare)
+ for (int i = 1000; i < 2000; i++) {
+ template.sendBody("seda:foo", "" + i);
+ }
+
+ context.startRoute("foo");
+
+ assertMockEndpointsSatisfied();
+
+ // should be 1000 messages
+ List<String> list = new ArrayList<String>();
+ for (int i = 0; i < 1000; i++) {
+ String body = mock.getReceivedExchanges().get(i).getIn().getBody(String.class);
+ list.add(body);
+ }
+ Collections.sort(list);
+
+ // and they should be unique and no lost messages
+ assertEquals(1000, list.size());
+ for (int i = 1; i < 1000; i++) {
+ int num = 1000 + i;
+ String s = "" + num + " " + num;
+ assertEquals(s, list.get(i));
+ }
+ }
+
+
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ JndiRegistry jndi = super.createRegistry();
+ jndi.bind("myBean", new MyBean());
+ return jndi;
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("seda:foo?concurrentConsumers=10").routeId("foo").noAutoStartup()
+ .transform(method("myBean"))
+ .to("mock:result");
+ }
+ };
+ }
+
+ @SuppressWarnings("unused")
+ private static class MyBean {
+
+ private String foo;
+ private String bar;
+ private int baz;
+
+ public String getFoo() {
+ return foo;
+ }
+
+ public void setFoo(String foo) {
+ this.foo = foo;
+ }
+
+ public String getBar() {
+ return bar;
+ }
+
+ public void setBar(String bar) {
+ this.bar = bar;
+ }
+
+ public int getBaz() {
+ return baz;
+ }
+
+ public void setBaz(int baz) {
+ this.baz = baz;
+ }
+
+ public void doSomething() {
+ // noop
+ }
+
+ public String echo(String s) {
+ return s + " " + s;
+ }
+
+ @Override
+ public String toString() {
+ return "MyBean";
+ }
+ }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollStopRouteTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollStopRouteTest.java
new file mode 100644
index 0000000..46c502e
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollStopRouteTest.java
@@ -0,0 +1,59 @@
+/**
+ * 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.file;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.mock.MockEndpoint;
+
+/**
+ *
+ */
+public class FileConsumerSharedThreadPollStopRouteTest extends FileConsumerSharedThreadPollTest {
+
+ public void testSharedThreadPool() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMessageCount(2);
+ // thread thread name should be the same
+ mock.message(0).header("threadName").isEqualTo(mock.message(1).header("threadName"));
+
+ template.sendBodyAndHeader("file:target/a", "Hello World", Exchange.FILE_NAME, "hello.txt");
+ template.sendBodyAndHeader("file:target/b", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+ assertMockEndpointsSatisfied();
+
+ // now stop a
+ context.stopRoute("a");
+
+ resetMocks();
+ mock.expectedBodiesReceived("Bye World 2");
+ // a should not be polled
+ mock.expectedFileExists("target/a/hello2.txt");
+
+ template.sendBodyAndHeader("file:target/a", "Hello World 2", Exchange.FILE_NAME, "hello2.txt");
+ template.sendBodyAndHeader("file:target/b", "Bye World 2", Exchange.FILE_NAME, "bye2.txt");
+
+ assertMockEndpointsSatisfied();
+
+ // now start a, which should pickup the file
+ resetMocks();
+ mock.expectedBodiesReceived("Hello World 2");
+ context.startRoute("a");
+
+ assertMockEndpointsSatisfied();
+ }
+
+}
diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollTest.java
new file mode 100644
index 0000000..fb0e582
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollTest.java
@@ -0,0 +1,91 @@
+/**
+ * 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.file;
+
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.builder.ThreadPoolBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.SimpleRegistry;
+
+/**
+ *
+ */
+public class FileConsumerSharedThreadPollTest extends ContextTestSupport {
+
+ private ScheduledExecutorService pool;
+ private SimpleRegistry registry = new SimpleRegistry();
+
+ @Override
+ protected void setUp() throws Exception {
+ deleteDirectory("target/a");
+ deleteDirectory("target/b");
+ super.setUp();
+ }
+
+ @Override
+ protected CamelContext createCamelContext() throws Exception {
+ return new DefaultCamelContext(registry);
+ }
+
+ public void testSharedThreadPool() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMessageCount(2);
+ // thread thread name should be the same
+ mock.message(0).header("threadName").isEqualTo(mock.message(1).header("threadName"));
+
+ template.sendBodyAndHeader("file:target/a", "Hello World", Exchange.FILE_NAME, "hello.txt");
+ template.sendBodyAndHeader("file:target/b", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ // create shared pool and enlist in registry
+ pool = new ThreadPoolBuilder(context).poolSize(1).buildScheduled(this, "MySharedPool");
+ registry.put("myPool", pool);
+
+ from("file:target/a?scheduledExecutorService=#myPool").routeId("a")
+ .to("direct:shared");
+
+ from("file:target/b?scheduledExecutorService=#myPool").routeId("b")
+ .to("direct:shared");
+
+ from("direct:shared").routeId("shared")
+ .convertBodyTo(String.class)
+ .log("Get ${file:name} using ${threadName}")
+ .process(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ exchange.getIn().setHeader("threadName", Thread.currentThread().getName());
+ }
+ })
+ .to("mock:result");
+ }
+ };
+ }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRestartFromBeginningTest.java b/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRestartFromBeginningTest.java
new file mode 100644
index 0000000..e1aab51
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRestartFromBeginningTest.java
@@ -0,0 +1,101 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.RecipientList;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ *
+ */
+public class DeadLetterChannelRestartFromBeginningTest extends ContextTestSupport {
+
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ JndiRegistry jndi = super.createRegistry();
+ jndi.bind("retryBean", new RetryBean());
+ return jndi;
+ }
+
+ public void testRestartFromBeginning() throws Exception {
+ // 1 original + 4 redeliveries
+ getMockEndpoint("mock:start").expectedBodiesReceived("Camel", "Camel", "Camel", "Camel", "Camel");
+ getMockEndpoint("mock:result").expectedBodiesReceived("Hello Camel");
+
+ // use fire and forget
+ template.sendBody("seda:start", "Camel");
+
+ setAssertPeriod(200);
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ // use the DLQ and let the retryBean handle this
+ errorHandler(deadLetterChannel("bean:retryBean").useOriginalMessage());
+
+ // use seda:retry as a way of retrying from the input route
+ // the seda:start could be any other kind of fire and forget endpoint
+ from("seda:start", "seda:retry")
+ .to("log:start", "mock:start")
+ .transform(body().prepend("Hello "))
+ .process(new Processor() {
+ private int counter;
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ // fail the first 3 times
+ if (counter++ <= 3) {
+ throw new IllegalArgumentException("Damn");
+ }
+ }
+ })
+ .to("mock:result");
+ }
+ };
+ }
+
+ /**
+ * Bean used as dead letter queue, that decides what to do with the message
+ */
+ public static class RetryBean {
+
+ // use recipient list to decide what to do with the message
+ @RecipientList
+ public String handleError(Exchange exchange) {
+ // store a property on the exchange with the number of total attempts
+ int attempts = exchange.getProperty("attempts", 0, int.class);
+ attempts++;
+ exchange.setProperty("attempts", attempts);
+
+ // we want to retry at most 4 times
+ if (attempts <= 4) {
+ return "seda:retry";
+ } else {
+ // okay we give up its a poison message
+ return "log:giveup";
+ }
+ }
+ }
+
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/WireTapBeanTest.java b/camel-core/src/test/java/org/apache/camel/processor/WireTapBeanTest.java
new file mode 100644
index 0000000..c4c69bd
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/WireTapBeanTest.java
@@ -0,0 +1,69 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+
+/**
+ * Wire tap unit test
+ *
+ * @version
+ */
+public class WireTapBeanTest extends ContextTestSupport {
+ protected MockEndpoint tap;
+ protected MockEndpoint result;
+
+ public void testSend() throws Exception {
+ result.expectedBodiesReceived("Bye World");
+ tap.expectedBodiesReceived("World");
+
+ template.sendBody("direct:start", "World");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ tap = getMockEndpoint("mock:tap");
+ result = getMockEndpoint("mock:result");
+ }
+
+ protected RouteBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ public void configure() {
+ from("direct:start")
+ .to("log:foo")
+ .wireTap("seda:tap")
+ .bean(MyBean.class)
+ .to("mock:result");
+
+ from("seda:tap")
+ .to("mock:tap");
+ }
+ };
+ }
+
+ public static class MyBean {
+
+ public String transform(String body) {
+ return "Bye " + body;
+ }
+ }
+}
\ No newline at end of file
diff --git a/camel-core/src/test/resources/log4j.properties b/camel-core/src/test/resources/log4j.properties
index 55fba64..b11d347 100644
--- a/camel-core/src/test/resources/log4j.properties
+++ b/camel-core/src/test/resources/log4j.properties
@@ -50,6 +50,7 @@
#log4j.logger.org.apache.camel.util.FileUtil=TRACE
#log4j.logger.org.apache.camel.util.AsyncProcessorHelper=TRACE
#log4j.logger.org.apache.camel.util.ServiceHelper=TRACE
+#log4j.logger.org.apache.camel.util.jsse=TRACE
# CONSOLE appender not used by default
log4j.appender.out=org.apache.log4j.ConsoleAppender
diff --git a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelThreadPoolFactoryBean.java b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelThreadPoolFactoryBean.java
index 1754511..dc39bac 100644
--- a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelThreadPoolFactoryBean.java
+++ b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelThreadPoolFactoryBean.java
@@ -52,6 +52,8 @@
private ThreadPoolRejectedPolicy rejectedPolicy = ThreadPoolRejectedPolicy.CallerRuns;
@XmlAttribute(required = true)
private String threadName;
+ @XmlAttribute
+ private Boolean scheduled;
public ExecutorService getObject() throws Exception {
int size = CamelContextHelper.parseInteger(getCamelContext(), poolSize);
@@ -81,7 +83,13 @@
.maxQueueSize(queueSize)
.rejectedPolicy(rejectedPolicy)
.build();
- ExecutorService answer = getCamelContext().getExecutorServiceManager().newThreadPool(getId(), getThreadName(), profile);
+
+ ExecutorService answer;
+ if (scheduled != null && scheduled) {
+ answer = getCamelContext().getExecutorServiceManager().newScheduledThreadPool(getId(), getThreadName(), profile);
+ } else {
+ answer = getCamelContext().getExecutorServiceManager().newThreadPool(getId(), getThreadName(), profile);
+ }
return answer;
}
@@ -145,4 +153,11 @@
this.threadName = threadName;
}
+ public Boolean getScheduled() {
+ return scheduled;
+ }
+
+ public void setScheduled(Boolean scheduled) {
+ this.scheduled = scheduled;
+ }
}
\ No newline at end of file
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
index 801dde9..f0b8282 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
@@ -35,8 +35,6 @@
import org.apache.camel.spi.TypeConverterRegistry;
import org.apache.camel.util.IOHelper;
import org.apache.cxf.message.MessageContentsList;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* The <a href="http://camel.apache.org/type-converter.html">Type Converters</a>
@@ -46,7 +44,6 @@
*/
@Converter
public final class CxfConverter {
- private static final Logger LOG = LoggerFactory.getLogger(CxfConverter.class);
private CxfConverter() {
// Helper class
diff --git a/components/camel-guice/src/main/java/org/apache/camel/guice/Main.java b/components/camel-guice/src/main/java/org/apache/camel/guice/Main.java
index 9bdaeb7..89318cd 100644
--- a/components/camel-guice/src/main/java/org/apache/camel/guice/Main.java
+++ b/components/camel-guice/src/main/java/org/apache/camel/guice/Main.java
@@ -73,6 +73,7 @@
public static void main(String... args) throws Exception {
Main main = new Main();
instance = main;
+ main.enableHangupSupport();
main.run(args);
}
diff --git a/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrMessage.java b/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrMessage.java
index 41b75e5..7e2dd44 100644
--- a/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrMessage.java
+++ b/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrMessage.java
@@ -50,6 +50,11 @@
@Override
public void copyFrom(org.apache.camel.Message that) {
+ if (that == this) {
+ // the same instance so do not need to copy
+ return;
+ }
+
// must initialize headers before we set the JmsMessage to avoid Camel
// populating it before we do the copy
getHeaders().clear();
diff --git a/components/camel-jibx/pom.xml b/components/camel-jibx/pom.xml
index 513f78b..542fc1e 100644
--- a/components/camel-jibx/pom.xml
+++ b/components/camel-jibx/pom.xml
@@ -81,14 +81,13 @@
<artifactId>maven-jibx-plugin</artifactId>
<version>${jibx-version}</version>
<configuration>
- <bindingDirectory>src/test/resources</bindingDirectory>
- <includeSchemaBindings>
- <includeSchemaBinding>**/*-jibx.xml</includeSchemaBinding>
- </includeSchemaBindings>
+ <directory>${basedir}/src/test/resources/org/apache/camel/dataformat/jibx/</directory>
+ <includes>
+ <include>purchaseOrder-jibx.xml</include>
+ </includes>
</configuration>
<executions>
<execution>
- <phase>process-test-classes</phase>
<goals>
<goal>test-bind</goal>
</goals>
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
index 9950109..d200a9a 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
@@ -61,6 +61,11 @@
@Override
public void copyFrom(org.apache.camel.Message that) {
+ if (that == this) {
+ // the same instance so do not need to copy
+ return;
+ }
+
// must initialize headers before we set the JmsMessage to avoid Camel
// populating it before we do the copy
getHeaders().clear();
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelChainedTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelChainedTest.java
new file mode 100644
index 0000000..6fad877
--- /dev/null
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelChainedTest.java
@@ -0,0 +1,91 @@
+/**
+ * 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.jms;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentAutoAcknowledge;
+
+/**
+ * Test that chained request/reply over JMS works in parallel mode with the splitter EIP.
+ *
+ * @version
+ */
+public class JmsSplitterParallelChainedTest extends CamelTestSupport {
+
+ protected String getUri() {
+ return "activemq:queue:foo";
+ }
+
+ protected String getUri2() {
+ return "activemq:queue:bar";
+ }
+
+ @Test
+ public void testSplitParallel() throws Exception {
+ getMockEndpoint("mock:result").expectedBodiesReceived("A,B,C,D,E");
+ getMockEndpoint("mock:reply").expectedBodiesReceivedInAnyOrder("Hi A", "Hi B", "Hi C", "Hi D", "Hi E");
+ getMockEndpoint("mock:reply2").expectedBodiesReceivedInAnyOrder("Bye Hi A", "Bye Hi B", "Bye Hi C", "Bye Hi D", "Bye Hi E");
+ getMockEndpoint("mock:split").expectedBodiesReceivedInAnyOrder("Bye Hi A", "Bye Hi B", "Bye Hi C", "Bye Hi D", "Bye Hi E");
+
+ template.sendBody("direct:start", "A,B,C,D,E");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ protected CamelContext createCamelContext() throws Exception {
+ CamelContext camelContext = super.createCamelContext();
+
+ ConnectionFactory connectionFactory = CamelJmsTestHelper.createConnectionFactory();
+ camelContext.addComponent("activemq", jmsComponentAutoAcknowledge(connectionFactory));
+
+ return camelContext;
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("direct:start")
+ .split(body().tokenize(",")).parallelProcessing()
+ .to("log:before")
+ .to(ExchangePattern.InOut, getUri())
+ .to("log:after")
+ .to("mock:split")
+ .end()
+ .to("mock:result");
+
+ from(getUri())
+ .transform(body().prepend("Hi "))
+ .to("mock:reply")
+ .to(ExchangePattern.InOut, getUri2());
+
+ from(getUri2())
+ .transform(body().prepend("Bye "))
+ .to("mock:reply2");
+ }
+ };
+ }
+
+}
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelTest.java
new file mode 100644
index 0000000..344736a
--- /dev/null
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelTest.java
@@ -0,0 +1,79 @@
+/**
+ * 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.jms;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentAutoAcknowledge;
+
+/**
+ * @version
+ */
+public class JmsSplitterParallelTest extends CamelTestSupport {
+
+ protected String getUri() {
+ return "activemq:queue:foo?useMessageIDAsCorrelationID=true";
+ }
+
+ @Test
+ public void testSplitParallel() throws Exception {
+ getMockEndpoint("mock:result").expectedBodiesReceived("A,B,C,D,E");
+ getMockEndpoint("mock:reply").expectedBodiesReceivedInAnyOrder("Bye A", "Bye B", "Bye C", "Bye D", "Bye E");
+ getMockEndpoint("mock:split").expectedBodiesReceivedInAnyOrder("Bye A", "Bye B", "Bye C", "Bye D", "Bye E");
+
+ template.sendBody("direct:start", "A,B,C,D,E");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ protected CamelContext createCamelContext() throws Exception {
+ CamelContext camelContext = super.createCamelContext();
+
+ ConnectionFactory connectionFactory = CamelJmsTestHelper.createConnectionFactory();
+ camelContext.addComponent("activemq", jmsComponentAutoAcknowledge(connectionFactory));
+
+ return camelContext;
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("direct:start")
+ .split(body().tokenize(",")).parallelProcessing()
+ .to("log:before")
+ .to(ExchangePattern.InOut, getUri())
+ .to("log:after")
+ .to("mock:split")
+ .end()
+ .to("mock:result");
+
+ from(getUri())
+ .transform(body().prepend("Bye "))
+ .to("mock:reply");
+ }
+ };
+ }
+
+}
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/DynamicRoutersWithJMSMessageLostHeadersIssueTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/DynamicRoutersWithJMSMessageLostHeadersIssueTest.java
new file mode 100644
index 0000000..71827ff
--- /dev/null
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/DynamicRoutersWithJMSMessageLostHeadersIssueTest.java
@@ -0,0 +1,103 @@
+/**
+ * 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.jms.issues;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Header;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jms.CamelJmsTestHelper;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentAutoAcknowledge;
+
+/**
+ *
+ */
+public class DynamicRoutersWithJMSMessageLostHeadersIssueTest extends CamelTestSupport {
+
+ @Override
+ public void setUp() throws Exception {
+ deleteDirectory("target/inbox");
+ deleteDirectory("target/outbox");
+ super.setUp();
+ }
+
+ @Override
+ protected CamelContext createCamelContext() throws Exception {
+ CamelContext camelContext = super.createCamelContext();
+
+ ConnectionFactory connectionFactory = CamelJmsTestHelper.createConnectionFactory();
+ camelContext.addComponent("activemq", jmsComponentAutoAcknowledge(connectionFactory));
+
+ return camelContext;
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("activemq:queue1")
+ .setHeader("HEADER1", constant("header1"))
+ .dynamicRouter(method(DynamicRouter.class, "dynamicRoute"))
+ .to("mock:checkHeader");
+
+ from("direct:foo")
+ .setHeader("HEADER1", constant("header1"))
+ .dynamicRouter(method(DynamicRouter.class, "dynamicRoute"))
+ .to("mock:checkHeader");
+ }
+ };
+ }
+
+ @Test
+ public void testHeaderShouldExisted() throws InterruptedException {
+ // direct
+ getMockEndpoint("mock:checkHeader").expectedMessageCount(1);
+ getMockEndpoint("mock:checkHeader").expectedHeaderReceived("HEADER1", "header1");
+
+ template.sendBody("direct:foo", "A");
+
+ assertMockEndpointsSatisfied();
+ resetMocks();
+
+ // actvivemq
+ getMockEndpoint("mock:checkHeader").expectedMessageCount(1);
+ getMockEndpoint("mock:checkHeader").expectedHeaderReceived("HEADER1", "header1");
+
+ template.sendBody("activemq:queue1", "A");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ public static class DynamicRouter {
+
+ public String dynamicRoute(Exchange exchange, @Header(Exchange.SLIP_ENDPOINT) String previous) {
+ if (previous == null) {
+ return "file://target/outbox";
+ } else {
+ //end slip
+ return null;
+ }
+ }
+
+ }
+}
diff --git a/components/camel-leveldb/pom.xml b/components/camel-leveldb/pom.xml
index 890185c..140ade8 100644
--- a/components/camel-leveldb/pom.xml
+++ b/components/camel-leveldb/pom.xml
@@ -31,6 +31,7 @@
<name>Camel :: LevelDB</name>
<description>Camel LevelDB Support</description>
+
<properties>
<camel.osgi.export.pkg>org.apache.camel.component.leveldb.*</camel.osgi.export.pkg>
</properties>
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
index c466888..9217c08 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
@@ -18,7 +18,6 @@
import java.net.URI;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
diff --git a/components/camel-rmi/src/test/java/org/apache/camel/component/rmi/RmiRouteEndpointTest.java b/components/camel-rmi/src/test/java/org/apache/camel/component/rmi/RmiRouteEndpointTest.java
index 218a757..d0418de 100644
--- a/components/camel-rmi/src/test/java/org/apache/camel/component/rmi/RmiRouteEndpointTest.java
+++ b/components/camel-rmi/src/test/java/org/apache/camel/component/rmi/RmiRouteEndpointTest.java
@@ -20,7 +20,6 @@
import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.test.AvailablePortFinder;
/**
* @version
diff --git a/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/SpringIntegrationMessage.java b/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/SpringIntegrationMessage.java
index ec9dc16..ee03d56 100644
--- a/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/SpringIntegrationMessage.java
+++ b/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/SpringIntegrationMessage.java
@@ -46,6 +46,11 @@
@Override
public void copyFrom(org.apache.camel.Message that) {
+ if (that == this) {
+ // the same instance so do not need to copy
+ return;
+ }
+
setMessageId(that.getMessageId());
setBody(that.getBody());
getHeaders().putAll(that.getHeaders());
diff --git a/components/camel-spring-ws/pom.xml b/components/camel-spring-ws/pom.xml
index cd7ad50..70421c8 100644
--- a/components/camel-spring-ws/pom.xml
+++ b/components/camel-spring-ws/pom.xml
@@ -53,11 +53,14 @@
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
</dependency>
+
+<!-- spring-oxm is needed when upgrading to Spring WS 2.1 that uses Spring 3.1 onwards
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring-version}</version>
</dependency>
+-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
@@ -86,14 +89,17 @@
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-security</artifactId>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
+ <scope>test</scope>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
diff --git a/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java b/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java
index 922a06d..b7e015c 100644
--- a/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java
+++ b/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java
@@ -24,12 +24,15 @@
import org.apache.camel.ProducerTemplate;
import org.apache.camel.StringSource;
import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Ignore;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+// TODO: enable after upgrading to Spring-WS 2.0.5
+@Ignore("Under JDK 7 requires minimum Spring-WS 2.0.5 to pass. Should be enabled again as soon as the upgrade to Spring-WS 2.0.5 has been done!")
@ContextConfiguration
public class SSLContextParametersLocalRouteTest extends AbstractJUnit4SpringContextTests {
diff --git a/components/camel-spring/src/test/java/org/apache/camel/component/test/SpringTestEndpointTest.java b/components/camel-spring/src/test/java/org/apache/camel/component/test/SpringTestEndpointTest.java
deleted file mode 100644
index 6193a85..0000000
--- a/components/camel-spring/src/test/java/org/apache/camel/component/test/SpringTestEndpointTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * 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.test;
-
-import org.apache.camel.CamelContext;
-
-import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
-
-/**
- * @version
- */
-public class SpringTestEndpointTest extends TestEndpointTest {
-
- protected CamelContext createCamelContext() throws Exception {
- return createSpringCamelContext(this, "org/apache/camel/component/test/SpringTestEndpointTest.xml");
- }
-
-}
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.java
new file mode 100644
index 0000000..2100756
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.java
@@ -0,0 +1,39 @@
+/**
+ * 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.spring.processor;
+
+import org.apache.camel.spring.SpringTestSupport;
+import org.apache.camel.util.concurrent.SizedScheduledExecutorService;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class SpringScheduledThreadPoolTest extends SpringTestSupport {
+
+ @Override
+ protected AbstractXmlApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext("org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.xml");
+ }
+
+ public void testScheduledThreadPool() throws Exception {
+ SizedScheduledExecutorService pool = context.getRegistry().lookup("myPool", SizedScheduledExecutorService.class);
+ assertNotNull(pool);
+
+ assertFalse("Should be started", pool.isShutdown());
+ assertEquals(5, pool.getCorePoolSize());
+ }
+
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/component/test/SpringTestEndpointTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.xml
similarity index 83%
rename from components/camel-spring/src/test/resources/org/apache/camel/component/test/SpringTestEndpointTest.xml
rename to components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.xml
index d143934..c8c0621 100644
--- a/components/camel-spring/src/test/resources/org/apache/camel/component/test/SpringTestEndpointTest.xml
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.xml
@@ -22,13 +22,11 @@
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
">
- <!-- START SNIPPET: example -->
- <camelContext xmlns="http://camel.apache.org/schema/spring">
- <route>
- <from uri="seda:foo"/>
- <to uri="test:seda:foo"/>
- </route>
- </camelContext>
- <!-- END SNIPPET: example -->
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+
+ <!-- define a custom scheduled thread pool -->
+ <threadPool id="myPool" poolSize="5" threadName="myPool" scheduled="true"/>
+
+ </camelContext>
</beans>
diff --git a/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java b/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
index 14b682b..f8ccc10 100644
--- a/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
+++ b/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
@@ -115,6 +115,11 @@
private synchronized void writeToStream(OutputStream outputStream, Exchange exchange) throws IOException, CamelExchangeException {
Object body = exchange.getIn().getBody();
+ if (body == null) {
+ log.debug("Body is null, cannot write it to the stream.");
+ return;
+ }
+
// if not a string then try as byte array first
if (!(body instanceof String)) {
byte[] bytes = exchange.getIn().getBody(byte[].class);
diff --git a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
index d2e1969..4130fff 100644
--- a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
+++ b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
@@ -67,6 +67,22 @@
}
}
+ @Test
+ public void shouldSkipNullBody() {
+ try {
+ // Given
+ System.setOut(new PrintStream(mockOut));
+
+ // When
+ template.sendBody("direct:in", null);
+
+ // Then
+ assertEquals(0, mockOut.toByteArray().length);
+ } finally {
+ System.setOut(stdOut);
+ }
+ }
+
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
diff --git a/parent/pom.xml b/parent/pom.xml
index 092844a..415bdde 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -117,7 +117,7 @@
<jetty-version>7.5.4.v20111024</jetty-version>
<jettison-version>1.3.1</jettison-version>
<jexcelapi-version>2.4.2</jexcelapi-version>
- <jibx-version>1.2.3</jibx-version>
+ <jibx-version>1.2.4.5</jibx-version>
<jruby-version>1.6.7</jruby-version>
<jsmpp-version>2.1.0_4</jsmpp-version>
<jsch-version>0.1.48</jsch-version>
@@ -126,7 +126,7 @@
<junit-version>4.10</junit-version>
<jt400-version>6.0</jt400-version>
<jaxb2-plugin-version>0.8.1</jaxb2-plugin-version>
- <karaf-version>2.2.7</karaf-version>
+ <karaf-version>2.2.8</karaf-version>
<krati-version>0.4.5</krati-version>
<leveldbjni-version>1.2</leveldbjni-version>
<log4j-version>1.2.16</log4j-version>
@@ -140,7 +140,7 @@
<mybatis-version>3.1.1</mybatis-version>
<!-- transitive dependency from avro, to use older netty bundle -->
<netty-bundle-version>3.2.7.Final_1</netty-bundle-version>
- <netty-version>3.5.0.Final</netty-version>
+ <netty-version>3.5.1.Final</netty-version>
<ode-version>1.3.4</ode-version>
<openwebbeans-version>1.1.3</openwebbeans-version>
<ognl-version>3.0.4_1</ognl-version>
@@ -176,7 +176,8 @@
<spring-version>3.0.7.RELEASE</spring-version>
<spring-osgi-version>1.2.1</spring-osgi-version>
<spring-security-version>3.1.0.RELEASE</spring-security-version>
- <spring-ws-version>2.0.5.RELEASE</spring-ws-version>
+ <!-- spring WS 2.0.3 is the last release to support Spring 3.0.x -->
+ <spring-ws-version>2.0.3.RELEASE</spring-ws-version>
<spymemcached-version>2.8.0</spymemcached-version>
<sshd-version>0.6.0</sshd-version>
<stax-api-version>1.0.1</stax-api-version>
diff --git a/platforms/karaf/features/pom.xml b/platforms/karaf/features/pom.xml
index 773760c..9299eec 100644
--- a/platforms/karaf/features/pom.xml
+++ b/platforms/karaf/features/pom.xml
@@ -85,6 +85,7 @@
<jdom-bundle-version>1.1_4</jdom-bundle-version>
<jing-bundle-version>20030619_5</jing-bundle-version>
<jodatime-bundle-version>1.6.2</jodatime-bundle-version>
+ <jodatime2-bundle-version>2.1</jodatime2-bundle-version>
<josql-bundle-version>1.5_5</josql-bundle-version>
<jsch-bundle-version>0.1.48_1</jsch-bundle-version>
<jsendnsca-bundle-version>1.3.1_3</jsendnsca-bundle-version>
diff --git a/platforms/karaf/features/src/main/resources/features.xml b/platforms/karaf/features/src/main/resources/features.xml
index d6229b3..3e7b043 100644
--- a/platforms/karaf/features/src/main/resources/features.xml
+++ b/platforms/karaf/features/src/main/resources/features.xml
@@ -476,7 +476,7 @@
<bundle dependency='true'>mvn:org.jibx/jibx-run/${jibx-version}</bundle>
<bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.bcel/${bcel-bundle-version}</bundle>
<bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xpp3/${xpp3-bundle-version}</bundle>
- <bundle dependency="true">mvn:joda-time/joda-time/${jodatime-bundle-version}</bundle>
+ <bundle dependency="true">mvn:joda-time/joda-time/${jodatime2-bundle-version}</bundle>
<bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jdom/${jdom-bundle-version}</bundle>
<bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.dom4j/${dom4j-bundle-version}</bundle>
</feature>
@@ -548,7 +548,7 @@
</feature>
<feature name='camel-leveldb' version='${project.version}' resolver='(obr)' start-level='50'>
<feature version='${project.version}'>camel-core</feature>
- <bundle dependency='true'>wrap:mvn:org.fusesource.leveldbjni/leveldbjni-all/${leveldbjni-version}</bundle>
+ <bundle dependency='true'>wrap:mvn:org.fusesource.leveldbjni/leveldbjni-all/${leveldbjni-version}$Bundle-Version=${leveldbjni-version}&Export-Package=*;-noimport:=true;version="${leveldbjni-version}"</bundle>
<bundle dependency='true'>mvn:org.fusesource.hawtbuf/hawtbuf/${hawtbuf-version}</bundle>
<bundle>mvn:org.apache.camel/camel-leveldb/${project.version}</bundle>
</feature>
diff --git a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSpringWebServiceTest.java b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSpringWebServiceTest.java
index ede7d98..4609d3a 100644
--- a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSpringWebServiceTest.java
+++ b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSpringWebServiceTest.java
@@ -16,7 +16,6 @@
*/
package org.apache.camel.itest.karaf;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Option;
@@ -24,7 +23,6 @@
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
@RunWith(JUnit4TestRunner.class)
-@Ignore("Requires Spring 3.1")
public class CamelSpringWebServiceTest extends AbstractFeatureTest {
public static final String COMPONENT = "spring-ws";
diff --git a/tooling/camel-manual/pom.xml b/tooling/camel-manual/pom.xml
index 8d9bf15..ec3ccd5 100644
--- a/tooling/camel-manual/pom.xml
+++ b/tooling/camel-manual/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.camel</groupId>
<artifactId>camel-parent</artifactId>
- <version>2.10-SNAPSHOT</version>
+ <version>2.10.0</version>
<relativePath>../../parent</relativePath>
</parent>
diff --git a/tooling/pom.xml b/tooling/pom.xml
index 7ccd62d..dd896e1 100644
--- a/tooling/pom.xml
+++ b/tooling/pom.xml
@@ -34,33 +34,34 @@
<modules>
<module>maven</module>
<module>archetypes</module>
+ <module>camel-manual</module>
</modules>
- <profiles>
- <profile>
- <id>build.manual</id>
- <modules>
- <module>camel-manual</module>
- </modules>
- </profile>
- <profile>
- <id>assembly</id>
- <modules>
- <module>camel-manual</module>
- </modules>
- </profile>
- <profile>
- <id>deploy</id>
- <modules>
- <module>camel-manual</module>
- </modules>
- </profile>
- <profile>
- <id>apache-release</id>
- <modules>
- <module>camel-manual</module>
- </modules>
- </profile>
- </profiles>
+ <!-- profiles>
+ <profile>
+ <id>build.manual</id>
+ <modules>
+ <module>camel-manual</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>assembly</id>
+ <modules>
+ <module>camel-manual</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>deploy</id>
+ <modules>
+ <module>camel-manual</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>apache-release</id>
+ <modules>
+ <module>camel-manual</module>
+ </modules>
+ </profile>
+ </profiles -->
</project>