Return-Path: X-Original-To: apmail-openwebbeans-commits-archive@www.apache.org Delivered-To: apmail-openwebbeans-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id EB4F31060B for ; Tue, 18 Jun 2013 15:14:45 +0000 (UTC) Received: (qmail 29393 invoked by uid 500); 18 Jun 2013 15:14:45 -0000 Delivered-To: apmail-openwebbeans-commits-archive@openwebbeans.apache.org Received: (qmail 29353 invoked by uid 500); 18 Jun 2013 15:14:43 -0000 Mailing-List: contact commits-help@openwebbeans.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openwebbeans.apache.org Delivered-To: mailing list commits@openwebbeans.apache.org Received: (qmail 29334 invoked by uid 99); 18 Jun 2013 15:14:41 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 18 Jun 2013 15:14:41 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 18 Jun 2013 15:14:37 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id F407B238889B; Tue, 18 Jun 2013 15:14:16 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1494168 - in /openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone: OwbSWClassLoader.java OwbStandaloneConfiguration.java OwbStandaloneContainer.java Date: Tue, 18 Jun 2013 15:14:16 -0000 To: commits@openwebbeans.apache.org From: rmannibucau@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130618151416.F407B238889B@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: rmannibucau Date: Tue Jun 18 15:14:16 2013 New Revision: 1494168 URL: http://svn.apache.org/r1494168 Log: OWB-876 better handling if resource name doesn't have a / + adding a property to skip AppClassLoader resources Modified: openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbSWClassLoader.java openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneConfiguration.java openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneContainer.java Modified: openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbSWClassLoader.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbSWClassLoader.java?rev=1494168&r1=1494167&r2=1494168&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbSWClassLoader.java (original) +++ openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbSWClassLoader.java Tue Jun 18 15:14:16 2013 @@ -35,17 +35,24 @@ import java.net.URLClassLoader; import java.net.URLConnection; import java.net.URLStreamHandler; import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; import java.util.List; public class OwbSWClassLoader extends URLClassLoader implements Closeable { private final List openedStreams = new ArrayList(); private final String prefix; + private final boolean useOnlyArchiveResources; + private final Archive archive; - public OwbSWClassLoader(final ClassLoader parent, final Archive archive) + public OwbSWClassLoader(final ClassLoader parent, final Archive archive, final boolean useOnlyArchiveResources) { super(new URL[0], parent); + this.useOnlyArchiveResources = useOnlyArchiveResources; + this.archive = archive; + if (WebArchive.class.isInstance(archive)) { prefix = "/WEB-INF/classes"; @@ -56,58 +63,8 @@ public class OwbSWClassLoader extends UR } try - { - addURL(new URL(null, "archive:" + archive.getName() + "/", new URLStreamHandler() - { - @Override - protected URLConnection openConnection(final URL u) throws IOException - { - return new URLConnection(u) - { - @Override - public void connect() throws IOException - { - // no-op - } - - @Override - public InputStream getInputStream() throws IOException - { - final ArchivePath path = convertToArchivePath(u); - Node node = archive.get(prefix + path.get()); - if (node == null && !prefix.isEmpty()) - { // WEB-INF/lib/x.jar!* - node = archive.get(path); - } - - // SHRINKWRAP-308 - if (node == null) - { - throw new FileNotFoundException("Requested path: " + path + " does not exist in " + archive.toString()); - } - - final Asset asset = node.getAsset(); - if (asset == null) - { - return null; - } - - final InputStream input = asset.openStream(); - synchronized (this) - { - openedStreams.add(input); - } - return input; - - } - - private ArchivePath convertToArchivePath(final URL url) - { - return ArchivePaths.create(url.getPath().replace(archive.getName(), "")); - } - }; - } - })); + { // add it to find classes if used this way + addURL(new URL(null, "archive:" + archive.getName() + "/", new ArchiveStreamHandler())); } catch (final MalformedURLException e) { @@ -115,6 +72,73 @@ public class OwbSWClassLoader extends UR } } + @Override + public URL findResource(final String name) + { + final Node node = findNode(name); + if (node != null) + { + try + { + return new URL(null, "archive:" + archive.getName() + "/" + name, new ArchiveStreamHandler()); + } + catch (final MalformedURLException e) + { + // no-op: let reuse parent method + } + } + if (useOnlyArchiveResources) + { + return null; + } + return super.findResource(name); + } + + @Override + public Enumeration findResources(final String name) throws IOException + { + final Node node = findNode(name); + if (node != null) + { + return Collections.enumeration(Collections.singleton(new URL(null, "archive:" + archive.getName() + "/" + name, new ArchiveStreamHandler()))); + } + if (useOnlyArchiveResources) + { + return Collections.emptyEnumeration(); + } + + return super.findResources(name); + } + + private Node findNode(final String name) + { + ArchivePath path = ArchivePaths.create(path(prefix, name)); + Node node = archive.get(path); + if (node == null) + { + path = ArchivePaths.create(name); + node = archive.get(path); + + + } + return node; + } + + private String path(final String... parts) + { + final StringBuilder builder = new StringBuilder(parts[0]); + for (int i = 1; i < parts.length; i++) + { + if (!parts[i - 1].endsWith("/") && !parts[i].startsWith("/")) + { + builder.append("/"); + } + builder.append(parts[i]); + } + return builder.toString(); + } + + public void close() throws IOException { synchronized (this) @@ -133,4 +157,56 @@ public class OwbSWClassLoader extends UR openedStreams.clear(); } } + + protected class ArchiveStreamHandler extends URLStreamHandler + { + @Override + protected URLConnection openConnection(final URL u) throws IOException + { + return new URLConnection(u) + { + @Override + public void connect() throws IOException + { + // no-op + } + + @Override + public InputStream getInputStream() throws IOException + { + final ArchivePath path = convertToArchivePath(u); + Node node = archive.get(prefix + path.get()); + if (node == null && !prefix.isEmpty()) + { // WEB-INF/lib/x.jar!* + node = archive.get(path); + } + + // SHRINKWRAP-308 + if (node == null) + { + throw new FileNotFoundException("Requested path: " + path + " does not exist in " + archive.toString()); + } + + final Asset asset = node.getAsset(); + if (asset == null) + { + return null; + } + + final InputStream input = asset.openStream(); + synchronized (this) + { + openedStreams.add(input); + } + return input; + + } + + private ArchivePath convertToArchivePath(final URL url) + { + return ArchivePaths.create(url.getPath().replace(archive.getName(), "")); + } + }; + } + } } Modified: openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneConfiguration.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneConfiguration.java?rev=1494168&r1=1494167&r2=1494168&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneConfiguration.java (original) +++ openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneConfiguration.java Tue Jun 18 15:14:16 2013 @@ -26,9 +26,25 @@ import org.jboss.arquillian.container.sp */ public class OwbStandaloneConfiguration implements ContainerConfiguration { + /** + * used to skip classpath resources which are not in the archive, + * can be useful when a resource should appear a single time in an app + */ + private boolean useOnlyArchiveResources = false; + @Override public void validate() throws ConfigurationException { // not needed right now } + + public boolean isUseOnlyArchiveResources() + { + return useOnlyArchiveResources; + } + + public void setUseOnlyArchiveResources(final boolean useOnlyArchiveResources) + { + this.useOnlyArchiveResources = useOnlyArchiveResources; + } } Modified: openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneContainer.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneContainer.java?rev=1494168&r1=1494167&r2=1494168&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneContainer.java (original) +++ openwebbeans/trunk/webbeans-arquillian/owb-arquillian-standalone/src/main/java/org/apache/webbeans/arquillian/standalone/OwbStandaloneContainer.java Tue Jun 18 15:14:16 2013 @@ -56,6 +56,7 @@ public class OwbStandaloneContainer impl private WebBeansContext webBeansContext; private final ThreadLocal originalLoader = new ThreadLocal(); + private boolean useOnlyArchiveResources; @Override public Class getConfigurationClass() @@ -77,6 +78,8 @@ public class OwbStandaloneContainer impl singletonService = new OwbArquillianSingletonService(); WebBeansFinder.setSingletonService(singletonService); + useOnlyArchiveResources = owbStandaloneConfiguration.isUseOnlyArchiveResources(); + } @Override @@ -113,7 +116,7 @@ public class OwbStandaloneContainer impl final ClassLoader parentLoader = Thread.currentThread().getContextClassLoader(); originalLoader.set(parentLoader); - Thread.currentThread().setContextClassLoader(new OwbSWClassLoader(parentLoader, archive)); + Thread.currentThread().setContextClassLoader(new OwbSWClassLoader(parentLoader, archive, useOnlyArchiveResources)); return new ProtocolMetaData(); }