You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2009/09/01 09:58:03 UTC

svn commit: r809874 - /camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java

Author: ningjiang
Date: Tue Sep  1 07:58:03 2009
New Revision: 809874

URL: http://svn.apache.org/viewvc?rev=809874&view=rev
Log:
CAMEL-1966 Fixed the multi-thread issue of CamelNamespaceHandler

Modified:
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java

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=809874&r1=809873&r2=809874&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 Tue Sep  1 07:58:03 2009
@@ -61,7 +61,6 @@
     protected BeanDefinitionParser endpointParser = new BeanDefinitionParser(CamelEndpointFactoryBean.class);
     protected BeanDefinitionParser beanPostProcessorParser = new BeanDefinitionParser(CamelBeanPostProcessor.class);
     protected Set<String> parserElementNames = new HashSet<String>();
-    protected Binder<Node> binder;
     private JAXBContext jaxbContext;
     private Map<String, BeanDefinitionParser> parserMap = new HashMap<String, BeanDefinitionParser>();
     private Map<String, BeanDefinition> autoRegisterMap = new HashMap<String, BeanDefinition>();
@@ -139,9 +138,8 @@
         return parserElementNames;
     }
 
-    protected Object parseUsingJaxb(Element element, ParserContext parserContext) {
+    protected Object parseUsingJaxb(Element element, ParserContext parserContext, Binder<Node> binder) {
         try {
-            binder = getJaxbContext().createBinder();
             return binder.unmarshal(element);
         } catch (JAXBException e) {
             throw new BeanDefinitionStoreException("Failed to parse JAXB element: " + e, e);
@@ -196,7 +194,13 @@
             }
 
             // now lets parse the routes with JAXB
-            Object value = parseUsingJaxb(element, parserContext);
+            Binder<Node> binder = null;
+            try {
+                binder = getJaxbContext().createBinder();
+            } catch (JAXBException e) {
+                throw new BeanDefinitionStoreException("Failed to parse JAXB element: " + e, e);
+            }
+            Object value = parseUsingJaxb(element, parserContext, binder);
             
             if (value instanceof CamelContextFactoryBean) {
                 // set the property value with the JAXB parsed value
@@ -254,13 +258,13 @@
            
 
             // register as endpoint defined indirectly in the routes by from/to types having id explict set
-            registerEndpointsWithIdsDefinedInFromOrToTypes(element, parserContext, contextId);
+            registerEndpointsWithIdsDefinedInFromOrToTypes(element, parserContext, contextId, binder);
 
             // register templates if not already defined
             registerTemplates(element, parserContext, contextId);
 
             // lets inject the namespaces into any namespace aware POJOs
-            injectNamespaces(element);
+            injectNamespaces(element, binder);
             if (!createdBeanPostProcessor) {
                 // no bean processor element so lets create it by ourself
                 Element childElement = element.getOwnerDocument().createElement("beanPostProcessor");
@@ -271,7 +275,7 @@
 
     }
 
-    protected void injectNamespaces(Element element) {
+    protected void injectNamespaces(Element element, Binder<Node> binder) {
         NodeList list = element.getChildNodes();
         Namespaces namespaces = null;
         int size = list.getLength();
@@ -287,7 +291,7 @@
                     }
                     namespaces.configure(namespaceAware);
                 }
-                injectNamespaces(childElement);
+                injectNamespaces(childElement, binder);
             }
         }
     }
@@ -295,7 +299,7 @@
     /**
      * Used for auto registering endpoints from the <tt>from</tt> or <tt>to</tt> DSL if they have an id attribute set
      */
-    protected void registerEndpointsWithIdsDefinedInFromOrToTypes(Element element, ParserContext parserContext, String contextId) {
+    protected void registerEndpointsWithIdsDefinedInFromOrToTypes(Element element, ParserContext parserContext, String contextId, Binder<Node> binder) {
         NodeList list = element.getChildNodes();
         int size = list.getLength();
         for (int i = 0; i < size; i++) {
@@ -308,7 +312,7 @@
                     registerEndpoint(childElement, parserContext, contextId);
                 }
                 // recursive
-                registerEndpointsWithIdsDefinedInFromOrToTypes(childElement, parserContext, contextId);
+                registerEndpointsWithIdsDefinedInFromOrToTypes(childElement, parserContext, contextId, binder);
             }
         }
     }