[KARAF-2251] - Cellar: features:install ignores incoming and outgoing blacklist
git-svn-id: https://svn.apache.org/repos/asf/karaf/cellar/branches/cellar-2.2.x@1461350 13f79535-47bb-0310-9956-ffa450edef68 Project: http://git-wip-us.apache.org/repos/asf/karaf-cellar/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf-cellar/commit/cf243811 Tree: http://git-wip-us.apache.org/repos/asf/karaf-cellar/tree/cf243811 Diff: http://git-wip-us.apache.org/repos/asf/karaf-cellar/diff/cf243811 Branch: refs/heads/cellar-2.2.x Commit: cf243811e381a275188c058ec44b3926a9b9afa9 Parents: f99c8c8 Author: anierbeck <anierbeck@13f79535-47bb-0310-9956-ffa450edef68> Authored: Tue Mar 26 22:27:06 2013 +0000 Committer: anierbeck <anierbeck@13f79535-47bb-0310-9956-ffa450edef68> Committed: Tue Mar 26 22:27:06 2013 +0000 ---------------------------------------------------------------------- .../karaf/cellar/bundle/BundleEventHandler.java | 40 ++------------------ .../karaf/cellar/bundle/BundleSupport.java | 36 ++++++++++++++++++ .../cellar/bundle/LocalBundleListener.java | 14 ++++++- .../resources/OSGI-INF/blueprint/blueprint.xml | 2 + .../cellar/core/event/EventDispatchTask.java | 8 ++-- 5 files changed, 59 insertions(+), 41 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/cf243811/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java ---------------------------------------------------------------------- diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java index d9ccac3..c12eefe 100644 --- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java +++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java @@ -13,7 +13,6 @@ */ package org.apache.karaf.cellar.bundle; -import java.util.ArrayList; import java.util.List; import org.apache.karaf.cellar.core.Configurations; @@ -22,7 +21,6 @@ import org.apache.karaf.cellar.core.control.Switch; import org.apache.karaf.cellar.core.control.SwitchStatus; import org.apache.karaf.cellar.core.event.EventHandler; import org.apache.karaf.cellar.core.event.EventType; -import org.apache.karaf.features.BundleInfo; import org.apache.karaf.features.Feature; import org.apache.karaf.features.FeaturesService; import org.osgi.framework.BundleEvent; @@ -33,14 +31,12 @@ import org.slf4j.LoggerFactory; public class BundleEventHandler extends BundleSupport implements EventHandler<RemoteBundleEvent> { - private static final Logger LOGGER = LoggerFactory.getLogger(BundleEventHandler.class); + static final Logger LOGGER = LoggerFactory.getLogger(BundleEventHandler.class); public static final String SWITCH_ID = "org.apache.karaf.cellar.bundle.handler"; private final Switch eventSwitch = new BasicSwitch(SWITCH_ID); - private FeaturesService featureService; - /** * Handles remote bundle events. * @@ -63,10 +59,11 @@ public class BundleEventHandler extends BundleSupport implements EventHandler<Re //Check if the pid is marked as local. if (isAllowed(event.getSourceGroup(), Constants.CATEGORY, event.getLocation(), EventType.INBOUND)) { //check the features first - List<Feature> matchingFeatures = retrieveFeature(event); + List<Feature> matchingFeatures = retrieveFeature(event.getLocation()); for (Feature feature : matchingFeatures) { if (!isAllowed(event.getSourceGroup(), "features", feature.getName(), EventType.INBOUND)) { LOGGER.warn("CELLAR BUNDLE: bundle {} is contained in a feature marked as BLOCKED INBOUND", event.getLocation()); + return; } } if (event.getType() == BundleEvent.INSTALLED) { @@ -93,22 +90,7 @@ public class BundleEventHandler extends BundleSupport implements EventHandler<Re } } - private List<Feature> retrieveFeature(RemoteBundleEvent event) throws Exception { - Feature[] features = featureService.listFeatures(); - List<Feature> matchingFeatures = new ArrayList<Feature>(); - for (Feature feature : features) { - List<BundleInfo> bundles = feature.getBundles(); - for (BundleInfo bundleInfo : bundles) { - String location = bundleInfo.getLocation(); - if (location.equalsIgnoreCase(event.getLocation())) { - matchingFeatures.add(feature); - } - } - } - return matchingFeatures; - } - - /** + /** * Initialization Method. */ public void init() { @@ -144,18 +126,4 @@ public class BundleEventHandler extends BundleSupport implements EventHandler<Re return RemoteBundleEvent.class; } - /** - * @return the featureService - */ - public FeaturesService getFeatureService() { - return featureService; - } - - /** - * @param featureService the featureService to set - */ - public void setFeatureService(FeaturesService featureService) { - this.featureService = featureService; - } - } http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/cf243811/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java ---------------------------------------------------------------------- diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java index c9c9e58..7501323 100644 --- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java +++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java @@ -14,18 +14,24 @@ package org.apache.karaf.cellar.bundle; import org.apache.karaf.cellar.core.CellarSupport; +import org.apache.karaf.features.BundleInfo; +import org.apache.karaf.features.Feature; +import org.apache.karaf.features.FeaturesService; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.service.cm.ConfigurationAdmin; +import java.util.ArrayList; import java.util.Dictionary; import java.util.Enumeration; +import java.util.List; import java.util.Properties; public class BundleSupport extends CellarSupport { protected BundleContext bundleContext; + private FeaturesService featuresService; /** * Reads a {@code Dictionary} object and creates a property object out of it. @@ -153,4 +159,34 @@ public class BundleSupport extends CellarSupport { this.configurationAdmin = configurationAdmin; } + protected List<Feature> retrieveFeature(String bundleLocation) throws Exception { + Feature[] features = featuresService.listFeatures(); + List<Feature> matchingFeatures = new ArrayList<Feature>(); + for (Feature feature : features) { + List<BundleInfo> bundles = feature.getBundles(); + for (BundleInfo bundleInfo : bundles) { + String location = bundleInfo.getLocation(); + if (location.equalsIgnoreCase(bundleLocation)) { + matchingFeatures.add(feature); + LOGGER.debug("CELLAR BUNDLE: found a feature {} containing bundle: {}", feature.getName(), bundleLocation); + } + } + } + return matchingFeatures; + } + + /** + * @return the featuresService + */ + public FeaturesService getFeaturesService() { + return featuresService; + } + + /** + * @param featuresService the featuresService to set + */ + public void setFeaturesService(FeaturesService featureService) { + this.featuresService = featureService; + } + } http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/cf243811/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java ---------------------------------------------------------------------- diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java index c9d0fed..e6c702d 100644 --- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java +++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java @@ -19,6 +19,7 @@ import org.apache.karaf.cellar.core.Node; import org.apache.karaf.cellar.core.control.SwitchStatus; import org.apache.karaf.cellar.core.event.EventProducer; import org.apache.karaf.cellar.core.event.EventType; +import org.apache.karaf.features.Feature; import org.osgi.framework.BundleEvent; import org.osgi.framework.BundleListener; import org.osgi.framework.SynchronousBundleListener; @@ -92,11 +93,22 @@ public class LocalBundleListener extends BundleSupport implements SynchronousBun bundles.put(symbolicName + "/" + version, state); } + // check the features first + List<Feature> matchingFeatures = retrieveFeature(bundleLocation); + for (Feature feature : matchingFeatures) { + if (!isAllowed(group, "features", feature.getName(), EventType.OUTBOUND)) { + LOGGER.warn("CELLAR BUNDLE: bundle {} is contained in a feature marked as BLOCKED OUTBOUND", bundleLocation); + return; + } + } + // broadcast the cluster event RemoteBundleEvent remoteBundleEvent = new RemoteBundleEvent(symbolicName, version, bundleLocation, type); remoteBundleEvent.setSourceGroup(group); eventProducer.produce(remoteBundleEvent); - } finally { + } catch (Exception e) { + LOGGER.error("CELLAR BUNDLE: failed to create bundle event", e); + } finally { Thread.currentThread().setContextClassLoader(originalClassLoader); } http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/cf243811/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml ---------------------------------------------------------------------- diff --git a/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml index b0b10fe..a309212 100644 --- a/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -22,6 +22,7 @@ <property name="configurationAdmin" ref="configurationAdmin"/> <property name="bundleContext" ref="blueprintBundleContext"/> <property name="eventProducer" ref="eventProducer"/> + <property name="featuresService" ref="featuresService"/> </bean> <!-- Bundle Synchronizer --> @@ -32,6 +33,7 @@ <property name="clusterManager" ref="clusterManager"/> <property name="eventProducer" ref="eventProducer"/> <property name="bundleContext" ref="blueprintBundleContext"/> + <property name="featuresService" ref="featuresService"/> </bean> <service ref="synchronizer" interface="org.apache.karaf.cellar.core.Synchronizer"/> http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/cf243811/core/src/main/java/org/apache/karaf/cellar/core/event/EventDispatchTask.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/karaf/cellar/core/event/EventDispatchTask.java b/core/src/main/java/org/apache/karaf/cellar/core/event/EventDispatchTask.java index a8fef15..f14a261 100644 --- a/core/src/main/java/org/apache/karaf/cellar/core/event/EventDispatchTask.java +++ b/core/src/main/java/org/apache/karaf/cellar/core/event/EventDispatchTask.java @@ -69,13 +69,13 @@ public class EventDispatchTask<E extends Event> implements Runnable { public void run() { try { - boolean dispathced = false; + boolean dispatched = false; - for (long delay = 0; delay < timeout && !dispathced; delay += interval) { + for (long delay = 0; delay < timeout && !dispatched; delay += interval) { EventHandler handler = handlerRegistry.getHandler(event); if (handler != null) { handler.handle(event); - dispathced = true; + dispatched = true; } else { try { Thread.sleep(interval); @@ -84,7 +84,7 @@ public class EventDispatchTask<E extends Event> implements Runnable { } } } - if (!dispathced) { + if (!dispatched) { LOGGER.warn("Failed to retrieve handler for event {}", event.getClass()); } }catch(Exception ex) {
