package org.codehaus.mojo.jaxb2.shared.classloader; import org.codehaus.mojo.jaxb2.BufferingLog; import org.codehaus.mojo.jaxb2.shared.FileSystemUtilities; import org.codehaus.mojo.jaxb2.shared.environment.classloading.ThreadContextClassLoaderBuilder; import org.codehaus.mojo.jaxb2.shared.environment.classloading.ThreadContextClassLoaderHolder; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.io.File; import java.net.URL; import java.util.Collections; import java.util.List; /** * @author <a href="mailto:lj@jguru.se">Lennart Jörelid</a>, jGuru Europe AB */ public class ThreadContextClassLoaderBuilderTest { // Shared state private ThreadContextClassLoaderHolder holder; private URL extraClassLoaderDirURL; private File extraClassLoaderDirFile; private BufferingLog log; private ClassLoader originalClassLoader; private String encoding = "UTF-8"; @Before public void setupSharedState() { log = new BufferingLog(BufferingLog.LogLevel.DEBUG); final String extraPath = "testdata/shared/classloader"; extraClassLoaderDirURL = getClass().getClassLoader().getResource(extraPath); Assert.assertNotNull(extraClassLoaderDirURL); extraClassLoaderDirFile = new File(extraClassLoaderDirURL.getPath()); Assert.assertTrue(extraClassLoaderDirFile.exists() && extraClassLoaderDirFile.isDirectory()); // Stash the original ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); } @After public void teardownSharedState() { if (holder != null) { holder.restoreClassLoaderAndReleaseThread(); } else { Thread.currentThread().setContextClassLoader(originalClassLoader); } } @Test public void validateAddingURLsToThreadContextClassLoader() throws Exception { // Assemble holder = ThreadContextClassLoaderBuilder .createFor(originalClassLoader, log, encoding) .addURL(extraClassLoaderDirURL) .buildAndSet(); // Act final ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader(); final List<URL> resources = Collections.list(ctxClassLoader.getResources("")); // Assert Assert.assertEquals(3, resources.size()); validateContains(resources, "target/classes"); validateContains(resources, "target/test-classes"); validateContains(resources, "target/test-classes/testdata/shared/classloader"); for (URL current : resources) { final File aFile = new File(current.getPath()); Assert.assertTrue(aFile.exists() && aFile.isDirectory()); System.out.println("[" + current.getPath() + "]: " + aFile.getPath()); } } @Test public void validateResourceAccessInAugmentedClassLoader() { // Assemble holder = ThreadContextClassLoaderBuilder .createFor(originalClassLoader, log, encoding) .addURL(extraClassLoaderDirURL) .buildAndSet(); // Act final ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader(); final URL immediateResource = ctxClassLoader.getResource("ImmediateTestResource.txt"); final URL subResource = ctxClassLoader.getResource("subdirectory/SubdirectoryTestResource.txt"); // Assert Assert.assertNotNull(immediateResource); Assert.assertNotNull(subResource); final File immediateFile = new File(immediateResource.getPath()); final File subFile = new File(subResource.getPath()); Assert.assertTrue(immediateFile.exists() && immediateFile.isFile()); Assert.assertTrue(subFile.exists() && subFile.isFile()); } @Test public void validateLoadingResourcesInJars() { // Assemble final File theJar = new File(extraClassLoaderDirFile, "jarSubDirectory/aJarWithResources.jar"); holder = ThreadContextClassLoaderBuilder .createFor(originalClassLoader, log, encoding) .addPath(FileSystemUtilities.getCanonicalPath(theJar)) .buildAndSet(); // Act final ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader(); final URL containedTopLevelResource = ctxClassLoader.getResource("ContainedFileResource.txt"); final URL containedSubLevelResource = ctxClassLoader.getResource("internalSubDir/SubContainedResource.txt"); // Assert Assert.assertNotNull(containedTopLevelResource); Assert.assertNotNull(containedSubLevelResource); } // // Private helpers // private void validateContains(final List<URL> resources, final String snippet) { for (URL current : resources) { if (current.toString().contains(snippet)) { return; } } Assert.fail("Snippet [" + snippet + "] was not found within URL resources."); } }