1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs.provider;
18
19 import org.apache.commons.vfs.FileName;
20 import org.apache.commons.vfs.FileObject;
21 import org.apache.commons.vfs.FileSystem;
22 import org.apache.commons.vfs.FileSystemException;
23 import org.apache.commons.vfs.FileSystemOptions;
24
25 /***
26 * A {@link FileProvider} that handles physical files, such as the files in a
27 * local fs, or on an FTP server. An originating file system cannot be
28 * layered on top of another file system.
29 *
30 * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
31 * @version $Revision: 480428 $ $Date: 2006-11-29 07:15:24 +0100 (Mi, 29 Nov 2006) $
32 */
33 public abstract class AbstractOriginatingFileProvider
34 extends AbstractFileProvider
35 {
36 public AbstractOriginatingFileProvider()
37 {
38 super();
39 }
40
41 /***
42 * Locates a file object, by absolute URI.
43 *
44 * @param uri
45 */
46 public FileObject findFile(final FileObject baseFile,
47 final String uri,
48 final FileSystemOptions fileSystemOptions) throws FileSystemException
49 {
50
51 final FileName name;
52 try
53 {
54 name = parseUri(baseFile!=null?baseFile.getName():null, uri);
55 }
56 catch (FileSystemException exc)
57 {
58 throw new FileSystemException("vfs.provider/invalid-absolute-uri.error", uri, exc);
59 }
60
61
62 return findFile(name, fileSystemOptions);
63 }
64
65 /***
66 * Locates a file from its parsed URI.
67 */
68 protected FileObject findFile(final FileName name, final FileSystemOptions fileSystemOptions)
69 throws FileSystemException
70 {
71
72 final FileName rootName = getContext().getFileSystemManager().resolveName(name, FileName.ROOT_PATH);
73
74 FileSystem fs;
75 synchronized (this)
76 {
77 fs = findFileSystem(rootName, fileSystemOptions);
78 if (fs == null)
79 {
80
81 fs = doCreateFileSystem(rootName, fileSystemOptions);
82 addFileSystem(rootName, fs);
83 }
84 }
85
86
87
88 return fs.resolveFile(name);
89 }
90
91 /***
92 * Creates a {@link FileSystem}. If the returned FileSystem implements
93 * {@link VfsComponent}, it will be initialised.
94 *
95 * @param rootName The name of the root file of the file system to create.
96 */
97 protected abstract FileSystem doCreateFileSystem(final FileName rootName, final FileSystemOptions fileSystemOptions)
98 throws FileSystemException;
99 }