View Javadoc

1   /*
2    * $HeadURL: $
3    * $Date: $
4    * $Revision: $
5    * $Author: $
6    * 
7    * Copyright (c) 2005 MindTree Consulting Ltd. 
8    * 
9    * This file is part of Insight.
10   * 
11   * Insight is free software: you can redistribute it and/or modify it under the 
12   * terms of the GNU General Public License as published by the Free Software 
13   * Foundation, either version 3 of the License, or (at your option) any later 
14   * version.
15   * 
16   * Insight is distributed in the hope that it will be useful, but 
17   * WITHOUT ANY WARRANTY; without even the implied warranty of 
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General 
19   * Public License for more details.
20   * 
21   * You should have received a copy of the GNU General Public License along with 
22   * Insight.  If not, see <http://www.gnu.org/licenses/>.
23   */
24  
25  package com.mindtree.techworks.insight.download.ftpbrowse;
26  
27  import java.io.File;
28  import java.io.FileFilter;
29  import java.io.FilenameFilter;
30  import java.io.IOException;
31  import java.net.MalformedURLException;
32  import java.net.PasswordAuthentication;
33  import java.net.URI;
34  import java.net.URISyntaxException;
35  import java.net.URL;
36  
37  import javax.swing.filechooser.FileSystemView;
38  
39  import org.apache.commons.net.ftp.FTPFile;
40  
41  
42  /**
43   * This class is a wrapper for <code>FTPFile</code>. This class is to be used
44   * by {@link javax.swing.JFileChooser JFileChooser}which requires an instance
45   * of <code>File</code> to it.
46   * <p>
47   * Most operations on the file wrapped by this class are <b>not allowed </b>.
48   * <code>FTPFile</code> is meant to contain information about files on a
49   * remote server, and <code>FTPFileFile</code> is also meant for the same. It
50   * merely provides a <code>File</code> like interface to <code>FTPFile</code>.
51   * </p>
52   * <p>
53   * For any operations on the file, use the information about the file from an
54   * instance of this class and use
55   * {@link org.apache.commons.net.ftp.FTPClient FTPClient}or any wrapper around
56   * it. You might use any other FTPClient also.
57   * </p>
58   * <p>
59   * The {@link FTPFileFile#getHostURL() getHostURL}and
60   * {@link FTPFileFile#getPasswordAuthentication() getPasswordAuthentication}
61   * methods return the host and authentication information to connect to the
62   * host.
63   * </p>
64   * 
65   * @see org.apache.commons.net.ftp.FTPFile FTPFile
66   * @see java.io.File File
67   * @author Bindul Bhowmik
68   * @version $Revision: 27 $ $Date: 2007-12-16 04:58:03 -0700 (Sun, 16 Dec 2007) $
69   */
70  public class FTPFileFile extends File {
71  
72  	/**
73  	 * Used for object serialization
74  	 */
75  	private static final long serialVersionUID = 4465086823354456311L;
76  	
77  	//
78  	// Instance variables
79  	//
80  
81  	/**
82  	 * The ftpFile instance backing the wrapper
83  	 */
84  	private FTPFile ftpFile;
85  
86  	/**
87  	 * The file system view which created this.
88  	 */
89  	private FileSystemView fileSystemView;
90  
91  	/**
92  	 * The URL associated with this file.
93  	 */
94  	private URL hostURL;
95  
96  	/**
97  	 * User credentials for the remote host.
98  	 */
99  	private PasswordAuthentication passwordAuthentication;
100 
101 	//
102 	// Constructors
103 	//
104 
105 	/**
106 	 * Constructs a new FTPFileFile object.
107 	 * 
108 	 * @param ftpFile The FTPFile instance to wrap
109 	 * @param fileSystemView The file system view which created this instance.
110 	 */
111 	public FTPFileFile (FTPFile ftpFile, FileSystemView fileSystemView) {
112 
113 		super(ftpFile.getName());
114 		this.ftpFile = ftpFile;
115 		this.fileSystemView = fileSystemView;
116 		if (null != fileSystemView
117 				&& fileSystemView instanceof FTPRemoteFileSystemView) {
118 			FTPRemoteFileSystemView ftpFileSystemView = (FTPRemoteFileSystemView) fileSystemView;
119 			this.hostURL = ftpFileSystemView.getUrl();
120 			this.passwordAuthentication = ftpFileSystemView
121 					.getPasswordAuthentication();
122 		}
123 	}
124 
125 	//
126 	// Accessors
127 	//
128 
129 	/**
130 	 * @return Returns the passwordAuthentication.
131 	 */
132 	public PasswordAuthentication getPasswordAuthentication () {
133 
134 		return passwordAuthentication;
135 	}
136 
137 	/**
138 	 * @return Returns the hostURL.
139 	 */
140 	public URL getHostURL () {
141 
142 		return hostURL;
143 	}
144 
145 	//
146 	// Overridden methods from java.io.File
147 	//
148 
149 	/**
150 	 * @return Returns the ftpFile.
151 	 */
152 	public FTPFile getFtpFile () {
153 
154 		return ftpFile;
155 	}
156 
157 	/**
158 	 * @see java.io.File#isAbsolute()
159 	 */
160 	public boolean isAbsolute () {
161 
162 		return !ftpFile.isSymbolicLink();
163 	}
164 
165 	/**
166 	 * @see java.io.File#isDirectory()
167 	 */
168 	public boolean isDirectory () {
169 
170 		return ftpFile.isDirectory();
171 	}
172 
173 	/**
174 	 * @see java.io.File#isFile()
175 	 */
176 	public boolean isFile () {
177 
178 		return ftpFile.isFile();
179 	}
180 
181 	/**
182 	 * @see java.io.File#lastModified()
183 	 */
184 	public long lastModified () {
185 
186 		return ftpFile.getTimestamp().getTimeInMillis();
187 	}
188 
189 
190 	/**
191 	 * Always returns true. Read access is always allowed.
192 	 * 
193 	 * @see java.io.File#canRead()
194 	 */
195 	public boolean canRead () {
196 
197 		return true;
198 	}
199 
200 	/**
201 	 * Always returns false. For more information, see note
202 	 * {@link FTPFileFile above}.
203 	 * 
204 	 * @see java.io.File#canWrite()
205 	 */
206 	public boolean canWrite () {
207 
208 		return false;
209 	}
210 
211 	/**
212 	 * @see java.io.File#compareTo(java.io.File)
213 	 */
214 	public int compareTo (File pathname) {
215 
216 		return this.getPath().compareToIgnoreCase(pathname.getPath());
217 	}
218 
219 	/**
220 	 * @see java.lang.Comparable#compareTo(java.lang.Object)
221 	 */
222 	public int compareTo (Object o) {
223 
224 		return compareTo((File) o);
225 	}
226 
227 	/**
228 	 * Operation not supported.
229 	 * 
230 	 * @throws IOException Since this operation is not supported.
231 	 * @see java.io.File#createNewFile()
232 	 */
233 	public boolean createNewFile () throws IOException {
234 
235 		throw new IOException("READ-ONLY view");
236 	}
237 
238 	/**
239 	 * Operation not supported, always returns false
240 	 * 
241 	 * @throws UnsupportedOperationException Since this operation is not
242 	 *             supported.
243 	 * @see java.io.File#delete()
244 	 */
245 	public boolean delete () {
246 
247 		return false;
248 	}
249 
250 	/**
251 	 * Operation not supported. Nothing is returned.
252 	 * 
253 	 * @see java.io.File#deleteOnExit()
254 	 */
255 	public void deleteOnExit () {
256 
257 		// No Operation
258 	}
259 
260 	/**
261 	 * @see java.lang.Object#equals(java.lang.Object)
262 	 */
263 	public boolean equals (Object obj) {
264 
265 		if ((obj != null) && (obj instanceof File)) {
266 			return compareTo((File) obj) == 0;
267 		}
268 		return false;
269 	}
270 
271 	/**
272 	 * Returns <code>true</code> always. Any file for which an FTPFile
273 	 * instance can be got is assumed to exist.
274 	 * 
275 	 * @see java.io.File#exists()
276 	 */
277 	public boolean exists () {
278 
279 		return true;
280 	}
281 
282 	/**
283 	 * Returns the same instance!
284 	 * 
285 	 * @see java.io.File#getAbsoluteFile()
286 	 */
287 	public File getAbsoluteFile () {
288 
289 		return this;
290 	}
291 
292 	/**
293 	 * Returns the path!
294 	 * 
295 	 * @see java.io.File#getAbsolutePath()
296 	 */
297 	public String getAbsolutePath () {
298 
299 		return this.getPath();
300 	}
301 
302 	/**
303 	 * Returns the instance as the canonical file
304 	 * 
305 	 * @see java.io.File#getCanonicalFile()
306 	 */
307 	public File getCanonicalFile () throws IOException {
308 
309 		return this;
310 	}
311 
312 	/**
313 	 * Always returns the unix style path from the root.
314 	 * 
315 	 * @see java.io.File#getCanonicalPath()
316 	 */
317 	public String getCanonicalPath () throws IOException {
318 
319 		return this.getPath();
320 	}
321 
322 	/**
323 	 * Returns the name of the file
324 	 * 
325 	 * @see java.io.File#getName()
326 	 */
327 	public String getName () {
328 
329 		String path = this.getPath();
330 		int index = path.lastIndexOf('/');
331 		return path.substring(index + 1);
332 	}
333 
334 	/**
335 	 * Returns the path of the parent, if a file system view is present, or
336 	 * <code>null</code>.
337 	 * 
338 	 * @see java.io.File#getParent()
339 	 */
340 	public String getParent () {
341 
342 		if (null != fileSystemView) {
343 			return fileSystemView.getParentDirectory(this).getPath();
344 		} else {
345 			return null;
346 		}
347 	}
348 
349 	/**
350 	 * Returns the parent directory, if a file system view is present, or
351 	 * <code>null</code>.
352 	 * 
353 	 * @see java.io.File#getParentFile()
354 	 */
355 	public File getParentFile () {
356 
357 		if (null != fileSystemView) {
358 			return fileSystemView.getParentDirectory(this);
359 		} else {
360 			return null;
361 		}
362 	}
363 
364 	/**
365 	 * Returns the path in the unix style.
366 	 * 
367 	 * @see java.io.File#getPath()
368 	 */
369 	public String getPath () {
370 
371 		// We always construct the FTPFile name with the complete path of the
372 		// FTPFile, so the name will be the path. If this assumption is changed,
373 		// need to change this implementation.
374 		return this.ftpFile.getName();
375 	}
376 
377 	/**
378 	 * Returns false. No files are hidden!
379 	 * 
380 	 * @see java.io.File#isHidden()
381 	 */
382 	public boolean isHidden () {
383 
384 		return false;
385 	}
386 
387 	/**
388 	 * Returns the size of the FTP file instance
389 	 * 
390 	 * @see java.io.File#length()
391 	 */
392 	public long length () {
393 
394 		return ftpFile.getSize();
395 	}
396 
397 	/**
398 	 * Operation is not supported. Use the
399 	 * {@link FTPRemoteFileSystemView FTPRemoteFileSystemView}for this.
400 	 * 
401 	 * @see java.io.File#list()
402 	 * @return An empty String array
403 	 */
404 	public String [] list () {
405 
406 		return new String [0];
407 	}
408 
409 	/**
410 	 * Operation is not supported. Use the
411 	 * {@link FTPRemoteFileSystemView FTPRemoteFileSystemView}for this.
412 	 * 
413 	 * @see java.io.File#list(java.io.FilenameFilter)
414 	 * @return An empty String array
415 	 */
416 	public String [] list (FilenameFilter filter) {
417 
418 		return new String [0];
419 	}
420 
421 	/**
422 	 * Operation is not supported. Use the
423 	 * {@link FTPRemoteFileSystemView FTPRemoteFileSystemView}for this.
424 	 * 
425 	 * @see java.io.File#listFiles()
426 	 * @return An empty File array
427 	 */
428 	public File [] listFiles () {
429 
430 		return new FTPFileFile [0];
431 	}
432 
433 	/**
434 	 * Operation is not supported. Use the
435 	 * {@link FTPRemoteFileSystemView FTPRemoteFileSystemView}for this.
436 	 * 
437 	 * @see java.io.File#listFiles(java.io.FileFilter)
438 	 * @return An empty File array
439 	 */
440 	public File [] listFiles (FileFilter filter) {
441 
442 		return new FTPFileFile [0];
443 	}
444 
445 	/**
446 	 * Operation is not supported. Use the
447 	 * {@link FTPRemoteFileSystemView FTPRemoteFileSystemView}for this.
448 	 * 
449 	 * @see java.io.File#listFiles(java.io.FilenameFilter)
450 	 * @return An empty File array
451 	 */
452 	public File [] listFiles (FilenameFilter filter) {
453 
454 		return new FTPFileFile [0];
455 	}
456 
457 	/**
458 	 * The operation is not supported, always returns <code>false</code>
459 	 * 
460 	 * @see java.io.File#mkdir()
461 	 */
462 	public boolean mkdir () {
463 
464 		return false;
465 	}
466 
467 	/**
468 	 * The operation is not supported, always returns <code>false</code>
469 	 * 
470 	 * @see java.io.File#mkdirs()
471 	 */
472 	public boolean mkdirs () {
473 
474 		return false;
475 	}
476 
477 	/**
478 	 * The operation is not supported, always returns <code>false</code>
479 	 * 
480 	 * @see java.io.File#renameTo(java.io.File)
481 	 */
482 	public boolean renameTo (File dest) {
483 
484 		return false;
485 	}
486 
487 	/**
488 	 * The operation is not supported, always returns <code>false</code>
489 	 * 
490 	 * @see java.io.File#setLastModified(long)
491 	 */
492 	public boolean setLastModified (long time) {
493 
494 		return false;
495 	}
496 
497 	/**
498 	 * The operation is not supported, always returns <code>false</code>
499 	 * 
500 	 * @see java.io.File#setReadOnly()
501 	 */
502 	public boolean setReadOnly () {
503 
504 		return false;
505 	}
506 
507 	/**
508 	 * @see java.io.File#toURI()
509 	 */
510 	public URI toURI () {
511 
512 		try {
513 			String p = slashify(this.getPath(), this.isDirectory());
514 			if (p.startsWith("//"))
515 				p = "//" + p;
516 			return new URI("file", null, p, null);
517 		} catch (URISyntaxException x) {
518 			throw new Error(x); // Can't happen
519 		}
520 	}
521 
522 	/**
523 	 * @see java.io.File#toURL()
524 	 */
525 	public URL toURL () throws MalformedURLException {
526 
527 		return new URL("file", "", slashify(this.getPath(), this.isDirectory()));
528 	}
529 
530 	/**
531 	 * Creates a slash representation of the file
532 	 * 
533 	 * @param path The path to slashify
534 	 * @param isDirectory Is it a directory
535 	 * @return The slashified path
536 	 */
537 	private String slashify (String path, boolean isDirectory) {
538 
539 		String p = path;
540 		if (!p.startsWith("/"))
541 			p = "/" + p;
542 		if (!p.endsWith("/") && isDirectory)
543 			p = p + "/";
544 		return p;
545 	}
546 }