Repository: stratos
Updated Branches:
  refs/heads/4.0.0-grouping 8efef751e -> ae4f94efb


initial state life cycle changes


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

Branch: refs/heads/4.0.0-grouping
Commit: 4ec1d6fe18760917ecc2b2b6f3633bb7b6cea76d
Parents: 8efef75
Author: Isuru Haththotuwa <[email protected]>
Authored: Thu Oct 16 18:06:03 2014 +0530
Committer: Isuru Haththotuwa <[email protected]>
Committed: Sun Oct 19 08:41:13 2014 +0530

----------------------------------------------------------------------
 .../InstanceStatusEventMessageDelegator.java    | 48 ++++++++++++---
 .../controller/topology/TopologyBuilder.java    | 15 +++--
 .../conf/LoadBalancerConfiguration.java         |  8 ++-
 .../messaging/domain/topology/Member.java       | 15 +++--
 .../messaging/domain/topology/MemberStatus.java | 59 +++++++++++++++---
 .../InvalidLifecycleTransitionException.java    | 47 ++++++++++++++
 .../topology/lifecycle/LifeCycleState.java      | 28 +++++++++
 .../lifecycle/LifeCycleStateManager.java        | 64 ++++++++++++++++++++
 .../InstanceSpawnedMessageProcessor.java        |  2 +-
 .../MemberActivatedMessageProcessor.java        |  7 ++-
 .../MemberMaintenanceModeProcessor.java         |  7 ++-
 .../MemberReadyToShutdownMessageProcessor.java  |  7 ++-
 .../topology/MemberStartedMessageProcessor.java |  7 ++-
 .../MemberSuspendedMessageProcessor.java        |  7 ++-
 14 files changed, 284 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 f019a15..fd89723 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,6 +21,7 @@ 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;
@@ -48,27 +49,56 @@ public class InstanceStatusEventMessageDelegator implements 
Runnable {
                 if (InstanceStartedEvent.class.getName().equals(type)) {
                     // retrieve the actual message
                     String json = message.getText();
-                    TopologyBuilder.handleMemberStarted((InstanceStartedEvent) 
Util.
-                            jsonToObject(json, InstanceStartedEvent.class));
+                    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();
-                    
TopologyBuilder.handleMemberActivated((InstanceActivatedEvent) Util.
-                            jsonToObject(json, InstanceActivatedEvent.class));
+                    try {
+                        
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();
-                    
TopologyBuilder.handleMemberReadyToShutdown((InstanceReadyToShutdownEvent) Util.
-                            jsonToObject(json, 
InstanceReadyToShutdownEvent.class));
+                    try {
+                        
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();
-                    
TopologyBuilder.handleMemberMaintenance((InstanceMaintenanceModeEvent) Util.
-                            jsonToObject(json, 
InstanceMaintenanceModeEvent.class));
+                    try {
+                        
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");
                 }
-            } catch (Exception e) {
+
+                } catch (Exception e) {
                 String error = "Failed to retrieve the instance status event 
message";
                 log.error(error, e);
                 // Commenting throwing the error. Otherwise thread will not 
execute if an exception is thrown.

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 6645529..906323b 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,6 +29,7 @@ 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;
@@ -239,7 +240,7 @@ public class TopologyBuilder {
             TopologyManager.acquireWriteLock();
             Member member = new Member(serviceName, clusterId,
                     networkPartitionId, partitionId, memberId);
-            member.setStatus(MemberStatus.Created);
+            //member.setStatus(MemberStatus.Created);
             member.setMemberIp(privateIp);
             member.setLbClusterId(lbClusterId);
             member.setMemberPublicIp(publicIp);
@@ -255,7 +256,7 @@ public class TopologyBuilder {
                 publicIp, privateIp, context);
     }
 
-    public static void handleMemberStarted(InstanceStartedEvent 
instanceStartedEvent) {
+    public static void handleMemberStarted(InstanceStartedEvent 
instanceStartedEvent) throws InvalidLifecycleTransitionException {
         Topology topology = TopologyManager.getTopology();
         Service service = 
topology.getService(instanceStartedEvent.getServiceName());
         if (service == null) {
@@ -301,6 +302,7 @@ public class TopologyBuilder {
 
         try {
             TopologyManager.acquireWriteLock();
+            // try update lifecycle state
             member.setStatus(MemberStatus.Starting);
             log.info("member started event adding status started");
 
@@ -320,7 +322,7 @@ public class TopologyBuilder {
                 null);
     }
 
-    public static void handleMemberActivated(InstanceActivatedEvent 
instanceActivatedEvent) {
+    public static void handleMemberActivated(InstanceActivatedEvent 
instanceActivatedEvent) throws InvalidLifecycleTransitionException {
         Topology topology = TopologyManager.getTopology();
         Service service = 
topology.getService(instanceActivatedEvent.getServiceName());
         if (service == null) {
@@ -369,6 +371,7 @@ public class TopologyBuilder {
         memberActivatedEvent.setGroupId(instanceActivatedEvent.getGroupId());
         try {
             TopologyManager.acquireWriteLock();
+            // try update lifecycle state
             member.setStatus(MemberStatus.Activated);
             log.info("member started event adding status activated");
             Cartridge cartridge = FasterLookUpDataHolder.getInstance().
@@ -404,7 +407,7 @@ public class TopologyBuilder {
     }
 
     public static void 
handleMemberReadyToShutdown(InstanceReadyToShutdownEvent 
instanceReadyToShutdownEvent)
-            throws InvalidMemberException, InvalidCartridgeTypeException {
+            throws InvalidMemberException, InvalidCartridgeTypeException, 
InvalidLifecycleTransitionException {
         Topology topology = TopologyManager.getTopology();
         Service service = 
topology.getService(instanceReadyToShutdownEvent.getServiceName());
         //update the status of the member
@@ -476,7 +479,7 @@ public class TopologyBuilder {
     }
 
     public static void handleMemberMaintenance(InstanceMaintenanceModeEvent 
instanceMaintenanceModeEvent)
-            throws InvalidMemberException, InvalidCartridgeTypeException {
+            throws InvalidMemberException, InvalidCartridgeTypeException, 
InvalidLifecycleTransitionException {
         Topology topology = TopologyManager.getTopology();
         Service service = 
topology.getService(instanceMaintenanceModeEvent.getServiceName());
         //update the status of the member
@@ -531,6 +534,7 @@ public class TopologyBuilder {
                 instanceMaintenanceModeEvent.getMemberId());
         try {
             TopologyManager.acquireWriteLock();
+            // try update lifecycle state
             member.setStatus(MemberStatus.In_Maintenance);
             log.info("member maintenance mode event adding status started");
 
@@ -822,5 +826,4 @@ public class TopologyBuilder {
         //publishing data
         
TopologyEventPublisher.sendApplicationActivatedEvent(applicationActivatedEvent1);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 ed8aa05..4fff70a 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,6 +32,7 @@ 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;
@@ -488,7 +489,12 @@ public class LoadBalancerConfiguration {
                                 Port port = new Port(portNode.getName(), 
Integer.valueOf(value), Integer.valueOf(proxy));
                                 member.addPort(port);
                             }
-                            member.setStatus(MemberStatus.Activated);
+                            try {
+                                member.setStatus(MemberStatus.Activated);
+
+                            } catch (InvalidLifecycleTransitionException e) {
+                                log.error(e);
+                            }
                             cluster.addMember(member);
                         }
                         // Add cluster to service

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 4a3bf17..4ea198c 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,6 +19,8 @@
 
 package org.apache.stratos.messaging.domain.topology;
 
+import 
org.apache.stratos.messaging.domain.topology.lifecycle.InvalidLifecycleTransitionException;
+import 
org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateManager;
 import org.apache.stratos.messaging.util.bean.type.map.MapAdapter;
 
 import javax.xml.bind.annotation.XmlRootElement;
@@ -43,11 +45,12 @@ public class Member implements Serializable {
     @XmlJavaTypeAdapter(MapAdapter.class)
     private final Map<Integer, Port> portMap;
     private String memberPublicIp;
-    private MemberStatus status;
+    //private MemberStatus status;
     private String memberIp;
     @XmlJavaTypeAdapter(MapAdapter.class)
     private Properties properties;
     private String lbClusterId;
+    private LifeCycleStateManager<MemberStatus> memberStateManager;
 
     public Member(String serviceName, String clusterId, String 
networkPartitionId, String partitionId, String memberId) {
         this.serviceName = serviceName;
@@ -56,6 +59,7 @@ public class Member implements Serializable {
         this.partitionId = partitionId;
         this.memberId = memberId;
         this.portMap = new HashMap<Integer, Port>();
+        this.memberStateManager = new 
LifeCycleStateManager<MemberStatus>(MemberStatus.Created);
     }
 
     public String getServiceName() {
@@ -71,15 +75,15 @@ public class Member implements Serializable {
     }
 
     public MemberStatus getStatus() {
-        return status;
+        return memberStateManager.getCurrentState();
     }
 
-    public void setStatus(MemberStatus status) {
-        this.status = status;
+    public void setStatus(MemberStatus status) throws 
InvalidLifecycleTransitionException {
+        this.memberStateManager.changeState(status);
     }
 
     public boolean isActive() {
-        return (this.status == MemberStatus.Activated);
+        return (this.memberStateManager.getCurrentState() == 
MemberStatus.Activated);
     }
 
     public Collection<Port> getPorts() {
@@ -150,6 +154,5 @@ public class Member implements Serializable {
     public void setMemberPublicIp(String memberPublicIp) {
         this.memberPublicIp = memberPublicIp;
     }
-
 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java
index 508e65b..6d23c4b 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/MemberStatus.java
@@ -19,21 +19,62 @@
 
 package org.apache.stratos.messaging.domain.topology;
 
+import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
+
 import javax.xml.bind.annotation.XmlRootElement;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Represents status of a member during its lifecycle.
  */
 @XmlRootElement
-public enum MemberStatus {
-    Created(1),
-    Starting(2),
-    Activated(3),
-    In_Maintenance(4),
-    ReadyToShutDown(5),
-    Terminated(6),
-    Suspended(0),
-    ShuttingDown(0);
+public enum MemberStatus implements LifeCycleState {
+
+    Created(1) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new 
HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Starting));
+        }
+    },
+    Starting(2) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new 
HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Activated));
+        }
+    },
+    Activated(3) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new 
HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Suspended,
+                    MemberStatus.In_Maintenance));
+        }
+    },
+    In_Maintenance(4) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new 
HashSet<LifeCycleState>(Arrays.asList(MemberStatus.ReadyToShutDown));
+        }
+    },
+    ReadyToShutDown(5) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new 
HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Terminated));
+        }
+    },
+    Suspended(0) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return new 
HashSet<LifeCycleState>(Arrays.asList(MemberStatus.Terminated));
+        }
+    },
+    Terminated(6) {
+        @Override
+        public Set<LifeCycleState> getNextStates() {
+            return null;
+        }
+    };
 
     private int code;
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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
new file mode 100644
index 0000000..279e70d
--- /dev/null
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/InvalidLifecycleTransitionException.java
@@ -0,0 +1,47 @@
+/*
+ * 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/4ec1d6fe/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleState.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleState.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleState.java
new file mode 100644
index 0000000..90d45fd
--- /dev/null
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleState.java
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+import java.io.Serializable;
+import java.util.Set;
+
+public interface LifeCycleState extends Serializable {
+
+    public Set<LifeCycleState> getNextStates();
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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
new file mode 100644
index 0000000..ee0d6e5
--- /dev/null
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/lifecycle/LifeCycleStateManager.java
@@ -0,0 +1,64 @@
+/*
+ * 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;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.event.topology.TopologyEvent;
+
+import java.io.Serializable;
+import java.util.Stack;
+
+public class LifeCycleStateManager<T extends LifeCycleState> implements 
Serializable {
+
+    private static Log log = LogFactory.getLog(LifeCycleStateManager.class);
+
+    private Stack<T> stateStack;
+
+    public LifeCycleStateManager(T initialState) {
+        stateStack = new Stack<T>();
+        stateStack.push(initialState);
+    }
+
+    public void changeState (T nextState) throws 
InvalidLifecycleTransitionException {
+
+        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);
+        }
+    }
+
+    public Stack<T> getStateStack () {
+        return stateStack;
+    }
+
+    public T getCurrentState () {
+        return stateStack.peek();
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
index 3135ba5..7d7b593 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
@@ -131,7 +131,7 @@ public class InstanceSpawnedMessageProcessor extends 
MessageProcessor {
 
             // Apply changes to the topology
             Member member = new Member(event.getServiceName(), 
event.getClusterId(), event.getNetworkPartitionId(), event.getPartitionId(), 
event.getMemberId());
-            member.setStatus(MemberStatus.Created);
+            //member.setStatus(MemberStatus.Created);
             member.setMemberPublicIp(event.getMemberPublicIp());
             member.setMemberIp(event.getMemberIp());
             member.setLbClusterId(event.getLbClusterId());

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 c3f8844..dc98c9e 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,6 +25,7 @@ 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;
@@ -59,6 +60,10 @@ 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());
             }
@@ -73,7 +78,7 @@ public class MemberActivatedMessageProcessor extends 
MessageProcessor {
         }
     }
 
-    private boolean doProcess (MemberActivatedEvent event,Topology topology) {
+    private boolean doProcess (MemberActivatedEvent event,Topology topology) 
throws InvalidLifecycleTransitionException {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 2a080fe..9408e46 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,6 +22,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.*;
+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;
@@ -56,6 +57,10 @@ 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());
             }
@@ -70,7 +75,7 @@ public class MemberMaintenanceModeProcessor extends 
MessageProcessor {
         }
     }
 
-    private boolean doProcess (MemberMaintenanceModeEvent event,Topology 
topology) {
+    private boolean doProcess (MemberMaintenanceModeEvent event,Topology 
topology) throws InvalidLifecycleTransitionException {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 8f9f149..83bb94f 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,6 +21,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.*;
+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;
@@ -55,6 +56,10 @@ 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());
             }
@@ -69,7 +74,7 @@ public class MemberReadyToShutdownMessageProcessor extends 
MessageProcessor{
         }
     }
 
-    private boolean doProcess (MemberReadyToShutdownEvent event,Topology 
topology) {
+    private boolean doProcess (MemberReadyToShutdownEvent event,Topology 
topology) throws InvalidLifecycleTransitionException {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 649a5b2..b55ea26 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,6 +25,7 @@ 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;
@@ -59,6 +60,10 @@ 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());
             }
@@ -73,7 +78,7 @@ public class MemberStartedMessageProcessor extends 
MessageProcessor {
         }
     }
 
-    private boolean doProcess (MemberStartedEvent event,Topology topology) {
+    private boolean doProcess (MemberStartedEvent event,Topology topology) 
throws InvalidLifecycleTransitionException {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/4ec1d6fe/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 b342104..56cc055 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,6 +25,7 @@ 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;
@@ -59,6 +60,10 @@ 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());
             }
@@ -73,7 +78,7 @@ public class MemberSuspendedMessageProcessor extends 
MessageProcessor {
         }
     }
 
-    private boolean doProcess (MemberSuspendedEvent event,Topology topology) {
+    private boolean doProcess (MemberSuspendedEvent event,Topology topology) 
throws InvalidLifecycleTransitionException {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {

Reply via email to