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" />