Author: davsclaus
Date: Thu Aug 12 13:50:48 2010
New Revision: 984775
URL: http://svn.apache.org/viewvc?rev=984775&view=rev
Log:
CAMEL-3050: Fixed routeBuilderRef and Spring 3 dependency injection not working as expected.
Thanks to janstey for helping out.
Modified:
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/config/routeBuilderRef2.xml
Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java?rev=984775&r1=984774&r2=984775&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
(original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
Thu Aug 12 13:50:48 2010
@@ -220,7 +220,7 @@ public class CamelNamespaceHandler exten
Object value = parseUsingJaxb(element, parserContext, binder);
if (value instanceof CamelRouteContextFactoryBean) {
- CamelRouteContextFactoryBean factoryBean = (CamelRouteContextFactoryBean)value;
+ CamelRouteContextFactoryBean factoryBean = (CamelRouteContextFactoryBean)
value;
builder.addPropertyValue("routes", factoryBean.getRoutes());
}
}
@@ -257,10 +257,10 @@ public class CamelNamespaceHandler exten
throw new BeanDefinitionStoreException("Failed to create the JAXB binder",
e);
}
Object value = parseUsingJaxb(element, parserContext, binder);
-
+
if (value instanceof CamelContextFactoryBean) {
// set the property value with the JAXB parsed value
- CamelContextFactoryBean factoryBean = (CamelContextFactoryBean)value;
+ CamelContextFactoryBean factoryBean = (CamelContextFactoryBean) value;
builder.addPropertyValue("id", contextId);
builder.addPropertyValue("implicitId", implicitId);
builder.addPropertyValue("routes", factoryBean.getRoutes());
@@ -291,13 +291,15 @@ public class CamelNamespaceHandler exten
for (int i = 0; i < size; i++) {
Node child = list.item(i);
if (child instanceof Element) {
- Element childElement = (Element)child;
+ Element childElement = (Element) child;
String localName = child.getLocalName();
if (localName.equals("beanPostProcessor")) {
createBeanPostProcessor(parserContext, contextId, childElement, builder);
createdBeanPostProcessor = true;
} else if (localName.equals("endpoint")) {
registerEndpoint(childElement, parserContext, contextId);
+ } else if (localName.equals("routeBuilder")) {
+ addDependsOnToRouteBuilder(childElement, parserContext, contextId);
} else {
BeanDefinitionParser parser = parserMap.get(localName);
if (parser != null) {
@@ -307,7 +309,7 @@ public class CamelNamespaceHandler exten
parserContext.registerComponent(new BeanComponentDefinition(definition,
id));
// set the templates with the camel context
if (localName.equals("template") || localName.equals("consumerTemplate")
- || localName.equals("proxy") || localName.equals("export"))
{
+ || localName.equals("proxy") || localName.equals("export"))
{
// set the camel context
definition.getPropertyValues().addPropertyValue("camelContext",
new RuntimeBeanReference(contextId));
}
@@ -353,6 +355,21 @@ public class CamelNamespaceHandler exten
}
}
+ private void addDependsOnToRouteBuilder(Element childElement, ParserContext parserContext,
String contextId) {
+ // setting the depends-on explicitly is required since Spring 3.0
+ String routeBuilderName = childElement.getAttribute("ref");
+ if (ObjectHelper.isNotEmpty(routeBuilderName)) {
+ // set depends-on to the context for a routeBuilder bean
+ try {
+ BeanDefinition definition = parserContext.getRegistry().getBeanDefinition(routeBuilderName);
+ Method method = definition.getClass().getMethod("setDependsOn", String[].class);
+ method.invoke(definition, (Object) new String[]{contextId});
+ } catch (Exception e) {
+ // Do nothing here
+ }
+ }
+ }
+
protected void injectNamespaces(Element element, Binder<Node> binder) {
NodeList list = element.getChildNodes();
Namespaces namespaces = null;
@@ -360,10 +377,10 @@ public class CamelNamespaceHandler exten
for (int i = 0; i < size; i++) {
Node child = list.item(i);
if (child instanceof Element) {
- Element childElement = (Element)child;
+ Element childElement = (Element) child;
Object object = binder.getJAXBNode(child);
if (object instanceof NamespaceAware) {
- NamespaceAware namespaceAware = (NamespaceAware)object;
+ NamespaceAware namespaceAware = (NamespaceAware) object;
if (namespaces == null) {
namespaces = new Namespaces(element);
}
@@ -383,7 +400,7 @@ public class CamelNamespaceHandler exten
for (int i = 0; i < size; i++) {
Node child = list.item(i);
if (child instanceof Element) {
- Element childElement = (Element)child;
+ Element childElement = (Element) child;
Object object = binder.getJAXBNode(child);
// we only want from/to types to be registered as endpoints
if (object instanceof FromDefinition || object instanceof SendDefinition)
{
@@ -407,7 +424,7 @@ public class CamelNamespaceHandler exten
for (int i = 0; i < size; i++) {
Node child = list.item(i);
if (child instanceof Element) {
- Element childElement = (Element)child;
+ Element childElement = (Element) child;
String localName = childElement.getLocalName();
if ("template".equals(localName)) {
template = true;
@@ -492,8 +509,8 @@ public class CamelNamespaceHandler exten
// end user must manually add the needed XML elements and provide unique ids
access all camel context himself.
if (LOG.isDebugEnabled()) {
LOG.debug("Unregistered default: " + definition.getBeanClassName() + " with
id: " + id
- + " as we have multiple camel contexts and they must use unique ids."
- + " You must define the definition in the XML file manually to avoid
id clashes when using multiple camel contexts");
+ + " as we have multiple camel contexts and they must use unique ids."
+ + " You must define the definition in the XML file manually to avoid
id clashes when using multiple camel contexts");
}
parserContext.getRegistry().removeBeanDefinition(id);
@@ -509,12 +526,12 @@ public class CamelNamespaceHandler exten
// Need to add this dependency of CamelContext for Spring 3.0
try {
Method method = definition.getClass().getMethod("setDependsOn", String[].class);
- method.invoke(definition, (Object)new String[]{contextId});
+ method.invoke(definition, (Object) new String[]{contextId});
} catch (Exception e) {
// Do nothing here
}
parserContext.registerBeanComponent(new BeanComponentDefinition(definition, id));
}
}
-
+
}
Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/config/routeBuilderRef2.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/config/routeBuilderRef2.xml?rev=984775&r1=984774&r2=984775&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/config/routeBuilderRef2.xml
(original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/config/routeBuilderRef2.xml
Thu Aug 12 13:50:48 2010
@@ -22,7 +22,7 @@
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
">
- <bean id="configuredRouteBuilder2" class="org.apache.camel.spring.xml.ConfiguredRouteBuilder2"
depends-on="myQueue">
+ <bean id="configuredRouteBuilder2" class="org.apache.camel.spring.xml.ConfiguredRouteBuilder2">
<property name="queueName" ref="myQueue"/>
</bean>
|