All Downloads are FREE. Search and download functionalities are using the official Maven repository.

panda.net.ftp.parser.NTFTPEntryParser Maven / Gradle / Ivy

Go to download

Panda Core is the core module of Panda Framework, it contains commonly used utility classes similar to apache-commons.

There is a newer version: 1.8.0
Show newest version
package panda.net.ftp.parser;

import java.text.ParseException;
import java.util.regex.Pattern;

import panda.net.ftp.Configurable;
import panda.net.ftp.FTPClientConfig;
import panda.net.ftp.FTPFile;

/**
 * Implementation of FTPFileEntryParser and FTPFileListParser for NT Systems.
 * 
 * @see panda.net.ftp.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
			+ "(?:()|([0-9]+))\\s+" //  or ddddd; swallow trailing spaces
			+ "(\\S.*)"; // First non-space followed by rest of line (name)

	/**
	 * The sole constructor for an NTFTPEntryParser object.
	 * 
	 * @exception 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 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.
	 * @exception 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 NTFTPEntryParser(FTPClientConfig config) {
		super(REGEX, Pattern.DOTALL);
		configure(config);
		FTPClientConfig config2 = new FTPClientConfig(FTPClientConfig.SYST_NT, DEFAULT_DATE_FORMAT2, null, null, null,
			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 ("".equals(dirString)) {
				f.setType(FTPFile.DIRECTORY_TYPE);
				f.setSize(0);
			}
			else {
				f.setType(FTPFile.FILE_TYPE);
				if (null != size) {
					f.setSize(Long.parseLong(size));
				}
			}
			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
	public FTPClientConfig getDefaultConfiguration() {
		return new FTPClientConfig(FTPClientConfig.SYST_NT, DEFAULT_DATE_FORMAT, null, null, null, null);
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy