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 is layered on top of another, such as the
27 * contents of a zip or tar file.
28 *
29 * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
30 * @version $Revision: 480428 $ $Date: 2006-11-29 07:15:24 +0100 (Mi, 29 Nov 2006) $
31 */
32 public abstract class AbstractLayeredFileProvider
33 extends AbstractFileProvider
34 implements FileProvider
35 {
36 public AbstractLayeredFileProvider()
37 {
38 super();
39 setFileNameParser(LayeredFileNameParser.getInstance());
40 }
41
42 /***
43 * Locates a file object, by absolute URI.
44 */
45 public FileObject findFile(final FileObject baseFile,
46 final String uri,
47 final FileSystemOptions properties) throws FileSystemException
48 {
49
50 final LayeredFileName name = (LayeredFileName) parseUri(baseFile!=null?baseFile.getName():null, uri);
51
52
53
54
55 final FileName fileName = name.getOuterName();
56 final FileObject file = getContext().resolveFile(baseFile, fileName.getURI(), properties);
57
58
59 final FileObject rootFile = createFileSystem(name.getScheme(), file, properties);
60
61
62 return rootFile.resolveFile(name.getPath());
63 }
64
65 /***
66 * Creates a layered file system.
67 */
68 public synchronized FileObject createFileSystem(final String scheme,
69 final FileObject file,
70 final FileSystemOptions fileSystemOptions)
71 throws FileSystemException
72 {
73
74 final FileName rootName = file.getName();
75 FileSystem fs = findFileSystem(rootName, null);
76 if (fs == null)
77 {
78
79 fs = doCreateFileSystem(scheme, file, fileSystemOptions);
80 addFileSystem(rootName, fs);
81 }
82 return fs.getRoot();
83 }
84
85 /***
86 * Creates a layered file system. This method is called if the file system
87 * is not cached. The file system may implement {@link VfsComponent}.
88 *
89 * @param scheme The URI scheme.
90 * @param file The file to create the file system on top of.
91 * @return The file system.
92 */
93 protected abstract FileSystem doCreateFileSystem(final String scheme,
94 final FileObject file,
95 final FileSystemOptions fileSystemOptions)
96 throws FileSystemException;
97
98 }