1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs.provider.tar;
18
19
20
21 import org.apache.commons.vfs.FileName;
22 import org.apache.commons.vfs.FileObject;
23 import org.apache.commons.vfs.FileSystemException;
24 import org.apache.commons.vfs.FileType;
25 import org.apache.commons.vfs.provider.AbstractFileObject;
26
27 import java.io.InputStream;
28 import java.util.HashSet;
29
30 /***
31 * A file in a Tar file system.
32 */
33 public class TarFileObject
34 extends AbstractFileObject
35 implements FileObject
36 {
37 private final HashSet children = new HashSet();
38 private final TarFileSystem fs;
39 protected TarEntry entry;
40 private FileType type;
41
42 protected TarFileObject(FileName name,
43 TarEntry entry,
44 TarFileSystem fs,
45 boolean tarExists) throws FileSystemException
46 {
47 super(name, fs);
48 this.fs = fs;
49 setTarEntry(entry);
50 if (!tarExists)
51 {
52 type = FileType.IMAGINARY;
53 }
54 }
55
56 /***
57 * Sets the details for this file object.
58 */
59 protected void setTarEntry(final TarEntry entry)
60 {
61 if (this.entry != null)
62 {
63 return;
64 }
65
66 if ((entry == null) || (entry.isDirectory()))
67 {
68 type = FileType.FOLDER;
69 }
70 else
71 {
72 type = FileType.FILE;
73 }
74
75 this.entry = entry;
76 }
77
78 /***
79 * Attaches a child
80 */
81 protected void attachChild(FileName childName)
82 {
83 children.add(childName.getBaseName());
84 }
85
86 /***
87 * Determines if this file can be written to.
88 *
89 * @return <code>true</code> if this file is writeable, <code>false</code> if not.
90 */
91 public boolean isWriteable() throws FileSystemException
92 {
93 return false;
94 }
95
96 /***
97 * Returns the file's type.
98 */
99 protected FileType doGetType()
100 {
101 return type;
102 }
103
104 /***
105 * Lists the children of the file.
106 */
107 protected String[] doListChildren()
108 {
109 return (String[]) children.toArray(new String[children.size()]);
110 }
111
112 /***
113 * Returns the size of the file content (in bytes). Is only called if
114 * {@link #doGetType} returns {@link FileType#FILE}.
115 */
116 protected long doGetContentSize()
117 {
118 if (entry == null)
119 {
120 return 0;
121 }
122
123 return entry.getSize();
124 }
125
126 /***
127 * Returns the last modified time of this file.
128 */
129 protected long doGetLastModifiedTime() throws Exception
130 {
131 if (entry == null)
132 {
133 return 0;
134 }
135
136 return entry.getModTime().getTime();
137 }
138
139 /***
140 * Creates an input stream to read the file content from. Is only called
141 * if {@link #doGetType} returns {@link FileType#FILE}. The input stream
142 * returned by this method is guaranteed to be closed before this
143 * method is called again.
144 */
145 protected InputStream doGetInputStream() throws Exception
146 {
147 return fs.getInputStream(entry);
148 }
149 }