Author: davsclaus
Date: Sun Jun 27 09:18:19 2010
New Revision: 958353

URL: http://svn.apache.org/viewvc?rev=958353&view=rev
Log:
Fixed issue with route scoped onCompletion and end().

Added:
    
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FileRollbackOnCompletionTest.java
   (with props)
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java?rev=958353&r1=958352&r2=958353&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
 Sun Jun 27 09:18:19 2010
@@ -127,8 +127,7 @@ public class OnCompletionDefinition exte
     }
 
     @Override
-    @SuppressWarnings("unchecked")
-    public ProcessorDefinition<? extends ProcessorDefinition<?>> end() {
+    public ProcessorDefinition end() {
         // pop parent block, as we added our self as block to parent when 
synchronized was defined in the route
         getParent().popBlock();
         return super.end();

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FileRollbackOnCompletionTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FileRollbackOnCompletionTest.java?rev=958353&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FileRollbackOnCompletionTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FileRollbackOnCompletionTest.java
 Sun Jun 27 09:18:19 2010
@@ -0,0 +1,125 @@
+/**
+ * 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 java.io.File;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Header;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spi.Synchronization;
+import org.apache.camel.util.FileUtil;
+
+/**
+ * @version $Revision$
+ */
+public class FileRollbackOnCompletionTest extends ContextTestSupport {
+
+    public static final class FileRollback implements Synchronization {
+
+        public void onComplete(Exchange exchange) {
+            // this method is invoked when the Exchange completed with no 
failure
+        }
+
+        public void onFailure(Exchange exchange) {
+            // delete the file
+            String name = 
exchange.getIn().getHeader(Exchange.FILE_NAME_PRODUCED, String.class);
+            FileUtil.deleteFile(new File(name));
+        }
+
+    }
+
+    public static final class OrderService {
+
+        public String createMail(String order) throws Exception {
+            return "Order confirmed: " + order;
+        }
+
+        public void sendMail(String body, @Header("to") String to) {
+            // simulate fatal error if we refer to a special no
+            if (to.equals("FATAL")) {
+                throw new IllegalArgumentException("Simulated fatal error");
+            }
+
+            // simulate CPU processing of the order by sleeping a bit
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        deleteDirectory("target/mail/backup");
+        super.setUp();
+    }
+
+    public void testOk() throws Exception {
+        template.sendBodyAndHeader("direct:confirm", "bumper", "to", 
"[email protected]");
+
+        File file = new File("target/mail/backup/");
+        String[] files = file.list();
+        assertEquals("There should be one file", 1, files.length);
+    }
+
+    public void testRollback() throws Exception {
+        try {
+            template.sendBodyAndHeader("direct:confirm", "bumper", "to", 
"FATAL");
+            fail("Should have thrown an exception");
+        } catch (CamelExecutionException e) {
+            assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
+            assertEquals("Simulated fatal error", e.getCause().getMessage());
+        }
+
+        // give time for onCompletion to execute
+        // as its being executed asynchronously in another thread
+        Thread.sleep(1000);
+
+        File file = new File("target/mail/backup/");
+        String[] files = file.list();
+        assertEquals("There should be no files", 0, files.length);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:confirm")
+                    // use a route scoped onCompletion to be executed when the 
Exchange failed
+                    .onCompletion().onFailureOnly()
+                        // and call the onFailure method on this bean
+                        .bean(FileRollback.class, "onFailure")
+                        // must use end to denote the end of the onCompletion 
route
+                    .end()
+                    // here starts the regular route
+                    .bean(OrderService.class, "createMail")
+                    .log("Saving mail backup file")
+                    .to("file:target/mail/backup")
+                    .log("Trying to send mail to ${header.to}")
+                    .bean(OrderService.class, "sendMail")
+                    .log("Mail send to ${header.to}");
+            }
+        };
+    }
+
+}
\ No newline at end of file

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FileRollbackOnCompletionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FileRollbackOnCompletionTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date


Reply via email to