1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs2.impl;
18
19 import java.io.File;
20 import java.io.IOException;
21 import java.net.URL;
22 import java.net.URLConnection;
23 import java.util.Collections;
24 import java.util.Enumeration;
25
26 import org.apache.commons.vfs2.AbstractProviderTestCase;
27 import org.apache.commons.vfs2.AbstractVfsTestCase;
28 import org.apache.commons.vfs2.Capability;
29 import org.apache.commons.vfs2.FileObject;
30 import org.apache.commons.vfs2.FileSystemException;
31 import org.apache.commons.vfs2.FileSystemManager;
32 import org.apache.commons.vfs2.FileType;
33 import org.junit.Test;
34
35
36
37
38 public class VfsClassLoaderTests extends AbstractProviderTestCase {
39
40
41
42
43 public static class MockClassloader extends ClassLoader {
44 MockClassloader() {
45 super(null);
46 }
47
48 @Override
49 protected Class<?> findClass(final String name) throws ClassNotFoundException {
50 fail("Not intended to be used for class loading.");
51 return null;
52 }
53
54
55
56
57 @Override
58 public Enumeration<URL> getResources(final String name) throws IOException {
59 return Collections.enumeration(Collections.<URL>emptyList());
60 }
61 }
62
63
64
65
66 private VFSClassLoader createClassLoader() throws FileSystemException {
67 return new VFSClassLoader(getBaseFolder(), getManager());
68 }
69
70
71
72
73 @Override
74 protected Capability[] getRequiredCapabilities() {
75 return new Capability[] { Capability.READ_CONTENT, Capability.URI };
76 }
77
78
79
80
81
82
83
84
85 @Test
86 public void testGetResourcesJARs() throws Exception {
87 final FileSystemManager manager = getManager();
88 try {
89
90 manager.toFileObject(new File("."));
91 } catch (final FileSystemException e) {
92 System.out.println("VfsClassLoaderTests no local file provider, skipping.");
93 return;
94 }
95
96
97
98 final File baseDir = AbstractVfsTestCase.getTestDirectoryFile();
99 final FileObject nestedJar = manager.resolveFile(baseDir, "nested.jar");
100 final FileObject testJar = manager.resolveFile(baseDir, "test.jar");
101
102
103 if (!manager.canCreateFileSystem(nestedJar)) {
104 System.out.println("VfsClassLoaderTests no layered .jar provider, skipping.");
105 return;
106 }
107
108
109 assertSame("nested.jar is required for testing", nestedJar.getType(), FileType.FILE);
110 assertSame("test.jar is required for testing", testJar.getType(), FileType.FILE);
111
112
113
114
115 final ClassLoader mockClassloader = new MockClassloader();
116 final FileObject[] search = new FileObject[] { nestedJar, testJar };
117 final VFSClassLoader loader = new VFSClassLoader(search, getManager(), mockClassloader);
118
119 final Enumeration<URL> urls = loader.getResources("META-INF/MANIFEST.MF");
120 final URL url1 = urls.nextElement();
121 final URL url2 = urls.nextElement();
122
123 assertTrue("First resource must refer to nested.jar but was " + url1,
124 url1.toString().endsWith("nested.jar!/META-INF/MANIFEST.MF"));
125 assertTrue("Second resource must refer to test.jar but was " + url2,
126 url2.toString().endsWith("test.jar!/META-INF/MANIFEST.MF"));
127 }
128
129
130
131
132
133
134
135 @Test
136 public void testGetResourcesNoLayerLocal() throws Exception {
137 final FileSystemManager manager = getManager();
138 try {
139
140 manager.toFileObject(new File("."));
141 } catch (final FileSystemException e) {
142 System.out.println("VfsClassLoaderTests no local file provider, skipping.");
143 return;
144 }
145 final File baseDir = AbstractVfsTestCase.getTestDirectoryFile();
146
147
148 final FileObject dir = manager.resolveFile(baseDir, "read-tests/dir1/subdir4.jar");
149 assertSame("subdir4.jar/ is required for testing " + dir, dir.getType(), FileType.FOLDER);
150 assertFalse(manager.canCreateFileSystem(dir));
151
152
153 final FileObject[] search = new FileObject[] { dir };
154 final ClassLoader mockClassloader = new MockClassloader();
155 final VFSClassLoader loader = new VFSClassLoader(search, getManager(), mockClassloader);
156
157
158 final Enumeration<URL> urls = loader.getResources("file1.txt");
159 final URL url1 = urls.nextElement();
160 assertFalse("Only one hit expected", urls.hasMoreElements());
161 assertTrue("not pointing to resource " + url1, url1.toString().endsWith("subdir4.jar/file1.txt"));
162 }
163
164
165
166
167 @Test
168 public void testLoadClass() throws Exception {
169 final VFSClassLoader loader = createClassLoader();
170
171 final Class<?> testClass = loader.loadClass("code.ClassToLoad");
172 final Package pack = testClass.getPackage();
173 assertEquals("code", pack.getName());
174 verifyPackage(pack, false);
175
176 final Object testObject = testClass.newInstance();
177 assertEquals("**PRIVATE**", testObject.toString());
178 }
179
180
181
182
183 @Test
184 public void testLoadResource() throws Exception {
185 final VFSClassLoader loader = createClassLoader();
186
187 final URL resource = loader.getResource("read-tests/file1.txt");
188
189 assertNotNull(resource);
190 final URLConnection urlCon = resource.openConnection();
191 assertSameURLContent(FILE1_CONTENT, urlCon);
192 }
193
194
195
196
197 @Test
198 public void testSealing() throws Exception {
199 final VFSClassLoader loader = createClassLoader();
200 final Class<?> testClass = loader.loadClass("code.sealed.AnotherClass");
201 final Package pack = testClass.getPackage();
202 assertEquals("code.sealed", pack.getName());
203 verifyPackage(pack, true);
204 }
205
206
207
208
209 private void verifyPackage(final Package pack, final boolean sealed) {
210 if (getBaseFolder().getFileSystem().hasCapability(Capability.MANIFEST_ATTRIBUTES)) {
211 assertEquals("ImplTitle", pack.getImplementationTitle());
212 assertEquals("ImplVendor", pack.getImplementationVendor());
213 assertEquals("1.1", pack.getImplementationVersion());
214 assertEquals("SpecTitle", pack.getSpecificationTitle());
215 assertEquals("SpecVendor", pack.getSpecificationVendor());
216 assertEquals("1.0", pack.getSpecificationVersion());
217 assertEquals(sealed, pack.isSealed());
218 } else {
219 assertNull(pack.getImplementationTitle());
220 assertNull(pack.getImplementationVendor());
221 assertNull(pack.getImplementationVersion());
222 assertNull(pack.getSpecificationTitle());
223 assertNull(pack.getSpecificationVendor());
224 assertNull(pack.getSpecificationVersion());
225 assertFalse(pack.isSealed());
226 }
227 }
228 }