blob: b8dfb344c7091b8dda212684c966ebfd384def80 [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.net.URI;
import org.apache.camel.component.file.GenericFileConfiguration;
import org.apache.camel.util.ObjectHelper;
/**
* Configuration of the FTP server
*/
public abstract class RemoteFileConfiguration extends GenericFileConfiguration {
/**
* Path separator as either unix or windows style.
* <p/>
* UNIX = Path separator / is used
* Windows = Path separator \ is used
* Auto = Use existing path separator in file name
*/
public enum PathSeparator { UNIX, Windows, Auto };
private String protocol;
private String username;
private String host;
private int port;
private String password;
private boolean binary;
private boolean passiveMode;
private int connectTimeout = 10000;
private int timeout = 30000;
private int soTimeout;
private boolean throwExceptionOnConnectFailed;
private String siteCommand;
private boolean stepwise = true;
private PathSeparator separator = PathSeparator.Auto;
public RemoteFileConfiguration() {
}
public RemoteFileConfiguration(URI uri) {
configure(uri);
}
@Override
public boolean needToNormalize() {
return false;
}
@Override
public void configure(URI uri) {
super.configure(uri);
setProtocol(uri.getScheme());
setDefaultPort();
// UserInfo can contain both username and password as: user:pwd@ftpserver
// see: http://en.wikipedia.org/wiki/URI_scheme
String username = uri.getUserInfo();
String pw = null;
if (username != null && username.contains(":")) {
pw = ObjectHelper.after(username, ":");
username = ObjectHelper.before(username, ":");
}
if (username != null) {
setUsername(username);
}
if (pw != null) {
setPassword(pw);
}
setHost(uri.getHost());
setPort(uri.getPort());
}
/**
* Returns human readable server information for logging purpose
*/
public String remoteServerInformation() {
return protocol + "://" + (username != null ? username : "anonymous") + "@" + host + ":" + getPort();
}
protected abstract void setDefaultPort();
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
// only set port if provided with a positive number
if (port > 0) {
this.port = port;
}
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public boolean isBinary() {
return binary;
}
public void setBinary(boolean binary) {
this.binary = binary;
}
public boolean isPassiveMode() {
return passiveMode;
}
/**
* Sets passive mode connections.
* <br/>
* Default is active mode connections.
*/
public void setPassiveMode(boolean passiveMode) {
this.passiveMode = passiveMode;
}
public int getConnectTimeout() {
return connectTimeout;
}
/**
* Sets the connect timeout for waiting for a connection to be established
* <p/>
* Used by both FTPClient and JSCH
*/
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
public int getTimeout() {
return timeout;
}
/**
* Sets the data timeout for waiting for reply
* <p/>
* Used only by FTPClient
*/
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public int getSoTimeout() {
return soTimeout;
}
/**
* Sets the so timeout
* <p/>
* Used only by FTPClient
*/
public void setSoTimeout(int soTimeout) {
this.soTimeout = soTimeout;
}
public boolean isThrowExceptionOnConnectFailed() {
return throwExceptionOnConnectFailed;
}
/**
* Should an exception be thrown if connection failed (exhausted)
* <p/>
* By default exception is not thrown and a <tt>WARN</tt> is logged.
* You can use this to enable exception being thrown and handle the thrown exception
* from the {@link org.apache.camel.spi.PollingConsumerPollStrategy} rollback method.
*/
public void setThrowExceptionOnConnectFailed(boolean throwExceptionOnConnectFailed) {
this.throwExceptionOnConnectFailed = throwExceptionOnConnectFailed;
}
public String getSiteCommand() {
return siteCommand;
}
/**
* Sets optional site command(s) to be executed after successful login.
* <p/>
* Multiple site commands can be separated using a new line character (\n).
*
* @param siteCommand the site command(s).
*/
public void setSiteCommand(String siteCommand) {
this.siteCommand = siteCommand;
}
public boolean isStepwise() {
return stepwise;
}
/**
* Sets whether we should stepwise change directories while traversing file structures
* when downloading files, or as well when uploading a file to a directory.
* <p/>
* You can disable this if you for example are in a situation where you cannot change directory
* on the FTP server due security reasons.
*
* @param stepwise whether to use change directory or not
*/
public void setStepwise(boolean stepwise) {
this.stepwise = stepwise;
}
public PathSeparator getSeparator() {
return separator;
}
/**
* Sets the path separator to be used.
* <p/>
* UNIX = Path separator / is used
* Windows = Path separator \ is used
* Auto = (is default) Use existing path separator in file name
*/
public void setSeparator(PathSeparator separator) {
this.separator = separator;
}
/**
* Normalizes the given path according to the configured path separator.
*
* @param path the given path
* @return the normalized path
*/
public String normalizePath(String path) {
if (ObjectHelper.isEmpty(path) || separator == PathSeparator.Auto) {
return path;
}
if (separator == PathSeparator.UNIX) {
// unix style
return path.replace('\\', '/');
} else {
// windows style
return path.replace('/', '\\');
}
}
}