The lightweight components are kinda deprecated, so I'm fine with new features going only into the new versions.
On 3/22/07, Gert Vanthienen <[EMAIL PROTECTED]> wrote:
L.S., I added this rename behavior to servicemix-ftp. You can now use an attribute uploadSuffix=".tmp" to get the desired the result. The patch is attached to JIRA issue SM-889 [1]. If you want, I can also add the same modifications to the lightweight FTP component. Isn't there a way to share the message processing code between both components, so modifications become available to both variants without having to write the same code twice? Regards, Gert [1] https://issues.apache.org/activemq/browse/SM-889 johper wrote: > Hi Gert! > Ofcourse I will test and try the patch, but for the moment I run the > leightweight variant, not "servicemix-ftp"... > > I fixed the FTP rename issue with a few lines of Java-code: > > ========= Java Code for doing FTP rename after successfull FTP transere, see > "quick and dirty" section ======== > /* > * 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.servicemix.components.net; > > import java.io.IOException; > import java.io.OutputStream; > > import javax.jbi.JBIException; > import javax.jbi.messaging.MessageExchange; > import javax.jbi.messaging.NormalizedMessage; > > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > import org.apache.commons.net.SocketClient; > import org.apache.commons.net.ftp.FTPClient; > import org.apache.servicemix.components.util.DefaultFileMarshaler; > import org.apache.servicemix.components.util.FileMarshaler; > import org.apache.servicemix.components.util.OutBinding; > > /** > * A component which sends a message to a file using FTP via the > * http://jakarta.apache.org/commons/net.html Jakarta Commons Net library > * > * @version $Revision: 486715 $ > */ > public class PostmanFTPSender extends OutBinding { > private static final Log log = > LogFactory.getLog(PostmanFTPSender.class); > > private FTPClientPool clientPool; > private FileMarshaler marshaler = new DefaultFileMarshaler(); > private String uniqueFileName = "ServiceMix"; > private boolean overwrite = false; > private String fileRenameSuffix = ".tmp"; > > > // Properties > > //------------------------------------------------------------------------- > public void setFileRenameSuffix(String suffix) > { > fileRenameSuffix = suffix; > } > > public String getFileRenameSuffix() > { > return fileRenameSuffix; > } > > public FTPClientPool getClientPool() { > return clientPool; > } > > public void setClientPool(FTPClientPool clientPool) { > this.clientPool = clientPool; > } > > public FileMarshaler getMarshaler() { > return marshaler; > } > > public void setMarshaler(FileMarshaler marshaler) { > this.marshaler = marshaler; > } > > public String getUniqueFileName() { > return uniqueFileName; > } > > /** > * Sets the name used to make a unique name if no file name is available > on the message. > * > * @param uniqueFileName the new value of the unique name to use for > generating unique names > */ > public void setUniqueFileName(String uniqueFileName) { > this.uniqueFileName = uniqueFileName; > } > > public boolean isOverwrite() { > return overwrite; > } > > public void setOverwrite(boolean overwrite) { > this.overwrite = overwrite; > } > > // Implementation methods > > //------------------------------------------------------------------------- > protected void init() throws JBIException { > if (clientPool == null) { > throw new IllegalArgumentException("You must initialise the > clientPool property"); > } > super.init(); > } > > protected void process(MessageExchange exchange, NormalizedMessage > message) throws Exception { > FTPClient client = null; > OutputStream out = null; > String name = null; > try { > client = (FTPClient) getClientPool().borrowClient(); > > name = marshaler.getOutputName(exchange, message); > if (name == null) { > if (uniqueFileName != null) { > out = client.storeUniqueFileStream(uniqueFileName); > } > else { > out = client.storeUniqueFileStream(); > } > } > else { > out = client.storeFileStream(name); > if (out == null) { > // lets try overwrite the previous file? > if (overwrite) { > client.deleteFile(name); > } > out = client.storeFileStream(name); > } > } > if (out == null) { > throw new IOException("No output stream available for output > name: " > + name + ". Maybe the file already exists?"); > } > > marshaler.writeMessage(exchange, message, out, name); > > done(exchange); > > } > finally { > if (out != null) { > try { > out.close(); > } > catch (IOException e) { > log.error("Caught exception while closing stream on > error: " + e, e); > } > } > client.completePendingCommand(); > > //------- Start QnD FTP (quick and dirty) rename fix.---------- > if(client.rename(name, name.substring(0, name.length() - > 4).concat(fileRenameSuffix)) == true){ > //"RENAME ON FTP SUCCEEDED" > }else{ > //"RENAME ON FTP FAILED" > } > //------- Stop QnD (quick and dirty) FTP rename fix.----------- > > returnClient(client); > } > } > > protected void returnClient(SocketClient client) { > if (client != null) { > try { > getClientPool().returnClient(client); > } > catch (Exception e) { > log.error("Failed to return client to pool: " + e, e); > } > } > } > > } > =================================================== > > ============ servicemix.xml file with rename suffix setup=========== > <!-- Send files over FTP and after that rename with new suffix. --> > <sm:activationSpec componentName="ftpSender" service="foo:ftpSender"> > <sm:component> > <bean class=" org.apache.servicemix.components.net.PostmanFTPSender"> > <property name="fileRenameSuffix" value=".emm"/> > <property name="clientPool"> > <bean id="ftpClientPool" > class="org.apache.servicemix.components.net.FTPClientPool"> > <property name="host" value="localhost"/> > <property name="username" value="myuserid"/> > <property name="password" value="mypassword"/> > </bean> > </property> > <property name="marshaler"> > <bean class=" org.apache.servicemix.components.util.BinaryFileMarshaler"> > <property name="fileName"> > <bean class=" org.apache.servicemix.expression.JAXPXPathExpression"> > <constructor-arg > value="concat(substring($org.apache.servicemix.file.name, 0, > string-length($org.apache.servicemix.file.name) - 3), '.tmp')" /> > </bean> > </property> > </bean> > </property> > </bean> > </sm:component> > </sm:activationSpec> > > > =================================================== > > Gert Vanthienen wrote: > >> L.S., >> >> As far as I know, ServiceMix does not currently support this feature. >> Because I also need it for my own applications, I'm currently working on >> a patch to add this behavior to <ftp:sender />. I won't have the time >> to do it this week, but I can probably do it next week. Would that be >> soon enough for you? Would you be willing to help me test the >> modifications? >> >> Regards, >> >> Gert >> >> >> johper wrote: >> >>> Hi, >>> >>> Doing FTP file transfer from polling directory. In the FTP target >>> directory >>> we have to use '.tmp' extension. After successfull transfer, that '.tmp' >>> file must be renamed. How can this be done with ServiceMix and/or >>> FTPSender? >>> >>> tia >>> >>> >> >> > >
-- Cheers, Guillaume Nodet ------------------------ Architect, LogicBlaze (http://www.logicblaze.com/) Blog: http://gnodet.blogspot.com/
