Author: davsclaus
Date: Sat Nov 29 03:32:20 2008
New Revision: 721662

URL: http://svn.apache.org/viewvc?rev=721662&view=rev
Log:
CAMEL-1072: Added tempPrefix option to FTP/SFTP producers, so you can upload 
using a temp filename and after upload rename it to the real name.

Added:
    
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerTempPrefixTest.java
   (contents, props changed)
      - copied, changed from r721650, 
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerBuildDirectoryTest.java
Modified:
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileProducer.java
    
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpProducer.java
    
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
    
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java
    
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpProducer.java

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileProducer.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileProducer.java?rev=721662&r1=721661&r2=721662&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileProducer.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileProducer.java
 Sat Nov 29 03:32:20 2008
@@ -61,7 +61,7 @@
         boolean writeAsTempAndRename = 
ObjectHelper.isNotNullAndNonEmpty(endpoint.getTempPrefix());
         File tempTarget = null;
         if (writeAsTempAndRename) {
-            // compute temporary name reusing the camel renamer
+            // compute temporary name with the temp prefix
             tempTarget = new File(target.getParent(), endpoint.getTempPrefix() 
+ target.getName());
         }
 

Modified: 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpProducer.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpProducer.java?rev=721662&r1=721661&r2=721662&view=diff
==============================================================================
--- 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpProducer.java
 (original)
+++ 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpProducer.java
 Sat Nov 29 03:32:20 2008
@@ -20,6 +20,8 @@
 import java.io.InputStream;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.component.file.FileComponent;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.net.ftp.FTPClient;
 
 public class FtpProducer extends RemoteFileProducer<RemoteFileExchange> {
@@ -48,16 +50,16 @@
                 throw new FtpOperationFailedException(client.getReplyCode(), 
client.getReplyString(), message);
             }
 
-            process((RemoteFileExchange)endpoint.createExchange(exchange));
+            process((RemoteFileExchange) endpoint.createExchange(exchange));
         } catch (Exception e) {
             loggedIn = false;
             if (isStopping() || isStopped()) {
                 // if we are stopping then ignore any exception during a poll
                 log.warn("Producer is stopping. Ignoring caught exception: "
-                         + e.getClass().getCanonicalName() + " message: " + 
e.getMessage());
+                        + e.getClass().getCanonicalName() + " message: " + 
e.getMessage());
             } else {
                 log.warn("Exception occured during processing: "
-                         + e.getClass().getCanonicalName() + " message: " + 
e.getMessage());
+                        + e.getClass().getCanonicalName() + " message: " + 
e.getMessage());
                 disconnect();
                 // Rethrow to signify that we didn't poll
                 throw e;
@@ -88,10 +90,39 @@
     }
 
     public void process(RemoteFileExchange exchange) throws Exception {
+        String target = createFileName(exchange);
+
+        // should we write to a temporary name and then afterwards rename to 
real target
+        boolean writeAsTempAndRename = 
ObjectHelper.isNotNullAndNonEmpty(endpoint.getConfiguration().getTempPrefix());
+        String tempTarget = null;
+        if (writeAsTempAndRename) {
+            // compute temporary name with the temp prefix
+            tempTarget = createTempFileName(target);
+        }
+
+        // upload the file
+        writeFile(exchange, tempTarget != null ? tempTarget : target);
+
+        // if we did write to a temporary name then rename it to the real name 
after we have written the file
+        if (tempTarget != null) {
+            if (log.isTraceEnabled()) {
+                log.trace("Renaming file: " + tempTarget + " to: " + target);
+            }
+            boolean renamed = client.rename(tempTarget, target);
+            if (!renamed) {
+                String msg = "Can not rename file from: " + tempTarget + " to: 
" + target;
+                throw new FtpOperationFailedException(client.getReplyCode(), 
client.getReplyString(), msg);
+            }
+        }
+
+        // lets store the name we really used in the header, so end-users can 
retrieve it
+        exchange.getIn().setHeader(FileComponent.HEADER_FILE_NAME_PRODUCED, 
target);
+    }
+
+    protected void writeFile(Exchange exchange, String fileName) throws 
FtpOperationFailedException, IOException {
         InputStream payload = exchange.getIn().getBody(InputStream.class);
         try {
-            String fileName = createFileName(exchange.getIn(), 
endpoint.getConfiguration());
-
+            // build directory
             int lastPathIndex = fileName.lastIndexOf('/');
             if (lastPathIndex != -1) {
                 String directory = fileName.substring(0, lastPathIndex);
@@ -100,17 +131,22 @@
                 }
             }
 
+            // upload
+            if (log.isTraceEnabled()) {
+                log.trace("About to send: " + fileName + " to: " + 
remoteServer() + " from exchange: " + exchange);
+            }
+
             boolean success = client.storeFile(fileName, payload);
             if (!success) {
                 String message = "Error sending file: " + fileName + " to: " + 
remoteServer();
                 throw new FtpOperationFailedException(client.getReplyCode(), 
client.getReplyString(), message);
             }
 
-            log.info("Sent: " + fileName + " to: " + remoteServer());
-        } finally {
-            if (payload != null) {
-                payload.close();
+            if (log.isDebugEnabled()) {
+                log.debug("Sent: " + fileName + " to: " + remoteServer());
             }
+        } finally {
+            ObjectHelper.close(payload, "Closing payload", log);
         }
     }
 

Modified: 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java?rev=721662&r1=721661&r2=721662&view=diff
==============================================================================
--- 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
 (original)
+++ 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
 Sat Nov 29 03:32:20 2008
@@ -36,6 +36,7 @@
     private Expression expression;
     private boolean passiveMode;
     private String knownHosts;
+    private String tempPrefix;
 
     public RemoteFileConfiguration() {
     }
@@ -195,4 +196,16 @@
     public void setPassiveMode(boolean passiveMode) {
         this.passiveMode = passiveMode;
     }
+
+    public String getTempPrefix() {
+        return tempPrefix;
+    }
+
+    /**
+     * Enables and uses temporary prefix when writing files, after write it 
will be renamed to the correct name.
+     */
+    public void setTempPrefix(String tempPrefix) {
+        this.tempPrefix = tempPrefix;
+    }
+    
 }

Modified: 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java?rev=721662&r1=721661&r2=721662&view=diff
==============================================================================
--- 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java
 (original)
+++ 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileProducer.java
 Sat Nov 29 03:32:20 2008
@@ -16,8 +16,8 @@
  */
 package org.apache.camel.component.file.remote;
 
+import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
-import org.apache.camel.Message;
 import org.apache.camel.component.file.FileComponent;
 import org.apache.camel.impl.DefaultProducer;
 import org.apache.camel.language.simple.FileLanguage;
@@ -33,10 +33,10 @@
         this.endpoint = endpoint;
     }
 
-    protected String createFileName(Message message, RemoteFileConfiguration 
fileConfig) {
+    protected String createFileName(Exchange exchange) {
         String answer;
 
-        String name = message.getHeader(FileComponent.HEADER_FILE_NAME, 
String.class);
+        String name = 
exchange.getIn().getHeader(FileComponent.HEADER_FILE_NAME, String.class);
 
         // expression support
         Expression expression = endpoint.getConfiguration().getExpression();
@@ -53,29 +53,38 @@
             if (log.isDebugEnabled()) {
                 log.debug("Filename evaluated as expression: " + expression);
             }
-            Object result = expression.evaluate(message.getExchange());
-            name = 
message.getExchange().getContext().getTypeConverter().convertTo(String.class, 
result);
+            Object result = expression.evaluate(exchange);
+            name = 
exchange.getContext().getTypeConverter().convertTo(String.class, result);
         }        
 
-        String endpointFile = fileConfig.getFile();
-        if (fileConfig.isDirectory()) {
+        String endpointFile = endpoint.getConfiguration().getFile();
+        if (endpoint.getConfiguration().isDirectory()) {
             // If the path isn't empty, we need to add a trailing / if it 
isn't already there
             String baseDir = "";
             if (endpointFile.length() > 0) {
                 baseDir = endpointFile + (endpointFile.endsWith("/") ? "" : 
"/");
             }
-            String fileName = (name != null) ? name : 
endpoint.getGeneratedFileName(message); 
+            String fileName = (name != null) ? name : 
endpoint.getGeneratedFileName(exchange.getIn()); 
             answer = baseDir + fileName;
         } else {
             answer = endpointFile;
         }
 
-        // lets store the name we really used in the header, so end-users can 
retrieve it
-        message.setHeader(FileComponent.HEADER_FILE_NAME_PRODUCED, answer);
-
         return answer;
     }
 
+    protected String createTempFileName(String fileName) {
+        int path = fileName.lastIndexOf("/");
+        if (path == -1) {
+            // no path
+            return endpoint.getConfiguration().getTempPrefix() + fileName;
+        } else {
+            StringBuilder sb = new StringBuilder(fileName);
+            sb.insert(path + 1, endpoint.getConfiguration().getTempPrefix());
+            return sb.toString();
+        }
+    }
+
     protected String remoteServer() {
         return endpoint.getConfiguration().remoteServerInformation();
     }

Modified: 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpProducer.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpProducer.java?rev=721662&r1=721661&r2=721662&view=diff
==============================================================================
--- 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpProducer.java
 (original)
+++ 
activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpProducer.java
 Sat Nov 29 03:32:20 2008
@@ -16,13 +16,16 @@
  */
 package org.apache.camel.component.file.remote;
 
+import java.io.IOException;
 import java.io.InputStream;
 
 import com.jcraft.jsch.ChannelSftp;
 import com.jcraft.jsch.JSchException;
 import com.jcraft.jsch.Session;
-
+import com.jcraft.jsch.SftpException;
 import org.apache.camel.Exchange;
+import org.apache.camel.component.file.FileComponent;
+import org.apache.camel.util.ObjectHelper;
 
 public class SftpProducer extends RemoteFileProducer<RemoteFileExchange> {
     private SftpEndpoint endpoint;
@@ -86,11 +89,36 @@
     }
 
     public void process(RemoteFileExchange exchange) throws Exception {
+        String target = createFileName(exchange);
+
+        // should we write to a temporary name and then afterwards rename to 
real target
+        boolean writeAsTempAndRename = 
ObjectHelper.isNotNullAndNonEmpty(endpoint.getConfiguration().getTempPrefix());
+        String tempTarget = null;
+        if (writeAsTempAndRename) {
+            // compute temporary name with the temp prefix
+            tempTarget = createTempFileName(target);
+        }
+
+        // upload the file
+        writeFile(exchange, tempTarget != null ? tempTarget : target);
+
+        // if we did write to a temporary name then rename it to the real name 
after we have written the file
+        if (tempTarget != null) {
+            if (log.isTraceEnabled()) {
+                log.trace("Renaming file: " + tempTarget + " to: " + target);
+            }
+            channel.rename(tempTarget, target);
+        }
+
+        // lets store the name we really used in the header, so end-users can 
retrieve it
+        exchange.getIn().setHeader(FileComponent.HEADER_FILE_NAME_PRODUCED, 
target);
+
+    }
+
+    protected void writeFile(Exchange exchange, String fileName) throws 
SftpException, IOException {
         InputStream payload = exchange.getIn().getBody(InputStream.class);
         try {
-            String remoteServer = 
endpoint.getConfiguration().remoteServerInformation();
-            String fileName = createFileName(exchange.getIn(), 
endpoint.getConfiguration());
-
+            // build directory
             int lastPathIndex = fileName.lastIndexOf('/');
             if (lastPathIndex != -1) {
                 String directory = fileName.substring(0, lastPathIndex);
@@ -100,13 +128,18 @@
                 }
             }
 
+            // upload
+            if (log.isTraceEnabled()) {
+                log.trace("About to send: " + fileName + " to: " + 
remoteServer() + " from exchange: " + exchange);
+            }
+
             channel.put(payload, fileName);
 
-            log.info("Sent: " + fileName + " to: " + remoteServer);
-        } finally {
-            if (payload != null) {
-                payload.close();
+            if (log.isDebugEnabled()) {
+                log.debug("Sent: " + fileName + " to: " + remoteServer());
             }
+        } finally {
+            ObjectHelper.close(payload, "Closing payload", log);
         }
     }
 

Copied: 
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerTempPrefixTest.java
 (from r721650, 
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerBuildDirectoryTest.java)
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerTempPrefixTest.java?p2=activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerTempPrefixTest.java&p1=activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerBuildDirectoryTest.java&r1=721650&r2=721662&rev=721662&view=diff
==============================================================================
--- 
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerBuildDirectoryTest.java
 (original)
+++ 
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerTempPrefixTest.java
 Sat Nov 29 03:32:20 2008
@@ -18,22 +18,41 @@
 
 import java.io.File;
 
+import org.apache.camel.Endpoint;
 import org.apache.camel.component.file.FileComponent;
 import org.apache.camel.converter.IOConverter;
 
 /**
  * Unit test to verify that Camel can build remote directory on FTP server if 
missing (full or part of).
  */
-public class FtpProducerBuildDirectoryTest extends FtpServerTestSupport {
+public class FtpProducerTempPrefixTest extends FtpServerTestSupport {
 
-    private int port = 20089;
-    private String ftpUrl = "ftp://[EMAIL PROTECTED]:" + port + 
"/upload/user/claus?binary=false&password=admin";
+    private int port = 20077;
+    private String ftpUrl = "ftp://[EMAIL PROTECTED]:" + port + 
"/upload/user/claus?binary=false&password=admin&tempPrefix=.uploading";
 
     public int getPort() {
         return port;
     }
 
-    public void testProduceAndBuildFullRemotFolderTest() throws Exception {
+    public void testCreateTempFileName() throws Exception {
+        Endpoint endpoint = context.getEndpoint(ftpUrl);
+        FtpProducer producer = (FtpProducer) endpoint.createProducer();
+
+        String fileName = "somepath/someuser/claus.txt";
+        String tempFileName = producer.createTempFileName(fileName);
+        assertEquals("somepath/someuser/.uploadingclaus.txt", tempFileName);
+    }
+
+    public void testNoPathCreateTempFileName() throws Exception {
+        Endpoint endpoint = context.getEndpoint(ftpUrl);
+        FtpProducer producer = (FtpProducer) endpoint.createProducer();
+
+        String fileName = "claus.txt";
+        String tempFileName = producer.createTempFileName(fileName);
+        assertEquals(".uploadingclaus.txt", tempFileName);
+    }
+
+    public void testProduceTempPrefixTest() throws Exception {
         deleteDirectory("./res/home/");
 
         template.sendBodyAndHeader(ftpUrl, "Hello World", 
FileComponent.HEADER_FILE_NAME, "claus.txt");
@@ -44,4 +63,4 @@
         assertEquals("Hello World", IOConverter.toString(file));
     }
 
-}
+}
\ No newline at end of file

Propchange: 
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerTempPrefixTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerTempPrefixTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: 
activemq/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpProducerTempPrefixTest.java
------------------------------------------------------------------------------
    svn:mergeinfo = 


Reply via email to