diff --git a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java index c7483c7c..7f9142d2 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java @@ -115,7 +115,6 @@ import java.util.concurrent.ConcurrentHashMap; initDb(APP); regAppLifeCallback(APP); initAria(); - amendTaskState(); } public Context getAPP() { @@ -137,6 +136,7 @@ import java.util.concurrent.ConcurrentHashMap; } } mDbWrapper = DelegateWrapper.init(context.getApplicationContext()); + amendTaskState(); } private void initAria() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/FtpOption.java b/Aria/src/main/java/com/arialyy/aria/core/common/FtpOption.java index c162cd83..bc4fcf69 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/FtpOption.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/FtpOption.java @@ -21,6 +21,12 @@ import com.arialyy.aria.core.ProtocolType; import com.arialyy.aria.core.processor.IFtpUploadInterceptor; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.CheckUtil; +import java.text.DateFormatSymbols; +import java.util.Collection; +import java.util.Locale; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.TreeMap; /** * Created by laoyuyu on 2018/3/9. @@ -37,6 +43,15 @@ public class FtpOption extends BaseOption { private int minPort, maxPort; private String activeExternalIPAddress; + //---------------- ftp client 配置信息 start + private String defaultDateFormatStr = null; + private String recentDateFormatStr = null; + private String serverLanguageCode = null; + private String shortMonthNames = null; + private String serverTimeZoneId = null; + private String systemKey = FTPServerIdentifier.SYST_UNIX; + //---------------- ftp client 配置信息 end + public FtpOption() { super(); } @@ -203,6 +218,78 @@ public class FtpOption extends BaseOption { return this; } + /** + * 设置ftp服务器所在的操作系统的标志,如果出现文件获取失败,请设置该标志为 + * 默认使用{@link FTPServerIdentifier#SYST_UNIX} + * + * @param identifier {@link FTPServerIdentifier} + */ + public FtpOption setServerIdentifier(String identifier) { + this.systemKey = identifier; + return this; + } + + /** + * 解析ftp信息时,默认的文件日期格式,如:setDefaultDateFormatStr("d MMM yyyy") + * + * @param defaultDateFormatStr 日期格式 + */ + public FtpOption setDefaultDateFormatStr(String defaultDateFormatStr) { + this.defaultDateFormatStr = defaultDateFormatStr; + return this; + } + + /** + * 解析ftp信息时,默认的文件修改日期格式,如:setRecentDateFormatStr("d MMM HH:mm") + * + * @param recentDateFormatStr 日期格式 + */ + public FtpOption setRecentDateFormatStr(String recentDateFormatStr) { + this.recentDateFormatStr = recentDateFormatStr; + return this; + } + + /** + * 设置服务器使用的时区,java.util.TimeZone,如:America/Chicago or Asia/Rangoon. + * + * @param serverTimeZoneId 时区 + */ + public void setServerTimeZoneId(String serverTimeZoneId) { + this.serverTimeZoneId = serverTimeZoneId; + } + + /** + *
+ * setter for the shortMonthNames property. + * This property allows the user to specify a set of month names + * used by the server that is different from those that may be + * specified using the {@link #setServerLanguageCode(String) serverLanguageCode} + * property. + *
+ * This should be a string containing twelve strings each composed of
+ * three characters, delimited by pipe (|) characters. Currently,
+ * only 8-bit ASCII characters are known to be supported. For example,
+ * a set of month names used by a hypothetical Icelandic FTP server might
+ * conceivably be specified as
+ * "jan|feb|mar|apr|maí|jún|júl|ágú|sep|okt|nóv|des"
.
+ *
Locale.US
+ *
+ * @param languageCode See {@link #setServerLanguageCode(String) serverLanguageCode}
+ * @return a DateFormatSymbols object configured with short month names
+ * corresponding to the supplied code, or with month names for
+ * Locale.US
if there is no corresponding entry in the internal
+ * table.
+ */
+ public static DateFormatSymbols lookupDateFormatSymbols(String languageCode) {
+ Object lang = LANGUAGE_CODE_MAP.get(languageCode);
+ if (lang != null) {
+ if (lang instanceof Locale) {
+ return new DateFormatSymbols((Locale) lang);
+ } else if (lang instanceof String) {
+ return getDateFormatSymbols((String) lang);
+ }
+ }
+ return new DateFormatSymbols(Locale.US);
+ }
+
+ /**
+ * Returns a DateFormatSymbols object configured with short month names
+ * as in the supplied string
+ *
+ * @param shortmonths This should be as described in
+ * {@link #setShortMonthNames(String) shortMonthNames}
+ * @return a DateFormatSymbols object configured with short month names
+ * as in the supplied string
+ */
+ public static DateFormatSymbols getDateFormatSymbols(String shortmonths) {
+ String[] months = splitShortMonthString(shortmonths);
+ DateFormatSymbols dfs = new DateFormatSymbols(Locale.US);
+ dfs.setShortMonths(months);
+ return dfs;
+ }
+
+ private static String[] splitShortMonthString(String shortmonths) {
+ StringTokenizer st = new StringTokenizer(shortmonths, "|");
+ int monthcnt = st.countTokens();
+ if (12 != monthcnt) {
+ throw new IllegalArgumentException("expecting a pipe-delimited string containing 12 tokens");
+ }
+ String[] months = new String[13];
+ int pos = 0;
+ while (st.hasMoreTokens()) {
+ months[pos++] = st.nextToken();
+ }
+ months[pos] = "";
+ return months;
+ }
+
+ /**
+ * Returns a Collection of all the language codes currently supported
+ * by this class. See {@link #setServerLanguageCode(String) serverLanguageCode}
+ * for a functional descrption of language codes within this system.
+ *
+ * @return a Collection of all the language codes currently supported
+ * by this class
+ */
+ public static Collection- * _isOpen_ is set to true after calling this method and _socket_ - * is set to the newly opened socket. - * - * @throws SocketException If the socket could not be opened or the - * timeout could not be set. - ***/ - public void open() throws SocketException { - _socket_ = _socketFactory_.createDatagramSocket(); - _socket_.setSoTimeout(_timeout_); - _isOpen_ = true; - } - - /*** - * Opens a DatagramSocket on the local host at a specified port. - * Also sets the timeout on the socket to the default timeout set - * by {@link #setDefaultTimeout setDefaultTimeout() }. - *
- * _isOpen_ is set to true after calling this method and _socket_ - * is set to the newly opened socket. - * - * @param port The port to use for the socket. - * @throws SocketException If the socket could not be opened or the - * timeout could not be set. - ***/ - public void open(int port) throws SocketException { - _socket_ = _socketFactory_.createDatagramSocket(port); - _socket_.setSoTimeout(_timeout_); - _isOpen_ = true; - } - - /*** - * Opens a DatagramSocket at the specified address on the local host - * at a specified port. - * Also sets the timeout on the socket to the default timeout set - * by {@link #setDefaultTimeout setDefaultTimeout() }. - *
- * _isOpen_ is set to true after calling this method and _socket_ - * is set to the newly opened socket. - * - * @param port The port to use for the socket. - * @param laddr The local address to use. - * @throws SocketException If the socket could not be opened or the - * timeout could not be set. - ***/ - public void open(int port, InetAddress laddr) throws SocketException { - _socket_ = _socketFactory_.createDatagramSocket(port, laddr); - _socket_.setSoTimeout(_timeout_); - _isOpen_ = true; - } - - /*** - * Closes the DatagramSocket used for the connection. - * You should call this method after you've finished using the class - * instance and also before you call {@link #open open() } - * again. _isOpen_ is set to false and _socket_ is set to null. - ***/ - public void close() { - if (_socket_ != null) { - _socket_.close(); - } - _socket_ = null; - _isOpen_ = false; - } - - /*** - * Returns true if the client has a currently open socket. - * - * @return True if the client has a currently open socket, false otherwise. - ***/ - public boolean isOpen() { - return _isOpen_; - } - - /*** - * Set the default timeout in milliseconds to use when opening a socket. - * After a call to open, the timeout for the socket is set using this value. - * This method should be used prior to a call to {@link #open open()} - * and should not be confused with {@link #setSoTimeout setSoTimeout()} - * which operates on the currently open socket. _timeout_ contains - * the new timeout value. - * - * @param timeout The timeout in milliseconds to use for the datagram socket - * connection. - ***/ - public void setDefaultTimeout(int timeout) { - _timeout_ = timeout; - } - - /*** - * Returns the default timeout in milliseconds that is used when - * opening a socket. - * - * @return The default timeout in milliseconds that is used when - * opening a socket. - ***/ - public int getDefaultTimeout() { - return _timeout_; - } - - /*** - * Set the timeout in milliseconds of a currently open connection. - * Only call this method after a connection has been opened - * by {@link #open open()}. - * - * @param timeout The timeout in milliseconds to use for the currently - * open datagram socket connection. - * @throws SocketException if an error setting the timeout - ***/ - public void setSoTimeout(int timeout) throws SocketException { - _socket_.setSoTimeout(timeout); - } - - /*** - * Returns the timeout in milliseconds of the currently opened socket. - * If you call this method when the client socket is not open, - * a NullPointerException is thrown. - * - * @return The timeout in milliseconds of the currently opened socket. - * @throws SocketException if an error getting the timeout - ***/ - public int getSoTimeout() throws SocketException { - return _socket_.getSoTimeout(); - } - - /*** - * Returns the port number of the open socket on the local host used - * for the connection. If you call this method when the client socket - * is not open, a NullPointerException is thrown. - * - * @return The port number of the open socket on the local host used - * for the connection. - ***/ - public int getLocalPort() { - return _socket_.getLocalPort(); - } - - /*** - * Returns the local address to which the client's socket is bound. - * If you call this method when the client socket is not open, a - * NullPointerException is thrown. - * - * @return The local address to which the client's socket is bound. - ***/ - public InetAddress getLocalAddress() { - return _socket_.getLocalAddress(); - } - - /*** - * Sets the DatagramSocketFactory used by the DatagramSocketClient - * to open DatagramSockets. If the factory value is null, then a default - * factory is used (only do this to reset the factory after having - * previously altered it). - * - * @param factory The new DatagramSocketFactory the DatagramSocketClient - * should use. - ***/ - public void setDatagramSocketFactory(DatagramSocketFactory factory) { - if (factory == null) { - _socketFactory_ = __DEFAULT_SOCKET_FACTORY; - } else { - _socketFactory_ = factory; - } - } - - /** - * Gets the charset name. - * - * @return the charset name. - * @since 3.3 - * TODO Will be deprecated once the code requires Java 1.6 as a mininmum - */ - public String getCharsetName() { - return charset.name(); - } - - /** - * Gets the charset. - * - * @return the charset. - * @since 3.3 - */ - public Charset getCharset() { - return charset; - } - - /** - * Sets the charset. - * - * @param charset the charset. - * @since 3.3 - */ - public void setCharset(Charset charset) { - this.charset = charset; - } -} diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketFactory.java deleted file mode 100644 index 385cceb4..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/DatagramSocketFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.SocketException; - -/*** - * The DatagramSocketFactory interface provides a means for the - * programmer to control the creation of datagram sockets and - * provide his own DatagramSocket implementations for use by all - * classes derived from - * {@link DatagramSocketClient} - * . - * This allows you to provide your own DatagramSocket implementations and - * to perform security checks or browser capability requests before - * creating a DatagramSocket. - * - * - ***/ - -public interface DatagramSocketFactory { - - /*** - * Creates a DatagramSocket on the local host at the first available port. - * @return the socket - * - * @throws SocketException If the socket could not be created. - ***/ - public DatagramSocket createDatagramSocket() throws SocketException; - - /*** - * Creates a DatagramSocket on the local host at a specified port. - * - * @param port The port to use for the socket. - * @return the socket - * @throws SocketException If the socket could not be created. - ***/ - public DatagramSocket createDatagramSocket(int port) throws SocketException; - - /*** - * Creates a DatagramSocket at the specified address on the local host - * at a specified port. - * - * @param port The port to use for the socket. - * @param laddr The local address to use. - * @return the socket - * @throws SocketException If the socket could not be created. - ***/ - public DatagramSocket createDatagramSocket(int port, InetAddress laddr) throws SocketException; -} diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultDatagramSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultDatagramSocketFactory.java deleted file mode 100644 index e269124d..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultDatagramSocketFactory.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.SocketException; - -/*** - * DefaultDatagramSocketFactory implements the DatagramSocketFactory - * interface by simply wrapping the java.net.DatagramSocket - * constructors. It is the default DatagramSocketFactory used by - * {@link DatagramSocketClient} - * implementations. - * - * - * @see DatagramSocketFactory - * @see DatagramSocketClient - * @see DatagramSocketClient#setDatagramSocketFactory - ***/ - -public class DefaultDatagramSocketFactory implements DatagramSocketFactory { - - /*** - * Creates a DatagramSocket on the local host at the first available port. - * @return a new DatagramSocket - * @throws SocketException If the socket could not be created. - ***/ - @Override public DatagramSocket createDatagramSocket() throws SocketException { - return new DatagramSocket(); - } - - /*** - * Creates a DatagramSocket on the local host at a specified port. - * - * @param port The port to use for the socket. - * @return a new DatagramSocket - * @throws SocketException If the socket could not be created. - ***/ - @Override public DatagramSocket createDatagramSocket(int port) throws SocketException { - return new DatagramSocket(port); - } - - /*** - * Creates a DatagramSocket at the specified address on the local host - * at a specified port. - * - * @param port The port to use for the socket. - * @param laddr The local address to use. - * @return a new DatagramSocket - * @throws SocketException If the socket could not be created. - ***/ - @Override public DatagramSocket createDatagramSocket(int port, InetAddress laddr) - throws SocketException { - return new DatagramSocket(port, laddr); - } -} diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultSocketFactory.java deleted file mode 100644 index 1fec9085..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/DefaultSocketFactory.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.UnknownHostException; - -import javax.net.SocketFactory; - -/*** - * DefaultSocketFactory implements the SocketFactory interface by - * simply wrapping the java.net.Socket and java.net.ServerSocket - * constructors. It is the default SocketFactory used by - * {@link SocketClient} - * implementations. - * - * - * @see SocketFactory - * @see SocketClient - * @see SocketClient#setSocketFactory - ***/ - -public class DefaultSocketFactory extends SocketFactory { - /** The proxy to use when creating new sockets. */ - private final Proxy connProxy; - - /** - * The default constructor. - */ - public DefaultSocketFactory() { - this(null); - } - - /** - * A constructor for sockets with proxy support. - * - * @param proxy The Proxy to use when creating new Sockets. - * @since 3.2 - */ - public DefaultSocketFactory(Proxy proxy) { - connProxy = proxy; - } - - /** - * Creates an unconnected Socket. - * - * @return A new unconnected Socket. - * @throws IOException If an I/O error occurs while creating the Socket. - * @since 3.2 - */ - @Override public Socket createSocket() throws IOException { - if (connProxy != null) { - return new Socket(connProxy); - } - return new Socket(); - } - - /*** - * Creates a Socket connected to the given host and port. - * - * @param host The hostname to connect to. - * @param port The port to connect to. - * @return A Socket connected to the given host and port. - * @throws UnknownHostException If the hostname cannot be resolved. - * @throws IOException If an I/O error occurs while creating the Socket. - ***/ - @Override public Socket createSocket(String host, int port) - throws UnknownHostException, IOException { - if (connProxy != null) { - Socket s = new Socket(connProxy); - s.connect(new InetSocketAddress(host, port)); - return s; - } - return new Socket(host, port); - } - - /*** - * Creates a Socket connected to the given host and port. - * - * @param address The address of the host to connect to. - * @param port The port to connect to. - * @return A Socket connected to the given host and port. - * @throws IOException If an I/O error occurs while creating the Socket. - ***/ - @Override public Socket createSocket(InetAddress address, int port) throws IOException { - if (connProxy != null) { - Socket s = new Socket(connProxy); - s.connect(new InetSocketAddress(address, port)); - return s; - } - return new Socket(address, port); - } - - /*** - * Creates a Socket connected to the given host and port and - * originating from the specified local address and port. - * - * @param host The hostname to connect to. - * @param port The port to connect to. - * @param localAddr The local address to use. - * @param localPort The local port to use. - * @return A Socket connected to the given host and port. - * @throws UnknownHostException If the hostname cannot be resolved. - * @throws IOException If an I/O error occurs while creating the Socket. - ***/ - @Override public Socket createSocket(String host, int port, InetAddress localAddr, int localPort) - throws UnknownHostException, IOException { - if (connProxy != null) { - Socket s = new Socket(connProxy); - s.bind(new InetSocketAddress(localAddr, localPort)); - s.connect(new InetSocketAddress(host, port)); - return s; - } - return new Socket(host, port, localAddr, localPort); - } - - /*** - * Creates a Socket connected to the given host and port and - * originating from the specified local address and port. - * - * @param address The address of the host to connect to. - * @param port The port to connect to. - * @param localAddr The local address to use. - * @param localPort The local port to use. - * @return A Socket connected to the given host and port. - * @throws IOException If an I/O error occurs while creating the Socket. - ***/ - @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddr, - int localPort) throws IOException { - if (connProxy != null) { - Socket s = new Socket(connProxy); - s.bind(new InetSocketAddress(localAddr, localPort)); - s.connect(new InetSocketAddress(address, port)); - return s; - } - return new Socket(address, port, localAddr, localPort); - } - - /*** - * Creates a ServerSocket bound to a specified port. A port - * of 0 will create the ServerSocket on a system-determined free port. - * - * @param port The port on which to listen, or 0 to use any free port. - * @return A ServerSocket that will listen on a specified port. - * @throws IOException If an I/O error occurs while creating - * the ServerSocket. - ***/ - public ServerSocket createServerSocket(int port) throws IOException { - return new ServerSocket(port); - } - - /*** - * Creates a ServerSocket bound to a specified port with a given - * maximum queue length for incoming connections. A port of 0 will - * create the ServerSocket on a system-determined free port. - * - * @param port The port on which to listen, or 0 to use any free port. - * @param backlog The maximum length of the queue for incoming connections. - * @return A ServerSocket that will listen on a specified port. - * @throws IOException If an I/O error occurs while creating - * the ServerSocket. - ***/ - public ServerSocket createServerSocket(int port, int backlog) throws IOException { - return new ServerSocket(port, backlog); - } - - /*** - * Creates a ServerSocket bound to a specified port on a given local - * address with a given maximum queue length for incoming connections. - * A port of 0 will - * create the ServerSocket on a system-determined free port. - * - * @param port The port on which to listen, or 0 to use any free port. - * @param backlog The maximum length of the queue for incoming connections. - * @param bindAddr The local address to which the ServerSocket should bind. - * @return A ServerSocket that will listen on a specified port. - * @throws IOException If an I/O error occurs while creating - * the ServerSocket. - ***/ - public ServerSocket createServerSocket(int port, int backlog, InetAddress bindAddr) - throws IOException { - return new ServerSocket(port, backlog, bindAddr); - } -} diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/MalformedServerReplyException.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/MalformedServerReplyException.java deleted file mode 100644 index c63818fc..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/MalformedServerReplyException.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import java.io.IOException; - -/*** - * This exception is used to indicate that the reply from a server - * could not be interpreted. Most of the NetComponents classes attempt - * to be as lenient as possible when receiving server replies. Many - * server implementations deviate from IETF protocol specifications, making - * it necessary to be as flexible as possible. However, there will be - * certain situations where it is not possible to continue an operation - * because the server reply could not be interpreted in a meaningful manner. - * In these cases, a MalformedServerReplyException should be thrown. - * - * - ***/ - -public class MalformedServerReplyException extends IOException { - - private static final long serialVersionUID = 6006765264250543945L; - - /*** Constructs a MalformedServerReplyException with no message ***/ - public MalformedServerReplyException() { - super(); - } - - /*** - * Constructs a MalformedServerReplyException with a specified message. - * - * @param message The message explaining the reason for the exception. - ***/ - public MalformedServerReplyException(String message) { - super(message); - } -} diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/PrintCommandListener.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/PrintCommandListener.java deleted file mode 100644 index 14f92c78..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/PrintCommandListener.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import java.io.PrintStream; -import java.io.PrintWriter; - -/*** - * This is a support class for some of the example programs. It is - * a sample implementation of the ProtocolCommandListener interface - * which just prints out to a specified stream all command/reply traffic. - * - * @since 2.0 - ***/ - -public class PrintCommandListener implements ProtocolCommandListener { - private final PrintWriter __writer; - private final boolean __nologin; - private final char __eolMarker; - private final boolean __directionMarker; - - /** - * Create the default instance which prints everything. - * - * @param stream where to write the commands and responses - * e.g. System.out - * @since 3.0 - */ - public PrintCommandListener(PrintStream stream) { - this(new PrintWriter(stream)); - } - - /** - * Create an instance which optionally suppresses login command text - * and indicates where the EOL starts with the specified character. - * - * @param stream where to write the commands and responses - * @param suppressLogin if {@code true}, only print command name for login - * @since 3.0 - */ - public PrintCommandListener(PrintStream stream, boolean suppressLogin) { - this(new PrintWriter(stream), suppressLogin); - } - - /** - * Create an instance which optionally suppresses login command text - * and indicates where the EOL starts with the specified character. - * - * @param stream where to write the commands and responses - * @param suppressLogin if {@code true}, only print command name for login - * @param eolMarker if non-zero, add a marker just before the EOL. - * @since 3.0 - */ - public PrintCommandListener(PrintStream stream, boolean suppressLogin, char eolMarker) { - this(new PrintWriter(stream), suppressLogin, eolMarker); - } - - /** - * Create an instance which optionally suppresses login command text - * and indicates where the EOL starts with the specified character. - * - * @param stream where to write the commands and responses - * @param suppressLogin if {@code true}, only print command name for login - * @param eolMarker if non-zero, add a marker just before the EOL. - * @param showDirection if {@code true}, add {@code "> "} or {@code "< "} as appropriate to the - * output - * @since 3.0 - */ - public PrintCommandListener(PrintStream stream, boolean suppressLogin, char eolMarker, - boolean showDirection) { - this(new PrintWriter(stream), suppressLogin, eolMarker, showDirection); - } - - /** - * Create the default instance which prints everything. - * - * @param writer where to write the commands and responses - */ - public PrintCommandListener(PrintWriter writer) { - this(writer, false); - } - - /** - * Create an instance which optionally suppresses login command text. - * - * @param writer where to write the commands and responses - * @param suppressLogin if {@code true}, only print command name for login - * @since 3.0 - */ - public PrintCommandListener(PrintWriter writer, boolean suppressLogin) { - this(writer, suppressLogin, (char) 0); - } - - /** - * Create an instance which optionally suppresses login command text - * and indicates where the EOL starts with the specified character. - * - * @param writer where to write the commands and responses - * @param suppressLogin if {@code true}, only print command name for login - * @param eolMarker if non-zero, add a marker just before the EOL. - * @since 3.0 - */ - public PrintCommandListener(PrintWriter writer, boolean suppressLogin, char eolMarker) { - this(writer, suppressLogin, eolMarker, false); - } - - /** - * Create an instance which optionally suppresses login command text - * and indicates where the EOL starts with the specified character. - * - * @param writer where to write the commands and responses - * @param suppressLogin if {@code true}, only print command name for login - * @param eolMarker if non-zero, add a marker just before the EOL. - * @param showDirection if {@code true}, add {@code ">} " or {@code "< "} as appropriate to the - * output - * @since 3.0 - */ - public PrintCommandListener(PrintWriter writer, boolean suppressLogin, char eolMarker, - boolean showDirection) { - __writer = writer; - __nologin = suppressLogin; - __eolMarker = eolMarker; - __directionMarker = showDirection; - } - - @Override public void protocolCommandSent(ProtocolCommandEvent event) { - if (__directionMarker) { - __writer.print("> "); - } - if (__nologin) { - String cmd = event.getCommand(); - if ("PASS".equalsIgnoreCase(cmd) || "USER".equalsIgnoreCase(cmd)) { - __writer.print(cmd); - __writer.println(" *******"); // Don't bother with EOL marker for this! - } else { - final String IMAP_LOGIN = "LOGIN"; - if (IMAP_LOGIN.equalsIgnoreCase(cmd)) { // IMAP - String msg = event.getMessage(); - msg = msg.substring(0, msg.indexOf(IMAP_LOGIN) + IMAP_LOGIN.length()); - __writer.print(msg); - __writer.println(" *******"); // Don't bother with EOL marker for this! - } else { - __writer.print(getPrintableString(event.getMessage())); - } - } - } else { - __writer.print(getPrintableString(event.getMessage())); - } - __writer.flush(); - } - - private String getPrintableString(String msg) { - if (__eolMarker == 0) { - return msg; - } - int pos = msg.indexOf(SocketClient.NETASCII_EOL); - if (pos > 0) { - StringBuilder sb = new StringBuilder(); - sb.append(msg.substring(0, pos)); - sb.append(__eolMarker); - sb.append(msg.substring(pos)); - return sb.toString(); - } - return msg; - } - - @Override public void protocolReplyReceived(ProtocolCommandEvent event) { - if (__directionMarker) { - __writer.print("< "); - } - __writer.print(event.getMessage()); - __writer.flush(); - } -} - diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandEvent.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandEvent.java deleted file mode 100644 index 9f0154e7..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandEvent.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import java.util.EventObject; - -/*** - * There exists a large class of IETF protocols that work by sending an - * ASCII text command and arguments to a server, and then receiving an - * ASCII text reply. For debugging and other purposes, it is extremely - * useful to log or keep track of the contents of the protocol messages. - * The ProtocolCommandEvent class coupled with the - * {@link ProtocolCommandListener} - * interface facilitate this process. - * - * - * @see ProtocolCommandListener - * @see ProtocolCommandSupport - ***/ - -public class ProtocolCommandEvent extends EventObject { - private static final long serialVersionUID = 403743538418947240L; - - private final int __replyCode; - private final boolean __isCommand; - private final String __message, __command; - - /*** - * Creates a ProtocolCommandEvent signalling a command was sent to - * the server. ProtocolCommandEvents created with this constructor - * should only be sent after a command has been sent, but before the - * reply has been received. - * - * @param source The source of the event. - * @param command The string representation of the command type sent, not - * including the arguments (e.g., "STAT" or "GET"). - * @param message The entire command string verbatim as sent to the server, - * including all arguments. - ***/ - public ProtocolCommandEvent(Object source, String command, String message) { - super(source); - __replyCode = 0; - __message = message; - __isCommand = true; - __command = command; - } - - /*** - * Creates a ProtocolCommandEvent signalling a reply to a command was - * received. ProtocolCommandEvents created with this constructor - * should only be sent after a complete command reply has been received - * fromt a server. - * - * @param source The source of the event. - * @param replyCode The integer code indicating the natureof the reply. - * This will be the protocol integer value for protocols - * that use integer reply codes, or the reply class constant - * corresponding to the reply for protocols like POP3 that use - * strings like OK rather than integer codes (i.e., POP3Repy.OK). - * @param message The entire reply as received from the server. - ***/ - public ProtocolCommandEvent(Object source, int replyCode, String message) { - super(source); - __replyCode = replyCode; - __message = message; - __isCommand = false; - __command = null; - } - - /*** - * Returns the string representation of the command type sent (e.g., "STAT" - * or "GET"). If the ProtocolCommandEvent is a reply event, then null - * is returned. - * - * @return The string representation of the command type sent, or null - * if this is a reply event. - ***/ - public String getCommand() { - return __command; - } - - /*** - * Returns the reply code of the received server reply. Undefined if - * this is not a reply event. - * - * @return The reply code of the received server reply. Undefined if - * not a reply event. - ***/ - public int getReplyCode() { - return __replyCode; - } - - /*** - * Returns true if the ProtocolCommandEvent was generated as a result - * of sending a command. - * - * @return true If the ProtocolCommandEvent was generated as a result - * of sending a command. False otherwise. - ***/ - public boolean isCommand() { - return __isCommand; - } - - /*** - * Returns true if the ProtocolCommandEvent was generated as a result - * of receiving a reply. - * - * @return true If the ProtocolCommandEvent was generated as a result - * of receiving a reply. False otherwise. - ***/ - public boolean isReply() { - return !isCommand(); - } - - /*** - * Returns the entire message sent to or received from the server. - * Includes the line terminator. - * - * @return The entire message sent to or received from the server. - ***/ - public String getMessage() { - return __message; - } -} diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandListener.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandListener.java deleted file mode 100644 index 12f8e00e..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandListener.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import aria.apache.commons.net.ftp.FTPClient; -import java.util.EventListener; - -/*** - * There exists a large class of IETF protocols that work by sending an - * ASCII text command and arguments to a server, and then receiving an - * ASCII text reply. For debugging and other purposes, it is extremely - * useful to log or keep track of the contents of the protocol messages. - * The ProtocolCommandListener interface coupled with the - * {@link ProtocolCommandEvent} class facilitate this process. - *
- * To receive ProtocolCommandEvents, you merely implement the - * ProtocolCommandListener interface and register the class as a listener - * with a ProtocolCommandEvent source such as - * {@link FTPClient}. - * - * - * @see ProtocolCommandEvent - * @see ProtocolCommandSupport - ***/ - -public interface ProtocolCommandListener extends EventListener { - - /*** - * This method is invoked by a ProtocolCommandEvent source after - * sending a protocol command to a server. - * - * @param event The ProtocolCommandEvent fired. - ***/ - public void protocolCommandSent(ProtocolCommandEvent event); - - /*** - * This method is invoked by a ProtocolCommandEvent source after - * receiving a reply from a server. - * - * @param event The ProtocolCommandEvent fired. - ***/ - public void protocolReplyReceived(ProtocolCommandEvent event); -} diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandSupport.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandSupport.java deleted file mode 100644 index 01b1888e..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ProtocolCommandSupport.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import java.io.Serializable; -import java.util.EventListener; - -import aria.apache.commons.net.util.ListenerList; - -/*** - * ProtocolCommandSupport is a convenience class for managing a list of - * ProtocolCommandListeners and firing ProtocolCommandEvents. You can - * simply delegate ProtocolCommandEvent firing and listener - * registering/unregistering tasks to this class. - * - * - * @see ProtocolCommandEvent - * @see ProtocolCommandListener - ***/ - -public class ProtocolCommandSupport implements Serializable { - private static final long serialVersionUID = -8017692739988399978L; - - private final Object __source; - private final ListenerList __listeners; - - /*** - * Creates a ProtocolCommandSupport instance using the indicated source - * as the source of ProtocolCommandEvents. - * - * @param source The source to use for all generated ProtocolCommandEvents. - ***/ - public ProtocolCommandSupport(Object source) { - __listeners = new ListenerList(); - __source = source; - } - - /*** - * Fires a ProtocolCommandEvent signalling the sending of a command to all - * registered listeners, invoking their - * {@link ProtocolCommandListener#protocolCommandSent protocolCommandSent() } - * methods. - * - * @param command The string representation of the command type sent, not - * including the arguments (e.g., "STAT" or "GET"). - * @param message The entire command string verbatim as sent to the server, - * including all arguments. - ***/ - public void fireCommandSent(String command, String message) { - ProtocolCommandEvent event; - - event = new ProtocolCommandEvent(__source, command, message); - - for (EventListener listener : __listeners) { - ((ProtocolCommandListener) listener).protocolCommandSent(event); - } - } - - /*** - * Fires a ProtocolCommandEvent signalling the reception of a command reply - * to all registered listeners, invoking their - * {@link ProtocolCommandListener#protocolReplyReceived protocolReplyReceived() } - * methods. - * - * @param replyCode The integer code indicating the natureof the reply. - * This will be the protocol integer value for protocols - * that use integer reply codes, or the reply class constant - * corresponding to the reply for protocols like POP3 that use - * strings like OK rather than integer codes (i.e., POP3Repy.OK). - * @param message The entire reply as received from the server. - ***/ - public void fireReplyReceived(int replyCode, String message) { - ProtocolCommandEvent event; - event = new ProtocolCommandEvent(__source, replyCode, message); - - for (EventListener listener : __listeners) { - ((ProtocolCommandListener) listener).protocolReplyReceived(event); - } - } - - /*** - * Adds a ProtocolCommandListener. - * - * @param listener The ProtocolCommandListener to add. - ***/ - public void addProtocolCommandListener(ProtocolCommandListener listener) { - __listeners.addListener(listener); - } - - /*** - * Removes a ProtocolCommandListener. - * - * @param listener The ProtocolCommandListener to remove. - ***/ - public void removeProtocolCommandListener(ProtocolCommandListener listener) { - __listeners.removeListener(listener); - } - - /*** - * Returns the number of ProtocolCommandListeners currently registered. - * - * @return The number of ProtocolCommandListeners currently registered. - ***/ - public int getListenerCount() { - return __listeners.getListenerCount(); - } -} - diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/SocketClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/SocketClient.java deleted file mode 100644 index 0ac183a7..00000000 --- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/SocketClient.java +++ /dev/null @@ -1,869 +0,0 @@ -/* - * 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 aria.apache.commons.net; - -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.Socket; -import java.net.SocketException; -import java.nio.charset.Charset; - -import javax.net.ServerSocketFactory; -import javax.net.SocketFactory; - -/** - * The SocketClient provides the basic operations that are required of - * client objects accessing sockets. It is meant to be - * subclassed to avoid having to rewrite the same code over and over again - * to open a socket, close a socket, set timeouts, etc. Of special note - * is the {@link #setSocketFactory setSocketFactory } - * method, which allows you to control the type of Socket the SocketClient - * creates for initiating network connections. This is especially useful - * for adding SSL or proxy support as well as better support for applets. For - * example, you could create a - * {@link SocketFactory} that - * requests browser security capabilities before creating a socket. - * All classes derived from SocketClient should use the - * {@link #_socketFactory_ _socketFactory_ } member variable to - * create Socket and ServerSocket instances rather than instantiating - * them by directly invoking a constructor. By honoring this contract - * you guarantee that a user will always be able to provide his own - * Socket implementations by substituting his own SocketFactory. - * - * @see SocketFactory - */ -public abstract class SocketClient { - /** - * The end of line character sequence used by most IETF protocols. That - * is a carriage return followed by a newline: "\r\n" - */ - public static final String NETASCII_EOL = "\r\n"; - - /** The default SocketFactory shared by all SocketClient instances. */ - private static final SocketFactory __DEFAULT_SOCKET_FACTORY = SocketFactory.getDefault(); - - /** The default {@link ServerSocketFactory} */ - private static final ServerSocketFactory __DEFAULT_SERVER_SOCKET_FACTORY = - ServerSocketFactory.getDefault(); - - /** - * A ProtocolCommandSupport object used to manage the registering of - * ProtocolCommandListeners and the firing of ProtocolCommandEvents. - */ - private ProtocolCommandSupport __commandSupport; - - /** The timeout to use after opening a socket. */ - protected int _timeout_; - - /** The socket used for the connection. */ - protected Socket _socket_; - - /** The hostname used for the connection (null = no hostname supplied). */ - protected String _hostname_; - - /** The default port the client should connect to. */ - protected int _defaultPort_; - - /** The socket's InputStream. */ - protected InputStream _input_; - - /** The socket's OutputStream. */ - protected OutputStream _output_; - - /** The socket's SocketFactory. */ - protected SocketFactory _socketFactory_; - - /** The socket's ServerSocket Factory. */ - protected ServerSocketFactory _serverSocketFactory_; - - /** The socket's connect timeout (0 = infinite timeout) */ - private static final int DEFAULT_CONNECT_TIMEOUT = 0; - protected int connectTimeout = DEFAULT_CONNECT_TIMEOUT; - - /** Hint for SO_RCVBUF size */ - private int receiveBufferSize = -1; - - /** Hint for SO_SNDBUF size */ - private int sendBufferSize = -1; - - /** The proxy to use when connecting. */ - private Proxy connProxy; - - /** - * Charset to use for byte IO. - */ - private Charset charset = Charset.defaultCharset(); - - /** - * Default constructor for SocketClient. Initializes - * _socket_ to null, _timeout_ to 0, _defaultPort to 0, - * _isConnected_ to false, charset to {@code Charset.defaultCharset()} - * and _socketFactory_ to a shared instance of - * {@link DefaultSocketFactory}. - */ - public SocketClient() { - _socket_ = null; - _hostname_ = null; - _input_ = null; - _output_ = null; - _timeout_ = 0; - _defaultPort_ = 0; - _socketFactory_ = __DEFAULT_SOCKET_FACTORY; - _serverSocketFactory_ = __DEFAULT_SERVER_SOCKET_FACTORY; - } - - /** - * Because there are so many connect() methods, the _connectAction_() - * method is provided as a means of performing some action immediately - * after establishing a connection, rather than reimplementing all - * of the connect() methods. The last action performed by every - * connect() method after opening a socket is to call this method. - *
- * This method sets the timeout on the just opened socket to the default - * timeout set by {@link #setDefaultTimeout setDefaultTimeout() }, - * sets _input_ and _output_ to the socket's InputStream and OutputStream - * respectively, and sets _isConnected_ to true. - *
- * Subclasses overriding this method should start by calling
- * super._connectAction_()
first to ensure the
- * initialization of the aforementioned protected variables.
- *
- * @throws IOException (SocketException) if a problem occurs with the socket
- */
- protected void _connectAction_() throws IOException {
- _socket_.setSoTimeout(_timeout_);
- _input_ = _socket_.getInputStream();
- _output_ = _socket_.getOutputStream();
- }
-
- /**
- * Opens a Socket connected to a remote host at the specified port and
- * originating from the current host at a system assigned port.
- * Before returning, {@link #_connectAction_ _connectAction_() }
- * is called to perform connection initialization actions.
- *
- * - * @param host The remote host. - * @param port The port to connect to on the remote host. - * @throws SocketException If the socket timeout could not be set. - * @throws IOException If the socket could not be opened. In most - * cases you will only want to catch IOException since SocketException is - * derived from it. - */ - public void connect(InetAddress host, int port) throws SocketException, IOException { - _hostname_ = null; - _connect(host, port, null, -1); - } - - /** - * Opens a Socket connected to a remote host at the specified port and - * originating from the current host at a system assigned port. - * Before returning, {@link #_connectAction_ _connectAction_() } - * is called to perform connection initialization actions. - *
- * - * @param hostname The name of the remote host. - * @param port The port to connect to on the remote host. - * @throws SocketException If the socket timeout could not be set. - * @throws IOException If the socket could not be opened. In most - * cases you will only want to catch IOException since SocketException is - * derived from it. - * @throws java.net.UnknownHostException If the hostname cannot be resolved. - */ - public void connect(String hostname, int port) throws SocketException, IOException { - _hostname_ = hostname; - _connect(InetAddress.getByName(hostname), port, null, -1); - } - - /** - * Opens a Socket connected to a remote host at the specified port and - * originating from the specified local address and port. - * Before returning, {@link #_connectAction_ _connectAction_() } - * is called to perform connection initialization actions. - *
- * - * @param host The remote host. - * @param port The port to connect to on the remote host. - * @param localAddr The local address to use. - * @param localPort The local port to use. - * @throws SocketException If the socket timeout could not be set. - * @throws IOException If the socket could not be opened. In most - * cases you will only want to catch IOException since SocketException is - * derived from it. - */ - public void connect(InetAddress host, int port, InetAddress localAddr, int localPort) - throws SocketException, IOException { - _hostname_ = null; - _connect(host, port, localAddr, localPort); - } - - // helper method to allow code to be shared with connect(String,...) methods - private void _connect(InetAddress host, int port, InetAddress localAddr, int localPort) - throws SocketException, IOException { - _socket_ = _socketFactory_.createSocket(); - if (receiveBufferSize != -1) { - _socket_.setReceiveBufferSize(receiveBufferSize); - } - if (sendBufferSize != -1) { - _socket_.setSendBufferSize(sendBufferSize); - } - if (localAddr != null) { - _socket_.bind(new InetSocketAddress(localAddr, localPort)); - } - _socket_.connect(new InetSocketAddress(host, port), connectTimeout); - _connectAction_(); - } - - /** - * Opens a Socket connected to a remote host at the specified port and - * originating from the specified local address and port. - * Before returning, {@link #_connectAction_ _connectAction_() } - * is called to perform connection initialization actions. - *
- * - * @param hostname The name of the remote host. - * @param port The port to connect to on the remote host. - * @param localAddr The local address to use. - * @param localPort The local port to use. - * @throws SocketException If the socket timeout could not be set. - * @throws IOException If the socket could not be opened. In most - * cases you will only want to catch IOException since SocketException is - * derived from it. - * @throws java.net.UnknownHostException If the hostname cannot be resolved. - */ - public void connect(String hostname, int port, InetAddress localAddr, int localPort) - throws SocketException, IOException { - _hostname_ = hostname; - _connect(InetAddress.getByName(hostname), port, localAddr, localPort); - } - - /** - * Opens a Socket connected to a remote host at the current default port - * and originating from the current host at a system assigned port. - * Before returning, {@link #_connectAction_ _connectAction_() } - * is called to perform connection initialization actions. - *
- * - * @param host The remote host. - * @throws SocketException If the socket timeout could not be set. - * @throws IOException If the socket could not be opened. In most - * cases you will only want to catch IOException since SocketException is - * derived from it. - */ - public void connect(InetAddress host) throws SocketException, IOException { - _hostname_ = null; - connect(host, _defaultPort_); - } - - /** - * Opens a Socket connected to a remote host at the current default - * port and originating from the current host at a system assigned port. - * Before returning, {@link #_connectAction_ _connectAction_() } - * is called to perform connection initialization actions. - *
- * - * @param hostname The name of the remote host. - * @throws SocketException If the socket timeout could not be set. - * @throws IOException If the socket could not be opened. In most - * cases you will only want to catch IOException since SocketException is - * derived from it. - * @throws java.net.UnknownHostException If the hostname cannot be resolved. - */ - public void connect(String hostname) throws SocketException, IOException { - connect(hostname, _defaultPort_); - } - - /** - * Disconnects the socket connection. - * You should call this method after you've finished using the class - * instance and also before you call - * {@link #connect connect() } - * again. _isConnected_ is set to false, _socket_ is set to null, - * _input_ is set to null, and _output_ is set to null. - *
- * - * @throws IOException If there is an error closing the socket. - */ - public void disconnect() throws IOException { - closeQuietly(_socket_); - closeQuietly(_input_); - closeQuietly(_output_); - _socket_ = null; - _hostname_ = null; - _input_ = null; - _output_ = null; - } - - private void closeQuietly(Socket socket) { - if (socket != null) { - try { - socket.close(); - } catch (IOException e) { - // Ignored - } - } - } - - private void closeQuietly(Closeable close) { - if (close != null) { - try { - close.close(); - } catch (IOException e) { - // Ignored - } - } - } - - /** - * Returns true if the client is currently connected to a server. - *
- * Delegates to {@link Socket#isConnected()} - * - * @return True if the client is currently connected to a server, - * false otherwise. - */ - public boolean isConnected() { - if (_socket_ == null) { - return false; - } - - return _socket_.isConnected(); - } - - /** - * Make various checks on the socket to test if it is available for use. - * Note that the only sure test is to use it, but these checks may help - * in some cases. - * - * @return {@code true} if the socket appears to be available for use - * @see NET-350 - * @since 3.0 - */ - public boolean isAvailable() { - if (isConnected()) { - try { - if (_socket_.getInetAddress() == null) { - return false; - } - if (_socket_.getPort() == 0) { - return false; - } - if (_socket_.getRemoteSocketAddress() == null) { - return false; - } - if (_socket_.isClosed()) { - return false; - } - /* these aren't exact checks (a Socket can be half-open), - but since we usually require two-way data transfer, - we check these here too: */ - if (_socket_.isInputShutdown()) { - return false; - } - if (_socket_.isOutputShutdown()) { - return false; - } - /* ignore the result, catch exceptions: */ - _socket_.getInputStream(); - _socket_.getOutputStream(); - } catch (IOException ioex) { - return false; - } - return true; - } else { - return false; - } - } - - /** - * Sets the default port the SocketClient should connect to when a port - * is not specified. The {@link #_defaultPort_ _defaultPort_ } - * variable stores this value. If never set, the default port is equal - * to zero. - *
- * - * @param port The default port to set. - */ - public void setDefaultPort(int port) { - _defaultPort_ = port; - } - - /** - * Returns the current value of the default port (stored in - * {@link #_defaultPort_ _defaultPort_ }). - *
- * - * @return The current value of the default port. - */ - public int getDefaultPort() { - return _defaultPort_; - } - - /** - * Set the default timeout in milliseconds to use when opening a socket. - * This value is only used previous to a call to - * {@link #connect connect()} - * and should not be confused with {@link #setSoTimeout setSoTimeout()} - * which operates on an the currently opened socket. _timeout_ contains - * the new timeout value. - *
- * - * @param timeout The timeout in milliseconds to use for the socket - * connection. - */ - public void setDefaultTimeout(int timeout) { - _timeout_ = timeout; - } - - /** - * Returns the default timeout in milliseconds that is used when - * opening a socket. - *
- * - * @return The default timeout in milliseconds that is used when - * opening a socket. - */ - public int getDefaultTimeout() { - return _timeout_; - } - - /** - * Set the timeout in milliseconds of a currently open connection. - * Only call this method after a connection has been opened - * by {@link #connect connect()}. - *
- * To set the initial timeout, use {@link #setDefaultTimeout(int)} instead. - * - * @param timeout The timeout in milliseconds to use for the currently - * open socket connection. - * @throws SocketException If the operation fails. - * @throws NullPointerException if the socket is not currently open - */ - public void setSoTimeout(int timeout) throws SocketException { - _socket_.setSoTimeout(timeout); - } - - /** - * Set the underlying socket send buffer size. - *
- * - * @param size The size of the buffer in bytes. - * @throws SocketException never thrown, but subclasses might want to do so - * @since 2.0 - */ - public void setSendBufferSize(int size) throws SocketException { - sendBufferSize = size; - } - - /** - * Get the current sendBuffer size - * - * @return the size, or -1 if not initialised - * @since 3.0 - */ - protected int getSendBufferSize() { - return sendBufferSize; - } - - /** - * Sets the underlying socket receive buffer size. - *
- * - * @param size The size of the buffer in bytes. - * @throws SocketException never (but subclasses may wish to do so) - * @since 2.0 - */ - public void setReceiveBufferSize(int size) throws SocketException { - receiveBufferSize = size; - } - - /** - * Get the current receivedBuffer size - * - * @return the size, or -1 if not initialised - * @since 3.0 - */ - protected int getReceiveBufferSize() { - return receiveBufferSize; - } - - /** - * Returns the timeout in milliseconds of the currently opened socket. - *
- * - * @return The timeout in milliseconds of the currently opened socket. - * @throws SocketException If the operation fails. - * @throws NullPointerException if the socket is not currently open - */ - public int getSoTimeout() throws SocketException { - return _socket_.getSoTimeout(); - } - - /** - * Enables or disables the Nagle's algorithm (TCP_NODELAY) on the - * currently opened socket. - *
- * - * @param on True if Nagle's algorithm is to be enabled, false if not. - * @throws SocketException If the operation fails. - * @throws NullPointerException if the socket is not currently open - */ - public void setTcpNoDelay(boolean on) throws SocketException { - _socket_.setTcpNoDelay(on); - } - - /** - * Returns true if Nagle's algorithm is enabled on the currently opened - * socket. - *
- * - * @return True if Nagle's algorithm is enabled on the currently opened - * socket, false otherwise. - * @throws SocketException If the operation fails. - * @throws NullPointerException if the socket is not currently open - */ - public boolean getTcpNoDelay() throws SocketException { - return _socket_.getTcpNoDelay(); - } - - /** - * Sets the SO_KEEPALIVE flag on the currently opened socket. - * - * From the Javadocs, the default keepalive time is 2 hours (although this is - * implementation dependent). It looks as though the Windows WSA sockets implementation - * allows a specific keepalive value to be set, although this seems not to be the case on - * other systems. - * - * @param keepAlive If true, keepAlive is turned on - * @throws SocketException if there is a problem with the socket - * @throws NullPointerException if the socket is not currently open - * @since 2.2 - */ - public void setKeepAlive(boolean keepAlive) throws SocketException { - _socket_.setKeepAlive(keepAlive); - } - - /** - * Returns the current value of the SO_KEEPALIVE flag on the currently opened socket. - * Delegates to {@link Socket#getKeepAlive()} - * - * @return True if SO_KEEPALIVE is enabled. - * @throws SocketException if there is a problem with the socket - * @throws NullPointerException if the socket is not currently open - * @since 2.2 - */ - public boolean getKeepAlive() throws SocketException { - return _socket_.getKeepAlive(); - } - - /** - * Sets the SO_LINGER timeout on the currently opened socket. - *
- * - * @param on True if linger is to be enabled, false if not. - * @param val The linger timeout (in hundredths of a second?) - * @throws SocketException If the operation fails. - * @throws NullPointerException if the socket is not currently open - */ - public void setSoLinger(boolean on, int val) throws SocketException { - _socket_.setSoLinger(on, val); - } - - /** - * Returns the current SO_LINGER timeout of the currently opened socket. - *
- * - * @return The current SO_LINGER timeout. If SO_LINGER is disabled returns - * -1. - * @throws SocketException If the operation fails. - * @throws NullPointerException if the socket is not currently open - */ - public int getSoLinger() throws SocketException { - return _socket_.getSoLinger(); - } - - /** - * Returns the port number of the open socket on the local host used - * for the connection. - * Delegates to {@link Socket#getLocalPort()} - *
- * - * @return The port number of the open socket on the local host used - * for the connection. - * @throws NullPointerException if the socket is not currently open - */ - public int getLocalPort() { - return _socket_.getLocalPort(); - } - - /** - * Returns the local address to which the client's socket is bound. - * Delegates to {@link Socket#getLocalAddress()} - *
- * - * @return The local address to which the client's socket is bound. - * @throws NullPointerException if the socket is not currently open - */ - public InetAddress getLocalAddress() { - return _socket_.getLocalAddress(); - } - - /** - * Returns the port number of the remote host to which the client is - * connected. - * Delegates to {@link Socket#getPort()} - *
- * - * @return The port number of the remote host to which the client is - * connected. - * @throws NullPointerException if the socket is not currently open - */ - public int getRemotePort() { - return _socket_.getPort(); - } - - /** - * @return The remote address to which the client is connected. - * Delegates to {@link Socket#getInetAddress()} - * @throws NullPointerException if the socket is not currently open - */ - public InetAddress getRemoteAddress() { - return _socket_.getInetAddress(); - } - - /** - * Verifies that the remote end of the given socket is connected to the - * the same host that the SocketClient is currently connected to. This - * is useful for doing a quick security check when a client needs to - * accept a connection from a server, such as an FTP data connection or - * a BSD R command standard error stream. - *
- * - * @param socket the item to check against - * @return True if the remote hosts are the same, false if not. - */ - public boolean verifyRemote(Socket socket) { - InetAddress host1, host2; - - host1 = socket.getInetAddress(); - host2 = getRemoteAddress(); - - return host1.equals(host2); - } - - /** - * Sets the SocketFactory used by the SocketClient to open socket - * connections. If the factory value is null, then a default - * factory is used (only do this to reset the factory after having - * previously altered it). - * Any proxy setting is discarded. - *
- * - * @param factory The new SocketFactory the SocketClient should use. - */ - public void setSocketFactory(SocketFactory factory) { - if (factory == null) { - _socketFactory_ = __DEFAULT_SOCKET_FACTORY; - } else { - _socketFactory_ = factory; - } - // re-setting the socket factory makes the proxy setting useless, - // so set the field to null so that getProxy() doesn't return a - // Proxy that we're actually not using. - connProxy = null; - } - - /** - * Sets the ServerSocketFactory used by the SocketClient to open ServerSocket - * connections. If the factory value is null, then a default - * factory is used (only do this to reset the factory after having - * previously altered it). - *
- *
- * @param factory The new ServerSocketFactory the SocketClient should use.
- * @since 2.0
- */
- public void setServerSocketFactory(ServerSocketFactory factory) {
- if (factory == null) {
- _serverSocketFactory_ = __DEFAULT_SERVER_SOCKET_FACTORY;
- } else {
- _serverSocketFactory_ = factory;
- }
- }
-
- /**
- * Sets the connection timeout in milliseconds, which will be passed to the {@link Socket}
- * object's
- * connect() method.
- *
- * @param connectTimeout The connection timeout to use (in ms)
- * @since 2.0
- */
- public void setConnectTimeout(int connectTimeout) {
- this.connectTimeout = connectTimeout;
- }
-
- /**
- * Get the underlying socket connection timeout.
- *
- * @return timeout (in ms)
- * @since 2.0
- */
- public int getConnectTimeout() {
- return connectTimeout;
- }
-
- /**
- * Get the underlying {@link ServerSocketFactory}
- *
- * @return The server socket factory
- * @since 2.2
- */
- public ServerSocketFactory getServerSocketFactory() {
- return _serverSocketFactory_;
- }
-
- /**
- * Adds a ProtocolCommandListener.
- *
- * @param listener The ProtocolCommandListener to add.
- * @since 3.0
- */
- public void addProtocolCommandListener(ProtocolCommandListener listener) {
- getCommandSupport().addProtocolCommandListener(listener);
- }
-
- /**
- * Removes a ProtocolCommandListener.
- *
- * @param listener The ProtocolCommandListener to remove.
- * @since 3.0
- */
- public void removeProtocolCommandListener(ProtocolCommandListener listener) {
- getCommandSupport().removeProtocolCommandListener(listener);
- }
-
- /**
- * If there are any listeners, send them the reply details.
- *
- * @param replyCode the code extracted from the reply
- * @param reply the full reply text
- * @since 3.0
- */
- protected void fireReplyReceived(int replyCode, String reply) {
- if (getCommandSupport().getListenerCount() > 0) {
- getCommandSupport().fireReplyReceived(replyCode, reply);
- }
- }
-
- /**
- * If there are any listeners, send them the command details.
- *
- * @param command the command name
- * @param message the complete message, including command name
- * @since 3.0
- */
- protected void fireCommandSent(String command, String message) {
- if (getCommandSupport().getListenerCount() > 0) {
- getCommandSupport().fireCommandSent(command, message);
- }
- }
-
- /**
- * Create the CommandSupport instance if required
- */
- protected void createCommandSupport() {
- __commandSupport = new ProtocolCommandSupport(this);
- }
-
- /**
- * Subclasses can override this if they need to provide their own
- * instance field for backwards compatibilty.
- *
- * @return the CommandSupport instance, may be {@code null}
- * @since 3.0
- */
- protected ProtocolCommandSupport getCommandSupport() {
- return __commandSupport;
- }
-
- /**
- * Sets the proxy for use with all the connections.
- * The proxy is used for connections established after the
- * call to this method.
- *
- * @param proxy the new proxy for connections.
- * @since 3.2
- */
- public void setProxy(Proxy proxy) {
- setSocketFactory(new DefaultSocketFactory(proxy));
- connProxy = proxy;
- }
-
- /**
- * Gets the proxy for use with all the connections.
- *
- * @return the current proxy for connections.
- */
- public Proxy getProxy() {
- return connProxy;
- }
-
- /**
- * Gets the charset name.
- *
- * @return the charset.
- * @since 3.3
- * @deprecated Since the code now requires Java 1.6 as a mininmum
- */
- @Deprecated public String getCharsetName() {
- return charset.name();
- }
-
- /**
- * Gets the charset.
- *
- * @return the charset.
- * @since 3.3
- */
- public Charset getCharset() {
- return charset;
- }
-
- /**
- * Sets the charset.
- *
- * @param charset the charset.
- * @since 3.3
- */
- public void setCharset(Charset charset) {
- this.charset = charset;
- }
-
- /*
- * N.B. Fields cannot be pulled up into a super-class without breaking binary compatibility,
- * so the abstract method is needed to pass the instance to the methods which were moved here.
- */
-}
-
-
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/Configurable.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/Configurable.java
deleted file mode 100644
index b0361f80..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/Configurable.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-/**
- * This interface adds the aspect of configurability by means of
- * a supplied FTPClientConfig object to other classes in the
- * system, especially listing parsers.
- */
-public interface Configurable {
-
- /**
- * @param config the object containing the configuration data
- * @throws IllegalArgumentException if the elements of the
- * config
are somehow inadequate to configure the
- * Configurable object.
- */
- public void configure(FTPClientConfig config);
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTP.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTP.java
deleted file mode 100644
index 12a99b15..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTP.java
+++ /dev/null
@@ -1,1777 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.util.ArrayList;
-
-import aria.apache.commons.net.MalformedServerReplyException;
-import aria.apache.commons.net.ProtocolCommandSupport;
-import aria.apache.commons.net.SocketClient;
-import aria.apache.commons.net.io.CRLFLineReader;
-
-/***
- * FTP provides the basic the functionality necessary to implement your
- * own FTP client. It extends SocketClient since
- * extending TelnetClient was causing unwanted behavior (like connections
- * that did not time out properly).
- *
- * To derive the full benefits of the FTP class requires some knowledge - * of the FTP protocol defined in RFC 959. However, there is no reason - * why you should have to use the FTP class. The - * {@link FTPClient} class, - * derived from FTP, - * implements all the functionality required of an FTP client. The - * FTP class is made public to provide access to various FTP constants - * and to make it easier for adventurous programmers (or those with - * special needs) to interact with the FTP protocol and implement their - * own clients. A set of methods with names corresponding to the FTP - * command names are provided to facilitate this interaction. - *
- * You should keep in mind that the FTP server may choose to prematurely
- * close a connection if the client has been idle for longer than a
- * given time period (usually 900 seconds). The FTP class will detect a
- * premature FTP server connection closing when it receives a
- * {@link FTPReply#SERVICE_NOT_AVAILABLE FTPReply.SERVICE_NOT_AVAILABLE }
- * response to a command.
- * When that occurs, the FTP class method encountering that reply will throw
- * an {@link FTPConnectionClosedException}
- * . FTPConectionClosedException
- * is a subclass of IOException
and therefore need not be
- * caught separately, but if you are going to catch it separately, its
- * catch block must appear before the more general IOException
- * catch block. When you encounter an
- * {@link FTPConnectionClosedException}
- * , you must disconnect the connection with
- * {@link #disconnect disconnect() } to properly clean up the
- * system resources used by FTP. Before disconnecting, you may check the
- * last reply code and text with
- * {@link #getReplyCode getReplyCode },
- * {@link #getReplyString getReplyString },
- * and {@link #getReplyStrings getReplyStrings}.
- * You may avoid server disconnections while the client is idle by
- * periodicaly sending NOOP commands to the server.
- *
- * Rather than list it separately for each method, we mention here that
- * every method communicating with the server and throwing an IOException
- * can also throw a
- * {@link MalformedServerReplyException}
- * , which is a subclass
- * of IOException. A MalformedServerReplyException will be thrown when
- * the reply received from the server deviates enough from the protocol
- * specification that it cannot be interpreted in a useful manner despite
- * attempts to be as lenient as possible.
- *
- * @see FTPClient
- * @see FTPConnectionClosedException
- * @see MalformedServerReplyException
- * @version $Id: FTP.java 1782546 2017-02-11 00:05:41Z sebb $
- ***/
-
-public class FTP extends SocketClient {
- /*** The default FTP data port (20). ***/
- public static final int DEFAULT_DATA_PORT = 20;
- /*** The default FTP control port (21). ***/
- public static final int DEFAULT_PORT = 21;
-
- /***
- * A constant used to indicate the file(s) being transferred should
- * be treated as ASCII. This is the default file type. All constants
- * ending in
- * Please note that this has to be set before the connection is established.
- *
- * @param encoding The new character encoding for the control connection.
- */
- public void setControlEncoding(String encoding) {
- _controlEncoding = encoding;
- }
-
- /**
- * @return The character encoding used to communicate over the
- * control connection.
- */
- public String getControlEncoding() {
- return _controlEncoding;
- }
-
- /***
- * Closes the control connection to the FTP server and sets to null
- * some internal data so that the memory may be reclaimed by the
- * garbage collector. The reply text and code information from the
- * last command is voided so that the memory it used may be reclaimed.
- * Also sets {@link #_controlInput_} and {@link #_controlOutput_} to null.
- *
- * @throws IOException If an error occurs while disconnecting.
- ***/
- @Override public void disconnect() throws IOException {
- super.disconnect();
- _controlInput_ = null;
- _controlOutput_ = null;
- _newReplyString = false;
- _replyString = null;
- }
-
- /***
- * Sends an FTP command to the server, waits for a reply and returns the
- * numerical response code. After invocation, for more detailed
- * information, the actual reply text can be accessed by calling
- * {@link #getReplyString getReplyString } or
- * {@link #getReplyStrings getReplyStrings }.
- *
- * @param command The text representation of the FTP command to send.
- * @param args The arguments to the FTP command. If this parameter is
- * set to null, then the command is sent with no argument.
- * @return The integer value of the FTP reply code returned by the server
- * in response to the command.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int sendCommand(String command, String args) throws IOException {
- if (_controlOutput_ == null) {
- throw new IOException("Connection is not open");
- }
-
- final String message = __buildMessage(command, args);
-
- __send(message);
-
- fireCommandSent(command, message);
-
- __getReply();
- return _replyCode;
- }
-
- private String __buildMessage(String command, String args) {
- final StringBuilder __commandBuffer = new StringBuilder();
-
- __commandBuffer.append(command);
-
- if (args != null) {
- __commandBuffer.append(' ');
- __commandBuffer.append(args);
- }
- __commandBuffer.append(SocketClient.NETASCII_EOL);
- return __commandBuffer.toString();
- }
-
- private void __send(String message)
- throws IOException, FTPConnectionClosedException, SocketException {
- try {
- _controlOutput_.write(message);
- _controlOutput_.flush();
- } catch (SocketException e) {
- if (!isConnected()) {
- throw new FTPConnectionClosedException("Connection unexpectedly closed.");
- } else {
- throw e;
- }
- }
- }
-
- /**
- * Send a noop and get the reply without reporting to the command listener.
- * Intended for use with keep-alive.
- *
- * @throws IOException on error
- * @since 3.0
- */
- protected void __noop() throws IOException {
- String msg = __buildMessage(FTPCmd.NOOP.getCommand(), null);
- __send(msg);
- __getReplyNoReport(); // This may timeout
- }
-
- /***
- * Sends an FTP command to the server, waits for a reply and returns the
- * numerical response code. After invocation, for more detailed
- * information, the actual reply text can be accessed by calling
- * {@link #getReplyString getReplyString } or
- * {@link #getReplyStrings getReplyStrings }.
- *
- * @param command The FTPCommand constant corresponding to the FTP command
- * to send.
- * @param args The arguments to the FTP command. If this parameter is
- * set to null, then the command is sent with no argument.
- * @return The integer value of the FTP reply code returned by the server
- * in response to the command.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @deprecated (3.3) Use {@link #sendCommand(FTPCmd, String)} instead
- ***/
- @Deprecated public int sendCommand(int command, String args) throws IOException {
- return sendCommand(FTPCommand.getCommand(command), args);
- }
-
- /**
- * Sends an FTP command to the server, waits for a reply and returns the
- * numerical response code. After invocation, for more detailed
- * information, the actual reply text can be accessed by calling
- * {@link #getReplyString getReplyString } or
- * {@link #getReplyStrings getReplyStrings }.
- *
- * @param command The FTPCmd enum corresponding to the FTP command
- * to send.
- * @return The integer value of the FTP reply code returned by the server
- * in response to the command.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 3.3
- */
- public int sendCommand(FTPCmd command) throws IOException {
- return sendCommand(command, null);
- }
-
- /**
- * Sends an FTP command to the server, waits for a reply and returns the
- * numerical response code. After invocation, for more detailed
- * information, the actual reply text can be accessed by calling
- * {@link #getReplyString getReplyString } or
- * {@link #getReplyStrings getReplyStrings }.
- *
- * @param command The FTPCmd enum corresponding to the FTP command
- * to send.
- * @param args The arguments to the FTP command. If this parameter is
- * set to null, then the command is sent with no argument.
- * @return The integer value of the FTP reply code returned by the server
- * in response to the command.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 3.3
- */
- public int sendCommand(FTPCmd command, String args) throws IOException {
- return sendCommand(command.getCommand(), args);
- }
-
- /***
- * Sends an FTP command with no arguments to the server, waits for a
- * reply and returns the numerical response code. After invocation, for
- * more detailed information, the actual reply text can be accessed by
- * calling {@link #getReplyString getReplyString } or
- * {@link #getReplyStrings getReplyStrings }.
- *
- * @param command The text representation of the FTP command to send.
- * @return The integer value of the FTP reply code returned by the server
- * in response to the command.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int sendCommand(String command) throws IOException {
- return sendCommand(command, null);
- }
-
- /***
- * Sends an FTP command with no arguments to the server, waits for a
- * reply and returns the numerical response code. After invocation, for
- * more detailed information, the actual reply text can be accessed by
- * calling {@link #getReplyString getReplyString } or
- * {@link #getReplyStrings getReplyStrings }.
- *
- * @param command The FTPCommand constant corresponding to the FTP command
- * to send.
- * @return The integer value of the FTP reply code returned by the server
- * in response to the command.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int sendCommand(int command) throws IOException {
- return sendCommand(command, null);
- }
-
- /***
- * Returns the integer value of the reply code of the last FTP reply.
- * You will usually only use this method after you connect to the
- * FTP server to check that the connection was successful since
- *
- * The default is true, which requires the 3 digit code be followed by space and some text.
- *
- * If true, it requires the 3 digit code be followed by space and some text.
- *
- * This should not be required by a well-behaved FTP server
- *
- * Immediately after connecting is the only real time you need to check the
- * reply code (because connect is of type void). The convention for all the
- * FTP command methods in FTPClient is such that they either return a
- * boolean value or some other value.
- * The boolean methods return true on a successful completion reply from
- * the FTP server and false on a reply resulting in an error condition or
- * failure. The methods returning a value other than boolean return a value
- * containing the higher level data produced by the FTP command, or null if a
- * reply resulted in an error condition or failure. If you want to access
- * the exact FTP reply code causing a success or failure, you must call
- * {@link FTP#getReplyCode getReplyCode } after
- * a success or failure.
- *
- * The default settings for FTPClient are for it to use
- *
- *
- * Because the handling of sockets on different platforms can differ
- * significantly, the FTPClient automatically issues a new PORT (or EPRT) command
- * prior to every transfer requiring that the server connect to the client's
- * data port. This ensures identical problem-free behavior on Windows, Unix,
- * and Macintosh platforms. Additionally, it relieves programmers from
- * having to issue the PORT (or EPRT) command themselves and dealing with platform
- * dependent issues.
- *
- * Additionally, for security purposes, all data connections to the
- * client are verified to ensure that they originated from the intended
- * party (host and port). If a data connection is initiated by an unexpected
- * party, the command will close the socket and throw an IOException. You
- * may disable this behavior with
- * {@link #setRemoteVerificationEnabled setRemoteVerificationEnabled()}.
- *
- * You should keep in mind that the FTP server may choose to prematurely
- * close a connection if the client has been idle for longer than a
- * given time period (usually 900 seconds). The FTPClient class will detect a
- * premature FTP server connection closing when it receives a
- * {@link FTPReply#SERVICE_NOT_AVAILABLE FTPReply.SERVICE_NOT_AVAILABLE }
- * response to a command.
- * When that occurs, the FTP class method encountering that reply will throw
- * an {@link FTPConnectionClosedException}
- * .
- *
- * Rather than list it separately for each method, we mention here that
- * every method communicating with the server and throwing an IOException
- * can also throw a
- * {@link MalformedServerReplyException}
- * , which is a subclass
- * of IOException. A MalformedServerReplyException will be thrown when
- * the reply received from the server deviates enough from the protocol
- * specification that it cannot be interpreted in a useful manner despite
- * attempts to be as lenient as possible.
- *
- * Listing API Examples
- * Both paged and unpaged examples of directory listings are available,
- * as follows:
- *
- * Unpaged (whole list) access, using a parser accessible by auto-detect:
- *
- * Paged access, using a parser not accessible by auto-detect. The class
- * defined in the first parameter of initateListParsing should be derived
- * from org.apache.commons.net.FTPFileEntryParser:
- *
- * Paged access, using a parser accessible by auto-detect:
- *
- * For examples of using FTPClient on servers whose directory listings
- *
- * Control channel keep-alive feature:
- *
- * Please note: this does not apply to the methods where the user is responsible for writing
- * or reading
- * the data stream, i.e. {@link #retrieveFileStream(String)} , {@link #storeFileStream(String)}
- * and the other xxxFileStream methods
- *
- * During file transfers, the data connection is busy, but the control connection is idle.
- * FTP servers know that the control connection is in use, so won't close it through lack of
- * activity,
- * but it's a lot harder for network routers to know that the control and data connections are
- * associated
- * with each other.
- * Some routers may treat the control connection as idle, and disconnect it if the transfer over the
- * data
- * connection takes longer than the allowable idle time for the router.
- *
- * The implementation currently uses a {@link CopyStreamListener} which is passed to the
- * {@link Util#copyStream(InputStream, OutputStream, int, long, CopyStreamListener, boolean)}
- * method, so the timing is partially dependent on how long each block transfer takes.
- *
- * @see #FTP_SYSTEM_TYPE
- * @see #SYSTEM_TYPE_PROPERTIES
- * @see FTP
- * @see FTPConnectionClosedException
- * @see FTPFileEntryParser
- * @see FTPFileEntryParserFactory
- * @see DefaultFTPFileEntryParserFactory
- * @see FTPClientConfig
- * @see MalformedServerReplyException
- */
-public class FTPClient extends FTP implements Configurable {
- /**
- * The system property ({@value}) which can be used to override the system type.
- * The list parsing auto-detect feature can be configured to use lenient future
- * dates (short dates may be up to one day in the future) as follows:
- *
- * According to RFC959 (http://www.ietf.org/rfc/rfc959.txt),
- * it should be the same as for MKD i.e.
- * {@code 257
- * However, see NET-442 for an exception.
- *
- * @return the pathname, without enclosing quotes,
- * or the full string after the reply code and space if the syntax is invalid
- * (i.e. enclosing quotes are missing or embedded quotes are not doubled)
- */
- // package protected for access by test cases
- static String __parsePathname(String reply) {
- String param = reply.substring(REPLY_CODE_LEN + 1);
- if (param.startsWith("\"")) {
- StringBuilder sb = new StringBuilder();
- boolean quoteSeen = false;
- // start after initial quote
- for (int i = 1; i < param.length(); i++) {
- char ch = param.charAt(i);
- if (ch == '"') {
- if (quoteSeen) {
- sb.append(ch);
- quoteSeen = false;
- } else {
- // don't output yet, in case doubled
- quoteSeen = true;
- }
- } else {
- if (quoteSeen) { // found lone trailing quote within string
- return sb.toString();
- }
- sb.append(ch); // just another character
- }
- }
- if (quoteSeen) { // found lone trailing quote at end of string
- return sb.toString();
- }
- }
- // malformed reply, return all after reply code and space
- return param;
- }
-
- /**
- * @param reply the reply to parse
- * @throws MalformedServerReplyException if the server reply does not match (n,n,n,n),(n),(n)
- * @since 3.1
- */
- protected void _parsePassiveModeReply(String reply) throws MalformedServerReplyException {
- java.util.regex.Matcher m = __PARMS_PAT.matcher(reply);
- if (!m.find()) {
- throw new MalformedServerReplyException(
- "Could not parse passive host information.\nServer Reply: " + reply);
- }
-
- __passiveHost = m.group(1).replace(',', '.'); // Fix up to look like IP address
-
- try {
- int oct1 = Integer.parseInt(m.group(2));
- int oct2 = Integer.parseInt(m.group(3));
- __passivePort = (oct1 << 8) | oct2;
- } catch (NumberFormatException e) {
- throw new MalformedServerReplyException(
- "Could not parse passive port information.\nServer Reply: " + reply);
- }
-
- if (__passiveNatWorkaroundStrategy != null) {
- try {
- String passiveHost = __passiveNatWorkaroundStrategy.resolve(__passiveHost);
- if (!__passiveHost.equals(passiveHost)) {
- fireReplyReceived(0, "[Replacing PASV mode reply address "
- + __passiveHost
- + " with "
- + passiveHost
- + "]\n");
- __passiveHost = passiveHost;
- }
- } catch (UnknownHostException e) { // Should not happen as we are passing in an IP address
- throw new MalformedServerReplyException(
- "Could not parse passive host information.\nServer Reply: " + reply);
- }
- }
- }
-
- protected void _parseExtendedPassiveModeReply(String reply) throws MalformedServerReplyException {
- reply = reply.substring(reply.indexOf('(') + 1, reply.indexOf(')')).trim();
-
- char delim1, delim2, delim3, delim4;
- delim1 = reply.charAt(0);
- delim2 = reply.charAt(1);
- delim3 = reply.charAt(2);
- delim4 = reply.charAt(reply.length() - 1);
-
- if (!(delim1 == delim2) || !(delim2 == delim3) || !(delim3 == delim4)) {
- throw new MalformedServerReplyException(
- "Could not parse extended passive host information.\nServer Reply: " + reply);
- }
-
- int port;
- try {
- port = Integer.parseInt(reply.substring(3, reply.length() - 1));
- } catch (NumberFormatException e) {
- throw new MalformedServerReplyException(
- "Could not parse extended passive host information.\nServer Reply: " + reply);
- }
-
- // in EPSV mode, the passive host address is implicit
- __passiveHost = getRemoteAddress().getHostAddress();
- __passivePort = port;
- }
-
- private boolean __storeFile(FTPCmd command, String remote, InputStream local) throws IOException {
- return _storeFile(command.getCommand(), remote, local);
- }
-
- /**
- * @param command the command to send
- * @param remote the remote file name
- * @param local the local file name
- * @return true if successful
- * @throws IOException on error
- * @since 3.1
- */
- protected boolean _storeFile(String command, String remote, InputStream local)
- throws IOException {
- Socket socket = _openDataConnection_(command, remote);
-
- if (socket == null) {
- return false;
- }
-
- final OutputStream output;
-
- if (__fileType == ASCII_FILE_TYPE) {
- output = new ToNetASCIIOutputStream(getBufferedOutputStream(socket.getOutputStream()));
- } else {
- output = getBufferedOutputStream(socket.getOutputStream());
- }
-
- CSL csl = null;
- if (__controlKeepAliveTimeout > 0) {
- if (mListener != null) {
- csl = new CSL(this, __controlKeepAliveTimeout, __controlKeepAliveReplyTimeout, mListener);
- } else {
- csl = new CSL(this, __controlKeepAliveTimeout, __controlKeepAliveReplyTimeout);
- }
- }
-
- // Treat everything else as binary for now
- try {
- Util.copyStream(local, output, getBufferSize(), CopyStreamEvent.UNKNOWN_STREAM_SIZE,
- __mergeListeners(csl), false);
- } catch (IOException e) {
- Util.closeQuietly(socket); // ignore close errors here
- if (csl != null) {
- csl.cleanUp(); // fetch any outstanding keepalive replies
- }
- throw e;
- }
-
- output.close(); // ensure the file is fully written
- socket.close(); // done writing the file
- if (csl != null) {
- csl.cleanUp(); // fetch any outstanding keepalive replies
- }
- // Get the transfer response
- boolean ok = completePendingCommand();
- return ok;
- }
-
- private OutputStream __storeFileStream(FTPCmd command, String remote) throws IOException {
- return _storeFileStream(command.getCommand(), remote);
- }
-
- /**
- * @param command the command to send
- * @param remote the remote file name
- * @return the output stream to write to
- * @throws IOException on error
- * @since 3.1
- */
- protected OutputStream _storeFileStream(String command, String remote) throws IOException {
- Socket socket = _openDataConnection_(command, remote);
-
- if (socket == null) {
- return null;
- }
-
- final OutputStream output;
- if (__fileType == ASCII_FILE_TYPE) {
- // We buffer ascii transfers because the buffering has to
- // be interposed between ToNetASCIIOutputSream and the underlying
- // socket output stream. We don't buffer binary transfers
- // because we don't want to impose a buffering policy on the
- // programmer if possible. Programmers can decide on their
- // own if they want to wrap the SocketOutputStream we return
- // for file types other than ASCII.
- output = new ToNetASCIIOutputStream(getBufferedOutputStream(socket.getOutputStream()));
- } else {
- output = socket.getOutputStream();
- }
- return new SocketOutputStream(socket, output);
- }
-
- /**
- * Establishes a data connection with the FTP server, returning
- * a Socket for the connection if successful. If a restart
- * offset has been set with {@link #setRestartOffset(long)},
- * a REST command is issued to the server with the offset as
- * an argument before establishing the data connection. Active
- * mode connections also cause a local PORT command to be issued.
- *
- * @param command The int representation of the FTP command to send.
- * @param arg The arguments to the FTP command. If this parameter is
- * set to null, then the command is sent with no argument.
- * @return A Socket corresponding to the established data connection.
- * Null is returned if an FTP protocol error is reported at
- * any point during the establishment and initialization of
- * the connection.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @deprecated (3.3) Use {@link #_openDataConnection_(FTPCmd, String)} instead
- */
- @Deprecated protected Socket _openDataConnection_(int command, String arg) throws IOException {
- return _openDataConnection_(FTPCommand.getCommand(command), arg);
- }
-
- /**
- * Establishes a data connection with the FTP server, returning
- * a Socket for the connection if successful. If a restart
- * offset has been set with {@link #setRestartOffset(long)},
- * a REST command is issued to the server with the offset as
- * an argument before establishing the data connection. Active
- * mode connections also cause a local PORT command to be issued.
- *
- * @param command The int representation of the FTP command to send.
- * @param arg The arguments to the FTP command. If this parameter is
- * set to null, then the command is sent with no argument.
- * @return A Socket corresponding to the established data connection.
- * Null is returned if an FTP protocol error is reported at
- * any point during the establishment and initialization of
- * the connection.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @since 3.3
- */
- protected Socket _openDataConnection_(FTPCmd command, String arg) throws IOException {
- return _openDataConnection_(command.getCommand(), arg);
- }
-
- /**
- * Establishes a data connection with the FTP server, returning
- * a Socket for the connection if successful. If a restart
- * offset has been set with {@link #setRestartOffset(long)},
- * a REST command is issued to the server with the offset as
- * an argument before establishing the data connection. Active
- * mode connections also cause a local PORT command to be issued.
- *
- * @param command The text representation of the FTP command to send.
- * @param arg The arguments to the FTP command. If this parameter is
- * set to null, then the command is sent with no argument.
- * @return A Socket corresponding to the established data connection.
- * Null is returned if an FTP protocol error is reported at
- * any point during the establishment and initialization of
- * the connection.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @since 3.1
- */
- protected Socket _openDataConnection_(String command, String arg) throws IOException {
- if (__dataConnectionMode != ACTIVE_LOCAL_DATA_CONNECTION_MODE
- && __dataConnectionMode != PASSIVE_LOCAL_DATA_CONNECTION_MODE) {
- return null;
- }
-
- final boolean isInet6Address = getRemoteAddress() instanceof Inet6Address;
-
- Socket socket;
-
- if (__dataConnectionMode == ACTIVE_LOCAL_DATA_CONNECTION_MODE) {
- // if no activePortRange was set (correctly) -> getActivePort() = 0
- // -> new ServerSocket(0) -> bind to any free local port
- ServerSocket server =
- _serverSocketFactory_.createServerSocket(getActivePort(), 1, getHostAddress());
-
- try {
- // Try EPRT only if remote server is over IPv6, if not use PORT,
- // because EPRT has no advantage over PORT on IPv4.
- // It could even have the disadvantage,
- // that EPRT will make the data connection fail, because
- // today's intelligent NAT Firewalls are able to
- // substitute IP addresses in the PORT command,
- // but might not be able to recognize the EPRT command.
- if (isInet6Address) {
- if (!FTPReply.isPositiveCompletion(eprt(getReportHostAddress(), server.getLocalPort()))) {
- return null;
- }
- } else {
- if (!FTPReply.isPositiveCompletion(port(getReportHostAddress(), server.getLocalPort()))) {
- return null;
- }
- }
-
- if ((__restartOffset > 0) && !restart(__restartOffset)) {
- return null;
- }
-
- if (!FTPReply.isPositivePreliminary(sendCommand(command, arg))) {
- return null;
- }
-
- // For now, let's just use the data timeout value for waiting for
- // the data connection. It may be desirable to let this be a
- // separately configurable value. In any case, we really want
- // to allow preventing the accept from blocking indefinitely.
- if (__dataTimeout >= 0) {
- server.setSoTimeout(__dataTimeout);
- }
- socket = server.accept();
-
- // Ensure the timeout is set before any commands are issued on the new socket
- if (__dataTimeout >= 0) {
- socket.setSoTimeout(__dataTimeout);
- }
- if (__receiveDataSocketBufferSize > 0) {
- socket.setReceiveBufferSize(__receiveDataSocketBufferSize);
- }
- if (__sendDataSocketBufferSize > 0) {
- socket.setSendBufferSize(__sendDataSocketBufferSize);
- }
- } finally {
- server.close();
- }
- } else { // We must be in PASSIVE_LOCAL_DATA_CONNECTION_MODE
-
- // Try EPSV command first on IPv6 - and IPv4 if enabled.
- // When using IPv4 with NAT it has the advantage
- // to work with more rare configurations.
- // E.g. if FTP server has a static PASV address (external network)
- // and the client is coming from another internal network.
- // In that case the data connection after PASV command would fail,
- // while EPSV would make the client succeed by taking just the port.
- boolean attemptEPSV = isUseEPSVwithIPv4() || isInet6Address;
- if (attemptEPSV && epsv() == FTPReply.ENTERING_EPSV_MODE) {
- _parseExtendedPassiveModeReply(_replyLines.get(0));
- } else {
- if (isInet6Address) {
- return null; // Must use EPSV for IPV6
- }
- // If EPSV failed on IPV4, revert to PASV
- if (pasv() != FTPReply.ENTERING_PASSIVE_MODE) {
- return null;
- }
- _parsePassiveModeReply(_replyLines.get(0));
- }
-
- socket = _socketFactory_.createSocket();
- if (__receiveDataSocketBufferSize > 0) {
- socket.setReceiveBufferSize(__receiveDataSocketBufferSize);
- }
- if (__sendDataSocketBufferSize > 0) {
- socket.setSendBufferSize(__sendDataSocketBufferSize);
- }
- if (__passiveLocalHost != null) {
- socket.bind(new InetSocketAddress(__passiveLocalHost, 0));
- }
-
- // For now, let's just use the data timeout value for waiting for
- // the data connection. It may be desirable to let this be a
- // separately configurable value. In any case, we really want
- // to allow preventing the accept from blocking indefinitely.
- if (__dataTimeout >= 0) {
- socket.setSoTimeout(__dataTimeout);
- }
-
- socket.connect(new InetSocketAddress(__passiveHost, __passivePort), connectTimeout);
- if ((__restartOffset > 0) && !restart(__restartOffset)) {
- socket.close();
- return null;
- }
-
- if (!FTPReply.isPositivePreliminary(sendCommand(command, arg))) {
- socket.close();
- return null;
- }
- }
-
- if (__remoteVerificationEnabled && !verifyRemote(socket)) {
- socket.close();
-
- throw new IOException("Host attempting data connection "
- + socket.getInetAddress().getHostAddress()
- + " is not same as server "
- + getRemoteAddress().getHostAddress());
- }
-
- return socket;
- }
-
- @Override protected void _connectAction_() throws IOException {
- _connectAction_(null);
- }
-
- /**
- * @param socketIsReader the reader to reuse (if non-null)
- * @throws IOException on error
- * @since 3.4
- */
- @Override protected void _connectAction_(Reader socketIsReader) throws IOException {
- super._connectAction_(socketIsReader); // sets up _input_ and _output_
- __initDefaults();
- // must be after super._connectAction_(), because otherwise we get an
- // Exception claiming we're not connected
- if (__autodetectEncoding) {
- ArrayList
- * Note: the timeout will also be applied when calling accept()
- * whilst establishing an active local data connection.
- *
- * @param timeout The default timeout in milliseconds that is used when
- * opening a data connection socket. The value 0 means an infinite timeout.
- */
- public void setDataTimeout(int timeout) {
- __dataTimeout = timeout;
- }
-
- /**
- * set the factory used for parser creation to the supplied factory object.
- *
- * @param parserFactory factory object used to create FTPFileEntryParsers
- * @see FTPFileEntryParserFactory
- * @see DefaultFTPFileEntryParserFactory
- */
- public void setParserFactory(FTPFileEntryParserFactory parserFactory) {
- __parserFactory = parserFactory;
- }
-
- /**
- * Closes the connection to the FTP server and restores
- * connection parameters to the default values.
- *
- * @throws IOException If an error occurs while disconnecting.
- */
- @Override public void disconnect() throws IOException {
- super.disconnect();
- __initDefaults();
- }
-
- /**
- * Enable or disable verification that the remote host taking part
- * of a data connection is the same as the host to which the control
- * connection is attached. The default is for verification to be
- * enabled. You may set this value at any time, whether the
- * FTPClient is currently connected or not.
- *
- * @param enable True to enable verification, false to disable verification.
- */
- public void setRemoteVerificationEnabled(boolean enable) {
- __remoteVerificationEnabled = enable;
- }
-
- /**
- * Return whether or not verification of the remote host participating
- * in data connections is enabled. The default behavior is for
- * verification to be enabled.
- *
- * @return True if verification is enabled, false if not.
- */
- public boolean isRemoteVerificationEnabled() {
- return __remoteVerificationEnabled;
- }
-
- /**
- * Login to the FTP server using the provided username and password.
- *
- * @param username The username to login under.
- * @param password The password to use.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean login(String username, String password) throws IOException {
-
- user(username);
-
- if (FTPReply.isPositiveCompletion(_replyCode)) {
- return true;
- }
-
- // If we get here, we either have an error code, or an intermmediate
- // reply requesting password.
- if (!FTPReply.isPositiveIntermediate(_replyCode)) {
- return false;
- }
-
- return FTPReply.isPositiveCompletion(pass(password));
- }
-
- /**
- * Login to the FTP server using the provided username, password,
- * and account. If no account is required by the server, only
- * the username and password, the account information is not used.
- *
- * @param username The username to login under.
- * @param password The password to use.
- * @param account The account to use.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean login(String username, String password, String account) throws IOException {
- user(username);
-
- if (FTPReply.isPositiveCompletion(_replyCode)) {
- return true;
- }
-
- // If we get here, we either have an error code, or an intermmediate
- // reply requesting password.
- if (!FTPReply.isPositiveIntermediate(_replyCode)) {
- return false;
- }
-
- pass(password);
-
- if (FTPReply.isPositiveCompletion(_replyCode)) {
- return true;
- }
-
- if (!FTPReply.isPositiveIntermediate(_replyCode)) {
- return false;
- }
-
- return FTPReply.isPositiveCompletion(acct(account));
- }
-
- /**
- * Logout of the FTP server by sending the QUIT command.
- *
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean logout() throws IOException {
- return FTPReply.isPositiveCompletion(quit());
- }
-
- /**
- * Change the current working directory of the FTP session.
- *
- * @param pathname The new current working directory.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean changeWorkingDirectory(String pathname) throws IOException {
- return FTPReply.isPositiveCompletion(cwd(pathname));
- }
-
- /**
- * Change to the parent directory of the current working directory.
- *
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean changeToParentDirectory() throws IOException {
- return FTPReply.isPositiveCompletion(cdup());
- }
-
- /**
- * Issue the FTP SMNT command.
- *
- * @param pathname The pathname to mount.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean structureMount(String pathname) throws IOException {
- return FTPReply.isPositiveCompletion(smnt(pathname));
- }
-
- /**
- * Reinitialize the FTP session. Not all FTP servers support this
- * command, which issues the FTP REIN command.
- *
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @since 3.4 (made public)
- */
- public boolean reinitialize() throws IOException {
- rein();
-
- if (FTPReply.isPositiveCompletion(_replyCode) || (FTPReply.isPositivePreliminary(_replyCode)
- && FTPReply.isPositiveCompletion(getReply()))) {
-
- __initDefaults();
-
- return true;
- }
-
- return false;
- }
-
- /**
- * Set the current data connection mode to
- *
- * N.B. currently calling any connect method will reset the mode to
- * ACTIVE_LOCAL_DATA_CONNECTION_MODE.
- */
- public void enterLocalPassiveMode() {
- __dataConnectionMode = PASSIVE_LOCAL_DATA_CONNECTION_MODE;
- // These will be set when just before a data connection is opened
- // in _openDataConnection_()
- __passiveHost = null;
- __passivePort = -1;
- }
-
- /**
- * Set the current data connection mode to
- *
- * N.B. currently calling any connect method will reset the type to
- * FTP.ASCII_FILE_TYPE.
- *
- * @param fileType The
- * N.B. currently calling any connect method will reset the type to
- * FTP.ASCII_FILE_TYPE and the formatOrByteSize to FTP.NON_PRINT_TEXT_FORMAT.
- *
- * @param fileType The
- * For example,
- *
- * Note: if you have used {@link #setRestartOffset(long)},
- * the file data will start from the selected offset.
- *
- * @param remote The name of the remote file.
- * @param local The local OutputStream to which to write the file.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws CopyStreamException If an I/O error occurs while actually
- * transferring the file. The CopyStreamException allows you to
- * determine the number of bytes transferred and the IOException
- * causing the error. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean retrieveFile(String remote, OutputStream local) throws IOException {
- return _retrieveFile(FTPCmd.RETR.getCommand(), remote, local);
- }
-
- /**
- * @param command the command to get
- * @param remote the remote file name
- * @param local the local file name
- * @return true if successful
- * @throws IOException on error
- * @since 3.1
- */
- protected boolean _retrieveFile(String command, String remote, OutputStream local)
- throws IOException {
- Socket socket = _openDataConnection_(command, remote);
-
- if (socket == null) {
- return false;
- }
-
- final InputStream input;
- if (__fileType == ASCII_FILE_TYPE) {
- input = new FromNetASCIIInputStream(getBufferedInputStream(socket.getInputStream()));
- } else {
- input = getBufferedInputStream(socket.getInputStream());
- }
-
- CSL csl = null;
- if (__controlKeepAliveTimeout > 0) {
- csl = new CSL(this, __controlKeepAliveTimeout, __controlKeepAliveReplyTimeout);
- }
-
- // Treat everything else as binary for now
- try {
- Util.copyStream(input, local, getBufferSize(), CopyStreamEvent.UNKNOWN_STREAM_SIZE,
- __mergeListeners(csl), false);
- } finally {
- Util.closeQuietly(input);
- Util.closeQuietly(socket);
- if (csl != null) {
- csl.cleanUp(); // fetch any outstanding keepalive replies
- }
- }
-
- // Get the transfer response
- boolean ok = completePendingCommand();
- return ok;
- }
-
- /**
- * Returns an InputStream from which a named file from the server
- * can be read. If the current file type is ASCII, the returned
- * InputStream will convert line separators in the file to
- * the local representation. You must close the InputStream when you
- * finish reading from it. The InputStream itself will take care of
- * closing the parent data connection socket upon being closed.
- *
- * To finalize the file transfer you must call
- * {@link #completePendingCommand completePendingCommand } and
- * check its return value to verify success.
- * If this is not done, subsequent commands may behave unexpectedly.
- *
- * Note: if you have used {@link #setRestartOffset(long)},
- * the file data will start from the selected offset.
- *
- * @param remote The name of the remote file.
- * @return An InputStream from which the remote file can be read. If
- * the data connection cannot be opened (e.g., the file does not
- * exist), null is returned (in which case you may check the reply
- * code to determine the exact reason for failure).
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public InputStream retrieveFileStream(String remote) throws IOException {
- return _retrieveFileStream(FTPCmd.RETR.getCommand(), remote);
- }
-
- /**
- * @param command the command to send
- * @param remote the remote file name
- * @return the stream from which to read the file
- * @throws IOException on error
- * @since 3.1
- */
- protected InputStream _retrieveFileStream(String command, String remote) throws IOException {
- Socket socket = _openDataConnection_(command, remote);
-
- if (socket == null) {
- return null;
- }
-
- final InputStream input;
- if (__fileType == ASCII_FILE_TYPE) {
- // We buffer ascii transfers because the buffering has to
- // be interposed between FromNetASCIIOutputSream and the underlying
- // socket input stream. We don't buffer binary transfers
- // because we don't want to impose a buffering policy on the
- // programmer if possible. Programmers can decide on their
- // own if they want to wrap the SocketInputStream we return
- // for file types other than ASCII.
- input = new FromNetASCIIInputStream(getBufferedInputStream(socket.getInputStream()));
- } else {
- input = socket.getInputStream();
- }
- return new SocketInputStream(socket, input);
- }
-
- /**
- * Stores a file on the server using the given name and taking input
- * from the given InputStream. This method does NOT close the given
- * InputStream. If the current file type is ASCII, line separators in
- * the file are transparently converted to the NETASCII format (i.e.,
- * you should not attempt to create a special InputStream to do this).
- *
- * @param remote The name to give the remote file.
- * @param local The local InputStream from which to read the file.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws CopyStreamException If an I/O error occurs while actually
- * transferring the file. The CopyStreamException allows you to
- * determine the number of bytes transferred and the IOException
- * causing the error. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean storeFile(String remote, InputStream local) throws IOException {
- return __storeFile(FTPCmd.STOR, remote, local);
- }
-
- OnFtpInputStreamListener mListener;
-
- /**
- * 含有事件的Ftp上传文件
- *
- * @throws IOException
- */
- public boolean storeFile(String remote, InputStream local, OnFtpInputStreamListener listener)
- throws IOException {
- mListener = listener;
- return __storeFile(FTPCmd.STOR, remote, local);
- }
-
- /**
- * Returns an OutputStream through which data can be written to store
- * a file on the server using the given name. If the current file type
- * is ASCII, the returned OutputStream will convert line separators in
- * the file to the NETASCII format (i.e., you should not attempt to
- * create a special OutputStream to do this). You must close the
- * OutputStream when you finish writing to it. The OutputStream itself
- * will take care of closing the parent data connection socket upon being
- * closed.
- *
- * To finalize the file transfer you must call
- * {@link #completePendingCommand completePendingCommand } and
- * check its return value to verify success.
- * If this is not done, subsequent commands may behave unexpectedly.
- *
- * @param remote The name to give the remote file.
- * @return An OutputStream through which the remote file can be written. If
- * the data connection cannot be opened (e.g., the file does not
- * exist), null is returned (in which case you may check the reply
- * code to determine the exact reason for failure).
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public OutputStream storeFileStream(String remote) throws IOException {
- return __storeFileStream(FTPCmd.STOR, remote);
- }
-
- /**
- * Appends to a file on the server with the given name, taking input
- * from the given InputStream. This method does NOT close the given
- * InputStream. If the current file type is ASCII, line separators in
- * the file are transparently converted to the NETASCII format (i.e.,
- * you should not attempt to create a special InputStream to do this).
- *
- * @param remote The name of the remote file.
- * @param local The local InputStream from which to read the data to
- * be appended to the remote file.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws CopyStreamException If an I/O error occurs while actually
- * transferring the file. The CopyStreamException allows you to
- * determine the number of bytes transferred and the IOException
- * causing the error. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean appendFile(String remote, InputStream local) throws IOException {
- return __storeFile(FTPCmd.APPE, remote, local);
- }
-
- /**
- * Returns an OutputStream through which data can be written to append
- * to a file on the server with the given name. If the current file type
- * is ASCII, the returned OutputStream will convert line separators in
- * the file to the NETASCII format (i.e., you should not attempt to
- * create a special OutputStream to do this). You must close the
- * OutputStream when you finish writing to it. The OutputStream itself
- * will take care of closing the parent data connection socket upon being
- * closed.
- *
- * To finalize the file transfer you must call
- * {@link #completePendingCommand completePendingCommand } and
- * check its return value to verify success.
- * If this is not done, subsequent commands may behave unexpectedly.
- *
- * @param remote The name of the remote file.
- * @return An OutputStream through which the remote file can be appended.
- * If the data connection cannot be opened (e.g., the file does not
- * exist), null is returned (in which case you may check the reply
- * code to determine the exact reason for failure).
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public OutputStream appendFileStream(String remote) throws IOException {
- return __storeFileStream(FTPCmd.APPE, remote);
- }
-
- /**
- * Stores a file on the server using a unique name derived from the
- * given name and taking input
- * from the given InputStream. This method does NOT close the given
- * InputStream. If the current file type is ASCII, line separators in
- * the file are transparently converted to the NETASCII format (i.e.,
- * you should not attempt to create a special InputStream to do this).
- *
- * @param remote The name on which to base the unique name given to
- * the remote file.
- * @param local The local InputStream from which to read the file.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws CopyStreamException If an I/O error occurs while actually
- * transferring the file. The CopyStreamException allows you to
- * determine the number of bytes transferred and the IOException
- * causing the error. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean storeUniqueFile(String remote, InputStream local) throws IOException {
- return __storeFile(FTPCmd.STOU, remote, local);
- }
-
- /**
- * Returns an OutputStream through which data can be written to store
- * a file on the server using a unique name derived from the given name.
- * If the current file type
- * is ASCII, the returned OutputStream will convert line separators in
- * the file to the NETASCII format (i.e., you should not attempt to
- * create a special OutputStream to do this). You must close the
- * OutputStream when you finish writing to it. The OutputStream itself
- * will take care of closing the parent data connection socket upon being
- * closed.
- *
- * To finalize the file transfer you must call
- * {@link #completePendingCommand completePendingCommand } and
- * check its return value to verify success.
- * If this is not done, subsequent commands may behave unexpectedly.
- *
- * @param remote The name on which to base the unique name given to
- * the remote file.
- * @return An OutputStream through which the remote file can be written. If
- * the data connection cannot be opened (e.g., the file does not
- * exist), null is returned (in which case you may check the reply
- * code to determine the exact reason for failure).
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public OutputStream storeUniqueFileStream(String remote) throws IOException {
- return __storeFileStream(FTPCmd.STOU, remote);
- }
-
- /**
- * Stores a file on the server using a unique name assigned by the
- * server and taking input from the given InputStream. This method does
- * NOT close the given
- * InputStream. If the current file type is ASCII, line separators in
- * the file are transparently converted to the NETASCII format (i.e.,
- * you should not attempt to create a special InputStream to do this).
- *
- * @param local The local InputStream from which to read the file.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws CopyStreamException If an I/O error occurs while actually
- * transferring the file. The CopyStreamException allows you to
- * determine the number of bytes transferred and the IOException
- * causing the error. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean storeUniqueFile(InputStream local) throws IOException {
- return __storeFile(FTPCmd.STOU, null, local);
- }
-
- /**
- * Returns an OutputStream through which data can be written to store
- * a file on the server using a unique name assigned by the server.
- * If the current file type
- * is ASCII, the returned OutputStream will convert line separators in
- * the file to the NETASCII format (i.e., you should not attempt to
- * create a special OutputStream to do this). You must close the
- * OutputStream when you finish writing to it. The OutputStream itself
- * will take care of closing the parent data connection socket upon being
- * closed.
- *
- * To finalize the file transfer you must call
- * {@link #completePendingCommand completePendingCommand } and
- * check its return value to verify success.
- * If this is not done, subsequent commands may behave unexpectedly.
- *
- * @return An OutputStream through which the remote file can be written. If
- * the data connection cannot be opened (e.g., the file does not
- * exist), null is returned (in which case you may check the reply
- * code to determine the exact reason for failure).
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public OutputStream storeUniqueFileStream() throws IOException {
- return __storeFileStream(FTPCmd.STOU, null);
- }
-
- /**
- * Reserve a number of bytes on the server for the next file transfer.
- *
- * @param bytes The number of bytes which the server should allocate.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean allocate(int bytes) throws IOException {
- return FTPReply.isPositiveCompletion(allo(bytes));
- }
-
- /**
- * Query the server for supported features. The server may reply with a list of server-supported
- * exensions.
- * For example, a typical client-server interaction might be (from RFC 2389):
- *
- * Should only be used with commands that return replies on the
- * command channel - do not use for LIST, NLST, MLSD etc.
- *
- * @param command The command to invoke
- * @param params The parameters string, may be {@code null}
- * @return True if successfully completed, false if not, in which case
- * call {@link #getReplyCode()} or {@link #getReplyString()}
- * to get the reason.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @since 3.0
- */
- public boolean doCommand(String command, String params) throws IOException {
- return FTPReply.isPositiveCompletion(sendCommand(command, params));
- }
-
- /**
- * Issue a command and wait for the reply, returning it as an array of strings.
- *
- * Should only be used with commands that return replies on the
- * command channel - do not use for LIST, NLST, MLSD etc.
- *
- * @param command The command to invoke
- * @param params The parameters string, may be {@code null}
- * @return The array of replies, or {@code null} if the command failed, in which case
- * call {@link #getReplyCode()} or {@link #getReplyString()}
- * to get the reason.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @since 3.0
- */
- public String[] doCommandAsStrings(String command, String params) throws IOException {
- boolean success = FTPReply.isPositiveCompletion(sendCommand(command, params));
- if (success) {
- return getReplyStrings();
- } else {
- return null;
- }
- }
-
- /**
- * Get file details using the MLST command
- *
- * @param pathname the file or directory to list, may be {@code null}
- * @return the file details, may be {@code null}
- * @throws IOException on error
- * @since 3.0
- */
- public FTPFile mlistFile(String pathname) throws IOException {
- boolean success = FTPReply.isPositiveCompletion(sendCommand(FTPCmd.MLST, pathname));
- if (success) {
- String reply = getReplyStrings()[1];
- /* check the response makes sense.
- * Must have space before fact(s) and between fact(s) and filename
- * Fact(s) can be absent, so at least 3 chars are needed.
- */
- if (reply.length() < 3 || reply.charAt(0) != ' ') {
- throw new MalformedServerReplyException("Invalid server reply (MLST): '" + reply + "'");
- }
- String entry = reply.substring(1); // skip leading space for parser
- return MLSxEntryParser.parseEntry(entry);
- } else {
- return null;
- }
- }
-
- /**
- * Generate a directory listing for the current directory using the MLSD command.
- *
- * @return the array of file entries
- * @throws IOException on error
- * @since 3.0
- */
- public FTPFile[] mlistDir() throws IOException {
- return mlistDir(null);
- }
-
- /**
- * Generate a directory listing using the MLSD command.
- *
- * @param pathname the directory name, may be {@code null}
- * @return the array of file entries
- * @throws IOException on error
- * @since 3.0
- */
- public FTPFile[] mlistDir(String pathname) throws IOException {
- FTPListParseEngine engine = initiateMListParsing(pathname);
- return engine.getFiles();
- }
-
- /**
- * Generate a directory listing using the MLSD command.
- *
- * @param pathname the directory name, may be {@code null}
- * @param filter the filter to apply to the responses
- * @return the array of file entries
- * @throws IOException on error
- * @since 3.0
- */
- public FTPFile[] mlistDir(String pathname, FTPFileFilter filter) throws IOException {
- FTPListParseEngine engine = initiateMListParsing(pathname);
- return engine.getFiles(filter);
- }
-
- /**
- * Restart a
- * The restart command is not sent to the server immediately.
- * It is sent when a data connection is created as part of a
- * subsequent command.
- * The restart marker is reset to zero after use.
- *
- * Note: This method should only be invoked immediately prior to
- * the transfer to which it applies.
- *
- * @param offset The offset into the remote file at which to start the
- * next file transfer. This must be a value greater than or
- * equal to zero.
- */
- public void setRestartOffset(long offset) {
- if (offset >= 0) {
- __restartOffset = offset;
- }
- }
-
- /**
- * Fetches the restart offset.
- *
- * @return offset The offset into the remote file at which to start the
- * next file transfer.
- */
- public long getRestartOffset() {
- return __restartOffset;
- }
-
- /**
- * Renames a remote file.
- *
- * @param from The name of the remote file to rename.
- * @param to The new name of the remote file.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean rename(String from, String to) throws IOException {
- if (!FTPReply.isPositiveIntermediate(rnfr(from))) {
- return false;
- }
-
- return FTPReply.isPositiveCompletion(rnto(to));
- }
-
- /**
- * Abort a transfer in progress.
- *
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean abort() throws IOException {
- return FTPReply.isPositiveCompletion(abor());
- }
-
- /**
- * Deletes a file on the FTP server.
- *
- * @param pathname The pathname of the file to be deleted.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean deleteFile(String pathname) throws IOException {
- return FTPReply.isPositiveCompletion(dele(pathname));
- }
-
- /**
- * Removes a directory on the FTP server (if empty).
- *
- * @param pathname The pathname of the directory to remove.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean removeDirectory(String pathname) throws IOException {
- return FTPReply.isPositiveCompletion(rmd(pathname));
- }
-
- /**
- * Creates a new subdirectory on the FTP server in the current directory
- * (if a relative pathname is given) or where specified (if an absolute
- * pathname is given).
- *
- * @param pathname The pathname of the directory to create.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean makeDirectory(String pathname) throws IOException {
- return FTPReply.isPositiveCompletion(mkd(pathname));
- }
-
- /**
- * Returns the pathname of the current working directory.
- *
- * @return The pathname of the current working directory. If it cannot
- * be obtained, returns null.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public String printWorkingDirectory() throws IOException {
- if (pwd() != FTPReply.PATHNAME_CREATED) {
- return null;
- }
-
- return __parsePathname(_replyLines.get(_replyLines.size() - 1));
- }
-
- /**
- * Send a site specific command.
- *
- * @param arguments The site specific command and arguments.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean sendSiteCommand(String arguments) throws IOException {
- return FTPReply.isPositiveCompletion(site(arguments));
- }
-
- /**
- * Fetches the system type from the server and returns the string.
- * This value is cached for the duration of the connection after the
- * first call to this method. In other words, only the first time
- * that you invoke this method will it issue a SYST command to the
- * FTP server. FTPClient will remember the value and return the
- * cached value until a call to disconnect.
- *
- * If the SYST command fails, and the system property
- * {@link #FTP_SYSTEM_TYPE_DEFAULT} is defined, then this is used instead.
- *
- * @return The system type obtained from the server. Never null.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server (and the default
- * system type property is not defined)
- * @since 2.2
- */
- public String getSystemType() throws IOException {
- //if (syst() == FTPReply.NAME_SYSTEM_TYPE)
- // Technically, we should expect a NAME_SYSTEM_TYPE response, but
- // in practice FTP servers deviate, so we soften the condition to
- // a positive completion.
- if (__systemName == null) {
- if (FTPReply.isPositiveCompletion(syst())) {
- // Assume that response is not empty here (cannot be null)
- __systemName = _replyLines.get(_replyLines.size() - 1).substring(4);
- } else {
- // Check if the user has provided a default for when the SYST command fails
- String systDefault = System.getProperty(FTP_SYSTEM_TYPE_DEFAULT);
- if (systDefault != null) {
- __systemName = systDefault;
- } else {
- throw new IOException("Unable to determine system type - response: " + getReplyString());
- }
- }
- }
- return __systemName;
- }
-
- /**
- * Fetches the system help information from the server and returns the
- * full string.
- *
- * @return The system help string obtained from the server. null if the
- * information could not be obtained.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public String listHelp() throws IOException {
- if (FTPReply.isPositiveCompletion(help())) {
- return getReplyString();
- }
- return null;
- }
-
- /**
- * Fetches the help information for a given command from the server and
- * returns the full string.
- *
- * @param command The command on which to ask for help.
- * @return The command help string obtained from the server. null if the
- * information could not be obtained.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public String listHelp(String command) throws IOException {
- if (FTPReply.isPositiveCompletion(help(command))) {
- return getReplyString();
- }
- return null;
- }
-
- /**
- * Sends a NOOP command to the FTP server. This is useful for preventing
- * server timeouts.
- *
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean sendNoOp() throws IOException {
- return FTPReply.isPositiveCompletion(noop());
- }
-
- /**
- * Obtain a list of filenames in a directory (or just the name of a given
- * file, which is not particularly useful). This information is obtained
- * through the NLST command. If the given pathname is a directory and
- * contains no files, a zero length array is returned only
- * if the FTP server returned a positive completion code, otherwise
- * null is returned (the FTP server returned a 550 error No files found.).
- * If the directory is not empty, an array of filenames in the directory is
- * returned. If the pathname corresponds
- * to a file, only that file will be listed. The server may or may not
- * expand glob expressions.
- *
- * @param pathname The file or directory to list.
- * Warning: the server may treat a leading '-' as an
- * option introducer. If so, try using an absolute path,
- * or prefix the path with ./ (unix style servers).
- * Some servers may support "--" as meaning end of options,
- * in which case "-- -xyz" should work.
- * @return The list of filenames contained in the given path. null if
- * the list could not be obtained. If there are no filenames in
- * the directory, a zero-length array is returned.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public String[] listNames(String pathname) throws IOException {
- Socket socket = _openDataConnection_(FTPCmd.NLST, getListArguments(pathname));
-
- if (socket == null) {
- return null;
- }
-
- BufferedReader reader =
- new BufferedReader(new InputStreamReader(socket.getInputStream(), getControlEncoding()));
-
- ArrayList
- * This information is obtained through the LIST command. The contents of
- * the returned array is determined by the
- * N.B. the LIST command does not generally return very precise timestamps.
- * For recent files, the response usually contains hours and minutes (not seconds).
- * For older files, the output may only contain a date.
- * If the server supports it, the MLSD command returns timestamps with a precision
- * of seconds, and may include milliseconds. See {@link #mlistDir()}
- *
- * @param pathname The file or directory to list. Since the server may
- * or may not expand glob expressions, using them here
- * is not recommended and may well cause this method to
- * fail.
- * Also, some servers treat a leading '-' as being an option.
- * To avoid this interpretation, use an absolute pathname
- * or prefix the pathname with ./ (unix style servers).
- * Some servers may support "--" as meaning end of options,
- * in which case "-- -xyz" should work.
- * @return The list of file information contained in the given path in
- * the format determined by the autodetection mechanism
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection
- * as a result of the client being idle or some other
- * reason causing the server to send FTP reply code 421.
- * This exception may be caught either as an IOException
- * or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply
- * from the server.
- * @throws ParserInitializationException Thrown if the
- * parserKey
- * parameter cannot be
- * resolved by the selected parser factory.
- * In the DefaultFTPEntryParserFactory, this will
- * happen when parserKey is neither
- * the fully qualified class name of a class
- * implementing the interface
- * FTPFileEntryParser
- * nor a string containing one of the recognized keys
- * mapping to such a parser or if class loader
- * security issues prevent its being loaded.
- * @see DefaultFTPFileEntryParserFactory
- * @see FTPFileEntryParserFactory
- * @see FTPFileEntryParser
- */
- public FTPFile[] listFiles(String pathname) throws IOException {
- FTPListParseEngine engine = initiateListParsing((String) null, pathname);
- return engine.getFiles();
- }
-
- /**
- * Using the default system autodetect mechanism, obtain a
- * list of file information for the current working directory.
- *
- * This information is obtained through the LIST command. The contents of
- * the returned array is determined by the
- * N.B. the LIST command does not generally return very precise timestamps.
- * For recent files, the response usually contains hours and minutes (not seconds).
- * For older files, the output may only contain a date.
- * If the server supports it, the MLSD command returns timestamps with a precision
- * of seconds, and may include milliseconds. See {@link #mlistDir()}
- *
- * @return The list of file information contained in the current directory
- * in the format determined by the autodetection mechanism.
- *
- * NOTE: This array may contain null members if any of the
- * individual file listings failed to parse. The caller should
- * check each entry for null before referencing it.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection
- * as a result of the client being idle or some other
- * reason causing the server to send FTP reply code 421.
- * This exception may be caught either as an IOException
- * or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply
- * from the server.
- * @throws ParserInitializationException Thrown if the
- * parserKey
- * parameter cannot be
- * resolved by the selected parser factory.
- * In the DefaultFTPEntryParserFactory, this will
- * happen when parserKey is neither
- * the fully qualified class name of a class
- * implementing the interface
- * FTPFileEntryParser
- * nor a string containing one of the recognized keys
- * mapping to such a parser or if class loader
- * security issues prevent its being loaded.
- * @see DefaultFTPFileEntryParserFactory
- * @see FTPFileEntryParserFactory
- * @see FTPFileEntryParser
- */
- public FTPFile[] listFiles() throws IOException {
- return listFiles((String) null);
- }
-
- /**
- * Version of {@link #listFiles(String)} which allows a filter to be provided.
- * For example:
- * This information is obtained through the LIST command. The contents of
- * the returned array is determined by the
- * N.B. the LIST command does not generally return very precise timestamps.
- * For recent files, the response usually contains hours and minutes (not seconds).
- * For older files, the output may only contain a date.
- * If the server supports it, the MLSD command returns timestamps with a precision
- * of seconds, and may include milliseconds. See {@link #mlistDir()}
- *
- * @return The list of directories contained in the current directory
- * in the format determined by the autodetection mechanism.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection
- * as a result of the client being idle or some other
- * reason causing the server to send FTP reply code 421.
- * This exception may be caught either as an IOException
- * or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply
- * from the server.
- * @throws ParserInitializationException Thrown if the
- * parserKey
- * parameter cannot be
- * resolved by the selected parser factory.
- * In the DefaultFTPEntryParserFactory, this will
- * happen when parserKey is neither
- * the fully qualified class name of a class
- * implementing the interface
- * FTPFileEntryParser
- * nor a string containing one of the recognized keys
- * mapping to such a parser or if class loader
- * security issues prevent its being loaded.
- * @see DefaultFTPFileEntryParserFactory
- * @see FTPFileEntryParserFactory
- * @see FTPFileEntryParser
- * @since 3.0
- */
- public FTPFile[] listDirectories() throws IOException {
- return listDirectories((String) null);
- }
-
- /**
- * Using the default system autodetect mechanism, obtain a
- * list of directories contained in the specified directory.
- *
- * This information is obtained through the LIST command. The contents of
- * the returned array is determined by the
- * N.B. the LIST command does not generally return very precise timestamps.
- * For recent files, the response usually contains hours and minutes (not seconds).
- * For older files, the output may only contain a date.
- * If the server supports it, the MLSD command returns timestamps with a precision
- * of seconds, and may include milliseconds. See {@link #mlistDir()}
- *
- * @param parent the starting directory
- * @return The list of directories contained in the specified directory
- * in the format determined by the autodetection mechanism.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection
- * as a result of the client being idle or some other
- * reason causing the server to send FTP reply code 421.
- * This exception may be caught either as an IOException
- * or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply
- * from the server.
- * @throws ParserInitializationException Thrown if the
- * parserKey
- * parameter cannot be
- * resolved by the selected parser factory.
- * In the DefaultFTPEntryParserFactory, this will
- * happen when parserKey is neither
- * the fully qualified class name of a class
- * implementing the interface
- * FTPFileEntryParser
- * nor a string containing one of the recognized keys
- * mapping to such a parser or if class loader
- * security issues prevent its being loaded.
- * @see DefaultFTPFileEntryParserFactory
- * @see FTPFileEntryParserFactory
- * @see FTPFileEntryParser
- * @since 3.0
- */
- public FTPFile[] listDirectories(String parent) throws IOException {
- return listFiles(parent, FTPFileFilters.DIRECTORIES);
- }
-
- /**
- * Using the default autodetect mechanism, initialize an FTPListParseEngine
- * object containing a raw file information for the current working
- * directory on the server
- * This information is obtained through the LIST command. This object
- * is then capable of being iterated to return a sequence of FTPFile
- * objects with information filled in by the
- *
- * This method differs from using the listFiles() methods in that
- * expensive FTPFile objects are not created until needed which may be
- * an advantage on large lists.
- *
- * @return A FTPListParseEngine object that holds the raw information and
- * is capable of providing parsed FTPFile objects, one for each file
- * containing information contained in the given path in the format
- * determined by the
- * The server may or may not expand glob expressions. You should avoid
- * using glob expressions because the return format for glob listings
- * differs from server to server and will likely cause this method to fail.
- *
- * This method differs from using the listFiles() methods in that
- * expensive FTPFile objects are not created until needed which may be
- * an advantage on large lists.
- *
- *
- * The server may or may not expand glob expressions. You should avoid
- * using glob expressions because the return format for glob listings
- * differs from server to server and will likely cause this method to fail.
- *
- * This method differs from using the listFiles() methods in that
- * expensive FTPFile objects are not created until needed which may be
- * an advantage on large lists.
- *
- * @param parserKey A string representing a designated code or fully-qualified
- * class name of an
- * Does not affect existing connections; must be invoked before a connection is established.
- *
- * @param autodetect If true, automatic server encoding detection will be enabled.
- */
- public void setAutodetectUTF8(boolean autodetect) {
- __autodetectEncoding = autodetect;
- }
-
- /**
- * Tells if automatic server encoding detection is enabled or disabled.
- *
- * @return true, if automatic server encoding detection is enabled.
- */
- public boolean getAutodetectUTF8() {
- return __autodetectEncoding;
- }
-
- // Method for use by unit test code only
- FTPFileEntryParser getEntryParser() {
- return __entryParser;
- }
-
- // DEPRECATED METHODS - for API compatibility only - DO NOT USE
-
- /**
- * @return the name
- * @throws IOException on error
- * @deprecated use {@link #getSystemType()} instead
- */
- @Deprecated public String getSystemName() throws IOException {
- if (__systemName == null && FTPReply.isPositiveCompletion(syst())) {
- __systemName = _replyLines.get(_replyLines.size() - 1).substring(4);
- }
- return __systemName;
- }
-}
-
-/* Emacs configuration
- * Local variables: **
- * mode: java **
- * c-basic-offset: 4 **
- * indent-tabs-mode: nil **
- * End: **
- */
-/* kate: indent-width 4; replace-tabs on; */
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClientConfig.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClientConfig.java
deleted file mode 100644
index abe8902e..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClientConfig.java
+++ /dev/null
@@ -1,713 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import aria.apache.commons.net.ftp.parser.ConfigurableFTPFileEntryParserImpl;
-import aria.apache.commons.net.ftp.parser.FTPTimestampParserImpl;
-import java.text.DateFormatSymbols;
-import java.util.Collection;
-import java.util.Locale;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.TreeMap;
-
-/**
- *
- * This class implements an alternate means of configuring the
- * {@link FTPClient FTPClient} object and
- * also subordinate objects which it uses. Any class implementing the
- * {@link Configurable Configurable }
- * interface can be configured by this object.
- *
- * In particular this class was designed primarily to support configuration
- * of FTP servers which express file timestamps in formats and languages
- * other than those for the US locale, which although it is the most common
- * is not universal. Unfortunately, nothing in the FTP spec allows this to
- * be determined in an automated way, so manual configuration such as this
- * is necessary.
- *
- * This functionality was designed to allow existing clients to work exactly
- * as before without requiring use of this component. This component should
- * only need to be explicitly invoked by the user of this package for problem
- * cases that previous implementations could not solve.
- *
- * Unpaged (whole list) access on a UNIX server that uses French month names
- * but uses the "standard"
- * Paged access on a UNIX server that uses Danish month names
- * and "European" date formatting in Denmark's time zone, when you
- * are in some other time zone.
- *
- * Unpaged (whole list) access on a VMS server that uses month names
- * in a language not {@link #getSupportedLanguageCodes() supported} by the system.
- * but uses the "standard"
- * Unpaged (whole list) access on a Windows-NT server in a different time zone.
- * (Note, since the NT Format uses numeric date formatting, language issues
- * are irrelevant here).
- *
- * getter for the {@link #setShortMonthNames(String) shortMonthNames}
- * property.
- *
- * getter for the {@link #setServerLanguageCode(String) serverLanguageCode} property.
- *
- * getter for the {@link #setLenientFutureDates(boolean) lenientFutureDates} property.
- *
- * setter for the defaultDateFormatStr property. This property
- * specifies the main date format that will be used by a parser configured
- * by this configuration to parse file timestamps. If this is not
- * specified, such a parser will use as a default value, the most commonly
- * used format which will be in as used in
- * This should be in the format described for
- *
- * setter for the recentDateFormatStr property. This property
- * specifies a secondary date format that will be used by a parser
- * configured by this configuration to parse file timestamps, typically
- * those less than a year old. If this is not specified, such a parser
- * will not attempt to parse using an alternate format.
- *
- * This is used primarily in unix-based systems.
- *
- * This should be in the format described for
- *
- * setter for the lenientFutureDates property. This boolean property
- * (default: false) only has meaning when a
- * {@link #setRecentDateFormatStr(String) recentDateFormatStr} property
- * has been set. In that case, if this property is set true, then the
- * parser, when it encounters a listing parseable with the recent date
- * format, will only consider a date to belong to the previous year if
- * it is more than one day in the future. This will allow all
- * out-of-synch situations (whether based on "slop" - i.e. servers simply
- * out of synch with one another or because of time zone differences -
- * but in the latter case it is highly recommended to use the
- * {@link #setServerTimeZoneId(String) serverTimeZoneId} property
- * instead) to resolve correctly.
- *
- * This is used primarily in unix-based systems.
- *
- * setter for the serverTimeZoneId property. This property
- * allows a time zone to be specified corresponding to that known to be
- * used by an FTP server in file listings. This might be particularly
- * useful to clients such as Ant that try to use these timestamps for
- * dependency checking.
- *
- * This should be one of the identifiers used by
- *
- * setter for the shortMonthNames property.
- * This property allows the user to specify a set of month names
- * used by the server that is different from those that may be
- * specified using the {@link #setServerLanguageCode(String) serverLanguageCode}
- * property.
- *
- * This should be a string containing twelve strings each composed of
- * three characters, delimited by pipe (|) characters. Currently,
- * only 8-bit ASCII characters are known to be supported. For example,
- * a set of month names used by a hypothetical Icelandic FTP server might
- * conceivably be specified as
- *
- * setter for the serverLanguageCode property. This property allows
- * user to specify a
- *
- * two-letter ISO-639 language code that will be used to
- * configure the set of month names used by the file timestamp parser.
- * If neither this nor the {@link #setShortMonthNames(String) shortMonthNames}
- * is specified, parsing will assume English month names, which may or
- * may not be significant, depending on whether the date format(s)
- * specified via {@link #setDefaultDateFormatStr(String) defaultDateFormatStr}
- * and/or {@link #setRecentDateFormatStr(String) recentDateFormatStr} are using
- * numeric or alphabetic month names.
- * If the code supplied is not supported here,
- * Please note that this attribute will NOT be used to determine a
- * locale-based date format for the language.
- * Experience has shown that many if not most FTP servers outside the
- * United States employ the standard
- * In this case, the FTPFile will contain only the unparsed entry {@link FTPFile#getRawListing()}
- * and {@link FTPFile#isValid()} will return {@code false}
- *
- * @param saveUnparseable if true, then create FTPFile entries if parsing fails
- * @since 3.4
- */
- public void setUnparseableEntries(boolean saveUnparseable) {
- this.saveUnparseableEntries = saveUnparseable;
- }
-
- /**
- * @return true if list parsing should return FTPFile entries even for unparseable response lines
- *
- * If true, the FTPFile for any unparseable entries will contain only the unparsed entry
- * {@link FTPFile#getRawListing()} and {@link FTPFile#isValid()} will return {@code false}
- * @since 3.4
- */
- public boolean getUnparseableEntries() {
- return this.saveUnparseableEntries;
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCmd.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCmd.java
deleted file mode 100644
index de14835b..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCmd.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-/**
- * @since 3.3
- */
-public enum FTPCmd {
- ABOR, ACCT, ALLO, APPE, CDUP, CWD, DELE, EPRT, EPSV, FEAT, HELP, LIST, MDTM, MFMT, MKD, MLSD, MLST, MODE, NLST, NOOP, PASS, PASV, PORT, PWD, QUIT, REIN, REST, RETR, RMD, RNFR, RNTO, SITE, SMNT, STAT, STOR, STOU, STRU, SYST, TYPE, USER,;
-
- // Aliases
-
- public static final FTPCmd ABORT = ABOR;
- public static final FTPCmd ACCOUNT = ACCT;
- public static final FTPCmd ALLOCATE = ALLO;
- public static final FTPCmd APPEND = APPE;
- public static final FTPCmd CHANGE_TO_PARENT_DIRECTORY = CDUP;
- public static final FTPCmd CHANGE_WORKING_DIRECTORY = CWD;
- public static final FTPCmd DATA_PORT = PORT;
- public static final FTPCmd DELETE = DELE;
- public static final FTPCmd FEATURES = FEAT;
- public static final FTPCmd FILE_STRUCTURE = STRU;
- public static final FTPCmd GET_MOD_TIME = MDTM;
- public static final FTPCmd LOGOUT = QUIT;
- public static final FTPCmd MAKE_DIRECTORY = MKD;
- public static final FTPCmd MOD_TIME = MDTM;
- public static final FTPCmd NAME_LIST = NLST;
- public static final FTPCmd PASSIVE = PASV;
- public static final FTPCmd PASSWORD = PASS;
- public static final FTPCmd PRINT_WORKING_DIRECTORY = PWD;
- public static final FTPCmd REINITIALIZE = REIN;
- public static final FTPCmd REMOVE_DIRECTORY = RMD;
- public static final FTPCmd RENAME_FROM = RNFR;
- public static final FTPCmd RENAME_TO = RNTO;
- public static final FTPCmd REPRESENTATION_TYPE = TYPE;
- public static final FTPCmd RESTART = REST;
- public static final FTPCmd RETRIEVE = RETR;
- public static final FTPCmd SET_MOD_TIME = MFMT;
- public static final FTPCmd SITE_PARAMETERS = SITE;
- public static final FTPCmd STATUS = STAT;
- public static final FTPCmd STORE = STOR;
- public static final FTPCmd STORE_UNIQUE = STOU;
- public static final FTPCmd STRUCTURE_MOUNT = SMNT;
- public static final FTPCmd SYSTEM = SYST;
- public static final FTPCmd TRANSFER_MODE = MODE;
- public static final FTPCmd USERNAME = USER;
-
- /**
- * Retrieve the FTP protocol command string corresponding to a specified
- * command code.
- *
- * @return The FTP protcol command string corresponding to a specified
- * command code.
- */
- public final String getCommand() {
- return this.name();
- }
-
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCommand.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCommand.java
deleted file mode 100644
index 3a1aef89..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPCommand.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-/**
- * FTPCommand stores a set of constants for FTP command codes. To interpret
- * the meaning of the codes, familiarity with RFC 959 is assumed.
- * The mnemonic constant names are transcriptions from the code descriptions
- * of RFC 959. For those who think in terms of the actual FTP commands,
- * a set of constants such as {@link #USER USER } are provided
- * where the constant name is the same as the FTP command.
- *
- * @deprecated use {@link FTPCmd} instead
- */
-@Deprecated public final class FTPCommand {
-
- public static final int USER = 0;
- public static final int PASS = 1;
- public static final int ACCT = 2;
- public static final int CWD = 3;
- public static final int CDUP = 4;
- public static final int SMNT = 5;
- public static final int REIN = 6;
- public static final int QUIT = 7;
- public static final int PORT = 8;
- public static final int PASV = 9;
- public static final int TYPE = 10;
- public static final int STRU = 11;
- public static final int MODE = 12;
- public static final int RETR = 13;
- public static final int STOR = 14;
- public static final int STOU = 15;
- public static final int APPE = 16;
- public static final int ALLO = 17;
- public static final int REST = 18;
- public static final int RNFR = 19;
- public static final int RNTO = 20;
- public static final int ABOR = 21;
- public static final int DELE = 22;
- public static final int RMD = 23;
- public static final int MKD = 24;
- public static final int PWD = 25;
- public static final int LIST = 26;
- public static final int NLST = 27;
- public static final int SITE = 28;
- public static final int SYST = 29;
- public static final int STAT = 30;
- public static final int HELP = 31;
- public static final int NOOP = 32;
- /** @since 2.0 */
- public static final int MDTM = 33;
- /** @since 2.2 */
- public static final int FEAT = 34;
- /** @since 2.2 */
- public static final int MFMT = 35;
- /** @since 2.2 */
- public static final int EPSV = 36;
- /** @since 2.2 */
- public static final int EPRT = 37;
-
- /**
- * Machine parseable list for a directory
- *
- * @since 3.0
- */
- public static final int MLSD = 38;
-
- /**
- * Machine parseable list for a single file
- *
- * @since 3.0
- */
- public static final int MLST = 39;
-
- // Must agree with final entry above; used to check array size
- private static final int LAST = MLST;
-
- public static final int USERNAME = USER;
- public static final int PASSWORD = PASS;
- public static final int ACCOUNT = ACCT;
- public static final int CHANGE_WORKING_DIRECTORY = CWD;
- public static final int CHANGE_TO_PARENT_DIRECTORY = CDUP;
- public static final int STRUCTURE_MOUNT = SMNT;
- public static final int REINITIALIZE = REIN;
- public static final int LOGOUT = QUIT;
- public static final int DATA_PORT = PORT;
- public static final int PASSIVE = PASV;
- public static final int REPRESENTATION_TYPE = TYPE;
- public static final int FILE_STRUCTURE = STRU;
- public static final int TRANSFER_MODE = MODE;
- public static final int RETRIEVE = RETR;
- public static final int STORE = STOR;
- public static final int STORE_UNIQUE = STOU;
- public static final int APPEND = APPE;
- public static final int ALLOCATE = ALLO;
- public static final int RESTART = REST;
- public static final int RENAME_FROM = RNFR;
- public static final int RENAME_TO = RNTO;
- public static final int ABORT = ABOR;
- public static final int DELETE = DELE;
- public static final int REMOVE_DIRECTORY = RMD;
- public static final int MAKE_DIRECTORY = MKD;
- public static final int PRINT_WORKING_DIRECTORY = PWD;
- // public static final int LIST = LIST;
- public static final int NAME_LIST = NLST;
- public static final int SITE_PARAMETERS = SITE;
- public static final int SYSTEM = SYST;
- public static final int STATUS = STAT;
- //public static final int HELP = HELP;
- //public static final int NOOP = NOOP;
-
- /** @since 2.0 */
- public static final int MOD_TIME = MDTM;
-
- /** @since 2.2 */
- public static final int FEATURES = FEAT;
- /** @since 2.2 */
- public static final int GET_MOD_TIME = MDTM;
- /** @since 2.2 */
- public static final int SET_MOD_TIME = MFMT;
-
- // Cannot be instantiated
- private FTPCommand() {
- }
-
- private static final String[] _commands = {
- "USER", "PASS", "ACCT", "CWD", "CDUP", "SMNT", "REIN", "QUIT", "PORT", "PASV", "TYPE", "STRU",
- "MODE", "RETR", "STOR", "STOU", "APPE", "ALLO", "REST", "RNFR", "RNTO", "ABOR", "DELE", "RMD",
- "MKD", "PWD", "LIST", "NLST", "SITE", "SYST", "STAT", "HELP", "NOOP", "MDTM", "FEAT", "MFMT",
- "EPSV", "EPRT", "MLSD", "MLST"
- };
-
- // default access needed for Unit test
- static void checkArray() {
- int expectedLength = LAST + 1;
- if (_commands.length != expectedLength) {
- throw new RuntimeException("Incorrect _commands array. Should have length "
- + expectedLength
- + " found "
- + _commands.length);
- }
- }
-
- /**
- * Retrieve the FTP protocol command string corresponding to a specified
- * command code.
- *
- * @param command The command code.
- * @return The FTP protcol command string corresponding to a specified
- * command code.
- */
- public static final String getCommand(int command) {
- return _commands[command];
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPConnectionClosedException.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPConnectionClosedException.java
deleted file mode 100644
index aa95277e..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPConnectionClosedException.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import java.io.IOException;
-
-/***
- * FTPConnectionClosedException is used to indicate the premature or
- * unexpected closing of an FTP connection resulting from a
- * {@link FTPReply#SERVICE_NOT_AVAILABLE FTPReply.SERVICE_NOT_AVAILABLE }
- * response (FTP reply code 421) to a
- * failed FTP command. This exception is derived from IOException and
- * therefore may be caught either as an IOException or specifically as an
- * FTPConnectionClosedException.
- *
- * @see FTP
- * @see FTPClient
- ***/
-
-public class FTPConnectionClosedException extends IOException {
-
- private static final long serialVersionUID = 3500547241659379952L;
-
- /*** Constructs a FTPConnectionClosedException with no message ***/
- public FTPConnectionClosedException() {
- super();
- }
-
- /***
- * Constructs a FTPConnectionClosedException with a specified message.
- *
- * @param message The message explaining the reason for the exception.
- ***/
- public FTPConnectionClosedException(String message) {
- super(message);
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFile.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFile.java
deleted file mode 100644
index 5edcc119..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFile.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import java.io.Serializable;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Formatter;
-import java.util.TimeZone;
-
-/***
- * The FTPFile class is used to represent information about files stored
- * on an FTP server.
- *
- * @see FTPFileEntryParser
- * @see FTPClient#listFiles
- ***/
-
-public class FTPFile implements Serializable {
- private static final long serialVersionUID = 9010790363003271996L;
-
- /** A constant indicating an FTPFile is a file. ***/
- public static final int FILE_TYPE = 0;
- /** A constant indicating an FTPFile is a directory. ***/
- public static final int DIRECTORY_TYPE = 1;
- /** A constant indicating an FTPFile is a symbolic link. ***/
- public static final int SYMBOLIC_LINK_TYPE = 2;
- /** A constant indicating an FTPFile is of unknown type. ***/
- public static final int UNKNOWN_TYPE = 3;
-
- /** A constant indicating user access permissions. ***/
- public static final int USER_ACCESS = 0;
- /** A constant indicating group access permissions. ***/
- public static final int GROUP_ACCESS = 1;
- /** A constant indicating world access permissions. ***/
- public static final int WORLD_ACCESS = 2;
-
- /** A constant indicating file/directory read permission. ***/
- public static final int READ_PERMISSION = 0;
- /** A constant indicating file/directory write permission. ***/
- public static final int WRITE_PERMISSION = 1;
- /**
- * A constant indicating file execute permission or directory listing
- * permission.
- ***/
- public static final int EXECUTE_PERMISSION = 2;
-
- private int _type, _hardLinkCount;
- private long _size;
- private String _rawListing, _user, _group, _name, _link;
- private Calendar _date;
- // If this is null, then list entry parsing failed
- private final boolean[] _permissions[]; // e.g. _permissions[USER_ACCESS][READ_PERMISSION]
-
- /*** Creates an empty FTPFile. ***/
- public FTPFile() {
- _permissions = new boolean[3][3];
- _type = UNKNOWN_TYPE;
- // init these to values that do not occur in listings
- // so can distinguish which fields are unset
- _hardLinkCount = 0; // 0 is invalid as a link count
- _size = -1; // 0 is valid, so use -1
- _user = "";
- _group = "";
- _date = null;
- _name = null;
- }
-
- /**
- * Constructor for use by {@link FTPListParseEngine} only.
- * Used to create FTPFile entries for failed parses
- *
- * @param rawListing line that could not be parsed.
- * @since 3.4
- */
- FTPFile(String rawListing) {
- _permissions = null; // flag that entry is invalid
- _rawListing = rawListing;
- _type = UNKNOWN_TYPE;
- // init these to values that do not occur in listings
- // so can distinguish which fields are unset
- _hardLinkCount = 0; // 0 is invalid as a link count
- _size = -1; // 0 is valid, so use -1
- _user = "";
- _group = "";
- _date = null;
- _name = null;
- }
-
- /***
- * Set the original FTP server raw listing from which the FTPFile was
- * created.
- *
- * @param rawListing The raw FTP server listing.
- ***/
- public void setRawListing(String rawListing) {
- _rawListing = rawListing;
- }
-
- /***
- * Get the original FTP server raw listing used to initialize the FTPFile.
- *
- * @return The original FTP server raw listing used to initialize the
- * FTPFile.
- ***/
- public String getRawListing() {
- return _rawListing;
- }
-
- /***
- * Determine if the file is a directory.
- *
- * @return True if the file is of type
- * Note: if the instance is not valid {@link #isValid()}, no useful
- * information can be returned. In this case, use {@link #getRawListing()}
- * instead.
- *
- * @return A string representation of the FTPFile information.
- * @since 3.0
- */
- public String toFormattedString() {
- return toFormattedString(null);
- }
-
- /**
- * Returns a string representation of the FTPFile information.
- * This currently mimics the Unix listing format.
- * This method allows the Calendar time zone to be overridden.
- *
- * Note: if the instance is not valid {@link #isValid()}, no useful
- * information can be returned. In this case, use {@link #getRawListing()}
- * instead.
- *
- * @param timezone the timezone to use for displaying the time stamp
- * If {@code null}, then use the Calendar entry timezone
- * @return A string representation of the FTPFile information.
- * @since 3.4
- */
- public String toFormattedString(final String timezone) {
-
- if (!isValid()) {
- return "[Invalid: could not parse file entry]";
- }
- StringBuilder sb = new StringBuilder();
- Formatter fmt = new Formatter(sb);
- sb.append(formatType());
- sb.append(permissionToString(USER_ACCESS));
- sb.append(permissionToString(GROUP_ACCESS));
- sb.append(permissionToString(WORLD_ACCESS));
- fmt.format(" %4d", Integer.valueOf(getHardLinkCount()));
- fmt.format(" %-8s %-8s", getUser(), getGroup());
- fmt.format(" %8d", Long.valueOf(getSize()));
- Calendar timestamp = getTimestamp();
- if (timestamp != null) {
- if (timezone != null) {
- TimeZone newZone = TimeZone.getTimeZone(timezone);
- if (!newZone.equals(timestamp.getTimeZone())) {
- Date original = timestamp.getTime();
- Calendar newStamp = Calendar.getInstance(newZone);
- newStamp.setTime(original);
- timestamp = newStamp;
- }
- }
- fmt.format(" %1$tY-%1$tm-%1$td", timestamp);
- // Only display time units if they are present
- if (timestamp.isSet(Calendar.HOUR_OF_DAY)) {
- fmt.format(" %1$tH", timestamp);
- if (timestamp.isSet(Calendar.MINUTE)) {
- fmt.format(":%1$tM", timestamp);
- if (timestamp.isSet(Calendar.SECOND)) {
- fmt.format(":%1$tS", timestamp);
- if (timestamp.isSet(Calendar.MILLISECOND)) {
- fmt.format(".%1$tL", timestamp);
- }
- }
- }
- fmt.format(" %1$tZ", timestamp);
- }
- }
- sb.append(' ');
- sb.append(getName());
- fmt.close();
- return sb.toString();
- }
-
- private char formatType() {
- switch (_type) {
- case FILE_TYPE:
- return '-';
- case DIRECTORY_TYPE:
- return 'd';
- case SYMBOLIC_LINK_TYPE:
- return 'l';
- default:
- return '?';
- }
- }
-
- private String permissionToString(int access) {
- StringBuilder sb = new StringBuilder();
- if (hasPermission(access, READ_PERMISSION)) {
- sb.append('r');
- } else {
- sb.append('-');
- }
- if (hasPermission(access, WRITE_PERMISSION)) {
- sb.append('w');
- } else {
- sb.append('-');
- }
- if (hasPermission(access, EXECUTE_PERMISSION)) {
- sb.append('x');
- } else {
- sb.append('-');
- }
- return sb.toString();
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParser.java
deleted file mode 100644
index 0c04b265..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileEntryParser.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * FTPFileEntryParser defines the interface for parsing a single FTP file
- * listing and converting that information into an
- * {@link FTPFile} instance.
- * Sometimes you will want to parse unusual listing formats, in which
- * case you would create your own implementation of FTPFileEntryParser and
- * if necessary, subclass FTPFile.
- *
- * Here are some examples showing how to use one of the classes that
- * implement this interface.
- *
- *
- * The first example uses the
- * This object defines a two-part parsing mechanism.
- *
- * The first part is comprised of reading the raw input into an internal
- * list of strings. Every item in this list corresponds to an actual
- * file. All extraneous matter emitted by the server will have been
- * removed by the end of this phase. This is accomplished in conjunction
- * with the FTPFileEntryParser associated with this engine, by calling
- * its methods
- * The second part is composed of the actual parsing, again in conjunction
- * with the particular parser used by this engine. This is controlled
- * by an iterator over the internal list of strings. This may be done
- * either in block mode, by calling the
- * Examples:
- *
- * Paged access:
- *
- * For unpaged access, simply use FTPClient.listFiles(). That method
- * uses this class transparently.
- *
- * @version $Id: FTPListParseEngine.java 1747119 2016-06-07 02:22:24Z ggregory $
- */
-public class FTPListParseEngine {
- private List
- * NOTE: This array may contain null members if any of the
- * individual file listings failed to parse. The caller should
- * check each entry for null before referencing it.
- */
- public FTPFile[] getNext(int quantityRequested) {
- List
- * NOTE: This array may contain null members if any of the
- * individual file listings failed to parse. The caller should
- * check each entry for null before referencing it.
- */
- public FTPFile[] getPrevious(int quantityRequested) {
- List
- * NOTE: This array may contain null members if any of the
- * individual file listings failed to parse. The caller should
- * check each entry for null before referencing it, or use the
- * a filter such as {@link FTPFileFilters#NON_NULL} which does not
- * allow null entries.
- * @throws IOException - not ever thrown, may be removed in a later release
- * @since 2.2
- */
- public FTPFile[] getFiles(FTPFileFilter filter)
- throws IOException // TODO remove; not actually thrown
- {
- List
- * TODO replace with an enum
- ***/
-
-public final class FTPReply {
-
- public static final int RESTART_MARKER = 110;
- public static final int SERVICE_NOT_READY = 120;
- public static final int DATA_CONNECTION_ALREADY_OPEN = 125;
- public static final int FILE_STATUS_OK = 150;
- public static final int COMMAND_OK = 200;
- public static final int COMMAND_IS_SUPERFLUOUS = 202;
- public static final int SYSTEM_STATUS = 211;
- public static final int DIRECTORY_STATUS = 212;
- public static final int FILE_STATUS = 213;
- public static final int HELP_MESSAGE = 214;
- public static final int NAME_SYSTEM_TYPE = 215;
- public static final int SERVICE_READY = 220;
- public static final int SERVICE_CLOSING_CONTROL_CONNECTION = 221;
- public static final int DATA_CONNECTION_OPEN = 225;
- public static final int CLOSING_DATA_CONNECTION = 226;
- public static final int ENTERING_PASSIVE_MODE = 227;
- /** @since 2.2 */
- public static final int ENTERING_EPSV_MODE = 229;
- public static final int USER_LOGGED_IN = 230;
- public static final int FILE_ACTION_OK = 250;
- public static final int PATHNAME_CREATED = 257;
- public static final int NEED_PASSWORD = 331;
- public static final int NEED_ACCOUNT = 332;
- public static final int FILE_ACTION_PENDING = 350;
- public static final int SERVICE_NOT_AVAILABLE = 421;
- public static final int CANNOT_OPEN_DATA_CONNECTION = 425;
- public static final int TRANSFER_ABORTED = 426;
- public static final int FILE_ACTION_NOT_TAKEN = 450;
- public static final int ACTION_ABORTED = 451;
- public static final int INSUFFICIENT_STORAGE = 452;
- public static final int UNRECOGNIZED_COMMAND = 500;
- public static final int SYNTAX_ERROR_IN_ARGUMENTS = 501;
- public static final int COMMAND_NOT_IMPLEMENTED = 502;
- public static final int BAD_COMMAND_SEQUENCE = 503;
- public static final int COMMAND_NOT_IMPLEMENTED_FOR_PARAMETER = 504;
- public static final int NOT_LOGGED_IN = 530;
- public static final int NEED_ACCOUNT_FOR_STORING_FILES = 532;
- public static final int FILE_UNAVAILABLE = 550;
- public static final int PAGE_TYPE_UNKNOWN = 551;
- public static final int STORAGE_ALLOCATION_EXCEEDED = 552;
- public static final int FILE_NAME_NOT_ALLOWED = 553;
-
- // FTPS Reply Codes
-
- /** @since 2.0 */
- public static final int SECURITY_DATA_EXCHANGE_COMPLETE = 234;
- /** @since 2.0 */
- public static final int SECURITY_DATA_EXCHANGE_SUCCESSFULLY = 235;
- /** @since 2.0 */
- public static final int SECURITY_MECHANISM_IS_OK = 334;
- /** @since 2.0 */
- public static final int SECURITY_DATA_IS_ACCEPTABLE = 335;
- /** @since 2.0 */
- public static final int UNAVAILABLE_RESOURCE = 431;
- /** @since 2.2 */
- public static final int BAD_TLS_NEGOTIATION_OR_DATA_ENCRYPTION_REQUIRED = 522;
- /** @since 2.0 */
- public static final int DENIED_FOR_POLICY_REASONS = 533;
- /** @since 2.0 */
- public static final int REQUEST_DENIED = 534;
- /** @since 2.0 */
- public static final int FAILED_SECURITY_CHECK = 535;
- /** @since 2.0 */
- public static final int REQUESTED_PROT_LEVEL_NOT_SUPPORTED = 536;
-
- // IPv6 error codes
- // Note this is also used as an FTPS error code reply
- /** @since 2.2 */
- public static final int EXTENDED_PORT_FAILURE = 522;
-
- // Cannot be instantiated
- private FTPReply() {
- }
-
- /***
- * Determine if a reply code is a positive preliminary response. All
- * codes beginning with a 1 are positive preliminary responses.
- * Postitive preliminary responses are used to indicate tentative success.
- * No further commands can be issued to the FTP server after a positive
- * preliminary response until a follow up response is received from the
- * server.
- *
- * @param reply The reply code to test.
- * @return True if a reply code is a postive preliminary response, false
- * if not.
- ***/
- public static boolean isPositivePreliminary(int reply) {
- return (reply >= 100 && reply < 200);
- }
-
- /***
- * Determine if a reply code is a positive completion response. All
- * codes beginning with a 2 are positive completion responses.
- * The FTP server will send a positive completion response on the final
- * successful completion of a command.
- *
- * @param reply The reply code to test.
- * @return True if a reply code is a postive completion response, false
- * if not.
- ***/
- public static boolean isPositiveCompletion(int reply) {
- return (reply >= 200 && reply < 300);
- }
-
- /***
- * Determine if a reply code is a positive intermediate response. All
- * codes beginning with a 3 are positive intermediate responses.
- * The FTP server will send a positive intermediate response on the
- * successful completion of one part of a multi-part sequence of
- * commands. For example, after a successful USER command, a positive
- * intermediate response will be sent to indicate that the server is
- * ready for the PASS command.
- *
- * @param reply The reply code to test.
- * @return True if a reply code is a postive intermediate response, false
- * if not.
- ***/
- public static boolean isPositiveIntermediate(int reply) {
- return (reply >= 300 && reply < 400);
- }
-
- /***
- * Determine if a reply code is a negative transient response. All
- * codes beginning with a 4 are negative transient responses.
- * The FTP server will send a negative transient response on the
- * failure of a command that can be reattempted with success.
- *
- * @param reply The reply code to test.
- * @return True if a reply code is a negative transient response, false
- * if not.
- ***/
- public static boolean isNegativeTransient(int reply) {
- return (reply >= 400 && reply < 500);
- }
-
- /***
- * Determine if a reply code is a negative permanent response. All
- * codes beginning with a 5 are negative permanent responses.
- * The FTP server will send a negative permanent response on the
- * failure of a command that cannot be reattempted with success.
- *
- * @param reply The reply code to test.
- * @return True if a reply code is a negative permanent response, false
- * if not.
- ***/
- public static boolean isNegativePermanent(int reply) {
- return (reply >= 500 && reply < 600);
- }
-
- /**
- * Determine if a reply code is a protected response.
- *
- * @param reply The reply code to test.
- * @return True if a reply code is a protected response, false
- * if not.
- * @since 3.0
- */
- public static boolean isProtectedReplyCode(int reply) {
- // actually, only 3 protected reply codes are
- // defined in RFC 2228: 631, 632 and 633.
- return (reply >= 600 && reply < 700);
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSClient.java
deleted file mode 100644
index 7f79e98b..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSClient.java
+++ /dev/null
@@ -1,931 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import aria.apache.commons.net.SocketClient;
-import aria.apache.commons.net.util.KeyManagerUtils;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.net.Socket;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLHandshakeException;
-import javax.net.ssl.SSLSocket;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-
-import aria.apache.commons.net.util.Base64;
-import aria.apache.commons.net.util.SSLContextUtils;
-import aria.apache.commons.net.util.SSLSocketUtils;
-import aria.apache.commons.net.util.TrustManagerUtils;
-
-/**
- * FTP over SSL processing. If desired, the JVM property -Djavax.net.debug=all can be used to
- * see wire-level SSL details.
- *
- * Warning: the hostname is not verified against the certificate by default, use
- * {@link #setHostnameVerifier(HostnameVerifier)} or {@link #setEndpointCheckingEnabled(boolean)}
- * (on Java 1.7+) to enable verification. Verification is only performed on client mode connections.
- *
- * @version $Id: FTPSClient.java 1747829 2016-06-11 00:57:57Z sebb $
- * @since 2.0
- */
-public class FTPSClient extends FTPClient {
-
- // From http://www.iana.org/assignments/port-numbers
-
- // ftps-data 989/tcp ftp protocol, data, over TLS/SSL
- // ftps-data 989/udp ftp protocol, data, over TLS/SSL
- // ftps 990/tcp ftp protocol, control, over TLS/SSL
- // ftps 990/udp ftp protocol, control, over TLS/SSL
-
- public static final int DEFAULT_FTPS_DATA_PORT = 989;
- public static final int DEFAULT_FTPS_PORT = 990;
-
- /** The value that I can set in PROT command (C = Clear, P = Protected) */
- private static final String[] PROT_COMMAND_VALUE = { "C", "E", "S", "P" };
- /** Default PROT Command */
- private static final String DEFAULT_PROT = "C";
- /** Default secure socket protocol name, i.e. TLS */
- private static final String DEFAULT_PROTOCOL = "TLS";
-
- /** The AUTH (Authentication/Security Mechanism) command. */
- private static final String CMD_AUTH = "AUTH";
- /** The ADAT (Authentication/Security Data) command. */
- private static final String CMD_ADAT = "ADAT";
- /** The PROT (Data Channel Protection Level) command. */
- private static final String CMD_PROT = "PROT";
- /** The PBSZ (Protection Buffer Size) command. */
- private static final String CMD_PBSZ = "PBSZ";
- /** The MIC (Integrity Protected Command) command. */
- private static final String CMD_MIC = "MIC";
- /** The CONF (Confidentiality Protected Command) command. */
- private static final String CMD_CONF = "CONF";
- /** The ENC (Privacy Protected Command) command. */
- private static final String CMD_ENC = "ENC";
- /** The CCC (Clear Command Channel) command. */
- private static final String CMD_CCC = "CCC";
-
- /** The security mode. (True - Implicit Mode / False - Explicit Mode) */
- private final boolean isImplicit;
- /** The secure socket protocol to be used, e.g. SSL/TLS. */
- private final String protocol;
- /** The AUTH Command value */
- private String auth = DEFAULT_PROTOCOL;
- /** The context object. */
- private SSLContext context;
- /** The socket object. */
- private Socket plainSocket;
- /** Controls whether a new SSL session may be established by this socket. Default true. */
- private boolean isCreation = true;
- /** The use client mode flag. */
- private boolean isClientMode = true;
- /** The need client auth flag. */
- private boolean isNeedClientAuth = false;
- /** The want client auth flag. */
- private boolean isWantClientAuth = false;
- /** The cipher suites */
- private String[] suites = null;
- /** The protocol versions */
- private String[] protocols = null;
-
- /**
- * The FTPS {@link TrustManager} implementation, default validate only
- * {@link TrustManagerUtils#getValidateServerCertificateTrustManager()}.
- */
- private TrustManager trustManager = TrustManagerUtils.getValidateServerCertificateTrustManager();
-
- /** The {@link KeyManager}, default null (i.e. use system default). */
- private KeyManager keyManager = null;
-
- /** The {@link HostnameVerifier} to use post-TLS, default null (i.e. no verification). */
- private HostnameVerifier hostnameVerifier = null;
-
- /** Use Java 1.7+ HTTPS Endpoint Identification Algorithim. */
- private boolean tlsEndpointChecking;
-
- /**
- * Constructor for FTPSClient, calls {@link #FTPSClient(String, boolean)}.
- *
- * Sets protocol to {@link #DEFAULT_PROTOCOL} - i.e. TLS - and security mode to explicit
- * (isImplicit = false)
- */
- public FTPSClient() {
- this(DEFAULT_PROTOCOL, false);
- }
-
- /**
- * Constructor for FTPSClient, using {@link #DEFAULT_PROTOCOL} - i.e. TLS
- * Calls {@link #FTPSClient(String, boolean)}
- *
- * @param isImplicit The security mode (Implicit/Explicit).
- */
- public FTPSClient(boolean isImplicit) {
- this(DEFAULT_PROTOCOL, isImplicit);
- }
-
- /**
- * Constructor for FTPSClient, using explict mode, calls {@link #FTPSClient(String, boolean)}.
- *
- * @param protocol the protocol to use
- */
- public FTPSClient(String protocol) {
- this(protocol, false);
- }
-
- /**
- * Constructor for FTPSClient allowing specification of protocol
- * and security mode. If isImplicit is true, the port is set to
- * {@link #DEFAULT_FTPS_PORT} i.e. 990.
- * The default TrustManager is set from {@link TrustManagerUtils#getValidateServerCertificateTrustManager()}
- *
- * @param protocol the protocol
- * @param isImplicit The security mode(Implicit/Explicit).
- */
- public FTPSClient(String protocol, boolean isImplicit) {
- super();
- this.protocol = protocol;
- this.isImplicit = isImplicit;
- if (isImplicit) {
- setDefaultPort(DEFAULT_FTPS_PORT);
- }
- }
-
- /**
- * Constructor for FTPSClient, using {@link #DEFAULT_PROTOCOL} - i.e. TLS
- * The default TrustManager is set from {@link TrustManagerUtils#getValidateServerCertificateTrustManager()}
- *
- * @param isImplicit The security mode(Implicit/Explicit).
- * @param context A pre-configured SSL Context
- */
- public FTPSClient(boolean isImplicit, SSLContext context) {
- this(DEFAULT_PROTOCOL, isImplicit);
- this.context = context;
- }
-
- /**
- * Constructor for FTPSClient, using {@link #DEFAULT_PROTOCOL} - i.e. TLS
- * and isImplicit {@code false}
- * Calls {@link #FTPSClient(boolean, SSLContext)}
- *
- * @param context A pre-configured SSL Context
- */
- public FTPSClient(SSLContext context) {
- this(false, context);
- }
-
- /**
- * Set AUTH command use value.
- * This processing is done before connected processing.
- *
- * @param auth AUTH command use value.
- */
- public void setAuthValue(String auth) {
- this.auth = auth;
- }
-
- /**
- * Return AUTH command use value.
- *
- * @return AUTH command use value.
- */
- public String getAuthValue() {
- return this.auth;
- }
-
- /**
- * Because there are so many connect() methods,
- * the _connectAction_() method is provided as a means of performing
- * some action immediately after establishing a connection,
- * rather than reimplementing all of the connect() methods.
- *
- * @throws IOException If it throw by _connectAction_.
- * @see SocketClient#_connectAction_()
- */
- @Override protected void _connectAction_() throws IOException {
- // Implicit mode.
- if (isImplicit) {
- sslNegotiation();
- }
- super._connectAction_();
- // Explicit mode.
- if (!isImplicit) {
- execAUTH();
- sslNegotiation();
- }
- }
-
- /**
- * AUTH command.
- *
- * @throws SSLException If it server reply code not equal "234" and "334".
- * @throws IOException If an I/O error occurs while either sending
- * the command.
- */
- protected void execAUTH() throws SSLException, IOException {
- int replyCode = sendCommand(CMD_AUTH, auth);
- if (FTPReply.SECURITY_MECHANISM_IS_OK == replyCode) {
- // replyCode = 334
- // I carry out an ADAT command.
- } else if (FTPReply.SECURITY_DATA_EXCHANGE_COMPLETE != replyCode) {
- throw new SSLException(getReplyString());
- }
- }
-
- /**
- * Performs a lazy init of the SSL context
- *
- * @throws IOException
- */
- private void initSslContext() throws IOException {
- if (context == null) {
- context = SSLContextUtils.createSSLContext(protocol, getKeyManager(), getTrustManager());
- }
- }
-
- /**
- * SSL/TLS negotiation. Acquires an SSL socket of a control
- * connection and carries out handshake processing.
- *
- * @throws IOException If server negotiation fails
- */
- protected void sslNegotiation() throws IOException {
- plainSocket = _socket_;
- initSslContext();
-
- SSLSocketFactory ssf = context.getSocketFactory();
- String host = (_hostname_ != null) ? _hostname_ : getRemoteAddress().getHostAddress();
- int port = _socket_.getPort();
- SSLSocket socket = (SSLSocket) ssf.createSocket(_socket_, host, port, false);
- socket.setEnableSessionCreation(isCreation);
- socket.setUseClientMode(isClientMode);
-
- // client mode
- if (isClientMode) {
- if (tlsEndpointChecking) {
- SSLSocketUtils.enableEndpointNameVerification(socket);
- }
- } else { // server mode
- socket.setNeedClientAuth(isNeedClientAuth);
- socket.setWantClientAuth(isWantClientAuth);
- }
-
- if (protocols != null) {
- socket.setEnabledProtocols(protocols);
- }
- if (suites != null) {
- socket.setEnabledCipherSuites(suites);
- }
- socket.startHandshake();
-
- // TODO the following setup appears to duplicate that in the super class methods
- _socket_ = socket;
- _controlInput_ =
- new BufferedReader(new InputStreamReader(socket.getInputStream(), getControlEncoding()));
- _controlOutput_ =
- new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), getControlEncoding()));
-
- if (isClientMode) {
- if (hostnameVerifier != null && !hostnameVerifier.verify(host, socket.getSession())) {
- throw new SSLHandshakeException("Hostname doesn't match certificate");
- }
- }
- }
-
- /**
- * Get the {@link KeyManager} instance.
- *
- * @return The {@link KeyManager} instance
- */
- private KeyManager getKeyManager() {
- return keyManager;
- }
-
- /**
- * Set a {@link KeyManager} to use
- *
- * @param keyManager The KeyManager implementation to set.
- * @see KeyManagerUtils
- */
- public void setKeyManager(KeyManager keyManager) {
- this.keyManager = keyManager;
- }
-
- /**
- * Controls whether a new SSL session may be established by this socket.
- *
- * @param isCreation The established socket flag.
- */
- public void setEnabledSessionCreation(boolean isCreation) {
- this.isCreation = isCreation;
- }
-
- /**
- * Returns true if new SSL sessions may be established by this socket.
- * When the underlying {@link Socket} instance is not SSL-enabled (i.e. an
- * instance of {@link SSLSocket} with {@link SSLSocket}{@link #getEnableSessionCreation()})
- * enabled,
- * this returns False.
- *
- * @return true - Indicates that sessions may be created;
- * this is the default.
- * false - indicates that an existing session must be resumed.
- */
- public boolean getEnableSessionCreation() {
- if (_socket_ instanceof SSLSocket) {
- return ((SSLSocket) _socket_).getEnableSessionCreation();
- }
- return false;
- }
-
- /**
- * Configures the socket to require client authentication.
- *
- * @param isNeedClientAuth The need client auth flag.
- */
- public void setNeedClientAuth(boolean isNeedClientAuth) {
- this.isNeedClientAuth = isNeedClientAuth;
- }
-
- /**
- * Returns true if the socket will require client authentication.
- * When the underlying {@link Socket} is not an {@link SSLSocket} instance, returns false.
- *
- * @return true - If the server mode socket should request
- * that the client authenticate itself.
- */
- public boolean getNeedClientAuth() {
- if (_socket_ instanceof SSLSocket) {
- return ((SSLSocket) _socket_).getNeedClientAuth();
- }
- return false;
- }
-
- /**
- * Configures the socket to request client authentication,
- * but only if such a request is appropriate to the cipher
- * suite negotiated.
- *
- * @param isWantClientAuth The want client auth flag.
- */
- public void setWantClientAuth(boolean isWantClientAuth) {
- this.isWantClientAuth = isWantClientAuth;
- }
-
- /**
- * Returns true if the socket will request client authentication.
- * When the underlying {@link Socket} is not an {@link SSLSocket} instance, returns false.
- *
- * @return true - If the server mode socket should request
- * that the client authenticate itself.
- */
- public boolean getWantClientAuth() {
- if (_socket_ instanceof SSLSocket) {
- return ((SSLSocket) _socket_).getWantClientAuth();
- }
- return false;
- }
-
- /**
- * Configures the socket to use client (or server) mode in its first
- * handshake.
- *
- * @param isClientMode The use client mode flag.
- */
- public void setUseClientMode(boolean isClientMode) {
- this.isClientMode = isClientMode;
- }
-
- /**
- * Returns true if the socket is set to use client mode
- * in its first handshake.
- * When the underlying {@link Socket} is not an {@link SSLSocket} instance, returns false.
- *
- * @return true - If the socket should start its first handshake
- * in "client" mode.
- */
- public boolean getUseClientMode() {
- if (_socket_ instanceof SSLSocket) {
- return ((SSLSocket) _socket_).getUseClientMode();
- }
- return false;
- }
-
- /**
- * Controls which particular cipher suites are enabled for use on this
- * connection. Called before server negotiation.
- *
- * @param cipherSuites The cipher suites.
- */
- public void setEnabledCipherSuites(String[] cipherSuites) {
- suites = new String[cipherSuites.length];
- System.arraycopy(cipherSuites, 0, suites, 0, cipherSuites.length);
- }
-
- /**
- * Returns the names of the cipher suites which could be enabled
- * for use on this connection.
- * When the underlying {@link Socket} is not an {@link SSLSocket} instance, returns null.
- *
- * @return An array of cipher suite names, or
- * Calls {@code setSocketFactory(null)} and {@code setServerSocketFactory(null)}
- * to reset the factories that may have been changed during the session,
- * e.g. by {@link #execPROT(String)}
- *
- * @throws IOException If an error occurs while disconnecting.
- * @since 3.0
- */
- @Override public void disconnect() throws IOException {
- super.disconnect();
- if (plainSocket != null) {
- plainSocket.close();
- }
- setSocketFactory(null);
- setServerSocketFactory(null);
- }
-
- /**
- * Send the AUTH command with the specified mechanism.
- *
- * @param mechanism The mechanism name to send with the command.
- * @return server reply.
- * @throws IOException If an I/O error occurs while sending
- * the command.
- * @since 3.0
- */
- public int execAUTH(String mechanism) throws IOException {
- return sendCommand(CMD_AUTH, mechanism);
- }
-
- /**
- * Send the ADAT command with the specified authentication data.
- *
- * @param data The data to send with the command.
- * @return server reply.
- * @throws IOException If an I/O error occurs while sending
- * the command.
- * @since 3.0
- */
- public int execADAT(byte[] data) throws IOException {
- if (data != null) {
- return sendCommand(CMD_ADAT, Base64.encodeBase64StringUnChunked(data));
- } else {
- return sendCommand(CMD_ADAT);
- }
- }
-
- /**
- * Send the CCC command to the server.
- * The CCC (Clear Command Channel) command causes the underlying {@link SSLSocket} instance to be
- * assigned
- * to a plain {@link Socket} instances
- *
- * @return server reply.
- * @throws IOException If an I/O error occurs while sending
- * the command.
- * @since 3.0
- */
- public int execCCC() throws IOException {
- int repCode = sendCommand(CMD_CCC);
- // This will be performed by sendCommand(String, String)
- // if (FTPReply.isPositiveCompletion(repCode)) {
- // _socket_.close();
- // _socket_ = plainSocket;
- // _controlInput_ = new BufferedReader(
- // new InputStreamReader(
- // _socket_.getInputStream(), getControlEncoding()));
- // _controlOutput_ = new BufferedWriter(
- // new OutputStreamWriter(
- // _socket_.getOutputStream(), getControlEncoding()));
- // }
- return repCode;
- }
-
- /**
- * Send the MIC command with the specified data.
- *
- * @param data The data to send with the command.
- * @return server reply.
- * @throws IOException If an I/O error occurs while sending
- * the command.
- * @since 3.0
- */
- public int execMIC(byte[] data) throws IOException {
- if (data != null) {
- return sendCommand(CMD_MIC, Base64.encodeBase64StringUnChunked(data));
- } else {
- return sendCommand(CMD_MIC, ""); // perhaps "=" or just sendCommand(String)?
- }
- }
-
- /**
- * Send the CONF command with the specified data.
- *
- * @param data The data to send with the command.
- * @return server reply.
- * @throws IOException If an I/O error occurs while sending
- * the command.
- * @since 3.0
- */
- public int execCONF(byte[] data) throws IOException {
- if (data != null) {
- return sendCommand(CMD_CONF, Base64.encodeBase64StringUnChunked(data));
- } else {
- return sendCommand(CMD_CONF, ""); // perhaps "=" or just sendCommand(String)?
- }
- }
-
- /**
- * Send the ENC command with the specified data.
- *
- * @param data The data to send with the command.
- * @return server reply.
- * @throws IOException If an I/O error occurs while sending
- * the command.
- * @since 3.0
- */
- public int execENC(byte[] data) throws IOException {
- if (data != null) {
- return sendCommand(CMD_ENC, Base64.encodeBase64StringUnChunked(data));
- } else {
- return sendCommand(CMD_ENC, ""); // perhaps "=" or just sendCommand(String)?
- }
- }
-
- /**
- * Parses the given ADAT response line and base64-decodes the data.
- *
- * @param reply The ADAT reply to parse.
- * @return the data in the reply, base64-decoded.
- * @since 3.0
- */
- public byte[] parseADATReply(String reply) {
- if (reply == null) {
- return null;
- } else {
- return Base64.decodeBase64(extractPrefixedData("ADAT=", reply));
- }
- }
-
- /**
- * Extract the data from a reply with a prefix, e.g. PBSZ=1234 => 1234
- *
- * @param prefix the prefix to find
- * @param reply where to find the prefix
- * @return the remainder of the string after the prefix, or null if the prefix was not present.
- */
- private String extractPrefixedData(String prefix, String reply) {
- int idx = reply.indexOf(prefix);
- if (idx == -1) {
- return null;
- }
- // N.B. Cannot use trim before substring as leading space would affect the offset.
- return reply.substring(idx + prefix.length()).trim();
- }
-
- // DEPRECATED - for API compatibility only - DO NOT USE
-
- /** @deprecated - not used - may be removed in a future release */
- @Deprecated public static String KEYSTORE_ALGORITHM;
-
- /** @deprecated - not used - may be removed in a future release */
- @Deprecated public static String TRUSTSTORE_ALGORITHM;
-
- /** @deprecated - not used - may be removed in a future release */
- @Deprecated public static String PROVIDER;
-
- /** @deprecated - not used - may be removed in a future release */
- @Deprecated public static String STORE_TYPE;
-}
-/* kate: indent-width 4; replace-tabs on; */
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSCommand.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSCommand.java
deleted file mode 100644
index 5937638b..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSCommand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-/**
- * FTPS-specific commands.
- *
- * @since 2.0
- * @deprecated 3.0 DO NOT USE
- */
-@Deprecated public final class FTPSCommand {
- public static final int AUTH = 0;
- public static final int ADAT = 1;
- public static final int PBSZ = 2;
- public static final int PROT = 3;
- public static final int CCC = 4;
-
- public static final int AUTHENTICATION_SECURITY_MECHANISM = AUTH;
- public static final int AUTHENTICATION_SECURITY_DATA = ADAT;
- public static final int PROTECTION_BUFFER_SIZE = PBSZ;
- public static final int DATA_CHANNEL_PROTECTION_LEVEL = PROT;
- public static final int CLEAR_COMMAND_CHANNEL = CCC;
-
- private static final String[] _commands = { "AUTH", "ADAT", "PBSZ", "PROT", "CCC" };
-
- /**
- * Retrieve the FTPS command string corresponding to a specified
- * command code.
- *
- * @param command The command code.
- * @return The FTPS command string corresponding to a specified
- * command code.
- */
- public static final String getCommand(int command) {
- return _commands[command];
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSServerSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSServerSocketFactory.java
deleted file mode 100644
index 168067bc..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSServerSocketFactory.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-
-import javax.net.ServerSocketFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLServerSocket;
-
-/**
- * Server socket factory for FTPS connections.
- *
- * @since 2.2
- */
-public class FTPSServerSocketFactory extends ServerSocketFactory {
-
- /** Factory for secure socket factories */
- private final SSLContext context;
-
- public FTPSServerSocketFactory(SSLContext context) {
- this.context = context;
- }
-
- // Override the default superclass method
- @Override public ServerSocket createServerSocket() throws IOException {
- return init(this.context.getServerSocketFactory().createServerSocket());
- }
-
- @Override public ServerSocket createServerSocket(int port) throws IOException {
- return init(this.context.getServerSocketFactory().createServerSocket(port));
- }
-
- @Override public ServerSocket createServerSocket(int port, int backlog) throws IOException {
- return init(this.context.getServerSocketFactory().createServerSocket(port, backlog));
- }
-
- @Override public ServerSocket createServerSocket(int port, int backlog, InetAddress ifAddress)
- throws IOException {
- return init(this.context.getServerSocketFactory().createServerSocket(port, backlog, ifAddress));
- }
-
- /**
- * Sets the socket so newly accepted connections will use SSL client mode.
- *
- * @param socket the SSLServerSocket to initialise
- * @return the socket
- * @throws ClassCastException if socket is not an instance of SSLServerSocket
- */
- public ServerSocket init(ServerSocket socket) {
- ((SSLServerSocket) socket).setUseClientMode(true);
- return socket;
- }
-}
-
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSSocketFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSSocketFactory.java
deleted file mode 100644
index 7bbf818c..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSSocketFactory.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.UnknownHostException;
-
-import javax.net.SocketFactory;
-import javax.net.ssl.SSLContext;
-
-/**
- * Implementation of org.apache.commons.net.SocketFactory
- *
- * @since 2.0
- */
-public class FTPSSocketFactory extends SocketFactory {
-
- private final SSLContext context;
-
- public FTPSSocketFactory(SSLContext context) {
- this.context = context;
- }
-
- // Override the default implementation
- @Override public Socket createSocket() throws IOException {
- return this.context.getSocketFactory().createSocket();
- }
-
- @Override public Socket createSocket(String address, int port)
- throws UnknownHostException, IOException {
- return this.context.getSocketFactory().createSocket(address, port);
- }
-
- @Override public Socket createSocket(InetAddress address, int port) throws IOException {
- return this.context.getSocketFactory().createSocket(address, port);
- }
-
- @Override
- public Socket createSocket(String address, int port, InetAddress localAddress, int localPort)
- throws UnknownHostException, IOException {
- return this.context.getSocketFactory().createSocket(address, port, localAddress, localPort);
- }
-
- @Override
- public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort)
- throws IOException {
- return this.context.getSocketFactory().createSocket(address, port, localAddress, localPort);
- }
-
- // DEPRECATED METHODS - for API compatibility only - DO NOT USE
-
- /**
- * @param port the port
- * @return the socket
- * @throws IOException on error
- * @deprecated (2.2) use {@link FTPSServerSocketFactory#createServerSocket(int) instead}
- */
- @Deprecated public java.net.ServerSocket createServerSocket(int port) throws IOException {
- return this.init(this.context.getServerSocketFactory().createServerSocket(port));
- }
-
- /**
- * @param port the port
- * @param backlog the backlog
- * @return the socket
- * @throws IOException on error
- * @deprecated (2.2) use {@link FTPSServerSocketFactory#createServerSocket(int, int) instead}
- */
- @Deprecated public java.net.ServerSocket createServerSocket(int port, int backlog)
- throws IOException {
- return this.init(this.context.getServerSocketFactory().createServerSocket(port, backlog));
- }
-
- /**
- * @param port the port
- * @param backlog the backlog
- * @param ifAddress the interface
- * @return the socket
- * @throws IOException on error
- * @deprecated (2.2) use {@link FTPSServerSocketFactory#createServerSocket(int, int, InetAddress)
- * instead}
- */
- @Deprecated public java.net.ServerSocket createServerSocket(int port, int backlog,
- InetAddress ifAddress) throws IOException {
- return this.init(
- this.context.getServerSocketFactory().createServerSocket(port, backlog, ifAddress));
- }
-
- /**
- * @param socket the socket
- * @return the socket
- * @throws IOException on error
- * @deprecated (2.2) use {@link FTPSServerSocketFactory#init(java.net.ServerSocket)}
- */
- @Deprecated public java.net.ServerSocket init(java.net.ServerSocket socket) throws IOException {
- ((javax.net.ssl.SSLServerSocket) socket).setUseClientMode(true);
- return socket;
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSTrustManager.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSTrustManager.java
deleted file mode 100644
index 0923ac02..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPSTrustManager.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import aria.apache.commons.net.util.TrustManagerUtils;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.X509TrustManager;
-
-/**
- * Do not use.
- *
- * @since 2.0
- * @deprecated 3.0 use
- * {@link TrustManagerUtils#getValidateServerCertificateTrustManager()
- * TrustManagerUtils#getValidateServerCertificateTrustManager()} instead
- */
-@Deprecated public class FTPSTrustManager implements X509TrustManager {
- private static final X509Certificate[] EMPTY_X509CERTIFICATE_ARRAY = new X509Certificate[] {};
-
- /**
- * No-op
- */
- @Override public void checkClientTrusted(X509Certificate[] certificates, String authType) {
- return;
- }
-
- @Override public void checkServerTrusted(X509Certificate[] certificates, String authType)
- throws CertificateException {
- for (X509Certificate certificate : certificates) {
- certificate.checkValidity();
- }
- }
-
- @Override public X509Certificate[] getAcceptedIssuers() {
- return EMPTY_X509CERTIFICATE_ARRAY;
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/OnFtpInputStreamListener.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/OnFtpInputStreamListener.java
deleted file mode 100644
index f7adaf6d..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/OnFtpInputStreamListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
- *
- * Licensed 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 aria.apache.commons.net.ftp;
-
-import aria.apache.commons.net.io.CopyStreamListener;
-
-/**
- * Created by AriaL on 2017/9/26.
- * ftp 上传文件流事件监听
- */
-public interface OnFtpInputStreamListener {
- /**
- * {@link CopyStreamListener#bytesTransferred(long, int, long)}
- *
- * @param totalBytesTransferred 已经上传的文件长度
- * @param bytesTransferred 上传byte长度
- */
- void onFtpInputStream(FTPClient client, long totalBytesTransferred, int bytesTransferred,
- long streamSize);
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/package-info.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/package-info.java
deleted file mode 100644
index f7df7cf0..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * FTP and FTPS support classes
- */
-package aria.apache.commons.net.ftp;
\ No newline at end of file
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/CompositeFileEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/CompositeFileEntryParser.java
deleted file mode 100644
index 638f67fb..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/CompositeFileEntryParser.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.FTPFile;
-import aria.apache.commons.net.ftp.FTPFileEntryParser;
-import aria.apache.commons.net.ftp.FTPFileEntryParserImpl;
-
-/**
- * This implementation allows to pack some FileEntryParsers together
- * and handle the case where to returned dirstyle isnt clearly defined.
- * The matching parser will be cached.
- * If the cached parser wont match due to the server changed the dirstyle,
- * a new matching parser will be searched.
- */
-public class CompositeFileEntryParser extends FTPFileEntryParserImpl {
- private final FTPFileEntryParser[] ftpFileEntryParsers;
- private FTPFileEntryParser cachedFtpFileEntryParser;
-
- public CompositeFileEntryParser(FTPFileEntryParser[] ftpFileEntryParsers) {
- super();
-
- this.cachedFtpFileEntryParser = null;
- this.ftpFileEntryParsers = ftpFileEntryParsers;
- }
-
- @Override public FTPFile parseFTPEntry(String listEntry) {
- if (cachedFtpFileEntryParser != null) {
- FTPFile matched = cachedFtpFileEntryParser.parseFTPEntry(listEntry);
- if (matched != null) {
- return matched;
- }
- } else {
- for (FTPFileEntryParser ftpFileEntryParser : ftpFileEntryParsers) {
- FTPFile matched = ftpFileEntryParser.parseFTPEntry(listEntry);
- if (matched != null) {
- cachedFtpFileEntryParser = ftpFileEntryParser;
- return matched;
- }
- }
- }
- return null;
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java
deleted file mode 100644
index 1d8988b6..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ConfigurableFTPFileEntryParserImpl.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.Configurable;
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import java.text.ParseException;
-import java.util.Calendar;
-
-/**
- *
- * This abstract class implements the common timestamp parsing
- * algorithm for all the concrete parsers. Classes derived from
- * this one will parse file listings via a supplied regular expression
- * that pulls out the date portion as a separate string which is
- * passed to the underlying {@link FTPTimestampParser delegate} to
- * handle parsing of the file timestamp.
- *
- * This class also implements the {@link Configurable Configurable}
- * interface to allow the parser to be configured from the outside.
- *
- * @since 1.4
- */
-public abstract class ConfigurableFTPFileEntryParserImpl extends RegexFTPFileEntryParserImpl
- implements Configurable {
-
- private final FTPTimestampParser timestampParser;
-
- /**
- * constructor for this abstract class.
- *
- * @param regex Regular expression used main parsing of the
- * file listing.
- */
- public ConfigurableFTPFileEntryParserImpl(String regex) {
- super(regex);
- this.timestampParser = new FTPTimestampParserImpl();
- }
-
- /**
- * constructor for this abstract class.
- *
- * @param regex Regular expression used main parsing of the
- * file listing.
- * @param flags the flags to apply, see
- * {@link java.util.regex.Pattern#compile(String, int) Pattern#compile(String, int)}. Use 0 for
- * none.
- * @since 3.4
- */
- public ConfigurableFTPFileEntryParserImpl(String regex, int flags) {
- super(regex, flags);
- this.timestampParser = new FTPTimestampParserImpl();
- }
-
- /**
- * This method is called by the concrete parsers to delegate
- * timestamp parsing to the timestamp parser.
- *
- * @param timestampStr the timestamp string pulled from the
- * file listing by the regular expression parser, to be submitted
- * to the
- * If Implementation extracts a key from the supplied
- * {@link FTPClientConfig FTPClientConfig}
- * parameter and creates an object implementing the
- * interface FTPFileEntryParser and uses the supplied configuration
- * to configure it.
- *
- * Note that this method will generally not be called in scenarios
- * that call for autodetection of parser type but rather, for situations
- * where the user knows that the server uses a non-default configuration
- * and knows what that configuration is.
- *
- * Note: EnterpriseUnixFTPEntryParser can only be instantiated through the
- * DefaultFTPParserFactory by classname. It will not be chosen
- * by the autodetection scheme.
- *
- *
- * @version $Id: EnterpriseUnixFTPEntryParser.java 1741829 2016-05-01 00:24:44Z sebb $
- * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions)
- * @see DefaultFTPFileEntryParserFactory
- */
-public class EnterpriseUnixFTPEntryParser extends RegexFTPFileEntryParserImpl {
-
- /**
- * months abbreviations looked for by this parser. Also used
- * to determine which month has been matched by the parser.
- */
- private static final String MONTHS = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
-
- /**
- * this is the regular expression used by this parser.
- */
- private static final String REGEX =
- "(([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])"
- + "([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z]))"
- + "(\\S*)\\s*"
- // 12
- + "(\\S+)\\s*"
- // 13
- + "(\\S*)\\s*"
- // 14 user
- + "(\\d*)\\s*"
- // 15 group
- + "(\\d*)\\s*"
- // 16 filesize
- + MONTHS
- // 17 month
- + "\\s*"
- // TODO should the space be optional?
- // TODO \\d* should be \\d? surely ? Otherwise 01111 is allowed
- + "((?:[012]\\d*)|(?:3[01]))\\s*"
- // 18 date [012]\d* or 3[01]
- + "((\\d\\d\\d\\d)|((?:[01]\\d)|(?:2[0123])):([012345]\\d))\\s"
- // 20 \d\d\d\d = year OR
- // 21 [01]\d or 2[0123] hour + ':'
- // 22 [012345]\d = minute
- + "(\\S*)(\\s*.*)"; // 23 name
-
- /**
- * The sole constructor for a EnterpriseUnixFTPEntryParser object.
- */
- public EnterpriseUnixFTPEntryParser() {
- super(REGEX);
- }
-
- /**
- * Parses a line of a unix FTP server file listing and converts it into a
- * usable format in the form of an
- * Implementation should be a method that extracts
- * a key from the supplied {@link FTPClientConfig FTPClientConfig}
- * parameter and creates an object implementing the
- * interface FTPFileEntryParser and uses the supplied configuration
- * to configure it.
- *
- * Note that this method will generally not be called in scenarios
- * that call for autodetection of parser type but rather, for situations
- * where the user knows that the server uses a non-default configuration
- * and knows what that configuration is.
- *
- * Set up the {@link FTPClientConfig#setDefaultDateFormatStr(String) defaultDateFormat}
- * and optionally the {@link FTPClientConfig#setRecentDateFormatStr(String) recentDateFormat}
- * to values supplied in the config based on month names configured as follows:
- *
- * Finally if a {@link FTPClientConfig#setServerTimeZoneId(String)
- * serverTimeZoneId}
- * has been supplied via the config, set that into all date formats that have
- * been configured.
- *
- * Format is as follows:
- *
- * Netware file permissions are in the following format: RWCEAFMS, and are explained as follows:
- *
- * For now end users may specify this format only via
- *
- * Note: VMSFTPEntryParser can only be instantiated through the
- * DefaultFTPParserFactory by classname. It will not be chosen
- * by the autodetection scheme.
- *
- *
- *
- * @version $Id: VMSFTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $
- * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions)
- * @see DefaultFTPFileEntryParserFactory
- */
-public class VMSFTPEntryParser extends ConfigurableFTPFileEntryParserImpl {
-
- private static final String DEFAULT_DATE_FORMAT = "d-MMM-yyyy HH:mm:ss"; //9-NOV-2001 12:30:24
-
- /**
- * this is the regular expression used by this parser.
- */
- private static final String REGEX =
- "(.*?;[0-9]+)\\s*" //1 file and version
- + "(\\d+)/\\d+\\s*" //2 size/allocated
- + "(\\S+)\\s+(\\S+)\\s+" //3+4 date and time
- + "\\[(([0-9$A-Za-z_]+)|([0-9$A-Za-z_]+),([0-9$a-zA-Z_]+))\\]?\\s*" //5(6,7,8) owner
- + "\\([a-zA-Z]*,([a-zA-Z]*),([a-zA-Z]*),([a-zA-Z]*)\\)";
- //9,10,11 Permissions (O,G,W)
- // TODO - perhaps restrict permissions to [RWED]* ?
-
- /**
- * Constructor for a VMSFTPEntryParser object.
- *
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- *
- *
- * @version $Id: VMSVersioningFTPEntryParser.java 1747119 2016-06-07 02:22:24Z ggregory $
- * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions)
- */
-public class VMSVersioningFTPEntryParser extends VMSFTPEntryParser {
-
- private final Pattern _preparse_pattern_;
- private static final String PRE_PARSE_REGEX = "(.*?);([0-9]+)\\s*.*";
-
- /**
- * Constructor for a VMSFTPEntryParser object.
- *
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- *
- * This class handles stripping of the duplicate period at the beginning
- * of lines starting with a period, and ensures you cannot read past the end of the message.
- *
- * Note: versions since 3.0 extend BufferedReader rather than Reader,
- * and no longer change the CRLF into the local EOL. Also only DOT CR LF
- * acts as EOF.
- *
- * @version $Id: DotTerminatedMessageReader.java 1747119 2016-06-07 02:22:24Z ggregory $
- */
-public final class DotTerminatedMessageReader extends BufferedReader {
- private static final char LF = '\n';
- private static final char CR = '\r';
- private static final int DOT = '.';
-
- private boolean atBeginning;
- private boolean eof;
- private boolean seenCR; // was last character CR?
-
- /**
- * Creates a DotTerminatedMessageReader that wraps an existing Reader
- * input source.
- *
- * @param reader The Reader input source containing the message.
- */
- public DotTerminatedMessageReader(Reader reader) {
- super(reader);
- // Assumes input is at start of message
- atBeginning = true;
- eof = false;
- }
-
- /**
- * Reads and returns the next character in the message. If the end of the
- * message has been reached, returns -1. Note that a call to this method
- * may result in multiple reads from the underlying input stream to decode
- * the message properly (removing doubled dots and so on). All of
- * this is transparent to the programmer and is only mentioned for
- * completeness.
- *
- * @return The next character in the message. Returns -1 if the end of the
- * message has been reached.
- * @throws IOException If an error occurs while reading the underlying
- * stream.
- */
- @Override public int read() throws IOException {
- synchronized (lock) {
- if (eof) {
- return -1; // Don't allow read past EOF
- }
- int chint = super.read();
- if (chint == -1) { // True EOF
- eof = true;
- return -1;
- }
- if (atBeginning) {
- atBeginning = false;
- if (chint == DOT) { // Have DOT
- mark(2); // need to check for CR LF or DOT
- chint = super.read();
- if (chint == -1) { // Should not happen
- // new Throwable("Trailing DOT").printStackTrace();
- eof = true;
- return DOT; // return the trailing DOT
- }
- if (chint == DOT) { // Have DOT DOT
- // no need to reset as we want to lose the first DOT
- return chint; // i.e. DOT
- }
- if (chint == CR) { // Have DOT CR
- chint = super.read();
- if (chint == -1) { // Still only DOT CR - should not happen
- //new Throwable("Trailing DOT CR").printStackTrace();
- reset(); // So CR is picked up next time
- return DOT; // return the trailing DOT
- }
- if (chint == LF) { // DOT CR LF
- atBeginning = true;
- eof = true;
- // Do we need to clear the mark somehow?
- return -1;
- }
- }
- // Should not happen - lone DOT at beginning
- //new Throwable("Lone DOT followed by "+(char)chint).printStackTrace();
- reset();
- return DOT;
- } // have DOT
- } // atBeginning
-
- // Handle CRLF in normal flow
- if (seenCR) {
- seenCR = false;
- if (chint == LF) {
- atBeginning = true;
- }
- }
- if (chint == CR) {
- seenCR = true;
- }
- return chint;
- }
- }
-
- /**
- * Reads the next characters from the message into an array and
- * returns the number of characters read. Returns -1 if the end of the
- * message has been reached.
- *
- * @param buffer The character array in which to store the characters.
- * @return The number of characters read. Returns -1 if the
- * end of the message has been reached.
- * @throws IOException If an error occurs in reading the underlying
- * stream.
- */
- @Override public int read(char[] buffer) throws IOException {
- return read(buffer, 0, buffer.length);
- }
-
- /**
- * Reads the next characters from the message into an array and
- * returns the number of characters read. Returns -1 if the end of the
- * message has been reached. The characters are stored in the array
- * starting from the given offset and up to the length specified.
- *
- * @param buffer The character array in which to store the characters.
- * @param offset The offset into the array at which to start storing
- * characters.
- * @param length The number of characters to read.
- * @return The number of characters read. Returns -1 if the
- * end of the message has been reached.
- * @throws IOException If an error occurs in reading the underlying
- * stream.
- */
- @Override public int read(char[] buffer, int offset, int length) throws IOException {
- if (length < 1) {
- return 0;
- }
- int ch;
- synchronized (lock) {
- if ((ch = read()) == -1) {
- return -1;
- }
-
- int off = offset;
-
- do {
- buffer[offset++] = (char) ch;
- } while (--length > 0 && (ch = read()) != -1);
-
- return (offset - off);
- }
- }
-
- /**
- * Closes the message for reading. This doesn't actually close the
- * underlying stream. The underlying stream may still be used for
- * communicating with the server and therefore is not closed.
- *
- * If the end of the message has not yet been reached, this method
- * will read the remainder of the message until it reaches the end,
- * so that the underlying stream may continue to be used properly
- * for communicating with the server. If you do not fully read
- * a message, you MUST close it, otherwise your program will likely
- * hang or behave improperly.
- *
- * @throws IOException If an error occurs while reading the
- * underlying stream.
- */
- @Override public void close() throws IOException {
- synchronized (lock) {
- if (!eof) {
- while (read() != -1) {
- // read to EOF
- }
- }
- eof = true;
- atBeginning = false;
- }
- }
-
- /**
- * Read a line of text.
- * A line is considered to be terminated by carriage return followed immediately by a linefeed.
- * This contrasts with BufferedReader which also allows other combinations.
- *
- * @since 3.0
- */
- @Override public String readLine() throws IOException {
- StringBuilder sb = new StringBuilder();
- int intch;
- synchronized (lock) { // make thread-safe (hopefully!)
- while ((intch = read()) != -1) {
- if (intch == LF && atBeginning) {
- return sb.substring(0, sb.length() - 1);
- }
- sb.append((char) intch);
- }
- }
- String string = sb.toString();
- if (string.length() == 0) { // immediate EOF
- return null;
- }
- // Should not happen - EOF without CRLF
- //new Throwable(string).printStackTrace();
- return string;
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageWriter.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageWriter.java
deleted file mode 100644
index 637399bd..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageWriter.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/***
- * DotTerminatedMessageWriter is a class used to write messages to a
- * server that are terminated by a single dot followed by a
- * <CR><LF>
- * sequence and with double dots appearing at the begining of lines which
- * do not signal end of message yet start with a dot. Various Internet
- * protocols such as NNTP and POP3 produce messages of this type.
- *
- * This class handles the doubling of line-starting periods,
- * converts single linefeeds to NETASCII newlines, and on closing
- * will send the final message terminator dot and NETASCII newline
- * sequence.
- *
- *
- ***/
-
-public final class DotTerminatedMessageWriter extends Writer {
- private static final int __NOTHING_SPECIAL_STATE = 0;
- private static final int __LAST_WAS_CR_STATE = 1;
- private static final int __LAST_WAS_NL_STATE = 2;
-
- private int __state;
- private Writer __output;
-
- /***
- * Creates a DotTerminatedMessageWriter that wraps an existing Writer
- * output destination.
- *
- * @param output The Writer output destination to write the message.
- ***/
- public DotTerminatedMessageWriter(Writer output) {
- super(output);
- __output = output;
- __state = __NOTHING_SPECIAL_STATE;
- }
-
- /***
- * Writes a character to the output. Note that a call to this method
- * may result in multiple writes to the underling Writer in order to
- * convert naked linefeeds to NETASCII line separators and to double
- * line-leading periods. This is transparent to the programmer and
- * is only mentioned for completeness.
- *
- * @param ch The character to write.
- * @throws IOException If an error occurs while writing to the
- * underlying output.
- ***/
- @Override public void write(int ch) throws IOException {
- synchronized (lock) {
- switch (ch) {
- case '\r':
- __state = __LAST_WAS_CR_STATE;
- __output.write('\r');
- return;
- case '\n':
- if (__state != __LAST_WAS_CR_STATE) {
- __output.write('\r');
- }
- __output.write('\n');
- __state = __LAST_WAS_NL_STATE;
- return;
- case '.':
- // Double the dot at the beginning of a line
- if (__state == __LAST_WAS_NL_STATE) {
- __output.write('.');
- }
- //$FALL-THROUGH$
- default:
- __state = __NOTHING_SPECIAL_STATE;
- __output.write(ch);
- return;
- }
- }
- }
-
- /***
- * Writes a number of characters from a character array to the output
- * starting from a given offset.
- *
- * @param buffer The character array to write.
- * @param offset The offset into the array at which to start copying data.
- * @param length The number of characters to write.
- * @throws IOException If an error occurs while writing to the underlying
- * output.
- ***/
- @Override public void write(char[] buffer, int offset, int length) throws IOException {
- synchronized (lock) {
- while (length-- > 0) {
- write(buffer[offset++]);
- }
- }
- }
-
- /***
- * Writes a character array to the output.
- *
- * @param buffer The character array to write.
- * @throws IOException If an error occurs while writing to the underlying
- * output.
- ***/
- @Override public void write(char[] buffer) throws IOException {
- write(buffer, 0, buffer.length);
- }
-
- /***
- * Writes a String to the output.
- *
- * @param string The String to write.
- * @throws IOException If an error occurs while writing to the underlying
- * output.
- ***/
- @Override public void write(String string) throws IOException {
- write(string.toCharArray());
- }
-
- /***
- * Writes part of a String to the output starting from a given offset.
- *
- * @param string The String to write.
- * @param offset The offset into the String at which to start copying data.
- * @param length The number of characters to write.
- * @throws IOException If an error occurs while writing to the underlying
- * output.
- ***/
- @Override public void write(String string, int offset, int length) throws IOException {
- write(string.toCharArray(), offset, length);
- }
-
- /***
- * Flushes the underlying output, writing all buffered output.
- *
- * @throws IOException If an error occurs while writing to the underlying
- * output.
- ***/
- @Override public void flush() throws IOException {
- synchronized (lock) {
- __output.flush();
- }
- }
-
- /***
- * Flushes the underlying output, writing all buffered output, but doesn't
- * actually close the underlying stream. The underlying stream may still
- * be used for communicating with the server and therefore is not closed.
- *
- * @throws IOException If an error occurs while writing to the underlying
- * output or closing the Writer.
- ***/
- @Override public void close() throws IOException {
- synchronized (lock) {
- if (__output == null) {
- return;
- }
-
- if (__state == __LAST_WAS_CR_STATE) {
- __output.write('\n');
- } else if (__state != __LAST_WAS_NL_STATE) {
- __output.write("\r\n");
- }
-
- __output.write(".\r\n");
-
- __output.flush();
- __output = null;
- }
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIInputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIInputStream.java
deleted file mode 100644
index f8aeeded..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIInputStream.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-import java.io.UnsupportedEncodingException;
-
-/***
- * This class wraps an input stream, replacing all occurrences
- * of <CR><LF> (carriage return followed by a linefeed),
- * which is the NETASCII standard for representing a newline, with the
- * local line separator representation. You would use this class to
- * implement ASCII file transfers requiring conversion from NETASCII.
- *
- *
- ***/
-
-public final class FromNetASCIIInputStream extends PushbackInputStream {
- static final boolean _noConversionRequired;
- static final String _lineSeparator;
- static final byte[] _lineSeparatorBytes;
-
- static {
- _lineSeparator = System.getProperty("line.separator");
- _noConversionRequired = _lineSeparator.equals("\r\n");
- try {
- _lineSeparatorBytes = _lineSeparator.getBytes("US-ASCII");
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("Broken JVM - cannot find US-ASCII charset!", e);
- }
- }
-
- private int __length = 0;
-
- /***
- * Returns true if the NetASCII line separator differs from the system
- * line separator, false if they are the same. This method is useful
- * to determine whether or not you need to instantiate a
- * FromNetASCIIInputStream object.
- *
- * @return True if the NETASCII line separator differs from the local
- * system line separator, false if they are the same.
- ***/
- public static final boolean isConversionRequired() {
- return !_noConversionRequired;
- }
-
- /***
- * Creates a FromNetASCIIInputStream instance that wraps an existing
- * InputStream.
- * @param input the stream to wrap
- ***/
- public FromNetASCIIInputStream(InputStream input) {
- super(input, _lineSeparatorBytes.length + 1);
- }
-
- private int __read() throws IOException {
- int ch;
-
- ch = super.read();
-
- if (ch == '\r') {
- ch = super.read();
- if (ch == '\n') {
- unread(_lineSeparatorBytes);
- ch = super.read();
- // This is a kluge for read(byte[], ...) to read the right amount
- --__length;
- } else {
- if (ch != -1) {
- unread(ch);
- }
- return '\r';
- }
- }
-
- return ch;
- }
-
- /***
- * Reads and returns the next byte in the stream. If the end of the
- * message has been reached, returns -1. Note that a call to this method
- * may result in multiple reads from the underlying input stream in order
- * to convert NETASCII line separators to the local line separator format.
- * This is transparent to the programmer and is only mentioned for
- * completeness.
- *
- * @return The next character in the stream. Returns -1 if the end of the
- * stream has been reached.
- * @throws IOException If an error occurs while reading the underlying
- * stream.
- ***/
- @Override public int read() throws IOException {
- if (_noConversionRequired) {
- return super.read();
- }
-
- return __read();
- }
-
- /***
- * Reads the next number of bytes from the stream into an array and
- * returns the number of bytes read. Returns -1 if the end of the
- * stream has been reached.
- *
- * @param buffer The byte array in which to store the data.
- * @return The number of bytes read. Returns -1 if the
- * end of the message has been reached.
- * @throws IOException If an error occurs in reading the underlying
- * stream.
- ***/
- @Override public int read(byte buffer[]) throws IOException {
- return read(buffer, 0, buffer.length);
- }
-
- /***
- * Reads the next number of bytes from the stream into an array and returns
- * the number of bytes read. Returns -1 if the end of the
- * message has been reached. The characters are stored in the array
- * starting from the given offset and up to the length specified.
- *
- * @param buffer The byte array in which to store the data.
- * @param offset The offset into the array at which to start storing data.
- * @param length The number of bytes to read.
- * @return The number of bytes read. Returns -1 if the
- * end of the stream has been reached.
- * @throws IOException If an error occurs while reading the underlying
- * stream.
- ***/
- @Override public int read(byte buffer[], int offset, int length) throws IOException {
- if (_noConversionRequired) {
- return super.read(buffer, offset, length);
- }
-
- if (length < 1) {
- return 0;
- }
-
- int ch, off;
-
- ch = available();
-
- __length = (length > ch ? ch : length);
-
- // If nothing is available, block to read only one character
- if (__length < 1) {
- __length = 1;
- }
-
- if ((ch = __read()) == -1) {
- return -1;
- }
-
- off = offset;
-
- do {
- buffer[offset++] = (byte) ch;
- } while (--__length > 0 && (ch = __read()) != -1);
-
- return (offset - off);
- }
-
- // PushbackInputStream in JDK 1.1.3 returns the wrong thing
- // TODO - can we delete this override now?
-
- /***
- * Returns the number of bytes that can be read without blocking EXCEPT
- * when newline conversions have to be made somewhere within the
- * available block of bytes. In other words, you really should not
- * rely on the value returned by this method if you are trying to avoid
- * blocking.
- ***/
- @Override public int available() throws IOException {
- if (in == null) {
- throw new IOException("Stream closed");
- }
- return (buf.length - pos) + in.available();
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIOutputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIOutputStream.java
deleted file mode 100644
index 85e6112d..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/FromNetASCIIOutputStream.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-/***
- * This class wraps an output stream, replacing all occurrences
- * of <CR><LF> (carriage return followed by a linefeed),
- * which is the NETASCII standard for representing a newline, with the
- * local line separator representation. You would use this class to
- * implement ASCII file transfers requiring conversion from NETASCII.
- *
- * Because of the translation process, a call to
- * The contents of the InputStream are
- * read until the end of the stream is reached, but neither the
- * source nor the destination are closed. You must do this yourself
- * outside of the method call. The number of bytes read/written is
- * returned.
- *
- * @param source The source InputStream.
- * @param dest The destination OutputStream.
- * @param bufferSize The number of bytes to buffer during the copy.
- * A zero or negative value means to use {@link #DEFAULT_COPY_BUFFER_SIZE}.
- * @param streamSize The number of bytes in the stream being copied.
- * Should be set to CopyStreamEvent.UNKNOWN_STREAM_SIZE if unknown.
- * Not currently used (though it is passed to {@link CopyStreamListener#bytesTransferred(long, int, long)}
- * @param listener The CopyStreamListener to notify of progress. If
- * this parameter is null, notification is not attempted.
- * @param flush Whether to flush the output stream after every
- * write. This is necessary for interactive sessions that rely on
- * buffered streams. If you don't flush, the data will stay in
- * the stream buffer.
- * @return number of bytes read/written
- * @throws CopyStreamException If an error occurs while reading from the
- * source or writing to the destination. The CopyStreamException
- * will contain the number of bytes confirmed to have been
- * transferred before an
- * IOException occurred, and it will also contain the IOException
- * that caused the error. These values can be retrieved with
- * the CopyStreamException getTotalBytesTransferred() and
- * getIOException() methods.
- ***/
- public static final long copyStream(InputStream source, OutputStream dest, int bufferSize,
- long streamSize, CopyStreamListener listener, boolean flush) throws CopyStreamException {
- int numBytes;
- long total = 0;
- byte[] buffer = new byte[bufferSize > 0 ? bufferSize : DEFAULT_COPY_BUFFER_SIZE];
-
- try {
- while (!Thread.currentThread().isInterrupted() && (numBytes = source.read(buffer)) != -1) {
- // Technically, some read(byte[]) methods may return 0 and we cannot
- // accept that as an indication of EOF.
-
- if (numBytes == 0) {
- int singleByte = source.read();
- if (singleByte < 0) {
- break;
- }
- dest.write(singleByte);
- if (flush) {
- dest.flush();
- }
- ++total;
- if (listener != null) {
- listener.bytesTransferred(total, 1, streamSize);
- }
- continue;
- }
-
- dest.write(buffer, 0, numBytes);
- if (flush) {
- dest.flush();
- }
- total += numBytes;
- if (listener != null) {
- listener.bytesTransferred(total, numBytes, streamSize);
- }
- }
- } catch (IOException e) {
- throw new CopyStreamException("IOException caught while copying.", total, e);
- }
-
- return total;
- }
-
-
- /***
- * Copies the contents of an InputStream to an OutputStream using a
- * copy buffer of a given size and notifies the provided
- * CopyStreamListener of the progress of the copy operation by calling
- * its bytesTransferred(long, int) method after each write to the
- * destination. If you wish to notify more than one listener you should
- * use a CopyStreamAdapter as the listener and register the additional
- * listeners with the CopyStreamAdapter.
- *
- * The contents of the InputStream are
- * read until the end of the stream is reached, but neither the
- * source nor the destination are closed. You must do this yourself
- * outside of the method call. The number of bytes read/written is
- * returned.
- *
- * @param source The source InputStream.
- * @param dest The destination OutputStream.
- * @param bufferSize The number of bytes to buffer during the copy.
- * A zero or negative value means to use {@link #DEFAULT_COPY_BUFFER_SIZE}.
- * @param streamSize The number of bytes in the stream being copied.
- * Should be set to CopyStreamEvent.UNKNOWN_STREAM_SIZE if unknown.
- * Not currently used (though it is passed to {@link CopyStreamListener#bytesTransferred(long, int, long)}
- * @param listener The CopyStreamListener to notify of progress. If
- * this parameter is null, notification is not attempted.
- * @return number of bytes read/written
- * @throws CopyStreamException If an error occurs while reading from the
- * source or writing to the destination. The CopyStreamException
- * will contain the number of bytes confirmed to have been
- * transferred before an
- * IOException occurred, and it will also contain the IOException
- * that caused the error. These values can be retrieved with
- * the CopyStreamException getTotalBytesTransferred() and
- * getIOException() methods.
- ***/
- public static final long copyStream(InputStream source, OutputStream dest, int bufferSize,
- long streamSize, CopyStreamListener listener) throws CopyStreamException {
- return copyStream(source, dest, bufferSize, streamSize, listener, true);
- }
-
- /***
- * Copies the contents of an InputStream to an OutputStream using a
- * copy buffer of a given size. The contents of the InputStream are
- * read until the end of the stream is reached, but neither the
- * source nor the destination are closed. You must do this yourself
- * outside of the method call. The number of bytes read/written is
- * returned.
- *
- * @param source The source InputStream.
- * @param dest The destination OutputStream.
- * @param bufferSize The number of bytes to buffer during the copy.
- * A zero or negative value means to use {@link #DEFAULT_COPY_BUFFER_SIZE}.
- * @return The number of bytes read/written in the copy operation.
- * @throws CopyStreamException If an error occurs while reading from the
- * source or writing to the destination. The CopyStreamException
- * will contain the number of bytes confirmed to have been
- * transferred before an
- * IOException occurred, and it will also contain the IOException
- * that caused the error. These values can be retrieved with
- * the CopyStreamException getTotalBytesTransferred() and
- * getIOException() methods.
- ***/
- public static final long copyStream(InputStream source, OutputStream dest, int bufferSize)
- throws CopyStreamException {
- return copyStream(source, dest, bufferSize, CopyStreamEvent.UNKNOWN_STREAM_SIZE, null);
- }
-
- /***
- * Same as
- * The contents of the Reader are
- * read until its end is reached, but neither the source nor the
- * destination are closed. You must do this yourself outside of the
- * method call. The number of characters read/written is returned.
- *
- * @param source The source Reader.
- * @param dest The destination writer.
- * @param bufferSize The number of characters to buffer during the copy.
- * A zero or negative value means to use {@link #DEFAULT_COPY_BUFFER_SIZE}.
- * @param streamSize The number of characters in the stream being copied.
- * Should be set to CopyStreamEvent.UNKNOWN_STREAM_SIZE if unknown.
- * Not currently used (though it is passed to {@link CopyStreamListener#bytesTransferred(long, int, long)}
- * @param listener The CopyStreamListener to notify of progress. If
- * this parameter is null, notification is not attempted.
- * @return The number of characters read/written in the copy operation.
- * @throws CopyStreamException If an error occurs while reading from the
- * source or writing to the destination. The CopyStreamException
- * will contain the number of bytes confirmed to have been
- * transferred before an
- * IOException occurred, and it will also contain the IOException
- * that caused the error. These values can be retrieved with
- * the CopyStreamException getTotalBytesTransferred() and
- * getIOException() methods.
- ***/
- public static final long copyReader(Reader source, Writer dest, int bufferSize, long streamSize,
- CopyStreamListener listener) throws CopyStreamException {
- int numChars;
- long total = 0;
- char[] buffer = new char[bufferSize > 0 ? bufferSize : DEFAULT_COPY_BUFFER_SIZE];
-
- try {
- while ((numChars = source.read(buffer)) != -1) {
- // Technically, some read(char[]) methods may return 0 and we cannot
- // accept that as an indication of EOF.
- if (numChars == 0) {
- int singleChar = source.read();
- if (singleChar < 0) {
- break;
- }
- dest.write(singleChar);
- dest.flush();
- ++total;
- if (listener != null) {
- listener.bytesTransferred(total, 1, streamSize);
- }
- continue;
- }
-
- dest.write(buffer, 0, numChars);
- dest.flush();
- total += numChars;
- if (listener != null) {
- listener.bytesTransferred(total, numChars, streamSize);
- }
- }
- } catch (IOException e) {
- throw new CopyStreamException("IOException caught while copying.", total, e);
- }
-
- return total;
- }
-
- /***
- * Copies the contents of a Reader to a Writer using a
- * copy buffer of a given size. The contents of the Reader are
- * read until its end is reached, but neither the source nor the
- * destination are closed. You must do this yourself outside of the
- * method call. The number of characters read/written is returned.
- *
- * @param source The source Reader.
- * @param dest The destination writer.
- * @param bufferSize The number of characters to buffer during the copy.
- * A zero or negative value means to use {@link #DEFAULT_COPY_BUFFER_SIZE}.
- * @return The number of characters read/written in the copy operation.
- * @throws CopyStreamException If an error occurs while reading from the
- * source or writing to the destination. The CopyStreamException
- * will contain the number of bytes confirmed to have been
- * transferred before an
- * IOException occurred, and it will also contain the IOException
- * that caused the error. These values can be retrieved with
- * the CopyStreamException getTotalBytesTransferred() and
- * getIOException() methods.
- ***/
- public static final long copyReader(Reader source, Writer dest, int bufferSize)
- throws CopyStreamException {
- return copyReader(source, dest, bufferSize, CopyStreamEvent.UNKNOWN_STREAM_SIZE, null);
- }
-
- /***
- * Same as
- * This class implements section 6.8. Base64 Content-Transfer-Encoding from RFC 2045
- * Multipurpose
- * Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies by Freed and
- * Borenstein.
- *
- * The class can be parameterized in the following manner with various constructors:
- *
- * Since this class operates directly on byte streams, and not character streams, it is hard-coded
- * to only encode/decode
- * character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1,
- * Windows-1252, UTF-8, etc).
- *
- * The {@value} character limit does not count the trailing CRLF, but counts all other characters,
- * including any
- * equal signs.
- *
- * When encoding the line length is 76, the line separator is CRLF, and the encoding table is
- * STANDARD_ENCODE_TABLE.
- *
- * When decoding all variants are supported.
- *
- * When encoding the line length is 76, the line separator is CRLF, and the encoding table is
- * STANDARD_ENCODE_TABLE.
- *
- * When decoding all variants are supported.
- *
- * When encoding the line length is given in the constructor, the line separator is CRLF, and the
- * encoding table is
- * STANDARD_ENCODE_TABLE.
- *
- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in
- * the encoded data.
- *
- * When decoding all variants are supported.
- *
- * When encoding the line length and line separator are given in the constructor, and the encoding
- * table is
- * STANDARD_ENCODE_TABLE.
- *
- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in
- * the encoded data.
- *
- * When decoding all variants are supported.
- *
- * When encoding the line length and line separator are given in the constructor, and the encoding
- * table is
- * STANDARD_ENCODE_TABLE.
- *
- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in
- * the encoded data.
- *
- * When decoding all variants are supported.
- *
- * Encodes all of the provided data, starting at inPos, for inAvail bytes. Must be called at least
- * twice: once with
- * the data to encode, and once with inAvail set to "-1" to alert encoder that EOF has been
- * reached, so flush last
- * remaining bytes (if not multiple of 3).
- *
- * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach.
- * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
- *
- * Decodes all of the provided data, starting at inPos, for inAvail bytes. Should be called at
- * least twice: once
- * with the data to decode, and once with inAvail set to "-1" to alert decoder that EOF has been
- * reached. The "-1"
- * call is not necessary when decoding, but it doesn't hurt, either.
- *
- * Ignores all non-base64 characters. This is how chunked (e.g. 76 character) data is handled,
- * since CR and LF are
- * silently ignored, but has implications for other bytes, too. This method subscribes to the
- * garbage-in,
- * garbage-out philosophy: it will not check the provided data for validity.
- *
- * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach.
- * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
- *
- * For a non-chunking version, see {@link #encodeBase64StringUnChunked(byte[])}.
- *
- * @param binaryData binary data to encode
- * @return String containing Base64 characters.
- * @since 1.4
- */
- public static String encodeBase64String(byte[] binaryData) {
- return newStringUtf8(encodeBase64(binaryData, true));
- }
-
- /**
- * Encodes binary data using the base64 algorithm, without using chunking.
- *
- * For a chunking version, see {@link #encodeBase64String(byte[])}.
- *
- * @param binaryData binary data to encode
- * @return String containing Base64 characters.
- * @since 3.2
- */
- public static String encodeBase64StringUnChunked(byte[] binaryData) {
- return newStringUtf8(encodeBase64(binaryData, false));
- }
-
- /**
- * Encodes binary data using the base64 algorithm.
- *
- * @param binaryData binary data to encode
- * @param useChunking whether to split the output into chunks
- * @return String containing Base64 characters.
- * @since 3.2
- */
- public static String encodeBase64String(byte[] binaryData, boolean useChunking) {
- return newStringUtf8(encodeBase64(binaryData, useChunking));
- }
-
- /**
- * Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the
- * output. The
- * url-safe variation emits - and _ instead of + and / characters.
- *
- * @param binaryData binary data to encode
- * @return byte[] containing Base64 characters in their UTF-8 representation.
- * @since 1.4
- */
- public static byte[] encodeBase64URLSafe(byte[] binaryData) {
- return encodeBase64(binaryData, false, true);
- }
-
- /**
- * Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the
- * output. The
- * url-safe variation emits - and _ instead of + and / characters.
- *
- * @param binaryData binary data to encode
- * @return String containing Base64 characters
- * @since 1.4
- */
- public static String encodeBase64URLSafeString(byte[] binaryData) {
- return newStringUtf8(encodeBase64(binaryData, false, true));
- }
-
- /**
- * Encodes binary data using the base64 algorithm and chunks the encoded output into 76 character
- * blocks
- *
- * @param binaryData binary data to encode
- * @return Base64 characters chunked in 76 character blocks
- */
- public static byte[] encodeBase64Chunked(byte[] binaryData) {
- return encodeBase64(binaryData, true);
- }
-
- /**
- * Decodes a String containing containing characters in the Base64 alphabet.
- *
- * @param pArray A String containing Base64 character data
- * @return a byte array containing binary data
- * @since 1.4
- */
- public byte[] decode(String pArray) {
- return decode(getBytesUtf8(pArray));
- }
-
- private byte[] getBytesUtf8(String pArray) {
- try {
- return pArray.getBytes("UTF8");
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Decodes a byte[] containing containing characters in the Base64 alphabet.
- *
- * @param pArray A byte array containing Base64 character data
- * @return a byte array containing binary data
- */
- public byte[] decode(byte[] pArray) {
- reset();
- if (pArray == null || pArray.length == 0) {
- return pArray;
- }
- long len = (pArray.length * 3) / 4;
- byte[] buf = new byte[(int) len];
- setInitialBuffer(buf, 0, buf.length);
- decode(pArray, 0, pArray.length);
- decode(pArray, 0, -1); // Notify decoder of EOF.
-
- // Would be nice to just return buf (like we sometimes do in the encode
- // logic), but we have no idea what the line-length was (could even be
- // variable). So we cannot determine ahead of time exactly how big an
- // array is necessary. Hence the need to construct a 2nd byte array to
- // hold the final result:
-
- byte[] result = new byte[pos];
- readResults(result, 0, result.length);
- return result;
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76
- * character blocks.
- *
- * @param binaryData Array containing binary data to encode.
- * @param isChunked if
- * How to use with a client certificate:
- *
- * This should be the same as the default used by
- * {@link javax.net.ssl.SSLContext#init(KeyManager[], javax.net.ssl.TrustManager[], SecureRandom)}
- * SSLContext#init(KeyManager[], TrustManager[], SecureRandom)}
- * when the TrustManager parameter is set to {@code null}
- *
- * @param keyStore the KeyStore to use, may be {@code null}
- * @return the default TrustManager
- * @throws GeneralSecurityException if an error occurs
- */
- public static X509TrustManager getDefaultTrustManager(KeyStore keyStore)
- throws GeneralSecurityException {
- String defaultAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
- TrustManagerFactory instance = TrustManagerFactory.getInstance(defaultAlgorithm);
- instance.init(keyStore);
- return (X509TrustManager) instance.getTrustManagers()[0];
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/package-info.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/package-info.java
deleted file mode 100644
index 7b95d75d..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * Utility classes
- */
-package aria.apache.commons.net.util;
\ No newline at end of file
diff --git a/DEV_LOG.md b/DEV_LOG.md
index 6d6cae72..e5633197 100644
--- a/DEV_LOG.md
+++ b/DEV_LOG.md
@@ -1,6 +1,8 @@
## 开发日志
- + v_3.8.2
+ + v_3.8.3
- fix bug https://github.com/AriaLyy/Aria/issues/573
+ - android P适配 https://github.com/AriaLyy/Aria/issues/581
+ - 添加ftp服务器标志 https://github.com/AriaLyy/Aria/issues/580
+ v_3.8.1 (2019/12/22)
- 修复一个表创建失败的问题 https://github.com/AriaLyy/Aria/issues/570
- 修复一个非分块模式下导致下载失败的问题 https://github.com/AriaLyy/Aria/issues/571
diff --git a/FtpComponent/src/main/java/com/arialyy/aria/ftp/AbsFtpInfoThread.java b/FtpComponent/src/main/java/com/arialyy/aria/ftp/AbsFtpInfoTask.java
similarity index 94%
rename from FtpComponent/src/main/java/com/arialyy/aria/ftp/AbsFtpInfoThread.java
rename to FtpComponent/src/main/java/com/arialyy/aria/ftp/AbsFtpInfoTask.java
index 3fa81ac6..ecac890a 100644
--- a/FtpComponent/src/main/java/com/arialyy/aria/ftp/AbsFtpInfoThread.java
+++ b/FtpComponent/src/main/java/com/arialyy/aria/ftp/AbsFtpInfoTask.java
@@ -28,8 +28,8 @@ import com.arialyy.aria.core.AriaConfig;
import com.arialyy.aria.core.FtpUrlEntity;
import com.arialyy.aria.core.common.AbsEntity;
import com.arialyy.aria.core.common.FtpConnectionMode;
-import com.arialyy.aria.core.inf.OnFileInfoCallback;
-import com.arialyy.aria.core.upload.UploadEntity;
+import com.arialyy.aria.core.loader.IInfoTask;
+import com.arialyy.aria.core.loader.ILoaderVisitor;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.exception.AriaIOException;
import com.arialyy.aria.exception.TaskException;
@@ -47,28 +47,24 @@ import javax.net.ssl.SSLContext;
/**
* Created by Aria.Lao on 2017/7/25. 获取ftp文件夹信息
*/
-public abstract class AbsFtpInfoThreadFILE_TYPE
are used to indicate file types.
- ***/
- public static final int ASCII_FILE_TYPE = 0;
-
- /***
- * A constant used to indicate the file(s) being transferred should
- * be treated as EBCDIC. Note however that there are several different
- * EBCDIC formats. All constants ending in FILE_TYPE
- * are used to indicate file types.
- ***/
- public static final int EBCDIC_FILE_TYPE = 1;
-
- /***
- * A constant used to indicate the file(s) being transferred should
- * be treated as a binary image, i.e., no translations should be
- * performed. All constants ending in FILE_TYPE
are used to
- * indicate file types.
- ***/
- public static final int BINARY_FILE_TYPE = 2;
-
- /***
- * A constant used to indicate the file(s) being transferred should
- * be treated as a local type. All constants ending in
- * FILE_TYPE
are used to indicate file types.
- ***/
- public static final int LOCAL_FILE_TYPE = 3;
-
- /***
- * A constant used for text files to indicate a non-print text format.
- * This is the default format.
- * All constants ending in TEXT_FORMAT
are used to indicate
- * text formatting for text transfers (both ASCII and EBCDIC).
- ***/
- public static final int NON_PRINT_TEXT_FORMAT = 4;
-
- /***
- * A constant used to indicate a text file contains format vertical format
- * control characters.
- * All constants ending in TEXT_FORMAT
are used to indicate
- * text formatting for text transfers (both ASCII and EBCDIC).
- ***/
- public static final int TELNET_TEXT_FORMAT = 5;
-
- /***
- * A constant used to indicate a text file contains ASA vertical format
- * control characters.
- * All constants ending in TEXT_FORMAT
are used to indicate
- * text formatting for text transfers (both ASCII and EBCDIC).
- ***/
- public static final int CARRIAGE_CONTROL_TEXT_FORMAT = 6;
-
- /***
- * A constant used to indicate a file is to be treated as a continuous
- * sequence of bytes. This is the default structure. All constants ending
- * in _STRUCTURE
are used to indicate file structure for
- * file transfers.
- ***/
- public static final int FILE_STRUCTURE = 7;
-
- /***
- * A constant used to indicate a file is to be treated as a sequence
- * of records. All constants ending in _STRUCTURE
- * are used to indicate file structure for file transfers.
- ***/
- public static final int RECORD_STRUCTURE = 8;
-
- /***
- * A constant used to indicate a file is to be treated as a set of
- * independent indexed pages. All constants ending in
- * _STRUCTURE
are used to indicate file structure for file
- * transfers.
- ***/
- public static final int PAGE_STRUCTURE = 9;
-
- /***
- * A constant used to indicate a file is to be transferred as a stream
- * of bytes. This is the default transfer mode. All constants ending
- * in TRANSFER_MODE
are used to indicate file transfer
- * modes.
- ***/
- public static final int STREAM_TRANSFER_MODE = 10;
-
- /***
- * A constant used to indicate a file is to be transferred as a series
- * of blocks. All constants ending in TRANSFER_MODE
are used
- * to indicate file transfer modes.
- ***/
- public static final int BLOCK_TRANSFER_MODE = 11;
-
- /***
- * A constant used to indicate a file is to be transferred as FTP
- * compressed data. All constants ending in TRANSFER_MODE
- * are used to indicate file transfer modes.
- ***/
- public static final int COMPRESSED_TRANSFER_MODE = 12;
-
- // We have to ensure that the protocol communication is in ASCII
- // but we use ISO-8859-1 just in case 8-bit characters cross
- // the wire.
- /**
- * The default character encoding used for communicating over an
- * FTP control connection. The default encoding is an
- * ASCII-compatible encoding. Some FTP servers expect other
- * encodings. You can change the encoding used by an FTP instance
- * with {@link #setControlEncoding setControlEncoding}.
- */
- public static final String DEFAULT_CONTROL_ENCODING = "ISO-8859-1";
-
- /** Length of the FTP reply code (3 alphanumerics) */
- public static final int REPLY_CODE_LEN = 3;
-
- private static final String __modes = "AEILNTCFRPSBC";
-
- protected int _replyCode;
- protected ArrayListDEFAULT_PORT
and initializes internal data structures
- * for saving FTP reply information.
- ***/
- public FTP() {
- super();
- setDefaultPort(DEFAULT_PORT);
- _replyLines = new ArrayList connect
is of type void.
- *
- * @return The integer value of the reply code of the last FTP reply.
- ***/
- public int getReplyCode() {
- return _replyCode;
- }
-
- /***
- * Fetches a reply from the FTP server and returns the integer reply
- * code. After calling this method, the actual reply text can be accessed
- * from either calling {@link #getReplyString getReplyString } or
- * {@link #getReplyStrings getReplyStrings }. Only use this
- * method if you are implementing your own FTP client or if you need to
- * fetch a secondary response from the FTP server.
- *
- * @return The integer value of the reply code of the fetched FTP reply.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while receiving the
- * server reply.
- ***/
- public int getReply() throws IOException {
- __getReply();
- return _replyCode;
- }
-
- /***
- * Returns the lines of text from the last FTP server response as an array
- * of strings, one entry per line. The end of line markers of each are
- * stripped from each line.
- *
- * @return The lines of text from the last FTP response as an array.
- ***/
- public String[] getReplyStrings() {
- return _replyLines.toArray(new String[_replyLines.size()]);
- }
-
- /***
- * Returns the entire text of the last FTP server response exactly
- * as it was received, including all end of line markers in NETASCII
- * format.
- *
- * @return The entire text from the last FTP response as a String.
- ***/
- public String getReplyString() {
- StringBuilder buffer;
-
- if (!_newReplyString) {
- return _replyString;
- }
-
- buffer = new StringBuilder(256);
-
- for (String line : _replyLines) {
- buffer.append(line);
- buffer.append(SocketClient.NETASCII_EOL);
- }
-
- _newReplyString = false;
-
- return (_replyString = buffer.toString());
- }
-
- /***
- * A convenience method to send the FTP USER command to the server,
- * receive the reply, and return the reply code.
- *
- * @param username The username to login under.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int user(String username) throws IOException {
- return sendCommand(FTPCmd.USER, username);
- }
-
- /**
- * A convenience method to send the FTP PASS command to the server,
- * receive the reply, and return the reply code.
- *
- * @param password The plain text password of the username being logged into.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- */
- public int pass(String password) throws IOException {
- return sendCommand(FTPCmd.PASS, password);
- }
-
- /***
- * A convenience method to send the FTP ACCT command to the server,
- * receive the reply, and return the reply code.
- *
- * @param account The account name to access.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int acct(String account) throws IOException {
- return sendCommand(FTPCmd.ACCT, account);
- }
-
- /***
- * A convenience method to send the FTP ABOR command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int abor() throws IOException {
- return sendCommand(FTPCmd.ABOR);
- }
-
- /***
- * A convenience method to send the FTP CWD command to the server,
- * receive the reply, and return the reply code.
- *
- * @param directory The new working directory.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int cwd(String directory) throws IOException {
- return sendCommand(FTPCmd.CWD, directory);
- }
-
- /***
- * A convenience method to send the FTP CDUP command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int cdup() throws IOException {
- return sendCommand(FTPCmd.CDUP);
- }
-
- /***
- * A convenience method to send the FTP QUIT command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int quit() throws IOException {
- return sendCommand(FTPCmd.QUIT);
- }
-
- /***
- * A convenience method to send the FTP REIN command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int rein() throws IOException {
- return sendCommand(FTPCmd.REIN);
- }
-
- /***
- * A convenience method to send the FTP SMNT command to the server,
- * receive the reply, and return the reply code.
- *
- * @param dir The directory name.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int smnt(String dir) throws IOException {
- return sendCommand(FTPCmd.SMNT, dir);
- }
-
- /***
- * A convenience method to send the FTP PORT command to the server,
- * receive the reply, and return the reply code.
- *
- * @param host The host owning the port.
- * @param port The new port.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int port(InetAddress host, int port) throws IOException {
- int num;
- StringBuilder info = new StringBuilder(24);
-
- info.append(host.getHostAddress().replace('.', ','));
- num = port >>> 8;
- info.append(',');
- info.append(num);
- info.append(',');
- num = port & 0xff;
- info.append(num);
-
- return sendCommand(FTPCmd.PORT, info.toString());
- }
-
- /***
- * A convenience method to send the FTP EPRT command to the server,
- * receive the reply, and return the reply code.
- *
- * Examples:
- *
- *
- *
- * @see "http://www.faqs.org/rfcs/rfc2428.html"
- *
- * @param host The host owning the port.
- * @param port The new port.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 2.2
- ***/
- public int eprt(InetAddress host, int port) throws IOException {
- int num;
- StringBuilder info = new StringBuilder();
- String h;
-
- // If IPv6, trim the zone index
- h = host.getHostAddress();
- num = h.indexOf("%");
- if (num > 0) {
- h = h.substring(0, num);
- }
-
- info.append("|");
-
- if (host instanceof Inet4Address) {
- info.append("1");
- } else if (host instanceof Inet6Address) {
- info.append("2");
- }
- info.append("|");
- info.append(h);
- info.append("|");
- info.append(port);
- info.append("|");
-
- return sendCommand(FTPCmd.EPRT, info.toString());
- }
-
- /***
- * A convenience method to send the FTP PASV command to the server,
- * receive the reply, and return the reply code. Remember, it's up
- * to you to interpret the reply string containing the host/port
- * information.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int pasv() throws IOException {
- return sendCommand(FTPCmd.PASV);
- }
-
- /***
- * A convenience method to send the FTP EPSV command to the server,
- * receive the reply, and return the reply code. Remember, it's up
- * to you to interpret the reply string containing the host/port
- * information.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 2.2
- ***/
- public int epsv() throws IOException {
- return sendCommand(FTPCmd.EPSV);
- }
-
- /**
- * A convenience method to send the FTP TYPE command for text files
- * to the server, receive the reply, and return the reply code.
- *
- * @param fileType The type of the file (one of the FILE_TYPE
- * constants).
- * @param formatOrByteSize The format of the file (one of the
- * _FORMAT
constants. In the case of
- * LOCAL_FILE_TYPE
, the byte size.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- */
- public int type(int fileType, int formatOrByteSize) throws IOException {
- StringBuilder arg = new StringBuilder();
-
- arg.append(__modes.charAt(fileType));
- arg.append(' ');
- if (fileType == LOCAL_FILE_TYPE) {
- arg.append(formatOrByteSize);
- } else {
- arg.append(__modes.charAt(formatOrByteSize));
- }
-
- return sendCommand(FTPCmd.TYPE, arg.toString());
- }
-
- /**
- * A convenience method to send the FTP TYPE command to the server,
- * receive the reply, and return the reply code.
- *
- * @param fileType The type of the file (one of the FILE_TYPE
- * constants).
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- */
- public int type(int fileType) throws IOException {
- return sendCommand(FTPCmd.TYPE, __modes.substring(fileType, fileType + 1));
- }
-
- /***
- * A convenience method to send the FTP STRU command to the server,
- * receive the reply, and return the reply code.
- *
- * @param structure The structure of the file (one of the
- * _STRUCTURE
constants).
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int stru(int structure) throws IOException {
- return sendCommand(FTPCmd.STRU, __modes.substring(structure, structure + 1));
- }
-
- /***
- * A convenience method to send the FTP MODE command to the server,
- * receive the reply, and return the reply code.
- *
- * @param mode The transfer mode to use (one of the
- * TRANSFER_MODE
constants).
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int mode(int mode) throws IOException {
- return sendCommand(FTPCmd.MODE, __modes.substring(mode, mode + 1));
- }
-
- /***
- * A convenience method to send the FTP RETR command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @param pathname The pathname of the file to retrieve.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int retr(String pathname) throws IOException {
- return sendCommand(FTPCmd.RETR, pathname);
- }
-
- /***
- * A convenience method to send the FTP STOR command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @param pathname The pathname to use for the file when stored at
- * the remote end of the transfer.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int stor(String pathname) throws IOException {
- return sendCommand(FTPCmd.STOR, pathname);
- }
-
- /***
- * A convenience method to send the FTP STOU command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int stou() throws IOException {
- return sendCommand(FTPCmd.STOU);
- }
-
- /***
- * A convenience method to send the FTP STOU command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- * @param pathname The base pathname to use for the file when stored at
- * the remote end of the transfer. Some FTP servers
- * require this.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- */
- public int stou(String pathname) throws IOException {
- return sendCommand(FTPCmd.STOU, pathname);
- }
-
- /***
- * A convenience method to send the FTP APPE command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @param pathname The pathname to use for the file when stored at
- * the remote end of the transfer.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int appe(String pathname) throws IOException {
- return sendCommand(FTPCmd.APPE, pathname);
- }
-
- /***
- * A convenience method to send the FTP ALLO command to the server,
- * receive the reply, and return the reply code.
- *
- * @param bytes The number of bytes to allocate.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int allo(int bytes) throws IOException {
- return sendCommand(FTPCmd.ALLO, Integer.toString(bytes));
- }
-
- /**
- * A convenience method to send the FTP FEAT command to the server, receive the reply,
- * and return the reply code.
- *
- * @return The reply code received by the server
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 2.2
- */
- public int feat() throws IOException {
- return sendCommand(FTPCmd.FEAT);
- }
-
- /***
- * A convenience method to send the FTP ALLO command to the server,
- * receive the reply, and return the reply code.
- *
- * @param bytes The number of bytes to allocate.
- * @param recordSize The size of a record.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int allo(int bytes, int recordSize) throws IOException {
- return sendCommand(FTPCmd.ALLO, Integer.toString(bytes) + " R " + Integer.toString(recordSize));
- }
-
- /***
- * A convenience method to send the FTP REST command to the server,
- * receive the reply, and return the reply code.
- *
- * @param marker The marker at which to restart a transfer.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int rest(String marker) throws IOException {
- return sendCommand(FTPCmd.REST, marker);
- }
-
- /**
- * @param file name of file
- * @return the status
- * @throws IOException on error
- * @since 2.0
- **/
- public int mdtm(String file) throws IOException {
- return sendCommand(FTPCmd.MDTM, file);
- }
-
- /**
- * A convenience method to send the FTP MFMT command to the server,
- * receive the reply, and return the reply code.
- *
- * @param pathname The pathname for which mtime is to be changed
- * @param timeval Timestamp in YYYYMMDDhhmmss
format
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @see http://tools.ietf.org/html/draft-somers-ftp-mfxx-04
- * @since 2.2
- **/
- public int mfmt(String pathname, String timeval) throws IOException {
- return sendCommand(FTPCmd.MFMT, timeval + " " + pathname);
- }
-
- /***
- * A convenience method to send the FTP RNFR command to the server,
- * receive the reply, and return the reply code.
- *
- * @param pathname The pathname to rename from.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int rnfr(String pathname) throws IOException {
- return sendCommand(FTPCmd.RNFR, pathname);
- }
-
- /***
- * A convenience method to send the FTP RNTO command to the server,
- * receive the reply, and return the reply code.
- *
- * @param pathname The pathname to rename to
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int rnto(String pathname) throws IOException {
- return sendCommand(FTPCmd.RNTO, pathname);
- }
-
- /***
- * A convenience method to send the FTP DELE command to the server,
- * receive the reply, and return the reply code.
- *
- * @param pathname The pathname to delete.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int dele(String pathname) throws IOException {
- return sendCommand(FTPCmd.DELE, pathname);
- }
-
- /***
- * A convenience method to send the FTP RMD command to the server,
- * receive the reply, and return the reply code.
- *
- * @param pathname The pathname of the directory to remove.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int rmd(String pathname) throws IOException {
- return sendCommand(FTPCmd.RMD, pathname);
- }
-
- /***
- * A convenience method to send the FTP MKD command to the server,
- * receive the reply, and return the reply code.
- *
- * @param pathname The pathname of the new directory to create.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int mkd(String pathname) throws IOException {
- return sendCommand(FTPCmd.MKD, pathname);
- }
-
- /***
- * A convenience method to send the FTP PWD command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int pwd() throws IOException {
- return sendCommand(FTPCmd.PWD);
- }
-
- /***
- * A convenience method to send the FTP LIST command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int list() throws IOException {
- return sendCommand(FTPCmd.LIST);
- }
-
- /***
- * A convenience method to send the FTP LIST command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @param pathname The pathname to list,
- * may be {@code null} in which case the command is sent with no parameters
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int list(String pathname) throws IOException {
- return sendCommand(FTPCmd.LIST, pathname);
- }
-
- /**
- * A convenience method to send the FTP MLSD command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 3.0
- */
- public int mlsd() throws IOException {
- return sendCommand(FTPCmd.MLSD);
- }
-
- /**
- * A convenience method to send the FTP MLSD command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @param path the path to report on
- * @return The reply code received from the server,
- * may be {@code null} in which case the command is sent with no parameters
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 3.0
- */
- public int mlsd(String path) throws IOException {
- return sendCommand(FTPCmd.MLSD, path);
- }
-
- /**
- * A convenience method to send the FTP MLST command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 3.0
- */
- public int mlst() throws IOException {
- return sendCommand(FTPCmd.MLST);
- }
-
- /**
- * A convenience method to send the FTP MLST command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @param path the path to report on
- * @return The reply code received from the server,
- * may be {@code null} in which case the command is sent with no parameters
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- * @since 3.0
- */
- public int mlst(String path) throws IOException {
- return sendCommand(FTPCmd.MLST, path);
- }
-
- /***
- * A convenience method to send the FTP NLST command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int nlst() throws IOException {
- return sendCommand(FTPCmd.NLST);
- }
-
- /***
- * A convenience method to send the FTP NLST command to the server,
- * receive the reply, and return the reply code. Remember, it is up
- * to you to manage the data connection. If you don't need this low
- * level of access, use {@link FTPClient}
- * , which will handle all low level details for you.
- *
- * @param pathname The pathname to list,
- * may be {@code null} in which case the command is sent with no parameters
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int nlst(String pathname) throws IOException {
- return sendCommand(FTPCmd.NLST, pathname);
- }
-
- /***
- * A convenience method to send the FTP SITE command to the server,
- * receive the reply, and return the reply code.
- *
- * @param parameters The site parameters to send.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int site(String parameters) throws IOException {
- return sendCommand(FTPCmd.SITE, parameters);
- }
-
- /***
- * A convenience method to send the FTP SYST command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int syst() throws IOException {
- return sendCommand(FTPCmd.SYST);
- }
-
- /***
- * A convenience method to send the FTP STAT command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int stat() throws IOException {
- return sendCommand(FTPCmd.STAT);
- }
-
- /***
- * A convenience method to send the FTP STAT command to the server,
- * receive the reply, and return the reply code.
- *
- * @param pathname A pathname to list.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int stat(String pathname) throws IOException {
- return sendCommand(FTPCmd.STAT, pathname);
- }
-
- /***
- * A convenience method to send the FTP HELP command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int help() throws IOException {
- return sendCommand(FTPCmd.HELP);
- }
-
- /***
- * A convenience method to send the FTP HELP command to the server,
- * receive the reply, and return the reply code.
- *
- * @param command The command name on which to request help.
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int help(String command) throws IOException {
- return sendCommand(FTPCmd.HELP, command);
- }
-
- /***
- * A convenience method to send the FTP NOOP command to the server,
- * receive the reply, and return the reply code.
- *
- * @return The reply code received from the server.
- * @throws FTPConnectionClosedException
- * If the FTP server prematurely closes the connection as a result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending the
- * command or receiving the server reply.
- ***/
- public int noop() throws IOException {
- return sendCommand(FTPCmd.NOOP);
- }
-
- /**
- * Return whether strict multiline parsing is enabled, as per RFC 959, section 4.2.
- *
- * @return True if strict, false if lenient
- * @since 2.0
- */
- public boolean isStrictMultilineParsing() {
- return strictMultilineParsing;
- }
-
- /**
- * Set strict multiline parsing.
- *
- * @param strictMultilineParsing the setting
- * @since 2.0
- */
- public void setStrictMultilineParsing(boolean strictMultilineParsing) {
- this.strictMultilineParsing = strictMultilineParsing;
- }
-
- /**
- * Return whether strict non-multiline parsing is enabled, as per RFC 959, section 4.2.
- *
- * If false, only the 3 digit code is required (as was the case for versions up to 3.5)
- *
- *
- * @return True if strict (default), false if additional checks are not made
- * @since 3.6
- */
- public boolean isStrictReplyParsing() {
- return strictReplyParsing;
- }
-
- /**
- * Set strict non-multiline parsing.
- *
- * If false, only the 3 digit code is required (as was the case for versions up to 3.5)
- *
- *
- * @param strictReplyParsing the setting
- * @since 3.6
- */
- public void setStrictReplyParsing(boolean strictReplyParsing) {
- this.strictReplyParsing = strictReplyParsing;
- }
-
- /**
- * Provide command support to super-class
- */
- @Override protected ProtocolCommandSupport getCommandSupport() {
- return _commandSupport_;
- }
-}
-
-/* Emacs configuration
- * Local variables: **
- * mode: java **
- * c-basic-offset: 4 **
- * indent-tabs-mode: nil **
- * End: **
- */
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClient.java
deleted file mode 100644
index 4bcf98dc..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPClient.java
+++ /dev/null
@@ -1,3787 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import aria.apache.commons.net.SocketClient;
-import aria.apache.commons.net.ftp.parser.ParserInitializationException;
-import aria.apache.commons.net.io.CopyStreamAdapter;
-import aria.apache.commons.net.io.CopyStreamEvent;
-import aria.apache.commons.net.io.CopyStreamException;
-import aria.apache.commons.net.io.CopyStreamListener;
-import aria.apache.commons.net.io.FromNetASCIIInputStream;
-import aria.apache.commons.net.io.SocketInputStream;
-import aria.apache.commons.net.io.SocketOutputStream;
-import aria.apache.commons.net.io.ToNetASCIIOutputStream;
-import aria.apache.commons.net.io.Util;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Properties;
-import java.util.Random;
-import java.util.Set;
-
-import aria.apache.commons.net.MalformedServerReplyException;
-import aria.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory;
-import aria.apache.commons.net.ftp.parser.FTPFileEntryParserFactory;
-import aria.apache.commons.net.ftp.parser.MLSxEntryParser;
-import aria.apache.commons.net.io.CRLFLineReader;
-
-/**
- * FTPClient encapsulates all the functionality necessary to store and
- * retrieve files from an FTP server. This class takes care of all
- * low level details of interacting with an FTP server and provides
- * a convenient higher level interface. As with all classes derived
- * from {@link SocketClient},
- * you must first connect to the server with
- * {@link SocketClient#connect connect }
- * before doing anything, and finally
- * {@link SocketClient#disconnect disconnect }
- * after you're completely finished interacting with the server.
- * Then you need to check the FTP reply code to see if the connection
- * was successful. For example:
- *
- * FTPClient ftp = new FTPClient();
- * FTPClientConfig config = new FTPClientConfig();
- * config.setXXX(YYY); // change required options
- * // for example config.setServerTimeZoneId("Pacific/Pitcairn")
- * ftp.configure(config );
- * boolean error = false;
- * try {
- * int reply;
- * String server = "ftp.example.com";
- * ftp.connect(server);
- * System.out.println("Connected to " + server + ".");
- * System.out.print(ftp.getReplyString());
- *
- * // After connection attempt, you should check the reply code to verify
- * // success.
- * reply = ftp.getReplyCode();
- *
- * if(!FTPReply.isPositiveCompletion(reply)) {
- * ftp.disconnect();
- * System.err.println("FTP server refused connection.");
- * System.exit(1);
- * }
- * ... // transfer files
- * ftp.logout();
- * } catch(IOException e) {
- * error = true;
- * e.printStackTrace();
- * } finally {
- * if(ftp.isConnected()) {
- * try {
- * ftp.disconnect();
- * } catch(IOException ioe) {
- * // do nothing
- * }
- * }
- * System.exit(error ? 1 : 0);
- * }
- *
- * FTP.ASCII_FILE_TYPE
,
- * FTP.NON_PRINT_TEXT_FORMAT
,
- * FTP.STREAM_TRANSFER_MODE
, and
- * FTP.FILE_STRUCTURE
. The only file types directly supported
- * are FTP.ASCII_FILE_TYPE
and
- * FTP.BINARY_FILE_TYPE
. Because there are at least 4
- * different EBCDIC encodings, we have opted not to provide direct support
- * for EBCDIC. To transfer EBCDIC and other unsupported file types you
- * must create your own filter InputStreams and OutputStreams and wrap
- * them around the streams returned or required by the FTPClient methods.
- * FTPClient uses the {@link ToNetASCIIOutputStream NetASCII}
- * filter streams to provide transparent handling of ASCII files. We will
- * consider incorporating EBCDIC support if there is enough demand.
- * FTP.NON_PRINT_TEXT_FORMAT
,
- * FTP.STREAM_TRANSFER_MODE
, and
- * FTP.FILE_STRUCTURE
are the only supported formats,
- * transfer modes, and file structures.
- * FTPConnectionClosedException
- * is a subclass of IOException
and therefore need not be
- * caught separately, but if you are going to catch it separately, its
- * catch block must appear before the more general IOException
- * catch block. When you encounter an
- * {@link FTPConnectionClosedException}
- * , you must disconnect the connection with
- * {@link #disconnect disconnect() } to properly clean up the
- * system resources used by FTPClient. Before disconnecting, you may check the
- * last reply code and text with
- * {@link FTP#getReplyCode getReplyCode },
- * {@link FTP#getReplyString getReplyString },
- * and
- * {@link FTP#getReplyStrings getReplyStrings}.
- * You may avoid server disconnections while the client is idle by
- * periodically sending NOOP commands to the server.
- *
- * FTPClient f = new FTPClient();
- * f.connect(server);
- * f.login(username, password);
- * FTPFile[] files = f.listFiles(directory);
- *
- *
- * FTPClient f = new FTPClient();
- * f.connect(server);
- * f.login(username, password);
- * FTPListParseEngine engine =
- * f.initiateListParsing("com.whatever.YourOwnParser", directory);
- *
- * while (engine.hasNext()) {
- * FTPFile[] files = engine.getNext(25); // "page size" you want
- * //do whatever you want with these files, display them, etc.
- * //expensive FTPFile objects not created until needed.
- * }
- *
- *
- * FTPClient f = new FTPClient();
- * f.connect(server);
- * f.login(username, password);
- * FTPListParseEngine engine = f.initiateListParsing(directory);
- *
- * while (engine.hasNext()) {
- * FTPFile[] files = engine.getNext(25); // "page size" you want
- * //do whatever you want with these files, display them, etc.
- * //expensive FTPFile objects not created until needed.
- * }
- *
- *
- *
see {@link FTPClientConfig FTPClientConfig}.
- * MM d yyyy
- * One solution to this is to send a safe command (i.e. NOOP) over the control connection to reset
- * the router's
- * idle timer. This is enabled as follows:
- *
- * ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes
- *
- * This will cause the file upload/download methods to send a NOOP approximately every 5 minutes.
- * The following public methods support this:
- *
- *
- * This feature does not apply to the methods where the user is responsible for writing or reading
- * the data stream, i.e. {@link #retrieveFileStream(String)} , {@link #storeFileStream(String)}
- * and the other xxxFileStream methods.
- * In such cases, the user is responsible for keeping the control connection alive if necessary.
- *
- * If defined, the value will be used to create any automatically created parsers.
- *
- * @since 3.0
- */
- public static final String FTP_SYSTEM_TYPE = "org.apache.commons.net.ftp.systemType";
-
- /**
- * The system property ({@value}) which can be used as the default system type.
- * If defined, the value will be used if the SYST command fails.
- *
- * @since 3.1
- */
- public static final String FTP_SYSTEM_TYPE_DEFAULT =
- "org.apache.commons.net.ftp.systemType.default";
-
- /**
- * The name of an optional systemType properties file ({@value}), which is loaded
- * using {@link Class#getResourceAsStream(String)}.
- * The entries are the systemType (as determined by {@link FTPClient#getSystemType})
- * and the values are the replacement type or parserClass, which is passed to
- * {@link FTPFileEntryParserFactory#createFileEntryParser(String)}.
- * For example:
- *
- * Plan 9=Unix
- * OS410=OS400FTPEntryParser
- *
- *
- * @since 3.0
- */
- public static final String SYSTEM_TYPE_PROPERTIES = "/systemType.properties";
-
- /**
- * A constant indicating the FTP session is expecting all transfers
- * to occur between the client (local) and server and that the server
- * should connect to the client's data port to initiate a data transfer.
- * This is the default data connection mode when and FTPClient instance
- * is created.
- */
- public static final int ACTIVE_LOCAL_DATA_CONNECTION_MODE = 0;
- /**
- * A constant indicating the FTP session is expecting all transfers
- * to occur between two remote servers and that the server
- * the client is connected to should connect to the other server's
- * data port to initiate a data transfer.
- */
- public static final int ACTIVE_REMOTE_DATA_CONNECTION_MODE = 1;
- /**
- * A constant indicating the FTP session is expecting all transfers
- * to occur between the client (local) and server and that the server
- * is in passive mode, requiring the client to connect to the
- * server's data port to initiate a transfer.
- */
- public static final int PASSIVE_LOCAL_DATA_CONNECTION_MODE = 2;
- /**
- * A constant indicating the FTP session is expecting all transfers
- * to occur between two remote servers and that the server
- * the client is connected to is in passive mode, requiring the other
- * server to connect to the first server's data port to initiate a data
- * transfer.
- */
- public static final int PASSIVE_REMOTE_DATA_CONNECTION_MODE = 3;
-
- private int __dataConnectionMode;
- private int __dataTimeout;
- private int __passivePort;
- private String __passiveHost;
- private final Random __random;
- private int __activeMinPort;
- private int __activeMaxPort;
- private InetAddress __activeExternalHost;
- private InetAddress __reportActiveExternalHost;
- // overrides __activeExternalHost in EPRT/PORT commands
- /** The address to bind to on passive connections, if necessary. */
- private InetAddress __passiveLocalHost;
-
- private int __fileType;
- @SuppressWarnings("unused") // fields are written, but currently not read
- private int __fileFormat;
- @SuppressWarnings("unused") // field is written, but currently not read
- private int __fileStructure;
- @SuppressWarnings("unused") // field is written, but currently not read
- private int __fileTransferMode;
- private boolean __remoteVerificationEnabled;
- private long __restartOffset;
- private FTPFileEntryParserFactory __parserFactory;
- private int __bufferSize; // buffersize for buffered data streams
- private int __sendDataSocketBufferSize;
- private int __receiveDataSocketBufferSize;
- private boolean __listHiddenFiles;
- private boolean __useEPSVwithIPv4; // whether to attempt EPSV with an IPv4 connection
-
- // __systemName is a cached value that should not be referenced directly
- // except when assigned in getSystemName and __initDefaults.
- private String __systemName;
-
- // __entryParser is a cached value that should not be referenced directly
- // except when assigned in listFiles(String, String) and __initDefaults.
- private FTPFileEntryParser __entryParser;
-
- // Key used to create the parser; necessary to ensure that the parser type is not ignored
- private String __entryParserKey;
-
- private FTPClientConfig __configuration;
-
- // Listener used by store/retrieve methods to handle keepalive
- private CopyStreamListener __copyStreamListener;
-
- // How long to wait before sending another control keep-alive message
- private long __controlKeepAliveTimeout;
-
- // How long to wait (ms) for keepalive message replies before continuing
- // Most FTP servers don't seem to support concurrent control and data connection usage
- private int __controlKeepAliveReplyTimeout = 1000;
-
- /**
- * Enable or disable replacement of internal IP in passive mode. Default enabled
- * using {code NatServerResolverImpl}.
- */
- private HostnameResolver __passiveNatWorkaroundStrategy = new NatServerResolverImpl(this);
-
- /** Pattern for PASV mode responses. Groups: (n,n,n,n),(n),(n) */
- private static final java.util.regex.Pattern __PARMS_PAT;
-
- static {
- __PARMS_PAT = java.util.regex.Pattern.compile(
- "(\\d{1,3},\\d{1,3},\\d{1,3},\\d{1,3}),(\\d{1,3}),(\\d{1,3})");
- }
-
- /** Controls the automatic server encoding detection (only UTF-8 supported). */
- private boolean __autodetectEncoding = false;
-
- /** Map of FEAT responses. If null, has not been initialised. */
- private HashMap ACTIVE_LOCAL_DATA_CONNECTION_MODE
, the file type
- * set to FTP.ASCII_FILE_TYPE
, the
- * file format set to FTP.NON_PRINT_TEXT_FORMAT
,
- * the file structure set to FTP.FILE_STRUCTURE
, and
- * the transfer mode set to FTP.STREAM_TRANSFER_MODE
.
- *
- * FTPClient ftp = new FTPClient();
- * FTPClientConfig config = new FTPClientConfig();
- * config.setLenientFutureDates(true);
- * ftp.configure(config );
- *
- */
- public FTPClient() {
- __initDefaults();
- __dataTimeout = -1;
- __remoteVerificationEnabled = true;
- __parserFactory = new DefaultFTPFileEntryParserFactory();
- __configuration = null;
- __listHiddenFiles = false;
- __useEPSVwithIPv4 = false;
- __random = new Random();
- __passiveLocalHost = null;
- }
-
- private void __initDefaults() {
- __dataConnectionMode = ACTIVE_LOCAL_DATA_CONNECTION_MODE;
- __passiveHost = null;
- __passivePort = -1;
- __activeExternalHost = null;
- __reportActiveExternalHost = null;
- __activeMinPort = 0;
- __activeMaxPort = 0;
- __fileType = FTP.ASCII_FILE_TYPE;
- __fileStructure = FTP.FILE_STRUCTURE;
- __fileFormat = FTP.NON_PRINT_TEXT_FORMAT;
- __fileTransferMode = FTP.STREAM_TRANSFER_MODE;
- __restartOffset = 0;
- __systemName = null;
- __entryParser = null;
- __entryParserKey = "";
- __featuresMap = null;
- }
-
- /**
- * Parse the pathname from a CWD reply.
- * ACTIVE_LOCAL_DATA_CONNECTION_MODE
. No communication
- * with the FTP server is conducted, but this causes all future data
- * transfers to require the FTP server to connect to the client's
- * data port. Additionally, to accommodate differences between socket
- * implementations on different platforms, this method causes the
- * client to issue a PORT command before every data transfer.
- */
- public void enterLocalActiveMode() {
- __dataConnectionMode = ACTIVE_LOCAL_DATA_CONNECTION_MODE;
- __passiveHost = null;
- __passivePort = -1;
- }
-
- /**
- * Set the current data connection mode to
- * PASSIVE_LOCAL_DATA_CONNECTION_MODE
. Use this
- * method only for data transfers between the client and server.
- * This method causes a PASV (or EPSV) command to be issued to the server
- * before the opening of every data connection, telling the server to
- * open a data port to which the client will connect to conduct
- * data transfers. The FTPClient will stay in
- * PASSIVE_LOCAL_DATA_CONNECTION_MODE
until the
- * mode is changed by calling some other method such as
- * {@link #enterLocalActiveMode enterLocalActiveMode() }
- * ACTIVE_REMOTE_DATA_CONNECTION
. Use this method only
- * for server to server data transfers. This method issues a PORT
- * command to the server, indicating the other server and port to which
- * it should connect for data transfers. You must call this method
- * before EVERY server to server transfer attempt. The FTPClient will
- * NOT automatically continue to issue PORT commands. You also
- * must remember to call
- * {@link #enterLocalActiveMode enterLocalActiveMode() } if you
- * wish to return to the normal data connection mode.
- *
- * @param host The passive mode server accepting connections for data
- * transfers.
- * @param port The passive mode server's data port.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean enterRemoteActiveMode(InetAddress host, int port) throws IOException {
- if (FTPReply.isPositiveCompletion(port(host, port))) {
- __dataConnectionMode = ACTIVE_REMOTE_DATA_CONNECTION_MODE;
- __passiveHost = null;
- __passivePort = -1;
- return true;
- }
- return false;
- }
-
- /**
- * Set the current data connection mode to
- * PASSIVE_REMOTE_DATA_CONNECTION_MODE
. Use this
- * method only for server to server data transfers.
- * This method issues a PASV command to the server, telling it to
- * open a data port to which the active server will connect to conduct
- * data transfers. You must call this method
- * before EVERY server to server transfer attempt. The FTPClient will
- * NOT automatically continue to issue PASV commands. You also
- * must remember to call
- * {@link #enterLocalActiveMode enterLocalActiveMode() } if you
- * wish to return to the normal data connection mode.
- *
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean enterRemotePassiveMode() throws IOException {
- if (pasv() != FTPReply.ENTERING_PASSIVE_MODE) {
- return false;
- }
-
- __dataConnectionMode = PASSIVE_REMOTE_DATA_CONNECTION_MODE;
- _parsePassiveModeReply(_replyLines.get(0));
-
- return true;
- }
-
- /**
- * Returns the hostname or IP address (in the form of a string) returned
- * by the server when entering passive mode. If not in passive mode,
- * returns null. This method only returns a valid value AFTER a
- * data connection has been opened after a call to
- * {@link #enterLocalPassiveMode enterLocalPassiveMode()}.
- * This is because FTPClient sends a PASV command to the server only
- * just before opening a data connection, and not when you call
- * {@link #enterLocalPassiveMode enterLocalPassiveMode()}.
- *
- * @return The passive host name if in passive mode, otherwise null.
- */
- public String getPassiveHost() {
- return __passiveHost;
- }
-
- /**
- * If in passive mode, returns the data port of the passive host.
- * This method only returns a valid value AFTER a
- * data connection has been opened after a call to
- * {@link #enterLocalPassiveMode enterLocalPassiveMode()}.
- * This is because FTPClient sends a PASV command to the server only
- * just before opening a data connection, and not when you call
- * {@link #enterLocalPassiveMode enterLocalPassiveMode()}.
- *
- * @return The data port of the passive server. If not in passive
- * mode, undefined.
- */
- public int getPassivePort() {
- return __passivePort;
- }
-
- /**
- * Returns the current data connection mode (one of the
- * _DATA_CONNECTION_MODE
constants.
- *
- * @return The current data connection mode (one of the
- * _DATA_CONNECTION_MODE
constants.
- */
- public int getDataConnectionMode() {
- return __dataConnectionMode;
- }
-
- /**
- * Get the client port for active mode.
- *
- * @return The client port for active mode.
- */
- private int getActivePort() {
- if (__activeMinPort > 0 && __activeMaxPort >= __activeMinPort) {
- if (__activeMaxPort == __activeMinPort) {
- return __activeMaxPort;
- }
- // Get a random port between the min and max port range
- return __random.nextInt(__activeMaxPort - __activeMinPort + 1) + __activeMinPort;
- } else {
- // default port
- return 0;
- }
- }
-
- /**
- * Get the host address for active mode; allows the local address to be overridden.
- *
- * @return __activeExternalHost if non-null, else getLocalAddress()
- * @see #setActiveExternalIPAddress(String)
- */
- private InetAddress getHostAddress() {
- if (__activeExternalHost != null) {
- return __activeExternalHost;
- } else {
- // default local address
- return getLocalAddress();
- }
- }
-
- /**
- * Get the reported host address for active mode EPRT/PORT commands;
- * allows override of {@link #getHostAddress()}.
- *
- * Useful for FTP Client behind Firewall NAT.
- *
- * @return __reportActiveExternalHost if non-null, else getHostAddress();
- */
- private InetAddress getReportHostAddress() {
- if (__reportActiveExternalHost != null) {
- return __reportActiveExternalHost;
- } else {
- return getHostAddress();
- }
- }
-
- /**
- * Set the client side port range in active mode.
- *
- * @param minPort The lowest available port (inclusive).
- * @param maxPort The highest available port (inclusive).
- * @since 2.2
- */
- public void setActivePortRange(int minPort, int maxPort) {
- this.__activeMinPort = minPort;
- this.__activeMaxPort = maxPort;
- }
-
- /**
- * Set the external IP address in active mode.
- * Useful when there are multiple network cards.
- *
- * @param ipAddress The external IP address of this machine.
- * @throws UnknownHostException if the ipAddress cannot be resolved
- * @since 2.2
- */
- public void setActiveExternalIPAddress(String ipAddress) throws UnknownHostException {
- this.__activeExternalHost = InetAddress.getByName(ipAddress);
- }
-
- /**
- * Set the local IP address to use in passive mode.
- * Useful when there are multiple network cards.
- *
- * @param ipAddress The local IP address of this machine.
- * @throws UnknownHostException if the ipAddress cannot be resolved
- */
- public void setPassiveLocalIPAddress(String ipAddress) throws UnknownHostException {
- this.__passiveLocalHost = InetAddress.getByName(ipAddress);
- }
-
- /**
- * Set the local IP address to use in passive mode.
- * Useful when there are multiple network cards.
- *
- * @param inetAddress The local IP address of this machine.
- */
- public void setPassiveLocalIPAddress(InetAddress inetAddress) {
- this.__passiveLocalHost = inetAddress;
- }
-
- /**
- * Set the local IP address in passive mode.
- * Useful when there are multiple network cards.
- *
- * @return The local IP address in passive mode.
- */
- public InetAddress getPassiveLocalIPAddress() {
- return this.__passiveLocalHost;
- }
-
- /**
- * Set the external IP address to report in EPRT/PORT commands in active mode.
- * Useful when there are multiple network cards.
- *
- * @param ipAddress The external IP address of this machine.
- * @throws UnknownHostException if the ipAddress cannot be resolved
- * @see #getReportHostAddress()
- * @since 3.1
- */
- public void setReportActiveExternalIPAddress(String ipAddress) throws UnknownHostException {
- this.__reportActiveExternalHost = InetAddress.getByName(ipAddress);
- }
-
- /**
- * Sets the file type to be transferred. This should be one of
- * FTP.ASCII_FILE_TYPE
, FTP.BINARY_FILE_TYPE
,
- * etc. The file type only needs to be set when you want to change the
- * type. After changing it, the new type stays in effect until you change
- * it again. The default file type is FTP.ASCII_FILE_TYPE
- * if this method is never called.
- *
- * The server default is supposed to be ASCII (see RFC 959), however many
- * ftp servers default to BINARY. To ensure correct operation with all servers,
- * always specify the appropriate file type after connecting to the server.
- *
- * _FILE_TYPE
constant indcating the
- * type of file.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean setFileType(int fileType) throws IOException {
- if (FTPReply.isPositiveCompletion(type(fileType))) {
- __fileType = fileType;
- __fileFormat = FTP.NON_PRINT_TEXT_FORMAT;
- return true;
- }
- return false;
- }
-
- /**
- * Sets the file type to be transferred and the format. The type should be
- * one of FTP.ASCII_FILE_TYPE
,
- * FTP.BINARY_FILE_TYPE
, etc. The file type only needs to
- * be set when you want to change the type. After changing it, the new
- * type stays in effect until you change it again. The default file type
- * is FTP.ASCII_FILE_TYPE
if this method is never called.
- *
- * The server default is supposed to be ASCII (see RFC 959), however many
- * ftp servers default to BINARY. To ensure correct operation with all servers,
- * always specify the appropriate file type after connecting to the server.
- *
- * The format should be one of the FTP class TEXT_FORMAT
- * constants, or if the type is FTP.LOCAL_FILE_TYPE
, the
- * format should be the byte size for that type. The default format
- * is FTP.NON_PRINT_TEXT_FORMAT
if this method is never
- * called.
- * _FILE_TYPE
constant indcating the
- * type of file.
- * @param formatOrByteSize The format of the file (one of the
- * _FORMAT
constants. In the case of
- * LOCAL_FILE_TYPE
, the byte size.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean setFileType(int fileType, int formatOrByteSize) throws IOException {
- if (FTPReply.isPositiveCompletion(type(fileType, formatOrByteSize))) {
- __fileType = fileType;
- __fileFormat = formatOrByteSize;
- return true;
- }
- return false;
- }
-
- /**
- * Sets the file structure. The default structure is
- * FTP.FILE_STRUCTURE
if this method is never called
- * or if a connect method is called.
- *
- * @param structure The structure of the file (one of the FTP class
- * _STRUCTURE
constants).
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean setFileStructure(int structure) throws IOException {
- if (FTPReply.isPositiveCompletion(stru(structure))) {
- __fileStructure = structure;
- return true;
- }
- return false;
- }
-
- /**
- * Sets the transfer mode. The default transfer mode
- * FTP.STREAM_TRANSFER_MODE
if this method is never called
- * or if a connect method is called.
- *
- * @param mode The new transfer mode to use (one of the FTP class
- * _TRANSFER_MODE
constants).
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean setFileTransferMode(int mode) throws IOException {
- if (FTPReply.isPositiveCompletion(mode(mode))) {
- __fileTransferMode = mode;
- return true;
- }
- return false;
- }
-
- /**
- * Initiate a server to server file transfer. This method tells the
- * server to which the client is connected to retrieve a given file from
- * the other server.
- *
- * @param filename The name of the file to retrieve.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean remoteRetrieve(String filename) throws IOException {
- if (__dataConnectionMode == ACTIVE_REMOTE_DATA_CONNECTION_MODE
- || __dataConnectionMode == PASSIVE_REMOTE_DATA_CONNECTION_MODE) {
- return FTPReply.isPositivePreliminary(retr(filename));
- }
- return false;
- }
-
- /**
- * Initiate a server to server file transfer. This method tells the
- * server to which the client is connected to store a file on
- * the other server using the given filename. The other server must
- * have had a remoteRetrieve
issued to it by another
- * FTPClient.
- *
- * @param filename The name to call the file that is to be stored.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean remoteStore(String filename) throws IOException {
- if (__dataConnectionMode == ACTIVE_REMOTE_DATA_CONNECTION_MODE
- || __dataConnectionMode == PASSIVE_REMOTE_DATA_CONNECTION_MODE) {
- return FTPReply.isPositivePreliminary(stor(filename));
- }
- return false;
- }
-
- /**
- * Initiate a server to server file transfer. This method tells the
- * server to which the client is connected to store a file on
- * the other server using a unique filename based on the given filename.
- * The other server must have had a remoteRetrieve
issued
- * to it by another FTPClient.
- *
- * @param filename The name on which to base the filename of the file
- * that is to be stored.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean remoteStoreUnique(String filename) throws IOException {
- if (__dataConnectionMode == ACTIVE_REMOTE_DATA_CONNECTION_MODE
- || __dataConnectionMode == PASSIVE_REMOTE_DATA_CONNECTION_MODE) {
- return FTPReply.isPositivePreliminary(stou(filename));
- }
- return false;
- }
-
- /**
- * Initiate a server to server file transfer. This method tells the
- * server to which the client is connected to store a file on
- * the other server using a unique filename.
- * The other server must have had a remoteRetrieve
issued
- * to it by another FTPClient. Many FTP servers require that a base
- * filename be given from which the unique filename can be derived. For
- * those servers use the other version of remoteStoreUnique
- *
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean remoteStoreUnique() throws IOException {
- if (__dataConnectionMode == ACTIVE_REMOTE_DATA_CONNECTION_MODE
- || __dataConnectionMode == PASSIVE_REMOTE_DATA_CONNECTION_MODE) {
- return FTPReply.isPositivePreliminary(stou());
- }
- return false;
- }
-
- // For server to server transfers
-
- /**
- * Initiate a server to server file transfer. This method tells the
- * server to which the client is connected to append to a given file on
- * the other server. The other server must have had a
- * remoteRetrieve
issued to it by another FTPClient.
- *
- * @param filename The name of the file to be appended to, or if the
- * file does not exist, the name to call the file being stored.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean remoteAppend(String filename) throws IOException {
- if (__dataConnectionMode == ACTIVE_REMOTE_DATA_CONNECTION_MODE
- || __dataConnectionMode == PASSIVE_REMOTE_DATA_CONNECTION_MODE) {
- return FTPReply.isPositivePreliminary(appe(filename));
- }
- return false;
- }
-
- /**
- * There are a few FTPClient methods that do not complete the
- * entire sequence of FTP commands to complete a transaction. These
- * commands require some action by the programmer after the reception
- * of a positive intermediate command. After the programmer's code
- * completes its actions, it must call this method to receive
- * the completion reply from the server and verify the success of the
- * entire transaction.
- *
- * InputStream input;
- * OutputStream output;
- * input = new FileInputStream("foobaz.txt");
- * output = ftp.storeFileStream("foobar.txt")
- * if(!FTPReply.isPositiveIntermediate(ftp.getReplyCode())) {
- * input.close();
- * output.close();
- * ftp.logout();
- * ftp.disconnect();
- * System.err.println("File transfer failed.");
- * System.exit(1);
- * }
- * Util.copyStream(input, output);
- * input.close();
- * output.close();
- * // Must call completePendingCommand() to finish command.
- * if(!ftp.completePendingCommand()) {
- * ftp.logout();
- * ftp.disconnect();
- * System.err.println("File transfer failed.");
- * System.exit(1);
- * }
- *
- *
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public boolean completePendingCommand() throws IOException {
- return FTPReply.isPositiveCompletion(getReply());
- }
-
- /**
- * Retrieves a named file from the server and writes it to the given
- * OutputStream. This method does NOT close the given OutputStream.
- * If the current file type is ASCII, line separators in the file are
- * converted to the local representation.
- *
- * C> feat
- * S> 211-Extensions supported:
- * S> MLST size*;create;modify*;perm;media-type
- * S> SIZE
- * S> COMPRESSION
- * S> MDTM
- * S> 211 END
- *
- *
- * @return True if successfully completed, false if not.
- * @throws IOException on error
- * @see http://www.faqs.org/rfcs/rfc2389.html
- * @since 2.2
- */
- public boolean features() throws IOException {
- return FTPReply.isPositiveCompletion(feat());
- }
-
- /**
- * Query the server for a supported feature, and returns its values (if any).
- * Caches the parsed response to avoid resending the command repeatedly.
- *
- * @param feature the feature to check
- * @return if the feature is present, returns the feature values (empty array if none)
- * Returns {@code null} if the feature is not found or the command failed.
- * Check {@link #getReplyCode()} or {@link #getReplyString()} if so.
- * @throws IOException on error
- * @since 3.0
- */
- public String[] featureValues(String feature) throws IOException {
- if (!initFeatureMap()) {
- return null;
- }
- SetSTREAM_TRANSFER_MODE
file transfer starting
- * from the given offset. This will only work on FTP servers supporting
- * the REST comand for the stream transfer mode. However, most FTP
- * servers support this. Any subsequent file transfer will start
- * reading or writing the remote file from the indicated offset.
- *
- * @param offset The offset into the remote file at which to start the
- * next file transfer.
- * @return True if successfully completed, false if not.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @since 3.1 (changed from private to protected)
- */
- protected boolean restart(long offset) throws IOException {
- __restartOffset = 0;
- return FTPReply.isPositiveIntermediate(rest(Long.toString(offset)));
- }
-
- /**
- * Sets the restart offset for file transfers.
- * FTPFileEntryParser
- * used.
- * FTPFileEntryParser
- * used.
- * listFiles("site", FTPFileFilters.DIRECTORY);
- *
- * @param pathname the initial path, may be null
- * @param filter the filter, non-null
- * @return the list of FTPFile entries.
- * @throws IOException on error
- * @since 2.2
- */
- public FTPFile[] listFiles(String pathname, FTPFileFilter filter) throws IOException {
- FTPListParseEngine engine = initiateListParsing((String) null, pathname);
- return engine.getFiles(filter);
- }
-
- /**
- * Using the default system autodetect mechanism, obtain a
- * list of directories contained in the current working directory.
- * FTPFileEntryParser
- * used.
- * FTPFileEntryParser
- * used.
- * FTPFileEntryParser
used.
- * parser
parameter. Null will be
- * returned if a data connection cannot be opened. If the current working
- * directory contains no files, an empty array will be the return.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @throws ParserInitializationException Thrown if the
- * autodetect mechanism cannot
- * resolve the type of system we are connected with.
- * @see FTPListParseEngine
- */
- public FTPListParseEngine initiateListParsing() throws IOException {
- return initiateListParsing((String) null);
- }
-
- /**
- * Using the default autodetect mechanism, initialize an FTPListParseEngine
- * object containing a raw file information for the supplied directory.
- * This information is obtained through the LIST command. This object
- * is then capable of being iterated to return a sequence of FTPFile
- * objects with information filled in by the
- * FTPFileEntryParser
used.
- *
- * FTPClient f=FTPClient();
- * f.connect(server);
- * f.login(username, password);
- * FTPListParseEngine engine = f.initiateListParsing(directory);
- *
- * while (engine.hasNext()) {
- * FTPFile[] files = engine.getNext(25); // "page size" you want
- * //do whatever you want with these files, display them, etc.
- * //expensive FTPFile objects not created until needed.
- * }
- *
- *
- * @param pathname the starting directory
- * @return A FTPListParseEngine object that holds the raw information and
- * is capable of providing parsed FTPFile objects, one for each file
- * containing information contained in the given path in the format
- * determined by the parser
parameter. Null will be
- * returned if a data connection cannot be opened. If the current working
- * directory contains no files, an empty array will be the return.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @throws ParserInitializationException Thrown if the
- * autodetect mechanism cannot
- * resolve the type of system we are connected with.
- * @see FTPListParseEngine
- */
- public FTPListParseEngine initiateListParsing(String pathname) throws IOException {
- return initiateListParsing((String) null, pathname);
- }
-
- /**
- * Using the supplied parser key, initialize an FTPListParseEngine
- * object containing a raw file information for the supplied directory.
- * This information is obtained through the LIST command. This object
- * is then capable of being iterated to return a sequence of FTPFile
- * objects with information filled in by the
- * FTPFileEntryParser
used.
- * FTPFileEntryParser
that should be
- * used to parse each server file listing.
- * May be {@code null}, in which case the code checks first
- * the system property {@link #FTP_SYSTEM_TYPE}, and if that is
- * not defined the SYST command is used to provide the value.
- * To allow for arbitrary system types, the return from the
- * SYST command is used to look up an alias for the type in the
- * {@link #SYSTEM_TYPE_PROPERTIES} properties file if it is available.
- * @param pathname the starting directory
- * @return A FTPListParseEngine object that holds the raw information and
- * is capable of providing parsed FTPFile objects, one for each file
- * containing information contained in the given path in the format
- * determined by the parser
parameter. Null will be
- * returned if a data connection cannot be opened. If the current working
- * directory contains no files, an empty array will be the return.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @throws ParserInitializationException Thrown if the
- * parserKey
- * parameter cannot be
- * resolved by the selected parser factory.
- * In the DefaultFTPEntryParserFactory, this will
- * happen when parserKey is neither
- * the fully qualified class name of a class
- * implementing the interface
- * FTPFileEntryParser
- * nor a string containing one of the recognized keys
- * mapping to such a parser or if class loader
- * security issues prevent its being loaded.
- * @see FTPListParseEngine
- */
- public FTPListParseEngine initiateListParsing(String parserKey, String pathname)
- throws IOException {
- __createParser(parserKey); // create and cache parser
- return initiateListParsing(__entryParser, pathname);
- }
-
- // package access for test purposes
- void __createParser(String parserKey) throws IOException {
- // We cache the value to avoid creation of a new object every
- // time a file listing is generated.
- // Note: we don't check against a null parserKey (NET-544)
- if (__entryParser == null || (parserKey != null && !__entryParserKey.equals(parserKey))) {
- if (null != parserKey) {
- // if a parser key was supplied in the parameters,
- // use that to create the parser
- __entryParser = __parserFactory.createFileEntryParser(parserKey);
- __entryParserKey = parserKey;
- } else {
- // if no parserKey was supplied, check for a configuration
- // in the params, and if it has a non-empty system type, use that.
- if (null != __configuration && __configuration.getServerSystemKey().length() > 0) {
- __entryParser = __parserFactory.createFileEntryParser(__configuration);
- __entryParserKey = __configuration.getServerSystemKey();
- } else {
- // if a parserKey hasn't been supplied, and a configuration
- // hasn't been supplied, and the override property is not set
- // then autodetect by calling
- // the SYST command and use that to choose the parser.
- String systemType = System.getProperty(FTP_SYSTEM_TYPE);
- if (systemType == null) {
- systemType = getSystemType(); // cannot be null
- Properties override = getOverrideProperties();
- if (override != null) {
- String newType = override.getProperty(systemType);
- if (newType != null) {
- systemType = newType;
- }
- }
- }
- if (null != __configuration) { // system type must have been empty above
- __entryParser = __parserFactory.createFileEntryParser(
- new FTPClientConfig(systemType, __configuration));
- } else {
- __entryParser = __parserFactory.createFileEntryParser(systemType);
- }
- __entryParserKey = systemType;
- }
- }
- }
- }
-
- /**
- * private method through which all listFiles() and
- * initiateListParsing methods pass once a parser is determined.
- *
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- * @see FTPListParseEngine
- */
- private FTPListParseEngine initiateListParsing(FTPFileEntryParser parser, String pathname)
- throws IOException {
- Socket socket = _openDataConnection_(FTPCmd.LIST, getListArguments(pathname));
-
- FTPListParseEngine engine = new FTPListParseEngine(parser, __configuration);
- if (socket == null) {
- return engine;
- }
-
- try {
- engine.readServerList(socket.getInputStream(), getControlEncoding());
- } finally {
- Util.closeQuietly(socket);
- }
-
- completePendingCommand();
- return engine;
- }
-
- /**
- * Initiate list parsing for MLSD listings.
- *
- * @return the engine
- * @throws IOException
- */
- private FTPListParseEngine initiateMListParsing(String pathname) throws IOException {
- Socket socket = _openDataConnection_(FTPCmd.MLSD, pathname);
- FTPListParseEngine engine =
- new FTPListParseEngine(MLSxEntryParser.getInstance(), __configuration);
- if (socket == null) {
- return engine;
- }
-
- try {
- engine.readServerList(socket.getInputStream(), getControlEncoding());
- } finally {
- Util.closeQuietly(socket);
- completePendingCommand();
- }
- return engine;
- }
-
- /**
- * @param pathname the initial pathname
- * @return the adjusted string with "-a" added if necessary
- * @since 2.0
- */
- protected String getListArguments(String pathname) {
- if (getListHiddenFiles()) {
- if (pathname != null) {
- StringBuilder sb = new StringBuilder(pathname.length() + 3);
- sb.append("-a ");
- sb.append(pathname);
- return sb.toString();
- } else {
- return "-a";
- }
- }
-
- return pathname;
- }
-
- /**
- * Issue the FTP STAT command to the server.
- *
- * @return The status information returned by the server.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public String getStatus() throws IOException {
- if (FTPReply.isPositiveCompletion(stat())) {
- return getReplyString();
- }
- return null;
- }
-
- /**
- * Issue the FTP STAT command to the server for a given pathname. This
- * should produce a listing of the file or directory.
- *
- * @param pathname the filename
- * @return The status information returned by the server.
- * @throws FTPConnectionClosedException If the FTP server prematurely closes the connection as a
- * result
- * of the client being idle or some other reason causing the server
- * to send FTP reply code 421. This exception may be caught either
- * as an IOException or independently as itself.
- * @throws IOException If an I/O error occurs while either sending a
- * command to the server or receiving a reply from the server.
- */
- public String getStatus(String pathname) throws IOException {
- if (FTPReply.isPositiveCompletion(stat(pathname))) {
- return getReplyString();
- }
- return null;
- }
-
- /**
- * Issue the FTP MDTM command (not supported by all servers) to retrieve the last
- * modification time of a file. The modification string should be in the
- * ISO 3077 form "YYYYMMDDhhmmss(.xxx)?". The timestamp represented should also be in
- * GMT, but not all FTP servers honour this.
- *
- * @param pathname The file path to query.
- * @return A string representing the last file modification time in YYYYMMDDhhmmss
- * format.
- * @throws IOException if an I/O error occurs.
- * @since 2.0
- */
- public String getModificationTime(String pathname) throws IOException {
- if (FTPReply.isPositiveCompletion(mdtm(pathname))) {
- return getReplyStrings()[0].substring(4); // skip the return code (e.g. 213) and the space
- }
- return null;
- }
-
- /**
- * Issue the FTP MDTM command (not supported by all servers) to retrieve the last
- * modification time of a file. The modification string should be in the
- * ISO 3077 form "YYYYMMDDhhmmss(.xxx)?". The timestamp represented should also be in
- * GMT, but not all FTP servers honour this.
- *
- * @param pathname The file path to query.
- * @return A FTPFile representing the last file modification time, may be {@code null}.
- * The FTPFile timestamp will be null if a parse error occurs.
- * @throws IOException if an I/O error occurs.
- * @since 3.4
- */
- public FTPFile mdtmFile(String pathname) throws IOException {
- if (FTPReply.isPositiveCompletion(mdtm(pathname))) {
- String reply =
- getReplyStrings()[0].substring(4); // skip the return code (e.g. 213) and the space
- FTPFile file = new FTPFile();
- file.setName(pathname);
- file.setRawListing(reply);
- file.setTimestamp(MLSxEntryParser.parseGMTdateTime(reply));
- return file;
- }
- return null;
- }
-
- /**
- * Issue the FTP MFMT command (not supported by all servers) which sets the last
- * modified time of a file.
- *
- * The timestamp should be in the form YYYYMMDDhhmmss
. It should also
- * be in GMT, but not all servers honour this.
- *
- * An FTP server would indicate its support of this feature by including "MFMT"
- * in its response to the FEAT command, which may be retrieved by FTPClient.features()
- *
- * @param pathname The file path for which last modified time is to be changed.
- * @param timeval The timestamp to set to, in YYYYMMDDhhmmss
format.
- * @return true if successfully set, false if not
- * @throws IOException if an I/O error occurs.
- * @see http://tools.ietf.org/html/draft-somers-ftp-mfxx-04
- * @since 2.2
- */
- public boolean setModificationTime(String pathname, String timeval) throws IOException {
- return (FTPReply.isPositiveCompletion(mfmt(pathname, timeval)));
- }
-
- /**
- * Set the internal buffer size for buffered data streams.
- *
- * @param bufSize The size of the buffer. Use a non-positive value to use the default.
- */
- public void setBufferSize(int bufSize) {
- __bufferSize = bufSize;
- }
-
- /**
- * Retrieve the current internal buffer size for buffered data streams.
- *
- * @return The current buffer size.
- */
- public int getBufferSize() {
- return __bufferSize;
- }
-
- /**
- * Sets the value to be used for the data socket SO_SNDBUF option.
- * If the value is positive, the option will be set when the data socket has been created.
- *
- * @param bufSize The size of the buffer, zero or negative means the value is ignored.
- * @since 3.3
- */
- public void setSendDataSocketBufferSize(int bufSize) {
- __sendDataSocketBufferSize = bufSize;
- }
-
- /**
- * Retrieve the value to be used for the data socket SO_SNDBUF option.
- *
- * @return The current buffer size.
- * @since 3.3
- */
- public int getSendDataSocketBufferSize() {
- return __sendDataSocketBufferSize;
- }
-
- /**
- * Sets the value to be used for the data socket SO_RCVBUF option.
- * If the value is positive, the option will be set when the data socket has been created.
- *
- * @param bufSize The size of the buffer, zero or negative means the value is ignored.
- * @since 3.3
- */
- public void setReceieveDataSocketBufferSize(int bufSize) {
- __receiveDataSocketBufferSize = bufSize;
- }
-
- /**
- * Retrieve the value to be used for the data socket SO_RCVBUF option.
- *
- * @return The current buffer size.
- * @since 3.3
- */
- public int getReceiveDataSocketBufferSize() {
- return __receiveDataSocketBufferSize;
- }
-
- /**
- * Implementation of the {@link Configurable Configurable} interface.
- * In the case of this class, configuring merely makes the config object available for the
- * factory methods that construct parsers.
- *
- * @param config {@link FTPClientConfig FTPClientConfig} object used to
- * provide non-standard configurations to the parser.
- * @since 1.4
- */
- @Override public void configure(FTPClientConfig config) {
- this.__configuration = config;
- }
-
- /**
- * You can set this to true if you would like to get hidden files when {@link #listFiles} too.
- * A LIST -a
will be issued to the ftp server.
- * It depends on your ftp server if you need to call this method, also dont expect to get rid
- * of hidden files if you call this method with "false".
- *
- * @param listHiddenFiles true if hidden files should be listed
- * @since 2.0
- */
- public void setListHiddenFiles(boolean listHiddenFiles) {
- this.__listHiddenFiles = listHiddenFiles;
- }
-
- /**
- * @return the current state
- * @see #setListHiddenFiles(boolean)
- * @since 2.0
- */
- public boolean getListHiddenFiles() {
- return this.__listHiddenFiles;
- }
-
- /**
- * Whether should attempt to use EPSV with IPv4.
- * Default (if not set) is false
- *
- * @return true if should attempt EPSV
- * @since 2.2
- */
- public boolean isUseEPSVwithIPv4() {
- return __useEPSVwithIPv4;
- }
-
- /**
- * Set whether to use EPSV with IPv4.
- * Might be worth enabling in some circumstances.
- *
- * For example, when using IPv4 with NAT it
- * may work with some rare configurations.
- * E.g. if FTP server has a static PASV address (external network)
- * and the client is coming from another internal network.
- * In that case the data connection after PASV command would fail,
- * while EPSV would make the client succeed by taking just the port.
- *
- * @param selected value to set.
- * @since 2.2
- */
- public void setUseEPSVwithIPv4(boolean selected) {
- this.__useEPSVwithIPv4 = selected;
- }
-
- /**
- * Set the listener to be used when performing store/retrieve operations.
- * The default value (if not set) is {@code null}.
- *
- * @param listener to be used, may be {@code null} to disable
- * @since 3.0
- */
- public void setCopyStreamListener(CopyStreamListener listener) {
- __copyStreamListener = listener;
- }
-
- /**
- * Obtain the currently active listener.
- *
- * @return the listener, may be {@code null}
- * @since 3.0
- */
- public CopyStreamListener getCopyStreamListener() {
- return __copyStreamListener;
- }
-
- /**
- * Set the time to wait between sending control connection keepalive messages
- * when processing file upload or download.
- *
- * @param controlIdle the wait (in secs) between keepalive messages. Zero (or less) disables.
- * @see #setControlKeepAliveReplyTimeout(int)
- * @since 3.0
- */
- public void setControlKeepAliveTimeout(long controlIdle) {
- __controlKeepAliveTimeout = controlIdle * 1000;
- }
-
- /**
- * Get the time to wait between sending control connection keepalive messages.
- *
- * @return the number of seconds between keepalive messages.
- * @since 3.0
- */
- public long getControlKeepAliveTimeout() {
- return __controlKeepAliveTimeout / 1000;
- }
-
- /**
- * Set how long to wait for control keep-alive message replies.
- *
- * @param timeout number of milliseconds to wait (defaults to 1000)
- * @see #setControlKeepAliveTimeout(long)
- * @since 3.0
- */
- public void setControlKeepAliveReplyTimeout(int timeout) {
- __controlKeepAliveReplyTimeout = timeout;
- }
-
- /**
- * Get how long to wait for control keep-alive message replies.
- *
- * @return wait time in msec
- * @since 3.0
- */
- public int getControlKeepAliveReplyTimeout() {
- return __controlKeepAliveReplyTimeout;
- }
-
- /**
- * Enable or disable passive mode NAT workaround.
- * If enabled, a site-local PASV mode reply address will be replaced with the
- * remote host address to which the PASV mode request was sent
- * (unless that is also a site local address).
- * This gets around the problem that some NAT boxes may change the
- * reply.
- *
- * The default is true, i.e. site-local replies are replaced.
- *
- * @param enabled true to enable replacing internal IP's in passive
- * mode.
- * @deprecated (3.6) use {@link #setPassiveNatWorkaroundStrategy(HostnameResolver)} instead
- */
- @Deprecated public void setPassiveNatWorkaround(boolean enabled) {
- if (enabled) {
- this.__passiveNatWorkaroundStrategy = new NatServerResolverImpl(this);
- } else {
- this.__passiveNatWorkaroundStrategy = null;
- }
- }
-
- /**
- * Set the workaround strategy to replace the PASV mode reply addresses.
- * This gets around the problem that some NAT boxes may change the reply.
- *
- * The default implementation is {@code NatServerResolverImpl}, i.e. site-local
- * replies are replaced.
- *
- * @param resolver strategy to replace internal IP's in passive mode
- * or null to disable the workaround (i.e. use PASV mode reply address.)
- * @since 3.6
- */
- public void setPassiveNatWorkaroundStrategy(HostnameResolver resolver) {
- this.__passiveNatWorkaroundStrategy = resolver;
- }
-
- /**
- * Strategy interface for updating host names received from FTP server
- * for passive NAT workaround.
- *
- * @since 3.6
- */
- public static interface HostnameResolver {
- String resolve(String hostname) throws UnknownHostException;
- }
-
- /**
- * Default strategy for passive NAT workaround (site-local
- * replies are replaced.)
- *
- * @since 3.6
- */
- public static class NatServerResolverImpl implements HostnameResolver {
- private FTPClient client;
-
- public NatServerResolverImpl(FTPClient client) {
- this.client = client;
- }
-
- @Override public String resolve(String hostname) throws UnknownHostException {
- String newHostname = hostname;
- InetAddress host = InetAddress.getByName(newHostname);
- // reply is a local address, but target is not - assume NAT box changed the PASV reply
- if (host.isSiteLocalAddress()) {
- InetAddress remote = this.client.getRemoteAddress();
- if (!remote.isSiteLocalAddress()) {
- newHostname = remote.getHostAddress();
- }
- }
- return newHostname;
- }
- }
-
- private OutputStream getBufferedOutputStream(OutputStream outputStream) {
- if (__bufferSize > 0) {
- return new BufferedOutputStream(outputStream, __bufferSize);
- }
- return new BufferedOutputStream(outputStream);
- }
-
- private InputStream getBufferedInputStream(InputStream inputStream) {
- if (__bufferSize > 0) {
- return new BufferedInputStream(inputStream, __bufferSize);
- }
- return new BufferedInputStream(inputStream);
- }
-
- // @since 3.0
- private static class CSL implements CopyStreamListener {
-
- private final FTPClient parent;
- private final long idle;
- private final int currentSoTimeout;
-
- private long time = System.currentTimeMillis();
- private int notAcked;
- private OnFtpInputStreamListener listener;
- private long lTime = time;
-
- CSL(FTPClient parent, long idleTime, int maxWait) throws SocketException {
- this(parent, idleTime, maxWait, null);
- }
-
- CSL(FTPClient parent, long idleTime, int maxWait, OnFtpInputStreamListener listener)
- throws SocketException {
- this.idle = idleTime;
- this.parent = parent;
- this.currentSoTimeout = parent.getSoTimeout();
- parent.setSoTimeout(maxWait);
- this.listener = listener;
- }
-
- @Override public void bytesTransferred(CopyStreamEvent event) {
- bytesTransferred(event.getTotalBytesTransferred(), event.getBytesTransferred(),
- event.getStreamSize());
- }
-
- @Override public void bytesTransferred(long totalBytesTransferred, int bytesTransferred,
- long streamSize) {
- long now = System.currentTimeMillis();
- if (now - time > idle) {
- try {
- parent.__noop();
- } catch (SocketTimeoutException e) {
- notAcked++;
- } catch (IOException e) {
- // Ignored
- }
-
- time = now;
- }
- //if (now - lTime > 100) {
- if (listener != null) {
- listener.onFtpInputStream(parent, totalBytesTransferred, bytesTransferred, streamSize);
- }
- //lTime = now;
- //}
- }
-
- void cleanUp() throws IOException {
- try {
- while (notAcked-- > 0) {
- parent.__getReplyNoReport();
- }
- } finally {
- parent.setSoTimeout(currentSoTimeout);
- }
- }
- }
-
- /**
- * Merge two copystream listeners, either or both of which may be null.
- *
- * @param local the listener used by this class, may be null
- * @return a merged listener or a single listener or null
- * @since 3.0
- */
- private CopyStreamListener __mergeListeners(CopyStreamListener local) {
- if (local == null) {
- return __copyStreamListener;
- }
- if (__copyStreamListener == null) {
- return local;
- }
- // Both are non-null
- CopyStreamAdapter merged = new CopyStreamAdapter();
- merged.addCopyStreamListener(local);
- merged.addCopyStreamListener(__copyStreamListener);
- return merged;
- }
-
- /**
- * Enables or disables automatic server encoding detection (only UTF-8 supported).
- * Examples of use of FTPClientConfig
- * Use cases:
- * You are trying to access a server that
- *
- *
- * MM dd yyyy
MMM d yyyy
date formatting
- *
- * FTPClient f=FTPClient();
- * FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
- * conf.setServerLanguageCode("fr");
- * f.configure(conf);
- * f.connect(server);
- * f.login(username, password);
- * FTPFile[] files = listFiles(directory);
- *
- *
- * FTPClient f=FTPClient();
- * FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
- * conf.setServerLanguageCode("da");
- * conf.setDefaultDateFormat("d MMM yyyy");
- * conf.setRecentDateFormat("d MMM HH:mm");
- * conf.setTimeZoneId("Europe/Copenhagen");
- * f.configure(conf);
- * f.connect(server);
- * f.login(username, password);
- * FTPListParseEngine engine =
- * f.initiateListParsing("com.whatever.YourOwnParser", directory);
- *
- * while (engine.hasNext()) {
- * FTPFile[] files = engine.getNext(25); // "page size" you want
- * //do whatever you want with these files, display them, etc.
- * //expensive FTPFile objects not created until needed.
- * }
- *
- * MMM d yyyy
date formatting
- *
- * FTPClient f=FTPClient();
- * FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_VMS);
- * conf.setShortMonthNames(
- * "jan|feb|mar|apr|ma\u00ED|j\u00FAn|j\u00FAl|\u00e1g\u00FA|sep|okt|n\u00F3v|des");
- * f.configure(conf);
- * f.connect(server);
- * f.login(username, password);
- * FTPFile[] files = listFiles(directory);
- *
- *
- * FTPClient f=FTPClient();
- * FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
- * conf.setTimeZoneId("America/Denver");
- * f.configure(conf);
- * f.connect(server);
- * f.login(username, password);
- * FTPFile[] files = listFiles(directory);
- *
- * Unpaged (whole list) access on a Windows-NT server in a different time zone
- * but which has been configured to use a unix-style listing format.
- *
- * FTPClient f=FTPClient();
- * FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
- * conf.setTimeZoneId("America/Denver");
- * f.configure(conf);
- * f.connect(server);
- * f.login(username, password);
- * FTPFile[] files = listFiles(directory);
- *
- *
- * @see Configurable
- * @see FTPClient
- * @see FTPTimestampParserImpl#configure(FTPClientConfig)
- * @see ConfigurableFTPFileEntryParserImpl
- * @since 1.4
- */
-public class FTPClientConfig {
-
- /**
- * Identifier by which a unix-based ftp server is known throughout
- * the commons-net ftp system.
- */
- public static final String SYST_UNIX = "UNIX";
-
- /**
- * Identifier for alternate UNIX parser; same as {@link #SYST_UNIX} but leading spaces are
- * trimmed from file names. This is to maintain backwards compatibility with
- * the original behaviour of the parser which ignored multiple spaces between the date
- * and the start of the file name.
- *
- * @since 3.4
- */
- public static final String SYST_UNIX_TRIM_LEADING = "UNIX_LTRIM";
-
- /**
- * Identifier by which a vms-based ftp server is known throughout
- * the commons-net ftp system.
- */
- public static final String SYST_VMS = "VMS";
-
- /**
- * Identifier by which a WindowsNT-based ftp server is known throughout
- * the commons-net ftp system.
- */
- public static final String SYST_NT = "WINDOWS";
-
- /**
- * Identifier by which an OS/2-based ftp server is known throughout
- * the commons-net ftp system.
- */
- public static final String SYST_OS2 = "OS/2";
-
- /**
- * Identifier by which an OS/400-based ftp server is known throughout
- * the commons-net ftp system.
- */
- public static final String SYST_OS400 = "OS/400";
-
- /**
- * Identifier by which an AS/400-based ftp server is known throughout
- * the commons-net ftp system.
- */
- public static final String SYST_AS400 = "AS/400";
-
- /**
- * Identifier by which an MVS-based ftp server is known throughout
- * the commons-net ftp system.
- */
- public static final String SYST_MVS = "MVS";
-
- /**
- * Some servers return an "UNKNOWN Type: L8" message
- * in response to the SYST command. We set these to be a Unix-type system.
- * This may happen if the ftpd in question was compiled without system
- * information.
- *
- * NET-230 - Updated to be UPPERCASE so that the check done in
- * createFileEntryParser will succeed.
- *
- * @since 1.5
- */
- public static final String SYST_L8 = "TYPE: L8";
-
- /**
- * Identifier by which an Netware-based ftp server is known throughout
- * the commons-net ftp system.
- *
- * @since 1.5
- */
- public static final String SYST_NETWARE = "NETWARE";
-
- /**
- * Identifier by which a Mac pre OS-X -based ftp server is known throughout
- * the commons-net ftp system.
- *
- * @since 3.1
- */
- // Full string is "MACOS Peter's Server"; the substring below should be enough
- public static final String SYST_MACOS_PETER = "MACOS PETER"; // NET-436
-
- private final String serverSystemKey;
- private String defaultDateFormatStr = null;
- private String recentDateFormatStr = null;
- private boolean lenientFutureDates = true; // NET-407
- private String serverLanguageCode = null;
- private String shortMonthNames = null;
- private String serverTimeZoneId = null;
- private boolean saveUnparseableEntries = false;
-
- /**
- * The main constructor for an FTPClientConfig object
- *
- * @param systemKey key representing system type of the server being
- * connected to. See {@link #getServerSystemKey() serverSystemKey}
- * If set to the empty string, then FTPClient uses the system type returned by the server.
- * However this is not recommended for general use;
- * the correct system type should be set if it is known.
- */
- public FTPClientConfig(String systemKey) {
- this.serverSystemKey = systemKey;
- }
-
- /**
- * Convenience constructor mainly for use in testing.
- * Constructs a UNIX configuration.
- */
- public FTPClientConfig() {
- this(SYST_UNIX);
- }
-
- /**
- * Constructor which allows setting of the format string member fields
- *
- * @param systemKey key representing system type of the server being
- * connected to. See
- * {@link #getServerSystemKey() serverSystemKey}
- * @param defaultDateFormatStr See
- * {@link #setDefaultDateFormatStr(String) defaultDateFormatStr}
- * @param recentDateFormatStr See
- * {@link #setRecentDateFormatStr(String) recentDateFormatStr}
- * @since 3.6
- */
- public FTPClientConfig(String systemKey, String defaultDateFormatStr,
- String recentDateFormatStr) {
- this(systemKey);
- this.defaultDateFormatStr = defaultDateFormatStr;
- this.recentDateFormatStr = recentDateFormatStr;
- }
-
- /**
- * Constructor which allows setting of most member fields
- *
- * @param systemKey key representing system type of the server being
- * connected to. See
- * {@link #getServerSystemKey() serverSystemKey}
- * @param defaultDateFormatStr See
- * {@link #setDefaultDateFormatStr(String) defaultDateFormatStr}
- * @param recentDateFormatStr See
- * {@link #setRecentDateFormatStr(String) recentDateFormatStr}
- * @param serverLanguageCode See
- * {@link #setServerLanguageCode(String) serverLanguageCode}
- * @param shortMonthNames See
- * {@link #setShortMonthNames(String) shortMonthNames}
- * @param serverTimeZoneId See
- * {@link #setServerTimeZoneId(String) serverTimeZoneId}
- */
- public FTPClientConfig(String systemKey, String defaultDateFormatStr, String recentDateFormatStr,
- String serverLanguageCode, String shortMonthNames, String serverTimeZoneId) {
- this(systemKey);
- this.defaultDateFormatStr = defaultDateFormatStr;
- this.recentDateFormatStr = recentDateFormatStr;
- this.serverLanguageCode = serverLanguageCode;
- this.shortMonthNames = shortMonthNames;
- this.serverTimeZoneId = serverTimeZoneId;
- }
-
- /**
- * Constructor which allows setting of all member fields
- *
- * @param systemKey key representing system type of the server being
- * connected to. See
- * {@link #getServerSystemKey() serverSystemKey}
- * @param defaultDateFormatStr See
- * {@link #setDefaultDateFormatStr(String) defaultDateFormatStr}
- * @param recentDateFormatStr See
- * {@link #setRecentDateFormatStr(String) recentDateFormatStr}
- * @param serverLanguageCode See
- * {@link #setServerLanguageCode(String) serverLanguageCode}
- * @param shortMonthNames See
- * {@link #setShortMonthNames(String) shortMonthNames}
- * @param serverTimeZoneId See
- * {@link #setServerTimeZoneId(String) serverTimeZoneId}
- * @param lenientFutureDates See
- * {@link #setLenientFutureDates(boolean) lenientFutureDates}
- * @param saveUnparseableEntries See
- * {@link #setUnparseableEntries(boolean) saveUnparseableEntries}
- */
- public FTPClientConfig(String systemKey, String defaultDateFormatStr, String recentDateFormatStr,
- String serverLanguageCode, String shortMonthNames, String serverTimeZoneId,
- boolean lenientFutureDates, boolean saveUnparseableEntries) {
- this(systemKey);
- this.defaultDateFormatStr = defaultDateFormatStr;
- this.lenientFutureDates = lenientFutureDates;
- this.recentDateFormatStr = recentDateFormatStr;
- this.saveUnparseableEntries = saveUnparseableEntries;
- this.serverLanguageCode = serverLanguageCode;
- this.shortMonthNames = shortMonthNames;
- this.serverTimeZoneId = serverTimeZoneId;
- }
-
- // Copy constructor, intended for use by FTPClient only
- FTPClientConfig(String systemKey, FTPClientConfig config) {
- this.serverSystemKey = systemKey;
- this.defaultDateFormatStr = config.defaultDateFormatStr;
- this.lenientFutureDates = config.lenientFutureDates;
- this.recentDateFormatStr = config.recentDateFormatStr;
- this.saveUnparseableEntries = config.saveUnparseableEntries;
- this.serverLanguageCode = config.serverLanguageCode;
- this.serverTimeZoneId = config.serverTimeZoneId;
- this.shortMonthNames = config.shortMonthNames;
- }
-
- /**
- * Copy constructor
- *
- * @param config source
- * @since 3.6
- */
- public FTPClientConfig(FTPClientConfig config) {
- this.serverSystemKey = config.serverSystemKey;
- this.defaultDateFormatStr = config.defaultDateFormatStr;
- this.lenientFutureDates = config.lenientFutureDates;
- this.recentDateFormatStr = config.recentDateFormatStr;
- this.saveUnparseableEntries = config.saveUnparseableEntries;
- this.serverLanguageCode = config.serverLanguageCode;
- this.serverTimeZoneId = config.serverTimeZoneId;
- this.shortMonthNames = config.shortMonthNames;
- }
-
- private static final MapFTPClientConfig.SYST_*
codes
- * or else the fully qualified class name of a parser implementing both
- * the FTPFileEntryParser
and Configurable
- * interfaces.
- *
- * @return Returns the serverSystemKey property.
- */
- public String getServerSystemKey() {
- return serverSystemKey;
- }
-
- /**
- * getter for the {@link #setDefaultDateFormatStr(String) defaultDateFormatStr}
- * property.
- *
- * @return Returns the defaultDateFormatStr property.
- */
- public String getDefaultDateFormatStr() {
- return defaultDateFormatStr;
- }
-
- /**
- * getter for the {@link #setRecentDateFormatStr(String) recentDateFormatStr} property.
- *
- * @return Returns the recentDateFormatStr property.
- */
-
- public String getRecentDateFormatStr() {
- return recentDateFormatStr;
- }
-
- /**
- * getter for the {@link #setServerTimeZoneId(String) serverTimeZoneId} property.
- *
- * @return Returns the serverTimeZoneId property.
- */
- public String getServerTimeZoneId() {
- return serverTimeZoneId;
- }
-
- /**
- * en_US
locales.
- * java.text.SimpleDateFormat
.
- * property.
- * java.text.SimpleDateFormat
.
- * java.util.TimeZone
to refer to time zones, for example,
- * America/Chicago
or Asia/Rangoon
.
- * "jan|feb|mar|apr|maí|jún|júl|ágú|sep|okt|nóv|des"
.
- * en_US
- * month names will be used. We are supporting here those language
- * codes which, when a java.util.Locale
is constucted
- * using it, and a java.text.SimpleDateFormat
is
- * constructed using that Locale, the array returned by the
- * SimpleDateFormat's getShortMonths()
method consists
- * solely of three 8-bit ASCII character strings. Additionally,
- * languages which do not meet this requirement are included if a
- * common alternative set of short month names is known to be used.
- * This means that users who can tell us of additional such encodings
- * may get them added to the list of supported languages by contacting
- * the Apache Commons Net team.
- * en_US
date format
- * orderings of MMM d yyyy
and MMM d HH:mm
- * and attempting to deduce this automatically here would cause more
- * problems than it would solve. The date format must be changed
- * via the {@link #setDefaultDateFormatStr(String) defaultDateFormatStr} and/or
- * {@link #setRecentDateFormatStr(String) recentDateFormatStr} parameters.
- * Locale.US
- *
- * @param languageCode See {@link #setServerLanguageCode(String) serverLanguageCode}
- * @return a DateFormatSymbols object configured with short month names
- * corresponding to the supplied code, or with month names for
- * Locale.US
if there is no corresponding entry in the internal
- * table.
- */
- public static DateFormatSymbols lookupDateFormatSymbols(String languageCode) {
- Object lang = LANGUAGE_CODE_MAP.get(languageCode);
- if (lang != null) {
- if (lang instanceof Locale) {
- return new DateFormatSymbols((Locale) lang);
- } else if (lang instanceof String) {
- return getDateFormatSymbols((String) lang);
- }
- }
- return new DateFormatSymbols(Locale.US);
- }
-
- /**
- * Returns a DateFormatSymbols object configured with short month names
- * as in the supplied string
- *
- * @param shortmonths This should be as described in
- * {@link #setShortMonthNames(String) shortMonthNames}
- * @return a DateFormatSymbols object configured with short month names
- * as in the supplied string
- */
- public static DateFormatSymbols getDateFormatSymbols(String shortmonths) {
- String[] months = splitShortMonthString(shortmonths);
- DateFormatSymbols dfs = new DateFormatSymbols(Locale.US);
- dfs.setShortMonths(months);
- return dfs;
- }
-
- private static String[] splitShortMonthString(String shortmonths) {
- StringTokenizer st = new StringTokenizer(shortmonths, "|");
- int monthcnt = st.countTokens();
- if (12 != monthcnt) {
- throw new IllegalArgumentException("expecting a pipe-delimited string containing 12 tokens");
- }
- String[] months = new String[13];
- int pos = 0;
- while (st.hasMoreTokens()) {
- months[pos++] = st.nextToken();
- }
- months[pos] = "";
- return months;
- }
-
- /**
- * Returns a Collection of all the language codes currently supported
- * by this class. See {@link #setServerLanguageCode(String) serverLanguageCode}
- * for a functional descrption of language codes within this system.
- *
- * @return a Collection of all the language codes currently supported
- * by this class
- */
- public static CollectionDIRECTORY_TYPE
, false if
- * not.
- ***/
- public boolean isDirectory() {
- return (_type == DIRECTORY_TYPE);
- }
-
- /***
- * Determine if the file is a regular file.
- *
- * @return True if the file is of type FILE_TYPE
, false if
- * not.
- ***/
- public boolean isFile() {
- return (_type == FILE_TYPE);
- }
-
- /***
- * Determine if the file is a symbolic link.
- *
- * @return True if the file is of type UNKNOWN_TYPE
, false if
- * not.
- ***/
- public boolean isSymbolicLink() {
- return (_type == SYMBOLIC_LINK_TYPE);
- }
-
- /***
- * Determine if the type of the file is unknown.
- *
- * @return True if the file is of type UNKNOWN_TYPE
, false if
- * not.
- ***/
- public boolean isUnknown() {
- return (_type == UNKNOWN_TYPE);
- }
-
- /**
- * Used to indicate whether an entry is valid or not.
- * If the entry is invalid, only the {@link #getRawListing()} method will be useful.
- * Other methods may fail.
- *
- * Used in conjunction with list parsing that preseverves entries that failed to parse.
- *
- * @return true if the entry is valid
- * @see FTPClientConfig#setUnparseableEntries(boolean)
- * @since 3.4
- */
- public boolean isValid() {
- return (_permissions != null);
- }
-
- /***
- * Set the type of the file (DIRECTORY_TYPE
,
- * FILE_TYPE
, etc.).
- *
- * @param type The integer code representing the type of the file.
- ***/
- public void setType(int type) {
- _type = type;
- }
-
- /***
- * Return the type of the file (one of the _TYPE
constants),
- * e.g., if it is a directory, a regular file, or a symbolic link.
- *
- * @return The type of the file.
- ***/
- public int getType() {
- return _type;
- }
-
- /***
- * Set the name of the file.
- *
- * @param name The name of the file.
- ***/
- public void setName(String name) {
- _name = name;
- }
-
- /***
- * Return the name of the file.
- *
- * @return The name of the file.
- ***/
- public String getName() {
- return _name;
- }
-
- /**
- * Set the file size in bytes.
- *
- * @param size The file size in bytes.
- */
- public void setSize(long size) {
- _size = size;
- }
-
- /***
- * Return the file size in bytes.
- *
- * @return The file size in bytes.
- ***/
- public long getSize() {
- return _size;
- }
-
- /***
- * Set the number of hard links to this file. This is not to be
- * confused with symbolic links.
- *
- * @param links The number of hard links to this file.
- ***/
- public void setHardLinkCount(int links) {
- _hardLinkCount = links;
- }
-
- /***
- * Return the number of hard links to this file. This is not to be
- * confused with symbolic links.
- *
- * @return The number of hard links to this file.
- ***/
- public int getHardLinkCount() {
- return _hardLinkCount;
- }
-
- /***
- * Set the name of the group owning the file. This may be
- * a string representation of the group number.
- *
- * @param group The name of the group owning the file.
- ***/
- public void setGroup(String group) {
- _group = group;
- }
-
- /***
- * Returns the name of the group owning the file. Sometimes this will be
- * a string representation of the group number.
- *
- * @return The name of the group owning the file.
- ***/
- public String getGroup() {
- return _group;
- }
-
- /***
- * Set the name of the user owning the file. This may be
- * a string representation of the user number;
- *
- * @param user The name of the user owning the file.
- ***/
- public void setUser(String user) {
- _user = user;
- }
-
- /***
- * Returns the name of the user owning the file. Sometimes this will be
- * a string representation of the user number.
- *
- * @return The name of the user owning the file.
- ***/
- public String getUser() {
- return _user;
- }
-
- /***
- * If the FTPFile is a symbolic link, use this method to set the name of the
- * file being pointed to by the symbolic link.
- *
- * @param link The file pointed to by the symbolic link.
- ***/
- public void setLink(String link) {
- _link = link;
- }
-
- /***
- * If the FTPFile is a symbolic link, this method returns the name of the
- * file being pointed to by the symbolic link. Otherwise it returns null.
- *
- * @return The file pointed to by the symbolic link (null if the FTPFile
- * is not a symbolic link).
- ***/
- public String getLink() {
- return _link;
- }
-
- /***
- * Set the file timestamp. This usually the last modification time.
- * The parameter is not cloned, so do not alter its value after calling
- * this method.
- *
- * @param date A Calendar instance representing the file timestamp.
- ***/
- public void setTimestamp(Calendar date) {
- _date = date;
- }
-
- /***
- * Returns the file timestamp. This usually the last modification time.
- *
- * @return A Calendar instance representing the file timestamp.
- ***/
- public Calendar getTimestamp() {
- return _date;
- }
-
- /***
- * Set if the given access group (one of the _ACCESS
- * constants) has the given access permission (one of the
- * _PERMISSION
constants) to the file.
- *
- * @param access The access group (one of the _ACCESS
- * constants)
- * @param permission The access permission (one of the
- * _PERMISSION
constants)
- * @param value True if permission is allowed, false if not.
- * @throws ArrayIndexOutOfBoundsException if either of the parameters is out of range
- ***/
- public void setPermission(int access, int permission, boolean value) {
- _permissions[access][permission] = value;
- }
-
- /***
- * Determines if the given access group (one of the _ACCESS
- * constants) has the given access permission (one of the
- * _PERMISSION
constants) to the file.
- *
- * @param access The access group (one of the _ACCESS
- * constants)
- * @param permission The access permission (one of the
- * _PERMISSION
constants)
- * @throws ArrayIndexOutOfBoundsException if either of the parameters is out of range
- * @return true if {@link #isValid()} is {@code true &&} the associated permission is set;
- * {@code false} otherwise.
- ***/
- public boolean hasPermission(int access, int permission) {
- if (_permissions == null) {
- return false;
- }
- return _permissions[access][permission];
- }
-
- /***
- * Returns a string representation of the FTPFile information.
- *
- * @return A string representation of the FTPFile information.
- */
- @Override public String toString() {
- return getRawListing();
- }
-
- /***
- * Returns a string representation of the FTPFile information.
- * This currently mimics the Unix listing format.
- * This method uses the timezone of the Calendar entry, which is
- * the server time zone (if one was provided) otherwise it is
- * the local time zone.
- * FTPClient.listFiles()
- * API to pull the whole list from the subfolder subfolder
in
- * one call, attempting to automatically detect the parser type. This
- * method, without a parserKey parameter, indicates that autodection should
- * be used.
- *
- *
- * FTPClient f=FTPClient();
- * f.connect(server);
- * f.login(username, password);
- * FTPFile[] files = f.listFiles("subfolder");
- *
- *
- * The second example uses the FTPClient.listFiles()
- * API to pull the whole list from the current working directory in one call,
- * but specifying by classname the parser to be used. For this particular
- * parser class, this approach is necessary since there is no way to
- * autodetect this server type.
- *
- *
- * FTPClient f=FTPClient();
- * f.connect(server);
- * f.login(username, password);
- * FTPFile[] files = f.listFiles(
- * "org.apache.commons.net.ftp.parser.EnterpriseUnixFTPFileEntryParser",
- * ".");
- *
- *
- * The third example uses the FTPClient.listFiles()
- * API to pull a single file listing in an arbitrary directory in one call,
- * specifying by KEY the parser to be used, in this case, VMS.
- *
- *
- * FTPClient f=FTPClient();
- * f.connect(server);
- * f.login(username, password);
- * FTPFile[] files = f.listFiles("VMS", "subfolder/foo.java");
- *
- *
- * For an alternative approach, see the {@link FTPListParseEngine} class
- * which provides iterative access.
- *
- * @version $Id: FTPFileEntryParser.java 1747119 2016-06-07 02:22:24Z ggregory $
- * @see FTPFile
- * @see FTPClient#listFiles()
- */
-public interface FTPFileEntryParser {
- /**
- * Parses a line of an FTP server file listing and converts it into a usable
- * format in the form of an FTPFile
instance. If the
- * file listing line doesn't describe a file, null
should be
- * returned, otherwise a FTPFile
instance representing the
- * files in the directory is returned.
- *
- * @param listEntry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- FTPFile parseFTPEntry(String listEntry);
-
- /**
- * Reads the next entry using the supplied BufferedReader object up to
- * whatever delemits one entry from the next. Implementors must define
- * this for the particular ftp system being parsed. In many but not all
- * cases, this can be defined simply by calling BufferedReader.readLine().
- *
- * @param reader The BufferedReader object from which entries are to be
- * read.
- * @return A string representing the next ftp entry or null if none found.
- * @throws IOException thrown on any IO Error reading from the reader.
- */
- String readNextEntry(BufferedReader reader) throws IOException;
-
- /**
- * This method is a hook for those implementors (such as
- * VMSVersioningFTPEntryParser, and possibly others) which need to
- * perform some action upon the FTPFileList after it has been created
- * from the server stream, but before any clients see the list.
- *
- * The default implementation can be a no-op.
- *
- * @param original Original list after it has been created from the server stream
- * @return Original list as processed by this method.
- */
- Listoriginal
unmodified.
- */
- @Override public Listnull
.
- * @return true
if the file is to be included, false
otherwise
- */
- public boolean accept(FTPFile file);
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilters.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilters.java
deleted file mode 100644
index 40a59a99..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPFileFilters.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-/**
- * Implements some simple FTPFileFilter classes.
- *
- * @since 2.2
- */
-public class FTPFileFilters {
-
- /**
- * Accepts all FTPFile entries, including null.
- */
- public static final FTPFileFilter ALL = new FTPFileFilter() {
- @Override public boolean accept(FTPFile file) {
- return true;
- }
- };
-
- /**
- * Accepts all non-null FTPFile entries.
- */
- public static final FTPFileFilter NON_NULL = new FTPFileFilter() {
- @Override public boolean accept(FTPFile file) {
- return file != null;
- }
- };
-
- /**
- * Accepts all (non-null) FTPFile directory entries.
- */
- public static final FTPFileFilter DIRECTORIES = new FTPFileFilter() {
- @Override public boolean accept(FTPFile file) {
- return file != null && file.isDirectory();
- }
- };
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPHTTPClient.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPHTTPClient.java
deleted file mode 100644
index 0304e427..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/FTPHTTPClient.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.net.Inet6Address;
-import java.net.Socket;
-import java.net.SocketException;
-import java.util.ArrayList;
-import java.util.List;
-
-import aria.apache.commons.net.util.Base64;
-
-/**
- * Experimental attempt at FTP client that tunnels over an HTTP proxy connection.
- *
- * @since 2.2
- */
-public class FTPHTTPClient extends FTPClient {
- private final String proxyHost;
- private final int proxyPort;
- private final String proxyUsername;
- private final String proxyPassword;
-
- private static final byte[] CRLF = { '\r', '\n' };
- private final Base64 base64 = new Base64();
-
- private String tunnelHost; // Save the host when setting up a tunnel (needed for EPSV)
-
- public FTPHTTPClient(String proxyHost, int proxyPort, String proxyUser, String proxyPass) {
- this.proxyHost = proxyHost;
- this.proxyPort = proxyPort;
- this.proxyUsername = proxyUser;
- this.proxyPassword = proxyPass;
- this.tunnelHost = null;
- }
-
- public FTPHTTPClient(String proxyHost, int proxyPort) {
- this(proxyHost, proxyPort, null, null);
- }
-
- /**
- * {@inheritDoc}
- *
- * @throws IllegalStateException if connection mode is not passive
- * @deprecated (3.3) Use {@link FTPClient#_openDataConnection_(FTPCmd, String)} instead
- */
- // Kept to maintain binary compatibility
- // Not strictly necessary, but Clirr complains even though there is a super-impl
- @Override @Deprecated protected Socket _openDataConnection_(int command, String arg)
- throws IOException {
- return super._openDataConnection_(command, arg);
- }
-
- /**
- * {@inheritDoc}
- *
- * @throws IllegalStateException if connection mode is not passive
- * @since 3.1
- */
- @Override protected Socket _openDataConnection_(String command, String arg) throws IOException {
- //Force local passive mode, active mode not supported by through proxy
- if (getDataConnectionMode() != PASSIVE_LOCAL_DATA_CONNECTION_MODE) {
- throw new IllegalStateException("Only passive connection mode supported");
- }
-
- final boolean isInet6Address = getRemoteAddress() instanceof Inet6Address;
- String passiveHost = null;
-
- boolean attemptEPSV = isUseEPSVwithIPv4() || isInet6Address;
- if (attemptEPSV && epsv() == FTPReply.ENTERING_EPSV_MODE) {
- _parseExtendedPassiveModeReply(_replyLines.get(0));
- passiveHost = this.tunnelHost;
- } else {
- if (isInet6Address) {
- return null; // Must use EPSV for IPV6
- }
- // If EPSV failed on IPV4, revert to PASV
- if (pasv() != FTPReply.ENTERING_PASSIVE_MODE) {
- return null;
- }
- _parsePassiveModeReply(_replyLines.get(0));
- passiveHost = this.getPassiveHost();
- }
-
- Socket socket = _socketFactory_.createSocket(proxyHost, proxyPort);
- InputStream is = socket.getInputStream();
- OutputStream os = socket.getOutputStream();
- tunnelHandshake(passiveHost, this.getPassivePort(), is, os);
- if ((getRestartOffset() > 0) && !restart(getRestartOffset())) {
- socket.close();
- return null;
- }
-
- if (!FTPReply.isPositivePreliminary(sendCommand(command, arg))) {
- socket.close();
- return null;
- }
-
- return socket;
- }
-
- @Override public void connect(String host, int port) throws SocketException, IOException {
-
- _socket_ = _socketFactory_.createSocket(proxyHost, proxyPort);
- _input_ = _socket_.getInputStream();
- _output_ = _socket_.getOutputStream();
- Reader socketIsReader;
- try {
- socketIsReader = tunnelHandshake(host, port, _input_, _output_);
- } catch (Exception e) {
- IOException ioe = new IOException("Could not connect to " + host + " using port " + port);
- ioe.initCause(e);
- throw ioe;
- }
- super._connectAction_(socketIsReader);
- }
-
- private BufferedReader tunnelHandshake(String host, int port, InputStream input,
- OutputStream output) throws IOException, UnsupportedEncodingException {
- final String connectString = "CONNECT " + host + ":" + port + " HTTP/1.1";
- final String hostString = "Host: " + host + ":" + port;
-
- this.tunnelHost = host;
- output.write(connectString.getBytes("UTF-8")); // TODO what is the correct encoding?
- output.write(CRLF);
- output.write(hostString.getBytes("UTF-8"));
- output.write(CRLF);
-
- if (proxyUsername != null && proxyPassword != null) {
- final String auth = proxyUsername + ":" + proxyPassword;
- final String header =
- "Proxy-Authorization: Basic " + base64.encodeToString(auth.getBytes("UTF-8"));
- output.write(header.getBytes("UTF-8"));
- }
- output.write(CRLF);
-
- ListreadNextEntry()
- which handles the issue of
- * what delimits one entry from another, usually but not always a line
- * feed and preParse()
- which handles removal of
- * extraneous matter such as the preliminary lines of a listing, removal
- * of duplicates on versioning systems, etc.
- * getNext()
and
- * getPrevious()
methods to provide "paged" output of less
- * than the whole list at one time, or by calling the
- * getFiles()
method to return the entire list.
- *
- * FTPClient f=FTPClient();
- * f.connect(server);
- * f.login(username, password);
- * FTPListParseEngine engine = f.initiateListParsing(directory);
- *
- * while (engine.hasNext()) {
- * FTPFile[] files = engine.getNext(25); // "page size" you want
- * //do whatever you want with these files, display them, etc.
- * //expensive FTPFile objects not created until needed.
- * }
- *
- * entries
list.
- * After this method has completed, entries
will contain a
- * collection of entries (as defined by
- * FTPFileEntryParser.readNextEntry()
), but this may contain
- * various non-entry preliminary lines from the server output, duplicates,
- * and other data that will not be part of the final listing.
- *
- * @param stream The socket stream on which the input will be read.
- * @param encoding The encoding to use.
- * @throws IOException thrown on any failure to read the stream
- */
- private void readStream(InputStream stream, String encoding) throws IOException {
- BufferedReader reader =
- new BufferedReader(new InputStreamReader(stream, Charsets.toCharset(encoding)));
-
- String line = this.parser.readNextEntry(reader);
-
- while (line != null) {
- this.entries.add(line);
- line = this.parser.readNextEntry(reader);
- }
- reader.close();
- }
-
- /**
- * Returns an array of at most quantityRequested
FTPFile
- * objects starting at this object's internal iterator's current position.
- * If fewer than quantityRequested
such
- * elements are available, the returned array will have a length equal
- * to the number of entries at and after after the current position.
- * If no such entries are found, this array will have a length of 0.
- *
- * After this method is called this object's internal iterator is advanced
- * by a number of positions equal to the size of the array returned.
- *
- * @param quantityRequested the maximum number of entries we want to get.
- * @return an array of at most quantityRequested
FTPFile
- * objects starting at the current position of this iterator within its
- * list and at least the number of elements which exist in the list at
- * and after its current position.
- * quantityRequested
FTPFile
- * objects starting at this object's internal iterator's current position,
- * and working back toward the beginning.
- *
- * If fewer than quantityRequested
such
- * elements are available, the returned array will have a length equal
- * to the number of entries at and after after the current position.
- * If no such entries are found, this array will have a length of 0.
- *
- * After this method is called this object's internal iterator is moved
- * back by a number of positions equal to the size of the array returned.
- *
- * @param quantityRequested the maximum number of entries we want to get.
- * @return an array of at most quantityRequested
FTPFile
- * objects starting at the current position of this iterator within its
- * list and at least the number of elements which exist in the list at
- * and after its current position. This array will be in the same order
- * as the underlying list (not reversed).
- * null
.
- * @return an array of FTPFile objects containing the whole list of
- * files returned by the server as read by this object's parser.
- * null
- */
- public String[] getEnabledCipherSuites() {
- if (_socket_ instanceof SSLSocket) {
- return ((SSLSocket) _socket_).getEnabledCipherSuites();
- }
- return null;
- }
-
- /**
- * Controls which particular protocol versions are enabled for use on this
- * connection. I perform setting before a server negotiation.
- *
- * @param protocolVersions The protocol versions.
- */
- public void setEnabledProtocols(String[] protocolVersions) {
- protocols = new String[protocolVersions.length];
- System.arraycopy(protocolVersions, 0, protocols, 0, protocolVersions.length);
- }
-
- /**
- * Returns the names of the protocol versions which are currently
- * enabled for use on this connection.
- * When the underlying {@link Socket} is not an {@link SSLSocket} instance, returns null.
- *
- * @return An array of protocols, or null
- */
- public String[] getEnabledProtocols() {
- if (_socket_ instanceof SSLSocket) {
- return ((SSLSocket) _socket_).getEnabledProtocols();
- }
- return null;
- }
-
- /**
- * PBSZ command. pbsz value: 0 to (2^32)-1 decimal integer.
- *
- * @param pbsz Protection Buffer Size.
- * @throws SSLException If the server reply code does not equal "200".
- * @throws IOException If an I/O error occurs while sending
- * the command.
- * @see #parsePBSZ(long)
- */
- public void execPBSZ(long pbsz) throws SSLException, IOException {
- if (pbsz < 0 || 4294967295L < pbsz) { // 32-bit unsigned number
- throw new IllegalArgumentException();
- }
- int status = sendCommand(CMD_PBSZ, String.valueOf(pbsz));
- if (FTPReply.COMMAND_OK != status) {
- throw new SSLException(getReplyString());
- }
- }
-
- /**
- * PBSZ command. pbsz value: 0 to (2^32)-1 decimal integer.
- * Issues the command and parses the response to return the negotiated value.
- *
- * @param pbsz Protection Buffer Size.
- * @return the negotiated value.
- * @throws SSLException If the server reply code does not equal "200".
- * @throws IOException If an I/O error occurs while sending
- * the command.
- * @see #execPBSZ(long)
- * @since 3.0
- */
- public long parsePBSZ(long pbsz) throws SSLException, IOException {
- execPBSZ(pbsz);
- long minvalue = pbsz;
- String remainder = extractPrefixedData("PBSZ=", getReplyString());
- if (remainder != null) {
- long replysz = Long.parseLong(remainder);
- if (replysz < minvalue) {
- minvalue = replysz;
- }
- }
- return minvalue;
- }
-
- /**
- * PROT command.
- *
- *
- * N.B. the method calls
- * {@link #setSocketFactory(javax.net.SocketFactory)} and
- * {@link #setServerSocketFactory(javax.net.ServerSocketFactory)}
- *
- * @param prot Data Channel Protection Level, if {@code null}, use {@link #DEFAULT_PROT}.
- * @throws SSLException If the server reply code does not equal {@code 200}.
- * @throws IOException If an I/O error occurs while sending
- * the command.
- */
- public void execPROT(String prot) throws SSLException, IOException {
- if (prot == null) {
- prot = DEFAULT_PROT;
- }
- if (!checkPROTValue(prot)) {
- throw new IllegalArgumentException();
- }
- if (FTPReply.COMMAND_OK != sendCommand(CMD_PROT, prot)) {
- throw new SSLException(getReplyString());
- }
- if (DEFAULT_PROT.equals(prot)) {
- setSocketFactory(null);
- setServerSocketFactory(null);
- } else {
- setSocketFactory(new FTPSSocketFactory(context));
- setServerSocketFactory(new FTPSServerSocketFactory(context));
- initSslContext();
- }
- }
-
- /**
- * Check the value that can be set in PROT Command value.
- *
- * @param prot Data Channel Protection Level.
- * @return True - A set point is right / False - A set point is not right
- */
- private boolean checkPROTValue(String prot) {
- for (String element : PROT_COMMAND_VALUE) {
- if (element.equals(prot)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Send an FTP command.
- * A successful CCC (Clear Command Channel) command causes the underlying {@link SSLSocket}
- * instance to be assigned to a plain {@link Socket}
- *
- * @param command The FTP command.
- * @return server reply.
- * @throws IOException If an I/O error occurs while sending the command.
- * @throws SSLException if a CCC command fails
- * @see FTP#sendCommand(String)
- */
- // Would like to remove this method, but that will break any existing clients that are using CCC
- @Override public int sendCommand(String command, String args) throws IOException {
- int repCode = super.sendCommand(command, args);
- /* If CCC is issued, restore socket i/o streams to unsecured versions */
- if (CMD_CCC.equals(command)) {
- if (FTPReply.COMMAND_OK == repCode) {
- _socket_.close();
- _socket_ = plainSocket;
- _controlInput_ = new BufferedReader(
- new InputStreamReader(_socket_.getInputStream(), getControlEncoding()));
- _controlOutput_ = new BufferedWriter(
- new OutputStreamWriter(_socket_.getOutputStream(), getControlEncoding()));
- } else {
- throw new SSLException(getReplyString());
- }
- }
- return repCode;
- }
-
- /**
- * Returns a socket of the data connection.
- * Wrapped as an {@link SSLSocket}, which carries out handshake processing.
- *
- * @param command The int representation of the FTP command to send.
- * @param arg The arguments to the FTP command.
- * If this parameter is set to null, then the command is sent with
- * no arguments.
- * @return corresponding to the established data connection.
- * Null is returned if an FTP protocol error is reported at any point
- * during the establishment and initialization of the connection.
- * @throws IOException If there is any problem with the connection.
- * @see FTPClient#_openDataConnection_(int, String)
- * @deprecated (3.3) Use {@link FTPClient#_openDataConnection_(FTPCmd, String)} instead
- */
- @Override
- // Strictly speaking this is not needed, but it works round a Clirr bug
- // So rather than invoke the parent code, we do it here
- @Deprecated protected Socket _openDataConnection_(int command, String arg) throws IOException {
- return _openDataConnection_(FTPCommand.getCommand(command), arg);
- }
-
- /**
- * Returns a socket of the data connection.
- * Wrapped as an {@link SSLSocket}, which carries out handshake processing.
- *
- * @param command The textual representation of the FTP command to send.
- * @param arg The arguments to the FTP command.
- * If this parameter is set to null, then the command is sent with
- * no arguments.
- * @return corresponding to the established data connection.
- * Null is returned if an FTP protocol error is reported at any point
- * during the establishment and initialization of the connection.
- * @throws IOException If there is any problem with the connection.
- * @see FTPClient#_openDataConnection_(int, String)
- * @since 3.2
- */
- @Override protected Socket _openDataConnection_(String command, String arg) throws IOException {
- Socket socket = super._openDataConnection_(command, arg);
- _prepareDataSocket_(socket);
- if (socket instanceof SSLSocket) {
- SSLSocket sslSocket = (SSLSocket) socket;
-
- sslSocket.setUseClientMode(isClientMode);
- sslSocket.setEnableSessionCreation(isCreation);
-
- // server mode
- if (!isClientMode) {
- sslSocket.setNeedClientAuth(isNeedClientAuth);
- sslSocket.setWantClientAuth(isWantClientAuth);
- }
- if (suites != null) {
- sslSocket.setEnabledCipherSuites(suites);
- }
- if (protocols != null) {
- sslSocket.setEnabledProtocols(protocols);
- }
- sslSocket.startHandshake();
- }
-
- return socket;
- }
-
- /**
- * Performs any custom initialization for a newly created SSLSocket (before
- * the SSL handshake happens).
- * Called by {@link #_openDataConnection_(int, String)} immediately
- * after creating the socket.
- * The default implementation is a no-op
- *
- * @param socket the socket to set up
- * @throws IOException on error
- * @since 3.1
- */
- protected void _prepareDataSocket_(Socket socket) throws IOException {
- }
-
- /**
- * Get the currently configured {@link TrustManager}.
- *
- * @return A TrustManager instance.
- */
- public TrustManager getTrustManager() {
- return trustManager;
- }
-
- /**
- * Override the default {@link TrustManager} to use; if set to {@code null},
- * the default TrustManager from the JVM will be used.
- *
- * @param trustManager The TrustManager implementation to set, may be {@code null}
- * @see TrustManagerUtils
- */
- public void setTrustManager(TrustManager trustManager) {
- this.trustManager = trustManager;
- }
-
- /**
- * Get the currently configured {@link HostnameVerifier}.
- * The verifier is only used on client mode connections.
- *
- * @return A HostnameVerifier instance.
- * @since 3.4
- */
- public HostnameVerifier getHostnameVerifier() {
- return hostnameVerifier;
- }
-
- /**
- * Override the default {@link HostnameVerifier} to use.
- * The verifier is only used on client mode connections.
- *
- * @param newHostnameVerifier The HostnameVerifier implementation to set or null
to
- * disable.
- * @since 3.4
- */
- public void setHostnameVerifier(HostnameVerifier newHostnameVerifier) {
- hostnameVerifier = newHostnameVerifier;
- }
-
- /**
- * Return whether or not endpoint identification using the HTTPS algorithm
- * on Java 1.7+ is enabled. The default behaviour is for this to be disabled.
- *
- * This check is only performed on client mode connections.
- *
- * @return True if enabled, false if not.
- * @since 3.4
- */
- public boolean isEndpointCheckingEnabled() {
- return tlsEndpointChecking;
- }
-
- /**
- * Automatic endpoint identification checking using the HTTPS algorithm
- * is supported on Java 1.7+. The default behaviour is for this to be disabled.
- *
- * This check is only performed on client mode connections.
- *
- * @param enable Enable automatic endpoint identification checking using the HTTPS algorithm on
- * Java 1.7+.
- * @since 3.4
- */
- public void setEndpointCheckingEnabled(boolean enable) {
- tlsEndpointChecking = enable;
- }
-
- /**
- * Closes the connection to the FTP server and restores
- * connection parameters to the default values.
- * timestampParser
for extracting the timestamp.
- * @return a java.util.Calendar
containing results of the
- * timestamp parse.
- * @throws ParseException on parse error
- */
- public Calendar parseTimestamp(String timestampStr) throws ParseException {
- return this.timestampParser.parseTimestamp(timestampStr);
- }
-
- /**
- * Implementation of the {@link Configurable Configurable}
- * interface. Configures this parser by delegating to the
- * underlying Configurable FTPTimestampParser implementation, '
- * passing it the supplied {@link FTPClientConfig FTPClientConfig}
- * if that is non-null or a default configuration defined by
- * each concrete subclass.
- *
- * @param config the configuration to be used to configure this parser.
- * If it is null, a default configuration defined by
- * each concrete subclass is used instead.
- */
- @Override public void configure(FTPClientConfig config) {
- if (this.timestampParser instanceof Configurable) {
- FTPClientConfig defaultCfg = getDefaultConfiguration();
- if (config != null) {
- if (null == config.getDefaultDateFormatStr()) {
- config.setDefaultDateFormatStr(defaultCfg.getDefaultDateFormatStr());
- }
- if (null == config.getRecentDateFormatStr()) {
- config.setRecentDateFormatStr(defaultCfg.getRecentDateFormatStr());
- }
- ((Configurable) this.timestampParser).configure(config);
- } else {
- ((Configurable) this.timestampParser).configure(defaultCfg);
- }
- }
- }
-
- /**
- * Each concrete subclass must define this member to create
- * a default configuration to be used when that subclass is
- * instantiated without a {@link FTPClientConfig FTPClientConfig}
- * parameter being specified.
- *
- * @return the default configuration for the subclass.
- */
- protected abstract FTPClientConfig getDefaultConfiguration();
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java
deleted file mode 100644
index cc499c71..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/DefaultFTPFileEntryParserFactory.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.Configurable;
-import aria.apache.commons.net.ftp.FTPClient;
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import aria.apache.commons.net.ftp.FTPFileEntryParser;
-import java.util.regex.Pattern;
-
-/**
- * This is the default implementation of the
- * FTPFileEntryParserFactory interface. This is the
- * implementation that will be used by
- * FTPClient.listFiles()
- * if no other implementation has been specified.
- *
- * @see FTPClient#listFiles
- * @see FTPClient#setParserFactory
- */
-public class DefaultFTPFileEntryParserFactory implements FTPFileEntryParserFactory {
-
- // Match a plain Java Identifier
- private static final String JAVA_IDENTIFIER =
- "\\p{javaJavaIdentifierStart}(\\p{javaJavaIdentifierPart})*";
- // Match a qualified name, e.g. a.b.c.Name - but don't allow the default package as that would allow "VMS"/"UNIX" etc.
- private static final String JAVA_QUALIFIED_NAME =
- "(" + JAVA_IDENTIFIER + "\\.)+" + JAVA_IDENTIFIER;
- // Create the pattern, as it will be reused many times
- private static final Pattern JAVA_QUALIFIED_NAME_PATTERN = Pattern.compile(JAVA_QUALIFIED_NAME);
-
- /**
- * This default implementation of the FTPFileEntryParserFactory
- * interface works according to the following logic:
- * First it attempts to interpret the supplied key as a fully
- * qualified classname (default package is not allowed) of a class implementing the
- * FTPFileEntryParser interface. If that succeeds, a parser
- * object of this class is instantiated and is returned;
- * otherwise it attempts to interpret the key as an identirier
- * commonly used by the FTP SYST command to identify systems.
- * key
is not recognized as a fully qualified
- * classname known to the system, this method will then attempt
- * to see whether it contains a string identifying one of
- * the known parsers. This comparison is case-insensitive.
- * The intent here is where possible, to select as keys strings
- * which are returned by the SYST command on the systems which
- * the corresponding parser successfully parses. This enables
- * this factory to be used in the auto-detection system.
- *
- * @param key should be a fully qualified classname corresponding to
- * a class implementing the FTPFileEntryParser interface
- * OR
- * a string containing (case-insensitively) one of the
- * following keywords:
- *
- *
- * @return the FTPFileEntryParser corresponding to the supplied key.
- * @throws ParserInitializationException thrown if for any reason the factory cannot resolve
- * the supplied key into an FTPFileEntryParser.
- * @see FTPFileEntryParser
- */
- @Override public FTPFileEntryParser createFileEntryParser(String key) {
- if (key == null) {
- throw new ParserInitializationException("Parser key cannot be null");
- }
- return createFileEntryParser(key, null);
- }
-
- // Common method to process both key and config parameters.
- private FTPFileEntryParser createFileEntryParser(String key, FTPClientConfig config) {
- FTPFileEntryParser parser = null;
-
- // Is the key a possible class name?
- if (JAVA_QUALIFIED_NAME_PATTERN.matcher(key).matches()) {
- try {
- Class> parserClass = Class.forName(key);
- try {
- parser = (FTPFileEntryParser) parserClass.newInstance();
- } catch (ClassCastException e) {
- throw new ParserInitializationException(parserClass.getName()
- + " does not implement the interface "
- + "FTPFileEntryParser.", e);
- } catch (Exception e) {
- throw new ParserInitializationException("Error initializing parser", e);
- } catch (ExceptionInInitializerError e) {
- throw new ParserInitializationException("Error initializing parser", e);
- }
- } catch (ClassNotFoundException e) {
- // OK, assume it is an alias
- }
- }
-
- if (parser == null) { // Now try for aliases
- String ukey = key.toUpperCase(java.util.Locale.ENGLISH);
- if (ukey.indexOf(FTPClientConfig.SYST_UNIX_TRIM_LEADING) >= 0) {
- parser = new UnixFTPEntryParser(config, true);
- }
- // must check this after SYST_UNIX_TRIM_LEADING as it is a substring of it
- else if (ukey.indexOf(FTPClientConfig.SYST_UNIX) >= 0) {
- parser = new UnixFTPEntryParser(config, false);
- } else if (ukey.indexOf(FTPClientConfig.SYST_VMS) >= 0) {
- parser = new VMSVersioningFTPEntryParser(config);
- } else if (ukey.indexOf(FTPClientConfig.SYST_NT) >= 0) {
- parser = createNTFTPEntryParser(config);
- } else if (ukey.indexOf(FTPClientConfig.SYST_OS2) >= 0) {
- parser = new OS2FTPEntryParser(config);
- } else if (ukey.indexOf(FTPClientConfig.SYST_OS400) >= 0
- || ukey.indexOf(FTPClientConfig.SYST_AS400) >= 0) {
- parser = createOS400FTPEntryParser(config);
- } else if (ukey.indexOf(FTPClientConfig.SYST_MVS) >= 0) {
- parser = new MVSFTPEntryParser(); // Does not currently support config parameter
- } else if (ukey.indexOf(FTPClientConfig.SYST_NETWARE) >= 0) {
- parser = new NetwareFTPEntryParser(config);
- } else if (ukey.indexOf(FTPClientConfig.SYST_MACOS_PETER) >= 0) {
- parser = new MacOsPeterFTPEntryParser(config);
- } else if (ukey.indexOf(FTPClientConfig.SYST_L8) >= 0) {
- // L8 normally means Unix, but move it to the end for some L8 systems that aren't.
- // This check should be last!
- parser = new UnixFTPEntryParser(config);
- } else {
- throw new ParserInitializationException("Unknown parser type: " + key);
- }
- }
-
- if (parser instanceof Configurable) {
- ((Configurable) parser).configure(config);
- }
- return parser;
- }
-
- /**
- * FTPFile
instance. If
- * the file listing line doesn't describe a file, null
is
- * returned, otherwise a FTPFile
instance representing the
- * files in the directory is returned.
- *
- * @param entry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- @Override public FTPFile parseFTPEntry(String entry) {
-
- FTPFile file = new FTPFile();
- file.setRawListing(entry);
-
- if (matches(entry)) {
- String usr = group(14);
- String grp = group(15);
- String filesize = group(16);
- String mo = group(17);
- String da = group(18);
- String yr = group(20);
- String hr = group(21);
- String min = group(22);
- String name = group(23);
-
- file.setType(FTPFile.FILE_TYPE);
- file.setUser(usr);
- file.setGroup(grp);
- try {
- file.setSize(Long.parseLong(filesize));
- } catch (NumberFormatException e) {
- // intentionally do nothing
- }
-
- Calendar cal = Calendar.getInstance();
- cal.set(Calendar.MILLISECOND, 0);
- cal.set(Calendar.SECOND, 0);
- cal.set(Calendar.MINUTE, 0);
- cal.set(Calendar.HOUR_OF_DAY, 0);
-
- int pos = MONTHS.indexOf(mo);
- int month = pos / 4;
- final int missingUnit; // the first missing unit
- try {
-
- if (yr != null) {
- // it's a year; there are no hours and minutes
- cal.set(Calendar.YEAR, Integer.parseInt(yr));
- missingUnit = Calendar.HOUR_OF_DAY;
- } else {
- // it must be hour/minute or we wouldn't have matched
- missingUnit = Calendar.SECOND;
- int year = cal.get(Calendar.YEAR);
-
- // if the month we're reading is greater than now, it must
- // be last year
- if (cal.get(Calendar.MONTH) < month) {
- year--;
- }
- cal.set(Calendar.YEAR, year);
- cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hr));
- cal.set(Calendar.MINUTE, Integer.parseInt(min));
- }
- cal.set(Calendar.MONTH, month);
- cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(da));
- cal.clear(missingUnit);
- file.setTimestamp(cal);
- } catch (NumberFormatException e) {
- // do nothing, date will be uninitialized
- }
- file.setName(name);
-
- return file;
- }
- return null;
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java
deleted file mode 100644
index 2e3c84e0..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPFileEntryParserFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import aria.apache.commons.net.ftp.FTPFileEntryParser;
-
-/**
- * The interface describes a factory for creating FTPFileEntryParsers.
- *
- * @since 1.2
- */
-public interface FTPFileEntryParserFactory {
- /**
- * Implementation should be a method that decodes the
- * supplied key and creates an object implementing the
- * interface FTPFileEntryParser.
- *
- * @param key A string that somehow identifies an
- * FTPFileEntryParser to be created.
- * @return the FTPFileEntryParser created.
- * @throws ParserInitializationException Thrown on any exception in instantiation
- */
- public FTPFileEntryParser createFileEntryParser(String key) throws ParserInitializationException;
-
- /**
- * java.util.Calendar
object initialized to the date
- * parsed by the parser
- * @throws ParseException if none of the parser mechanisms belonging to
- * the implementor can parse the input.
- */
- public Calendar parseTimestamp(String timestampStr) throws ParseException;
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java
deleted file mode 100644
index e84209ff..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.Configurable;
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import java.text.DateFormatSymbols;
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
-
-/**
- * Default implementation of the {@link FTPTimestampParser FTPTimestampParser}
- * interface also implements the {@link Configurable Configurable}
- * interface to allow the parsing to be configured from the outside.
- *
- * @see ConfigurableFTPFileEntryParserImpl
- * @since 1.4
- */
-public class FTPTimestampParserImpl implements FTPTimestampParser, Configurable {
-
- /** The date format for all dates, except possibly recent dates. Assumed to include the year. */
- private SimpleDateFormat defaultDateFormat;
- /* The index in CALENDAR_UNITS of the smallest time unit in defaultDateFormat */
- private int defaultDateSmallestUnitIndex;
-
- /** The format used for recent dates (which don't have the year). May be null. */
- private SimpleDateFormat recentDateFormat;
- /* The index in CALENDAR_UNITS of the smallest time unit in recentDateFormat */
- private int recentDateSmallestUnitIndex;
-
- private boolean lenientFutureDates = false;
-
- /*
- * List of units in order of increasing significance.
- * This allows the code to clear all units in the Calendar until it
- * reaches the least significant unit in the parse string.
- * The date formats are analysed to find the least significant
- * unit (e.g. Minutes or Milliseconds) and the appropriate index to
- * the array is saved.
- * This is done by searching the array for the unit specifier,
- * and returning the index. When clearing the Calendar units,
- * the code loops through the array until the previous entry.
- * e.g. for MINUTE it would clear MILLISECOND and SECOND
- */
- private static final int[] CALENDAR_UNITS = {
- Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY,
- Calendar.DAY_OF_MONTH, Calendar.MONTH, Calendar.YEAR
- };
-
- /*
- * Return the index to the array representing the least significant
- * unit found in the date format.
- * Default is 0 (to avoid dropping precision)
- */
- private static int getEntry(SimpleDateFormat dateFormat) {
- if (dateFormat == null) {
- return 0;
- }
- final String FORMAT_CHARS = "SsmHdM";
- final String pattern = dateFormat.toPattern();
- for (char ch : FORMAT_CHARS.toCharArray()) {
- if (pattern.indexOf(ch) != -1) { // found the character
- switch (ch) {
- case 'S':
- return indexOf(Calendar.MILLISECOND);
- case 's':
- return indexOf(Calendar.SECOND);
- case 'm':
- return indexOf(Calendar.MINUTE);
- case 'H':
- return indexOf(Calendar.HOUR_OF_DAY);
- case 'd':
- return indexOf(Calendar.DAY_OF_MONTH);
- case 'M':
- return indexOf(Calendar.MONTH);
- }
- }
- }
- return 0;
- }
-
- /*
- * Find the entry in the CALENDAR_UNITS array.
- */
- private static int indexOf(int calendarUnit) {
- int i;
- for (i = 0; i < CALENDAR_UNITS.length; i++) {
- if (calendarUnit == CALENDAR_UNITS[i]) {
- return i;
- }
- }
- return 0;
- }
-
- /*
- * Sets the Calendar precision (used by FTPFile#toFormattedDate) by clearing
- * the immediately preceeding unit (if any).
- * Unfortunately the clear(int) method results in setting all other units.
- */
- private static void setPrecision(int index, Calendar working) {
- if (index <= 0) { // e.g. MILLISECONDS
- return;
- }
- final int field = CALENDAR_UNITS[index - 1];
- // Just in case the analysis is wrong, stop clearing if
- // field value is not the default.
- final int value = working.get(field);
- if (value != 0) { // don't reset if it has a value
- // new Throwable("Unexpected value "+value).printStackTrace(); // DEBUG
- } else {
- working.clear(field); // reset just the required field
- }
- }
-
- /**
- * The only constructor for this class.
- */
- public FTPTimestampParserImpl() {
- setDefaultDateFormat(DEFAULT_SDF, null);
- setRecentDateFormat(DEFAULT_RECENT_SDF, null);
- }
-
- /**
- * Implements the one {@link FTPTimestampParser#parseTimestamp(String) method}
- * in the {@link FTPTimestampParser FTPTimestampParser} interface
- * according to this algorithm:
- *
- * If the recentDateFormat member has been defined, try to parse the
- * supplied string with that. If that parse fails, or if the recentDateFormat
- * member has not been defined, attempt to parse with the defaultDateFormat
- * member. If that fails, throw a ParseException.
- *
- * This method assumes that the server time is the same as the local time.
- *
- * @param timestampStr The timestamp to be parsed
- * @return a Calendar with the parsed timestamp
- * @see FTPTimestampParserImpl#parseTimestamp(String, Calendar)
- */
- @Override public Calendar parseTimestamp(String timestampStr) throws ParseException {
- Calendar now = Calendar.getInstance();
- return parseTimestamp(timestampStr, now);
- }
-
- /**
- * If the recentDateFormat member has been defined, try to parse the
- * supplied string with that. If that parse fails, or if the recentDateFormat
- * member has not been defined, attempt to parse with the defaultDateFormat
- * member. If that fails, throw a ParseException.
- *
- * This method allows a {@link Calendar} instance to be passed in which represents the
- * current (system) time.
- *
- * @param timestampStr The timestamp to be parsed
- * @param serverTime The current time for the server
- * @return the calendar
- * @throws ParseException if timestamp cannot be parsed
- * @see FTPTimestampParser#parseTimestamp(String)
- * @since 1.5
- */
- public Calendar parseTimestamp(String timestampStr, Calendar serverTime) throws ParseException {
- Calendar working = (Calendar) serverTime.clone();
- working.setTimeZone(getServerTimeZone()); // is this needed?
-
- Date parsed = null;
-
- if (recentDateFormat != null) {
- Calendar now = (Calendar) serverTime.clone();// Copy this, because we may change it
- now.setTimeZone(this.getServerTimeZone());
- if (lenientFutureDates) {
- // add a day to "now" so that "slop" doesn't cause a date
- // slightly in the future to roll back a full year. (Bug 35181 => NET-83)
- now.add(Calendar.DAY_OF_MONTH, 1);
- }
- // The Java SimpleDateFormat class uses the epoch year 1970 if not present in the input
- // As 1970 was not a leap year, it cannot parse "Feb 29" correctly.
- // Java 1.5+ returns Mar 1 1970
- // Temporarily add the current year to the short date time
- // to cope with short-date leap year strings.
- // Since Feb 29 is more that 6 months from the end of the year, this should be OK for
- // all instances of short dates which are +- 6 months from current date.
- // TODO this won't always work for systems that use short dates +0/-12months
- // e.g. if today is Jan 1 2001 and the short date is Feb 29
- String year = Integer.toString(now.get(Calendar.YEAR));
- String timeStampStrPlusYear = timestampStr + " " + year;
- SimpleDateFormat hackFormatter = new SimpleDateFormat(recentDateFormat.toPattern() + " yyyy",
- recentDateFormat.getDateFormatSymbols());
- hackFormatter.setLenient(false);
- hackFormatter.setTimeZone(recentDateFormat.getTimeZone());
- ParsePosition pp = new ParsePosition(0);
- parsed = hackFormatter.parse(timeStampStrPlusYear, pp);
- // Check if we parsed the full string, if so it must have been a short date originally
- if (parsed != null && pp.getIndex() == timeStampStrPlusYear.length()) {
- working.setTime(parsed);
- if (working.after(now)) { // must have been last year instead
- working.add(Calendar.YEAR, -1);
- }
- setPrecision(recentDateSmallestUnitIndex, working);
- return working;
- }
- }
-
- ParsePosition pp = new ParsePosition(0);
- parsed = defaultDateFormat.parse(timestampStr, pp);
- // note, length checks are mandatory for us since
- // SimpleDateFormat methods will succeed if less than
- // full string is matched. They will also accept,
- // despite "leniency" setting, a two-digit number as
- // a valid year (e.g. 22:04 will parse as 22 A.D.)
- // so could mistakenly confuse an hour with a year,
- // if we don't insist on full length parsing.
- if (parsed != null && pp.getIndex() == timestampStr.length()) {
- working.setTime(parsed);
- } else {
- throw new ParseException("Timestamp '"
- + timestampStr
- + "' could not be parsed using a server time of "
- + serverTime.getTime().toString(), pp.getErrorIndex());
- }
- setPrecision(defaultDateSmallestUnitIndex, working);
- return working;
- }
-
- /**
- * @return Returns the defaultDateFormat.
- */
- public SimpleDateFormat getDefaultDateFormat() {
- return defaultDateFormat;
- }
-
- /**
- * @return Returns the defaultDateFormat pattern string.
- */
- public String getDefaultDateFormatString() {
- return defaultDateFormat.toPattern();
- }
-
- /**
- * @param format The defaultDateFormat to be set.
- * @param dfs the symbols to use (may be null)
- */
- private void setDefaultDateFormat(String format, DateFormatSymbols dfs) {
- if (format != null) {
- if (dfs != null) {
- this.defaultDateFormat = new SimpleDateFormat(format, dfs);
- } else {
- this.defaultDateFormat = new SimpleDateFormat(format);
- }
- this.defaultDateFormat.setLenient(false);
- } else {
- this.defaultDateFormat = null;
- }
- this.defaultDateSmallestUnitIndex = getEntry(this.defaultDateFormat);
- }
-
- /**
- * @return Returns the recentDateFormat.
- */
- public SimpleDateFormat getRecentDateFormat() {
- return recentDateFormat;
- }
-
- /**
- * @return Returns the recentDateFormat.
- */
- public String getRecentDateFormatString() {
- return recentDateFormat.toPattern();
- }
-
- /**
- * @param format The recentDateFormat to set.
- * @param dfs the symbols to use (may be null)
- */
- private void setRecentDateFormat(String format, DateFormatSymbols dfs) {
- if (format != null) {
- if (dfs != null) {
- this.recentDateFormat = new SimpleDateFormat(format, dfs);
- } else {
- this.recentDateFormat = new SimpleDateFormat(format);
- }
- this.recentDateFormat.setLenient(false);
- } else {
- this.recentDateFormat = null;
- }
- this.recentDateSmallestUnitIndex = getEntry(this.recentDateFormat);
- }
-
- /**
- * @return returns an array of 12 strings representing the short
- * month names used by this parse.
- */
- public String[] getShortMonths() {
- return defaultDateFormat.getDateFormatSymbols().getShortMonths();
- }
-
- /**
- * @return Returns the serverTimeZone used by this parser.
- */
- public TimeZone getServerTimeZone() {
- return this.defaultDateFormat.getTimeZone();
- }
-
- /**
- * sets a TimeZone represented by the supplied ID string into all
- * of the parsers used by this server.
- *
- * @param serverTimeZone Time Id java.util.TimeZone id used by
- * the ftp server. If null the client's local time zone is assumed.
- */
- private void setServerTimeZone(String serverTimeZoneId) {
- TimeZone serverTimeZone = TimeZone.getDefault();
- if (serverTimeZoneId != null) {
- serverTimeZone = TimeZone.getTimeZone(serverTimeZoneId);
- }
- this.defaultDateFormat.setTimeZone(serverTimeZone);
- if (this.recentDateFormat != null) {
- this.recentDateFormat.setTimeZone(serverTimeZone);
- }
- }
-
- /**
- * Implementation of the {@link Configurable Configurable}
- * interface. Configures this FTPTimestampParser
according
- * to the following logic:
- *
- *
config
, use that to parse parse timestamps.config
, use the month names represented
- * by that {@link FTPClientConfig#lookupDateFormatSymbols(String) language}
- * to parse timestamps.
- * entry = [ facts ] SP pathname
- * facts = 1*( fact ";" )
- * fact = factname "=" value
- * factname = "Size" / "Modify" / "Create" /
- * "Type" / "Unique" / "Perm" /
- * "Lang" / "Media-Type" / "CharSet" /
- * os-depend-fact / local-fact
- * os-depend-fact = {IANA assigned OS name} "." token
- * local-fact = "X." token
- * value = *SCHAR
- *
- * Sample os-depend-fact:
- * UNIX.group=0;UNIX.mode=0755;UNIX.owner=0;
- *
- * A single control response entry (MLST) is returned with a leading space;
- * multiple (data) entries are returned without any leading spaces.
- * The parser requires that the leading space from the MLST entry is removed.
- * MLSD entries can begin with a single space if there are no facts.
- *
- * @since 3.0
- */
-public class MLSxEntryParser extends FTPFileEntryParserImpl {
- // This class is immutable, so a single instance can be shared.
- private static final MLSxEntryParser PARSER = new MLSxEntryParser();
-
- private static final HashMap
- * Volume Unit Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
- * B10142 3390 2006/03/20 2 31 F 80 80 PS MDI.OKL.WORK
- *
- */
- static final String FILE_LIST_REGEX = "\\S+\\s+" + // volume
- // ignored
- "\\S+\\s+" + // unit - ignored
- "\\S+\\s+" + // access date - ignored
- "\\S+\\s+" + // extents -ignored
- "\\S+\\s+" + // used - ignored
- "[FV]\\S*\\s+" + // recfm - must start with F or V
- "\\S+\\s+" + // logical record length -ignored
- "\\S+\\s+" + // block size - ignored
- "(PS|PO|PO-E)\\s+" + // Dataset organisation. Many exist
- // but only support: PS, PO, PO-E
- "(\\S+)\\s*"; // Dataset Name (file name)
-
- /**
- * Matches these entries:
- *
- * Name VV.MM Created Changed Size Init Mod Id
- * TBSHELF 01.03 2002/09/12 2002/10/11 09:37 11 11 0 KIL001
- *
- */
- static final String MEMBER_LIST_REGEX = "(\\S+)\\s+" + // name
- "\\S+\\s+" + // version, modification (ignored)
- "\\S+\\s+" + // create date (ignored)
- "(\\S+)\\s+" + // modification date
- "(\\S+)\\s+" + // modification time
- "\\S+\\s+" + // size in lines (ignored)
- "\\S+\\s+" + // size in lines at creation(ignored)
- "\\S+\\s+" + // lines modified (ignored)
- "\\S+\\s*"; // id of user who modified (ignored)
-
- /**
- * Matches these entries, note: no header:
- *
- * IBMUSER1 JOB01906 OUTPUT 3 Spool Files
- * 012345678901234567890123456789012345678901234
- * 1 2 3 4
- *
- */
- static final String JES_LEVEL_1_LIST_REGEX = "(\\S+)\\s+" + // job name ignored
- "(\\S+)\\s+" + // job number
- "(\\S+)\\s+" + // job status (OUTPUT,INPUT,ACTIVE)
- "(\\S+)\\s+" + // number of spool files
- "(\\S+)\\s+" + // Text "Spool" ignored
- "(\\S+)\\s*" // Text "Files" ignored
- ;
-
- /**
- * JES INTERFACE LEVEL 2 parser
- * Matches these entries:
- *
- * JOBNAME JOBID OWNER STATUS CLASS
- * IBMUSER1 JOB01906 IBMUSER OUTPUT A RC=0000 3 spool files
- * IBMUSER TSU01830 IBMUSER OUTPUT TSU ABEND=522 3 spool files
- *
- * Sample output from FTP session:
- *
- * ftp> quote site filetype=jes
- * 200 SITE command was accepted
- * ftp> ls
- * 200 Port request OK.
- * 125 List started OK for JESJOBNAME=IBMUSER*, JESSTATUS=ALL and JESOWNER=IBMUSER
- * JOBNAME JOBID OWNER STATUS CLASS
- * IBMUSER1 JOB01906 IBMUSER OUTPUT A RC=0000 3 spool files
- * IBMUSER TSU01830 IBMUSER OUTPUT TSU ABEND=522 3 spool files
- * 250 List completed successfully.
- * ftp> ls job01906
- * 200 Port request OK.
- * 125 List started OK for JESJOBNAME=IBMUSER*, JESSTATUS=ALL and JESOWNER=IBMUSER
- * JOBNAME JOBID OWNER STATUS CLASS
- * IBMUSER1 JOB01906 IBMUSER OUTPUT A RC=0000
- * --------
- * ID STEPNAME PROCSTEP C DDNAME BYTE-COUNT
- * 001 JES2 A JESMSGLG 858
- * 002 JES2 A JESJCL 128
- * 003 JES2 A JESYSMSG 443
- * 3 spool files
- * 250 List completed successfully.
- *
- */
-
- static final String JES_LEVEL_2_LIST_REGEX = "(\\S+)\\s+" + // job name ignored
- "(\\S+)\\s+" + // job number
- "(\\S+)\\s+" + // owner ignored
- "(\\S+)\\s+" + // job status (OUTPUT,INPUT,ACTIVE) ignored
- "(\\S+)\\s+" + // job class ignored
- "(\\S+).*" // rest ignored
- ;
-
- /*
- * ---------------------------------------------------------------------
- * Very brief and incomplete description of the zOS/MVS-filesystem. (Note:
- * "zOS" is the operating system on the mainframe, and is the new name for
- * MVS)
- *
- * The filesystem on the mainframe does not have hierarchal structure as for
- * example the unix filesystem. For a more comprehensive description, please
- * refer to the IBM manuals
- *
- * @LINK:
- * http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/dgt2d440/CONTENTS
- *
- *
- * Dataset names =============
- *
- * A dataset name consist of a number of qualifiers separated by '.', each
- * qualifier can be at most 8 characters, and the total length of a dataset
- * can be max 44 characters including the dots.
- *
- *
- * Dataset organisation ====================
- *
- * A dataset represents a piece of storage allocated on one or more disks.
- * The structure of the storage is described with the field dataset
- * organinsation (DSORG). There are a number of dataset organisations, but
- * only two are usable for FTP transfer.
- *
- * DSORG: PS: sequential, or flat file PO: partitioned dataset PO-E:
- * extended partitioned dataset
- *
- * The PS file is just a flat file, as you would find it on the unix file
- * system.
- *
- * The PO and PO-E files, can be compared to a single level directory
- * structure. A PO file consist of a number of dataset members, or files if
- * you will. It is possible to CD into the file, and to retrieve the
- * individual members.
- *
- *
- * Dataset record format =====================
- *
- * The physical layout of the dataset is described on the dataset itself.
- * There are a number of record formats (RECFM), but just a few is relavant
- * for the FTP transfer.
- *
- * Any one beginning with either F or V can safely used by FTP transfer. All
- * others should only be used with great care, so this version will just
- * ignore the other record formats. F means a fixed number of records per
- * allocated storage, and V means a variable number of records.
- *
- *
- * Other notes ===========
- *
- * The file system supports automatically backup and retrieval of datasets.
- * If a file is backed up, the ftp LIST command will return: ARCIVE Not
- * Direct Access Device KJ.IOP998.ERROR.PL.UNITTEST
- *
- *
- * Implementation notes ====================
- *
- * Only datasets that have dsorg PS, PO or PO-E and have recfm beginning
- * with F or V, is fully parsed.
- *
- * The following fields in FTPFile is used: FTPFile.Rawlisting: Always set.
- * FTPFile.Type: DIRECTORY_TYPE or FILE_TYPE or UNKNOWN FTPFile.Name: name
- * FTPFile.Timestamp: change time or null
- *
- *
- *
- * Additional information ======================
- *
- * The MVS ftp server supports a number of features via the FTP interface.
- * The features are controlled with the FTP command quote site filetype= FTPFile
instance.
- * If the file listing line doesn't describe a file, then
- * null
is returned. Otherwise a FTPFile
- * instance representing the file is returned.
- *
- * @param entry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- @Override public FTPFile parseFTPEntry(String entry) {
- boolean isParsed = false;
- FTPFile f = new FTPFile();
-
- if (isType == FILE_LIST_TYPE) {
- isParsed = parseFileList(f, entry);
- } else if (isType == MEMBER_LIST_TYPE) {
- isParsed = parseMemberList(f, entry);
- if (!isParsed) {
- isParsed = parseSimpleEntry(f, entry);
- }
- } else if (isType == UNIX_LIST_TYPE) {
- isParsed = parseUnixList(f, entry);
- } else if (isType == JES_LEVEL_1_LIST_TYPE) {
- isParsed = parseJeslevel1List(f, entry);
- } else if (isType == JES_LEVEL_2_LIST_TYPE) {
- isParsed = parseJeslevel2List(f, entry);
- }
-
- if (!isParsed) {
- f = null;
- }
-
- return f;
- }
-
- /**
- * Parse entries representing a dataset list. Only datasets with DSORG PS or
- * PO or PO-E and with RECFM F* or V* will be parsed.
- *
- * Format of ZOS/MVS file list: 1 2 3 4 5 6 7 8 9 10 Volume Unit Referred
- * Ext Used Recfm Lrecl BlkSz Dsorg Dsname B10142 3390 2006/03/20 2 31 F 80
- * 80 PS MDI.OKL.WORK ARCIVE Not Direct Access Device
- * KJ.IOP998.ERROR.PL.UNITTEST B1N231 3390 2006/03/20 1 15 VB 256 27998 PO
- * PLU B1N231 3390 2006/03/20 1 15 VB 256 27998 PO-E PLB
- *
- * ----------------------------------- Group within Regex [1] Volume [2]
- * Unit [3] Referred [4] Ext: number of extents [5] Used [6] Recfm: Record
- * format [7] Lrecl: Logical record length [8] BlkSz: Block size [9] Dsorg:
- * Dataset organisation. Many exists but only support: PS, PO, PO-E [10]
- * Dsname: Dataset name
- *
- * Note: When volume is ARCIVE, it means the dataset is stored somewhere in
- * a tape archive. These entries is currently not supported by this parser.
- * A null value is returned.
- *
- * @param file will be updated with Name, Type, Timestamp if parsed.
- * @param entry zosDirectoryEntry
- * @return true: entry was parsed, false: entry was not parsed.
- */
- private boolean parseFileList(FTPFile file, String entry) {
- if (matches(entry)) {
- file.setRawListing(entry);
- String name = group(2);
- String dsorg = group(1);
- file.setName(name);
-
- // DSORG
- if ("PS".equals(dsorg)) {
- file.setType(FTPFile.FILE_TYPE);
- } else if ("PO".equals(dsorg) || "PO-E".equals(dsorg)) {
- // regex already ruled out anything other than PO or PO-E
- file.setType(FTPFile.DIRECTORY_TYPE);
- } else {
- return false;
- }
-
- return true;
- }
-
- return false;
- }
-
- /**
- * Parse entries within a partitioned dataset.
- *
- * Format of a memberlist within a PDS:
- *
- * 0 1 2 3 4 5 6 7 8
- * Name VV.MM Created Changed Size Init Mod Id
- * TBSHELF 01.03 2002/09/12 2002/10/11 09:37 11 11 0 KIL001
- * TBTOOL 01.12 2002/09/12 2004/11/26 19:54 51 28 0 KIL001
- *
- * -------------------------------------------
- * [1] Name
- * [2] VV.MM: Version . modification
- * [3] Created: yyyy / MM / dd
- * [4,5] Changed: yyyy / MM / dd HH:mm
- * [6] Size: number of lines
- * [7] Init: number of lines when first created
- * [8] Mod: number of modified lines a last save
- * [9] Id: User id for last update
- *
- *
- * @param file will be updated with Name, Type and Timestamp if parsed.
- * @param entry zosDirectoryEntry
- * @return true: entry was parsed, false: entry was not parsed.
- */
- private boolean parseMemberList(FTPFile file, String entry) {
- if (matches(entry)) {
- file.setRawListing(entry);
- String name = group(1);
- String datestr = group(2) + " " + group(3);
- file.setName(name);
- file.setType(FTPFile.FILE_TYPE);
- try {
- file.setTimestamp(super.parseTimestamp(datestr));
- } catch (ParseException e) {
- e.printStackTrace();
- // just ignore parsing errors.
- // TODO check this is ok
- return false; // this is a parsing failure too.
- }
- return true;
- }
-
- return false;
- }
-
- /**
- * Assigns the name to the first word of the entry. Only to be used from a
- * safe context, for example from a memberlist, where the regex for some
- * reason fails. Then just assign the name field of FTPFile.
- *
- * @return true if the entry string is non-null and non-empty
- */
- private boolean parseSimpleEntry(FTPFile file, String entry) {
- if (entry != null && entry.trim().length() > 0) {
- file.setRawListing(entry);
- String name = entry.split(" ")[0];
- file.setName(name);
- file.setType(FTPFile.FILE_TYPE);
- return true;
- }
- return false;
- }
-
- /**
- * Parse the entry as a standard unix file. Using the UnixFTPEntryParser.
- *
- * @return true: entry is parsed, false: entry could not be parsed.
- */
- private boolean parseUnixList(FTPFile file, String entry) {
- file = unixFTPEntryParser.parseFTPEntry(entry);
- if (file == null) {
- return false;
- }
- return true;
- }
-
- /**
- * Matches these entries, note: no header:
- *
- * [1] [2] [3] [4] [5]
- * IBMUSER1 JOB01906 OUTPUT 3 Spool Files
- * 012345678901234567890123456789012345678901234
- * 1 2 3 4
- * -------------------------------------------
- * Group in regex
- * [1] Job name
- * [2] Job number
- * [3] Job status (INPUT,ACTIVE,OUTPUT)
- * [4] Number of sysout files
- * [5] The string "Spool Files"
- *
- *
- * @param file will be updated with Name, Type and Timestamp if parsed.
- * @param entry zosDirectoryEntry
- * @return true: entry was parsed, false: entry was not parsed.
- */
- private boolean parseJeslevel1List(FTPFile file, String entry) {
- if (matches(entry)) {
- if (group(3).equalsIgnoreCase("OUTPUT")) {
- file.setRawListing(entry);
- String name = group(2); /* Job Number, used by GET */
- file.setName(name);
- file.setType(FTPFile.FILE_TYPE);
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Matches these entries:
- *
- * [1] [2] [3] [4] [5]
- * JOBNAME JOBID OWNER STATUS CLASS
- * IBMUSER1 JOB01906 IBMUSER OUTPUT A RC=0000 3 spool files
- * IBMUSER TSU01830 IBMUSER OUTPUT TSU ABEND=522 3 spool files
- * 012345678901234567890123456789012345678901234
- * 1 2 3 4
- * -------------------------------------------
- * Group in regex
- * [1] Job name
- * [2] Job number
- * [3] Owner
- * [4] Job status (INPUT,ACTIVE,OUTPUT)
- * [5] Job Class
- * [6] The rest
- *
- *
- * @param file will be updated with Name, Type and Timestamp if parsed.
- * @param entry zosDirectoryEntry
- * @return true: entry was parsed, false: entry was not parsed.
- */
- private boolean parseJeslevel2List(FTPFile file, String entry) {
- if (matches(entry)) {
- if (group(4).equalsIgnoreCase("OUTPUT")) {
- file.setRawListing(entry);
- String name = group(2); /* Job Number, used by GET */
- file.setName(name);
- file.setType(FTPFile.FILE_TYPE);
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * preParse is called as part of the interface. Per definition is is called
- * before the parsing takes place.
- * Three kind of lists is recognize:
- * z/OS-MVS File lists
- * z/OS-MVS Member lists
- * unix file lists
- *
- * @since 2.0
- */
- @Override public ListREGEX
is not a valid regular expression.
- */
- public MacOsPeterFTPEntryParser() {
- this(null);
- }
-
- /**
- * This constructor allows the creation of a UnixFTPEntryParser object with
- * something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 1.4
- */
- public MacOsPeterFTPEntryParser(FTPClientConfig config) {
- super(REGEX);
- configure(config);
- }
-
- /**
- * Parses a line of a unix (standard) FTP server file listing and converts
- * it into a usable format in the form of an FTPFile
- * instance. If the file listing line doesn't describe a file,
- * null
is returned, otherwise a FTPFile
- * instance representing the files in the directory is returned.
- *
- * @param entry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- @Override public FTPFile parseFTPEntry(String entry) {
- FTPFile file = new FTPFile();
- file.setRawListing(entry);
- int type;
- boolean isDevice = false;
-
- if (matches(entry)) {
- String typeStr = group(1);
- String hardLinkCount = "0";
- String usr = null;
- String grp = null;
- String filesize = group(20);
- String datestr = group(21) + " " + group(22);
- String name = group(23);
- String endtoken = group(24);
-
- try {
- file.setTimestamp(super.parseTimestamp(datestr));
- } catch (ParseException e) {
- // intentionally do nothing
- }
-
- // A 'whiteout' file is an ARTIFICIAL entry in any of several types of
- // 'translucent' filesystems, of which a 'union' filesystem is one.
-
- // bcdelfmpSs-
- switch (typeStr.charAt(0)) {
- case 'd':
- type = FTPFile.DIRECTORY_TYPE;
- break;
- case 'e': // NET-39 => z/OS external link
- type = FTPFile.SYMBOLIC_LINK_TYPE;
- break;
- case 'l':
- type = FTPFile.SYMBOLIC_LINK_TYPE;
- break;
- case 'b':
- case 'c':
- isDevice = true;
- type = FTPFile.FILE_TYPE; // TODO change this if DEVICE_TYPE implemented
- break;
- case 'f':
- case '-':
- type = FTPFile.FILE_TYPE;
- break;
- default: // e.g. ? and w = whiteout
- type = FTPFile.UNKNOWN_TYPE;
- }
-
- file.setType(type);
-
- int g = 4;
- for (int access = 0; access < 3; access++, g += 4) {
- // Use != '-' to avoid having to check for suid and sticky bits
- file.setPermission(access, FTPFile.READ_PERMISSION, (!group(g).equals("-")));
- file.setPermission(access, FTPFile.WRITE_PERMISSION, (!group(g + 1).equals("-")));
-
- String execPerm = group(g + 2);
- if (!execPerm.equals("-") && !Character.isUpperCase(execPerm.charAt(0))) {
- file.setPermission(access, FTPFile.EXECUTE_PERMISSION, true);
- } else {
- file.setPermission(access, FTPFile.EXECUTE_PERMISSION, false);
- }
- }
-
- if (!isDevice) {
- try {
- file.setHardLinkCount(Integer.parseInt(hardLinkCount));
- } catch (NumberFormatException e) {
- // intentionally do nothing
- }
- }
-
- file.setUser(usr);
- file.setGroup(grp);
-
- try {
- file.setSize(Long.parseLong(filesize));
- } catch (NumberFormatException e) {
- // intentionally do nothing
- }
-
- if (null == endtoken) {
- file.setName(name);
- } else {
- // oddball cases like symbolic links, file names
- // with spaces in them.
- name += endtoken;
- if (type == FTPFile.SYMBOLIC_LINK_TYPE) {
-
- int end = name.indexOf(" -> ");
- // Give up if no link indicator is present
- if (end == -1) {
- file.setName(name);
- } else {
- file.setName(name.substring(0, end));
- file.setLink(name.substring(end + 4));
- }
- } else {
- file.setName(name);
- }
- }
- return file;
- }
- return null;
- }
-
- /**
- * Defines a default configuration to be used when this class is
- * instantiated without a {@link FTPClientConfig FTPClientConfig}
- * parameter being specified.
- *
- * @return the default configuration for this parser.
- */
- @Override protected FTPClientConfig getDefaultConfiguration() {
- return new FTPClientConfig(FTPClientConfig.SYST_UNIX, DEFAULT_DATE_FORMAT,
- DEFAULT_RECENT_DATE_FORMAT);
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NTFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NTFTPEntryParser.java
deleted file mode 100644
index cee2811a..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/NTFTPEntryParser.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.Configurable;
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import aria.apache.commons.net.ftp.FTPFile;
-import aria.apache.commons.net.ftp.FTPFileEntryParser;
-import java.text.ParseException;
-import java.util.regex.Pattern;
-
-/**
- * Implementation of FTPFileEntryParser and FTPFileListParser for NT Systems.
- *
- * @version $Id: NTFTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $
- * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions)
- */
-public class NTFTPEntryParser extends ConfigurableFTPFileEntryParserImpl {
-
- private static final String DEFAULT_DATE_FORMAT = "MM-dd-yy hh:mma"; //11-09-01 12:30PM
-
- private static final String DEFAULT_DATE_FORMAT2 = "MM-dd-yy kk:mm"; //11-09-01 18:30
-
- private final FTPTimestampParser timestampParser;
-
- /**
- * this is the regular expression used by this parser.
- */
- private static final String REGEX =
- "(\\S+)\\s+(\\S+)\\s+" // MM-dd-yy whitespace hh:mma|kk:mm; swallow trailing spaces
- + "(?:(REGEX
is not a valid regular expression.
- */
- public NTFTPEntryParser() {
- this(null);
- }
-
- /**
- * This constructor allows the creation of an NTFTPEntryParser object
- * with something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 1.4
- */
- public NTFTPEntryParser(FTPClientConfig config) {
- super(REGEX, Pattern.DOTALL);
- configure(config);
- FTPClientConfig config2 =
- new FTPClientConfig(FTPClientConfig.SYST_NT, DEFAULT_DATE_FORMAT2, null);
- config2.setDefaultDateFormatStr(DEFAULT_DATE_FORMAT2);
- this.timestampParser = new FTPTimestampParserImpl();
- ((Configurable) this.timestampParser).configure(config2);
- }
-
- /**
- * Parses a line of an NT FTP server file listing and converts it into a
- * usable format in the form of an FTPFile
instance. If the
- * file listing line doesn't describe a file, null
is
- * returned, otherwise a FTPFile
instance representing the
- * files in the directory is returned.
- *
- * @param entry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- @Override public FTPFile parseFTPEntry(String entry) {
- FTPFile f = new FTPFile();
- f.setRawListing(entry);
-
- if (matches(entry)) {
- String datestr = group(1) + " " + group(2);
- String dirString = group(3);
- String size = group(4);
- String name = group(5);
- try {
- f.setTimestamp(super.parseTimestamp(datestr));
- } catch (ParseException e) {
- // parsing fails, try the other date format
- try {
- f.setTimestamp(timestampParser.parseTimestamp(datestr));
- } catch (ParseException e2) {
- // intentionally do nothing
- }
- }
-
- if (null == name || name.equals(".") || name.equals("..")) {
- return (null);
- }
- f.setName(name);
-
- if ("REGEX
is not a valid regular expression.
- */
- public NetwareFTPEntryParser() {
- this(null);
- }
-
- /**
- * This constructor allows the creation of an NetwareFTPEntryParser object
- * with something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 1.4
- */
- public NetwareFTPEntryParser(FTPClientConfig config) {
- super(REGEX);
- configure(config);
- }
-
- /**
- * Parses a line of an NetwareFTP server file listing and converts it into a
- * usable format in the form of an FTPFile
instance. If the
- * file listing line doesn't describe a file, null
is
- * returned, otherwise a FTPFile
instance representing the
- * files in the directory is returned.
- *
- *
- *
- * See
- *
- * here
- * for more details
- *
- * @param entry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- @Override public FTPFile parseFTPEntry(String entry) {
-
- FTPFile f = new FTPFile();
- if (matches(entry)) {
- String dirString = group(1);
- String attrib = group(2);
- String user = group(3);
- String size = group(4);
- String datestr = group(5);
- String name = group(9);
-
- try {
- f.setTimestamp(super.parseTimestamp(datestr));
- } catch (ParseException e) {
- // intentionally do nothing
- }
-
- //is it a DIR or a file
- if (dirString.trim().equals("d")) {
- f.setType(FTPFile.DIRECTORY_TYPE);
- } else // Should be "-"
- {
- f.setType(FTPFile.FILE_TYPE);
- }
-
- f.setUser(user);
-
- //set the name
- f.setName(name.trim());
-
- //set the size
- f.setSize(Long.parseLong(size.trim()));
-
- // Now set the permissions (or at least a subset thereof - full permissions would probably require
- // subclassing FTPFile and adding extra metainformation there)
- if (attrib.indexOf("R") != -1) {
- f.setPermission(FTPFile.USER_ACCESS, FTPFile.READ_PERMISSION, true);
- }
- if (attrib.indexOf("W") != -1) {
- f.setPermission(FTPFile.USER_ACCESS, FTPFile.WRITE_PERMISSION, true);
- }
-
- return (f);
- }
- return null;
- }
-
- /**
- * Defines a default configuration to be used when this class is
- * instantiated without a {@link FTPClientConfig FTPClientConfig}
- * parameter being specified.
- *
- * @return the default configuration for this parser.
- */
- @Override protected FTPClientConfig getDefaultConfiguration() {
- return new FTPClientConfig(FTPClientConfig.SYST_NETWARE, DEFAULT_DATE_FORMAT,
- DEFAULT_RECENT_DATE_FORMAT);
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS2FTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS2FTPEntryParser.java
deleted file mode 100644
index fc2413e9..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS2FTPEntryParser.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import aria.apache.commons.net.ftp.FTPFile;
-import aria.apache.commons.net.ftp.FTPFileEntryParser;
-import java.text.ParseException;
-
-/**
- * Implementation of FTPFileEntryParser and FTPFileListParser for OS2 Systems.
- *
- * @version $Id: OS2FTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $
- * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions)
- */
-public class OS2FTPEntryParser extends ConfigurableFTPFileEntryParserImpl
-
-{
-
- private static final String DEFAULT_DATE_FORMAT = "MM-dd-yy HH:mm"; //11-09-01 12:30
- /**
- * this is the regular expression used by this parser.
- */
- private static final String REGEX = "\\s*([0-9]+)\\s*"
- + "(\\s+|[A-Z]+)\\s*"
- + "(DIR|\\s+)\\s*"
- + "(\\S+)\\s+(\\S+)\\s+" /* date stuff */
- + "(\\S.*)";
-
- /**
- * The default constructor for a OS2FTPEntryParser object.
- *
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- */
- public OS2FTPEntryParser() {
- this(null);
- }
-
- /**
- * This constructor allows the creation of an OS2FTPEntryParser object
- * with something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 1.4
- */
- public OS2FTPEntryParser(FTPClientConfig config) {
- super(REGEX);
- configure(config);
- }
-
- /**
- * Parses a line of an OS2 FTP server file listing and converts it into a
- * usable format in the form of an FTPFile
instance. If the
- * file listing line doesn't describe a file, null
is
- * returned, otherwise a FTPFile
instance representing the
- * files in the directory is returned.
- *
- * @param entry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- @Override public FTPFile parseFTPEntry(String entry) {
-
- FTPFile f = new FTPFile();
- if (matches(entry)) {
- String size = group(1);
- String attrib = group(2);
- String dirString = group(3);
- String datestr = group(4) + " " + group(5);
- String name = group(6);
- try {
- f.setTimestamp(super.parseTimestamp(datestr));
- } catch (ParseException e) {
- // intentionally do nothing
- }
-
- //is it a DIR or a file
- if (dirString.trim().equals("DIR") || attrib.trim().equals("DIR")) {
- f.setType(FTPFile.DIRECTORY_TYPE);
- } else {
- f.setType(FTPFile.FILE_TYPE);
- }
-
- //set the name
- f.setName(name.trim());
-
- //set the size
- f.setSize(Long.parseLong(size.trim()));
-
- return (f);
- }
- return null;
- }
-
- /**
- * Defines a default configuration to be used when this class is
- * instantiated without a {@link FTPClientConfig FTPClientConfig}
- * parameter being specified.
- *
- * @return the default configuration for this parser.
- */
- @Override protected FTPClientConfig getDefaultConfiguration() {
- return new FTPClientConfig(FTPClientConfig.SYST_OS2, DEFAULT_DATE_FORMAT, null);
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS400FTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS400FTPEntryParser.java
deleted file mode 100644
index 43198267..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/OS400FTPEntryParser.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import aria.apache.commons.net.ftp.FTPFile;
-import java.io.File;
-import java.text.ParseException;
-
-/**
- * @version $Id: OS400FTPEntryParser.java 1752660 2016-07-14 13:25:39Z sebb $
- *
- * Example *FILE/*MEM FTP entries, when the current
- * working directory is a file of file system QSYS:
- * ------------------------------------------------
- *
- * $ cwd /qsys.lib/rpgunit.lib/rpgunitc1.file
- * 250-NAMEFMT set to 1.
- * 250 "/QSYS.LIB/RPGUNIT.LIB/RPGUNITC1.FILE" is current directory.
- * $ dir
- * 227 Entering Passive Mode (10,200,36,33,40,249).
- * 125 List started.
- * QPGMR 135168 22.06.13 13:18:19 *FILE
- * QPGMR *MEM MKCMD.MBR
- * QPGMR *MEM RUCALLTST.MBR
- * QPGMR *MEM RUCMDHLP.MBR
- * QPGMR *MEM RUCRTTST.MBR
- * 250 List completed.
- *
- *
- * Example *FILE entry of an OS/400 save file:
- * ---------------------------------------------------
- *
- * $ cwd /qsys.lib/rpgunit.lib
- * 250 "/QSYS.LIB/RPGUNIT.LIB" is current library.
- * $ dir rpgunit.file
- * 227 Entering Passive Mode (10,200,36,33,188,106).
- * 125 List started.
- * QPGMR 16347136 29.06.13 15:45:09 *FILE RPGUNIT.SAVF
- * 250 List completed.
- *
- *
- * Example *STMF/*DIR FTP entries, when the
- * current working directory is in file system "root":
- * ---------------------------------------------------
- *
- * $ cwd /home/raddatz
- * 250 "/home/raddatz" is current directory.
- * $ dir test*
- * 227 Entering Passive Mode (10,200,36,33,200,189).
- * 125 List started.
- * RADDATZ 200 21.05.11 12:31:18 *STMF TEST_RG_02_CRLF.properties
- * RADDATZ 187 08.05.11 12:31:40 *STMF TEST_RG_02_LF.properties
- * RADDATZ 187 08.05.11 12:31:52 *STMF TEST_RG_02_CR.properties
- * RADDATZ 8192 04.07.13 09:04:14 *DIR testDir1/
- * RADDATZ 8192 04.07.13 09:04:17 *DIR testDir2/
- * 250 List completed.
- *
- *
- * Example 1, using ANT to list specific members of a file:
- * --------------------------------------------------------
- *
- * <echo/>
- * <echo>Listing members of a file:</echo>
- *
- * <ftp action="list"
- * server="${ftp.server}"
- * userid="${ftp.user}"
- * password="${ftp.password}"
- * binary="false"
- * verbose="true"
- * remotedir="/QSYS.LIB/RPGUNIT.LIB/RPGUNITY1.FILE"
- * systemTypeKey="OS/400"
- * listing="ftp-listing.txt"
- * >
- * <fileset dir="./i5-downloads-file" casesensitive="false">
- * <include name="run*.mbr" />
- * </fileset>
- * </ftp>
- *
- * Output:
- * -------
- *
- * [echo] Listing members of a file:
- * [ftp] listing files
- * [ftp] listing RUN.MBR
- * [ftp] listing RUNNER.MBR
- * [ftp] listing RUNNERBND.MBR
- * [ftp] 3 files listed
- *
- *
- * Example 2, using ANT to list specific members of all files of a library:
- * ------------------------------------------------------------------------
- *
- * <echo/>
- * <echo>Listing members of all files of a library:</echo>
- *
- * <ftp action="list"
- * server="${ftp.server}"
- * userid="${ftp.user}"
- * password="${ftp.password}"
- * binary="false"
- * verbose="true"
- * remotedir="/QSYS.LIB/RPGUNIT.LIB"
- * systemTypeKey="OS/400"
- * listing="ftp-listing.txt"
- * >
- * <fileset dir="./i5-downloads-lib" casesensitive="false">
- * <include name="**\run*.mbr" />
- * </fileset>
- * </ftp>
- *
- * Output:
- * -------
- *
- * [echo] Listing members of all files of a library:
- * [ftp] listing files
- * [ftp] listing RPGUNIT1.FILE\RUN.MBR
- * [ftp] listing RPGUNIT1.FILE\RUNRMT.MBR
- * [ftp] listing RPGUNITT1.FILE\RUNT.MBR
- * [ftp] listing RPGUNITY1.FILE\RUN.MBR
- * [ftp] listing RPGUNITY1.FILE\RUNNER.MBR
- * [ftp] listing RPGUNITY1.FILE\RUNNERBND.MBR
- * [ftp] 6 files listed
- *
- *
- * Example 3, using ANT to download specific members of a file:
- * ------------------------------------------------------------
- *
- * <echo/>
- * <echo>Downloading members of a file:</echo>
- *
- * <ftp action="get"
- * server="${ftp.server}"
- * userid="${ftp.user}"
- * password="${ftp.password}"
- * binary="false"
- * verbose="true"
- * remotedir="/QSYS.LIB/RPGUNIT.LIB/RPGUNITY1.FILE"
- * systemTypeKey="OS/400"
- * >
- * <fileset dir="./i5-downloads-file" casesensitive="false">
- * <include name="run*.mbr" />
- * </fileset>
- * </ftp>
- *
- * Output:
- * -------
- *
- * [echo] Downloading members of a file:
- * [ftp] getting files
- * [ftp] transferring RUN.MBR to C:\workspaces\rdp_080\workspace\ANT -
- * FTP\i5-downloads-file\RUN.MBR
- * [ftp] transferring RUNNER.MBR to C:\workspaces\rdp_080\workspace\ANT -
- * FTP\i5-downloads-file\RUNNER.MBR
- * [ftp] transferring RUNNERBND.MBR to C:\workspaces\rdp_080\workspace\ANT -
- * FTP\i5-downloads-file\RUNNERBND.MBR
- * [ftp] 3 files retrieved
- *
- *
- * Example 4, using ANT to download specific members of all files of a library:
- * ----------------------------------------------------------------------------
- *
- * <echo/>
- * <echo>Downloading members of all files of a library:</echo>
- *
- * <ftp action="get"
- * server="${ftp.server}"
- * userid="${ftp.user}"
- * password="${ftp.password}"
- * binary="false"
- * verbose="true"
- * remotedir="/QSYS.LIB/RPGUNIT.LIB"
- * systemTypeKey="OS/400"
- * >
- * <fileset dir="./i5-downloads-lib" casesensitive="false">
- * <include name="**\run*.mbr" />
- * </fileset>
- * </ftp>
- *
- * Output:
- * -------
- *
- * [echo] Downloading members of all files of a library:
- * [ftp] getting files
- * [ftp] transferring RPGUNIT1.FILE\RUN.MBR to C:\work\rdp_080\space\ANT -
- * FTP\i5-downloads\RPGUNIT1.FILE\RUN.MBR
- * [ftp] transferring RPGUNIT1.FILE\RUNRMT.MBR to C:\work\rdp_080\space\ANT -
- * FTP\i5-downloads\RPGUNIT1.FILE\RUNRMT.MBR
- * [ftp] transferring RPGUNITT1.FILE\RUNT.MBR to C:\work\rdp_080\space\ANT -
- * FTP\i5-downloads\RPGUNITT1.FILE\RUNT.MBR
- * [ftp] transferring RPGUNITY1.FILE\RUN.MBR to C:\work\rdp_080\space\ANT -
- * FTP\i5-downloads\RPGUNITY1.FILE\RUN.MBR
- * [ftp] transferring RPGUNITY1.FILE\RUNNER.MBR to C:\work\rdp_080\space\ANT -
- * FTP\i5-downloads\RPGUNITY1.FILE\RUNNER.MBR
- * [ftp] transferring RPGUNITY1.FILE\RUNNERBND.MBR to C:\work\rdp_080\space\ANT -
- * FTP\i5-downloads\RPGUNITY1.FILE\RUNNERBND.MBR
- * [ftp] 6 files retrieved
- *
- *
- * Example 5, using ANT to download a save file of a library:
- * ----------------------------------------------------------
- *
- * <ftp action="get"
- * server="${ftp.server}"
- * userid="${ftp.user}"
- * password="${ftp.password}"
- * binary="true"
- * verbose="true"
- * remotedir="/QSYS.LIB/RPGUNIT.LIB"
- * systemTypeKey="OS/400"
- * >
- * <fileset dir="./i5-downloads-savf" casesensitive="false">
- * <include name="RPGUNIT.SAVF" />
- * </fileset>
- * </ftp>
- *
- * Output:
- * -------
- * [echo] Downloading save file:
- * [ftp] getting files
- * [ftp] transferring RPGUNIT.SAVF to C:\workspaces\rdp_080\workspace\net-Test\i5-downloads-lib\RPGUNIT.SAVF
- * [ftp] 1 files retrieved
- *
- *
- */
-public class OS400FTPEntryParser extends ConfigurableFTPFileEntryParserImpl {
- private static final String DEFAULT_DATE_FORMAT = "yy/MM/dd HH:mm:ss"; //01/11/09 12:30:24
-
- private static final String REGEX = "(\\S+)\\s+" // user
- + "(?:(\\d+)\\s+)?" // size, empty for members
- + "(?:(\\S+)\\s+(\\S+)\\s+)?" // date stuff, empty for members
- + "(\\*STMF|\\*DIR|\\*FILE|\\*MEM)\\s+" // *STMF/*DIR/*FILE/*MEM
- + "(?:(\\S+)\\s*)?"; // filename, missing, when CWD is a *FILE
-
- /**
- * The default constructor for a OS400FTPEntryParser object.
- *
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- */
- public OS400FTPEntryParser() {
- this(null);
- }
-
- /**
- * This constructor allows the creation of an OS400FTPEntryParser object
- * with something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 1.4
- */
- public OS400FTPEntryParser(FTPClientConfig config) {
- super(REGEX);
- configure(config);
- }
-
- @Override public FTPFile parseFTPEntry(String entry) {
-
- FTPFile file = new FTPFile();
- file.setRawListing(entry);
- int type;
-
- if (matches(entry)) {
- String usr = group(1);
- String filesize = group(2);
- String datestr = "";
- if (!isNullOrEmpty(group(3)) || !isNullOrEmpty(group(4))) {
- datestr = group(3) + " " + group(4);
- }
- String typeStr = group(5);
- String name = group(6);
-
- boolean mustScanForPathSeparator = true;
-
- try {
- file.setTimestamp(super.parseTimestamp(datestr));
- } catch (ParseException e) {
- // intentionally do nothing
- }
-
- if (typeStr.equalsIgnoreCase("*STMF")) {
- type = FTPFile.FILE_TYPE;
- if (isNullOrEmpty(filesize) || isNullOrEmpty(name)) {
- return null;
- }
- } else if (typeStr.equalsIgnoreCase("*DIR")) {
- type = FTPFile.DIRECTORY_TYPE;
- if (isNullOrEmpty(filesize) || isNullOrEmpty(name)) {
- return null;
- }
- } else if (typeStr.equalsIgnoreCase("*FILE")) {
- // File, defines the structure of the data (columns of a row)
- // but the data is stored in one or more members. Typically a
- // source file contains multiple members whereas it is
- // recommended (but not enforced) to use one member per data
- // file.
- // Save files are a special type of files which are used
- // to save objects, e.g. for backups.
- if (name != null && name.toUpperCase().endsWith(".SAVF")) {
- mustScanForPathSeparator = false;
- type = FTPFile.FILE_TYPE;
- } else {
- return null;
- }
- } else if (typeStr.equalsIgnoreCase("*MEM")) {
- mustScanForPathSeparator = false;
- type = FTPFile.FILE_TYPE;
-
- if (isNullOrEmpty(name)) {
- return null;
- }
- if (!(isNullOrEmpty(filesize) && isNullOrEmpty(datestr))) {
- return null;
- }
-
- // Quick and dirty bug fix to make SelectorUtils work.
- // Class SelectorUtils uses 'File.separator' to splitt
- // a given path into pieces. But actually it had to
- // use the separator of the FTP server, which is a forward
- // slash in case of an AS/400.
- name = name.replace('/', File.separatorChar);
- } else {
- type = FTPFile.UNKNOWN_TYPE;
- }
-
- file.setType(type);
-
- file.setUser(usr);
-
- try {
- file.setSize(Long.parseLong(filesize));
- } catch (NumberFormatException e) {
- // intentionally do nothing
- }
-
- if (name.endsWith("/")) {
- name = name.substring(0, name.length() - 1);
- }
- if (mustScanForPathSeparator) {
- int pos = name.lastIndexOf('/');
- if (pos > -1) {
- name = name.substring(pos + 1);
- }
- }
-
- file.setName(name);
-
- return file;
- }
- return null;
- }
-
- /**
- * @param string String value that is checked for null
- * or empty.
- * @return true
for null
or empty values,
- * else false
.
- */
- private boolean isNullOrEmpty(String string) {
- if (string == null || string.length() == 0) {
- return true;
- }
- return false;
- }
-
- /**
- * Defines a default configuration to be used when this class is
- * instantiated without a {@link FTPClientConfig FTPClientConfig}
- * parameter being specified.
- *
- * @return the default configuration for this parser.
- */
- @Override protected FTPClientConfig getDefaultConfiguration() {
- return new FTPClientConfig(FTPClientConfig.SYST_OS400, DEFAULT_DATE_FORMAT, null);
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ParserInitializationException.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ParserInitializationException.java
deleted file mode 100644
index 72576687..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/ParserInitializationException.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-/**
- * This class encapsulates all errors that may be thrown by
- * the process of an FTPFileEntryParserFactory creating and
- * instantiating an FTPFileEntryParser.
- */
-public class ParserInitializationException extends RuntimeException {
-
- private static final long serialVersionUID = 5563335279583210658L;
-
- /**
- * Constucts a ParserInitializationException with just a message
- *
- * @param message Exception message
- */
- public ParserInitializationException(String message) {
- super(message);
- }
-
- /**
- * Constucts a ParserInitializationException with a message
- * and a root cause.
- *
- * @param message Exception message
- * @param rootCause root cause throwable that caused
- * this to be thrown
- */
- public ParserInitializationException(String message, Throwable rootCause) {
- super(message, rootCause);
- }
-
- /**
- * returns the root cause of this exception or null
- * if no root cause was specified.
- *
- * @return the root cause of this exception being thrown
- * @deprecated use {@link #getCause()} instead
- */
- @Deprecated public Throwable getRootCause() {
- return super.getCause();
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java
deleted file mode 100644
index 90100f89..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/RegexFTPFileEntryParserImpl.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.FTPFileEntryParserImpl;
-import java.util.regex.MatchResult;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
-/**
- * This abstract class implements both the older FTPFileListParser and
- * newer FTPFileEntryParser interfaces with default functionality.
- * All the classes in the parser subpackage inherit from this.
- *
- * This is the base class for all regular expression based FTPFileEntryParser classes
- */
-public abstract class RegexFTPFileEntryParserImpl extends FTPFileEntryParserImpl {
- /**
- * internal pattern the matcher tries to match, representing a file
- * entry
- */
- private Pattern pattern = null;
-
- /**
- * internal match result used by the parser
- */
- private MatchResult result = null;
-
- /**
- * Internal PatternMatcher object used by the parser. It has protected
- * scope in case subclasses want to make use of it for their own purposes.
- */
- protected Matcher _matcher_ = null;
-
- /**
- * The constructor for a RegexFTPFileEntryParserImpl object.
- * The expression is compiled with flags = 0.
- *
- * @param regex The regular expression with which this object is
- * initialized.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen in
- * normal conditions. It it is seen, this is a sign that a subclass has
- * been created with a bad regular expression. Since the parser must be
- * created before use, this means that any bad parser subclasses created
- * from this will bomb very quickly, leading to easy detection.
- */
-
- public RegexFTPFileEntryParserImpl(String regex) {
- super();
- compileRegex(regex, 0);
- }
-
- /**
- * The constructor for a RegexFTPFileEntryParserImpl object.
- *
- * @param regex The regular expression with which this object is
- * initialized.
- * @param flags the flags to apply, see {@link Pattern#compile(String, int)}. Use 0 for none.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen in
- * normal conditions. It it is seen, this is a sign that a subclass has
- * been created with a bad regular expression. Since the parser must be
- * created before use, this means that any bad parser subclasses created
- * from this will bomb very quickly, leading to easy detection.
- * @since 3.4
- */
- public RegexFTPFileEntryParserImpl(String regex, final int flags) {
- super();
- compileRegex(regex, flags);
- }
-
- /**
- * Convenience method delegates to the internal MatchResult's matches()
- * method.
- *
- * @param s the String to be matched
- * @return true if s matches this object's regular expression.
- */
-
- public boolean matches(String s) {
- this.result = null;
- _matcher_ = pattern.matcher(s);
- if (_matcher_.matches()) {
- this.result = _matcher_.toMatchResult();
- }
- return null != this.result;
- }
-
- /**
- * Convenience method
- *
- * @return the number of groups() in the internal MatchResult.
- */
-
- public int getGroupCnt() {
- if (this.result == null) {
- return 0;
- }
- return this.result.groupCount();
- }
-
- /**
- * Convenience method delegates to the internal MatchResult's group()
- * method.
- *
- * @param matchnum match group number to be retrieved
- * @return the content of the matchnum'th
group of the internal
- * match or null if this method is called without a match having
- * been made.
- */
- public String group(int matchnum) {
- if (this.result == null) {
- return null;
- }
- return this.result.group(matchnum);
- }
-
- /**
- * For debugging purposes - returns a string shows each match group by
- * number.
- *
- * @return a string shows each match group by number.
- */
-
- public String getGroupsAsString() {
- StringBuilder b = new StringBuilder();
- for (int i = 1; i <= this.result.groupCount(); i++) {
- b.append(i)
- .append(") ")
- .append(this.result.group(i))
- .append(System.getProperty("line.separator"));
- }
- return b.toString();
- }
-
- /**
- * Alter the current regular expression being utilised for entry parsing
- * and create a new {@link Pattern} instance.
- *
- * @param regex The new regular expression
- * @return true
- * @throws IllegalArgumentException if the regex cannot be compiled
- * @since 2.0
- */
- public boolean setRegex(final String regex) {
- compileRegex(regex, 0);
- return true;
- }
-
- /**
- * Alter the current regular expression being utilised for entry parsing
- * and create a new {@link Pattern} instance.
- *
- * @param regex The new regular expression
- * @param flags the flags to apply, see {@link Pattern#compile(String, int)}. Use 0 for none.
- * @return true
- * @throws IllegalArgumentException if the regex cannot be compiled
- * @since 3.4
- */
- public boolean setRegex(final String regex, final int flags) {
- compileRegex(regex, flags);
- return true;
- }
-
- /**
- * Compile the regex and store the {@link Pattern}.
- *
- * This is an internal method to do the work so the constructor does not
- * have to call an overrideable method.
- *
- * @param regex the expression to compile
- * @param flags the flags to apply, see {@link Pattern#compile(String, int)}. Use 0 for none.
- * @throws IllegalArgumentException if the regex cannot be compiled
- */
- private void compileRegex(final String regex, final int flags) {
- try {
- pattern = Pattern.compile(regex, flags);
- } catch (PatternSyntaxException pse) {
- throw new IllegalArgumentException("Unparseable regex supplied: " + regex);
- }
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/UnixFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/UnixFTPEntryParser.java
deleted file mode 100644
index 5e35f308..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/UnixFTPEntryParser.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import aria.apache.commons.net.ftp.FTPFile;
-import aria.apache.commons.net.ftp.FTPFileEntryParser;
-import java.text.ParseException;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * Implementation FTPFileEntryParser and FTPFileListParser for standard
- * Unix Systems.
- *
- * This class is based on the logic of Daniel Savarese's
- * DefaultFTPListParser, but adapted to use regular expressions and to fit the
- * new FTPFileEntryParser interface.
- *
- * @version $Id: UnixFTPEntryParser.java 1781925 2017-02-06 16:43:40Z sebb $
- * @see FTPFileEntryParser FTPFileEntryParser (for usage instructions)
- */
-public class UnixFTPEntryParser extends ConfigurableFTPFileEntryParserImpl {
-
- static final String DEFAULT_DATE_FORMAT = "MMM d yyyy"; //Nov 9 2001
-
- static final String DEFAULT_RECENT_DATE_FORMAT = "MMM d HH:mm"; //Nov 9 20:06
-
- static final String NUMERIC_DATE_FORMAT = "yyyy-MM-dd HH:mm"; //2001-11-09 20:06
-
- // Suffixes used in Japanese listings after the numeric values
- private static final String JA_MONTH = "\u6708";
- private static final String JA_DAY = "\u65e5";
- private static final String JA_YEAR = "\u5e74";
-
- private static final String DEFAULT_DATE_FORMAT_JA =
- "M'" + JA_MONTH + "' d'" + JA_DAY + "' yyyy'" + JA_YEAR + "'"; //6月 3日 2003年
-
- private static final String DEFAULT_RECENT_DATE_FORMAT_JA =
- "M'" + JA_MONTH + "' d'" + JA_DAY + "' HH:mm"; //8月 17日 20:10
-
- /**
- * Some Linux distributions are now shipping an FTP server which formats
- * file listing dates in an all-numeric format:
- * "yyyy-MM-dd HH:mm
.
- * This is a very welcome development, and hopefully it will soon become
- * the standard. However, since it is so new, for now, and possibly
- * forever, we merely accomodate it, but do not make it the default.
- * UnixFTPEntryParser(FTPClientConfig)
.
- * Steve Cohen - 2005-04-17
- */
- public static final FTPClientConfig NUMERIC_DATE_CONFIG =
- new FTPClientConfig(FTPClientConfig.SYST_UNIX, NUMERIC_DATE_FORMAT, null);
-
- /**
- * this is the regular expression used by this parser.
- *
- * Permissions:
- * r the file is readable
- * w the file is writable
- * x the file is executable
- * - the indicated permission is not granted
- * L mandatory locking occurs during access (the set-group-ID bit is
- * on and the group execution bit is off)
- * s the set-user-ID or set-group-ID bit is on, and the corresponding
- * user or group execution bit is also on
- * S undefined bit-state (the set-user-ID bit is on and the user
- * execution bit is off)
- * t the 1000 (octal) bit, or sticky bit, is on [see chmod(1)], and
- * execution is on
- * T the 1000 bit is turned on, and execution is off (undefined bit-
- * state)
- * e z/OS external link bit
- * Final letter may be appended:
- * + file has extended security attributes (e.g. ACL)
- * Note: local listings on MacOSX also use '@';
- * this is not allowed for here as does not appear to be shown by FTP servers
- * {@code @} file has extended attributes
- */
- private static final String REGEX = "([bcdelfmpSs-])" // file type
- + "(((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-])))\\+?" // permissions
-
- + "\\s*" // separator TODO why allow it to be omitted??
-
- + "(\\d+)" // link count
-
- + "\\s+" // separator
-
- + "(?:(\\S+(?:\\s\\S+)*?)\\s+)?" // owner name (optional spaces)
- + "(?:(\\S+(?:\\s\\S+)*)\\s+)?" // group name (optional spaces)
- + "(\\d+(?:,\\s*\\d+)?)" // size or n,m
-
- + "\\s+" // separator
-
- /*
- * numeric or standard format date:
- * yyyy-mm-dd (expecting hh:mm to follow)
- * MMM [d]d
- * [d]d MMM
- * N.B. use non-space for MMM to allow for languages such as German which use
- * diacritics (e.g. umlaut) in some abbreviations.
- * Japanese uses numeric day and month with suffixes to distinguish them
- * [d]dXX [d]dZZ
- */ + "(" + "(?:\\d+[-/]\\d+[-/]\\d+)" + // yyyy-mm-dd
- "|(?:\\S{3}\\s+\\d{1,2})" + // MMM [d]d
- "|(?:\\d{1,2}\\s+\\S{3})" + // [d]d MMM
- "|(?:\\d{1,2}" + JA_MONTH + "\\s+\\d{1,2}" + JA_DAY + ")" + ")"
-
- + "\\s+" // separator
-
- /*
- year (for non-recent standard format) - yyyy
- or time (for numeric or recent standard format) [h]h:mm
- or Japanese year - yyyyXX
- */ + "((?:\\d+(?::\\d+)?)|(?:\\d{4}" + JA_YEAR + "))" // (20)
-
- + "\\s" // separator
-
- + "(.*)"; // the rest (21)
-
- // if true, leading spaces are trimmed from file names
- // this was the case for the original implementation
- final boolean trimLeadingSpaces; // package protected for access from test code
-
- /**
- * The default constructor for a UnixFTPEntryParser object.
- *
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- */
- public UnixFTPEntryParser() {
- this(null);
- }
-
- /**
- * This constructor allows the creation of a UnixFTPEntryParser object with
- * something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 1.4
- */
- public UnixFTPEntryParser(FTPClientConfig config) {
- this(config, false);
- }
-
- /**
- * This constructor allows the creation of a UnixFTPEntryParser object with
- * something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @param trimLeadingSpaces if {@code true}, trim leading spaces from file names
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 3.4
- */
- public UnixFTPEntryParser(FTPClientConfig config, boolean trimLeadingSpaces) {
- super(REGEX);
- configure(config);
- this.trimLeadingSpaces = trimLeadingSpaces;
- }
-
- /**
- * Preparse the list to discard "total nnn" lines
- */
- @Override public List FTPFile
- * instance. If the file listing line doesn't describe a file,
- * null
is returned, otherwise a FTPFile
- * instance representing the files in the directory is returned.
- *
- * @param entry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- @Override public FTPFile parseFTPEntry(String entry) {
- FTPFile file = new FTPFile();
- file.setRawListing(entry);
- int type;
- boolean isDevice = false;
-
- if (matches(entry)) {
- String typeStr = group(1);
- String hardLinkCount = group(15);
- String usr = group(16);
- String grp = group(17);
- String filesize = group(18);
- String datestr = group(19) + " " + group(20);
- String name = group(21);
- if (trimLeadingSpaces) {
- name = name.replaceFirst("^\\s+", "");
- }
-
- try {
- if (group(19).contains(JA_MONTH)) { // special processing for Japanese format
- FTPTimestampParserImpl jaParser = new FTPTimestampParserImpl();
- jaParser.configure(new FTPClientConfig(FTPClientConfig.SYST_UNIX, DEFAULT_DATE_FORMAT_JA,
- DEFAULT_RECENT_DATE_FORMAT_JA));
- file.setTimestamp(jaParser.parseTimestamp(datestr));
- } else {
- file.setTimestamp(super.parseTimestamp(datestr));
- }
- } catch (ParseException e) {
- // intentionally do nothing
- }
-
- // A 'whiteout' file is an ARTIFICIAL entry in any of several types of
- // 'translucent' filesystems, of which a 'union' filesystem is one.
-
- // bcdelfmpSs-
- switch (typeStr.charAt(0)) {
- case 'd':
- type = FTPFile.DIRECTORY_TYPE;
- break;
- case 'e': // NET-39 => z/OS external link
- type = FTPFile.SYMBOLIC_LINK_TYPE;
- break;
- case 'l':
- type = FTPFile.SYMBOLIC_LINK_TYPE;
- break;
- case 'b':
- case 'c':
- isDevice = true;
- type = FTPFile.FILE_TYPE; // TODO change this if DEVICE_TYPE implemented
- break;
- case 'f':
- case '-':
- type = FTPFile.FILE_TYPE;
- break;
- default: // e.g. ? and w = whiteout
- type = FTPFile.UNKNOWN_TYPE;
- }
-
- file.setType(type);
-
- int g = 4;
- for (int access = 0; access < 3; access++, g += 4) {
- // Use != '-' to avoid having to check for suid and sticky bits
- file.setPermission(access, FTPFile.READ_PERMISSION, (!group(g).equals("-")));
- file.setPermission(access, FTPFile.WRITE_PERMISSION, (!group(g + 1).equals("-")));
-
- String execPerm = group(g + 2);
- if (!execPerm.equals("-") && !Character.isUpperCase(execPerm.charAt(0))) {
- file.setPermission(access, FTPFile.EXECUTE_PERMISSION, true);
- } else {
- file.setPermission(access, FTPFile.EXECUTE_PERMISSION, false);
- }
- }
-
- if (!isDevice) {
- try {
- file.setHardLinkCount(Integer.parseInt(hardLinkCount));
- } catch (NumberFormatException e) {
- // intentionally do nothing
- }
- }
-
- file.setUser(usr);
- file.setGroup(grp);
-
- try {
- file.setSize(Long.parseLong(filesize));
- } catch (NumberFormatException e) {
- // intentionally do nothing
- }
-
- // oddball cases like symbolic links, file names
- // with spaces in them.
- if (type == FTPFile.SYMBOLIC_LINK_TYPE) {
-
- int end = name.indexOf(" -> ");
- // Give up if no link indicator is present
- if (end == -1) {
- file.setName(name);
- } else {
- file.setName(name.substring(0, end));
- file.setLink(name.substring(end + 4));
- }
- } else {
- file.setName(name);
- }
- return file;
- }
- return null;
- }
-
- /**
- * Defines a default configuration to be used when this class is
- * instantiated without a {@link FTPClientConfig FTPClientConfig}
- * parameter being specified.
- *
- * @return the default configuration for this parser.
- */
- @Override protected FTPClientConfig getDefaultConfiguration() {
- return new FTPClientConfig(FTPClientConfig.SYST_UNIX, DEFAULT_DATE_FORMAT,
- DEFAULT_RECENT_DATE_FORMAT);
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSFTPEntryParser.java
deleted file mode 100644
index b2578cd0..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSFTPEntryParser.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import aria.apache.commons.net.ftp.FTPFile;
-import aria.apache.commons.net.ftp.FTPFileEntryParser;
-import aria.apache.commons.net.ftp.FTPListParseEngine;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.text.ParseException;
-import java.util.StringTokenizer;
-
-/**
- * Implementation FTPFileEntryParser and FTPFileListParser for VMS Systems.
- * This is a sample of VMS LIST output
- *
- * "1-JUN.LIS;1 9/9 2-JUN-1998 07:32:04 [GROUP,OWNER]
- * (RWED,RWED,RWED,RE)",
- * "1-JUN.LIS;2 9/9 2-JUN-1998 07:32:04 [GROUP,OWNER]
- * (RWED,RWED,RWED,RE)",
- * "DATA.DIR;1 1/9 2-JUN-1998 07:32:04 [GROUP,OWNER]
- * (RWED,RWED,RWED,RE)",
- * REGEX
is not a valid regular expression.
- */
- public VMSFTPEntryParser() {
- this(null);
- }
-
- /**
- * This constructor allows the creation of a VMSFTPEntryParser object with
- * something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 1.4
- */
- public VMSFTPEntryParser(FTPClientConfig config) {
- super(REGEX);
- configure(config);
- }
-
- /**
- * Parses a line of a VMS FTP server file listing and converts it into a
- * usable format in the form of an FTPFile
instance. If the
- * file listing line doesn't describe a file, null
is
- * returned, otherwise a FTPFile
instance representing the
- * files in the directory is returned.
- *
- * @param entry A line of text from the file listing
- * @return An FTPFile instance corresponding to the supplied entry
- */
- @Override public FTPFile parseFTPEntry(String entry) {
- //one block in VMS equals 512 bytes
- long longBlock = 512;
-
- if (matches(entry)) {
- FTPFile f = new FTPFile();
- f.setRawListing(entry);
- String name = group(1);
- String size = group(2);
- String datestr = group(3) + " " + group(4);
- String owner = group(5);
- String permissions[] = new String[3];
- permissions[0] = group(9);
- permissions[1] = group(10);
- permissions[2] = group(11);
- try {
- f.setTimestamp(super.parseTimestamp(datestr));
- } catch (ParseException e) {
- // intentionally do nothing
- }
-
- String grp;
- String user;
- StringTokenizer t = new StringTokenizer(owner, ",");
- switch (t.countTokens()) {
- case 1:
- grp = null;
- user = t.nextToken();
- break;
- case 2:
- grp = t.nextToken();
- user = t.nextToken();
- break;
- default:
- grp = null;
- user = null;
- }
-
- if (name.lastIndexOf(".DIR") != -1) {
- f.setType(FTPFile.DIRECTORY_TYPE);
- } else {
- f.setType(FTPFile.FILE_TYPE);
- }
- //set FTPFile name
- //Check also for versions to be returned or not
- if (isVersioning()) {
- f.setName(name);
- } else {
- name = name.substring(0, name.lastIndexOf(";"));
- f.setName(name);
- }
- //size is retreived in blocks and needs to be put in bytes
- //for us humans and added to the FTPFile array
- long sizeInBytes = Long.parseLong(size) * longBlock;
- f.setSize(sizeInBytes);
-
- f.setGroup(grp);
- f.setUser(user);
- //set group and owner
-
- //Set file permission.
- //VMS has (SYSTEM,OWNER,GROUP,WORLD) users that can contain
- //R (read) W (write) E (execute) D (delete)
-
- //iterate for OWNER GROUP WORLD permissions
- for (int access = 0; access < 3; access++) {
- String permission = permissions[access];
-
- f.setPermission(access, FTPFile.READ_PERMISSION, permission.indexOf('R') >= 0);
- f.setPermission(access, FTPFile.WRITE_PERMISSION, permission.indexOf('W') >= 0);
- f.setPermission(access, FTPFile.EXECUTE_PERMISSION, permission.indexOf('E') >= 0);
- }
-
- return f;
- }
- return null;
- }
-
- /**
- * Reads the next entry using the supplied BufferedReader object up to
- * whatever delemits one entry from the next. This parser cannot use
- * the default implementation of simply calling BufferedReader.readLine(),
- * because one entry may span multiple lines.
- *
- * @param reader The BufferedReader object from which entries are to be
- * read.
- * @return A string representing the next ftp entry or null if none found.
- * @throws IOException thrown on any IO Error reading from the reader.
- */
- @Override public String readNextEntry(BufferedReader reader) throws IOException {
- String line = reader.readLine();
- StringBuilder entry = new StringBuilder();
- while (line != null) {
- if (line.startsWith("Directory") || line.startsWith("Total")) {
- line = reader.readLine();
- continue;
- }
-
- entry.append(line);
- if (line.trim().endsWith(")")) {
- break;
- }
- line = reader.readLine();
- }
- return (entry.length() == 0 ? null : entry.toString());
- }
-
- protected boolean isVersioning() {
- return false;
- }
-
- /**
- * Defines a default configuration to be used when this class is
- * instantiated without a {@link FTPClientConfig FTPClientConfig}
- * parameter being specified.
- *
- * @return the default configuration for this parser.
- */
- @Override protected FTPClientConfig getDefaultConfiguration() {
- return new FTPClientConfig(FTPClientConfig.SYST_VMS, DEFAULT_DATE_FORMAT, null);
- }
-
- // DEPRECATED METHODS - for API compatibility only - DO NOT USE
-
- /**
- * DO NOT USE
- *
- * @param listStream the stream
- * @return the array of files
- * @throws IOException on error
- * @deprecated (2.2) No other FTPFileEntryParser implementations have this method.
- */
- @Deprecated public FTPFile[] parseFileList(java.io.InputStream listStream) throws IOException {
- FTPListParseEngine engine =
- new FTPListParseEngine(this);
- engine.readServerList(listStream, null);
- return engine.getFiles();
- }
-}
-
-/* Emacs configuration
- * Local variables: **
- * mode: java **
- * c-basic-offset: 4 **
- * indent-tabs-mode: nil **
- * End: **
- */
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java
deleted file mode 100644
index 948662a7..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/ftp/parser/VMSVersioningFTPEntryParser.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * 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 aria.apache.commons.net.ftp.parser;
-
-import aria.apache.commons.net.ftp.FTPClientConfig;
-import aria.apache.commons.net.ftp.FTPFileEntryParser;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.regex.MatchResult;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
-/**
- * Special implementation VMSFTPEntryParser with versioning turned on.
- * This parser removes all duplicates and only leaves the version with the highest
- * version number for each filename.
- *
- * This is a sample of VMS LIST output
- *
- * "1-JUN.LIS;1 9/9 2-JUN-1998 07:32:04 [GROUP,OWNER]
- * (RWED,RWED,RWED,RE)",
- * "1-JUN.LIS;2 9/9 2-JUN-1998 07:32:04 [GROUP,OWNER]
- * (RWED,RWED,RWED,RE)",
- * "DATA.DIR;1 1/9 2-JUN-1998 07:32:04 [GROUP,OWNER]
- * (RWED,RWED,RWED,RE)",
- * REGEX
is not a valid regular expression.
- */
- public VMSVersioningFTPEntryParser() {
- this(null);
- }
-
- /**
- * This constructor allows the creation of a VMSVersioningFTPEntryParser
- * object with something other than the default configuration.
- *
- * @param config The {@link FTPClientConfig configuration} object used to
- * configure this parser.
- * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not
- * be seen
- * under normal conditions. It it is seen, this is a sign that
- * REGEX
is not a valid regular expression.
- * @since 1.4
- */
- public VMSVersioningFTPEntryParser(FTPClientConfig config) {
- super();
- configure(config);
- try {
- //_preparse_matcher_ = new Perl5Matcher();
- _preparse_pattern_ = Pattern.compile(PRE_PARSE_REGEX);
- } catch (PatternSyntaxException pse) {
- throw new IllegalArgumentException("Unparseable regex supplied: " + PRE_PARSE_REGEX);
- }
- }
-
- /**
- * Implement hook provided for those implementers (such as
- * VMSVersioningFTPEntryParser, and possibly others) which return
- * multiple files with the same name to remove the duplicates ..
- *
- * @param original Original list
- * @return Original list purged of duplicates
- */
- @Override public ListUNKNOWN_STREAM_SIZE
if the
- * size is unknown.
- */
- public CopyStreamEvent(Object source, long totalBytesTransferred, int bytesTransferred,
- long streamSize) {
- super(source);
- this.bytesTransferred = bytesTransferred;
- this.totalBytesTransferred = totalBytesTransferred;
- this.streamSize = streamSize;
- }
-
- /**
- * Returns the number of bytes transferred by the write that triggered
- * the event.
- *
- * @return The number of bytes transferred by the write that triggered
- * the vent.
- */
- public int getBytesTransferred() {
- return bytesTransferred;
- }
-
- /**
- * Returns the total number of bytes transferred so far by the copy
- * operation.
- *
- * @return The total number of bytes transferred so far by the copy
- * operation.
- */
- public long getTotalBytesTransferred() {
- return totalBytesTransferred;
- }
-
- /**
- * Returns the size of the stream being copied.
- * This may be set to UNKNOWN_STREAM_SIZE
if the
- * size is unknown.
- *
- * @return The size of the stream being copied.
- */
- public long getStreamSize() {
- return streamSize;
- }
-
- /**
- * @since 3.0
- */
- @Override public String toString() {
- return getClass().getName()
- + "[source="
- + source
- + ", total="
- + totalBytesTransferred
- + ", bytes="
- + bytesTransferred
- + ", size="
- + streamSize
- + "]";
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamException.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamException.java
deleted file mode 100644
index 4314967c..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamException.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.IOException;
-
-/**
- * The CopyStreamException class is thrown by the org.apache.commons.io.Util
- * copyStream() methods. It stores the number of bytes confirmed to
- * have been transferred before an I/O error as well as the IOException
- * responsible for the failure of a copy operation.
- *
- * @version $Id: CopyStreamException.java 1299238 2012-03-10 17:12:28Z sebb $
- * @see Util
- */
-public class CopyStreamException extends IOException {
- private static final long serialVersionUID = -2602899129433221532L;
-
- private final long totalBytesTransferred;
-
- /**
- * Creates a new CopyStreamException instance.
- *
- * @param message A message describing the error.
- * @param bytesTransferred The total number of bytes transferred before
- * an exception was thrown in a copy operation.
- * @param exception The IOException thrown during a copy operation.
- */
- public CopyStreamException(String message, long bytesTransferred, IOException exception) {
- super(message);
- initCause(exception); // merge this into super() call once we need 1.6+
- totalBytesTransferred = bytesTransferred;
- }
-
- /**
- * Returns the total number of bytes confirmed to have
- * been transferred by a failed copy operation.
- *
- * @return The total number of bytes confirmed to have
- * been transferred by a failed copy operation.
- */
- public long getTotalBytesTransferred() {
- return totalBytesTransferred;
- }
-
- /**
- * Returns the IOException responsible for the failure of a copy operation.
- *
- * @return The IOException responsible for the failure of a copy operation.
- */
- public IOException getIOException() {
- return (IOException) getCause(); // cast is OK because it was initialised with an IOException
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamListener.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamListener.java
deleted file mode 100644
index 14670feb..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/CopyStreamListener.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.util.EventListener;
-
-/**
- * The CopyStreamListener class can accept CopyStreamEvents to keep track
- * of the progress of a stream copying operation. However, it is currently
- * not used that way within NetComponents for performance reasons. Rather
- * the bytesTransferred(long, int) method is called directly rather than
- * passing an event to bytesTransferred(CopyStreamEvent), saving the creation
- * of a CopyStreamEvent instance. Also, the only place where
- * CopyStreamListener is currently used within NetComponents is in the
- * static methods of the uninstantiable org.apache.commons.io.Util class, which
- * would preclude the use of addCopyStreamListener and
- * removeCopyStreamListener methods. However, future additions may use the
- * JavaBean event model, which is why the hooks have been included from the
- * beginning.
- *
- * @version $Id: CopyStreamListener.java 1652801 2015-01-18 17:10:05Z sebb $
- * @see CopyStreamEvent
- * @see CopyStreamAdapter
- * @see Util
- */
-public interface CopyStreamListener extends EventListener {
- /**
- * This method is invoked by a CopyStreamEvent source after copying
- * a block of bytes from a stream. The CopyStreamEvent will contain
- * the total number of bytes transferred so far and the number of bytes
- * transferred in the last write.
- *
- * @param event The CopyStreamEvent fired by the copying of a block of
- * bytes.
- */
- public void bytesTransferred(CopyStreamEvent event);
-
- /**
- * This method is not part of the JavaBeans model and is used by the
- * static methods in the org.apache.commons.io.Util class for efficiency.
- * It is invoked after a block of bytes to inform the listener of the
- * transfer.
- *
- * @param totalBytesTransferred The total number of bytes transferred
- * so far by the copy operation.
- * @param bytesTransferred The number of bytes copied by the most recent
- * write.
- * @param streamSize The number of bytes in the stream being copied.
- * This may be equal to CopyStreamEvent.UNKNOWN_STREAM_SIZE if
- * the size is unknown.
- */
- public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize);
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageReader.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageReader.java
deleted file mode 100644
index e554a359..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/DotTerminatedMessageReader.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * DotTerminatedMessageReader is a class used to read messages from a
- * server that are terminated by a single dot followed by a
- * <CR><LF>
- * sequence and with double dots appearing at the begining of lines which
- * do not signal end of message yet start with a dot. Various Internet
- * protocols such as NNTP and POP3 produce messages of this type.
- * flush()
will
- * not flush the last byte written if that byte was a carriage
- * return. A call to {@link #close close() }, however, will
- * flush the carriage return.
- *
- *
- ***/
-
-public final class FromNetASCIIOutputStream extends FilterOutputStream {
- private boolean __lastWasCR;
-
- /***
- * Creates a FromNetASCIIOutputStream instance that wraps an existing
- * OutputStream.
- *
- * @param output The OutputStream to wrap.
- ***/
- public FromNetASCIIOutputStream(OutputStream output) {
- super(output);
- __lastWasCR = false;
- }
-
- private void __write(int ch) throws IOException {
- switch (ch) {
- case '\r':
- __lastWasCR = true;
- // Don't write anything. We need to see if next one is linefeed
- break;
- case '\n':
- if (__lastWasCR) {
- out.write(FromNetASCIIInputStream._lineSeparatorBytes);
- __lastWasCR = false;
- break;
- }
- __lastWasCR = false;
- out.write('\n');
- break;
- default:
- if (__lastWasCR) {
- out.write('\r');
- __lastWasCR = false;
- }
- out.write(ch);
- break;
- }
- }
-
- /***
- * Writes a byte to the stream. Note that a call to this method
- * might not actually write a byte to the underlying stream until a
- * subsequent character is written, from which it can be determined if
- * a NETASCII line separator was encountered.
- * This is transparent to the programmer and is only mentioned for
- * completeness.
- *
- * @param ch The byte to write.
- * @throws IOException If an error occurs while writing to the underlying
- * stream.
- ***/
- @Override public synchronized void write(int ch) throws IOException {
- if (FromNetASCIIInputStream._noConversionRequired) {
- out.write(ch);
- return;
- }
-
- __write(ch);
- }
-
- /***
- * Writes a byte array to the stream.
- *
- * @param buffer The byte array to write.
- * @throws IOException If an error occurs while writing to the underlying
- * stream.
- ***/
- @Override public synchronized void write(byte buffer[]) throws IOException {
- write(buffer, 0, buffer.length);
- }
-
- /***
- * Writes a number of bytes from a byte array to the stream starting from
- * a given offset.
- *
- * @param buffer The byte array to write.
- * @param offset The offset into the array at which to start copying data.
- * @param length The number of bytes to write.
- * @throws IOException If an error occurs while writing to the underlying
- * stream.
- ***/
- @Override public synchronized void write(byte buffer[], int offset, int length)
- throws IOException {
- if (FromNetASCIIInputStream._noConversionRequired) {
- // FilterOutputStream method is very slow.
- //super.write(buffer, offset, length);
- out.write(buffer, offset, length);
- return;
- }
-
- while (length-- > 0) {
- __write(buffer[offset++]);
- }
- }
-
- /***
- * Closes the stream, writing all pending data.
- *
- * @throws IOException If an error occurs while closing the stream.
- ***/
- @Override public synchronized void close() throws IOException {
- if (FromNetASCIIInputStream._noConversionRequired) {
- super.close();
- return;
- }
-
- if (__lastWasCR) {
- out.write('\r');
- }
- super.close();
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketInputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketInputStream.java
deleted file mode 100644
index 531e4029..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketInputStream.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.Socket;
-
-/***
- * This class wraps an input stream, storing a reference to its originating
- * socket. When the stream is closed, it will also close the socket
- * immediately afterward. This class is useful for situations where you
- * are dealing with a stream originating from a socket, but do not have
- * a reference to the socket, and want to make sure it closes when the
- * stream closes.
- *
- *
- * @see SocketOutputStream
- ***/
-
-public class SocketInputStream extends FilterInputStream {
- private final Socket __socket;
-
- /***
- * Creates a SocketInputStream instance wrapping an input stream and
- * storing a reference to a socket that should be closed on closing
- * the stream.
- *
- * @param socket The socket to close on closing the stream.
- * @param stream The input stream to wrap.
- ***/
- public SocketInputStream(Socket socket, InputStream stream) {
- super(stream);
- __socket = socket;
- }
-
- /***
- * Closes the stream and immediately afterward closes the referenced
- * socket.
- *
- * @throws IOException If there is an error in closing the stream
- * or socket.
- ***/
- @Override public void close() throws IOException {
- super.close();
- __socket.close();
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketOutputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketOutputStream.java
deleted file mode 100644
index 3393ded7..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/SocketOutputStream.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/***
- * This class wraps an output stream, storing a reference to its originating
- * socket. When the stream is closed, it will also close the socket
- * immediately afterward. This class is useful for situations where you
- * are dealing with a stream originating from a socket, but do not have
- * a reference to the socket, and want to make sure it closes when the
- * stream closes.
- *
- *
- * @see SocketInputStream
- ***/
-
-public class SocketOutputStream extends FilterOutputStream {
- private final Socket __socket;
-
- /***
- * Creates a SocketOutputStream instance wrapping an output stream and
- * storing a reference to a socket that should be closed on closing
- * the stream.
- *
- * @param socket The socket to close on closing the stream.
- * @param stream The input stream to wrap.
- ***/
- public SocketOutputStream(Socket socket, OutputStream stream) {
- super(stream);
- __socket = socket;
- }
-
- /***
- * Writes a number of bytes from a byte array to the stream starting from
- * a given offset. This method bypasses the equivalent method in
- * FilterOutputStream because the FilterOutputStream implementation is
- * very inefficient.
- *
- * @param buffer The byte array to write.
- * @param offset The offset into the array at which to start copying data.
- * @param length The number of bytes to write.
- * @throws IOException If an error occurs while writing to the underlying
- * stream.
- ***/
- @Override public void write(byte buffer[], int offset, int length) throws IOException {
- out.write(buffer, offset, length);
- }
-
- /***
- * Closes the stream and immediately afterward closes the referenced
- * socket.
- *
- * @throws IOException If there is an error in closing the stream
- * or socket.
- ***/
- @Override public void close() throws IOException {
- super.close();
- __socket.close();
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIInputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIInputStream.java
deleted file mode 100644
index e7ee8bc5..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIInputStream.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/***
- * This class wraps an input stream, replacing all singly occurring
- * <LF> (linefeed) characters with <CR><LF> (carriage return
- * followed by linefeed), which is the NETASCII standard for representing
- * a newline.
- * You would use this class to implement ASCII file transfers requiring
- * conversion to NETASCII.
- *
- *
- ***/
-
-public final class ToNetASCIIInputStream extends FilterInputStream {
- private static final int __NOTHING_SPECIAL = 0;
- private static final int __LAST_WAS_CR = 1;
- private static final int __LAST_WAS_NL = 2;
- private int __status;
-
- /***
- * Creates a ToNetASCIIInputStream instance that wraps an existing
- * InputStream.
- *
- * @param input The InputStream to wrap.
- ***/
- public ToNetASCIIInputStream(InputStream input) {
- super(input);
- __status = __NOTHING_SPECIAL;
- }
-
- /***
- * Reads and returns the next byte in the stream. If the end of the
- * message has been reached, returns -1.
- *
- * @return The next character in the stream. Returns -1 if the end of the
- * stream has been reached.
- * @throws IOException If an error occurs while reading the underlying
- * stream.
- ***/
- @Override public int read() throws IOException {
- int ch;
-
- if (__status == __LAST_WAS_NL) {
- __status = __NOTHING_SPECIAL;
- return '\n';
- }
-
- ch = in.read();
-
- switch (ch) {
- case '\r':
- __status = __LAST_WAS_CR;
- return '\r';
- case '\n':
- if (__status != __LAST_WAS_CR) {
- __status = __LAST_WAS_NL;
- return '\r';
- }
- //$FALL-THROUGH$
- default:
- __status = __NOTHING_SPECIAL;
- return ch;
- }
- // statement not reached
- //return ch;
- }
-
- /***
- * Reads the next number of bytes from the stream into an array and
- * returns the number of bytes read. Returns -1 if the end of the
- * stream has been reached.
- *
- * @param buffer The byte array in which to store the data.
- * @return The number of bytes read. Returns -1 if the
- * end of the message has been reached.
- * @throws IOException If an error occurs in reading the underlying
- * stream.
- ***/
- @Override public int read(byte buffer[]) throws IOException {
- return read(buffer, 0, buffer.length);
- }
-
- /***
- * Reads the next number of bytes from the stream into an array and returns
- * the number of bytes read. Returns -1 if the end of the
- * message has been reached. The characters are stored in the array
- * starting from the given offset and up to the length specified.
- *
- * @param buffer The byte array in which to store the data.
- * @param offset The offset into the array at which to start storing data.
- * @param length The number of bytes to read.
- * @return The number of bytes read. Returns -1 if the
- * end of the stream has been reached.
- * @throws IOException If an error occurs while reading the underlying
- * stream.
- ***/
- @Override public int read(byte buffer[], int offset, int length) throws IOException {
- int ch, off;
-
- if (length < 1) {
- return 0;
- }
-
- ch = available();
-
- if (length > ch) {
- length = ch;
- }
-
- // If nothing is available, block to read only one character
- if (length < 1) {
- length = 1;
- }
-
- if ((ch = read()) == -1) {
- return -1;
- }
-
- off = offset;
-
- do {
- buffer[offset++] = (byte) ch;
- } while (--length > 0 && (ch = read()) != -1);
-
- return (offset - off);
- }
-
- /*** Returns false. Mark is not supported. ***/
- @Override public boolean markSupported() {
- return false;
- }
-
- @Override public int available() throws IOException {
- int result;
-
- result = in.available();
-
- if (__status == __LAST_WAS_NL) {
- return (result + 1);
- }
-
- return result;
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIOutputStream.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIOutputStream.java
deleted file mode 100644
index d54a8758..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/ToNetASCIIOutputStream.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-/***
- * This class wraps an output stream, replacing all singly occurring
- * <LF> (linefeed) characters with <CR><LF> (carriage return
- * followed by linefeed), which is the NETASCII standard for representing
- * a newline.
- * You would use this class to implement ASCII file transfers requiring
- * conversion to NETASCII.
- *
- *
- ***/
-
-public final class ToNetASCIIOutputStream extends FilterOutputStream {
- private boolean __lastWasCR;
-
- /***
- * Creates a ToNetASCIIOutputStream instance that wraps an existing
- * OutputStream.
- *
- * @param output The OutputStream to wrap.
- ***/
- public ToNetASCIIOutputStream(OutputStream output) {
- super(output);
- __lastWasCR = false;
- }
-
- /***
- * Writes a byte to the stream. Note that a call to this method
- * may result in multiple writes to the underlying input stream in order
- * to convert naked newlines to NETASCII line separators.
- * This is transparent to the programmer and is only mentioned for
- * completeness.
- *
- * @param ch The byte to write.
- * @throws IOException If an error occurs while writing to the underlying
- * stream.
- ***/
- @Override public synchronized void write(int ch) throws IOException {
- switch (ch) {
- case '\r':
- __lastWasCR = true;
- out.write('\r');
- return;
- case '\n':
- if (!__lastWasCR) {
- out.write('\r');
- }
- //$FALL-THROUGH$
- default:
- __lastWasCR = false;
- out.write(ch);
- return;
- }
- }
-
- /***
- * Writes a byte array to the stream.
- *
- * @param buffer The byte array to write.
- * @throws IOException If an error occurs while writing to the underlying
- * stream.
- ***/
- @Override public synchronized void write(byte buffer[]) throws IOException {
- write(buffer, 0, buffer.length);
- }
-
- /***
- * Writes a number of bytes from a byte array to the stream starting from
- * a given offset.
- *
- * @param buffer The byte array to write.
- * @param offset The offset into the array at which to start copying data.
- * @param length The number of bytes to write.
- * @throws IOException If an error occurs while writing to the underlying
- * stream.
- ***/
- @Override public synchronized void write(byte buffer[], int offset, int length)
- throws IOException {
- while (length-- > 0) {
- write(buffer[offset++]);
- }
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/Util.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/Util.java
deleted file mode 100644
index bdf74b76..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/Util.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * 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 aria.apache.commons.net.io;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-
-/***
- * The Util class cannot be instantiated and stores short static convenience
- * methods that are often quite useful.
- *
- *
- * @see CopyStreamException
- * @see CopyStreamListener
- * @see CopyStreamAdapter
- ***/
-
-public final class Util {
- /**
- * The default buffer size ({@value}) used by
- * {@link #copyStream copyStream } and {@link #copyReader copyReader}
- * and by the copyReader/copyStream methods if a zero or negative buffer size is supplied.
- */
- public static final int DEFAULT_COPY_BUFFER_SIZE = 1024;
-
- // Cannot be instantiated
- private Util() {
- }
-
- /***
- * Copies the contents of an InputStream to an OutputStream using a
- * copy buffer of a given size and notifies the provided
- * CopyStreamListener of the progress of the copy operation by calling
- * its bytesTransferred(long, int) method after each write to the
- * destination. If you wish to notify more than one listener you should
- * use a CopyStreamAdapter as the listener and register the additional
- * listeners with the CopyStreamAdapter.
- * copyStream(source, dest, DEFAULT_COPY_BUFFER_SIZE);
- * @param source where to copy from
- * @param dest where to copy to
- * @return number of bytes copied
- * @throws CopyStreamException on error
- ***/
- public static final long copyStream(InputStream source, OutputStream dest)
- throws CopyStreamException {
- return copyStream(source, dest, DEFAULT_COPY_BUFFER_SIZE);
- }
-
- /***
- * Copies the contents of a Reader to a Writer using a
- * copy buffer of a given size and notifies the provided
- * CopyStreamListener of the progress of the copy operation by calling
- * its bytesTransferred(long, int) method after each write to the
- * destination. If you wish to notify more than one listener you should
- * use a CopyStreamAdapter as the listener and register the additional
- * listeners with the CopyStreamAdapter.
- * copyReader(source, dest, DEFAULT_COPY_BUFFER_SIZE);
- * @param source where to copy from
- * @param dest where to copy to
- * @return number of bytes copied
- * @throws CopyStreamException on error
- ***/
- public static final long copyReader(Reader source, Writer dest) throws CopyStreamException {
- return copyReader(source, dest, DEFAULT_COPY_BUFFER_SIZE);
- }
-
- /**
- * Closes the object quietly, catching rather than throwing IOException.
- * Intended for use from finally blocks.
- *
- * @param closeable the object to close, may be {@code null}
- * @since 3.0
- */
- public static void closeQuietly(Closeable closeable) {
- if (closeable != null) {
- try {
- closeable.close();
- } catch (IOException e) {
- // Ignored
- }
- }
- }
-
- /**
- * Closes the socket quietly, catching rather than throwing IOException.
- * Intended for use from finally blocks.
- *
- * @param socket the socket to close, may be {@code null}
- * @since 3.0
- */
- public static void closeQuietly(Socket socket) {
- if (socket != null) {
- try {
- socket.close();
- } catch (IOException e) {
- // Ignored
- }
- }
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/package-info.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/package-info.java
deleted file mode 100644
index 06207d12..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/io/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * Utility classes for IO support.
- */
-package aria.apache.commons.net.io;
\ No newline at end of file
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Base64.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Base64.java
deleted file mode 100644
index a03150e0..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Base64.java
+++ /dev/null
@@ -1,1056 +0,0 @@
-/*
- * 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 aria.apache.commons.net.util;
-
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-
-/**
- * Provides Base64 encoding and decoding as defined by RFC 2045.
- *
- *
- *
- * decodeSize = 3 + lineSeparator.length;
- */
- private final int decodeSize;
-
- /**
- * Convenience variable to help us determine when our buffer is going to run out of room and needs
- * resizing.
- * encodeSize = 4 + lineSeparator.length;
- */
- private final int encodeSize;
-
- /**
- * Buffer for streaming.
- */
- private byte[] buffer;
-
- /**
- * Position where next character should be written in the buffer.
- */
- private int pos;
-
- /**
- * Position where next character should be read from the buffer.
- */
- private int readPos;
-
- /**
- * Variable tracks how many characters have been written to the current line. Only used when
- * encoding. We use it to
- * make sure each encoded line never goes beyond lineLength (if lineLength > 0).
- */
- private int currentLinePos;
-
- /**
- * Writes to the buffer only occur after every 3 reads when encoding, an every 4 reads when
- * decoding. This variable
- * helps track that.
- */
- private int modulus;
-
- /**
- * Boolean flag to indicate the EOF has been reached. Once EOF has been reached, this Base64
- * object becomes useless,
- * and must be thrown away.
- */
- private boolean eof;
-
- /**
- * Place holder for the 3 bytes we're dealing with for our base64 logic. Bitwise operations store
- * and extract the
- * base64 encoding or decoding from this variable.
- */
- private int x;
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
- * true
, URL-safe encoding is used. In most cases this should be
- * set to
- * false
.
- * @since 1.4
- */
- public Base64(boolean urlSafe) {
- this(CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe);
- }
-
- /**
- * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
- * octet
is in the base 64 alphabet.
- *
- * @param octet The value to test
- * @return true
if the value is defined in the the base 64 alphabet,
- * false
otherwise.
- * @since 1.4
- */
- public static boolean isBase64(byte octet) {
- return octet == PAD || (octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1);
- }
-
- /**
- * Tests a given byte array to see if it contains only valid characters within the Base64
- * alphabet. Currently the
- * method treats whitespace as valid.
- *
- * @param arrayOctet byte array to test
- * @return true
if all bytes are valid characters in the Base64 alphabet or if the
- * byte array is empty;
- * false, otherwise
- */
- public static boolean isArrayByteBase64(byte[] arrayOctet) {
- for (int i = 0; i < arrayOctet.length; i++) {
- if (!isBase64(arrayOctet[i]) && !isWhiteSpace(arrayOctet[i])) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Tests a given byte array to see if it contains only valid characters within the Base64
- * alphabet.
- *
- * @param arrayOctet byte array to test
- * @return true
if any byte is a valid character in the Base64 alphabet; false
- * herwise
- */
- private static boolean containsBase64Byte(byte[] arrayOctet) {
- for (byte element : arrayOctet) {
- if (isBase64(element)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Encodes binary data using the base64 algorithm but does not chunk the output.
- *
- * @param binaryData binary data to encode
- * @return byte[] containing Base64 characters in their UTF-8 representation.
- */
- public static byte[] encodeBase64(byte[] binaryData) {
- return encodeBase64(binaryData, false);
- }
-
- /**
- * Encodes binary data using the base64 algorithm into 76 character blocks separated by CRLF.
- * true
this encoder will chunk the base64 output into 76
- * character blocks
- * @return Base64-encoded data.
- * @throws IllegalArgumentException Thrown when the input array needs an output array bigger than
- * {@link Integer#MAX_VALUE}
- */
- public static byte[] encodeBase64(byte[] binaryData, boolean isChunked) {
- return encodeBase64(binaryData, isChunked, false);
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76
- * character blocks.
- *
- * @param binaryData Array containing binary data to encode.
- * @param isChunked if true
this encoder will chunk the base64 output into 76
- * character blocks
- * @param urlSafe if true
this encoder will emit - and _ instead of the usual + and /
- * characters.
- * @return Base64-encoded data.
- * @throws IllegalArgumentException Thrown when the input array needs an output array bigger than
- * {@link Integer#MAX_VALUE}
- * @since 1.4
- */
- public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe) {
- return encodeBase64(binaryData, isChunked, urlSafe, Integer.MAX_VALUE);
- }
-
- /**
- * Encodes binary data using the base64 algorithm, optionally chunking the output into 76
- * character blocks.
- *
- * @param binaryData Array containing binary data to encode.
- * @param isChunked if true
this encoder will chunk the base64 output into 76
- * character blocks
- * @param urlSafe if true
this encoder will emit - and _ instead of the usual + and /
- * characters.
- * @param maxResultSize The maximum result size to accept.
- * @return Base64-encoded data.
- * @throws IllegalArgumentException Thrown when the input array needs an output array bigger than
- * maxResultSize
- * @since 1.4
- */
- public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe,
- int maxResultSize) {
- if (binaryData == null || binaryData.length == 0) {
- return binaryData;
- }
-
- long len = getEncodeLength(binaryData, isChunked ? CHUNK_SIZE : 0,
- isChunked ? CHUNK_SEPARATOR : EMPTY_BYTE_ARRAY);
- if (len > maxResultSize) {
- throw new IllegalArgumentException("Input array too big, the output array would be bigger ("
- + len
- + ") than the specified maxium size of "
- + maxResultSize);
- }
-
- Base64 b64 = isChunked ? new Base64(urlSafe) : new Base64(0, CHUNK_SEPARATOR, urlSafe);
- return b64.encode(binaryData);
- }
-
- /**
- * Decodes a Base64 String into octets
- *
- * @param base64String String containing Base64 data
- * @return Array containing decoded data.
- * @since 1.4
- */
- public static byte[] decodeBase64(String base64String) {
- return new Base64().decode(base64String);
- }
-
- /**
- * Decodes Base64 data into octets
- *
- * @param base64Data Byte array containing Base64 data
- * @return Array containing decoded data.
- */
- public static byte[] decodeBase64(byte[] base64Data) {
- return new Base64().decode(base64Data);
- }
-
- /**
- * Checks if a byte value is whitespace or not.
- *
- * @param byteToCheck the byte to check
- * @return true if byte is whitespace, false otherwise
- */
- private static boolean isWhiteSpace(byte byteToCheck) {
- switch (byteToCheck) {
- case ' ':
- case '\n':
- case '\r':
- case '\t':
- return true;
- default:
- return false;
- }
- }
-
- /**
- * Encodes a byte[] containing binary data, into a String containing characters in the Base64
- * alphabet.
- *
- * @param pArray a byte array containing binary data
- * @return A String containing only Base64 character data
- * @since 1.4
- */
- public String encodeToString(byte[] pArray) {
- return newStringUtf8(encode(pArray));
- }
-
- private static String newStringUtf8(byte[] encode) {
- String str = null;
- try {
- str = new String(encode, "UTF8");
- } catch (UnsupportedEncodingException ue) {
- throw new RuntimeException(ue);
- }
- return str;
- }
-
- /**
- * Encodes a byte[] containing binary data, into a byte[] containing characters in the Base64
- * alphabet.
- *
- * @param pArray a byte array containing binary data
- * @return A byte array containing only Base64 character data
- */
- public byte[] encode(byte[] pArray) {
- reset();
- if (pArray == null || pArray.length == 0) {
- return pArray;
- }
- long len = getEncodeLength(pArray, lineLength, lineSeparator);
- byte[] buf = new byte[(int) len];
- setInitialBuffer(buf, 0, buf.length);
- encode(pArray, 0, pArray.length);
- encode(pArray, 0, -1); // Notify encoder of EOF.
- // Encoder might have resized, even though it was unnecessary.
- if (buffer != buf) {
- readResults(buf, 0, buf.length);
- }
- // In URL-SAFE mode we skip the padding characters, so sometimes our
- // final length is a bit smaller.
- if (isUrlSafe() && pos < buf.length) {
- byte[] smallerBuf = new byte[pos];
- System.arraycopy(buf, 0, smallerBuf, 0, pos);
- buf = smallerBuf;
- }
- return buf;
- }
-
- /**
- * Pre-calculates the amount of space needed to base64-encode the supplied array.
- *
- * @param pArray byte[] array which will later be encoded
- * @param chunkSize line-length of the output (<= 0 means no chunking) between each
- * chunkSeparator (e.g. CRLF).
- * @param chunkSeparator the sequence of bytes used to separate chunks of output (e.g. CRLF).
- * @return amount of space needed to encoded the supplied array. Returns
- * a long since a max-len array will require Integer.MAX_VALUE + 33%.
- */
- private static long getEncodeLength(byte[] pArray, int chunkSize, byte[] chunkSeparator) {
- // base64 always encodes to multiples of 4.
- chunkSize = (chunkSize / 4) * 4;
-
- long len = (pArray.length * 4) / 3;
- long mod = len % 4;
- if (mod != 0) {
- len += 4 - mod;
- }
- if (chunkSize > 0) {
- boolean lenChunksPerfectly = len % chunkSize == 0;
- len += (len / chunkSize) * chunkSeparator.length;
- if (!lenChunksPerfectly) {
- len += chunkSeparator.length;
- }
- }
- return len;
- }
-
- // Implementation of integer encoding used for crypto
-
- /**
- * Decodes a byte64-encoded integer according to crypto standards such as W3C's XML-Signature
- *
- * @param pArray a byte array containing base64 character data
- * @return A BigInteger
- * @since 1.4
- */
- public static BigInteger decodeInteger(byte[] pArray) {
- return new BigInteger(1, decodeBase64(pArray));
- }
-
- /**
- * Encodes to a byte64-encoded integer according to crypto standards such as W3C's XML-Signature
- *
- * @param bigInt a BigInteger
- * @return A byte array containing base64 character data
- * @throws NullPointerException if null is passed in
- * @since 1.4
- */
- public static byte[] encodeInteger(BigInteger bigInt) {
- if (bigInt == null) {
- throw new NullPointerException("encodeInteger called with null parameter");
- }
- return encodeBase64(toIntegerBytes(bigInt), false);
- }
-
- /**
- * Returns a byte-array representation of a BigInteger
without sign bit.
- *
- * @param bigInt BigInteger
to be converted
- * @return a byte array representation of the BigInteger parameter
- */
- static byte[] toIntegerBytes(BigInteger bigInt) {
- int bitlen = bigInt.bitLength();
- // round bitlen
- bitlen = ((bitlen + 7) >> 3) << 3;
- byte[] bigBytes = bigInt.toByteArray();
-
- if (((bigInt.bitLength() % 8) != 0) && (((bigInt.bitLength() / 8) + 1) == (bitlen / 8))) {
- return bigBytes;
- }
- // set up params for copying everything but sign bit
- int startSrc = 0;
- int len = bigBytes.length;
-
- // if bigInt is exactly byte-aligned, just skip signbit in copy
- if ((bigInt.bitLength() % 8) == 0) {
- startSrc = 1;
- len--;
- }
- int startDst = bitlen / 8 - len; // to pad w/ nulls as per spec
- byte[] resizedBytes = new byte[bitlen / 8];
- System.arraycopy(bigBytes, startSrc, resizedBytes, startDst, len);
- return resizedBytes;
- }
-
- /**
- * Resets this Base64 object to its initial newly constructed state.
- */
- private void reset() {
- buffer = null;
- pos = 0;
- readPos = 0;
- currentLinePos = 0;
- modulus = 0;
- eof = false;
- }
-
- // Getters for use in testing
-
- int getLineLength() {
- return lineLength;
- }
-
- byte[] getLineSeparator() {
- return lineSeparator.clone();
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Charsets.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Charsets.java
deleted file mode 100644
index 5001fcc0..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/Charsets.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 aria.apache.commons.net.util;
-
-import java.nio.charset.Charset;
-
-/**
- * Helps dealing with Charsets.
- *
- * @since 3.3
- */
-public class Charsets {
-
- /**
- * Returns a charset object for the given charset name.
- *
- * @param charsetName The name of the requested charset; may be a canonical name, an alias, or
- * null. If null, return the
- * default charset.
- * @return A charset object for the named charset
- */
- public static Charset toCharset(String charsetName) {
- return charsetName == null ? Charset.defaultCharset() : Charset.forName(charsetName);
- }
-
- /**
- * Returns a charset object for the given charset name.
- *
- * @param charsetName The name of the requested charset; may be a canonical name, an alias, or
- * null.
- * If null, return the default charset.
- * @param defaultCharsetName the charset name to use if the requested charset is null
- * @return A charset object for the named charset
- */
- public static Charset toCharset(String charsetName, String defaultCharsetName) {
- return charsetName == null ? Charset.forName(defaultCharsetName) : Charset.forName(charsetName);
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/KeyManagerUtils.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/KeyManagerUtils.java
deleted file mode 100644
index 012493b0..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/KeyManagerUtils.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * 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 aria.apache.commons.net.util;
-
-import aria.apache.commons.net.io.Util;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.net.Socket;
-import java.security.GeneralSecurityException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.Principal;
-import java.security.PrivateKey;
-import java.security.cert.Certificate;
-import java.security.cert.X509Certificate;
-import java.util.Enumeration;
-
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.X509ExtendedKeyManager;
-
-/**
- * General KeyManager utilities
- *
- * KeyManager km = KeyManagerUtils.createClientKeyManager("JKS",
- * "/path/to/privatekeystore.jks","storepassword",
- * "privatekeyalias", "keypassword");
- * FTPSClient cl = new FTPSClient();
- * cl.setKeyManager(km);
- * cl.connect(...);
- *
- * If using the default store type and the key password is the same as the
- * store password, these parameters can be omitted.
- * If the desired key is the first or only key in the keystore, the keyAlias parameter
- * can be omitted, in which case the code becomes:
- *
- * KeyManager km = KeyManagerUtils.createClientKeyManager(
- * "/path/to/privatekeystore.jks","storepassword");
- * FTPSClient cl = new FTPSClient();
- * cl.setKeyManager(km);
- * cl.connect(...);
- *
- *
- * @since 3.0
- */
-public final class KeyManagerUtils {
-
- private static final String DEFAULT_STORE_TYPE = KeyStore.getDefaultType();
-
- private KeyManagerUtils() {
- // Not instantiable
- }
-
- /**
- * Create a client key manager which returns a particular key.
- * Does not handle server keys.
- *
- * @param ks the keystore to use
- * @param keyAlias the alias of the key to use, may be {@code null} in which case the first key
- * entry alias is used
- * @param keyPass the password of the key to use
- * @return the customised KeyManager
- * @throws GeneralSecurityException if there is a problem creating the keystore
- */
- public static KeyManager createClientKeyManager(KeyStore ks, String keyAlias, String keyPass)
- throws GeneralSecurityException {
- ClientKeyStore cks =
- new ClientKeyStore(ks, keyAlias != null ? keyAlias : findAlias(ks), keyPass);
- return new X509KeyManager(cks);
- }
-
- /**
- * Create a client key manager which returns a particular key.
- * Does not handle server keys.
- *
- * @param storeType the type of the keyStore, e.g. "JKS"
- * @param storePath the path to the keyStore
- * @param storePass the keyStore password
- * @param keyAlias the alias of the key to use, may be {@code null} in which case the first key
- * entry alias is used
- * @param keyPass the password of the key to use
- * @return the customised KeyManager
- * @throws GeneralSecurityException if there is a problem creating the keystore
- * @throws IOException if there is a problem creating the keystore
- */
- public static KeyManager createClientKeyManager(String storeType, File storePath,
- String storePass, String keyAlias, String keyPass)
- throws IOException, GeneralSecurityException {
- KeyStore ks = loadStore(storeType, storePath, storePass);
- return createClientKeyManager(ks, keyAlias, keyPass);
- }
-
- /**
- * Create a client key manager which returns a particular key.
- * Does not handle server keys.
- * Uses the default store type and assumes the key password is the same as the store password
- *
- * @param storePath the path to the keyStore
- * @param storePass the keyStore password
- * @param keyAlias the alias of the key to use, may be {@code null} in which case the first key
- * entry alias is used
- * @return the customised KeyManager
- * @throws IOException if there is a problem creating the keystore
- * @throws GeneralSecurityException if there is a problem creating the keystore
- */
- public static KeyManager createClientKeyManager(File storePath, String storePass, String keyAlias)
- throws IOException, GeneralSecurityException {
- return createClientKeyManager(DEFAULT_STORE_TYPE, storePath, storePass, keyAlias, storePass);
- }
-
- /**
- * Create a client key manager which returns a particular key.
- * Does not handle server keys.
- * Uses the default store type and assumes the key password is the same as the store password.
- * The key alias is found by searching the keystore for the first private key entry
- *
- * @param storePath the path to the keyStore
- * @param storePass the keyStore password
- * @return the customised KeyManager
- * @throws IOException if there is a problem creating the keystore
- * @throws GeneralSecurityException if there is a problem creating the keystore
- */
- public static KeyManager createClientKeyManager(File storePath, String storePass)
- throws IOException, GeneralSecurityException {
- return createClientKeyManager(DEFAULT_STORE_TYPE, storePath, storePass, null, storePass);
- }
-
- private static KeyStore loadStore(String storeType, File storePath, String storePass)
- throws KeyStoreException, IOException, GeneralSecurityException {
- KeyStore ks = KeyStore.getInstance(storeType);
- FileInputStream stream = null;
- try {
- stream = new FileInputStream(storePath);
- ks.load(stream, storePass.toCharArray());
- } finally {
- Util.closeQuietly(stream);
- }
- return ks;
- }
-
- private static String findAlias(KeyStore ks) throws KeyStoreException {
- Enumerationtrue
if the return value of {@link SubnetInfo#getAddressCount()}
- * includes the network and broadcast addresses.
- *
- * @return true if the hostcount includes the network and broadcast addresses
- * @since 2.2
- */
- public boolean isInclusiveHostCount() {
- return inclusiveHostCount;
- }
-
- /**
- * Set to true
if you want the return value of {@link SubnetInfo#getAddressCount()}
- * to include the network and broadcast addresses.
- *
- * @param inclusiveHostCount true if network and broadcast addresses are to be included
- * @since 2.2
- */
- public void setInclusiveHostCount(boolean inclusiveHostCount) {
- this.inclusiveHostCount = inclusiveHostCount;
- }
-
- /**
- * Convenience container for subnet summary information.
- */
- public final class SubnetInfo {
- /* Mask to convert unsigned int to a long (i.e. keep 32 bits) */
- private static final long UNSIGNED_INT_MASK = 0x0FFFFFFFFL;
-
- private SubnetInfo() {
- }
-
- private int netmask() {
- return netmask;
- }
-
- private int network() {
- return network;
- }
-
- private int address() {
- return address;
- }
-
- private int broadcast() {
- return broadcast;
- }
-
- // long versions of the values (as unsigned int) which are more suitable for range checking
- private long networkLong() {
- return network & UNSIGNED_INT_MASK;
- }
-
- private long broadcastLong() {
- return broadcast & UNSIGNED_INT_MASK;
- }
-
- private int low() {
- return (isInclusiveHostCount() ? network()
- : broadcastLong() - networkLong() > 1 ? network() + 1 : 0);
- }
-
- private int high() {
- return (isInclusiveHostCount() ? broadcast()
- : broadcastLong() - networkLong() > 1 ? broadcast() - 1 : 0);
- }
-
- /**
- * Returns true if the parameter address
is in the
- * range of usable endpoint addresses for this subnet. This excludes the
- * network and broadcast adresses.
- *
- * @param address A dot-delimited IPv4 address, e.g. "192.168.0.1"
- * @return True if in range, false otherwise
- */
- public boolean isInRange(String address) {
- return isInRange(toInteger(address));
- }
-
- /**
- * @param address the address to check
- * @return true if it is in range
- * @since 3.4 (made public)
- */
- public boolean isInRange(int address) {
- long addLong = address & UNSIGNED_INT_MASK;
- long lowLong = low() & UNSIGNED_INT_MASK;
- long highLong = high() & UNSIGNED_INT_MASK;
- return addLong >= lowLong && addLong <= highLong;
- }
-
- public String getBroadcastAddress() {
- return format(toArray(broadcast()));
- }
-
- public String getNetworkAddress() {
- return format(toArray(network()));
- }
-
- public String getNetmask() {
- return format(toArray(netmask()));
- }
-
- public String getAddress() {
- return format(toArray(address()));
- }
-
- /**
- * Return the low address as a dotted IP address.
- * Will be zero for CIDR/31 and CIDR/32 if the inclusive flag is false.
- *
- * @return the IP address in dotted format, may be "0.0.0.0" if there is no valid address
- */
- public String getLowAddress() {
- return format(toArray(low()));
- }
-
- /**
- * Return the high address as a dotted IP address.
- * Will be zero for CIDR/31 and CIDR/32 if the inclusive flag is false.
- *
- * @return the IP address in dotted format, may be "0.0.0.0" if there is no valid address
- */
- public String getHighAddress() {
- return format(toArray(high()));
- }
-
- /**
- * Get the count of available addresses.
- * Will be zero for CIDR/31 and CIDR/32 if the inclusive flag is false.
- *
- * @return the count of addresses, may be zero.
- * @throws RuntimeException if the correct count is greater than {@code Integer.MAX_VALUE}
- * @deprecated (3.4) use {@link #getAddressCountLong()} instead
- */
- @Deprecated public int getAddressCount() {
- long countLong = getAddressCountLong();
- if (countLong > Integer.MAX_VALUE) {
- throw new RuntimeException("Count is larger than an integer: " + countLong);
- }
- // N.B. cannot be negative
- return (int) countLong;
- }
-
- /**
- * Get the count of available addresses.
- * Will be zero for CIDR/31 and CIDR/32 if the inclusive flag is false.
- *
- * @return the count of addresses, may be zero.
- * @since 3.4
- */
- public long getAddressCountLong() {
- long b = broadcastLong();
- long n = networkLong();
- long count = b - n + (isInclusiveHostCount() ? 1 : -1);
- return count < 0 ? 0 : count;
- }
-
- public int asInteger(String address) {
- return toInteger(address);
- }
-
- public String getCidrSignature() {
- return toCidrNotation(format(toArray(address())), format(toArray(netmask())));
- }
-
- public String[] getAllAddresses() {
- int ct = getAddressCount();
- String[] addresses = new String[ct];
- if (ct == 0) {
- return addresses;
- }
- for (int add = low(), j = 0; add <= high(); ++add, ++j) {
- addresses[j] = format(toArray(add));
- }
- return addresses;
- }
-
- /**
- * {@inheritDoc}
- *
- * @since 2.2
- */
- @Override public String toString() {
- final StringBuilder buf = new StringBuilder();
- buf.append("CIDR Signature:\t[")
- .append(getCidrSignature())
- .append("]")
- .append(" Netmask: [")
- .append(getNetmask())
- .append("]\n")
- .append("Network:\t[")
- .append(getNetworkAddress())
- .append("]\n")
- .append("Broadcast:\t[")
- .append(getBroadcastAddress())
- .append("]\n")
- .append("First Address:\t[")
- .append(getLowAddress())
- .append("]\n")
- .append("Last Address:\t[")
- .append(getHighAddress())
- .append("]\n")
- .append("# Addresses:\t[")
- .append(getAddressCount())
- .append("]\n");
- return buf.toString();
- }
- }
-
- /**
- * Return a {@link SubnetInfo} instance that contains subnet-specific statistics
- *
- * @return new instance
- */
- public final SubnetInfo getInfo() {
- return new SubnetInfo();
- }
-
- /*
- * Initialize the internal fields from the supplied CIDR mask
- */
- private void calculate(String mask) {
- Matcher matcher = cidrPattern.matcher(mask);
-
- if (matcher.matches()) {
- address = matchAddress(matcher);
-
- /* Create a binary netmask from the number of bits specification /x */
- int cidrPart = rangeCheck(Integer.parseInt(matcher.group(5)), 0, NBITS);
- for (int j = 0; j < cidrPart; ++j) {
- netmask |= (1 << 31 - j);
- }
-
- /* Calculate base network address */
- network = (address & netmask);
-
- /* Calculate broadcast address */
- broadcast = network | ~(netmask);
- } else {
- throw new IllegalArgumentException("Could not parse [" + mask + "]");
- }
- }
-
- /*
- * Convert a dotted decimal format address to a packed integer format
- */
- private int toInteger(String address) {
- Matcher matcher = addressPattern.matcher(address);
- if (matcher.matches()) {
- return matchAddress(matcher);
- } else {
- throw new IllegalArgumentException("Could not parse [" + address + "]");
- }
- }
-
- /*
- * Convenience method to extract the components of a dotted decimal address and
- * pack into an integer using a regex match
- */
- private int matchAddress(Matcher matcher) {
- int addr = 0;
- for (int i = 1; i <= 4; ++i) {
- int n = (rangeCheck(Integer.parseInt(matcher.group(i)), 0, 255));
- addr |= ((n & 0xff) << 8 * (4 - i));
- }
- return addr;
- }
-
- /*
- * Convert a packed integer address into a 4-element array
- */
- private int[] toArray(int val) {
- int ret[] = new int[4];
- for (int j = 3; j >= 0; --j) {
- ret[j] |= ((val >>> 8 * (3 - j)) & (0xff));
- }
- return ret;
- }
-
- /*
- * Convert a 4-element array into dotted decimal format
- */
- private String format(int[] octets) {
- StringBuilder str = new StringBuilder();
- for (int i = 0; i < octets.length; ++i) {
- str.append(octets[i]);
- if (i != octets.length - 1) {
- str.append(".");
- }
- }
- return str.toString();
- }
-
- /*
- * Convenience function to check integer boundaries.
- * Checks if a value x is in the range [begin,end].
- * Returns x if it is in range, throws an exception otherwise.
- */
- private int rangeCheck(int value, int begin, int end) {
- if (value >= begin && value <= end) { // (begin,end]
- return value;
- }
-
- throw new IllegalArgumentException(
- "Value [" + value + "] not in range [" + begin + "," + end + "]");
- }
-
- /*
- * Count the number of 1-bits in a 32-bit integer using a divide-and-conquer strategy
- * see Hacker's Delight section 5.1
- */
- int pop(int x) {
- x = x - ((x >>> 1) & 0x55555555);
- x = (x & 0x33333333) + ((x >>> 2) & 0x33333333);
- x = (x + (x >>> 4)) & 0x0F0F0F0F;
- x = x + (x >>> 8);
- x = x + (x >>> 16);
- return x & 0x0000003F;
- }
-
- /* Convert two dotted decimal addresses to a single xxx.xxx.xxx.xxx/yy format
- * by counting the 1-bit population in the mask address. (It may be better to count
- * NBITS-#trailing zeroes for this case)
- */
- private String toCidrNotation(String addr, String mask) {
- return addr + "/" + pop(toInteger(mask));
- }
-}
diff --git a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java b/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java
deleted file mode 100644
index a609f284..00000000
--- a/AriaFtpPlug/src/main/java/aria/apache/commons/net/util/TrustManagerUtils.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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 aria.apache.commons.net.util;
-
-import java.security.GeneralSecurityException;
-import java.security.KeyStore;
-import java.security.SecureRandom;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import javax.net.ssl.X509TrustManager;
-
-/**
- * TrustManager utilities for generating TrustManagers.
- *
- * @since 3.0
- */
-public final class TrustManagerUtils {
- private static final X509Certificate[] EMPTY_X509CERTIFICATE_ARRAY = new X509Certificate[] {};
-
- private static class TrustManager implements X509TrustManager {
-
- private final boolean checkServerValidity;
-
- TrustManager(boolean checkServerValidity) {
- this.checkServerValidity = checkServerValidity;
- }
-
- /**
- * Never generates a CertificateException.
- */
- @Override public void checkClientTrusted(X509Certificate[] certificates, String authType) {
- return;
- }
-
- @Override public void checkServerTrusted(X509Certificate[] certificates, String authType)
- throws CertificateException {
- if (checkServerValidity) {
- for (X509Certificate certificate : certificates) {
- certificate.checkValidity();
- }
- }
- }
-
- /**
- * @return an empty array of certificates
- */
- @Override public X509Certificate[] getAcceptedIssuers() {
- return EMPTY_X509CERTIFICATE_ARRAY;
- }
- }
-
- private static final X509TrustManager ACCEPT_ALL = new TrustManager(false);
-
- private static final X509TrustManager CHECK_SERVER_VALIDITY = new TrustManager(true);
-
- /**
- * Generate a TrustManager that performs no checks.
- *
- * @return the TrustManager
- */
- public static X509TrustManager getAcceptAllTrustManager() {
- return ACCEPT_ALL;
- }
-
- /**
- * Generate a TrustManager that checks server certificates for validity,
- * but otherwise performs no checks.
- *
- * @return the validating TrustManager
- */
- public static X509TrustManager getValidateServerCertificateTrustManager() {
- return CHECK_SERVER_VALIDITY;
- }
-
- /**
- * Return the default TrustManager provided by the JVM.
- *