You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2014/10/31 11:25:38 UTC

[2/2] git commit: adding application builder

adding application builder


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

Branch: refs/heads/4.0.0-grouping
Commit: 686d0e063be8926447a7eef7e636622c2be55863
Parents: 4de85b5
Author: reka <rt...@gmail.com>
Authored: Fri Oct 31 15:55:14 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Fri Oct 31 15:55:14 2014 +0530

----------------------------------------------------------------------
 .../dependency/DependencyBuilder.java           | 156 ++++++
 .../applications/dependency/DependencyTree.java | 290 +++++++++++
 .../dependency/context/ApplicationContext.java  | 113 +++++
 .../context/ApplicationContextFactory.java      | 101 ++++
 .../dependency/context/ClusterContext.java      |  38 ++
 .../dependency/context/GroupContext.java        |  25 +
 .../applications/topic/ApplicationBuilder.java  | 478 +++++++++++++++++++
 .../topic/ApplicationsEventPublisher.java       | 236 +++++++++
 .../grouping/dependency/DependencyBuilder.java  | 156 ------
 .../grouping/dependency/DependencyTree.java     | 290 -----------
 .../dependency/context/ApplicationContext.java  | 113 -----
 .../context/ApplicationContextFactory.java      | 101 ----
 .../dependency/context/ClusterContext.java      |  38 --
 .../dependency/context/GroupContext.java        |  25 -
 .../topic/ApplicationsEventPublisher.java       | 238 ---------
 .../AutoscalerTopologyEventReceiver.java        |   4 +-
 .../monitor/ApplicationMonitorFactory.java      |   6 +-
 .../monitor/ParentComponentMonitor.java         |   8 +-
 .../monitor/cluster/ClusterMonitor.java         |   1 -
 .../autoscaler/monitor/group/GroupMonitor.java  |   5 +-
 .../status/checker/StatusChecker.java           |  78 ++-
 .../impl/CloudControllerServiceImpl.java        |   6 +-
 .../controller/topology/TopologyBuilder.java    | 421 +---------------
 23 files changed, 1502 insertions(+), 1425 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
new file mode 100644
index 0000000..48c22fd
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
@@ -0,0 +1,156 @@
+/*
+ * 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.autoscaler.applications.dependency;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.*;
+import org.apache.stratos.autoscaler.exception.DependencyBuilderException;
+import org.apache.stratos.autoscaler.applications.dependency.context.ApplicationContext;
+import org.apache.stratos.autoscaler.applications.dependency.context.ApplicationContextFactory;
+import org.apache.stratos.messaging.domain.applications.*;
+
+import java.util.Set;
+
+/**
+ * This is to build the startup/termination dependencies
+ * across immediate children according to the start order defined.
+ */
+public class DependencyBuilder {
+    private static final Log log = LogFactory.getLog(DependencyBuilder.class);
+
+    private DependencyBuilder() {
+
+    }
+
+    private static class Holder {
+        private static final DependencyBuilder INSTANCE = new DependencyBuilder();
+    }
+
+    public static DependencyBuilder getInstance() {
+        return Holder.INSTANCE;
+    }
+
+    /**
+     * This will build the dependency tree based on the given dependency order
+     * @param component it will give the necessary information to build the tree
+     * @return the dependency tree out of the dependency orders
+     */
+    public DependencyTree buildDependency(ParentComponent component) throws DependencyBuilderException{
+
+        String identifier = component.getUniqueIdentifier();
+        DependencyTree dependencyTree = new DependencyTree(identifier);
+        DependencyOrder dependencyOrder = component.getDependencyOrder();
+
+        if (dependencyOrder != null) {
+            log.info("Building dependency for the Application/Group " + identifier);
+
+            //Parsing the kill behaviour
+            String terminationBehaviour = dependencyOrder.getTerminationBehaviour();
+
+            if (Constants.TERMINATE_NONE.equals(terminationBehaviour)) {
+                dependencyTree.setKillNone(true);
+            } else if (Constants.TERMINATE_ALL.equals(terminationBehaviour)) {
+                dependencyTree.setKillAll(true);
+            } else if (Constants.TERMINATE_DEPENDENTS.equals(terminationBehaviour)) {
+                dependencyTree.setKillDependent(true);
+            }
+
+            log.info("Setting the [terminationBehaviour] " + terminationBehaviour + " to the " +
+                        "[dependency-tree] " + dependencyTree.getId());
+
+
+            //Parsing the start up order
+            Set<StartupOrder> startupOrders = dependencyOrder.getStartupOrders();
+            ApplicationContext foundContext;
+            ApplicationContext parentContext;
+
+            if (startupOrders != null) {
+                for (StartupOrder startupOrder : startupOrders) {
+                    foundContext = null;
+                    parentContext = null;
+                    for (String start : startupOrder.getStartList()) {
+
+                        if (start != null) {
+                            ApplicationContext applicationContext = ApplicationContextFactory.
+                                    getApplicationContext(start, component, dependencyTree);
+                            String id = applicationContext.getId();
+
+                            ApplicationContext existingApplicationContext =
+                                    dependencyTree.findApplicationContextWithId(id);
+                            if (existingApplicationContext == null) {
+                                if (parentContext != null) {
+                                    //appending the start up order to already added parent group/cluster
+                                    parentContext.addApplicationContext(applicationContext);
+                                    parentContext = applicationContext;
+                                    if (log.isDebugEnabled()) {
+                                        log.debug("Found an existing [dependency] " + parentContext.getId() +
+                                                " and adding the [dependency] " + id + " as the child");
+                                    }
+                                } else {
+                                    //adding list of startup order to the dependency tree
+                                    dependencyTree.addApplicationContext(applicationContext);
+                                    parentContext = applicationContext;
+                                }
+                            } else {
+                                if (foundContext == null) {
+                                    //if existing context found, add it to child of existing context and
+                                    //set the existing context as the next parent
+                                    existingApplicationContext.addApplicationContext(applicationContext);
+                                    parentContext = existingApplicationContext;
+                                    if (log.isDebugEnabled()) {
+                                        log.debug("Found an existing [dependency] " + id + " and setting it " +
+                                                "for the next dependency to follow");
+                                    }
+                                } else {
+                                    String msg = "Startup order is not consistent. It contains the group/cluster " +
+                                            "which has been used more than one in another startup order";
+                                    throw new DependencyBuilderException(msg);
+                                }
+
+                            }
+                        }
+                    }
+
+                }
+            }
+            //TODO need to parser the scalable dependencies
+        }
+
+
+        //adding the rest of the children who are independent to the top level
+        // as they can start in parallel.
+        for (Group group1 : component.getAliasToGroupMap().values()) {
+            if (dependencyTree.findApplicationContextWithId(group1.getAlias()) == null) {
+                ApplicationContext context = ApplicationContextFactory.
+                        getGroupContext(group1.getAlias(), dependencyTree.isKillDependent());
+                dependencyTree.addApplicationContext(context);
+            }
+        }
+        for (ClusterDataHolder dataHolder : component.getClusterDataMap().values()) {
+            if (dependencyTree.findApplicationContextWithId(dataHolder.getClusterId()) == null) {
+                ApplicationContext context = ApplicationContextFactory.getClusterContext(dataHolder,
+                                                                dependencyTree.isKillDependent());
+                dependencyTree.addApplicationContext(context);
+
+            }
+        }
+        return dependencyTree;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java
new file mode 100644
index 0000000..0cb9aa4
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java
@@ -0,0 +1,290 @@
+/*
+ * 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.autoscaler.applications.dependency;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.applications.dependency.context.ApplicationContext;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This is to contain the dependency tree of an application/group
+ */
+public class DependencyTree {
+    private static final Log log = LogFactory.getLog(DependencyTree.class);
+
+    private List<ApplicationContext> applicationContextList;
+
+    private boolean started;
+
+    private boolean terminated;
+
+    private boolean killAll;
+
+    private boolean killNone;
+
+    private boolean killDependent;
+
+    private boolean startupOder;
+
+    private boolean reverseStartupOrder;
+
+    private String id;
+
+    public DependencyTree(String id) {
+        applicationContextList = new ArrayList<ApplicationContext>();
+        this.setId(id);
+        if (log.isDebugEnabled()) {
+            log.debug("Starting a dependency tree for the [group/application] " + id);
+        }
+    }
+
+    public List<ApplicationContext> getApplicationContextList() {
+        return applicationContextList;
+    }
+
+    public void setApplicationContextList(List<ApplicationContext> applicationContextList) {
+        this.applicationContextList = applicationContextList;
+    }
+
+    public void addApplicationContext(ApplicationContext applicationContext) {
+        applicationContextList.add(applicationContext);
+
+    }
+
+    /**
+     * Find an ApplicationContext from dependency tree with the given id
+     *
+     * @param id the alias/id of group/cluster
+     * @return ApplicationContext of the given id
+     */
+    public ApplicationContext findApplicationContextWithId(String id) {
+        return findApplicationContextWithId(id, applicationContextList);
+    }
+
+    /**
+     * Find the ApplicationContext using Breadth first search.
+     *
+     * @param id       the alias/id of group/cluster
+     * @param contexts the list of contexts in the same level of the tree
+     * @return ApplicationContext of the given id
+     */
+    private ApplicationContext findApplicationContextWithId(String id, List<ApplicationContext> contexts) {
+        for (ApplicationContext context : contexts) {
+            //TODO check for the status
+            if (context.getId().equals(id)) {
+                return context;
+            }
+        }
+        //if not found in the top level search recursively
+        for (ApplicationContext context : contexts) {
+            return findApplicationContextWithId(id, context.getApplicationContextList());
+        }
+        return null;
+    }
+
+    public ApplicationContext findParentContextWithId(String id) {
+        return findParentContextWithId(null, id, this.applicationContextList);
+    }
+
+    public List<ApplicationContext> findAllParentContextWithId(String id) {
+        List<ApplicationContext> applicationContexts = new ArrayList<ApplicationContext>();
+        return findAllParent(applicationContexts, id);
+    }
+
+    private List<ApplicationContext> findAllParent(List<ApplicationContext> parentContexts, String id) {
+        ApplicationContext context = findParentContextWithId(null, id, this.applicationContextList);
+        if (context != null) {
+            parentContexts.add(context);
+            findAllParent(parentContexts, context.getId());
+        }
+        return parentContexts;
+    }
+
+
+    private ApplicationContext findParentContextWithId(ApplicationContext parent, String id,
+                                                       List<ApplicationContext> contexts) {
+        for (ApplicationContext context : contexts) {
+            //TODO check for the status
+            if (context.getId().equals(id)) {
+                return parent;
+            }
+        }
+        //if not found in the top level search recursively
+        for (ApplicationContext context : this.applicationContextList) {
+            return findParentContextWithId(context, id, context.getApplicationContextList());
+        }
+        return null;
+    }
+
+    /**
+     * Getting the next start able dependencies upon the activate event
+     * received for a group/cluster which is part of this tree.
+     *
+     * @param id the alias/id of group/cluster which received the activated event.
+     * @return list of dependencies
+     */
+    public List<ApplicationContext> getStarAbleDependencies(String id) {
+        //finding the application context which received the activated event and
+        // returning it's immediate children as the dependencies.
+        ApplicationContext context = findApplicationContextWithId(id);
+        return context.getApplicationContextList();
+    }
+
+    /**
+     * Getting the next start able dependencies upon the monitor initialization.
+     *
+     * @return list of dependencies
+     */
+    public List<ApplicationContext> getStarAbleDependencies() {
+        //returning the top level as the monitor is in initializing state
+        return this.applicationContextList;
+    }
+
+    public List<ApplicationContext> getStarAbleDependenciesByTermination() {
+        //Breadth First search over the graph to find out which level has the terminated contexts
+        return traverseGraphByLevel(this.applicationContextList);
+    }
+
+
+    private List<ApplicationContext> traverseGraphByLevel(List<ApplicationContext> contexts) {
+        for(ApplicationContext context : contexts) {
+            if(context.isTerminated()) {
+                return contexts;
+            }
+        }
+
+        for(ApplicationContext context : contexts) {
+            return traverseGraphByLevel(context.getApplicationContextList());
+        }
+        return null;
+    }
+
+
+
+    /**
+     * When one group/cluster terminates/in_maintenance, need to consider about other
+     * dependencies
+     *
+     * @param id the alias/id of group/cluster in which terminated event received
+     * @return all the kill able children dependencies
+     */
+    public List<ApplicationContext> getTerminationDependencies(String id) {
+        List<ApplicationContext> allChildrenOfAppContext = new ArrayList<ApplicationContext>();
+        ApplicationContext applicationContext = findApplicationContextWithId(id);
+
+        if (this.killDependent) {
+            //finding the ApplicationContext of the given id
+            //finding all the children of the found application context
+            allChildrenOfAppContext.add(applicationContext);
+            findAllChildrenOfAppContext(applicationContext.getApplicationContextList(),
+                    allChildrenOfAppContext);
+            return allChildrenOfAppContext;
+        } else if (this.killAll) {
+            //killall will be killed by the monitor from it's list.
+            findAllChildrenOfAppContext(this.applicationContextList,
+                    allChildrenOfAppContext);
+
+        }
+        //return empty for the kill-none case, what ever returns here will be killed in
+        return allChildrenOfAppContext;
+    }
+
+    /**
+     * This will help to find out all the children of a particular node
+     *
+     * @param applicationContexts app contexts of the particular node
+     * @param childContexts       contains the children of the node
+     * @return all the children of the given node
+     */
+    public List<ApplicationContext> findAllChildrenOfAppContext(List<ApplicationContext> applicationContexts,
+                                                                List<ApplicationContext> childContexts) {
+        for (ApplicationContext context : applicationContexts) {
+            childContexts.add(context);
+            findAllChildrenOfAppContext(context.getApplicationContextList(), childContexts);
+        }
+        return childContexts;
+    }
+
+    public boolean isKillAll() {
+        return killAll;
+    }
+
+    public void setKillAll(boolean killAll) {
+        this.killAll = killAll;
+    }
+
+    public boolean isKillNone() {
+        return killNone;
+    }
+
+    public void setKillNone(boolean killNone) {
+        this.killNone = killNone;
+    }
+
+    public boolean isStarted() {
+        return started;
+    }
+
+    public void setStarted(boolean started) {
+        this.started = started;
+    }
+
+    public boolean isTerminated() {
+        return terminated;
+    }
+
+    public void setTerminated(boolean terminated) {
+        this.terminated = terminated;
+    }
+
+    public boolean isKillDependent() {
+        return killDependent;
+    }
+
+    public void setKillDependent(boolean killDependent) {
+        this.killDependent = killDependent;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public boolean isStartupOder() {
+        return startupOder;
+    }
+
+    public void setStartupOder(boolean startupOder) {
+        this.startupOder = startupOder;
+    }
+
+    public boolean isReverseStartupOrder() {
+        return reverseStartupOrder;
+    }
+
+    public void setReverseStartupOrder(boolean reverseStartupOrder) {
+        this.reverseStartupOrder = reverseStartupOrder;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationContext.java
new file mode 100644
index 0000000..45d1544
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationContext.java
@@ -0,0 +1,113 @@
+/*
+ * 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.autoscaler.applications.dependency.context;
+
+import org.apache.stratos.messaging.domain.topology.ClusterStatus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+/**
+ * This is to keep track of the
+ */
+public abstract class ApplicationContext {
+    private List<ApplicationContext> applicationContextList;
+
+    private String id;
+    protected boolean started;
+    private boolean terminated;
+
+    private ClusterStatus status;
+
+    private Stack<ClusterStatus> statusLifeCycle;
+
+    protected boolean isDependent;
+
+    public ApplicationContext(String id, boolean killDependent) {
+        applicationContextList = new ArrayList<ApplicationContext>();
+        statusLifeCycle = new Stack<ClusterStatus>();
+        this.setDependent(killDependent);
+        this.id = id;
+    }
+
+    public List<ApplicationContext> getApplicationContextList() {
+        return applicationContextList;
+    }
+
+    public void setApplicationContextList(List<ApplicationContext> applicationContextList) {
+        this.applicationContextList = applicationContextList;
+    }
+
+    public void addApplicationContext(ApplicationContext applicationContext) {
+        applicationContextList.add(applicationContext);
+
+    }
+
+    public void addStatusToLIfeCycle(ClusterStatus status) {
+       this.statusLifeCycle.push(status);
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public ClusterStatus getCurrentStatus() {
+        return status;
+    }
+
+    public void setCurrentStatus(ClusterStatus status) {
+        this.status = status;
+    }
+
+    public List<ClusterStatus> getStatusLifeCycle() {
+        return statusLifeCycle;
+    }
+
+    public boolean hasChild() {
+        boolean hasChild;
+        if(this.applicationContextList.isEmpty()) {
+            hasChild = false;
+        } else {
+            hasChild = true;
+        }
+        return hasChild;
+    }
+
+
+    public boolean isTerminated() {
+        return terminated;
+    }
+
+    public void setTerminated(boolean terminated) {
+        this.terminated = terminated;
+    }
+
+    public boolean isDependent() {
+        return isDependent;
+    }
+
+    public void setDependent(boolean isDependent) {
+        this.isDependent = isDependent;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationContextFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationContextFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationContextFactory.java
new file mode 100644
index 0000000..b4d7740
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationContextFactory.java
@@ -0,0 +1,101 @@
+/*
+ * 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.autoscaler.applications.dependency.context;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.Constants;
+import org.apache.stratos.autoscaler.applications.dependency.DependencyTree;
+import org.apache.stratos.messaging.domain.applications.ClusterDataHolder;
+import org.apache.stratos.messaging.domain.applications.ParentComponent;
+
+/**
+ * Factory to create new GroupContext or ClusterContext
+ */
+public class ApplicationContextFactory {
+    private static final Log log = LogFactory.getLog(ApplicationContextFactory.class);
+
+    /**
+     * Will return the GroupContext/ClusterContext based on the type in start order
+     *
+     * @param startOrder      reference of group/cluster in the start order
+     * @param component       The component which used to build the dependency
+     * @param tree kill dependent behaviour of this component
+     * @return Context
+     */
+    public static ApplicationContext getApplicationContext(String startOrder,
+                                                           ParentComponent component,
+                                                           DependencyTree tree) {
+        String id;
+        ApplicationContext applicationContext = null;
+        boolean isDependent = tree.isKillDependent() || tree.isKillAll();
+        if (startOrder.startsWith(Constants.GROUP + ".")) {
+            //getting the group alias
+            id = getGroupFromStartupOrder(startOrder);
+            applicationContext = getGroupContext(id, isDependent);
+        } else if (startOrder.startsWith(Constants.CARTRIDGE + ".")) {
+            //getting the cluster alias
+            id = getClusterFromStartupOrder(startOrder);
+            //getting the cluster-id from cluster alias
+            ClusterDataHolder clusterDataHolder = component.getClusterDataMap().get(id);
+            applicationContext = getClusterContext(clusterDataHolder, isDependent);
+
+        } else {
+            log.warn("[Startup Order]: " + startOrder + " contains unknown reference");
+        }
+        return applicationContext;
+
+    }
+
+    /**
+     * Utility method to get the group alias from the startup order Eg: group.mygroup
+     *
+     * @param startupOrder startup order
+     * @return group alias
+     */
+    public static String getGroupFromStartupOrder(String startupOrder) {
+        return startupOrder.substring(Constants.GROUP.length() + 1);
+    }
+
+    /**
+     * Utility method to get the cluster alias from startup order Eg: cartridge.myphp
+     *
+     * @param startupOrder startup order
+     * @return cluster alias
+     */
+    public static String getClusterFromStartupOrder(String startupOrder) {
+        return startupOrder.substring(Constants.CARTRIDGE.length() + 1);
+    }
+
+    public static ApplicationContext getClusterContext(ClusterDataHolder dataHolder,
+                                                       boolean isKillDependent) {
+        ApplicationContext applicationContext;
+        applicationContext = new ClusterContext(dataHolder.getClusterId(),
+                isKillDependent);
+        ((ClusterContext) applicationContext).setServiceName(dataHolder.getServiceType());
+        return  applicationContext;
+    }
+
+    public static ApplicationContext getGroupContext(String id, boolean isDependent) {
+        ApplicationContext applicationContext;
+        applicationContext = new GroupContext(id,
+                isDependent);
+        return applicationContext;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ClusterContext.java
new file mode 100644
index 0000000..6de38d4
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ClusterContext.java
@@ -0,0 +1,38 @@
+/*
+ * 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.autoscaler.applications.dependency.context;
+
+/**
+ * ClusterContext to keep cluster level context information
+ */
+public class ClusterContext extends ApplicationContext {
+    private String serviceName;
+
+    public ClusterContext(String id, boolean killDependent) {
+        super(id ,killDependent);
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public void setServiceName(String serviceName) {
+        this.serviceName = serviceName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/GroupContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/GroupContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/GroupContext.java
new file mode 100644
index 0000000..3f546c5
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/GroupContext.java
@@ -0,0 +1,25 @@
+/*
+ * 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.autoscaler.applications.dependency.context;
+
+public class GroupContext extends ApplicationContext {
+    public GroupContext(String id, boolean killDependent) {
+        super(id ,killDependent);
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
new file mode 100644
index 0000000..5aa05a2
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -0,0 +1,478 @@
+/*
+ * 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.autoscaler.applications.topic;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.applications.ApplicationHolder;
+import org.apache.stratos.messaging.domain.applications.*;
+import org.apache.stratos.messaging.event.applications.*;
+import org.apache.stratos.messaging.event.applications.ApplicationActivatedEvent;
+import org.apache.stratos.messaging.event.applications.ApplicationInactivatedEvent;
+import org.apache.stratos.messaging.event.applications.GroupActivatedEvent;
+import org.apache.stratos.messaging.event.applications.GroupCreatedEvent;
+import org.apache.stratos.messaging.event.applications.GroupTerminatingEvent;
+import org.apache.stratos.messaging.event.topology.*;
+
+import java.util.Collection;
+import java.util.Set;
+
+/**
+ * This will build the application.
+ */
+public class ApplicationBuilder {
+    private static final Log log = LogFactory.getLog(ApplicationBuilder.class);
+
+
+    /*public static synchronized void handleApplicationDeployed(Application application,
+                                                              Set<ApplicationClusterContext> applicationClusterContexts,
+                                                              Set<MetaDataHolder> metaDataHolders) {
+
+
+        Applications applications = Appcation.getApplications();
+        try {
+            ApplicationHolder.acquireWriteLock();
+
+            if (applications.applicationExists(application.getUniqueIdentifier())) {
+                log.warn("Application with id [ " + application.getUniqueIdentifier() + " ] already exists in Applications");
+                return;
+            }
+            List<Cluster> clusters = new ArrayList<Cluster>();
+            for (ApplicationClusterContext applicationClusterContext : applicationClusterContexts) {
+                Cluster cluster = new Cluster(applicationClusterContext.getCartridgeType(),
+                        applicationClusterContext.getClusterId(), applicationClusterContext.getDeploymentPolicyName(),
+                        applicationClusterContext.getAutoscalePolicyName(), application.getUniqueIdentifier());
+                //cluster.setStatus(Status.Created);
+                cluster.addHostName(applicationClusterContext.getHostName());
+                cluster.setTenantRange(applicationClusterContext.getTenantRange());
+                clusters.add(cluster);
+
+                Service service = applications.getService(applicationClusterContext.getCartridgeType());
+                if (service != null) {
+                    service.addCluster(cluster);
+                    log.info("Added Cluster " + cluster.toString() + " to Applications for Application with id: " + application.getUniqueIdentifier());
+                } else {
+                    log.error("Service " + applicationClusterContext.getCartridgeType() + " not found");
+                    return;
+                }
+            }
+
+            // add to Applications and update
+            applications.addApplication(application);
+            ApplicationHolder.persistApplication(applications);
+
+            log.info("Application with id [ " + application.getUniqueIdentifier() + " ] added to Applications successfully");
+            org.apache.stratos.messaging.event.applications.ApplicationCreatedEvent applicationCreatedEvent = new org.apache.stratos.messaging.event.applications.ApplicationCreatedEvent(application, clusters);
+            ApplicationsEventPublisher.sendApplicationCreatedEvent(applicationCreatedEvent);
+
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+    }*/
+
+    /*public static synchronized void handleApplicationUndeployed(String applicationId) {
+
+        Set<ClusterDataHolder> clusterData;
+
+        // update the Application and Cluster Statuses as 'Terminating'
+        ApplicationHolder.acquireWriteLock();
+
+        try {
+
+            Applications applications = ApplicationHolder.getApplications();
+
+            if (!applications.applicationExists(applicationId)) {
+                log.warn("Application with id [ " + applicationId + " ] doesn't exist in Applications");
+                return;
+            }
+
+            Application application = applications.getApplication(applicationId);
+            // check and update application status to 'Terminating'
+            if (!application.isStateTransitionValid(ApplicationStatus.Terminating)) {
+                log.error("Invalid state transfer from " + application.getStatus() + " to " + ApplicationStatus.Terminating);
+            }
+            // for now anyway update the status forcefully
+            application.setStatus(ApplicationStatus.Terminating);
+
+            // update all the Clusters' statuses to 'Terminating'
+            clusterData = application.getClusterDataRecursively();
+            for (ClusterDataHolder clusterDataHolder : clusterData) {
+                Service service = applications.getService(clusterDataHolder.getServiceType());
+                if (service != null) {
+                    Cluster aCluster = service.getCluster(clusterDataHolder.getClusterId());
+                    if (aCluster != null) {
+                        // validate state transition
+                        if (!aCluster.isStateTransitionValid(ClusterStatus.Terminating)) {
+                            log.error("Invalid state transfer from " + aCluster.getStatus() + " to "
+                                    + ClusterStatus.Terminating);
+                        }
+                        // for now anyway update the status forcefully
+                        aCluster.setStatus(ClusterStatus.Terminating);
+
+                    } else {
+                        log.warn("Unable to find Cluster with cluster id " + clusterDataHolder.getClusterId() +
+                                " in Applications");
+                    }
+
+                } else {
+                    log.warn("Unable to remove cluster with cluster id: " + clusterDataHolder.getClusterId() + " from Applications, " +
+                            " associated Service [ " + clusterDataHolder.getServiceType() + " ] not found");
+                }
+            }
+
+            // update all Group's statuses to 'Terminating'
+            if (application.getGroups() != null) {
+                updateGroupStatusesRecursively(GroupStatus.Terminating, application.getGroups());
+            }
+
+            ApplicationHolder.persistApplication(applications);
+
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+
+        ApplicationsEventPublisher.sendApplicationUndeployedEvent(applicationId, clusterData);
+    }*/
+
+    public static void handleGroupTerminatedEvent(String appId, String groupId) {
+        Applications applications = ApplicationHolder.getApplications();
+        Application application = applications.getApplication(appId);
+        //update the status of the Group
+        if (application == null) {
+            log.warn(String.format("Application %s does not exist",
+                    appId));
+            return;
+        }
+
+        Group group = application.getGroupRecursively(groupId);
+        if (group == null) {
+            log.warn(String.format("Group %s does not exist",
+                    groupId));
+            return;
+        }
+
+        try {
+            ApplicationHolder.acquireWriteLock();
+            group.setStatus(GroupStatus.Terminated);
+            log.info("Group terminated adding status started for " + group.getUniqueIdentifier());
+
+            ApplicationHolder.persistApplication(application);
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+        //publishing data
+        ApplicationsEventPublisher.sendGroupTerminatedEvent(appId, groupId);
+    }
+
+    public static void handleGroupActivatedEvent(String appId, String groupId) {
+        Applications applications = ApplicationHolder.getApplications();
+        Application application = applications.getApplication(appId);
+        //update the status of the Group
+        if (application == null) {
+            log.warn(String.format("Application %s does not exist",
+                    appId));
+            return;
+        }
+
+        Group group = application.getGroupRecursively(groupId);
+        if (group == null) {
+            log.warn(String.format("Group %s does not exist",
+                    groupId));
+            return;
+        }
+
+        try {
+            ApplicationHolder.acquireWriteLock();
+            group.setStatus(GroupStatus.Active);
+            log.info("Group activated adding status started for " + group.getUniqueIdentifier());
+
+            ApplicationHolder.persistApplication(application);
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+        //publishing data
+        ApplicationsEventPublisher.sendGroupActivatedEvent(application.getUniqueIdentifier(),
+                group.getUniqueIdentifier());
+    }
+
+    public static void handleGroupCreatedEvent(String appId, String groupId) {
+        Applications applications = ApplicationHolder.getApplications();
+        Application application = applications.getApplication(appId);
+        //update the status of the Group
+        if (application == null) {
+            log.warn(String.format("Application %s does not exist",
+                    appId));
+            return;
+        }
+
+        Group group = application.getGroupRecursively(groupId);
+        if (group == null) {
+            log.warn(String.format("Group %s does not exist",
+                    groupId));
+            return;
+        }
+
+        try {
+            ApplicationHolder.acquireWriteLock();
+            group.setStatus(GroupStatus.Created);
+            log.info("Group created adding status started for " + group.getUniqueIdentifier());
+
+            ApplicationHolder.persistApplication(application);
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+        //publishing data
+        ApplicationsEventPublisher.sendGroupCreatedEvent(appId, groupId);
+    }
+
+    public static void handleGroupInActivateEvent(String appId, String groupId) {
+        Applications applications = ApplicationHolder.getApplications();
+        Application application = applications.getApplication(appId);
+        //update the status of the Group
+        if (application == null) {
+            log.warn(String.format("Application %s does not exist",
+                    appId));
+            return;
+        }
+
+        Group group = application.getGroupRecursively(groupId);
+        if (group == null) {
+            log.warn(String.format("Group %s does not exist",
+                    groupId));
+            return;
+        }
+
+        try {
+            ApplicationHolder.acquireWriteLock();
+            group.setStatus(GroupStatus.Inactive);
+            log.info("Group in-active adding status started for " + group.getUniqueIdentifier());
+
+            ApplicationHolder.persistApplication(application);
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+        //publishing data
+        ApplicationsEventPublisher.sendGroupInActivateEvent(appId, groupId);
+    }
+
+    public static void handleGroupTerminatingEvent(String appId, String groupId) {
+        Applications applications = ApplicationHolder.getApplications();
+        Application application = applications.getApplication(appId);
+        //update the status of the Group
+        if (application == null) {
+            log.warn(String.format("Application %s does not exist",
+                    appId));
+            return;
+        }
+
+        Group group = application.getGroupRecursively(groupId);
+        if (group == null) {
+            log.warn(String.format("Group %s does not exist",
+                    groupId));
+            return;
+        }
+
+        try {
+            ApplicationHolder.acquireWriteLock();
+            group.setStatus(GroupStatus.Terminating);
+            log.info("Group terminating adding status started for " + group.getUniqueIdentifier());
+
+            ApplicationHolder.persistApplication(application);
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+        //publishing data
+        ApplicationsEventPublisher.sendGroupTerminatingEvent(appId, groupId);
+    }
+
+    public static void handleApplicationActivatedEvent(String appId) {
+        Applications applications = ApplicationHolder.getApplications();
+        Application application = applications.getApplication(appId);
+        //update the status of the Group
+        if (application == null) {
+            log.warn(String.format("Application %s does not exist",
+                    appId));
+            return;
+        }
+
+        try {
+            ApplicationHolder.acquireWriteLock();
+            application.setStatus(ApplicationStatus.Active);
+            log.info("Application activated adding status started for Applications");
+
+            ApplicationHolder.persistApplication(application);
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+        //publishing data
+        ApplicationsEventPublisher.sendApplicationActivatedEvent(appId);
+    }
+
+    /*public static void handleApplicationCreatedEvent(ApplicationCreatedEvent event) {
+        Applications applications = ApplicationHolder.getApplications();
+        Application application = applications.getApplication(event.getAppId());
+        //update the status of the Group
+        if (application == null) {
+            log.warn(String.format("Application %s does not exist",
+                    event.getAppId()));
+            return;
+        }
+        List<Cluster> clusters = new ArrayList<Cluster>();
+        Set<ClusterDataHolder> allClusters = application.getClusterDataRecursively();
+
+        for (ClusterDataHolder clusterDataHolder : allClusters) {
+            String clusterId = clusterDataHolder.getClusterId();
+            String serviceName = clusterDataHolder.getServiceType();
+            clusters.add(ApplicationHolder.getApplications().getService(serviceName).getCluster(clusterId));
+        }
+        org.apache.stratos.messaging.event.applications.ApplicationCreatedEvent applicationActivatedEvent =
+                new org.apache.stratos.messaging.event.applications.ApplicationCreatedEvent(
+                        application, clusters);
+        try {
+            ApplicationHolder.acquireWriteLock();
+            application.setStatus(ApplicationStatus.Created);
+            log.info("Application created adding status started for Applications");
+
+            ApplicationHolder.persistApplication(applications);
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+        //publishing data
+        ApplicationsEventPublisher.sendApplicationCreatedEvent(applicationActivatedEvent);
+    }*/
+
+    public static void handleApplicationTerminatingEvent(String appId) {
+
+        String applicationId = appId;
+
+        // update the Application Status as 'Terminating'
+        ApplicationHolder.acquireWriteLock();
+
+        try {
+
+            Applications applications = ApplicationHolder.getApplications();
+
+            if (!applications.applicationExists(applicationId)) {
+                log.warn("Application with id [ " + applicationId + " ] doesn't exist in Applications");
+                return;
+            }
+
+            Application application = applications.getApplication(applicationId);
+            // check and update application status to 'Terminating'
+            if (!application.isStateTransitionValid(ApplicationStatus.Terminating)) {
+                log.error("Invalid state transfer from " + application.getStatus() + " to " + ApplicationStatus.Terminating);
+            }
+            // for now anyway update the status forcefully
+            application.setStatus(ApplicationStatus.Terminating);
+            log.info("Application " + applicationId + "'s status updated to " + ApplicationStatus.Terminating);
+
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+
+        ApplicationsEventPublisher.sendApplicationTerminatingEvent(applicationId);
+    }
+
+    private static void updateGroupStatusesRecursively(GroupStatus groupStatus, Collection<Group> groups) {
+
+        for (Group group : groups) {
+            if (!group.isStateTransitionValid(groupStatus)) {
+                log.error("Invalid state transfer from " + group.getStatus() + " to " + groupStatus);
+            }
+            // force update for now
+            group.setStatus(groupStatus);
+
+            // go recursively and update
+            if (group.getGroups() != null) {
+                updateGroupStatusesRecursively(groupStatus, group.getGroups());
+            }
+        }
+    }
+
+    public static void handleApplicationTerminatedEvent(String appId) {
+
+        Applications applications = ApplicationHolder.getApplications();
+
+        try {
+            ApplicationHolder.acquireWriteLock();
+
+            if (!applications.applicationExists(appId)) {
+                log.warn("Application with id [ " + appId + " ] doesn't exist in Applications");
+                //ApplicationsEventPublisher.sendApplicationRemovedEvent(applicationId, tenantId, tenantDomain);
+
+            } else {
+                Application application = applications.getApplication(appId);
+
+                if (!application.isStateTransitionValid(ApplicationStatus.Terminated)) {
+                    log.error("Invalid status change from " + application.getStatus() + " to " + ApplicationStatus.Terminated);
+                }
+                // forcefully set status for now
+                application.setStatus(ApplicationStatus.Terminated);
+
+                int tenantId = application.getTenantId();
+                String tenantDomain = application.getTenantDomain();
+                Set<ClusterDataHolder> clusterData = application.getClusterDataRecursively();
+                // remove clusters
+                /*for (ClusterDataHolder clusterDataHolder : clusterData) {
+                    Service service = applications.getService(clusterDataHolder.getServiceType());
+                    if (service != null) {
+                        // remove Cluster
+                        service.removeCluster(clusterDataHolder.getClusterId());
+
+                        if (log.isDebugEnabled()) {
+                            log.debug("Removed cluster with id " + clusterDataHolder.getClusterId());
+                        }
+                    } else {
+                        log.warn("Unable to remove cluster with cluster id: " + clusterDataHolder.getClusterId() + " from Applications, " +
+                                " associated Service [ " + clusterDataHolder.getServiceType() + " ] npt found");
+                    }
+
+                    // remove runtime data
+                    FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
+                    dataHolder.removeClusterContext(clusterDataHolder.getClusterId());
+                    if (log.isDebugEnabled()) {
+                        log.debug("Removed Cluster Context for Cluster id: " + clusterDataHolder.getClusterId());
+                    }
+
+                    try {
+                        RegistryManager.getInstance().persist(dataHolder);
+                    } catch (RegistryException e) {
+                        log.error("Unable to persist data in Registry", e);
+                    }
+                }
+
+
+                // remove application
+                applications.removeApplication(event.getAppId());
+                ApplicationHolder.persistApplication(applications);
+
+                deleteAppResourcesFromMetadataService(event);
+
+                log.info("Removed application [ " + event.getAppId() + " ] from Applications");
+
+                ApplicationsEventPublisher.sendApplicationTerminatedEvent(new org.apache.stratos.messaging.event.applications.ApplicationTerminatedEvent(event.getAppId(),
+                        clusterData, tenantId, tenantDomain))*/
+                ;
+            }
+
+        } finally {
+            ApplicationHolder.releaseWriteLock();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
new file mode 100644
index 0000000..f8d989f
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
@@ -0,0 +1,236 @@
+package org.apache.stratos.autoscaler.applications.topic;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.broker.publish.EventPublisher;
+import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
+import org.apache.stratos.messaging.domain.applications.*;
+import org.apache.stratos.messaging.event.Event;
+import org.apache.stratos.messaging.event.applications.*;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.util.Constants;
+
+import java.util.Set;
+
+/**
+ * This will publish application related events to application status topic.
+ */
+public class ApplicationsEventPublisher {
+    private static final Log log = LogFactory.getLog(ApplicationsEventPublisher.class);
+
+
+    public static void sendGroupCreatedEvent(String appId, String groupId) {
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                Group group = application.getGroupRecursively(groupId);
+                if (group.isStateTransitionValid(GroupStatus.Created)) {
+                    if (log.isInfoEnabled()) {
+                        log.info("Publishing Group created event for [application]: " + appId +
+                                " [group]: " + groupId);
+                    }
+                    GroupCreatedEvent groupCreatedEvent =
+                            new GroupCreatedEvent(appId, groupId);
+
+                    publishEvent(groupCreatedEvent);
+                } else {
+                    log.warn("Created is not in the possible state list of [group] " + groupId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+    }
+
+    public static void sendGroupActivatedEvent(String appId, String groupId) {
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                Group group = application.getGroupRecursively(groupId);
+                if (group.isStateTransitionValid(GroupStatus.Active)) {
+                    if (log.isInfoEnabled()) {
+                        log.info("Publishing Group activated event for [application]: " + appId +
+                                " [group]: " + groupId);
+                    }
+                    GroupActivatedEvent groupActivatedEvent =
+                            new GroupActivatedEvent(appId, groupId);
+
+                    publishEvent(groupActivatedEvent);
+                } else {
+                    log.warn("Active is not in the possible state list of [group] " + groupId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+    }
+
+    public static void sendGroupInActivateEvent(String appId, String groupId) {
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                Group group = application.getGroupRecursively(groupId);
+                if (group.isStateTransitionValid(GroupStatus.Inactive)) {
+                    if (log.isInfoEnabled()) {
+                        log.info("Publishing Group in-activate event for [application]: " + appId +
+                                " [group]: " + groupId);
+                    }
+                    AppStatusGroupInactivateEvent appStatusGroupInactivateEvent = new
+                            AppStatusGroupInactivateEvent(appId, groupId);
+
+                    publishEvent(appStatusGroupInactivateEvent);
+                } else {
+                    log.warn("InActive is not in the possible state list of [group] " + groupId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+    }
+
+    public static void sendGroupTerminatingEvent(String appId, String groupId) {
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                Group group = application.getGroupRecursively(groupId);
+                if (group.isStateTransitionValid(GroupStatus.Terminating)) {
+                    if (log.isInfoEnabled()) {
+                        log.info("Publishing Group terminating event for [application]: " + appId +
+                                " [group]: " + groupId);
+                    }
+                    GroupTerminatingEvent groupInTerminatingEvent =
+                            new GroupTerminatingEvent(appId, groupId);
+                    publishEvent(groupInTerminatingEvent);
+                } else {
+                    log.warn("Terminating is not in the possible state list of [group] " + groupId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+    }
+
+    public static void sendGroupTerminatedEvent(String appId, String groupId) {
+
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Group terminated event for [application]: " + appId +
+                    " [group]: " + groupId);
+        }
+
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                Group group = application.getGroupRecursively(groupId);
+                if (group.isStateTransitionValid(GroupStatus.Terminated)) {
+                    GroupTerminatedEvent groupInTerminatedEvent =
+                            new GroupTerminatedEvent(appId, groupId);
+                    publishEvent(groupInTerminatedEvent);
+                } else {
+                    log.warn("Terminated is not in the possible state list of [group] " + groupId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+
+
+    }
+
+    public static void sendApplicationActivatedEvent(String appId) {
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                if (application.isStateTransitionValid(ApplicationStatus.Active)) {
+                    if (log.isInfoEnabled()) {
+                        log.info("Publishing Application activated event for [application]: " + appId);
+                    }
+                    ApplicationActivatedEvent applicationActivatedEvent =
+                            new ApplicationActivatedEvent(appId);
+
+                    publishEvent(applicationActivatedEvent);
+                } else {
+                    log.warn("Active is not in the possible state list of [application] " + appId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+    }
+
+    public static void sendApplicationInactivatedEvent(String appId) {
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Application In-activated event for [application]: " + appId);
+        }
+
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                if (application.isStateTransitionValid(ApplicationStatus.Inactive)) {
+                    ApplicationInactivatedEvent applicationInActivatedEvent =
+                            new ApplicationInactivatedEvent(appId);
+                    publishEvent(applicationInActivatedEvent);
+                } else {
+                    log.warn("Inactive is not in the possible state list of [application] " + appId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+    }
+
+    public static void sendApplicationTerminatingEvent(String appId) {
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                if (application.isStateTransitionValid(ApplicationStatus.Terminating)) {
+                    if (log.isInfoEnabled()) {
+                        log.info("Publishing Application terminated event for [application]: " + appId);
+                    }
+                    ApplicationTerminatingEvent applicationTerminatingEvent =
+                            new ApplicationTerminatingEvent(appId);
+                    publishEvent(applicationTerminatingEvent);
+                } else {
+                    log.warn("Terminating is not in the possible state list of [application] " + appId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+    }
+
+    public static void sendApplicationTerminatedEvent(String appId, Set<ClusterDataHolder> clusterData) {
+        try {
+            TopologyManager.acquireReadLockForApplication(appId);
+            Application application = TopologyManager.getTopology().getApplication(appId);
+            if (application != null) {
+                if (application.isStateTransitionValid(ApplicationStatus.Terminated)) {
+                    if (log.isInfoEnabled()) {
+                        log.info("Publishing Application terminated event for [application]: " + appId);
+                    }
+                    ApplicationTerminatedEvent applicationTerminatedEvent =
+                            new ApplicationTerminatedEvent(appId, clusterData);
+                    publishEvent(applicationTerminatedEvent);
+                } else {
+                    log.warn("Terminated is not in the possible state list of [application] " + appId);
+                }
+            }
+        } finally {
+            TopologyManager.releaseReadLockForApplication(appId);
+        }
+    }
+
+    public static void publishEvent(Event event) {
+        //publishing events to application status topic
+        EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.APPLICATIONS_TOPIC);
+        eventPublisher.publish(event);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/dependency/DependencyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/dependency/DependencyBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/dependency/DependencyBuilder.java
deleted file mode 100644
index bf1233f..0000000
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/dependency/DependencyBuilder.java
+++ /dev/null
@@ -1,156 +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.autoscaler.grouping.dependency;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.*;
-import org.apache.stratos.autoscaler.exception.DependencyBuilderException;
-import org.apache.stratos.autoscaler.grouping.dependency.context.ApplicationContext;
-import org.apache.stratos.autoscaler.grouping.dependency.context.ApplicationContextFactory;
-import org.apache.stratos.messaging.domain.applications.*;
-
-import java.util.Set;
-
-/**
- * This is to build the startup/termination dependencies
- * across immediate children according to the start order defined.
- */
-public class DependencyBuilder {
-    private static final Log log = LogFactory.getLog(DependencyBuilder.class);
-
-    private DependencyBuilder() {
-
-    }
-
-    private static class Holder {
-        private static final DependencyBuilder INSTANCE = new DependencyBuilder();
-    }
-
-    public static DependencyBuilder getInstance() {
-        return Holder.INSTANCE;
-    }
-
-    /**
-     * This will build the dependency tree based on the given dependency order
-     * @param component it will give the necessary information to build the tree
-     * @return the dependency tree out of the dependency orders
-     */
-    public DependencyTree buildDependency(ParentComponent component) throws DependencyBuilderException{
-
-        String identifier = component.getUniqueIdentifier();
-        DependencyTree dependencyTree = new DependencyTree(identifier);
-        DependencyOrder dependencyOrder = component.getDependencyOrder();
-
-        if (dependencyOrder != null) {
-            log.info("Building dependency for the Application/Group " + identifier);
-
-            //Parsing the kill behaviour
-            String terminationBehaviour = dependencyOrder.getTerminationBehaviour();
-
-            if (Constants.TERMINATE_NONE.equals(terminationBehaviour)) {
-                dependencyTree.setKillNone(true);
-            } else if (Constants.TERMINATE_ALL.equals(terminationBehaviour)) {
-                dependencyTree.setKillAll(true);
-            } else if (Constants.TERMINATE_DEPENDENTS.equals(terminationBehaviour)) {
-                dependencyTree.setKillDependent(true);
-            }
-
-            log.info("Setting the [terminationBehaviour] " + terminationBehaviour + " to the " +
-                        "[dependency-tree] " + dependencyTree.getId());
-
-
-            //Parsing the start up order
-            Set<StartupOrder> startupOrders = dependencyOrder.getStartupOrders();
-            ApplicationContext foundContext;
-            ApplicationContext parentContext;
-
-            if (startupOrders != null) {
-                for (StartupOrder startupOrder : startupOrders) {
-                    foundContext = null;
-                    parentContext = null;
-                    for (String start : startupOrder.getStartList()) {
-
-                        if (start != null) {
-                            ApplicationContext applicationContext = ApplicationContextFactory.
-                                    getApplicationContext(start, component, dependencyTree);
-                            String id = applicationContext.getId();
-
-                            ApplicationContext existingApplicationContext =
-                                    dependencyTree.findApplicationContextWithId(id);
-                            if (existingApplicationContext == null) {
-                                if (parentContext != null) {
-                                    //appending the start up order to already added parent group/cluster
-                                    parentContext.addApplicationContext(applicationContext);
-                                    parentContext = applicationContext;
-                                    if (log.isDebugEnabled()) {
-                                        log.debug("Found an existing [dependency] " + parentContext.getId() +
-                                                " and adding the [dependency] " + id + " as the child");
-                                    }
-                                } else {
-                                    //adding list of startup order to the dependency tree
-                                    dependencyTree.addApplicationContext(applicationContext);
-                                    parentContext = applicationContext;
-                                }
-                            } else {
-                                if (foundContext == null) {
-                                    //if existing context found, add it to child of existing context and
-                                    //set the existing context as the next parent
-                                    existingApplicationContext.addApplicationContext(applicationContext);
-                                    parentContext = existingApplicationContext;
-                                    if (log.isDebugEnabled()) {
-                                        log.debug("Found an existing [dependency] " + id + " and setting it " +
-                                                "for the next dependency to follow");
-                                    }
-                                } else {
-                                    String msg = "Startup order is not consistent. It contains the group/cluster " +
-                                            "which has been used more than one in another startup order";
-                                    throw new DependencyBuilderException(msg);
-                                }
-
-                            }
-                        }
-                    }
-
-                }
-            }
-            //TODO need to parser the scalable dependencies
-        }
-
-
-        //adding the rest of the children who are independent to the top level
-        // as they can start in parallel.
-        for (Group group1 : component.getAliasToGroupMap().values()) {
-            if (dependencyTree.findApplicationContextWithId(group1.getAlias()) == null) {
-                ApplicationContext context = ApplicationContextFactory.
-                        getGroupContext(group1.getAlias(), dependencyTree.isKillDependent());
-                dependencyTree.addApplicationContext(context);
-            }
-        }
-        for (ClusterDataHolder dataHolder : component.getClusterDataMap().values()) {
-            if (dependencyTree.findApplicationContextWithId(dataHolder.getClusterId()) == null) {
-                ApplicationContext context = ApplicationContextFactory.getClusterContext(dataHolder,
-                                                                dependencyTree.isKillDependent());
-                dependencyTree.addApplicationContext(context);
-
-            }
-        }
-        return dependencyTree;
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/686d0e06/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/dependency/DependencyTree.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/dependency/DependencyTree.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/dependency/DependencyTree.java
deleted file mode 100644
index 05769a6..0000000
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/dependency/DependencyTree.java
+++ /dev/null
@@ -1,290 +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.autoscaler.grouping.dependency;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.grouping.dependency.context.ApplicationContext;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This is to contain the dependency tree of an application/group
- */
-public class DependencyTree {
-    private static final Log log = LogFactory.getLog(DependencyTree.class);
-
-    private List<ApplicationContext> applicationContextList;
-
-    private boolean started;
-
-    private boolean terminated;
-
-    private boolean killAll;
-
-    private boolean killNone;
-
-    private boolean killDependent;
-
-    private boolean startupOder;
-
-    private boolean reverseStartupOrder;
-
-    private String id;
-
-    public DependencyTree(String id) {
-        applicationContextList = new ArrayList<ApplicationContext>();
-        this.setId(id);
-        if (log.isDebugEnabled()) {
-            log.debug("Starting a dependency tree for the [group/application] " + id);
-        }
-    }
-
-    public List<ApplicationContext> getApplicationContextList() {
-        return applicationContextList;
-    }
-
-    public void setApplicationContextList(List<ApplicationContext> applicationContextList) {
-        this.applicationContextList = applicationContextList;
-    }
-
-    public void addApplicationContext(ApplicationContext applicationContext) {
-        applicationContextList.add(applicationContext);
-
-    }
-
-    /**
-     * Find an ApplicationContext from dependency tree with the given id
-     *
-     * @param id the alias/id of group/cluster
-     * @return ApplicationContext of the given id
-     */
-    public ApplicationContext findApplicationContextWithId(String id) {
-        return findApplicationContextWithId(id, applicationContextList);
-    }
-
-    /**
-     * Find the ApplicationContext using Breadth first search.
-     *
-     * @param id       the alias/id of group/cluster
-     * @param contexts the list of contexts in the same level of the tree
-     * @return ApplicationContext of the given id
-     */
-    private ApplicationContext findApplicationContextWithId(String id, List<ApplicationContext> contexts) {
-        for (ApplicationContext context : contexts) {
-            //TODO check for the status
-            if (context.getId().equals(id)) {
-                return context;
-            }
-        }
-        //if not found in the top level search recursively
-        for (ApplicationContext context : contexts) {
-            return findApplicationContextWithId(id, context.getApplicationContextList());
-        }
-        return null;
-    }
-
-    public ApplicationContext findParentContextWithId(String id) {
-        return findParentContextWithId(null, id, this.applicationContextList);
-    }
-
-    public List<ApplicationContext> findAllParentContextWithId(String id) {
-        List<ApplicationContext> applicationContexts = new ArrayList<ApplicationContext>();
-        return findAllParent(applicationContexts, id);
-    }
-
-    private List<ApplicationContext> findAllParent(List<ApplicationContext> parentContexts, String id) {
-        ApplicationContext context = findParentContextWithId(null, id, this.applicationContextList);
-        if (context != null) {
-            parentContexts.add(context);
-            findAllParent(parentContexts, context.getId());
-        }
-        return parentContexts;
-    }
-
-
-    private ApplicationContext findParentContextWithId(ApplicationContext parent, String id,
-                                                       List<ApplicationContext> contexts) {
-        for (ApplicationContext context : contexts) {
-            //TODO check for the status
-            if (context.getId().equals(id)) {
-                return parent;
-            }
-        }
-        //if not found in the top level search recursively
-        for (ApplicationContext context : this.applicationContextList) {
-            return findParentContextWithId(context, id, context.getApplicationContextList());
-        }
-        return null;
-    }
-
-    /**
-     * Getting the next start able dependencies upon the activate event
-     * received for a group/cluster which is part of this tree.
-     *
-     * @param id the alias/id of group/cluster which received the activated event.
-     * @return list of dependencies
-     */
-    public List<ApplicationContext> getStarAbleDependencies(String id) {
-        //finding the application context which received the activated event and
-        // returning it's immediate children as the dependencies.
-        ApplicationContext context = findApplicationContextWithId(id);
-        return context.getApplicationContextList();
-    }
-
-    /**
-     * Getting the next start able dependencies upon the monitor initialization.
-     *
-     * @return list of dependencies
-     */
-    public List<ApplicationContext> getStarAbleDependencies() {
-        //returning the top level as the monitor is in initializing state
-        return this.applicationContextList;
-    }
-
-    public List<ApplicationContext> getStarAbleDependenciesByTermination() {
-        //Breadth First search over the graph to find out which level has the terminated contexts
-        return traverseGraphByLevel(this.applicationContextList);
-    }
-
-
-    private List<ApplicationContext> traverseGraphByLevel(List<ApplicationContext> contexts) {
-        for(ApplicationContext context : contexts) {
-            if(context.isTerminated()) {
-                return contexts;
-            }
-        }
-
-        for(ApplicationContext context : contexts) {
-            return traverseGraphByLevel(context.getApplicationContextList());
-        }
-        return null;
-    }
-
-
-
-    /**
-     * When one group/cluster terminates/in_maintenance, need to consider about other
-     * dependencies
-     *
-     * @param id the alias/id of group/cluster in which terminated event received
-     * @return all the kill able children dependencies
-     */
-    public List<ApplicationContext> getTerminationDependencies(String id) {
-        List<ApplicationContext> allChildrenOfAppContext = new ArrayList<ApplicationContext>();
-        ApplicationContext applicationContext = findApplicationContextWithId(id);
-
-        if (this.killDependent) {
-            //finding the ApplicationContext of the given id
-            //finding all the children of the found application context
-            allChildrenOfAppContext.add(applicationContext);
-            findAllChildrenOfAppContext(applicationContext.getApplicationContextList(),
-                    allChildrenOfAppContext);
-            return allChildrenOfAppContext;
-        } else if (this.killAll) {
-            //killall will be killed by the monitor from it's list.
-            findAllChildrenOfAppContext(this.applicationContextList,
-                    allChildrenOfAppContext);
-
-        }
-        //return empty for the kill-none case, what ever returns here will be killed in
-        return allChildrenOfAppContext;
-    }
-
-    /**
-     * This will help to find out all the children of a particular node
-     *
-     * @param applicationContexts app contexts of the particular node
-     * @param childContexts       contains the children of the node
-     * @return all the children of the given node
-     */
-    public List<ApplicationContext> findAllChildrenOfAppContext(List<ApplicationContext> applicationContexts,
-                                                                List<ApplicationContext> childContexts) {
-        for (ApplicationContext context : applicationContexts) {
-            childContexts.add(context);
-            findAllChildrenOfAppContext(context.getApplicationContextList(), childContexts);
-        }
-        return childContexts;
-    }
-
-    public boolean isKillAll() {
-        return killAll;
-    }
-
-    public void setKillAll(boolean killAll) {
-        this.killAll = killAll;
-    }
-
-    public boolean isKillNone() {
-        return killNone;
-    }
-
-    public void setKillNone(boolean killNone) {
-        this.killNone = killNone;
-    }
-
-    public boolean isStarted() {
-        return started;
-    }
-
-    public void setStarted(boolean started) {
-        this.started = started;
-    }
-
-    public boolean isTerminated() {
-        return terminated;
-    }
-
-    public void setTerminated(boolean terminated) {
-        this.terminated = terminated;
-    }
-
-    public boolean isKillDependent() {
-        return killDependent;
-    }
-
-    public void setKillDependent(boolean killDependent) {
-        this.killDependent = killDependent;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public boolean isStartupOder() {
-        return startupOder;
-    }
-
-    public void setStartupOder(boolean startupOder) {
-        this.startupOder = startupOder;
-    }
-
-    public boolean isReverseStartupOrder() {
-        return reverseStartupOrder;
-    }
-
-    public void setReverseStartupOrder(boolean reverseStartupOrder) {
-        this.reverseStartupOrder = reverseStartupOrder;
-    }
-}