diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java
index 60f065e48bf9a..0b1c9a716f486 100644
--- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedComponentMBean.java
@@ -29,4 +29,7 @@ public interface ManagedComponentMBean {
@ManagedAttribute(description = "Camel ID")
String getCamelId();
+ @ManagedAttribute(description = "Camel ManagementName")
+ String getCamelManagementName();
+
}
\ No newline at end of file
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEndpointMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEndpointMBean.java
index 6b9c9b8ae9754..69206b6e32020 100644
--- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEndpointMBean.java
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEndpointMBean.java
@@ -23,6 +23,9 @@ public interface ManagedEndpointMBean {
@ManagedAttribute(description = "Camel ID")
String getCamelId();
+ @ManagedAttribute(description = "Camel ManagementName")
+ String getCamelManagementName();
+
@ManagedAttribute(description = "Endpoint URI", mask = true)
String getEndpointUri();
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedErrorHandlerMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedErrorHandlerMBean.java
index 9d0c95cc4f471..56ed78d7fdada 100644
--- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedErrorHandlerMBean.java
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedErrorHandlerMBean.java
@@ -23,6 +23,9 @@ public interface ManagedErrorHandlerMBean {
@ManagedAttribute(description = "Camel ID")
String getCamelId();
+ @ManagedAttribute(description = "Camel ManagementName")
+ String getCamelManagementName();
+
@ManagedAttribute(description = "Does the error handler support redelivery")
boolean isSupportRedelivery();
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.java
index f31ed70a8b879..eaf16d5363b3f 100644
--- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.java
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.java
@@ -27,6 +27,9 @@ public interface ManagedProcessorMBean extends ManagedPerformanceCounterMBean {
@ManagedAttribute(description = "Camel ID")
String getCamelId();
+ @ManagedAttribute(description = "Camel ManagementName")
+ String getCamelManagementName();
+
@ManagedAttribute(description = "Route ID")
String getRouteId();
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java
index dbe54faaf02ec..26601e9eb3a34 100644
--- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedResourceEndpointMBean.java
@@ -21,6 +21,15 @@
public interface ManagedResourceEndpointMBean {
+ @ManagedAttribute(description = "Camel context ID")
+ String getCamelId();
+
+ @ManagedAttribute(description = "Camel ManagementName")
+ String getCamelManagementName();
+
+ @ManagedAttribute(description = "Endpoint service state")
+ String getState();
+
@ManagedAttribute(description = "Whether the content is cached")
boolean isContentCache();
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
index 7f90e12033075..0fb7ff0cad07f 100644
--- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
@@ -39,6 +39,9 @@ public interface ManagedRouteMBean extends ManagedPerformanceCounterMBean {
@ManagedAttribute(description = "Camel ID")
String getCamelId();
+ @ManagedAttribute(description = "Camel ManagementName")
+ String getCamelManagementName();
+
@ManagedAttribute(description = "Tracing")
Boolean getTracing();
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedServiceMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedServiceMBean.java
index 7f04c842ff154..0ef03d101fbd7 100644
--- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedServiceMBean.java
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedServiceMBean.java
@@ -27,6 +27,9 @@ public interface ManagedServiceMBean {
@ManagedAttribute(description = "Camel ID")
String getCamelId();
+ @ManagedAttribute(description = "Camel ManagementName")
+ String getCamelManagementName();
+
@ManagedAttribute(description = "Route ID")
String getRouteId();
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
index 33bffd92206cb..c4e0de7c0b3f9 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
@@ -899,6 +899,22 @@ public String toString() {
};
}
+ /**
+ * Returns the expression for the {@code null} value
+ */
+ public static Expression nullExpression() {
+ return new ExpressionAdapter() {
+ public Object evaluate(Exchange exchange) {
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ return "null";
+ }
+ };
+ }
+
/**
* Returns the expression for the exchanges inbound message body converted
* to the given type.
diff --git a/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java
index 9b3af1d7c8910..8060c403c9c3f 100644
--- a/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/ResourceEndpoint.java
@@ -111,6 +111,21 @@ public boolean isContentCacheCleared() {
return buffer == null;
}
+ @ManagedAttribute(description = "Camel context ID")
+ public String getCamelId() {
+ return getCamelContext().getName();
+ }
+
+ @ManagedAttribute(description = "Camel ManagementName")
+ public String getCamelManagementName() {
+ return getCamelContext().getManagementName();
+ }
+
+ @ManagedAttribute(description = "Endpoint service state")
+ public String getState() {
+ return getStatus().name();
+ }
+
/**
* Sets whether to use resource content cache or not - default is false.
*
diff --git a/camel-core/src/main/java/org/apache/camel/component/seda/SedaEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/seda/SedaEndpoint.java
index f2c5fca7d6366..9d4ade2d90263 100644
--- a/camel-core/src/main/java/org/apache/camel/component/seda/SedaEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/seda/SedaEndpoint.java
@@ -415,11 +415,16 @@ public String browseRangeMessagesAsXml(Integer fromIndex, Integer toIndex, Boole
return EndpointHelper.browseRangeMessagesAsXml(this, fromIndex, toIndex, includeBody);
}
- @ManagedAttribute(description = "Camel context name")
+ @ManagedAttribute(description = "Camel context ID")
public String getCamelId() {
return getCamelContext().getName();
}
+ @ManagedAttribute(description = "Camel ManagementName")
+ public String getCamelManagementName() {
+ return getCamelContext().getManagementName();
+ }
+
@ManagedAttribute(description = "Endpoint service state")
public String getState() {
return getStatus().name();
diff --git a/camel-core/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java
index 61e3b880638ee..5b4dc3f8afc2f 100644
--- a/camel-core/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java
@@ -184,6 +184,11 @@ public String getCamelId() {
return this.getCamelContext().getName();
}
+ @ManagedAttribute(description = "Camel ManagementName")
+ public String getCamelManagementName() {
+ return this.getCamelContext().getManagementName();
+ }
+
@ManagedAttribute(description = "Endpoint Uri")
public String getEndpointUri() {
return super.getEndpointUri();
diff --git a/camel-core/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
index aa91b1a0d05eb..f6f505c5eefb2 100644
--- a/camel-core/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
@@ -68,6 +68,11 @@ public String getCamelId() {
return getCamelContext().getName();
}
+ @ManagedAttribute(description = "Camel ManagementName")
+ public String getCamelManagementName() {
+ return getCamelContext().getManagementName();
+ }
+
public XsltEndpoint findOrCreateEndpoint(String uri, String newResourceUri) {
String newUri = uri.replace(resourceUri, newResourceUri);
LOG.trace("Getting endpoint with URI: {}", newUri);
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java
index f7fec6c1c1d8f..ef5b95b657f28 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java
@@ -59,6 +59,7 @@ public boolean isFixedName() {
}
public static int getNextCounter() {
+ // we want to start counting from 1, so increment first
return CONTEXT_COUNTER.incrementAndGet();
}
diff --git a/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java b/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
index 68da7b87270cd..985857acf1e7c 100644
--- a/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
+++ b/camel-core/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
@@ -317,6 +317,8 @@ private Expression createSimpleExpressionDirectly(String expression) {
return ExpressionBuilder.camelContextNameExpression();
} else if (ObjectHelper.equal(expression, "routeId")) {
return ExpressionBuilder.routeIdExpression();
+ } else if (ObjectHelper.equal(expression, "null")) {
+ return ExpressionBuilder.nullExpression();
}
return null;
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java
index b301d6657c70b..16963915dd5e8 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedComponent.java
@@ -64,6 +64,10 @@ public String getCamelId() {
return component.getCamelContext().getName();
}
+ public String getCamelManagementName() {
+ return component.getCamelContext().getManagementName();
+ }
+
public Object getInstance() {
return component;
}
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java
index 83771a40ddbf3..deffddf88e40c 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEndpoint.java
@@ -45,6 +45,11 @@ public String getCamelId() {
return endpoint.getCamelContext().getName();
}
+ @Override
+ public String getCamelManagementName() {
+ return endpoint.getCamelContext().getManagementName();
+ }
+
@Override
public String getEndpointUri() {
return endpoint.getEndpointUri();
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedErrorHandler.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedErrorHandler.java
index 69cb4bf9b792b..d4fe005789f81 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedErrorHandler.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedErrorHandler.java
@@ -61,6 +61,10 @@ public String getCamelId() {
return routeContext.getCamelContext().getName();
}
+ public String getCamelManagementName() {
+ return routeContext.getCamelContext().getManagementName();
+ }
+
public boolean isSupportRedelivery() {
return errorHandler instanceof RedeliveryErrorHandler;
}
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java
index 885bc3b83aab6..c3d6dd3a8987f 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java
@@ -93,6 +93,10 @@ public String getCamelId() {
return context.getName();
}
+ public String getCamelManagementName() {
+ return context.getManagementName();
+ }
+
public String getRouteId() {
if (route != null) {
return route.getId();
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
index 1c6495aabdcd7..b1cc98448442b 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
@@ -108,6 +108,10 @@ public String getCamelId() {
return context.getName();
}
+ public String getCamelManagementName() {
+ return context.getManagementName();
+ }
+
public Boolean getTracing() {
return route.getRouteContext().isTracing();
}
@@ -232,7 +236,7 @@ public void updateRouteFromXml(String xml) throws Exception {
public String dumpRouteStatsAsXml(boolean fullStats, boolean includeProcessors) throws Exception {
// in this logic we need to calculate the accumulated processing time for the processor in the route
- // and hence why the logic is a bit more complicated to do this, as we need to caculate that from
+ // and hence why the logic is a bit more complicated to do this, as we need to calculate that from
// the bottom -> top of the route but this information is valuable for profiling routes
StringBuilder sb = new StringBuilder();
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java
index 1eb11b7ebfb0b..b5dffe0d813fe 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java
@@ -78,6 +78,10 @@ public String getCamelId() {
return context.getName();
}
+ public String getCamelManagementName() {
+ return context.getManagementName();
+ }
+
public String getRouteId() {
if (route != null) {
return route.getId();
diff --git a/camel-core/src/main/java/org/apache/camel/model/OptionalIdentifiedDefinition.java b/camel-core/src/main/java/org/apache/camel/model/OptionalIdentifiedDefinition.java
index 33b00b918ddad..f48097b4038b0 100644
--- a/camel-core/src/main/java/org/apache/camel/model/OptionalIdentifiedDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/OptionalIdentifiedDefinition.java
@@ -20,7 +20,6 @@
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import org.apache.camel.NamedNode;
@@ -35,8 +34,7 @@
@XmlAccessorType(XmlAccessType.PROPERTY)
public abstract class OptionalIdentifiedDefinition> implements NamedNode {
private String id;
- @XmlTransient
- private boolean customId;
+ private Boolean customId;
private DescriptionDefinition description;
/**
@@ -128,11 +126,20 @@ public String idOrCreate(NodeIdFactory factory) {
return getId();
}
+ public Boolean isCustomId() {
+ return customId;
+ }
+
+ @XmlAttribute
+ public void setCustomId(Boolean customId) {
+ this.customId = customId;
+ }
+
/**
* Returns whether a custom id has been assigned
*/
public boolean hasCustomIdAssigned() {
- return customId;
+ return customId != null && customId;
}
/**
diff --git a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
index 983ccbed96714..cb634c96986a0 100644
--- a/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
+++ b/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
@@ -101,6 +101,10 @@ public void testConstantExpression() throws Exception {
assertExpression("Hello World", "Hello World");
}
+ public void testNull() throws Exception {
+ assertNull(SimpleLanguage.simple("${null}").evaluate(exchange, Object.class));
+ }
+
public void testEmptyExpression() throws Exception {
assertExpression("", "");
assertExpression(" ", " ");
diff --git a/camel-core/src/test/java/org/apache/camel/model/GenerateXmFromCamelContextlTest.java b/camel-core/src/test/java/org/apache/camel/model/GenerateXmFromCamelContextTest.java
similarity index 94%
rename from camel-core/src/test/java/org/apache/camel/model/GenerateXmFromCamelContextlTest.java
rename to camel-core/src/test/java/org/apache/camel/model/GenerateXmFromCamelContextTest.java
index bd9223b3bcbe0..b711b109c04dd 100644
--- a/camel-core/src/test/java/org/apache/camel/model/GenerateXmFromCamelContextlTest.java
+++ b/camel-core/src/test/java/org/apache/camel/model/GenerateXmFromCamelContextTest.java
@@ -27,9 +27,9 @@
/**
* @version
*/
-public class GenerateXmFromCamelContextlTest extends ContextTestSupport {
+public class GenerateXmFromCamelContextTest extends ContextTestSupport {
- public void testCreateRouteFromCamelCOntext() throws Exception {
+ public void testCreateRouteFromCamelContext() throws Exception {
List list = context.getRouteDefinitions();
assertEquals("Size of list " + list, 1, list.size());
RouteDefinition routeType = list.get(0);
diff --git a/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteTest.java b/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteTest.java
index d32417121d71a..f63f7bb1cc99c 100644
--- a/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlTransformRouteTest.java
@@ -31,6 +31,7 @@ public void testDumpModelAsXml() throws Exception {
log.info(xml);
assertTrue(xml.contains("Hello ${body}"));
+ assertTrue(xml.contains(""));
}
@Override
@@ -40,7 +41,7 @@ protected RouteBuilder createRouteBuilder() throws Exception {
public void configure() throws Exception {
from("direct:start").routeId("myRoute")
.transform().simple("Hello ${body}")
- .to("mock:result");
+ .to("mock:result").id("myMock");
}
};
}
diff --git a/camel-core/src/test/java/org/apache/camel/util/jsse/SSLContextParametersTest.java b/camel-core/src/test/java/org/apache/camel/util/jsse/SSLContextParametersTest.java
index 7351ac5b89772..11c82b20cc994 100644
--- a/camel-core/src/test/java/org/apache/camel/util/jsse/SSLContextParametersTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/jsse/SSLContextParametersTest.java
@@ -27,6 +27,8 @@
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLSocket;
+import junit.framework.AssertionFailedError;
+
import org.apache.camel.CamelContext;
public class SSLContextParametersTest extends AbstractJsseParametersTest {
@@ -40,6 +42,12 @@ public void testFilter() {
Arrays.asList(new Pattern[0]));
assertEquals(2, result.size());
assertStartsWith(result, "TLS");
+ try {
+ assertStartsWith((String[]) null, "TLS");
+ fail("We chould got an exception here!");
+ } catch (AssertionFailedError ex) {
+ assertEquals("Get a wrong message", "The values should not be null", ex.getMessage());
+ }
}
public void testPropertyPlaceholders() throws Exception {
@@ -752,14 +760,16 @@ protected String[] getDefaultCipherSuiteIncludes(String[] availableCipherSuites)
}
protected void assertStartsWith(String[] values, String prefix) {
+ assertNotNull("The values should not be null", values);
for (String value : values) {
- assertTrue(value.startsWith(prefix));
+ assertTrue(value + " does not start with the prefix " + prefix, value.startsWith(prefix));
}
}
protected void assertStartsWith(Collection values, String prefix) {
+ assertNotNull("The values should not be null", values);
for (String value : values) {
- assertTrue(value.startsWith(prefix));
+ assertTrue(value + " does not start with the prefix " + prefix, value.startsWith(prefix));
}
}
}
diff --git a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextNameStrategy.java b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextNameStrategy.java
index 0f3fba92c0b77..a68c242980bad 100644
--- a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextNameStrategy.java
+++ b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextNameStrategy.java
@@ -16,15 +16,86 @@
*/
package org.apache.camel.core.osgi;
-import org.apache.camel.impl.DefaultCamelContextNameStrategy;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelContextNameStrategy;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.core.osgi.OsgiCamelContextPublisher.CONTEXT_NAME_PROPERTY;
+
+/**
+ * In OSGi we want to use a {@link CamelContextNameStrategy} that finds a free name in the
+ * OSGi Service Registry to be used for auto assigned names.
+ *
+ * If there is a name clash in the OSGi registry, then a new candidate name is used by appending
+ * a unique counter.
+ */
+public class OsgiCamelContextNameStrategy implements CamelContextNameStrategy {
-public class OsgiCamelContextNameStrategy extends DefaultCamelContextNameStrategy {
+ private static final Logger LOG = LoggerFactory.getLogger(OsgiCamelContextNameStrategy.class);
+ private static final AtomicInteger CONTEXT_COUNTER = new AtomicInteger(0);
+ private final BundleContext context;
+ private final String prefix = "camel";
+ private volatile String name;
public OsgiCamelContextNameStrategy(BundleContext context) {
- // use bundle id in auto assigned names to make it unique and have the bundle id as prefix
- // which makes the ordering of the camel apps in JMX nicely sorted
- super(context.getBundle().getBundleId() + "-camel");
+ this.context = context;
+ }
+
+ @Override
+ public String getName() {
+ if (name == null) {
+ name = getNextName();
+ }
+ return name;
+ }
+
+ @Override
+ public synchronized String getNextName() {
+ String candidate = null;
+ boolean clash = false;
+
+ do {
+ try {
+ clash = false;
+
+ // generate new candidate
+ candidate = prefix + "-" + getNextCounter();
+ LOG.trace("Checking OSGi Service Registry for existence of existing CamelContext with name: {}", candidate);
+
+ ServiceReference[] refs = context.getServiceReferences(CamelContext.class.getName(), "(" + CONTEXT_NAME_PROPERTY + "=" + candidate + ")");
+ if (refs != null && refs.length > 0) {
+ for (ServiceReference ref : refs) {
+ Object id = ref.getProperty(CONTEXT_NAME_PROPERTY);
+ if (id != null && candidate.equals(id)) {
+ clash = true;
+ break;
+ }
+ }
+ }
+ } catch (InvalidSyntaxException e) {
+ LOG.debug("Error finding free Camel name in OSGi Service Registry due " + e.getMessage() + ". This exception is ignored.", e);
+ break;
+ }
+ } while (clash);
+
+ LOG.debug("Generated CamelContext name for bundle id: {}, clash: {} -> {}", new Object[]{context.getBundle().getBundleId(), clash, candidate});
+ return candidate;
+ }
+
+ @Override
+ public boolean isFixedName() {
+ return false;
+ }
+
+ public static int getNextCounter() {
+ // we want to start counting from 1, so increment first
+ return CONTEXT_COUNTER.incrementAndGet();
}
}
diff --git a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java
index 9b6a151076504..f870ca20fe520 100644
--- a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java
+++ b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java
@@ -23,7 +23,7 @@
import org.osgi.framework.BundleContext;
/**
- * OSGI enhanced {@link org.apache.camel.spi.ManagementNameStrategy}.
+ * OSGi enhanced {@link org.apache.camel.spi.ManagementNameStrategy}.
*
* This {@link org.apache.camel.spi.ManagementNameStrategy} supports the default
* tokens (see {@link DefaultManagementNameStrategy}) and the following additional OSGi specific tokens
@@ -33,8 +33,9 @@
* #symbolicName# - The bundle symbolic name
*
*
- * This implementation will by default use a name pattern as #bundleId#-#name# and in case
- * of a clash, then the pattern will fallback to be using the counter as #bundleId#-#name#-#counter#.
+ * This implementation will by default use a name pattern as #symbolicName# and in case
+ * of a clash (such as multiple versions of the same symbolicName),
+ * then the pattern will fallback to append an unique counter #symbolicName#-#counter#.
*
* @see DefaultManagementNameStrategy
*/
@@ -43,7 +44,7 @@ public class OsgiManagementNameStrategy extends DefaultManagementNameStrategy {
private final BundleContext bundleContext;
public OsgiManagementNameStrategy(CamelContext camelContext, BundleContext bundleContext) {
- super(camelContext, "#bundleId#-#name#", "#bundleId#-#name#-#counter#");
+ super(camelContext, "#symbolicName#", "#symbolicName#-#counter#");
this.bundleContext = bundleContext;
}
diff --git a/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java b/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
index 7e1672db7a5da..e7a215421fcc5 100644
--- a/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
+++ b/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
@@ -68,9 +68,10 @@ public static void propagateCamelToCxf(HeaderFilterStrategy strategy,
if (Exchange.CONTENT_TYPE.equals(entry.getKey())) {
message.put(Message.CONTENT_TYPE, entry.getValue());
- } else if (Client.REQUEST_CONTEXT.equals(entry.getKey())
- || Client.RESPONSE_CONTEXT.equals(entry.getKey())
- || Message.RESPONSE_CODE.equals(entry.getKey())) {
+ }
+ if (Client.REQUEST_CONTEXT.equals(entry.getKey())
+ || Client.RESPONSE_CONTEXT.equals(entry.getKey())
+ || Message.RESPONSE_CODE.equals(entry.getKey())) {
message.put(entry.getKey(), entry.getValue());
} else {
Object values = entry.getValue();
diff --git a/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelperTest.java b/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelperTest.java
index 25fd240dfb71b..9698f263661da 100755
--- a/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelperTest.java
+++ b/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelperTest.java
@@ -17,6 +17,7 @@
package org.apache.camel.component.cxf.common.header;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@@ -26,11 +27,15 @@
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.impl.DefaultHeaderFilterStrategy;
-
+import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageImpl;
+import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
+
/**
*
*/
@@ -104,7 +109,24 @@ public void testPropagateCxfToCamelWithMerged() {
assertEquals("peach", camelHeaders.get("MyFruitHeader"));
assertEquals("cappuccino, espresso", camelHeaders.get("MyBrewHeader"));
}
-
+
+ @Test
+ public void testContentType() {
+
+ Exchange camelExchange = EasyMock.createMock(Exchange.class);
+ HeaderFilterStrategy strategy = setupHeaderStrategy(camelExchange);
+ Message cxfMessage = new MessageImpl();
+ CxfHeaderHelper.propagateCamelToCxf(strategy,
+ Collections.singletonMap("Content-Type", "text/xml"), cxfMessage, camelExchange);
+
+ Map> cxfHeaders = CastUtils.cast((Map, ?>)cxfMessage.get(Message.PROTOCOL_HEADERS));
+ assertEquals(1, cxfHeaders.size());
+ assertEquals(1, cxfHeaders.get("Content-Type").size());
+ assertEquals("text/xml", cxfHeaders.get("Content-Type").get(0));
+
+ assertEquals("text/xml", cxfMessage.get(Message.CONTENT_TYPE));
+ }
+
private void verifyHeader(Map> headers, String name, List value) {
List values = headers.get(name);
assertTrue("The entry must be available", values != null && values.size() == ((List>)value).size());
@@ -116,4 +138,14 @@ private void verifyHeader(Map> headers, String name, String
assertTrue("The entry must be available", values != null && values.size() == 1);
assertEquals("The value must match", value, values.get(0));
}
+
+ private HeaderFilterStrategy setupHeaderStrategy(Exchange exchange) {
+
+ HeaderFilterStrategy strategy = EasyMock.createMock(HeaderFilterStrategy.class);
+ strategy.applyFilterToCamelHeaders("Content-Type", "text/xml", exchange);
+ EasyMock.expectLastCall().andReturn(false);
+ EasyMock.replay(strategy);
+ return strategy;
+ }
+
}
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java
index 1e1296b944db9..0b4c816866201 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java
@@ -408,6 +408,10 @@ public void setSchemaLocation(String schema) {
public void setSchemaLocations(List schemas) {
this.schemaLocations = schemas;
}
+
+ public List getSchemaLocations() {
+ return schemaLocations;
+ }
/**
* See documentation of {@link BindingStyle}.
diff --git a/components/camel-disruptor/src/main/java/org/apache/camel/component/disruptor/DisruptorEndpoint.java b/components/camel-disruptor/src/main/java/org/apache/camel/component/disruptor/DisruptorEndpoint.java
index 9ed263ca75107..9ad8cfbd55f87 100644
--- a/components/camel-disruptor/src/main/java/org/apache/camel/component/disruptor/DisruptorEndpoint.java
+++ b/components/camel-disruptor/src/main/java/org/apache/camel/component/disruptor/DisruptorEndpoint.java
@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.camel.component.disruptor;
import java.util.Collection;
@@ -32,8 +31,10 @@
import org.apache.camel.MultipleConsumersSupport;
import org.apache.camel.Processor;
import org.apache.camel.Producer;
+import org.apache.camel.ServiceStatus;
import org.apache.camel.WaitForTaskToComplete;
import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedResource;
import org.apache.camel.impl.DefaultEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,20 +44,16 @@
* for asynchronous SEDA exchanges on an
* LMAX Disruptor within a CamelContext
*/
-
+@ManagedResource(description = "Managed Disruptor Endpoint")
public class DisruptorEndpoint extends DefaultEndpoint implements MultipleConsumersSupport {
public static final String DISRUPTOR_IGNORE_EXCHANGE = "disruptor.ignoreExchange";
private static final Logger LOGGER = LoggerFactory.getLogger(DisruptorEndpoint.class);
-
private final int concurrentConsumers;
private final boolean multipleConsumers;
private WaitForTaskToComplete waitForTaskToComplete = WaitForTaskToComplete.IfReplyExpected;
-
private long timeout = 30000;
-
private boolean blockWhenFull;
-
private final Set producers = new CopyOnWriteArraySet();
private final Set consumers = new CopyOnWriteArraySet();
@@ -72,6 +69,31 @@ public DisruptorEndpoint(final String endpointUri, final Component component,
this.blockWhenFull = blockWhenFull;
}
+ @ManagedAttribute(description = "Camel ID")
+ public String getCamelId() {
+ return getCamelContext().getName();
+ }
+
+ @ManagedAttribute(description = "Camel ManagementName")
+ public String getCamelManagementName() {
+ return getCamelContext().getManagementName();
+ }
+
+ @ManagedAttribute(description = "Endpoint Uri", mask = true)
+ public String getEndpointUri() {
+ return super.getEndpointUri();
+ }
+
+ @ManagedAttribute(description = "Service State")
+ public String getState() {
+ ServiceStatus status = this.getStatus();
+ // if no status exists then its stopped
+ if (status == null) {
+ status = ServiceStatus.Stopped;
+ }
+ return status.name();
+ }
+
@ManagedAttribute(description = "Buffer max capacity")
public int getBufferSize() {
return disruptorReference.getBufferSize();
@@ -87,7 +109,6 @@ public long getPendingExchangeCount() throws DisruptorNotStartedException {
return getDisruptor().getPendingExchangeCount();
}
-
@ManagedAttribute(description = "Number of concurrent consumers")
public int getConcurrentConsumers() {
return concurrentConsumers;
@@ -165,23 +186,18 @@ public Consumer createConsumer(final Processor processor) throws Exception {
@Override
protected void doStart() throws Exception {
- LOGGER.debug("Start enpoint {}", this);
// notify reference we are shutting down this endpoint
disruptorReference.addEndpoint(this);
-
- super.doStart(); //To change body of overridden methods use File | Settings | File Templates.
+ super.doStart();
}
@Override
protected void doStop() throws Exception {
- LOGGER.debug("Stop enpoint {}", this);
// notify reference we are shutting down this endpoint
disruptorReference.removeEndpoint(this);
-
- super.doStop(); //To change body of overridden methods use File | Settings | File Templates.
+ super.doStop();
}
-
@Override
protected void doShutdown() throws Exception {
// notify component we are shutting down this endpoint
@@ -204,35 +220,24 @@ void onStarted(final DisruptorConsumer consumer) throws Exception {
throw new IllegalStateException(
"Multiple consumers for the same endpoint is not allowed: " + this);
}
-
if (consumers.add(consumer)) {
LOGGER.debug("Starting consumer {} on endpoint {}", consumer, getEndpointUri());
-
getDisruptor().reconfigure();
-
} else {
- LOGGER.debug("Tried to start Consumer {} on endpoint {} but it was already started", consumer,
- getEndpointUri());
+ LOGGER.debug("Tried to start Consumer {} on endpoint {} but it was already started", consumer, getEndpointUri());
}
}
-
}
void onStopped(final DisruptorConsumer consumer) throws Exception {
synchronized (this) {
-
if (consumers.remove(consumer)) {
LOGGER.debug("Stopping consumer {} on endpoint {}", consumer, getEndpointUri());
-
getDisruptor().reconfigure();
-
} else {
- LOGGER.debug("Tried to stop Consumer {} on endpoint {} but it was already stopped", consumer,
- getEndpointUri());
+ LOGGER.debug("Tried to stop Consumer {} on endpoint {} but it was already stopped", consumer, getEndpointUri());
}
-
-
}
}
diff --git a/components/camel-gora/pom.xml b/components/camel-gora/pom.xml
new file mode 100644
index 0000000000000..d808643808948
--- /dev/null
+++ b/components/camel-gora/pom.xml
@@ -0,0 +1,178 @@
+
+
+
+ 4.0.0
+
+
+ org.apache.camel
+ components
+ 2.13-SNAPSHOT
+
+
+ camel-gora
+ bundle
+ Camel :: Gora
+
+
+ Gora Component for Apache Camel.
+
+
+
+
+ org.apache.camel.component.gora.*
+
+
+ org.apache.camel.*
+ com.google.common.base;version="[11,14)",
+ org.apache.hadoop.conf;version="[1,2)"
+
+ org.apache.camel.component.gora.*
+ org.apache.camel.spi.ComponentResolver;component=gora
+
+
+
+
+
+
+ maven-surefire-plugin
+
+
+
+ warn
+
+
+
+
+
+
+
+
+
+
+
+ org.slf4j
+ slf4j-simple
+ test
+
+
+
+
+ junit
+ junit
+ test
+
+
+ org.mockito
+ mockito-all
+ ${mockito-version}
+ test
+
+
+ org.powermock
+ powermock-core
+ ${powermock-version}
+ test
+
+
+ org.powermock
+ powermock-module-junit4
+ ${powermock-version}
+ test
+
+
+ org.powermock
+ powermock-api-mockito
+ ${powermock-version}
+ test
+
+
+ org.apache.camel
+ camel-test
+ test
+
+
+ org.apache.camel
+ camel-test-spring
+ test
+
+
+
+
+ org.apache.camel
+ camel-core
+
+
+
+
+ org.apache.gora
+ gora-core
+ ${apache-gora-version}
+
+
+
+
+ org.apache.servicemix.bundles
+ org.apache.servicemix.bundles.hadoop-core
+ ${hadoop-bundle-version}
+
+
+ commons-beanutils
+ commons-beanutils-core
+
+
+
+
+
+
+ org.apache.servicemix.bundles
+ org.apache.servicemix.bundles.avro
+ ${avro-bundle-version}
+
+
+
+
+
+ org.codehaus.jackson
+ jackson-core-asl
+ ${jackson-version}
+
+
+ org.codehaus.jackson
+ jackson-mapper-asl
+ ${jackson-version}
+
+
+ org.apache.servicemix.bundles
+ org.apache.servicemix.bundles.jdom
+ ${jdom-bundle-version}
+
+
+ com.google.guava
+ guava
+ ${google-guava-version}
+
+
+ org.apache.servicemix.bundles
+ org.apache.servicemix.bundles.commons-beanutils
+ ${commons-beanutils-bundle-version}
+
+
+
+
diff --git a/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraAttribute.java b/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraAttribute.java
new file mode 100644
index 0000000000000..aeab95f469d13
--- /dev/null
+++ b/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraAttribute.java
@@ -0,0 +1,106 @@
+/**
+ * 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.gora;
+
+/**
+ * Camel-Gora attributes
+ *
+ * @author ipolyzos
+ */
+public enum GoraAttribute {
+
+ /**
+ * Gora KEY attribute
+ */
+ GORA_KEY("goraKey"),
+
+ /**
+ * Gora operation header name
+ */
+ GORA_OPERATION("goraOperation"),
+
+ /**
+ * Gora Query Start Time attribute
+ */
+ GORA_QUERY_START_TIME("startTime"),
+
+ /**
+ * Gora Query End Time attribute
+ */
+ GORA_QUERY_END_TIME("endTime"),
+
+ /**
+ * Gora Query Start Key attribute
+ */
+ GORA_QUERY_START_KEY("startKey"),
+
+ /**
+ * Gora Query End Key attribute
+ */
+ GORA_QUERY_END_KEY("endKey"),
+
+ /**
+ * Gora Query Key Range From attribute
+ */
+ GORA_QUERY_KEY_RANGE_FROM("keyRangeFrom"),
+
+ /**
+ * Gora Query Key Range To attribute
+ */
+ GORA_QUERY_KEY_RANGE_TO("keyRangeTo"),
+
+ /**
+ * Gora Query Time Range From attribute
+ */
+ GORA_QUERY_TIME_RANGE_FROM("timeRangeFrom"),
+
+ /**
+ * Gora Query Key Range To attribute
+ */
+ GORA_QUERY_TIME_RANGE_TO("timeRangeTo"),
+
+ /**
+ * Gora Query Limit attribute
+ */
+ GORA_QUERY_LIMIT("limit"),
+
+ /**
+ * Gora Query Timestamp attribute
+ */
+ GORA_QUERY_TIMESTAMP("timestamp"),
+
+ /**
+ * Gora Query Fields attribute
+ */
+ GORA_QUERY_FIELDS("fields");
+ /**
+ * Enum value
+ */
+ public final String value;
+
+ /**
+ * Enum constructor
+ *
+ * @param str Operation Value
+ */
+ private GoraAttribute(final String str) {
+
+ value = str;
+ }
+
+}
diff --git a/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraComponent.java b/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraComponent.java
new file mode 100644
index 0000000000000..546b9dc06ac5d
--- /dev/null
+++ b/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraComponent.java
@@ -0,0 +1,122 @@
+/**
+ * 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.gora;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+import org.apache.gora.persistency.Persistent;
+import org.apache.gora.store.DataStore;
+import org.apache.gora.store.DataStoreFactory;
+import org.apache.hadoop.conf.Configuration;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.apache.camel.component.gora.GoraConstants.GORA_DEFAULT_DATASTORE_KEY;
+
+/**
+ * Camel-Gora {@link Endpoint}.
+ */
+public class GoraComponent extends DefaultComponent {
+
+ /**
+ * GORA datastore
+ */
+ private DataStore