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