You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2014/10/19 06:39:24 UTC

[2/4] git commit: life cycle status machine contd.

life cycle status machine contd.


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/17d68aba
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/17d68aba
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/17d68aba

Branch: refs/heads/4.0.0-grouping
Commit: 17d68aba871352cf94ecbb0d843bfbb587478516
Parents: 4ec1d6f
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Fri Oct 17 17:36:56 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Sun Oct 19 08:52:07 2014 +0530

----------------------------------------------------------------------
 .../AutoscalerTopologyEventReceiver.java        | 20 ++++++---
 .../monitor/cluster/ClusterMonitor.java         |  4 +-
 .../monitor/cluster/LbClusterMonitor.java       |  4 +-
 .../status/checker/StatusChecker.java           |  2 +-
 .../InstanceStatusEventMessageDelegator.java    | 31 ++-----------
 .../controller/topology/TopologyBuilder.java    | 35 +++++++++++----
 .../conf/LoadBalancerConfiguration.java         |  8 +---
 .../messaging/domain/topology/Cluster.java      | 27 ++++++++---
 .../domain/topology/ClusterStatus.java          | 40 +++++++++++++----
 .../LifeCycleStateTransitionBehavior.java       | 35 +++++++++++++++
 .../messaging/domain/topology/Member.java       | 23 +++++++---
 .../InvalidLifecycleTransitionException.java    | 47 --------------------
 .../lifecycle/LifeCycleStateManager.java        | 33 ++++++++------
 .../topology/ClusterActivatedProcessor.java     | 10 ++---
 .../ClusterMaintenanceModeMessageProcessor.java |  5 ++-
 .../MemberActivatedMessageProcessor.java        | 10 ++---
 .../MemberMaintenanceModeProcessor.java         | 10 ++---
 .../MemberReadyToShutdownMessageProcessor.java  | 10 ++---
 .../topology/MemberStartedMessageProcessor.java | 10 ++---
 .../MemberSuspendedMessageProcessor.java        | 10 ++---
 20 files changed, 201 insertions(+), 173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
index 1e20937..b342a81 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -306,7 +306,7 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
                     AbstractClusterMonitor monitor;
                     if (AutoscalerContext.getInstance().monitorExist((cluster.getClusterId()))) {
                         monitor = (AbstractClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterMaitenanceEvent.getClusterId());
-                        monitor.setStatus(Status.In_Active);
+                        monitor.setStatus(Status.In_Maintenance);
                     } else if (AutoscalerContext.getInstance().
                             lbMonitorExist((cluster.getClusterId()))) {
                         AutoscalerContext.getInstance().getLBMonitor(clusterMaitenanceEvent.getClusterId()).
@@ -589,19 +589,25 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
             th = new Thread(
                     new ApplicationMonitorAdder(applicationId));
         }
-        //  if (th != null) {
-        th.start();
+
+        if (th != null) {
+            th.start();
         //    try {
         //        th.join();
         //    } catch (InterruptedException ignore) {
-        //    }
 
-        if (log.isDebugEnabled()) {
-            log.debug(String
+            if (log.isDebugEnabled()) {
+                log.debug(String
                     .format("Application monitor thread has been started successfully: " +
                             "[application] %s ", applicationId));
+            }
+        } else {
+            if (log.isDebugEnabled()) {
+                log.debug(String
+                        .format("Application monitor thread already exists: " +
+                                "[application] %s ", applicationId));
+            }
         }
-        //  }
     }
 
     private class ApplicationMonitorAdder implements Runnable {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
index b9e9948..c681a0f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java
@@ -84,12 +84,12 @@ public class ClusterMonitor extends AbstractClusterMonitor {
                 log.debug("Cluster monitor is running.. " + this.toString());
             }
             try {
-                if (!ClusterStatus.In_Maintenance.equals(status)) {
+                if (!ClusterStatus.Inactive.equals(status)) {
                     monitor();
                 } else {
                     if (log.isDebugEnabled()) {
                         log.debug("Cluster monitor is suspended as the cluster is in " +
-                                ClusterStatus.In_Maintenance + " mode......");
+                                ClusterStatus.Inactive + " mode......");
                     }
                 }
             } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java
index e627503..d3a2371 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/LbClusterMonitor.java
@@ -63,12 +63,12 @@ public class LbClusterMonitor extends AbstractClusterMonitor {
                 log.debug("Cluster monitor is running.. " + this.toString());
             }
             try {
-                if( !ClusterStatus.In_Maintenance.equals(status)) {
+                if( !ClusterStatus.Inactive.equals(status)) {
                     monitor();
                 } else {
                     if (log.isDebugEnabled()) {
                         log.debug("LB Cluster monitor is suspended as the cluster is in " +
-                                    ClusterStatus.In_Maintenance + " mode......");
+                                    ClusterStatus.Inactive + " mode......");
                     }
                 }
             } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
index c76df01..ff45af1 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
@@ -283,7 +283,7 @@ public class StatusChecker {
         for (Map.Entry<String, ClusterDataHolder> clusterDataHolderEntry : clusterData.entrySet()) {
             Service service = TopologyManager.getTopology().getService(clusterDataHolderEntry.getValue().getServiceType());
             if (service.getCluster(clusterDataHolderEntry.getValue().getClusterId()).
-                    getStatus() == Status.Activated) {
+                    getStatus() == ClusterStatus.Active) {
                 clusterActiveStatus = true;
             } else {
                 clusterActiveStatus = false;

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java
index fd89723..dd279ed 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topic/instance/status/InstanceStatusEventMessageDelegator.java
@@ -21,7 +21,6 @@ package org.apache.stratos.cloud.controller.topic.instance.status;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.topology.TopologyBuilder;
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
 import org.apache.stratos.messaging.event.instance.status.InstanceActivatedEvent;
 import org.apache.stratos.messaging.event.instance.status.InstanceMaintenanceModeEvent;
 import org.apache.stratos.messaging.event.instance.status.InstanceReadyToShutdownEvent;
@@ -49,51 +48,27 @@ public class InstanceStatusEventMessageDelegator implements Runnable {
                 if (InstanceStartedEvent.class.getName().equals(type)) {
                     // retrieve the actual message
                     String json = message.getText();
-                    try {
                         TopologyBuilder.handleMemberStarted((InstanceStartedEvent) Util.
                                 jsonToObject(json, InstanceStartedEvent.class));
 
-                    } catch (InvalidLifecycleTransitionException e) {
-                        //TODO: handle properly
-                        log.error(e);
-                    }
-
                 } else if (InstanceActivatedEvent.class.getName().equals(type)) {
                     // retrieve the actual message
                     String json = message.getText();
-                    try {
-                        TopologyBuilder.handleMemberActivated((InstanceActivatedEvent) Util.
+                    TopologyBuilder.handleMemberActivated((InstanceActivatedEvent) Util.
                                 jsonToObject(json, InstanceActivatedEvent.class));
 
-                    } catch (InvalidLifecycleTransitionException e) {
-                        //TODO: handle properly
-                        log.error(e);
-                    }
-
                 } else if (InstanceReadyToShutdownEvent.class.getName().equals(type)) {
                     //retrieve the actual message
                     String json = message.getText();
-                    try {
-                        TopologyBuilder.handleMemberReadyToShutdown((InstanceReadyToShutdownEvent) Util.
+                    TopologyBuilder.handleMemberReadyToShutdown((InstanceReadyToShutdownEvent) Util.
                                 jsonToObject(json, InstanceReadyToShutdownEvent.class));
 
-                    } catch (InvalidLifecycleTransitionException e) {
-                        //TODO: handle properly
-                        log.error(e);
-                    }
-
                 } else if (InstanceMaintenanceModeEvent.class.getName().equals(type)) {
                     //retrieve the actual message
                     String json = message.getText();
-                    try {
-                        TopologyBuilder.handleMemberMaintenance((InstanceMaintenanceModeEvent) Util.
+                    TopologyBuilder.handleMemberMaintenance((InstanceMaintenanceModeEvent) Util.
                                 jsonToObject(json, InstanceMaintenanceModeEvent.class));
 
-                    } catch (InvalidLifecycleTransitionException e) {
-                        //TODO: handle properly
-                        log.error(e);
-                    }
-
                 } else {
                     log.warn("Event message received is not InstanceStartedEvent or InstanceActivatedEvent");
                 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
index 906323b..9f74524 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
@@ -29,7 +29,6 @@ import org.apache.stratos.cloud.controller.publisher.CartridgeInstanceDataPublis
 import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.messaging.domain.topology.*;
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
 import org.apache.stratos.messaging.domain.topology.util.CompositeApplicationBuilder;
 import org.apache.stratos.messaging.event.application.status.ApplicationActivatedEvent;
 import org.apache.stratos.messaging.event.application.status.ClusterActivatedEvent;
@@ -151,7 +150,7 @@ public class TopologyBuilder {
                 }
                 cluster.setProperties(props);
                 cluster.setLbCluster(isLb);
-                cluster.setStatus(Status.Created);
+                //cluster.setStatus(Status.Created);
                 service.addCluster(cluster);
             }
             TopologyManager.updateTopology(topology);
@@ -210,7 +209,11 @@ public class TopologyBuilder {
         try {
             TopologyManager.acquireWriteLock();
             Cluster cluster = service.getCluster(ctxt.getClusterId());
-            cluster.setStatus(Status.In_Active);
+            if (!cluster.isStateTransitionValid(ClusterStatus.Inactive)) {
+                log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Inactive);
+            }
+            cluster.setStatus(ClusterStatus.Inactive);
+            //cluster.setStatus(Status.In_Maintenance);
             TopologyManager.updateTopology(topology);
         } finally {
             TopologyManager.releaseWriteLock();
@@ -256,7 +259,7 @@ public class TopologyBuilder {
                 publicIp, privateIp, context);
     }
 
-    public static void handleMemberStarted(InstanceStartedEvent instanceStartedEvent) throws InvalidLifecycleTransitionException {
+    public static void handleMemberStarted(InstanceStartedEvent instanceStartedEvent) {
         Topology topology = TopologyManager.getTopology();
         Service service = topology.getService(instanceStartedEvent.getServiceName());
         if (service == null) {
@@ -303,6 +306,9 @@ public class TopologyBuilder {
         try {
             TopologyManager.acquireWriteLock();
             // try update lifecycle state
+            if (!member.isStateTransitionValid(MemberStatus.Starting)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Starting);
+            }
             member.setStatus(MemberStatus.Starting);
             log.info("member started event adding status started");
 
@@ -322,7 +328,7 @@ public class TopologyBuilder {
                 null);
     }
 
-    public static void handleMemberActivated(InstanceActivatedEvent instanceActivatedEvent) throws InvalidLifecycleTransitionException {
+    public static void handleMemberActivated(InstanceActivatedEvent instanceActivatedEvent) {
         Topology topology = TopologyManager.getTopology();
         Service service = topology.getService(instanceActivatedEvent.getServiceName());
         if (service == null) {
@@ -372,6 +378,9 @@ public class TopologyBuilder {
         try {
             TopologyManager.acquireWriteLock();
             // try update lifecycle state
+            if (!member.isStateTransitionValid(MemberStatus.Activated)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Activated);
+            }
             member.setStatus(MemberStatus.Activated);
             log.info("member started event adding status activated");
             Cartridge cartridge = FasterLookUpDataHolder.getInstance().
@@ -407,7 +416,7 @@ public class TopologyBuilder {
     }
 
     public static void handleMemberReadyToShutdown(InstanceReadyToShutdownEvent instanceReadyToShutdownEvent)
-            throws InvalidMemberException, InvalidCartridgeTypeException, InvalidLifecycleTransitionException {
+            throws InvalidMemberException, InvalidCartridgeTypeException {
         Topology topology = TopologyManager.getTopology();
         Service service = topology.getService(instanceReadyToShutdownEvent.getServiceName());
         //update the status of the member
@@ -459,6 +468,10 @@ public class TopologyBuilder {
                 instanceReadyToShutdownEvent.getMemberId());
         try {
             TopologyManager.acquireWriteLock();
+
+            if (!member.isStateTransitionValid(MemberStatus.ReadyToShutDown)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.ReadyToShutDown);
+            }
             member.setStatus(MemberStatus.ReadyToShutDown);
             log.info("Member Ready to shut down event adding status started");
 
@@ -479,7 +492,7 @@ public class TopologyBuilder {
     }
 
     public static void handleMemberMaintenance(InstanceMaintenanceModeEvent instanceMaintenanceModeEvent)
-            throws InvalidMemberException, InvalidCartridgeTypeException, InvalidLifecycleTransitionException {
+            throws InvalidMemberException, InvalidCartridgeTypeException {
         Topology topology = TopologyManager.getTopology();
         Service service = topology.getService(instanceMaintenanceModeEvent.getServiceName());
         //update the status of the member
@@ -535,6 +548,9 @@ public class TopologyBuilder {
         try {
             TopologyManager.acquireWriteLock();
             // try update lifecycle state
+            if (!member.isStateTransitionValid(MemberStatus.In_Maintenance)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.In_Maintenance);
+            }
             member.setStatus(MemberStatus.In_Maintenance);
             log.info("member maintenance mode event adding status started");
 
@@ -630,7 +646,7 @@ public class TopologyBuilder {
                 Cluster cluster = new Cluster(applicationClusterContext.getCartridgeType(),
                         applicationClusterContext.getClusterId(), applicationClusterContext.getDeploymentPolicyName(),
                         applicationClusterContext.getAutoscalePolicyName(), application.getUniqueIdentifier());
-                cluster.setStatus(Status.Created);
+                //cluster.setStatus(Status.Created);
                 cluster.addHostName(applicationClusterContext.getHostName());
                 cluster.setTenantRange(applicationClusterContext.getTenantRange());
                 clusters.add(cluster);
@@ -756,7 +772,8 @@ public class TopologyBuilder {
                         clusterActivatedEvent.getClusterId());
         try {
             TopologyManager.acquireWriteLock();
-            cluster.setStatus(Status.Activated);
+            //cluster.setStatus(Status.Activated);
+            cluster.setStatus(ClusterStatus.Active);
             log.info("Cluster activated adding status started");
 
             TopologyManager.updateTopology(topology);

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
index 4fff70a..ed8aa05 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
@@ -32,7 +32,6 @@ import org.apache.stratos.load.balancer.context.LoadBalancerContext;
 import org.apache.stratos.load.balancer.context.LoadBalancerContextUtil;
 import org.apache.stratos.load.balancer.exception.InvalidConfigurationException;
 import org.apache.stratos.messaging.domain.topology.*;
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 
 import java.io.File;
@@ -489,12 +488,7 @@ public class LoadBalancerConfiguration {
                                 Port port = new Port(portNode.getName(), Integer.valueOf(value), Integer.valueOf(proxy));
                                 member.addPort(port);
                             }
-                            try {
-                                member.setStatus(MemberStatus.Activated);
-
-                            } catch (InvalidLifecycleTransitionException e) {
-                                log.error(e);
-                            }
+                            member.setStatus(MemberStatus.Activated);
                             cluster.addMember(member);
                         }
                         // Add cluster to service

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
index 578089a..31b7bf1 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
@@ -20,6 +20,7 @@
 package org.apache.stratos.messaging.domain.topology;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateManager;
 import org.apache.stratos.messaging.util.Util;
 import org.apache.stratos.messaging.util.bean.type.map.MapAdapter;
 
@@ -33,7 +34,7 @@ import java.util.*;
  * Key: serviceName, clusterId
  */
 @XmlRootElement
-public class Cluster implements Serializable {
+public class Cluster implements Serializable, LifeCycleStateTransitionBehavior<ClusterStatus> {
 
 	private static final long serialVersionUID = -361960242360176077L;
 	
@@ -49,13 +50,14 @@ public class Cluster implements Serializable {
     @XmlJavaTypeAdapter(MapAdapter.class)
     private Map<String, Member> memberMap;
 
-    private Status status;
+    //private Status status;
 
     private String appId;
 
     private String loadBalanceAlgorithmName;
     @XmlJavaTypeAdapter(MapAdapter.class)
     private Properties properties;
+    private LifeCycleStateManager<ClusterStatus> clusterStateManager;
 
     public Cluster(String serviceName, String clusterId, String deploymentPolicyName,
                    String autoscalePolicyName, String appId) {
@@ -66,6 +68,7 @@ public class Cluster implements Serializable {
         this.hostNames = new ArrayList<String>();
         this.memberMap = new HashMap<String, Member>();
         this.appId = appId;
+        this.clusterStateManager = new LifeCycleStateManager<ClusterStatus>(ClusterStatus.Created);
     }
 
     public String getServiceName() {
@@ -207,12 +210,24 @@ public class Cluster implements Serializable {
         return partitionIds.keySet();
     }
 
-    public Status getStatus() {
-        return status;
+    @Override
+    public boolean isStateTransitionValid(ClusterStatus newState) {
+        return clusterStateManager.isStateTransitionValid(newState);
+    }
+
+    @Override
+    public Stack<ClusterStatus> getTransitionedStates() {
+        return clusterStateManager.getStateStack();
+    }
+
+    public ClusterStatus getStatus() {
+        //return status;
+        return clusterStateManager.getCurrentState();
     }
 
-    public void setStatus(Status status) {
-        this.status = status;
+    public void setStatus(ClusterStatus newStatus) {
+        clusterStateManager.changeState(newStatus);
+        //this.status = newStatus;
     }
 
     public boolean equals(Object other) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java
index 9556c4d..a9f8afe 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/ClusterStatus.java
@@ -18,13 +18,38 @@
  */
 
 package org.apache.stratos.messaging.domain.topology;
-public enum ClusterStatus {
-    Created(1),
-    In_Maintenance(2),
-    terminating(3),
-    Removed(4),
-    Running(5),
-    Active(6);
+
+import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public enum ClusterStatus implements LifeCycleState {
+    Created(0) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active));
+        }
+    },
+    Active(1) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Inactive));
+        }
+    },
+    Inactive(3) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new HashSet<LifeCycleState>(Arrays.asList(ClusterStatus.Active, ClusterStatus.Terminated));
+        }
+    },
+    Terminated(4) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return null;
+        }
+    };
 
     private int code;
 
@@ -35,5 +60,4 @@ public enum ClusterStatus {
     public int getCode() {
         return code;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/LifeCycleStateTransitionBehavior.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/LifeCycleStateTransitionBehavior.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/LifeCycleStateTransitionBehavior.java
new file mode 100644
index 0000000..2199b9a
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/LifeCycleStateTransitionBehavior.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.messaging.domain.topology;
+
+import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
+
+import java.util.Stack;
+
+public interface LifeCycleStateTransitionBehavior<T extends LifeCycleState> {
+
+    public boolean isStateTransitionValid(T newState);
+
+    public Stack<T> getTransitionedStates ();
+
+    public T getStatus();
+
+    public void setStatus(T newState);
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
index 4ea198c..f0cde24 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
@@ -19,7 +19,7 @@
 
 package org.apache.stratos.messaging.domain.topology;
 
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
+import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
 import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateManager;
 import org.apache.stratos.messaging.util.bean.type.map.MapAdapter;
 
@@ -33,7 +33,7 @@ import java.util.*;
  * Key: serviceName, clusterId, memberId
  */
 @XmlRootElement
-public class Member implements Serializable {
+public class Member implements Serializable, LifeCycleStateTransitionBehavior<MemberStatus> {
     private static final long serialVersionUID = 4179661867903664661L;
 
     private final String serviceName;
@@ -74,16 +74,27 @@ public class Member implements Serializable {
         return memberId;
     }
 
+    @Override
+    public boolean isStateTransitionValid(MemberStatus newState) {
+        return memberStateManager.isStateTransitionValid(newState);
+    }
+
+    @Override
     public MemberStatus getStatus() {
         return memberStateManager.getCurrentState();
     }
 
-    public void setStatus(MemberStatus status) throws InvalidLifecycleTransitionException {
-        this.memberStateManager.changeState(status);
+    public Stack<MemberStatus> getTransitionedStates () {
+        return memberStateManager.getStateStack();
+    }
+
+    @Override
+    public void setStatus(MemberStatus newState) {
+        memberStateManager.changeState(newState);
     }
 
-    public boolean isActive() {
-        return (this.memberStateManager.getCurrentState() == MemberStatus.Activated);
+    public boolean isActive () {
+        return memberStateManager.getCurrentState().equals(MemberStatus.Activated);
     }
 
     public Collection<Port> getPorts() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java
deleted file mode 100644
index 279e70d..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.stratos.messaging.domain.topology.lifecycle;
-
-public class InvalidLifecycleTransitionException extends Exception {
-
-    private String message;
-
-    public InvalidLifecycleTransitionException() {
-        super();
-    }
-
-    public InvalidLifecycleTransitionException(String message, Throwable cause) {
-        super(message, cause);
-        this.message = message;
-    }
-
-    public InvalidLifecycleTransitionException(String message) {
-        super(message);
-        this.message = message;
-    }
-
-    public InvalidLifecycleTransitionException(Throwable cause) {
-        super(cause);
-    }
-
-    public String getMessage() {
-        return message;
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
index ee0d6e5..8131b1d 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
@@ -35,23 +35,24 @@ public class LifeCycleStateManager<T extends LifeCycleState> implements Serializ
     public LifeCycleStateManager(T initialState) {
         stateStack = new Stack<T>();
         stateStack.push(initialState);
+        //if (log.isDebugEnabled()) {
+            log.info("Life Cycle State Manager created, initial state: " + initialState.toString());
+        //}
     }
 
-    public void changeState (T nextState) throws InvalidLifecycleTransitionException {
+    public <S extends TopologyEvent> boolean isPreConditionsValid (T nextState, S topologyEvent) {
+        // TODO: implement
+        return true;
+    }
+
+    public boolean isStateTransitionValid (T nextState) {
 
-        if(getCurrentState().getNextStates().contains(nextState)) {
-            // do the transition
-            stateStack.push(nextState);
-            //if (log.isDebugEnabled()) {
-                log.info("Life Cycle State successfully updated from " + getCurrentState() + " to " + nextState);
-            //}
-        } else {
-            // invalid state transition
-            String errorMsg = "Attempted transition from " + getCurrentState() + " to " + nextState
-                    + " is invalid";
-            log.error(errorMsg);
-            throw new InvalidLifecycleTransitionException(errorMsg);
-        }
+        return stateStack.peek().getNextStates().contains(nextState);
+    }
+
+    public void changeState (T nextState)  {
+
+        stateStack.push(nextState);
     }
 
     public Stack<T> getStateStack () {
@@ -61,4 +62,8 @@ public class LifeCycleStateManager<T extends LifeCycleState> implements Serializ
     public T getCurrentState () {
         return stateStack.peek();
     }
+
+    public T getPreviousState () {
+        return stateStack.get(1);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java
index cb8eb5f..69fc3e7 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java
@@ -20,10 +20,7 @@ package org.apache.stratos.messaging.message.processor.topology;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.messaging.domain.topology.Service;
-import org.apache.stratos.messaging.domain.topology.Status;
-import org.apache.stratos.messaging.domain.topology.Topology;
+import org.apache.stratos.messaging.domain.topology.*;
 import org.apache.stratos.messaging.event.topology.ClusterActivatedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
@@ -118,7 +115,10 @@ public class ClusterActivatedProcessor extends MessageProcessor {
             }
         } else {
             // Apply changes to the topology
-            cluster.setStatus(Status.Activated);
+            if (!cluster.isStateTransitionValid(ClusterStatus.Active)) {
+                log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Active);
+            }
+            cluster.setStatus(ClusterStatus.Active);
             if (log.isInfoEnabled()) {
                 log.info(String.format("Cluster updated as activated : %s",
                         cluster.toString()));

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java
index 4dc573e..35966e8 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java
@@ -110,7 +110,10 @@ public class ClusterMaintenanceModeMessageProcessor extends MessageProcessor {
             }
         } else {
             // Apply changes to the topology
-            cluster.setStatus(Status.In_Active);
+            if (!cluster.isStateTransitionValid(ClusterStatus.Inactive)) {
+                log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Inactive);
+            }
+            cluster.setStatus(ClusterStatus.Inactive);
             if (log.isInfoEnabled()) {
                 log.info(String.format("Cluster updated as maintenance mode: %s",
                         cluster.toString()));

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
index dc98c9e..db9c85c 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
@@ -25,7 +25,6 @@ import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.Topology;
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
 import org.apache.stratos.messaging.event.topology.MemberActivatedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
@@ -60,10 +59,6 @@ public class MemberActivatedMessageProcessor extends MessageProcessor {
             try {
                 return doProcess(event, topology);
 
-            } catch (InvalidLifecycleTransitionException e) {
-                log.error(e);
-                return false;
-
             } finally {
                 TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
@@ -78,7 +73,7 @@ public class MemberActivatedMessageProcessor extends MessageProcessor {
         }
     }
 
-    private boolean doProcess (MemberActivatedEvent event,Topology topology) throws InvalidLifecycleTransitionException {
+    private boolean doProcess (MemberActivatedEvent event,Topology topology) {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {
@@ -165,6 +160,9 @@ public class MemberActivatedMessageProcessor extends MessageProcessor {
             // Apply changes to the topology
             member.addPorts(event.getPorts());
             member.setMemberIp(event.getMemberIp());
+            if (!member.isStateTransitionValid(MemberStatus.Activated)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Activated);
+            }
             member.setStatus(MemberStatus.Activated);
 
             if (log.isInfoEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java
index 9408e46..2810b19 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java
@@ -22,7 +22,6 @@ package org.apache.stratos.messaging.message.processor.topology;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.messaging.domain.topology.*;
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
 import org.apache.stratos.messaging.event.topology.MemberMaintenanceModeEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
@@ -57,10 +56,6 @@ public class MemberMaintenanceModeProcessor extends MessageProcessor {
             try {
                 return doProcess(event, topology);
 
-            } catch (InvalidLifecycleTransitionException e) {
-                log.error(e);
-                return false;
-
             } finally {
                 TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
@@ -75,7 +70,7 @@ public class MemberMaintenanceModeProcessor extends MessageProcessor {
         }
     }
 
-    private boolean doProcess (MemberMaintenanceModeEvent event,Topology topology) throws InvalidLifecycleTransitionException {
+    private boolean doProcess (MemberMaintenanceModeEvent event,Topology topology) {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {
@@ -148,6 +143,9 @@ public class MemberMaintenanceModeProcessor extends MessageProcessor {
         } else {
 
             // Apply changes to the topology
+            if (!member.isStateTransitionValid(MemberStatus.In_Maintenance)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.In_Maintenance);
+            }
             member.setStatus(MemberStatus.In_Maintenance);
 
             if (log.isInfoEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java
index 83bb94f..2ede9da 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java
@@ -21,7 +21,6 @@ package org.apache.stratos.messaging.message.processor.topology;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.messaging.domain.topology.*;
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
 import org.apache.stratos.messaging.event.topology.MemberReadyToShutdownEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
@@ -56,10 +55,6 @@ public class MemberReadyToShutdownMessageProcessor extends MessageProcessor{
             try {
                 return doProcess(event, topology);
 
-            } catch (InvalidLifecycleTransitionException e) {
-                log.error(e);
-                return false;
-
             } finally {
                 TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
@@ -74,7 +69,7 @@ public class MemberReadyToShutdownMessageProcessor extends MessageProcessor{
         }
     }
 
-    private boolean doProcess (MemberReadyToShutdownEvent event,Topology topology) throws InvalidLifecycleTransitionException {
+    private boolean doProcess (MemberReadyToShutdownEvent event,Topology topology) {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {
@@ -147,6 +142,9 @@ public class MemberReadyToShutdownMessageProcessor extends MessageProcessor{
         } else {
 
             // Apply changes to the topology
+            if (!member.isStateTransitionValid(MemberStatus.ReadyToShutDown)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.ReadyToShutDown);
+            }
             member.setStatus(MemberStatus.ReadyToShutDown);
 
             if (log.isInfoEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java
index b55ea26..2e4b171 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java
@@ -25,7 +25,6 @@ import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.Topology;
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
 import org.apache.stratos.messaging.event.topology.MemberStartedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
@@ -60,10 +59,6 @@ public class MemberStartedMessageProcessor extends MessageProcessor {
             try {
                 return doProcess(event, topology);
 
-            } catch (InvalidLifecycleTransitionException e) {
-                log.error(e);
-                return false;
-
             } finally {
                 TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
@@ -78,7 +73,7 @@ public class MemberStartedMessageProcessor extends MessageProcessor {
         }
     }
 
-    private boolean doProcess (MemberStartedEvent event,Topology topology) throws InvalidLifecycleTransitionException {
+    private boolean doProcess (MemberStartedEvent event,Topology topology) {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {
@@ -150,6 +145,9 @@ public class MemberStartedMessageProcessor extends MessageProcessor {
         } else {
 
             // Apply changes to the topology
+            if (!member.isStateTransitionValid(MemberStatus.Starting)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Starting);
+            }
             member.setStatus(MemberStatus.Starting);
 
             if (log.isInfoEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17d68aba/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java
index 56cc055..e57903f 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java
@@ -25,7 +25,6 @@ import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.Topology;
-import org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
 import org.apache.stratos.messaging.event.topology.MemberSuspendedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
@@ -60,10 +59,6 @@ public class MemberSuspendedMessageProcessor extends MessageProcessor {
             try {
                 return doProcess(event, topology);
 
-            } catch (InvalidLifecycleTransitionException e) {
-                log.error(e);
-                return false;
-
             } finally {
                 TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
@@ -78,7 +73,7 @@ public class MemberSuspendedMessageProcessor extends MessageProcessor {
         }
     }
 
-    private boolean doProcess (MemberSuspendedEvent event,Topology topology) throws InvalidLifecycleTransitionException {
+    private boolean doProcess (MemberSuspendedEvent event,Topology topology) {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {
@@ -150,6 +145,9 @@ public class MemberSuspendedMessageProcessor extends MessageProcessor {
         } else {
 
             // Apply changes to the topology
+            if (!member.isStateTransitionValid(MemberStatus.Suspended)) {
+                log.error("Invalid State Transition from " + member.getStatus() + " to " + MemberStatus.Suspended);
+            }
             member.setStatus(MemberStatus.Suspended);
 
             if (log.isInfoEnabled()) {