You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2013/06/18 17:14:16 UTC

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

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<InputStream> openedStreams = new ArrayList<InputStream>();
     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<URL> 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<ClassLoader> originalLoader = new ThreadLocal<ClassLoader>();
+    private boolean useOnlyArchiveResources;
 
     @Override
     public Class<OwbStandaloneConfiguration> 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();
     }