You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/12/19 23:03:54 UTC
tomee git commit: starting to rewrite OpenEJBArchiveProcessor,
a big cleanup will be needed soon I guess
Repository: tomee
Updated Branches:
refs/heads/develop 3f49e2eec -> 88a9af20d
starting to rewrite OpenEJBArchiveProcessor, a big cleanup will be needed soon I guess
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/88a9af20
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/88a9af20
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/88a9af20
Branch: refs/heads/develop
Commit: 88a9af20d327b8a7cdf85fc3e3099743622bacd3
Parents: 3f49e2e
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Fri Dec 19 23:03:08 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Fri Dec 19 23:03:08 2014 +0100
----------------------------------------------------------------------
.../openejb/OpenEJBArchiveProcessor.java | 254 ++++++++++---------
.../arquillian/openejb/SWClassLoader.java | 39 +--
tck/cdi-embedded/src/test/resources/failing.xml | 2 +-
3 files changed, 144 insertions(+), 151 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/88a9af20/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
index acbbf8f..0d59ee1 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
@@ -21,6 +21,7 @@ import org.apache.openejb.OpenEJBException;
import org.apache.openejb.OpenEJBRuntimeException;
import org.apache.openejb.cdi.CompositeBeans;
import org.apache.openejb.config.AppModule;
+import org.apache.openejb.config.ConfigurableClasspathArchive;
import org.apache.openejb.config.DeploymentLoader;
import org.apache.openejb.config.EjbModule;
import org.apache.openejb.config.FinderFactory;
@@ -73,6 +74,8 @@ import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
+import static java.util.Arrays.asList;
+
// doesn't implement ApplicationArchiveProcessor anymore since in some cases
// (with some observers set for instance)
// it is not called before the deployment itself
@@ -107,67 +110,18 @@ public class OpenEJBArchiveProcessor {
parent = javaClass.getClassLoader();
}
- final List<URL> additionalPaths = new ArrayList<URL>();
- final List<AssetSource> beansXmlMerged = new ArrayList<>();
- CompositeArchive earArchive = null;
- Map<URL, List<String>> earMap = null;
+ final List<URL> additionalPaths = new ArrayList<>();
+ CompositeArchive scannedArchive = null;
+ final Map<URL, List<String>> earMap = new HashMap<>();
final List<Archive> earLibsArchives = new ArrayList<>();
final CompositeBeans earBeans = new CompositeBeans();
- final String prefix;
final boolean isEar = EnterpriseArchive.class.isInstance(archive);
- if (WebArchive.class.isInstance(archive)) {
- prefix = WEB_INF;
-
- final Map<ArchivePath, Node> content = archive.getContent(new IncludeRegExpPaths("/WEB-INF/lib/.*"));
- analyzeWebArchive(archive, additionalPaths, beansXmlMerged, content);
- } else {
- if (isEar) { // mainly for CDI TCKs
- earMap = new HashMap<>();
- final Map<ArchivePath, Node> jars = archive.getContent(new IncludeRegExpPaths("/.*\\.jar"));
- final List<org.apache.xbean.finder.archive.Archive> archives = new ArrayList<>(jars.size());
- for (final Map.Entry<ArchivePath, Node> node : jars.entrySet()) {
- final Asset asset = node.getValue().getAsset();
- if (ArchiveAsset.class.isInstance(asset)) {
- final Archive<?> libArchive = ArchiveAsset.class.cast(asset).getArchive();
- if (!isExcluded(libArchive.getName())) {
- earLibsArchives.add(libArchive);
- final List<Class<?>> earClasses = new ArrayList<>();
- final List<String> earClassNames = new ArrayList<>();
- final Map<ArchivePath, Node> content = libArchive.getContent(new IncludeRegExpPaths(".*.class"));
- for (final Map.Entry<ArchivePath, Node> classNode : content.entrySet()) {
- final String classname = name(classNode.getKey().get());
- try {
- earClasses.add(parent.loadClass(classname));
- earClassNames.add(classname);
- } catch (final ClassNotFoundException e) {
- LOGGER.fine("Can't load class " + classname);
- } catch (final NoClassDefFoundError ncdfe) {
- // no-op
- }
- }
- try { // ends with !/META-INF/beans.xml to force it to be used as a cdi module *with bda*
- final Node beansNode = libArchive.get(META_INF + BEANS_XML);
- final URL arUrl = new URL("jar:file://!/lib/" + libArchive.getName() + (beansNode != null ? "!/META-INF/beans.xml" : ""));
- if (beansNode != null) {
- try {
- DeploymentLoader.doMerge(arUrl, earBeans, ReadDescriptors.readBeans(beansNode.getAsset().openStream()));
- } catch (final OpenEJBException e) {
- throw new IllegalArgumentException(e);
- }
- }
- earMap.put(arUrl, earClassNames);
- } catch (final MalformedURLException e) {
- // no-op
- }
- archives.add(new ClassesArchive(earClasses));
- }
- } // else TODO
- }
- earArchive = new CompositeArchive(archives);
- }
-
- prefix = META_INF;
+ final boolean isWebApp = WebArchive.class.isInstance(archive);
+ final String prefix = isWebApp ? WEB_INF : META_INF;
+ if (isEar || isWebApp) {
+ final Map<ArchivePath, Node> jars = archive.getContent(new IncludeRegExpPaths(isEar ? "/.*\\.jar" : "/WEB-INF/lib/.*\\.jar"));
+ scannedArchive = analyzeLibs(parent, additionalPaths, earMap, earLibsArchives, earBeans, jars);
}
final URL[] urls = additionalPaths.toArray(new URL[additionalPaths.size()]);
@@ -175,15 +129,10 @@ public class OpenEJBArchiveProcessor {
final URLClassLoaderFirst swParent = new URLClassLoaderFirst(urls, parent);
closeables.add(swParent);
- final SWClassLoader loader;
- if (!WEB_INF.equals(prefix)) {
- if (!isEar) {
- earLibsArchives.add(archive);
- }
- loader = new SWClassLoader("", swParent, earLibsArchives.toArray(new Archive<?>[earLibsArchives.size()]));
- } else {
- loader = new SWClassLoader(WEB_INF_CLASSES, swParent, archive);
+ if (!isEar) {
+ earLibsArchives.add(archive);
}
+ final SWClassLoader loader = new SWClassLoader(swParent, earLibsArchives.toArray(new Archive<?>[earLibsArchives.size()]));
closeables.add(loader);
final URLClassLoader tempClassLoader = ClassLoaderUtil.createTempClassLoader(loader);
closeables.add(tempClassLoader);
@@ -197,7 +146,7 @@ public class OpenEJBArchiveProcessor {
webModule.setUrls(additionalPaths);
appModule.getWebModules().add(webModule);
} else if (isEar) { // mainly for CDI TCKs
- final FinderFactory.OpenEJBAnnotationFinder earLibFinder = new FinderFactory.OpenEJBAnnotationFinder(new SimpleWebappAggregatedArchive(tempClassLoader, earArchive, earMap));
+ final FinderFactory.OpenEJBAnnotationFinder earLibFinder = new FinderFactory.OpenEJBAnnotationFinder(new SimpleWebappAggregatedArchive(tempClassLoader, scannedArchive, earMap));
appModule.setEarLibFinder(earLibFinder);
final EjbModule earCdiModule = new EjbModule(appModule.getClassLoader(), DeploymentLoader.EAR_SCOPED_CDI_BEANS + appModule.getModuleId(), new EjbJar(), new OpenejbJar());
@@ -212,18 +161,23 @@ public class OpenEJBArchiveProcessor {
final Archive<?> webArchive = ArchiveAsset.class.cast(asset).getArchive();
if (WebArchive.class.isInstance(webArchive)) {
final Map<String, Object> altDD = new HashMap<>();
- final Node beansXml = findBeansXml(webArchive, new ArrayList<AssetSource>(), WEB_INF, altDD);
- final SWClassLoader webLoader = new SWClassLoader(WEB_INF_CLASSES, parent, webArchive);
- closeables.add(webLoader);
+ final Node beansXml = findBeansXml(webArchive, WEB_INF);
final List<URL> webappAdditionalPaths = new LinkedList<URL>();
- final List<AssetSource> webAppBeansXmlMerged = new ArrayList<>();
- analyzeWebArchive(
- webArchive, webappAdditionalPaths, webAppBeansXmlMerged,
- webArchive.getContent(new IncludeRegExpPaths("/.*\\.jar")));
+ final CompositeBeans webAppBeansXml = new CompositeBeans();
+ final List<Archive> webAppArchives = new LinkedList<Archive>();
+ final Map<URL, List<String>> webAppClassesByUrl = new HashMap<URL, List<String>>();
+ final CompositeArchive webAppArchive = analyzeLibs(parent,
+ webappAdditionalPaths, webAppClassesByUrl,
+ webAppArchives, webAppBeansXml,
+ webArchive.getContent(new IncludeRegExpPaths("/WEB-INF/lib/.*\\.jar")));
+
+ webAppArchives.add(webArchive);
+ final SWClassLoader webLoader = new SWClassLoader(parent, webAppArchives.toArray(new Archive<?>[webAppArchives.size()]));
+ closeables.add(webLoader);
final FinderFactory.OpenEJBAnnotationFinder finder = new FinderFactory.OpenEJBAnnotationFinder(
- finderArchive(beansXml, webArchive, webLoader, webappAdditionalPaths));
+ finderArchive(beansXml, webArchive, webLoader, webAppArchive, webAppClassesByUrl, webAppBeansXml));
final WebModule webModule = new WebModule(new WebApp(), contextRoot(webArchive.getName()), webLoader, "", appModule.getModuleId());
webModule.setUrls(Collections.<URL>emptyList());
@@ -231,7 +185,9 @@ public class OpenEJBArchiveProcessor {
webModule.setFinder(finder);
final EjbModule ejbModule = new EjbModule(webLoader, webModule.getModuleId(), null, new EjbJar(), new OpenejbJar());
+ ejbModule.setBeans(webAppBeansXml);
ejbModule.getAltDDs().putAll(altDD);
+ ejbModule.getAltDDs().put("beans.xml", webAppBeansXml);
ejbModule.setFinder(finder);
ejbModule.setClassLoader(webLoader);
ejbModule.setWebapp(true);
@@ -298,9 +254,14 @@ public class OpenEJBArchiveProcessor {
final EjbModule ejbModule = new EjbModule(ejbJar);
ejbModule.setClassLoader(tempClassLoader);
- final Node beansXml = findBeansXml(archive, beansXmlMerged, prefix, ejbModule.getAltDDs());
- final org.apache.xbean.finder.archive.Archive finderArchive = finderArchive(beansXml, archive, tempClassLoader, additionalPaths);
- ejbModule.setFinder(new FinderFactory.ModuleLimitedFinder(new FinderFactory.OpenEJBAnnotationFinder(finderArchive)));
+ final Node beansXml = findBeansXml(archive, prefix);
+
+ final FinderFactory.OpenEJBAnnotationFinder finder = new FinderFactory.OpenEJBAnnotationFinder(
+ finderArchive(beansXml, archive, loader, scannedArchive, earMap, earBeans));
+ ejbModule.setFinder(finder);
+ ejbModule.setBeans(earBeans);
+ ejbModule.getAltDDs().put("beans.xml", earBeans);
+
if (appModule.isWebapp()) { // war
appModule.getWebModules().iterator().next().setFinder(ejbModule.getFinder());
}
@@ -319,47 +280,89 @@ public class OpenEJBArchiveProcessor {
return appModule;
}
- private static void analyzeWebArchive(Archive<?> archive, List<URL> additionalPaths, List<AssetSource> beansXmlMerged, Map<ArchivePath, Node> content) {
- for (final Map.Entry<ArchivePath, Node> node : content.entrySet()) {
+ private static CompositeArchive analyzeLibs(final ClassLoader parent,
+ final List<URL> additionalPaths, final Map<URL, List<String>> earMap,
+ final List<Archive> earLibsArchives,
+ final CompositeBeans earBeans,
+ final Map<ArchivePath, Node> jars) {
+ final List<org.apache.xbean.finder.archive.Archive> archives = new ArrayList<>(jars.size());
+ for (final Map.Entry<ArchivePath, Node> node : jars.entrySet()) {
final Asset asset = node.getValue().getAsset();
- if (UrlAsset.class.isInstance(asset)) {
- additionalPaths.add(get(URL.class, "url", asset));
- } else if (FileAsset.class.isInstance(asset)) {
- try {
- additionalPaths.add(get(File.class, "file", asset).toURI().toURL());
- } catch (final MalformedURLException e) {
- LOGGER.log(Level.SEVERE, "can't add a library to the deployment", e);
- }
- } else if (ArchiveAsset.class.isInstance(asset)) {
- final Archive<?> nestedArchive = ArchiveAsset.class.cast(asset).getArchive();
- if (!isExcluded(nestedArchive.getName())) {
- final Node bXmlNode = nestedArchive.get(META_INF + BEANS_XML);
- if (bXmlNode != null) {
+ if (ArchiveAsset.class.isInstance(asset)) {
+ final Archive<?> libArchive = ArchiveAsset.class.cast(asset).getArchive();
+ if (!isExcluded(libArchive.getName())) {
+ earLibsArchives.add(libArchive);
+ final List<Class<?>> earClasses = new ArrayList<>();
+ final List<String> earClassNames = new ArrayList<>();
+ final Map<ArchivePath, Node> content = libArchive.getContent(new IncludeRegExpPaths(".*.class"));
+ for (final Map.Entry<ArchivePath, Node> classNode : content.entrySet()) {
+ final String classname = name(classNode.getKey().get());
try {
- beansXmlMerged.add(new AssetSource(bXmlNode.getAsset(), new URL("jar:file://!/WEB-INF/lib/" + nestedArchive.getName() + "!/META-INF/beans.xml")));
- } catch (final MalformedURLException e) {
- // shouldn't occur
+ earClasses.add(parent.loadClass(classname));
+ earClassNames.add(classname);
+ } catch (final ClassNotFoundException e) {
+ LOGGER.fine("Can't load class " + classname);
+ } catch (final NoClassDefFoundError ncdfe) {
+ // no-op
}
}
- archive.merge(nestedArchive);
+ try { // ends with !/META-INF/beans.xml to force it to be used as a cdi module *with bda*
+ final Node beansNode = libArchive.get(META_INF + BEANS_XML);
+ final URL arUrl = new URL("jar:file://!/lib/" + libArchive.getName() + (beansNode != null ? "!/META-INF/beans.xml" : ""));
+ if (beansNode != null) {
+ try {
+ DeploymentLoader.doMerge(arUrl, earBeans, ReadDescriptors.readBeans(beansNode.getAsset().openStream()));
+ } catch (final OpenEJBException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+ earMap.put(arUrl, earClassNames);
+ } catch (final MalformedURLException e) {
+ // no-op
+ }
+ archives.add(new ClassesArchive(earClasses));
+ }
+ } if (UrlAsset.class.isInstance(asset) || FileAsset.class.isInstance(asset)) {
+ try {
+ final URL url = UrlAsset.class.isInstance(asset) ? get(URL.class, "url", asset) : get(File.class, "file", asset).toURI().toURL();
+ final List<String> classes = new ArrayList<String>();
+ archives.add(new FilteredArchive(
+ new JarArchive(parent, url),
+ new WebappAggregatedArchive.ScanXmlSaverFilter(false, null, classes, null)));
+ additionalPaths.add(url);
+
+ final URLClassLoader loader = new URLClassLoader(new URL[] { url }, ClassLoader.getSystemClassLoader().getParent());
+ for (final String beans : asList("/META-INF/beans.xml", "/META-INF/beans.xml")) {
+ final URL u = loader.getResource(beans);
+ if (beans != null) {
+ try {
+ DeploymentLoader.doMerge(u, earBeans, ReadDescriptors.readBeans(u.openStream()));
+ } catch (final OpenEJBException e) {
+ throw new IllegalArgumentException(e);
+ } catch (final IOException e) {
+ // no-op
+ }
+ earMap.put(u, classes);
+ }
+ }
+ try {
+ loader.close();
+ } catch (final IOException e) {
+ // no-op
+ }
+ } catch (final MalformedURLException e) {
+ throw new IllegalArgumentException(e);
}
}
}
+ return new CompositeArchive(archives);
}
- private static Node findBeansXml(final Archive<?> archive, final List<AssetSource> beansXmlMerged, final String prefix, final Map<String, Object> altDD) {
+ private static Node findBeansXml(final Archive<?> archive, final String prefix) {
Node beansXml = archive.get(prefix.concat(BEANS_XML));
if (beansXml == null && WEB_INF.equals(prefix)) {
beansXml = archive.get(WEB_INF_CLASSES.concat(META_INF).concat(BEANS_XML));
}
- if (beansXml != null) {
- try {
- beansXmlMerged.add(new AssetSource(beansXml.getAsset(), new URL("jar:file://!/WEB-INF/classes/beans.xml")));
- } catch (final MalformedURLException e) {
- // shouldn't occur
- }
- altDD.put(BEANS_XML, beansXmlMerged);
- }
return beansXml;
}
@@ -454,8 +457,12 @@ public class OpenEJBArchiveProcessor {
}
}
- private static org.apache.xbean.finder.archive.Archive finderArchive(final Node beansXml, final Archive<?> archive, final ClassLoader cl, final Collection<URL> additionalPaths) {
- final List<Class<?>> classes = new ArrayList<Class<?>>();
+ private static org.apache.xbean.finder.archive.Archive finderArchive(
+ final Node beansXml, final Archive<?> archive,
+ final ClassLoader cl, final CompositeArchive libs,
+ final Map<URL, List<String>> webAppClassesByUrl,
+ final CompositeBeans compositeBeans) {
+ final List<Class<?>> classes = new ArrayList<>();
final Map<ArchivePath, Node> content = archive.getContent(new IncludeRegExpPaths(".*.class"));
for (final Map.Entry<ArchivePath, Node> node : content.entrySet()) {
final String classname = name(node.getKey().get());
@@ -471,33 +478,34 @@ public class OpenEJBArchiveProcessor {
}
}
- final Map<URL, List<String>> classesByUrl = new HashMap<>();
-
final List<org.apache.xbean.finder.archive.Archive> archives = new ArrayList<>();
- for (final URL url : DeploymentLoader.filterWebappUrls(additionalPaths.toArray(new URL[additionalPaths.size()]), null)) {
- final List<String> currentClasses = new ArrayList<>();
- final org.apache.xbean.finder.archive.Archive newArchive = new FilteredArchive(new JarArchive(cl, url),
- new WebappAggregatedArchive.ScanXmlSaverFilter(false, null, currentClasses, null));
- classesByUrl.put(url, currentClasses);
- archives.add(newArchive);
- }
archives.add(new ClassesArchive(classes));
if (beansXml != null) {
- final List<String> mainClasses = new ArrayList<>();
- for (final Class<?> clazz : classes) {
- mainClasses.add(clazz.getName());
- }
- // look org.apache.openejb.config.AnnotationDeployer.DiscoverAnnotatedBeans.hasBeansXml()
try {
final URL key = new URL("jar:file://!/WEB-INF/beans.xml"); // no host avoid host resolution in hashcode()
- classesByUrl.put(key, mainClasses);
+ try {
+ DeploymentLoader.doMerge(key, compositeBeans, ReadDescriptors.readBeans(beansXml.getAsset().openStream()));
+ } catch (final OpenEJBException e) {
+ throw new IllegalArgumentException(e);
+ }
+
+ final List<String> mainClasses = new ArrayList<>();
+ for (final Class<?> clazz : classes) {
+ mainClasses.add(clazz.getName());
+ }
+
+ webAppClassesByUrl.put(key, mainClasses);
} catch (final MalformedURLException mue) {
// no-op
}
}
- return new SimpleWebappAggregatedArchive(cl, new CompositeArchive(archives), classesByUrl);
+ if (libs != null) {
+ archives.add(libs);
+ }
+
+ return new SimpleWebappAggregatedArchive(cl, new CompositeArchive(archives), webAppClassesByUrl);
}
private static boolean isExcluded(final String archiveName) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/88a9af20/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
index 43e0351..cbbd7d2 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
@@ -20,13 +20,13 @@ import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.Enumerator;
import org.apache.openejb.util.reflection.Reflections;
import org.jboss.shrinkwrap.api.Archive;
-import org.jboss.shrinkwrap.api.ArchivePath;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.Node;
import org.jboss.shrinkwrap.api.asset.Asset;
import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
import org.jboss.shrinkwrap.api.asset.FileAsset;
import org.jboss.shrinkwrap.api.asset.UrlAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
import javax.enterprise.inject.spi.Extension;
import java.io.Closeable;
@@ -60,15 +60,13 @@ public class SWClassLoader extends ClassLoader implements Closeable {
}
private final Archive<?>[] archives;
- private final String prefix;
private final Collection<Closeable> closeables = new ArrayList<Closeable>();
- public SWClassLoader(final String prefix, final ClassLoader parent, final Archive<?>... ar) {
+ public SWClassLoader(final ClassLoader parent, final Archive<?>... ar) {
super(parent);
- this.prefix = prefix;
this.archives = ar;
for (final Archive<?> a : ar) {
- ArchiveStreamHandler.set(a, prefix, closeables);
+ ArchiveStreamHandler.set(a, closeables);
}
}
@@ -108,13 +106,9 @@ public class SWClassLoader extends ClassLoader implements Closeable {
}
private LinkedList<Archive<?>> findNodes(final String name) {
- ArchivePath path = ArchivePaths.create(prefix + name);
final LinkedList<Archive<?>> items = new LinkedList<>();
for (final Archive<?> a : archives) {
- Node node = a.get(path);
- if (node == null) {
- node = a.get(ArchivePaths.create(name));
- }
+ final Node node = a.get(ArchivePaths.create((WebArchive.class.isInstance(a) ? "/WEB-INF/classes/" : "") + name));
if (node != null) {
items.add(a);
}
@@ -142,35 +136,26 @@ public class SWClassLoader extends ClassLoader implements Closeable {
private static class ArchiveStreamHandler extends URLStreamHandler {
public static final Map<String, Archive<?>> archives = new HashMap<String, Archive<?>>();
- public static final Map<String, String> prefixes = new HashMap<String, String>();
public static final Map<String, Collection<Closeable>> closeables = new HashMap<String, Collection<Closeable>>();
- public static void set(final Archive<?> ar, final String p, final Collection<Closeable> c) {
+ public static void set(final Archive<?> ar, final Collection<Closeable> c) {
final String archiveName = ar.getName();
archives.put(archiveName, ar);
- prefixes.put(archiveName, p);
closeables.put(archiveName, c);
}
public static void reset(final String archiveName) {
archives.remove(archiveName);
- prefixes.remove(archiveName);
closeables.remove(archiveName);
}
@Override
protected URLConnection openConnection(final URL u) throws IOException {
final String arName = key(u);
- if (!prefixes.containsKey(arName)) {
- throw new IOException(u.toExternalForm() + " not found");
- }
- String path = prefixes.get(arName) + path(arName, u);
- Node node = archives.get(arName).get(path);
- if (node == null) {
- path = path(arName, u);
- node = archives.get(arName).get(path);
- }
+ final Archive<?> archive = archives.get(arName);
+ final String path = path(archive.getName(), WebArchive.class.isInstance(archive) ? "/WEB-INF/classes/" : "", u);
+ final Node node = archive.get(path);
if (node == null) {
throw new IOException(u.toExternalForm() + " not found");
}
@@ -200,13 +185,13 @@ public class SWClassLoader extends ClassLoader implements Closeable {
};
}
- private static String path(final String arName, final URL url) {
+ private static String path(final String arName, final String prefix, final URL url) {
final String p = url.getPath();
final String out = p.substring(arName.length(), p.length());
- if (prefixes.get(arName).endsWith("/") && out.startsWith("/")) {
- return out.substring(1);
+ if (prefix.endsWith("/") && out.startsWith("/")) {
+ return prefix + out.substring(1);
}
- return out;
+ return prefix + out;
}
private static String key(final URL url) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/88a9af20/tck/cdi-embedded/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml
index 00b611a..b49e5b2 100644
--- a/tck/cdi-embedded/src/test/resources/failing.xml
+++ b/tck/cdi-embedded/src/test/resources/failing.xml
@@ -18,7 +18,7 @@
<suite name="CDI TCK" verbose="0">
<test name="CDI TCK">
<classes>
- <class name="org.jboss.cdi.tck.tests.deployment.discovery.enterprise.EnterpriseBeanDiscoveryTest" />
+ <class name="org.jboss.cdi.tck.tests.extensions.lifecycle.atd.AfterTypeDiscoveryTest" />
</classes>
</test>
</suite>