1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs.provider.jar;
18
19 import org.apache.commons.vfs.FileName;
20 import org.apache.commons.vfs.FileObject;
21 import org.apache.commons.vfs.FileSystemException;
22 import org.apache.commons.vfs.FileSystemOptions;
23 import org.apache.commons.vfs.provider.zip.ZipFileObject;
24 import org.apache.commons.vfs.provider.zip.ZipFileSystem;
25
26 import java.io.File;
27 import java.io.IOException;
28 import java.util.Collection;
29 import java.util.jar.Attributes;
30 import java.util.jar.Attributes.Name;
31 import java.util.jar.JarFile;
32 import java.util.jar.Manifest;
33 import java.util.zip.ZipEntry;
34 import java.util.zip.ZipFile;
35
36 /***
37 * A read-only file system for Jar files.
38 *
39 * @author <a href="mailto:brian@mmmanager.org">Brian Olsen</a>
40 * @version $Revision: 480428 $ $Date: 2006-11-29 07:15:24 +0100 (Mi, 29 Nov 2006) $
41 */
42 public class JarFileSystem
43 extends ZipFileSystem
44 {
45 private Attributes attributes;
46
47 protected JarFileSystem(final FileName rootName,
48 final FileObject file,
49 final FileSystemOptions fileSystemOptions) throws FileSystemException
50 {
51 super(rootName, file, fileSystemOptions);
52 }
53
54 protected ZipFile createZipFile(File file) throws FileSystemException
55 {
56 try
57 {
58 return new JarFile(file);
59 }
60 catch (IOException ioe)
61 {
62 throw new FileSystemException("vfs.provider.jar/open-jar-file.error", file, ioe);
63 }
64 }
65
66 protected ZipFileObject createZipFileObject(FileName name,
67 ZipEntry entry) throws FileSystemException
68 {
69 return new JarFileObject(name, entry, this, true);
70 }
71
72 /***
73 * Returns the capabilities of this file system.
74 */
75 protected void addCapabilities(final Collection caps)
76 {
77
78 caps.addAll(JarFileProvider.capabilities);
79 }
80
81 Attributes getAttributes() throws IOException
82 {
83 if (attributes == null)
84 {
85 final Manifest man = ((JarFile) getZipFile()).getManifest();
86 if (man == null)
87 {
88 attributes = new Attributes(1);
89 }
90 else
91 {
92 attributes = man.getMainAttributes();
93 if (attributes == null)
94 {
95 attributes = new Attributes(1);
96 }
97 }
98 }
99
100 return attributes;
101 }
102
103 Object getAttribute(Name attrName)
104 throws FileSystemException
105 {
106 try
107 {
108 final Attributes attr = getAttributes();
109 final String value = attr.getValue(attrName);
110 return value;
111 }
112 catch (IOException ioe)
113 {
114 throw new FileSystemException(attrName.toString(), ioe);
115 }
116 }
117
118 Name lookupName(String attrName)
119 {
120 if (Name.CLASS_PATH.equals(attrName))
121 {
122 return Name.CLASS_PATH;
123 }
124 else if (Name.CONTENT_TYPE.equals(attrName))
125 {
126 return Name.CONTENT_TYPE;
127 }
128 else if (Name.EXTENSION_INSTALLATION.equals(attrName))
129 {
130 return Name.EXTENSION_INSTALLATION;
131 }
132 else if (Name.EXTENSION_LIST.equals(attrName))
133 {
134 return Name.EXTENSION_LIST;
135 }
136 else if (Name.EXTENSION_NAME.equals(attrName))
137 {
138 return Name.EXTENSION_NAME;
139 }
140 else if (Name.IMPLEMENTATION_TITLE.equals(attrName))
141 {
142 return Name.IMPLEMENTATION_TITLE;
143 }
144 else if (Name.IMPLEMENTATION_URL.equals(attrName))
145 {
146 return Name.IMPLEMENTATION_URL;
147 }
148 else if (Name.IMPLEMENTATION_VENDOR.equals(attrName))
149 {
150 return Name.IMPLEMENTATION_VENDOR;
151 }
152 else if (Name.IMPLEMENTATION_VENDOR_ID.equals(attrName))
153 {
154 return Name.IMPLEMENTATION_VENDOR_ID;
155 }
156 else if (Name.IMPLEMENTATION_VERSION.equals(attrName))
157 {
158 return Name.IMPLEMENTATION_VENDOR;
159 }
160 else if (Name.MAIN_CLASS.equals(attrName))
161 {
162 return Name.MAIN_CLASS;
163 }
164 else if (Name.MANIFEST_VERSION.equals(attrName))
165 {
166 return Name.MANIFEST_VERSION;
167 }
168 else if (Name.SEALED.equals(attrName))
169 {
170 return Name.SEALED;
171 }
172 else if (Name.SIGNATURE_VERSION.equals(attrName))
173 {
174 return Name.SIGNATURE_VERSION;
175 }
176 else if (Name.SPECIFICATION_TITLE.equals(attrName))
177 {
178 return Name.SPECIFICATION_TITLE;
179 }
180 else if (Name.SPECIFICATION_VENDOR.equals(attrName))
181 {
182 return Name.SPECIFICATION_VENDOR;
183 }
184 else if (Name.SPECIFICATION_VERSION.equals(attrName))
185 {
186 return Name.SPECIFICATION_VERSION;
187 }
188 else
189 {
190 return new Name(attrName);
191 }
192 }
193
194 /***
195 * Retrives the attribute with the specified name. The default
196 * implementation simply throws an exception.
197 */
198 public Object getAttribute(String attrName) throws FileSystemException
199 {
200 final Name name = lookupName(attrName);
201 return getAttribute(name);
202 }
203
204
205 protected ZipFile getZipFile() throws FileSystemException
206 {
207 return super.getZipFile();
208 }
209 }