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 2010/03/27 05:24:47 UTC

svn commit: r928142 - in /camel/trunk/components: camel-jms/src/test/resources/org/apache/camel/component/jms/tx/ camel-spring/src/main/java/org/apache/camel/spring/ camel-spring/src/main/java/org/apache/camel/spring/handler/ camel-spring/src/test/java...

Author: ningjiang
Date: Sat Mar 27 04:24:46 2010
New Revision: 928142

URL: http://svn.apache.org/viewvc?rev=928142&view=rev
Log:
CAMEL-1799 Added unit test of the ErrorHandlerDefinitionParser

Added:
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/ErrorHandlerDefintionParserTest.java   (with props)
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/MyErrorProcessor.java   (with props)
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml   (with props)
Modified:
    camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerCustomerSpringParserTest.xml
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefintion.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java

Modified: camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerCustomerSpringParserTest.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerCustomerSpringParserTest.xml?rev=928142&r1=928141&r2=928142&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerCustomerSpringParserTest.xml (original)
+++ camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerCustomerSpringParserTest.xml Sat Mar 27 04:24:46 2010
@@ -66,7 +66,7 @@
     <!-- the transaction error handle we refer to from the route -->
     <camel:errorHandler id="transactionErrorHandler" type="TransactionErrorHandler">
         <camel:transactionTemplate>
-         	<refbean value="PROPAGATION_REQUIRED"/>
+         	<ref bean="PROPAGATION_REQUIRED"/>
         </camel:transactionTemplate>
     </camel:errorHandler>
 

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefintion.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefintion.java?rev=928142&r1=928141&r2=928142&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefintion.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefintion.java Sat Mar 27 04:24:46 2010
@@ -44,7 +44,7 @@ public class ErrorHandlerDefintion exten
     @XmlAttribute(required = false)
     private LoggingLevel level;
     @XmlAttribute(required = false)
-    private Boolean handled;
+    private Boolean handled = true;
     @XmlAttribute(required = false)
     private Boolean useOriginalMessage;
     @XmlElement(name = "redeliveryPolicy", required = false)

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java?rev=928142&r1=928141&r2=928142&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java Sat Mar 27 04:24:46 2010
@@ -35,10 +35,12 @@ import org.apache.camel.util.ObjectHelpe
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanDefinitionHolder;
 import org.springframework.beans.factory.config.RuntimeBeanReference;
 import org.springframework.beans.factory.parsing.BeanComponentDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
+import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate;
 import org.springframework.beans.factory.xml.ParserContext;
 
 /**
@@ -109,15 +111,66 @@ public class ErrorHandlerDefinitionParse
                         builder.addPropertyValue(localName, redeliveryPolicyDefinition);
                     }
                     if (localName.equals("exceptionPolicyStrategy") || localName.equals("onRedelivery")
-                        || localName.equals("failureProcessor") || localName.equals("deadLetter")) {
-                        Object value = parserContext.getDelegate().parsePropertySubElement(childElement, builder.getBeanDefinition());
-                        builder.addPropertyValue(localName, value);
+                        || localName.equals("failureProcessor") || localName.equals("deadLetter")
+                        || localName.equals("transactionTemplate")) {
+                        // only deal with the first subElement
+                        setFirstChildAsProperty(childElement, parserContext, builder, localName);
                     }
                 }
             }
         }
     }
     
+    protected void setFirstChildAsProperty(Element element, ParserContext ctx, BeanDefinitionBuilder bean,
+                                           String propertyName) {
+
+        Element first = getFirstElement(element);
+
+        if (first == null) {
+            throw new IllegalStateException(propertyName + " property must have child elements!");
+        }
+
+        String id;
+        BeanDefinition child;
+        if (first.getNamespaceURI().equals(BeanDefinitionParserDelegate.BEANS_NAMESPACE_URI)) {
+            String name = first.getLocalName();
+            if ("ref".equals(name)) {
+                id = first.getAttribute("bean");
+                if (id == null) {
+                    throw new IllegalStateException("<ref> elements must have a \"bean\" attribute!");
+                }
+                bean.addPropertyReference(propertyName, id);
+                return;
+            } else if ("bean".equals(name)) {
+                BeanDefinitionHolder bdh = ctx.getDelegate().parseBeanDefinitionElement(first);
+                child = bdh.getBeanDefinition();
+                bean.addPropertyValue(propertyName, child);
+                return;
+            } else {
+                throw new UnsupportedOperationException("Elements with the name " + name
+                                                        + " are not currently "
+                                                        + "supported as sub elements of "
+                                                        + element.getLocalName());
+            }
+        }
+        child = ctx.getDelegate().parseCustomElement(first, bean.getBeanDefinition());
+        bean.addPropertyValue(propertyName, child);
+    }
+    
+    /**
+     * Get the first direct child with a given type
+     */
+    public static Element getFirstElement(Node parent) {
+        Node n = parent.getFirstChild();
+        while (n != null && Node.ELEMENT_NODE != n.getNodeType()) {
+            n = n.getNextSibling();
+        }
+        if (n == null) {
+            return null;
+        }
+        return (Element)n;
+    }
+    
     class RedeliveryPolicyDefinitionParser extends BeanDefinitionParser {
         public RedeliveryPolicyDefinitionParser(Class type) {
             super(type);

Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/ErrorHandlerDefintionParserTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/ErrorHandlerDefintionParserTest.java?rev=928142&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/ErrorHandlerDefintionParserTest.java (added)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/ErrorHandlerDefintionParserTest.java Sat Mar 27 04:24:46 2010
@@ -0,0 +1,88 @@
+/**
+ * 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.handler;
+
+import junit.framework.TestCase;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.DeadLetterChannelBuilder;
+import org.apache.camel.builder.DefaultErrorHandlerBuilder;
+import org.apache.camel.builder.LoggingErrorHandlerBuilder;
+import org.apache.camel.component.direct.DirectEndpoint;
+import org.apache.camel.processor.DefaultErrorHandler;
+import org.apache.camel.processor.RedeliveryPolicy;
+import org.apache.camel.processor.exceptionpolicy.DefaultExceptionPolicyStrategy;
+import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy;
+import org.apache.camel.spring.spi.TransactionErrorHandlerBuilder;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class ErrorHandlerDefintionParserTest extends TestCase {
+    protected ClassPathXmlApplicationContext ctx;
+    
+    public void setUp() throws Exception {
+        ctx =  new ClassPathXmlApplicationContext("org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml");
+    }
+
+    
+    public void tearDown() throws Exception {
+        ctx.close();        
+    }
+    
+    public void testLoggingErrorHandler() {
+        LoggingErrorHandlerBuilder errorHandler = (LoggingErrorHandlerBuilder) ctx.getBean("loggingErrorHandler");
+        assertNotNull(errorHandler);
+        assertEquals("The loglevel should be INFO", LoggingLevel.INFO, errorHandler.getLevel());
+    }
+    
+    public void testDefaultErrorHandler() {
+        DefaultErrorHandlerBuilder errorHandler = (DefaultErrorHandlerBuilder) ctx.getBean("defaultErrorHandler");
+        assertNotNull(errorHandler);
+        Processor processor = errorHandler.getFailureProcessor();
+        assertNotNull(processor);
+        assertTrue("It should be MyErrorProcessor", processor instanceof MyErrorProcessor);
+        ExceptionPolicyStrategy strategy = errorHandler.getExceptionPolicyStrategy();
+        assertNotNull(strategy);
+        assertTrue("It should be DefaultExceptionPolicyStrategy", strategy instanceof DefaultExceptionPolicyStrategy);
+        RedeliveryPolicy policy = errorHandler.getRedeliveryPolicy();
+        assertNotNull(policy);
+        assertEquals("Wrong maximumRedeliveries", 2, policy.getMaximumRedeliveries());
+        assertEquals("Wrong redeliveryDelay", 0, policy.getRedeliveryDelay());
+        assertEquals("Wrong logStackTrace", false, policy.isLogStackTrace());
+    }
+    
+    public void testTransactionErrorHandler() {
+        TransactionErrorHandlerBuilder errorHandler = (TransactionErrorHandlerBuilder) ctx.getBean("transactionErrorHandler");
+        assertNotNull(errorHandler);
+        assertNotNull(errorHandler.getTransactionTemplate());
+        Processor processor = errorHandler.getOnRedelivery();
+        assertTrue("It should be MyErrorProcessor", processor instanceof MyErrorProcessor);
+    }
+    
+    public void testDeadLetterErrorHandler() {
+        DeadLetterChannelBuilder errorHandler = (DeadLetterChannelBuilder) ctx.getBean("deadLetterErrorHandler");
+        assertNotNull(errorHandler);
+        assertNotNull(errorHandler.getDeadLetter());
+        assertTrue("It should be a direct endpoint", errorHandler.getDeadLetter() instanceof DirectEndpoint);
+        RedeliveryPolicy policy = errorHandler.getRedeliveryPolicy();
+        assertNotNull(policy);
+        assertEquals("Wrong maximumRedeliveries", 2, policy.getMaximumRedeliveries());
+        assertEquals("Wrong redeliveryDelay", 1000, policy.getRedeliveryDelay());
+        assertEquals("Wrong logStackTrace", true, policy.isLogHandled());
+    }
+
+}
+

Propchange: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/ErrorHandlerDefintionParserTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/ErrorHandlerDefintionParserTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/MyErrorProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/MyErrorProcessor.java?rev=928142&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/MyErrorProcessor.java (added)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/MyErrorProcessor.java Sat Mar 27 04:24:46 2010
@@ -0,0 +1,32 @@
+/**
+ * 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.handler;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+public class MyErrorProcessor implements Processor {
+
+    public void process(Exchange exchange) throws Exception {
+        // do nothing here
+    }
+    
+    public String toString() {
+        return "MyErrorProcessor";
+    }
+
+}

Propchange: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/MyErrorProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/handler/MyErrorProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml?rev=928142&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml (added)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml Sat Mar 27 04:24:46 2010
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:camel="http://camel.apache.org/schema/spring"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+
+    <errorHandler id="loggingErrorHandler" xmlns="http://camel.apache.org/schema/spring" type="LoggingErrorHandler" level="INFO" />
+    
+     <camel:errorHandler id="defaultErrorHandler" type="DefaultErrorHandler">
+       <camel:redeliveryPolicy maximumRedeliveries="2" redeliveryDelay="0" logStackTrace="false" />
+       <camel:failureProcessor>
+          <bean class="org.apache.camel.spring.handler.MyErrorProcessor"/>
+       </camel:failureProcessor>
+       <camel:exceptionPolicyStrategy>
+          <bean class="org.apache.camel.processor.exceptionpolicy.DefaultExceptionPolicyStrategy"/>
+       </camel:exceptionPolicyStrategy>
+    </camel:errorHandler>
+    
+    <camel:errorHandler id="deadLetterErrorHandler" type="DeadLetterChannel" handled="true">
+       <camel:redeliveryPolicy maximumRedeliveries="2" redeliveryDelay="1000" logHandled="true" />
+       <camel:deadLetter>
+           <bean class="org.apache.camel.component.direct.DirectEndpoint">
+               <constructor-arg>
+                  <value>direct:start</value>
+               </constructor-arg>
+           </bean>
+       </camel:deadLetter>
+       
+    </camel:errorHandler>
+    
+    <camel:errorHandler id="transactionErrorHandler" type="TransactionErrorHandler">
+    	<camel:transactionTemplate>
+         	<ref bean="PROPAGATION_REQUIRED"/>
+        </camel:transactionTemplate>
+        <camel:onRedelivery>
+            <bean class="org.apache.camel.spring.handler.MyErrorProcessor"/>
+        </camel:onRedelivery>
+    </camel:errorHandler>
+    
+    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
+        <property name="url" value="jdbc:hsqldb:mem:camel"/>
+        <property name="username" value="sa"/>
+        <property name="password" value=""/>
+    </bean>
+
+    <!-- spring transaction manager -->
+    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+        <property name="dataSource" ref="dataSource"/>
+    </bean>
+
+    <bean id="PROPAGATION_REQUIRED" class="org.springframework.transaction.support.TransactionTemplate">
+        <property name="transactionManager" ref="txManager"/>
+    </bean>
+        
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+    </camelContext>
+
+   
+    <!-- END SNIPPET: example -->
+
+</beans>

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml