Fix a StackOverflowError in URLHandlers.createStreamHandler() when creating URL on jamvm and Mika. This patch resolves an unfortunate interaction between our ExtensionManager and the URLHandlers by making the URLHandlers aware of the extension protocol. Pretty much like we do already for the bundle protocol. (FELIX-435)

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@604054 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
index aafa1d7..78186bc 100644
--- a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
+++ b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
@@ -84,7 +84,7 @@
     // The private instance that is added to Felix.class.getClassLoader() -
     // will be null if extension bundles are not supported (i.e., we are not 
     // loaded by an instance of URLClassLoader)
-    private static final ExtensionManager m_extensionManager;
+    static final ExtensionManager m_extensionManager;
     
     static
     {
diff --git a/framework/src/main/java/org/apache/felix/framework/URLHandlers.java b/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
index 9172393..8d69279 100644
--- a/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
+++ b/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
@@ -134,6 +134,22 @@
                 return handler;
             }
 
+            // If this is the framework's "felix:" extension protocol, then
+            // return the ExtensionManager.m_extensionManager handler for 
+            // that immediately - this is a workaround for certain jvms that
+            // do a toString() on the extension url we add to the global
+            // URLClassloader.
+            if (protocol.equals("felix"))
+            {
+                handler = ExtensionManager.m_extensionManager;
+                if (m_streamHandlerCache == null)
+                {
+                    m_streamHandlerCache = new HashMap();
+                }
+                m_streamHandlerCache.put(protocol, handler);
+                return handler;
+            }
+
             // If there is not cached handler, then search for built-in
             // handler or create a new handler proxy.
             if (handler == null)