SLING-6832 osgi-mock: Support parsing SCR metadata when multiple definition XML files exists with the same name

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1793994 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
index a41be7c..a4c5a4b 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
@@ -20,7 +20,9 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URL;
 import java.util.ArrayList;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -173,26 +175,35 @@
     }
     
     private static void parseMetadataDocuments(Map<String,Document> cacheMap, String resourcePath, XPathExpression xpathExpression) {
-        try (InputStream fileStream = OsgiMetadataUtil.class.getClassLoader().getResourceAsStream(resourcePath)) {
-            if (fileStream != null) {
-                Document metadata = toXmlDocument(fileStream, resourcePath);
-                NodeList nodes = (NodeList)xpathExpression.evaluate(metadata, XPathConstants.NODESET);
-                if (nodes != null) {
-                    for (int i = 0; i < nodes.getLength(); i++) {
-                        Node node = nodes.item(i);
-                        String implementationClass = getImplementationClassName(node);
-                        if (implementationClass != null) {
-                            cacheMap.put(implementationClass, metadata);
-                        }
-                    }
-                }                            
+        try {
+            Enumeration<URL> resourceUrls = OsgiMetadataUtil.class.getClassLoader().getResources(resourcePath);
+            while (resourceUrls.hasMoreElements()) {
+                URL resourceUrl = resourceUrls.nextElement();
+                try (InputStream fileStream = resourceUrl.openStream()) {
+                    parseMetadataDocument(cacheMap, resourcePath, fileStream, xpathExpression);
+                }
             }
         }
-        catch (Throwable ex) {
+        catch (Exception ex) {
             log.warn("Error reading SCR metadata XML document from " + resourcePath, ex);
         }
     }
     
+    private static void parseMetadataDocument(Map<String,Document> cacheMap, String resourcePath,
+            InputStream fileStream, XPathExpression xpathExpression) throws XPathExpressionException {
+        Document metadata = toXmlDocument(fileStream, resourcePath);
+        NodeList nodes = (NodeList)xpathExpression.evaluate(metadata, XPathConstants.NODESET);
+        if (nodes != null) {
+            for (int i = 0; i < nodes.getLength(); i++) {
+                Node node = nodes.item(i);
+                String implementationClass = getImplementationClassName(node);
+                if (implementationClass != null) {
+                    cacheMap.put(implementationClass, metadata);
+                }
+            }
+        }                            
+    }
+
     private static String getImplementationClassName(Node componentNode) {
         NodeList childNodes = componentNode.getChildNodes();
         for (int j = 0; j < childNodes.getLength(); j++) {