This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 0210711  OWB-1391 avoid to drop classpath entries during scanning time 
if not relevant
0210711 is described below

commit 02107113d5e8b8c9127cb63c56f46b7cb048aab7
Author: Romain Manni-Bucau <rmannibu...@gmail.com>
AuthorDate: Wed Sep 29 09:03:42 2021 +0200

    OWB-1391 avoid to drop classpath entries during scanning time if not 
relevant
---
 .../corespi/scanner/AbstractMetaDataDiscovery.java | 55 +++++++++++++++++-----
 1 file changed, 43 insertions(+), 12 deletions(-)

diff --git 
a/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
 
b/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
index d09e2b3..002e81e 100644
--- 
a/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
+++ 
b/webbeans-impl/src/main/java/org/apache/webbeans/corespi/scanner/AbstractMetaDataDiscovery.java
@@ -19,6 +19,7 @@
 package org.apache.webbeans.corespi.scanner;
 
 
+import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toMap;
 
 import org.apache.webbeans.config.OWBLogConst;
@@ -201,7 +202,8 @@ public abstract class AbstractMetaDataDiscovery implements 
BdaScannerService
 
         try
         {
-            Set<URL> classPathUrls = ClassLoaders.findUrls(loader);
+            final Set<URL> classPathUrls = ClassLoaders.findUrls(loader);
+            final Map<File, URL> classpathFiles = toFiles(classPathUrls);
 
             // first step: get all META-INF/beans.xml marker files
             Enumeration<URL> beansXmlUrls = 
loader.getResources(META_INF_BEANS_XML);
@@ -210,19 +212,30 @@ public abstract class AbstractMetaDataDiscovery 
implements BdaScannerService
                 URL beansXmlUrl = beansXmlUrls.nextElement();
                 addWebBeansXmlLocation(beansXmlUrl);
 
-                // second step: remove the corresponding classpath entry if we 
found an explicit beans.xml
-                String beansXml = beansXmlUrl.toExternalForm();
-                beansXml = stripProtocol(beansXml);
+                if (classpathFiles == null) // handle protocols out if 
[jar,file] set
+                {
+                    // second step: remove the corresponding classpath entry 
if we found an explicit beans.xml
+                    String beansXml = beansXmlUrl.toExternalForm();
+                    beansXml = stripProtocol(beansXml);
 
-                Iterator<URL> cpIt = classPathUrls.iterator(); // do not use 
Set<URL> remove as this would trigger hashCode -> DNS
-                while (cpIt.hasNext())
+                    Iterator<URL> cpIt = classPathUrls.iterator(); // do not 
use Set<URL> remove as this would trigger hashCode -> DNS
+                    while (cpIt.hasNext())
+                    {
+                        URL cpUrl = cpIt.next();
+                        if 
(beansXml.startsWith(stripProtocol(cpUrl.toExternalForm())))
+                        {
+                            cpIt.remove();
+                            addDeploymentUrl(beansXml, cpUrl);
+                            break;
+                        }
+                    }
+                }
+                else
                 {
-                    URL cpUrl = cpIt.next();
-                    if 
(beansXml.startsWith(stripProtocol(cpUrl.toExternalForm())))
+                    final URL url = 
classpathFiles.remove(Files.toFile(beansXmlUrl));
+                    if (url != null)
                     {
-                        cpIt.remove();
-                        addDeploymentUrl(beansXml, cpUrl);
-                        break;
+                        addDeploymentUrl(beansXmlUrl.toExternalForm(), url);
                     }
                 }
             }
@@ -234,7 +247,7 @@ public abstract class AbstractMetaDataDiscovery implements 
BdaScannerService
                 filterExcludedJars(classPathUrls);
 
                 // forth step: add all 'implicit bean archives'
-                for (URL url : classPathUrls)
+                for (URL url : (classpathFiles == null ? classPathUrls : 
classpathFiles.values()))
                 {
                     if (isBdaUrlEnabled(url))
                     {
@@ -250,6 +263,24 @@ public abstract class AbstractMetaDataDiscovery implements 
BdaScannerService
         }
     }
 
+    protected Map<File, URL> toFiles(final Set<URL> classPathUrls)
+    {
+        try
+        {
+            final Map<File, URL> collected = classPathUrls.stream()
+                    .collect(toMap(Files::toFile, identity(), (a, b) -> a));
+            if (collected.containsKey(null)) // not a known protocol
+            {
+                return null;
+            }
+            return collected;
+        }
+        catch (final RuntimeException re)
+        {
+            return null;
+        }
+    }
+
     /**
      * Get rid of any protocol header from the url externalForm
      * @param urlPath

Reply via email to