package org.jboss.shrinkwrap.impl.base.spec;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import junit.framework.Assert;
import org.jboss.shrinkwrap.api.ConfigurationBuilder;
import org.jboss.shrinkwrap.api.Domain;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.impl.base.spec.donotchange.DummyClassA;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author Ken Finnigan
*/
public class AddPackageFromJarContainingWebInfTest {
private Domain domain;
private Path temp;
@Before
public void setUp() throws IOException {
ConfigurationBuilder builder = new ConfigurationBuilder();
JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "my.jar");
jar.addClass(DummyClassA.class);
jar.add(new StringAsset("stuff"), "WEB-INF/classes/stuff.txt");
this.temp = Files.createTempFile("test", ".jar");
jar.as(ZipExporter.class).exportTo(temp.toFile(), true);
URL jarUrl = temp.toUri().toURL();
List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
URLClassLoader jarCl = new URLClassLoader(new URL[]{jarUrl}, null);
classLoaders.add(jarCl);
ClassLoader shrinkwrapCl = new FilteringClassLoader(this.getClass().getClassLoader());
classLoaders.add(shrinkwrapCl);
builder.classLoaders(classLoaders);
// Create a domain that includes the `donotchange` classes within a .war
// and the rest, excluding `donotchange` from the regular app classloader.
this.domain = ShrinkWrap.createDomain(builder.build());
}
@After
public void tearDown() throws IOException {
Files.delete( this.temp );
}
@Test
public void testAddPackage() {
// This archive's classloaders should be the app classloader (without `donotchange`)
// and an .war-based classloader including the `donotchange` within WEB-INF/classes/...
WebArchive war = this.domain.getArchiveFactory().create(WebArchive.class);
war.addPackage(DummyClassA.class.getPackage());
Assert.assertNotNull( war.get( "/WEB-INF/classes/" + DummyClassA.class.getName().replace( '.', '/' ) + ".class" ) );
}
/** Classloader to ensure the donotchange bits are not loaded through
* the app-classloader, while still enabling the default ShrinkWrap
* bits to be found through the junit test.
*/
private static class FilteringClassLoader extends ClassLoader {
public FilteringClassLoader(ClassLoader parent) {
super(parent);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (name.contains("donotchange")) {
return null;
}
return super.loadClass(name);
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
if (name.contains("donotchange")) {
return Collections.emptyEnumeration();
}
return super.getResources(name);
}
}
}