You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2012/04/30 09:48:39 UTC

svn commit: r1332088 - in /karaf/cellar/branches/cellar-2.2.x: bundle/src/main/java/org/apache/karaf/cellar/bundle/ bundle/src/main/resources/OSGI-INF/blueprint/ core/src/main/java/org/apache/karaf/cellar/core/ hazelcast/src/main/java/org/apache/karaf/...

Author: jbonofre
Date: Mon Apr 30 07:48:39 2012
New Revision: 1332088

URL: http://svn.apache.org/viewvc?rev=1332088&view=rev
Log:
[KARAF-1426] Refactore bundle module to use event producer and check status in the handler, synchronizer and listener

Modified:
    karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
    karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
    karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
    karaf/cellar/branches/cellar-2.2.x/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml
    karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java
    karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java

Modified: karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java?rev=1332088&r1=1332087&r2=1332088&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java Mon Apr 30 07:48:39 2012
@@ -37,10 +37,18 @@ public class BundleEventHandler extends 
      * @param event
      */
     public void handle(RemoteBundleEvent event) {
+        // check if the handler switch is ON
         if (eventSwitch.getStatus().equals(SwitchStatus.OFF)) {
             LOGGER.warn("CELLAR BUNDLE: {} switch is OFF, cluster event is not handled", SWITCH_ID);
             return;
         }
+
+        // check if the node is local
+        if (!groupManager.isLocalGroup(event.getSourceGroup().getName())) {
+            LOGGER.warn("CELLAR BUNDLE: node is not part of the cluster event cluster group");
+            return;
+        }
+
         try {
             //Check if the pid is marked as local.
             if (isAllowed(event.getSourceGroup(), Constants.CATEGORY, event.getLocation(), EventType.INBOUND)) {

Modified: karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java?rev=1332088&r1=1332087&r2=1332088&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java Mon Apr 30 07:48:39 2012
@@ -16,6 +16,7 @@ package org.apache.karaf.cellar.bundle;
 import org.apache.karaf.cellar.core.Configurations;
 import org.apache.karaf.cellar.core.Group;
 import org.apache.karaf.cellar.core.Synchronizer;
+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.osgi.framework.Bundle;
@@ -37,7 +38,7 @@ public class BundleSynchronizer extends 
 
     private static final transient Logger LOGGER = LoggerFactory.getLogger(BundleSynchronizer.class);
 
-    private List<EventProducer> producerList;
+    private EventProducer eventProducer;
 
     /**
      * Registration method
@@ -62,14 +63,14 @@ public class BundleSynchronizer extends 
     }
 
     /**
-     * Reads the configuration from the remote map.
+     * Get the bundle to install from the distributed map
      */
     public void pull(Group group) {
         if (group != null) {
             String groupName = group.getName();
-            Map<String, BundleState> bundleTable = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName);
+            Map<String, BundleState> bundleDistributedMap = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName);
 
-            for (Map.Entry<String,BundleState> entry : bundleTable.entrySet()) {
+            for (Map.Entry<String,BundleState> entry : bundleDistributedMap.entrySet()) {
                 String id = entry.getKey();
                 BundleState state = entry.getValue();
 
@@ -99,10 +100,16 @@ public class BundleSynchronizer extends 
     }
 
     /**
-     * Publishes local configuration to the cluster.
+     * Publishes local bundle to the cluster.
      */
     public void push(Group group) {
 
+        // check if the producer is ON
+        if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) {
+            LOGGER.warn("CELLAR BUNDLE: cluster event producer is OFF for this node");
+            return;
+        }
+
         if (group != null) {
             String groupName = group.getName();
             Map<String, BundleState> bundleTable = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName);
@@ -126,19 +133,15 @@ public class BundleSynchronizer extends 
 
                     BundleState existingState = bundleTable.get(id);
                     RemoteBundleEvent event = null;
+
                     if (existingState == null) {
+                        // update the distributed map
                         event = new RemoteBundleEvent(symbolicName, version, bundleLocation, status);
-                        // update the cluster map
                         bundleTable.put(id, bundleState);
                     }
 
                     // broadcast the event
-                    // TODO use the local producer and check its status
-                    if (producerList != null && !producerList.isEmpty() && event != null) {
-                        for (EventProducer producer : producerList) {
-                            producer.produce(event);
-                        }
-                    }
+                    eventProducer.produce(event);
                 } else LOGGER.warn("CELLAR BUNDLE: bundle {} is marked as BLOCKED OUTBOUND", bundleLocation);
             }
         }
@@ -162,12 +165,12 @@ public class BundleSynchronizer extends 
         return result;
     }
 
-    public List<EventProducer> getProducerList() {
-        return producerList;
+    public EventProducer getEventProducer() {
+        return eventProducer;
     }
 
-    public void setProducerList(List<EventProducer> producerList) {
-        this.producerList = producerList;
+    public void setEventProducer(EventProducer eventProducer) {
+        this.eventProducer = eventProducer;
     }
 
 }

Modified: karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java?rev=1332088&r1=1332087&r2=1332088&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java Mon Apr 30 07:48:39 2012
@@ -16,6 +16,7 @@ package org.apache.karaf.cellar.bundle;
 import org.apache.karaf.cellar.core.Configurations;
 import org.apache.karaf.cellar.core.Group;
 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.osgi.framework.BundleEvent;
@@ -31,9 +32,7 @@ public class LocalBundleListener extends
 
     private static final transient Logger LOGGER = LoggerFactory.getLogger(LocalBundleListener.class);
 
-    private List<EventProducer> producerList;
-
-    private Node node;
+    private EventProducer eventProducer;
 
     /**
      * Process {@link BundleEvent}s.
@@ -41,50 +40,49 @@ public class LocalBundleListener extends
      * @param event
      */
     public void bundleChanged(BundleEvent event) {
-        try {
-            if (event != null && event.getBundle() != null) {
-                Set<Group> groups = null;
-                try {
-                    groups = groupManager.listLocalGroups();
-                } catch (Exception ex) {
-                    LOGGER.warn("Failed to list local groups. Is Cellar uninstalling ?");
-                }
 
-                if (groups != null && !groups.isEmpty()) {
-                    for (Group group : groups) {
+        // check if the producer is ON
+        if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) {
+            LOGGER.warn("CELLAR BUNDLE: node is not part of the cluster event cluster group");
+            return;
+        }
+
+        if (event != null && event.getBundle() != null) {
+
+            Set<Group> groups = null;
+            try {
+                groups = groupManager.listLocalGroups();
+            } catch (Exception ex) {
+                LOGGER.warn("CELLAR BUNDLE: failed to list local groups. Is Cellar uninstalling ?");
+            }
+
+            if (groups != null && !groups.isEmpty()) {
+                for (Group group : groups) {
+
+                    String symbolicName = event.getBundle().getSymbolicName();
+                    String version = event.getBundle().getVersion().toString();
+                    String bundleLocation = event.getBundle().getLocation();
+                    int type = event.getType();
+                    if (isAllowed(group, Constants.CATEGORY, bundleLocation, EventType.OUTBOUND)) {
+
+                        // update the cluster map
+                        Map<String, BundleState> bundles = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + group.getName());
+                        BundleState state = bundles.get(symbolicName + "/" + version);
+                        if (state == null) {
+                            state = new BundleState();
+                        }
+                        state.setStatus(event.getBundle().getState());
+                        state.setLocation(event.getBundle().getLocation());
+                        bundles.put(symbolicName + "/" + version, state);
+
+                        // broadcast the cluster event
+                        RemoteBundleEvent remoteBundleEvent = new RemoteBundleEvent(symbolicName, version, bundleLocation, type);
+                        remoteBundleEvent.setSourceGroup(group);
+                        eventProducer.produce(remoteBundleEvent);
 
-                        String symbolicName = event.getBundle().getSymbolicName();
-                        String version = event.getBundle().getVersion().toString();
-                        String bundleLocation = event.getBundle().getLocation();
-                        int type = event.getType();
-                        if (isAllowed(group, Constants.CATEGORY, bundleLocation, EventType.OUTBOUND)) {
-                            RemoteBundleEvent remoteBundleEvent = new RemoteBundleEvent(symbolicName, version, bundleLocation, type);
-                            remoteBundleEvent.setSourceGroup(group);
-                            remoteBundleEvent.setSourceNode(node);
-                            
-                            // update the cluster map
-                            Map<String, BundleState> bundles = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + group.getName());
-                            BundleState state = bundles.get(symbolicName + "/" + version);
-                            if (state == null) {
-                                state = new BundleState();
-                            }
-                            state.setStatus(event.getBundle().getState());
-                            state.setLocation(event.getBundle().getLocation());
-                            bundles.put(symbolicName + "/" + version, state);
-
-                            // broadcast the cluster event
-                            // TODO use the local producer and check its status
-                            if (producerList != null && !producerList.isEmpty()) {
-                                for (EventProducer producer : producerList) {
-                                    producer.produce(remoteBundleEvent);
-                                }
-                            }
-                        } else LOGGER.warn("CELLAR BUNDLE: bundle {} is marked as BLOCKED OUTBOUND", bundleLocation);
-                    }
+                    } else LOGGER.warn("CELLAR BUNDLE: bundle {} is marked as BLOCKED OUTBOUND", bundleLocation);
                 }
             }
-        } catch (Exception ex) {
-            LOGGER.error("CELLAR BUNDLE: failed to handle bundle event", ex);
         }
     }
 
@@ -92,9 +90,7 @@ public class LocalBundleListener extends
      * Initialization Method.
      */
     public void init() {
-        if (clusterManager != null) {
-            node = clusterManager.getNode();
-        }
+
     }
 
     /**
@@ -104,12 +100,12 @@ public class LocalBundleListener extends
 
     }
 
-    public List<EventProducer> getProducerList() {
-        return producerList;
+    public EventProducer getEventProducer() {
+        return eventProducer;
     }
 
-    public void setProducerList(List<EventProducer> producerList) {
-        this.producerList = producerList;
+    public void setEventProducer(EventProducer eventProducer) {
+        this.eventProducer = eventProducer;
     }
 
 }

Modified: karaf/cellar/branches/cellar-2.2.x/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml?rev=1332088&r1=1332087&r2=1332088&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml (original)
+++ karaf/cellar/branches/cellar-2.2.x/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml Mon Apr 30 07:48:39 2012
@@ -17,11 +17,11 @@
 
     <!-- Cluster Configuration Listener -->
     <bean id="bundleListener" class="org.apache.karaf.cellar.bundle.LocalBundleListener" init-method="init" destroy-method="destroy">
-        <property name="producerList" ref="groupEventProducers"/>
         <property name="clusterManager" ref="clusterManager"/>
         <property name="groupManager" ref="groupManager"/>
         <property name="configurationAdmin" ref="configurationAdmin"/>
         <property name="bundleContext" ref="blueprintBundleContext"/>
+        <property name="eventProducer" ref="eventProducer"/>
     </bean>
 
     <!-- Configuration Synchronizer -->
@@ -30,7 +30,7 @@
         <property name="configurationAdmin" ref="configurationAdmin"/>
         <property name="groupManager" ref="groupManager"/>
         <property name="clusterManager" ref="clusterManager"/>
-        <property name="producerList" ref="groupEventProducers"/>
+        <property name="eventProducer" ref="eventProducer"/>
         <property name="bundleContext" ref="blueprintBundleContext"/>
     </bean>
 
@@ -38,6 +38,7 @@
           init-method="init" destroy-method="destroy">
         <property name="configurationAdmin" ref="configurationAdmin"/>
         <property name="clusterManager" ref="clusterManager"/>
+        <property name="groupManager" ref="groupManager"/>
         <property name="bundleContext" ref="blueprintBundleContext"/>
     </bean>
 
@@ -52,9 +53,6 @@
     <reference id="clusterManager" interface="org.apache.karaf.cellar.core.ClusterManager"/>
     <reference id="groupManager" interface="org.apache.karaf.cellar.core.GroupManager"/>
     <reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"/>
-    <reference id="eventTransportFactory" interface="org.apache.karaf.cellar.core.event.EventTransportFactory"/>
     <reference id="eventProducer" interface="org.apache.karaf.cellar.core.event.EventProducer"/>
-    <reference-list id="groupEventProducers" member-type="service-object"
-                    interface="org.apache.karaf.cellar.core.event.EventProducer" filter="(type=group)"/>
 
 </blueprint>

Modified: karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java?rev=1332088&r1=1332087&r2=1332088&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/core/src/main/java/org/apache/karaf/cellar/core/GroupManager.java Mon Apr 30 07:48:39 2012
@@ -66,6 +66,14 @@ public interface GroupManager {
     public Set<Group> listLocalGroups();
 
     /**
+     * Check if the local node is part of the given group.
+     *
+     * @param groupName the group name.
+     * @return true if the local node is part of the group, false else.
+     */
+    public boolean isLocalGroup(String groupName);
+
+    /**
      * Returns the {@link Group}s of the specified {@link Node}.
      *
      * @return

Modified: karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java
URL: http://svn.apache.org/viewvc/karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java?rev=1332088&r1=1332087&r2=1332088&view=diff
==============================================================================
--- karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java (original)
+++ karaf/cellar/branches/cellar-2.2.x/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/HazelcastGroupManager.java Mon Apr 30 07:48:39 2012
@@ -164,6 +164,16 @@ public class HazelcastGroupManager imple
         }
     }
 
+    public boolean isLocalGroup(String groupName) {
+        Set<Group> localGroups = this.listLocalGroups();
+        for (Group localGroup : localGroups) {
+            if (localGroup.getName().equals(groupName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public Set<Group> listAllGroups() {
         ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
         try {