blob: af84b7bda307446c830546cefb8aba44c4eb5c57 [file] [log] [blame]
/**
* 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.remote;
import java.util.Map;
import org.apache.camel.FailedToCreateConsumerException;
import org.apache.camel.FailedToCreateProducerException;
import org.apache.camel.Processor;
import org.apache.camel.component.file.GenericFileConfiguration;
import org.apache.camel.component.file.GenericFileProducer;
import org.apache.camel.util.IntrospectionSupport;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
/**
* FTP endpoint
*/
public class FtpEndpoint<T extends FTPFile> extends RemoteFileEndpoint<FTPFile> {
protected FTPClient ftpClient;
protected FTPClientConfig ftpClientConfig;
protected Map<String, Object> ftpClientParameters;
protected Map<String, Object> ftpClientConfigParameters;
protected int soTimeout;
protected int dataTimeout;
public FtpEndpoint() {
super();
}
public FtpEndpoint(String uri, RemoteFileComponent<FTPFile> component, RemoteFileConfiguration configuration) {
super(uri, component, configuration);
}
@Override
public String getScheme() {
return "ftp";
}
@Override
protected RemoteFileConsumer<FTPFile> buildConsumer(Processor processor) {
try {
return new FtpConsumer(this, processor, createRemoteFileOperations());
} catch (Exception e) {
throw new FailedToCreateConsumerException(this, e);
}
}
protected GenericFileProducer<FTPFile> buildProducer() {
try {
return new RemoteFileProducer<FTPFile>(this, createRemoteFileOperations());
} catch (Exception e) {
throw new FailedToCreateProducerException(this, e);
}
}
public RemoteFileOperations<FTPFile> createRemoteFileOperations() throws Exception {
// configure ftp client
FTPClient client = ftpClient;
if (client == null) {
// must use a new client if not explicit configured to use a custom client
client = createFtpClient();
}
// set any endpoint configured timeouts
if (getConfiguration().getConnectTimeout() > -1) {
client.setConnectTimeout(getConfiguration().getConnectTimeout());
}
if (getConfiguration().getSoTimeout() > -1) {
soTimeout = getConfiguration().getSoTimeout();
}
dataTimeout = getConfiguration().getTimeout();
// then lookup ftp client parameters and set those
if (ftpClientParameters != null) {
// setting soTimeout has to be done later on FTPClient (after it has connected)
Object timeout = ftpClientParameters.remove("soTimeout");
if (timeout != null) {
soTimeout = getCamelContext().getTypeConverter().convertTo(int.class, timeout);
}
// and we want to keep data timeout so we can log it later
timeout = ftpClientParameters.remove("dataTimeout");
if (timeout != null) {
dataTimeout = getCamelContext().getTypeConverter().convertTo(int.class, dataTimeout);
}
IntrospectionSupport.setProperties(client, ftpClientParameters);
}
if (ftpClientConfigParameters != null) {
// client config is optional so create a new one if we have parameter for it
if (ftpClientConfig == null) {
ftpClientConfig = new FTPClientConfig();
}
IntrospectionSupport.setProperties(ftpClientConfig, ftpClientConfigParameters);
}
if (dataTimeout > 0) {
client.setDataTimeout(dataTimeout);
}
if (log.isDebugEnabled()) {
log.debug("Created FTPClient [connectTimeout: {}, soTimeout: {}, dataTimeout: {}]: {}",
new Object[]{client.getConnectTimeout(), getSoTimeout(), dataTimeout, client});
}
FtpOperations operations = new FtpOperations(client, getFtpClientConfig());
operations.setEndpoint(this);
return operations;
}
protected FTPClient createFtpClient() throws Exception {
return new FTPClient();
}
@Override
public FtpConfiguration getConfiguration() {
if (configuration == null) {
configuration = new FtpConfiguration();
}
return (FtpConfiguration)configuration;
}
@Override
public void setConfiguration(GenericFileConfiguration configuration) {
setConfiguration((FtpConfiguration)configuration);
}
public void setConfiguration(FtpConfiguration configuration) {
if (configuration == null) {
throw new IllegalArgumentException("FtpConfiguration expected");
}
this.configuration = configuration;
}
public FTPClient getFtpClient() {
return ftpClient;
}
public void setFtpClient(FTPClient ftpClient) {
this.ftpClient = ftpClient;
}
public FTPClientConfig getFtpClientConfig() {
return ftpClientConfig;
}
public void setFtpClientConfig(FTPClientConfig ftpClientConfig) {
this.ftpClientConfig = ftpClientConfig;
}
/**
* Used by FtpComponent to provide additional parameters for the FTPClient
*/
void setFtpClientParameters(Map<String, Object> ftpClientParameters) {
this.ftpClientParameters = ftpClientParameters;
}
/**
* Used by FtpComponent to provide additional parameters for the FTPClientConfig
*/
void setFtpClientConfigParameters(Map<String, Object> ftpClientConfigParameters) {
this.ftpClientConfigParameters = ftpClientConfigParameters;
}
public int getSoTimeout() {
return soTimeout;
}
/**
* Sets the soTimeout option.
* <p/>
* Used by FTPClient
*/
public void setSoTimeout(int soTimeout) {
this.soTimeout = soTimeout;
}
}