You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2010/12/20 15:23:18 UTC

svn commit: r1051127 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/component/file/ camel-core/src/main/java/org/apache/camel/component/file/strategy/ camel-core/src/test/java/org/apache/camel/component/file/ components/camel-ftp/src/test...

Author: davsclaus
Date: Mon Dec 20 14:23:18 2010
New Revision: 1051127

URL: http://svn.apache.org/viewvc?rev=1051127&view=rev
Log:
CAMEL-3163: File/FTP consumer now support doneFileName option to only consume a file if a done file exists as well.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNamePrefixTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSimplePrefixTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSuffixTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameTest.java
      - copied, changed from r1050776, camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerProducerDoneFileNameTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDualDoneFileNameTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerPreMoveDoneFileNameTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFilePrefixTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileSuffixTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileTest.java
    camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDoneFileNameTest.java
      - copied, changed from r1051031, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java
    camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDualDoneFileNameTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOnCompletion.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategyFactory.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java?rev=1051127&r1=1051126&r2=1051127&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java Mon Dec 20 14:23:18 2010
@@ -426,6 +426,29 @@ public abstract class GenericFileConsume
             }
         }
 
+        // if done file name is enabled, then the file is only valid if a done file exists
+        if (endpoint.getDoneFileName() != null) {
+            // done file must be in same path as the file
+            String doneFileName = endpoint.createDoneFileName(file.getAbsoluteFilePath());
+            ObjectHelper.notEmpty(doneFileName, "doneFileName", endpoint);
+
+            // is it a done file name?
+            if (endpoint.isDoneFile(file.getFileNameOnly())) {
+                if (log.isTraceEnabled()) {
+                    log.trace("Skipping done file: " + file);
+                }
+                return false;
+            }
+
+            // the file is only valid if the done file exist
+            if (!operations.existsFile(doneFileName)) {
+                if (log.isTraceEnabled()) {
+                    log.trace("Done file: " + doneFileName + " does not exist");
+                }
+                return false;
+            }
+        }
+
         return true;
     }
 

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java?rev=1051127&r1=1051126&r2=1051127&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java Mon Dec 20 14:23:18 2010
@@ -27,6 +27,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
+import org.apache.camel.ExpressionIllegalSyntaxException;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.converter.IOConverter;
@@ -613,4 +614,84 @@ public abstract class GenericFileEndpoin
         }
         return language.createExpression(expression);
     }
+
+    /**
+     * Creates the associated name of the done file based on the given file name.
+     * <p/>
+     * This method should only be invoked if a done filename property has been set on this endpoint.
+     *
+     * @param fileName  the file name
+     * @return name of the associated done file name
+     */
+    protected String createDoneFileName(String fileName) {
+        String pattern = getDoneFileName();
+        ObjectHelper.notEmpty(pattern, "doneFileName", pattern);
+
+        // we only support ${file:name} or ${file:name.noext} as dynamic placeholders for done files
+        String path = FileUtil.onlyPath(fileName);
+        String onlyName = FileUtil.stripPath(fileName);
+
+        pattern = pattern.replaceFirst("\\$\\{file:name\\}", onlyName);
+        pattern = pattern.replaceFirst("\\$simple\\{file:name\\}", onlyName);
+        pattern = pattern.replaceFirst("\\$\\{file:name.noext\\}", FileUtil.stripExt(onlyName));
+        pattern = pattern.replaceFirst("\\$simple\\{file:name.noext\\}", FileUtil.stripExt(onlyName));
+
+        // must be able to resolve all placeholders supported
+        if (SimpleLanguage.hasStartToken(pattern)) {
+            throw new ExpressionIllegalSyntaxException(fileName + ". Cannot resolve reminder: " + pattern);
+        }
+
+        String answer = pattern;
+        if (ObjectHelper.isNotEmpty(path) && ObjectHelper.isNotEmpty(pattern)) {
+            // done file must always be in same directory as the real file name
+            answer = path + File.separator + pattern;
+        }
+
+        if (getConfiguration().needToNormalize()) {
+            // must normalize path to cater for Windows and other OS
+            answer = FileUtil.normalizePath(answer);
+        }
+
+        return answer;
+    }
+
+    /**
+     * Is the given file a done file?
+     * <p/>
+     * This method should only be invoked if a done filename property has been set on this endpoint.
+     *
+     * @param fileName  the file name
+     * @return <tt>true</tt> if its a done file, <tt>false</tt> otherwise
+     */
+    protected boolean isDoneFile(String fileName) {
+        String pattern = getDoneFileName();
+        ObjectHelper.notEmpty(pattern, "doneFileName", pattern);
+
+        if (!SimpleLanguage.hasStartToken(pattern)) {
+            // no tokens, so just match names directly
+            return pattern.equals(fileName);
+        }
+
+        // the static part of the pattern, is that a prefix or suffix?
+        // its a prefix if ${ start token is not at the start of the pattern
+        boolean prefix = pattern.indexOf("${") > 0;
+
+        // remove dynamic parts of the pattern so we only got the static part left
+        pattern = pattern.replaceFirst("\\$\\{file:name\\}", "");
+        pattern = pattern.replaceFirst("\\$simple\\{file:name\\}", "");
+        pattern = pattern.replaceFirst("\\$\\{file:name.noext\\}", "");
+        pattern = pattern.replaceFirst("\\$simple\\{file:name.noext\\}", "");
+
+        // must be able to resolve all placeholders supported
+        if (SimpleLanguage.hasStartToken(pattern)) {
+            throw new ExpressionIllegalSyntaxException(fileName + ". Cannot resolve reminder: " + pattern);
+        }
+
+        if (prefix) {
+            return fileName.startsWith(pattern);
+        } else {
+            return fileName.endsWith(pattern);
+        }
+    }
+
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOnCompletion.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOnCompletion.java?rev=1051127&r1=1051126&r2=1051127&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOnCompletion.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileOnCompletion.java Mon Dec 20 14:23:18 2010
@@ -20,6 +20,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.impl.LoggingExceptionHandler;
 import org.apache.camel.spi.ExceptionHandler;
 import org.apache.camel.spi.Synchronization;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -114,6 +115,26 @@ public class GenericFileOnCompletion<T> 
             endpoint.getIdempotentRepository().add(absoluteFileName);
         }
 
+        // delete done file if used
+        if (endpoint.getDoneFileName() != null) {
+            // done file must be in same path as the original input file
+            String doneFileName = endpoint.createDoneFileName(absoluteFileName);
+            ObjectHelper.notEmpty(doneFileName, "doneFileName", endpoint);
+
+            try {
+                // delete done file
+                boolean deleted = operations.deleteFile(doneFileName);
+                if (log.isTraceEnabled()) {
+                    log.trace("Done file: " + doneFileName + " was deleted: " + deleted);
+                }
+                if (!deleted) {
+                    log.warn("Done file: " + doneFileName + " could not be deleted");
+                }
+            } catch (Exception e) {
+                handleException(e);
+            }
+        }
+
         try {
             if (log.isTraceEnabled()) {
                 log.trace("Commit file strategy: " + processStrategy + " for file: " + file);
@@ -122,6 +143,8 @@ public class GenericFileOnCompletion<T> 
         } catch (Exception e) {
             handleException(e);
         }
+
+
     }
 
     /**

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java?rev=1051127&r1=1051126&r2=1051127&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java Mon Dec 20 14:23:18 2010
@@ -166,7 +166,7 @@ public class GenericFileProducer<T> exte
 
             // any done file to write?
             if (endpoint.getDoneFileName() != null) {
-                String doneFileName = createDoneName(target);
+                String doneFileName = endpoint.createDoneFileName(target);
                 ObjectHelper.notEmpty(doneFileName, "doneFileName", endpoint);
 
                 // create empty exchange with empty body to write as the done file
@@ -335,28 +335,4 @@ public class GenericFileProducer<T> exte
         }
     }
 
-    public String createDoneName(String fileName) {
-        String pattern = endpoint.getDoneFileName();
-        ObjectHelper.notEmpty(pattern, "doneFileName", endpoint);
-
-        // we only support ${file:name} or ${file:name.noext} as dynamic placeholders for done files
-        String path = FileUtil.onlyPath(fileName);
-        String onlyName = FileUtil.stripPath(fileName);
-
-        pattern = pattern.replaceFirst("\\$\\{file:name\\}", onlyName);
-        pattern = pattern.replaceFirst("\\$\\{file:name.noext\\}", FileUtil.stripExt(onlyName));
-
-        // must be able to resolve all placeholders supported
-        if (SimpleLanguage.hasStartToken(pattern)) {
-            throw new ExpressionIllegalSyntaxException(fileName + ". Cannot resolve reminder: " + pattern);
-        }
-
-        // done file must always be in same directory as the real file name
-        if (ObjectHelper.isNotEmpty(pattern)) {
-            return path + File.separator + pattern;
-        } else {
-            return pattern;
-        }
-    }
-
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategyFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategyFactory.java?rev=1051127&r1=1051126&r2=1051127&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategyFactory.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategyFactory.java Mon Dec 20 14:23:18 2010
@@ -91,7 +91,7 @@ public final class GenericFileProcessStr
             return strategy;
         }
 
-        // no explicit stategy set then fallback to readLock option
+        // no explicit strategy set then fallback to readLock option
         String readLock = (String) params.get("readLock");
         if (ObjectHelper.isNotEmpty(readLock)) {
             if ("none".equals(readLock) || "false".equals(readLock)) {

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNamePrefixTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNamePrefixTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNamePrefixTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNamePrefixTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,71 @@
+/**
+ * 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.file;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for writing done files
+ */
+public class FilerConsumerDoneFileNamePrefixTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/done");
+        super.setUp();
+    }
+
+    public void testDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("file:target/done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        // wait a bit and it should not pickup the written file as there are no done file
+        Thread.sleep(250);
+
+        assertMockEndpointsSatisfied();
+        resetMocks();
+        oneExchangeDone.reset();
+
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        // write the done file
+        template.sendBodyAndHeader("file:target/done", "", Exchange.FILE_NAME, "done-hello.txt");
+
+        assertMockEndpointsSatisfied();
+        oneExchangeDone.matchesMockWaitTime();
+
+        // done file should be deleted now
+        File file = new File("target/done/done-hello.txt").getAbsoluteFile();
+        assertFalse("Done file should be deleted: " + file, file.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/done?doneFileName=done-${file:name}&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
+    }
+
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSimplePrefixTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSimplePrefixTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSimplePrefixTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSimplePrefixTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,72 @@
+/**
+ * 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.file;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for writing done files
+ */
+public class FilerConsumerDoneFileNameSimplePrefixTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/done");
+        super.setUp();
+    }
+
+    public void testDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("file:target/done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        // wait a bit and it should not pickup the written file as there are no done file
+        Thread.sleep(250);
+
+        assertMockEndpointsSatisfied();
+        resetMocks();
+        oneExchangeDone.reset();
+
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        // write the done file
+        template.sendBodyAndHeader("file:target/done", "", Exchange.FILE_NAME, "done-hello.txt");
+
+        assertMockEndpointsSatisfied();
+        oneExchangeDone.matchesMockWaitTime();
+
+        // done file should be deleted now
+        File file = new File("target/done/done-hello.txt").getAbsoluteFile();
+        assertFalse("Done file should be deleted: " + file, file.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // using $simple{ to avoid clash with spring property placeholder
+                from("file:target/done?doneFileName=done-$simple{file:name}&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
+    }
+
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSuffixTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSuffixTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSuffixTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameSuffixTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,71 @@
+/**
+ * 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.file;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for writing done files
+ */
+public class FilerConsumerDoneFileNameSuffixTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/done");
+        super.setUp();
+    }
+
+    public void testDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("file:target/done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        // wait a bit and it should not pickup the written file as there are no done file
+        Thread.sleep(250);
+
+        assertMockEndpointsSatisfied();
+        resetMocks();
+        oneExchangeDone.reset();
+
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        // write the done file
+        template.sendBodyAndHeader("file:target/done", "", Exchange.FILE_NAME, "hello.txt.ready");
+
+        assertMockEndpointsSatisfied();
+        oneExchangeDone.matchesMockWaitTime();
+
+        // done file should be deleted now
+        File file = new File("target/done/hello.txt.ready").getAbsoluteFile();
+        assertFalse("Done file should be deleted: " + file, file.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/done?doneFileName=${file:name}.ready&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
+    }
+
+}

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameTest.java (from r1050776, camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerProducerDoneFileNameTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerProducerDoneFileNameTest.java&r1=1050776&r2=1051127&rev=1051127&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerProducerDoneFileNameTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDoneFileNameTest.java Mon Dec 20 14:23:18 2010
@@ -18,15 +18,14 @@ package org.apache.camel.component.file;
 
 import java.io.File;
 
-import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
-import org.apache.camel.ExpressionIllegalSyntaxException;
+import org.apache.camel.builder.RouteBuilder;
 
 /**
  * Unit test for writing done files
  */
-public class FilerProducerDoneFileNameTest extends ContextTestSupport {
+public class FilerConsumerDoneFileNameTest extends ContextTestSupport {
 
     @Override
     protected void setUp() throws Exception {
@@ -34,68 +33,39 @@ public class FilerProducerDoneFileNameTe
         super.setUp();
     }
 
-    public void testProducerConstantDoneFileName() throws Exception {
-        template.sendBodyAndHeader("file:target/done?doneFileName=done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+    public void testDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
 
-        File file = new File("target/done/hello.txt").getAbsoluteFile();
-        assertEquals("File should exists", true, file.exists());
+        template.sendBodyAndHeader("file:target/done", "Hello World", Exchange.FILE_NAME, "hello.txt");
 
-        File done = new File("target/done/done").getAbsoluteFile();
-        assertEquals("Done file should exists", true, done.exists());
-    }
-
-    public void testProducerPrefixDoneFileName() throws Exception {
-        template.sendBodyAndHeader("file:target/done?doneFileName=done-${file:name}", "Hello World", Exchange.FILE_NAME, "hello.txt");
-
-        File file = new File("target/done/hello.txt").getAbsoluteFile();
-        assertEquals("File should exists", true, file.exists());
-
-        File done = new File("target/done/done-hello.txt").getAbsoluteFile();
-        assertEquals("Done file should exists", true, done.exists());
-    }
-
-    public void testProducerExtDoneFileName() throws Exception {
-        template.sendBodyAndHeader("file:target/done?doneFileName=${file:name}.done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        // wait a bit and it should not pickup the written file as there are no done file
+        Thread.sleep(250);
 
-        File file = new File("target/done/hello.txt").getAbsoluteFile();
-        assertEquals("File should exists", true, file.exists());
+        assertMockEndpointsSatisfied();
+        resetMocks();
+        oneExchangeDone.reset();
 
-        File done = new File("target/done/hello.txt.done").getAbsoluteFile();
-        assertEquals("Done file should exists", true, done.exists());
-    }
-
-    public void testProducerReplaceExtDoneFileName() throws Exception {
-        template.sendBodyAndHeader("file:target/done?doneFileName=${file:name.noext}.done", "Hello World", Exchange.FILE_NAME, "hello.txt");
-
-        File file = new File("target/done/hello.txt").getAbsoluteFile();
-        assertEquals("File should exists", true, file.exists());
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
 
-        File done = new File("target/done/hello.done").getAbsoluteFile();
-        assertEquals("Done file should exists", true, done.exists());
-    }
+        // write the done file
+        template.sendBodyAndHeader("file:target/done", "", Exchange.FILE_NAME, "done");
 
-    public void testProducerInvalidDoneFileName() throws Exception {
-        try {
-            template.sendBodyAndHeader("file:target/done?doneFileName=${file:parent}/foo", "Hello World", Exchange.FILE_NAME, "hello.txt");
-            fail("Should have thrown exception");
-        } catch (CamelExecutionException e) {
-            ExpressionIllegalSyntaxException cause = assertIsInstanceOf(ExpressionIllegalSyntaxException.class, e.getCause());
-            assertTrue(cause.getMessage(), cause.getMessage().endsWith("Cannot resolve reminder: ${file:parent}/foo"));
-        }
-    }
+        assertMockEndpointsSatisfied();
+        oneExchangeDone.matchesMockWaitTime();
 
-    public void testProducerEmptyDoneFileName() throws Exception {
-        try {
-            template.sendBodyAndHeader("file:target/done?doneFileName=", "Hello World", Exchange.FILE_NAME, "hello.txt");
-            fail("Should have thrown exception");
-        } catch (CamelExecutionException e) {
-            IllegalArgumentException cause = assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
-            assertTrue(cause.getMessage(), cause.getMessage().startsWith("doneFileName must be specified and not empty"));
-        }
+        // done file should be deleted now
+        File file = new File("target/done/done").getAbsoluteFile();
+        assertFalse("Done file should be deleted: " + file, file.exists());
     }
 
     @Override
-    public boolean isUseRouteBuilder() {
-        return false;
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/done?doneFileName=done&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
     }
+
 }

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDualDoneFileNameTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDualDoneFileNameTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDualDoneFileNameTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerDualDoneFileNameTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,65 @@
+/**
+ * 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.file;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for writing done files
+ */
+public class FilerConsumerDualDoneFileNameTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/done");
+        super.setUp();
+    }
+
+    public void testTwoDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceivedInAnyOrder("Hello World", "Bye World");
+
+        template.sendBodyAndHeader("file:target/done?doneFileName=${file:name}.ready", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader("file:target/done?doneFileName=${file:name}.ready", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testOneDoneFileMissing() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader("file:target/done?doneFileName=${file:name}.ready", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader("file:target/done", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+        // give chance to poll 2nd file but it lacks the done file
+        Thread.sleep(250);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/done?doneFileName=${file:name}.ready&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
+    }
+
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerPreMoveDoneFileNameTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerPreMoveDoneFileNameTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerPreMoveDoneFileNameTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerPreMoveDoneFileNameTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,71 @@
+/**
+ * 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.file;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for writing done files
+ */
+public class FilerConsumerPreMoveDoneFileNameTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/done");
+        super.setUp();
+    }
+
+    public void testDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("file:target/done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        // wait a bit and it should not pickup the written file as there are no done file
+        Thread.sleep(250);
+
+        assertMockEndpointsSatisfied();
+        resetMocks();
+        oneExchangeDone.reset();
+
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        // write the done file
+        template.sendBodyAndHeader("file:target/done", "", Exchange.FILE_NAME, "ready");
+
+        assertMockEndpointsSatisfied();
+        oneExchangeDone.matchesMockWaitTime();
+
+        // done file should be deleted now
+        File file = new File("target/done/ready").getAbsoluteFile();
+        assertFalse("Done file should be deleted: " + file, file.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/done?preMove=work/work-${file:name}&doneFileName=ready&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
+    }
+
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFilePrefixTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFilePrefixTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFilePrefixTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFilePrefixTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,75 @@
+/**
+ * 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.file;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for writing done files
+ */
+public class FilerConsumerShouldSkipDoneFilePrefixTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/done");
+        super.setUp();
+    }
+
+    public void testDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        // write the done file
+        template.sendBodyAndHeader("file:target/done", "", Exchange.FILE_NAME, "done-hello.txt");
+
+        // wait a bit and it should not pickup the written file as there are no target file
+        Thread.sleep(250);
+
+        assertMockEndpointsSatisfied();
+        resetMocks();
+        oneExchangeDone.reset();
+
+        // done file should exist
+        File file = new File("target/done/done-hello.txt").getAbsoluteFile();
+        assertTrue("Done file should exist: " + file, file.exists());
+
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        // write the target file
+        template.sendBodyAndHeader("file:target/done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        assertMockEndpointsSatisfied();
+        oneExchangeDone.matchesMockWaitTime();
+
+        // done file should be deleted now
+        assertFalse("Done file should be deleted: " + file, file.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/done?doneFileName=done-${file:name}&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
+    }
+
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileSuffixTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileSuffixTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileSuffixTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileSuffixTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,75 @@
+/**
+ * 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.file;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for writing done files
+ */
+public class FilerConsumerShouldSkipDoneFileSuffixTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/done");
+        super.setUp();
+    }
+
+    public void testDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        // write the done file
+        template.sendBodyAndHeader("file:target/done", "", Exchange.FILE_NAME, "hello.txt.ready");
+
+        // wait a bit and it should not pickup the written file as there are no target file
+        Thread.sleep(250);
+
+        assertMockEndpointsSatisfied();
+        resetMocks();
+        oneExchangeDone.reset();
+
+        // done file should exist
+        File file = new File("target/done/hello.txt.ready").getAbsoluteFile();
+        assertTrue("Done file should exist: " + file, file.exists());
+
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        // write the target file
+        template.sendBodyAndHeader("file:target/done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        assertMockEndpointsSatisfied();
+        oneExchangeDone.matchesMockWaitTime();
+
+        // done file should be deleted now
+        assertFalse("Done file should be deleted: " + file, file.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/done?doneFileName=${file:name}.ready&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
+    }
+
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FilerConsumerShouldSkipDoneFileTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,75 @@
+/**
+ * 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.file;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for writing done files
+ */
+public class FilerConsumerShouldSkipDoneFileTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/done");
+        super.setUp();
+    }
+
+    public void testDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        // write the done file
+        template.sendBodyAndHeader("file:target/done", "", Exchange.FILE_NAME, "done");
+
+        // wait a bit and it should not pickup the written file as there are no target file
+        Thread.sleep(250);
+
+        assertMockEndpointsSatisfied();
+        resetMocks();
+        oneExchangeDone.reset();
+
+        // done file should exist
+        File file = new File("target/done/done").getAbsoluteFile();
+        assertTrue("Done file should exist: " + file, file.exists());
+
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        // write the target file
+        template.sendBodyAndHeader("file:target/done", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        assertMockEndpointsSatisfied();
+        oneExchangeDone.matchesMockWaitTime();
+
+        // done file should be deleted now
+        assertFalse("Done file should be deleted: " + file, file.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/done?doneFileName=done&initialDelay=0&delay=10").to("mock:result");
+            }
+        };
+    }
+
+}

Copied: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDoneFileNameTest.java (from r1051031, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDoneFileNameTest.java?p2=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDoneFileNameTest.java&p1=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java&r1=1051031&r2=1051127&rev=1051127&view=diff
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpRecursiveNoopTest.java (original)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDoneFileNameTest.java Mon Dec 20 14:23:18 2010
@@ -16,46 +16,47 @@
  */
 package org.apache.camel.component.file.remote;
 
+import java.io.File;
+
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.Test;
 
 /**
  * @version $Revision$
  */
-public class FromFtpRecursiveNoopTest extends FtpServerTestSupport {
+public class FtpConsumerDoneFileNameTest extends FtpServerTestSupport {
 
     protected String getFtpUrl() {
-        return "ftp://admin@localhost:" + getPort() + "/noop?password=admin&binary=false&initialDelay=3000"
-                + "&recursive=true&noop=true";
+        return "ftp://admin@localhost:" + getPort() + "/done?password=admin&initialDelay=0&delay=100&stepwise=false";
     }
 
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
+    @Test
+    public void testDoneFileName() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(0);
 
-        template.sendBodyAndHeader(getFtpUrl(), "a", Exchange.FILE_NAME, "a.txt");
-        template.sendBodyAndHeader(getFtpUrl(), "b", Exchange.FILE_NAME, "b.txt");
-        template.sendBodyAndHeader(getFtpUrl(), "a2", Exchange.FILE_NAME, "foo/a.txt");
-        template.sendBodyAndHeader(getFtpUrl(), "c", Exchange.FILE_NAME, "bar/c.txt");
-        template.sendBodyAndHeader(getFtpUrl(), "b2", Exchange.FILE_NAME, "bar/b.txt");
-    }
+        template.sendBodyAndHeader(getFtpUrl(), "Hello World", Exchange.FILE_NAME, "hello.txt");
 
-    @Test
-    public void testRecursiveNoop() throws Exception {
-        MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedBodiesReceivedInAnyOrder("a", "b", "a2", "c", "b2");
+        // wait a bit and it should not pickup the written file as there are no done file
+        Thread.sleep(1000);
 
         assertMockEndpointsSatisfied();
 
-        // reset mock and send in a new file to be picked up only
-        mock.reset();
-        mock.expectedBodiesReceived("c2");
+        resetMocks();
+
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
 
-        template.sendBodyAndHeader(getFtpUrl(), "c2", Exchange.FILE_NAME, "c.txt");
+        // write the done file
+        template.sendBodyAndHeader(getFtpUrl(), "", Exchange.FILE_NAME, "done");
 
         assertMockEndpointsSatisfied();
+
+        // give time for done file to be deleted
+        Thread.sleep(1000);
+
+        // done file should be deleted now
+        File file = new File(FTP_ROOT_DIR + "done/done").getAbsoluteFile();
+        assertFalse("Done file should be deleted: " + file, file.exists());
     }
 
     @Override
@@ -63,9 +64,8 @@ public class FromFtpRecursiveNoopTest ex
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from(getFtpUrl())
+                from(getFtpUrl() + "&doneFileName=done")
                     .convertBodyTo(String.class)
-                    .to("log:ftp")
                     .to("mock:result");
             }
         };

Added: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDualDoneFileNameTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDualDoneFileNameTest.java?rev=1051127&view=auto
==============================================================================
--- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDualDoneFileNameTest.java (added)
+++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerDualDoneFileNameTest.java Mon Dec 20 14:23:18 2010
@@ -0,0 +1,67 @@
+/**
+ * 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.file.remote;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+/**
+ * @version $Revision: 1032261 $
+ */
+public class FtpConsumerDualDoneFileNameTest extends FtpServerTestSupport {
+
+    protected String getFtpUrl() {
+        return "ftp://admin@localhost:" + getPort() + "/done?password=admin&initialDelay=0&delay=100&stepwise=false";
+    }
+
+    @Test
+    public void testTwoDoneFile() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceivedInAnyOrder("Hello World", "Bye World");
+
+        template.sendBodyAndHeader(getFtpUrl() + "&doneFileName=${file:name}.ready", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader(getFtpUrl() + "&doneFileName=${file:name}.ready", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testOneDoneFileMissing() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader(getFtpUrl() + "&doneFileName=${file:name}.ready", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader(getFtpUrl(), "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+        // give chance to poll 2nd file but it lacks the done file
+        Thread.sleep(1000);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from(getFtpUrl() + "&doneFileName=${file:name}.ready")
+                    .convertBodyTo(String.class)
+                    .to("mock:result");
+            }
+        };
+    }
+
+}