Author: sebb Date: Mon Sep 20 16:29:26 2010 New Revision: 998992 URL: http://svn.apache.org/viewvc?rev=998992&view=rev Log: NET-338: ftp.FTPClient.initiateListParsing(String parserKey, String pathname) can call createFileEntryParser with null systemName
Modified: commons/proper/net/trunk/src/changes/changes.xml commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java Modified: commons/proper/net/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/changes/changes.xml?rev=998992&r1=998991&r2=998992&view=diff ============================================================================== --- commons/proper/net/trunk/src/changes/changes.xml (original) +++ commons/proper/net/trunk/src/changes/changes.xml Mon Sep 20 16:29:26 2010 @@ -61,6 +61,11 @@ This is primarily a maintenance release, TO BE COMPLETED "> + <action issue="NET-338" dev="sebb" type="add"> + ftp.FTPClient.initiateListParsing(String parserKey, String pathname) + can call createFileEntryParser with null systemName. + Fix this by adding getSystemType() which does not return null, and deprecating getSystemName(). + </action> <action issue="NET-244" dev="sebb" type="add"> Add support for FTPFileFilter filters. New classes FTPFileFilter, FTPFileFilters, new methods: FTPListParseEngine#getFiles(FTPFileFilter filter) Modified: commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java?rev=998992&r1=998991&r2=998992&view=diff ============================================================================== --- commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java (original) +++ commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java Mon Sep 20 16:29:26 2010 @@ -2024,7 +2024,9 @@ implements Configurable * as an IOException or independently as itself. * @exception IOException If an I/O error occurs while either sending a * command to the server or receiving a reply from the server. + * @deprecated Use {...@link #getSystemType()} - which does not return null ***/ + @Deprecated public String getSystemName() throws IOException { //if (syst() == FTPReply.NAME_SYSTEM_TYPE) @@ -2039,6 +2041,41 @@ implements Configurable /*** + * 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. + * <p> + * @return The system type obtained from the server. Never null. + * @exception 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. + * @exception IOException If an I/O error occurs while either sending a + * command to the server or receiving a reply from the server. + ***/ + 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 { + 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. * <p> @@ -2463,10 +2500,10 @@ implements Configurable // if a parserKey hasn't been supplied, and a configuration // hasn't been supplied, then autodetect by calling // the SYST command and use that to choose the parser. - final String systemName = getSystemName(); + final String systemType = getSystemType(); // cannot be null __entryParser = - __parserFactory.createFileEntryParser(systemName); - __entryParserKey = systemName; + __parserFactory.createFileEntryParser(systemType); + __entryParserKey = systemType; } } }