From 22f427ee259f053ea911ef1a84cbcbe0fa12cddf Mon Sep 17 00:00:00 2001
From: tmortagne <thomas.mortagne@gmail.com>
Date: Fri, 9 Sep 2011 15:28:22 +0200
Subject: [PATCH] XWIKI-6765: Upgrade to reflections 0.9.5 Try to work around
 reflections bug

---
 .../internal/DefaultCoreExtensionScanner.java | 44 ++++++-------------
 1 file changed, 13 insertions(+), 31 deletions(-)

diff --git a/xwiki-platform-core/xwiki-platform-extension/xwiki-platform-extension-api/src/main/java/org/xwiki/extension/repository/internal/DefaultCoreExtensionScanner.java b/xwiki-platform-core/xwiki-platform-extension/xwiki-platform-extension-api/src/main/java/org/xwiki/extension/repository/internal/DefaultCoreExtensionScanner.java
index a30f291a981..a77b43f9e02 100644
--- a/xwiki-platform-core/xwiki-platform-extension/xwiki-platform-extension-api/src/main/java/org/xwiki/extension/repository/internal/DefaultCoreExtensionScanner.java
+++ b/xwiki-platform-core/xwiki-platform-extension/xwiki-platform-extension-api/src/main/java/org/xwiki/extension/repository/internal/DefaultCoreExtensionScanner.java
@@ -21,8 +21,8 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -73,30 +73,17 @@ public class DefaultCoreExtensionScanner
      */
     private static final String SNAPSHOTSUFFIX = "-SNAPSHOT";
 
-    /**
-     * JBoss vfszip protocol.
-     */
-    private static final String PROTOCOL_VFSZIP = "vfszip:";
-
-    /**
-     * JBoss vfsfile protocol.
-     */
-    private static final String PROTOCOL_VFSFILE = "vfsfile:";
-
-    /**
-     * file protocol.
-     */
-    private static final String PROTOCOL_FILE = "file:";
-
     /**
      * Scan classpath to find core extensions.
      * 
+     * @param repository the repository where to store found extensions
      * @return scan jar files in classpath to find core extensions
      */
     public Map<String, DefaultCoreExtension> loadExtensions(DefaultCoreExtensionRepository repository)
     {
         Set<URL> baseURLs = ClasspathHelper.forPackage(MAVENPACKAGE);
 
+        // FIXME: remove that as soon as possible
         baseURLs = filterURLs(baseURLs);
 
         ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
@@ -251,32 +238,27 @@ public Map<String, DefaultCoreExtension> loadExtensions(DefaultCoreExtensionRepo
     }
 
     /**
-     * JBoss returns URLs with the vfszip and vfsfile protocol for resources, and the org.reflections library doesn't
-     * recognize them. This is more a bug inside the reflections library, but we can write a small workaround for a
-     * quick fix on our side.
+     * Very nasty hack which unescape invalid characters from the {@link URL} path because
+     * {@link Reflections#Reflections(org.reflections.Configuration)} does not do it...
      * 
      * @param urls base URLs to modify
      * @return modified base URLs
      */
-    // TODO: remove when http://code.google.com/p/reflections/issues/detail?id=76 is fixed
+    // TODO: remove when http://code.google.com/p/reflections/issues/detail?id=87 is fixed
     private Set<URL> filterURLs(Set<URL> urls)
     {
         Set<URL> results = new HashSet<URL>(urls.size());
         for (URL url : urls) {
-            String cleanURL = url.toString();
-            // Fix JBoss URLs
-            if (url.getProtocol().startsWith(PROTOCOL_VFSZIP)) {
-                cleanURL = cleanURL.replaceFirst(PROTOCOL_VFSZIP, PROTOCOL_FILE);
-            } else if (url.getProtocol().startsWith(PROTOCOL_VFSFILE)) {
-                cleanURL = cleanURL.replaceFirst(PROTOCOL_VFSFILE, PROTOCOL_FILE);
-            }
-            cleanURL = cleanURL.replaceFirst("\\.jar/", ".jar!/");
             try {
-                results.add(new URL(cleanURL));
-            } catch (MalformedURLException ex) {
-                // Shouldn't happen, but we can't do more to fix this URL.
+                results.add(new URL(url.getProtocol(), url.getHost(), url.getPort(), URLDecoder.decode(url.getFile(),
+                    "UTF-8")));
+            } catch (Exception e) {
+                LOGGER.error("Failed to convert url [" + url + "]", e);
+
+                results.add(url);
             }
         }
+
         return results;
     }
 
-- 
GitLab