Addressing a flow programming issues on controler fail-over scenario in a Clustered...
[controller.git] / opendaylight / sal / api / src / main / java / org / opendaylight / controller / sal / core / ComponentActivatorAbstractBase.java
index 66882af5d3098d95b97fb7eee530ce57d834974c..0cd1612808b4a67e8c0eb38c0dec013e4090dee3 100644 (file)
@@ -45,22 +45,24 @@ abstract public class ComponentActivatorAbstractBase implements
     Logger logger = LoggerFactory
             .getLogger(ComponentActivatorAbstractBase.class);
     private DependencyManager dm;
-    private ConcurrentMap<ImmutablePair<String, Object>, Component> dbInstances = (ConcurrentMap<ImmutablePair<String, Object>, Component>) new ConcurrentHashMap<ImmutablePair<String, Object>, Component>();
-    private ConcurrentMap<Object, Component> dbGlobalInstances = (ConcurrentMap<Object, Component>) new ConcurrentHashMap<Object, Component>();
+    private ConcurrentMap<ImmutablePair<String, Object>, Component> dbInstances = new ConcurrentHashMap<ImmutablePair<String, Object>, Component>();
+    private ConcurrentMap<Object, Component> dbGlobalInstances = new ConcurrentHashMap<Object, Component>();
 
     /**
-     * Abstract method that MUST be implemented by the derived class
-     * that wants to activate the Component bundle in a container. Here
-     * customization for the component are expected
+     * Method that should be overriden by the derived class for customization
+     * during activation of the Component bundle in a container.
      */
-    abstract protected void init();
+    protected void init() {
+
+    }
 
     /**
-     * Abstract method that MUST be implemented by the derived class
-     * that wants to DE-activate the Component bundle in a container. Here
-     * customization for the component are expected
+     * Method that should be overriden by the derived class for customization
+     * during DE-activation of the Component bundle in a container.
      */
-    abstract protected void destroy();
+    public void destroy() {
+
+    }
 
     /**
      * Method which tells how many implementations are supported by
@@ -152,6 +154,11 @@ abstract public class ComponentActivatorAbstractBase implements
 
         @Override
         public void stopped(Component component) {
+            // do nothing
+        }
+
+        @Override
+        public void stopping(Component component) {
             if (component == null) {
                 return;
             }
@@ -160,11 +167,6 @@ abstract public class ComponentActivatorAbstractBase implements
                     { Component.class }, {} }, new Object[][] { { component },
                     {} });
         }
-
-        @Override
-        public void stopping(Component component) {
-            // do nothing
-        }
     }
 
     /**
@@ -199,6 +201,7 @@ abstract public class ComponentActivatorAbstractBase implements
                         //Set the service properties to include the containerName
                         //in the service, that is fundamental for supporting
                         //multiple services just distinguished via a container
+                        @SuppressWarnings("unchecked")
                         Dictionary<String, String> serviceProps = c
                                 .getServiceProperties();
                         if (serviceProps != null) {
@@ -250,6 +253,11 @@ abstract public class ComponentActivatorAbstractBase implements
                             containerName, imps[i]);
                     Component c = this.dbInstances.get(key);
                     if (c != null) {
+                        if (c.getService() != null) {
+                            c.invokeCallbackMethod(new Object[] { c.getService() }, "containerStop",
+                                                   new Class[][] {{ Component.class}, {} },
+                                                   new Object[][] { {c}, {} });
+                        }
                         // Now remove the component from dependency manager,
                         // which will implicitely stop it first
                         this.dm.remove(c);
@@ -285,7 +293,7 @@ abstract public class ComponentActivatorAbstractBase implements
         StringBuffer buffer = new StringBuffer();
 
         for (int i = 0; i < stack.length; i++) {
-            buffer.append("\n\t" + stack[i].toString());
+            buffer.append("\n\t").append(stack[i].toString());
         }
         return buffer.toString();
     }