001: /**
002: *
003: * edtFTPj
004: *
005: * Copyright (C) 2000-2004 Enterprise Distributed Technologies Ltd
006: *
007: * www.enterprisedt.com
008: *
009: * This library is free software; you can redistribute it and/or
010: * modify it under the terms of the GNU Lesser General Public
011: * License as published by the Free Software Foundation; either
012: * version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: * Lesser General Public License for more details.
018: *
019: * You should have received a copy of the GNU Lesser General Public
020: * License along with this library; if not, write to the Free Software
021: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022: *
023: * Bug fixes, suggestions and comments should be should posted on
024: * http://www.enterprisedt.com/forums/index.php
025: *
026: * Change Log:
027: *
028: * $Log: WindowsFileParser.java,v $
029: * Revision 1.14 2008-01-09 03:54:39 bruceb
030: * fixed bug re last modified date not being set
031: *
032: * Revision 1.13 2007-12-18 07:52:53 bruceb
033: * trimStart() changes
034: *
035: * Revision 1.12 2007-10-12 05:20:44 bruceb
036: * permit ignoring date parser errors
037: *
038: * Revision 1.11 2006/10/11 08:58:16 hans
039: * Removed usage of deprecated FTPFile constructor
040: *
041: * Revision 1.10 2005/06/03 11:26:25 bruceb
042: * comment change
043: *
044: * Revision 1.9 2004/10/18 21:07:31 bruceb
045: * tweaked name finding
046: *
047: * Revision 1.8 2004/10/18 15:58:33 bruceb
048: * setLocale
049: *
050: * Revision 1.7 2004/09/02 11:02:31 bruceb
051: * rolled back
052: *
053: *
054: */package com.enterprisedt.net.ftp;
055:
056: import java.text.ParseException;
057: import java.text.SimpleDateFormat;
058: import java.util.Date;
059: import java.util.Locale;
060:
061: /**
062: * Represents a remote Windows file parser
063: *
064: * @author Bruce Blackshaw
065: * @version $Revision: 1.14 $
066: */
067: public class WindowsFileParser extends FTPFileParser {
068:
069: /**
070: * Revision control id
071: */
072: public static String cvsId = "@(#)$Id: WindowsFileParser.java,v 1.14 2008-01-09 03:54:39 bruceb Exp $";
073:
074: /**
075: * Date formatter
076: */
077: private SimpleDateFormat formatter;
078:
079: /**
080: * Directory field
081: */
082: private final static String DIR = "<DIR>";
083:
084: /**
085: * Number of expected fields
086: */
087: private final static int MIN_EXPECTED_FIELD_COUNT = 4;
088:
089: /**
090: * Constructor
091: */
092: public WindowsFileParser() {
093: setLocale(Locale.getDefault());
094: }
095:
096: /**
097: * Set the locale for date parsing of listings
098: *
099: * @param locale locale to set
100: */
101: public void setLocale(Locale locale) {
102: formatter = new SimpleDateFormat("MM-dd-yy hh:mma", locale);
103: }
104:
105: /**
106: * Parse server supplied string. Should be in
107: * form
108: *
109: * 05-17-03 02:47PM 70776 ftp.jar
110: * 08-28-03 10:08PM <DIR> EDT SSLTest
111: *
112: * @param raw raw string to parse
113: */
114: public FTPFile parse(String raw) throws ParseException {
115: String[] fields = split(raw);
116:
117: if (fields.length < MIN_EXPECTED_FIELD_COUNT)
118: return null;
119: //throw new ParseException("Unexpected number of fields: " + fields.length, 0);
120:
121: // first two fields are date time
122: Date lastModified = null;
123: try {
124: lastModified = formatter.parse(fields[0] + " " + fields[1]);
125: } catch (ParseException ex) {
126: if (!ignoreDateParseErrors) {
127: throw ex;
128: }
129: }
130:
131: // dir flag
132: boolean isDir = false;
133: long size = 0L;
134: if (fields[2].equalsIgnoreCase(DIR))
135: isDir = true;
136: else {
137: try {
138: size = Long.parseLong(fields[2]);
139: } catch (NumberFormatException ex) {
140: throw new ParseException("Failed to parse size: "
141: + fields[2], 0);
142: }
143: }
144:
145: // we've got to find the starting point of the name. We
146: // do this by finding the pos of all the date/time fields, then
147: // the name - to ensure we don't get tricked up by a date or dir the
148: // same as the filename, for example
149: int pos = 0;
150: boolean ok = true;
151: for (int i = 0; i < 3; i++) {
152: pos = raw.indexOf(fields[i], pos);
153: if (pos < 0) {
154: ok = false;
155: break;
156: } else { // move on the length of the field
157: pos += fields[i].length();
158: }
159: }
160: if (ok) {
161: String name = trimStart(raw.substring(pos));
162: return new FTPFile(raw, name, size, isDir, lastModified);
163: } else {
164: throw new ParseException("Failed to retrieve name: " + raw,
165: 0);
166: }
167: }
168:
169: }
|