Author: davsclaus
Date: Sun May 25 21:19:53 2008
New Revision: 660099

URL: http://svn.apache.org/viewvc?rev=660099&view=rev
Log:
CAMEL-307: file component renaming files now deletes any existing files so the 
rename occurs. Any exceptions during rename or delete now logs at WARN level 
and let the super commit so it can unlock the files, otherwise Camel 
FileConsumer is in a deadlock.

Added:
    
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerRenameStrategyTest.java
   (with props)
Modified:
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/DeleteFileProcessStrategy.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/RenameFileProcessStrategy.java

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/DeleteFileProcessStrategy.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/DeleteFileProcessStrategy.java?rev=660099&r1=660098&r2=660099&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/DeleteFileProcessStrategy.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/DeleteFileProcessStrategy.java
 Sun May 25 21:19:53 2008
@@ -43,7 +43,12 @@
         if (LOG.isDebugEnabled()) {
             LOG.debug("Deleting file: " + file);
         }
-        file.delete();
+        boolean deleted = file.delete();
+        if (!deleted) {
+            LOG.warn("Could not delete file: " + file);
+        }
+
+        // must commit to release the lock
         super.commit(endpoint, exchange, file);
     }
 }

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/RenameFileProcessStrategy.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/RenameFileProcessStrategy.java?rev=660099&r1=660098&r2=660099&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/RenameFileProcessStrategy.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/RenameFileProcessStrategy.java
 Sun May 25 21:19:53 2008
@@ -17,7 +17,6 @@
 package org.apache.camel.component.file.strategy;
 
 import java.io.File;
-import java.io.IOException;
 
 import org.apache.camel.component.file.FileEndpoint;
 import org.apache.camel.component.file.FileExchange;
@@ -53,15 +52,24 @@
     @Override
     public void commit(FileEndpoint endpoint, FileExchange exchange, File 
file) throws Exception {
         File newName = renamer.renameFile(file);
-        newName.getParentFile().mkdirs();
-
         if (LOG.isDebugEnabled()) {
             LOG.debug("Renaming file: " + file + " to: " + newName);
         }
+
+        // deleting any existing files before renaming
+        if (newName.exists()) {
+            newName.delete();
+        }
+
+        // make parent folder if missing
+        newName.getParentFile().mkdirs();
+
         boolean renamed = file.renameTo(newName);
         if (!renamed) {
-            throw new IOException("Could not rename file from: " + file + " to 
" + newName);
+            LOG.warn("Could not rename file from: " + file + " to " + newName);
         }
+
+        // must commit to release the lock
         super.commit(endpoint, exchange, file);
     }
 

Added: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerRenameStrategyTest.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerRenameStrategyTest.java?rev=660099&view=auto
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerRenameStrategyTest.java
 (added)
+++ 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerRenameStrategyTest.java
 Sun May 25 21:19:53 2008
@@ -0,0 +1,85 @@
+/**
+ * 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 java.io.FileWriter;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.converter.IOConverter;
+
+/**
+ * Unit test for the FileRenameStrategy
+ */
+public class FileProducerRenameStrategyTest extends ContextTestSupport {
+
+    public void testRenameSuccess() throws Exception {
+        deleteDirectory("target/done");
+        deleteDirectory("target/reports");
+
+        MockEndpoint mock = getMockEndpoint("mock:report");
+        mock.expectedBodiesReceived("Hello Paris");
+
+        template.sendBodyAndHeader("file:target/reports", "Hello Paris", 
FileComponent.HEADER_FILE_NAME, "paris.txt");
+
+        mock.assertIsSatisfied();
+
+        // sleep to let the file consumer do its renaming
+        Thread.sleep(500);
+
+        // content of file should be Hello Paris
+        String content = IOConverter.toString(new 
File("./target/done/paris.txt"));
+        assertEquals("The file should have been renamed", "Hello Paris", 
content);
+    }
+
+    public void testRenameFileExists() throws Exception {
+        deleteDirectory("target/done");
+        deleteDirectory("target/reports");
+
+        // create a file in done to let there be a duplicate file
+        File file = new File("target/done");
+        file.mkdirs();
+        FileWriter fw = new FileWriter("./target/done/london.txt");
+        fw.write("I was there once in London");
+        fw.flush();
+        fw.close();
+
+        MockEndpoint mock = getMockEndpoint("mock:report");
+        mock.expectedBodiesReceived("Hello London");
+
+        template.sendBodyAndHeader("file:target/reports", "Hello London", 
FileComponent.HEADER_FILE_NAME, "london.txt");
+
+        mock.assertIsSatisfied();
+
+        // sleep to let the file consumer do its renaming
+        Thread.sleep(500);
+
+        // content of file should be Hello London
+        String content = IOConverter.toString(new 
File("./target/done/london.txt"));
+        assertEquals("The file should have been renamed replacing any existing 
files", "Hello London", content);
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                
from("file://target/reports?moveNamePrefix=../done/&consumer.delay=5000").to("mock:report");
+            }
+        };
+    }
+}

Propchange: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerRenameStrategyTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileProducerRenameStrategyTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date


Reply via email to