[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) {

Reply via email to