KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > DirectoryEntry


1 /*
2  * DirectoryEntry.java
3  *
4  * Copyright (C) 1998-2004 Peter Graves
5  * $Id: DirectoryEntry.java,v 1.7 2004/05/21 16:42:02 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j;
23
24 import gnu.regexp.REMatch;
25 import java.text.SimpleDateFormat JavaDoc;
26 import java.util.Date JavaDoc;
27
28 public final class DirectoryEntry
29 {
30     private String JavaDoc name;
31     private long date;
32     private long size;
33     private boolean isDirectory;
34     private boolean isLink;
35     private String JavaDoc linkedTo;
36     private boolean isMarked;
37
38     // For native format, this is all we store.
39
private final String JavaDoc string;
40
41     private static final String JavaDoc DIR = " <DIR>";
42     private static final int DIRLENGTH = DIR.length();
43     private static final String JavaDoc DATEFORMAT = "MMM dd yyyy HH:mm";
44     private static SimpleDateFormat JavaDoc dateFormatter =
45         new SimpleDateFormat JavaDoc(DATEFORMAT);
46
47     // Constructor for native "ls -l" format.
48
private DirectoryEntry(String JavaDoc string, char firstChar)
49     {
50         this.string = string;
51         if (firstChar == 'd')
52             isDirectory = true;
53         else if (firstChar == 'l')
54             isLink = true;
55         size = -1;
56     }
57
58     // Constructor for internal format.
59
public DirectoryEntry(String JavaDoc name, long date, long size)
60     {
61         this.name = name;
62         this.date = date;
63         this.size = size;
64         string = null;
65     }
66
67     // Constructor for internal format.
68
public DirectoryEntry(String JavaDoc name, long date, long size, boolean isDirectory)
69     {
70         this.name = name;
71         this.date = date;
72         this.size = size;
73         this.isDirectory = isDirectory;
74         string = null;
75     }
76
77     // Wrapper for constructor for native "ls -l" format.
78
// Ignore strings that aren't really directory entries.
79
// Apply filter (if any).
80
public static DirectoryEntry getDirectoryEntry(String JavaDoc s,
81                                                    DirectoryFilenameFilter filter)
82     {
83         if (s.length() == 0)
84             return null;
85         // Ignore "total" line, command line echo.
86
// First char must be one of "-dlcbsp".
87
final char c = s.charAt(0);
88         if ("-dlcbsp".indexOf(c) < 0)
89             return null;
90         if (c == 'l' && s.startsWith("ls "))
91             return null;
92         if (filter != null) {
93             if (c != 'd' && !filter.accepts(getName(s)))
94                 return null;
95         }
96         return new DirectoryEntry(s, c);
97     }
98
99     // Extracts filename from "ls -l" directory listing.
100
public static String JavaDoc getName(String JavaDoc s)
101     {
102         // Strip symbolic link if any.
103
int end = s.indexOf(" -> ");
104         if (end >= 0)
105             s = s.substring(0, end);
106         REMatch match = Directory.getNativeMoveToFilenameRegExp().getMatch(s);
107         if (match != null)
108             return s.substring(match.getEndIndex());
109         Log.error("DirectoryEntry.getName returning null s = |" + s + "|");
110         return null;
111     }
112
113     public static int getNameColumn(String JavaDoc s)
114     {
115         // Strip symbolic link if any.
116
int end = s.indexOf(" -> ");
117         if (end >= 0)
118             s = s.substring(0, end);
119         REMatch match = Directory.getNativeMoveToFilenameRegExp().getMatch(s);
120         if (match != null)
121             return match.getEndIndex();
122         return 0;
123     }
124
125     public final String JavaDoc extractName()
126     {
127         if (name == null && string != null)
128             name = getName(string);
129         return name;
130     }
131
132     // nameColumn must be > 0. It's just a hint.
133
public final String JavaDoc extractName(int nameColumn)
134     {
135         if (name != null)
136             return name; // Cached.
137
if (string == null)
138             return null;
139         if (nameColumn > 0 && nameColumn < string.length()) {
140             String JavaDoc s = string;
141             // Strip symbolic link if any.
142
int end = s.indexOf(" -> ");
143             if (end >= 0)
144                 s = s.substring(0, end);
145             if (s.charAt(nameColumn-1) == ' ')
146                 if (!Character.isWhitespace(s.charAt(nameColumn)))
147                     return name = s.substring(nameColumn);
148         }
149         // Do it the hard way.
150
return getName(string);
151     }
152
153     public final String JavaDoc getName()
154     {
155         return name;
156     }
157
158     public final long getDate()
159     {
160         return date;
161     }
162
163     public final long getSize()
164     {
165         return size;
166     }
167
168     public final void setSize(long size)
169     {
170         this.size = size;
171     }
172
173     public final boolean isDirectory()
174     {
175         return isDirectory;
176     }
177
178     public final boolean isLink()
179     {
180         return isLink;
181     }
182
183     public final void setLinkedTo(String JavaDoc linkedTo)
184     {
185         this.linkedTo = linkedTo;
186     }
187
188     public final boolean isMarked()
189     {
190         return isMarked;
191     }
192
193     public final void setMarked(boolean b)
194     {
195         isMarked = b;
196     }
197
198     public final String JavaDoc getString()
199     {
200         return string;
201     }
202
203     public String JavaDoc toString()
204     {
205         String JavaDoc marked = isMarked ? "T " : " ";
206         // Use saved string for native format.
207
if (string != null)
208             return marked.concat(string);
209         // Construct string for internal format.
210
FastStringBuffer sb = new FastStringBuffer(256);
211         sb.append(marked);
212         if (isDirectory) {
213             sb.append(DIR);
214         } else {
215             String JavaDoc sizeString = String.valueOf(size);
216             for (int j = 0; j < DIRLENGTH - sizeString.length(); j++)
217                 sb.append(' ');
218             sb.append(sizeString);
219         }
220         sb.append(' ');
221         String JavaDoc dateString = dateFormatter.format(new Date JavaDoc(date));
222         sb.append(dateString);
223         sb.append(' ');
224         sb.append(name);
225         if (linkedTo != null) {
226             sb.append(" -> ");
227             sb.append(linkedTo);
228         }
229         return sb.toString();
230     }
231 }
232
Popular Tags