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 2008/05/26 06:19:57 UTC

svn commit: r660099 - in /activemq/camel/trunk/camel-core/src: main/java/org/apache/camel/component/file/strategy/ test/java/org/apache/camel/component/file/

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