1 package org.codehaus.mojo.jaxb2.shared.classloader;
2
3 import org.codehaus.mojo.jaxb2.BufferingLog;
4 import org.codehaus.mojo.jaxb2.shared.FileSystemUtilities;
5 import org.codehaus.mojo.jaxb2.shared.environment.classloading.ThreadContextClassLoaderBuilder;
6 import org.codehaus.mojo.jaxb2.shared.environment.classloading.ThreadContextClassLoaderHolder;
7 import org.junit.After;
8 import org.junit.Assert;
9 import org.junit.Before;
10 import org.junit.Test;
11
12 import java.io.File;
13 import java.net.URL;
14 import java.util.Collections;
15 import java.util.List;
16
17
18
19
20 public class ThreadContextClassLoaderBuilderTest {
21
22
23 private ThreadContextClassLoaderHolder holder;
24 private URL extraClassLoaderDirURL;
25 private File extraClassLoaderDirFile;
26 private BufferingLog log;
27 private ClassLoader originalClassLoader;
28 private String encoding = "UTF-8";
29
30 @Before
31 public void setupSharedState() {
32
33 log = new BufferingLog(BufferingLog.LogLevel.DEBUG);
34
35 final String extraPath = "testdata/shared/classloader";
36 extraClassLoaderDirURL = getClass().getClassLoader().getResource(extraPath);
37 Assert.assertNotNull(extraClassLoaderDirURL);
38
39 extraClassLoaderDirFile = new File(extraClassLoaderDirURL.getPath());
40 Assert.assertTrue(extraClassLoaderDirFile.exists() && extraClassLoaderDirFile.isDirectory());
41
42
43 originalClassLoader = Thread.currentThread().getContextClassLoader();
44 }
45
46 @After
47 public void teardownSharedState() {
48 if (holder != null) {
49 holder.restoreClassLoaderAndReleaseThread();
50 } else {
51 Thread.currentThread().setContextClassLoader(originalClassLoader);
52 }
53 }
54
55 @Test
56 public void validateAddingURLsToThreadContextClassLoader() throws Exception {
57
58
59 holder = ThreadContextClassLoaderBuilder
60 .createFor(originalClassLoader, log, encoding)
61 .addURL(extraClassLoaderDirURL)
62 .buildAndSet();
63
64
65 final ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader();
66 final List<URL> resources = Collections.list(ctxClassLoader.getResources(""));
67
68
69 Assert.assertEquals(3, resources.size());
70 validateContains(resources, "target/classes");
71 validateContains(resources, "target/test-classes");
72 validateContains(resources, "target/test-classes/testdata/shared/classloader");
73
74 for (URL current : resources) {
75 final File aFile = new File(current.getPath());
76 Assert.assertTrue(aFile.exists() && aFile.isDirectory());
77 System.out.println("[" + current.getPath() + "]: " + aFile.getPath());
78 }
79 }
80
81 @Test
82 public void validateResourceAccessInAugmentedClassLoader() {
83
84
85 holder = ThreadContextClassLoaderBuilder
86 .createFor(originalClassLoader, log, encoding)
87 .addURL(extraClassLoaderDirURL)
88 .buildAndSet();
89
90
91 final ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader();
92
93 final URL immediateResource = ctxClassLoader.getResource("ImmediateTestResource.txt");
94 final URL subResource = ctxClassLoader.getResource("subdirectory/SubdirectoryTestResource.txt");
95
96
97 Assert.assertNotNull(immediateResource);
98 Assert.assertNotNull(subResource);
99
100 final File immediateFile = new File(immediateResource.getPath());
101 final File subFile = new File(subResource.getPath());
102
103 Assert.assertTrue(immediateFile.exists() && immediateFile.isFile());
104 Assert.assertTrue(subFile.exists() && subFile.isFile());
105 }
106
107 @Test
108 public void validateLoadingResourcesInJars() {
109
110
111 final File theJar = new File(extraClassLoaderDirFile, "jarSubDirectory/aJarWithResources.jar");
112
113 holder = ThreadContextClassLoaderBuilder
114 .createFor(originalClassLoader, log, encoding)
115 .addPath(FileSystemUtilities.getCanonicalPath(theJar))
116 .buildAndSet();
117
118
119 final ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader();
120
121 final URL containedTopLevelResource = ctxClassLoader.getResource("ContainedFileResource.txt");
122 final URL containedSubLevelResource = ctxClassLoader.getResource("internalSubDir/SubContainedResource.txt");
123
124
125 Assert.assertNotNull(containedTopLevelResource);
126 Assert.assertNotNull(containedSubLevelResource);
127 }
128
129
130
131
132
133 private void validateContains(final List<URL> resources, final String snippet) {
134
135 for (URL current : resources) {
136 if (current.toString().contains(snippet)) {
137 return;
138 }
139 }
140
141 Assert.fail("Snippet [" + snippet + "] was not found within URL resources.");
142 }
143 }