Author: iocanel
Date: Wed Sep 12 07:04:04 2012
New Revision: 1383807

URL: http://svn.apache.org/viewvc?rev=1383807&view=rev
Log:
[KARAF-1245] Feature service will now wait for url handlers only when requested.

Modified:
    
karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
    
karaf/trunk/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml

Modified: 
karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java?rev=1383807&r1=1383806&r2=1383807&view=diff
==============================================================================
--- 
karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
 (original)
+++ 
karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
 Wed Sep 12 07:04:04 2012
@@ -74,6 +74,7 @@ import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
 import org.osgi.framework.FrameworkEvent;
 import org.osgi.framework.FrameworkListener;
 import org.osgi.framework.FrameworkUtil;
@@ -83,6 +84,7 @@ import org.osgi.framework.startlevel.Bun
 import org.osgi.framework.wiring.FrameworkWiring;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.url.URLStreamHandlerService;
 import org.osgi.util.tracker.ServiceTracker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -844,7 +846,10 @@ public class FeaturesServiceImpl impleme
         String bundleLocation = bundleInfo.getLocation();
         LOGGER.debug("Checking " + bundleLocation);
         try {
-            is = new BufferedInputStream(new URL(bundleLocation).openStream());
+            String protocol = bundleLocation.substring(0, 
bundleLocation.indexOf(":"));
+            waitForUrlHandler(protocol);
+            URL bundleUrl = new URL(bundleLocation);
+            is = new BufferedInputStream(bundleUrl.openStream());
         } catch (RuntimeException e) {
             LOGGER.error(e.getMessage());
             throw e;
@@ -1473,4 +1478,25 @@ public class FeaturesServiceImpl impleme
         }
         return buffer.toString();
     }
+
+    /**
+     * Will wait for the {@link URLStreamHandlerService} service for the 
specified protocol to be registered.
+     * @param protocol
+     */
+    private void waitForUrlHandler(String protocol) {
+        try {
+            Filter filter = bundleContext.createFilter("(&(" + 
Constants.OBJECTCLASS + "=" + URLStreamHandlerService.class.getName() + 
")(url.handler.protocol=" + protocol + "))");
+            ServiceTracker urlHandlerTracker = new 
ServiceTracker(bundleContext, filter, null);
+            try {
+                urlHandlerTracker.open();
+                urlHandlerTracker.waitForService(30000);
+            } catch (InterruptedException e) {
+                LOGGER.debug("Interrupted while waiting for URL handler for 
protocol {}.", protocol);
+            } finally {
+                urlHandlerTracker.close();
+            }
+        } catch (InvalidSyntaxException ex) {
+            LOGGER.error("Error creating filter for service tracker.", ex);
+        }
+    }
 }

Modified: 
karaf/trunk/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
URL: 
http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml?rev=1383807&r1=1383806&r2=1383807&view=diff
==============================================================================
--- 
karaf/trunk/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml 
(original)
+++ 
karaf/trunk/features/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml 
Wed Sep 12 07:04:04 2012
@@ -48,17 +48,15 @@
     <reference id="configAdmin" 
interface="org.osgi.service.cm.ConfigurationAdmin" />
 
     <reference id="mvnUrlHandler" 
interface="org.osgi.service.url.URLStreamHandlerService" 
filter="(url.handler.protocol=mvn)" />
-    <reference id="blueprintUrlHandler" 
interface="org.osgi.service.url.URLStreamHandlerService" 
filter="(url.handler.protocol=blueprint)" />
-    <reference id="springUrlHandler" 
interface="org.osgi.service.url.URLStreamHandlerService" 
filter="(url.handler.protocol=spring)" />
 
     <service ref="featuresService" 
interface="org.apache.karaf.features.FeaturesService" />
 
-    <reference id="regionsPersistence" availability="optional" 
interface="org.apache.karaf.region.persist.RegionsPersistence" >
+    <reference id="regionsPersistence" availability="optional" 
interface="org.apache.karaf.region.persist.RegionsPersistence">
         <reference-listener ref="featuresService"
                             bind-method="registerRegionsPersistence"
                             unbind-method="unregisterRegionsPersistence" />
     </reference>
-    
+
     <bean id="featuresServiceMBean" 
class="org.apache.karaf.features.management.internal.FeaturesService">
         <property name="bundleContext" ref="blueprintBundleContext" />
         <property name="featuresService" ref="featuresService" />


Reply via email to