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 =