View Javadoc
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   * @author <a href="mailto:lj@jguru.se">Lennart J&ouml;relid</a>, jGuru Europe AB
19   */
20  public class ThreadContextClassLoaderBuilderTest {
21  
22      // Shared state
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          // Stash the original ClassLoader
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          // Assemble
59          holder = ThreadContextClassLoaderBuilder
60                  .createFor(originalClassLoader, log, encoding)
61                  .addURL(extraClassLoaderDirURL)
62                  .buildAndSet();
63  
64          // Act
65          final ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader();
66          final List<URL> resources = Collections.list(ctxClassLoader.getResources(""));
67  
68          // Assert
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          // Assemble
85          holder = ThreadContextClassLoaderBuilder
86                  .createFor(originalClassLoader, log, encoding)
87                  .addURL(extraClassLoaderDirURL)
88                  .buildAndSet();
89  
90          // Act
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          // Assert
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         // Assemble
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         // Act
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         // Assert
125         Assert.assertNotNull(containedTopLevelResource);
126         Assert.assertNotNull(containedSubLevelResource);
127     }
128 
129     //
130     // Private helpers
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 }