further changes to topoogy and app definition parsing. removed rest EP schema 
validation temporarily


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

Branch: refs/heads/4.0.0-grouping
Commit: 66f92f794fc3a8ff3cc1a6ea93c044b7b54b2c9d
Parents: 581412b
Author: Isuru Haththotuwa <[email protected]>
Authored: Mon Sep 15 23:15:57 2014 +0530
Committer: Isuru Haththotuwa <[email protected]>
Committed: Mon Sep 15 23:15:57 2014 +0530

----------------------------------------------------------------------
 .../org.apache.stratos.cloud.controller/pom.xml |   2 +
 .../application/ApplicationUtils.java           |   9 +
 .../application/ClusterInformation.java         |  27 +
 .../application/MTClusterInformation.java       |  45 ++
 .../application/STClusterInformation.java       |  55 ++
 .../parser/DefaultApplicationParser.java        | 520 ++++++++-------
 .../application/parser/ParserUtils.java         |  43 ++
 .../impl/CloudControllerServiceImpl.java        |   9 +-
 .../interfaces/ApplicationParser.java           |   3 +-
 .../controller/pojo/ApplicationDataHolder.java  |  48 ++
 .../controller/pojo/ClusterDataHolder.java      |  47 ++
 .../cloud/controller/pojo/GroupDataHolder.java  |  67 ++
 .../pojo/application/ApplicationContext.java    |   8 +-
 .../pojo/application/ComponentContext.java      |  14 +-
 .../pojo/application/DependencyContext.java     |   7 +-
 .../pojo/application/GroupContext.java          |  14 +-
 .../pojo/application/StartupOrderContext.java   |   4 +
 .../controller/topology/TopologyBuilder.java    |  20 +
 .../topology/TopologyEventPublisher.java        |   9 +
 .../client/CloudControllerServiceClient.java    |  19 +-
 .../application/beans/GroupDefinition.java      |   1 -
 .../deployer/DefaultServiceGroupDeployer.java   |  71 +-
 .../messaging/domain/topology/Application.java  |  11 +
 .../messaging/domain/topology/Cluster.java      |  17 +
 .../domain/topology/DependencyOrder.java        |   4 +
 .../messaging/domain/topology/Group.java        |  50 +-
 .../domain/topology/SubscribableBehavior.java   |   5 +
 .../bean/util/converter/PojoConverter.java      | 128 ++++
 .../rest/endpoint/services/ServiceUtils.java    |  44 +-
 .../rest/endpoint/services/StratosAdmin.java    |   2 +-
 .../main/webapp/stratos/WEB-INF/cxf-servlet.xml |   8 +-
 .../pom.xml                                     |   7 +-
 .../pom.xml                                     |   3 +-
 .../main/resources/CloudControllerService.wsdl  | 665 ++++++++++---------
 34 files changed, 1348 insertions(+), 638 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/pom.xml 
b/components/org.apache.stratos.cloud.controller/pom.xml
index ec808d1..6a1ffee 100644
--- a/components/org.apache.stratos.cloud.controller/pom.xml
+++ b/components/org.apache.stratos.cloud.controller/pom.xml
@@ -55,6 +55,7 @@
                             org.apache.stratos.cloud.controller.topology.*,
                             org.apache.stratos.cloud.controller.iaases.*,
                             org.apache.stratos.cloud.controller.pojo.*,
+                            
org.apache.stratos.cloud.controller.pojo.application.*,
                             org.apache.stratos.cloud.controller.deployers.*,
                             org.apache.stratos.cloud.controller.exception.*,
                         </Export-Package>
@@ -64,6 +65,7 @@
                             !org.apache.stratos.cloud.controller.topic.*,
                             !org.apache.stratos.cloud.controller.iaases.*,
                             !org.apache.stratos.cloud.controller.pojo.*,
+                            
!org.apache.stratos.cloud.controller.pojo.application.*,
                             !org.apache.stratos.cloud.controller.deployers.*,
                             !org.apache.stratos.cloud.controller.exception.*,
                             !org.apache.stratos.cloud.controller.topology.*,

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java
index ac78453..3cd3a0e 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ApplicationUtils.java
@@ -30,4 +30,13 @@ public class ApplicationUtils {
 
         return pattern.matcher(alias).matches();
     }
+
+    public static boolean isValid (String arg) {
+
+        if (arg == null || arg.isEmpty()) {
+            return false;
+        } else {
+            return true;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ClusterInformation.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ClusterInformation.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ClusterInformation.java
new file mode 100644
index 0000000..5fd6d57
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/ClusterInformation.java
@@ -0,0 +1,27 @@
+/*
+ * 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.cloud.controller.application;
+
+public interface ClusterInformation {
+
+    public String getClusterId (String alias, String cartridgeType);
+
+    public String getHostName (String alias, String 
cartridgeDefinitionHostName);
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/MTClusterInformation.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/MTClusterInformation.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/MTClusterInformation.java
new file mode 100644
index 0000000..ef3b255
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/MTClusterInformation.java
@@ -0,0 +1,45 @@
+/*
+ * 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.cloud.controller.application;
+
+public class MTClusterInformation implements ClusterInformation {
+
+    @Override
+    public String getClusterId(String alias, String cartridgeType) {
+
+        if (!ApplicationUtils.isValid(cartridgeType))  {
+            // cannot happen
+            throw new IllegalArgumentException("Invalid cartridge type value 
provided: [ " + cartridgeType + " ]");
+        }
+
+        return cartridgeType + ".domain";
+    }
+
+    @Override
+    public String getHostName(String alias, String 
cartridgeDefinitionHostName) {
+
+        if (!ApplicationUtils.isValid(cartridgeDefinitionHostName)) {
+            // cannot happen
+            throw new IllegalArgumentException("Invalid host name value 
provided: [ " + cartridgeDefinitionHostName + " ]");
+        }
+
+        return cartridgeDefinitionHostName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/STClusterInformation.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/STClusterInformation.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/STClusterInformation.java
new file mode 100644
index 0000000..c8c3d9b
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/STClusterInformation.java
@@ -0,0 +1,55 @@
+/*
+ * 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.cloud.controller.application;
+
+public class STClusterInformation implements ClusterInformation {
+
+    @Override
+    public String getClusterId(String alias, String cartridgeType) {
+
+        if (!ApplicationUtils.isValid(alias)) {
+            // cannot happen
+            throw new IllegalArgumentException("Invalid alias value provided: 
[ " + alias + " ]");
+        }
+
+        if (!ApplicationUtils.isValid(cartridgeType))  {
+            // cannot happen
+            throw new IllegalArgumentException("Invalid cartridge type value 
provided: [ " + cartridgeType + " ]");
+        }
+
+        return alias + "." + cartridgeType + ".domain";
+    }
+
+    @Override
+    public String getHostName(String alias, String 
cartridgeDefinitionHostName) {
+
+        if (!ApplicationUtils.isValid(alias)) {
+            // cannot happen
+            throw new IllegalArgumentException("Invalid alias value provided: 
[ " + alias + " ]");
+        }
+
+        if (!ApplicationUtils.isValid(cartridgeDefinitionHostName)) {
+            // cannot happen
+            throw new IllegalArgumentException("Invalid host name value 
provided: [ " + cartridgeDefinitionHostName + " ]");
+        }
+
+        return alias + "." + cartridgeDefinitionHostName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java
index ef9432f..80cf4ae 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/DefaultApplicationParser.java
@@ -19,19 +19,22 @@
 
 package org.apache.stratos.cloud.controller.application.parser;
 
-import org.apache.axis2.AxisFault;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.application.ApplicationUtils;
+import org.apache.stratos.cloud.controller.application.ClusterInformation;
+import org.apache.stratos.cloud.controller.application.MTClusterInformation;
+import org.apache.stratos.cloud.controller.application.STClusterInformation;
 import 
org.apache.stratos.cloud.controller.exception.ApplicationDefinitionException;
 import org.apache.stratos.cloud.controller.interfaces.ApplicationParser;
-import org.apache.stratos.cloud.controller.pojo.application.ApplicationContext;
-import org.apache.stratos.cloud.controller.pojo.application.GroupContext;
-import 
org.apache.stratos.cloud.controller.pojo.application.SubscribableContext;
-import 
org.apache.stratos.cloud.controller.pojo.application.SubscribableInfoContext;
-import org.apache.stratos.messaging.domain.topology.Application;
+import org.apache.stratos.cloud.controller.pojo.ApplicationDataHolder;
+import org.apache.stratos.cloud.controller.pojo.Cartridge;
+import org.apache.stratos.cloud.controller.pojo.ClusterDataHolder;
+import org.apache.stratos.cloud.controller.pojo.ServiceGroup;
+import org.apache.stratos.cloud.controller.pojo.application.*;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.messaging.domain.topology.*;
 
-import java.rmi.RemoteException;
 import java.util.*;
 
 public class DefaultApplicationParser implements ApplicationParser {
@@ -39,7 +42,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
     private static Log log = LogFactory.getLog(DefaultApplicationParser.class);
 
     @Override
-    public Application parse(Object obj) throws ApplicationDefinitionException 
{
+    public ApplicationDataHolder parse(Object obj) throws 
ApplicationDefinitionException {
 
         ApplicationContext applicationCtxt = null;
 
@@ -85,9 +88,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
             throw new ApplicationDefinitionException("Invalid Composite 
Application Definition, no Subscribable Information specified");
         }
 
-        //TODO
-        //return buildCompositeAppStructure (applicationCtxt, definedGroups, 
subscribablesInfo);
-        return null;
+        return buildCompositeAppStructure (applicationCtxt, definedGroups, 
subscribablesInfo);
     }
 
     private Map<String, GroupContext> getDefinedGroups (ApplicationContext 
appCtxt) throws
@@ -168,247 +169,316 @@ public class DefaultApplicationParser implements 
ApplicationParser {
 
     private boolean isGroupDeployed (String serviceGroupName) throws 
ApplicationDefinitionException {
 
-        //TODO
-        return true;
+        return 
FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName) != null;
+    }
+
+    private ApplicationDataHolder buildCompositeAppStructure 
(ApplicationContext appCtxt,
+                                                            Map<String, 
GroupContext> definedGroupCtxts,
+                                                            Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
+            throws ApplicationDefinitionException {
+
+        Application application = new Application(appCtxt.getApplicationId());
+        // following keeps track of all Clusters created for this application
+        Set<Cluster> clusters = new HashSet<Cluster>();
+
+        if (appCtxt.getComponents() != null) {
+            // get top level Subscribables
+            if (appCtxt.getComponents().getSubscribableContexts() != null) {
+                ClusterDataHolder clusterDataHolder = 
getClusterInformation(Arrays.asList(appCtxt.getComponents().getSubscribableContexts()),
 subscribableInfoCtxts);
+                application.setClusterIds(clusterDataHolder.getClusterIdMap());
+                clusters.addAll(clusterDataHolder.getClusters());
+            }
+
+            // get Groups
+            if (appCtxt.getComponents().getGroupContexts() != null) {
+                application.setGroups(getGroupInfo(clusters, 
Arrays.asList(appCtxt.getComponents().getGroupContexts()), 
subscribableInfoCtxts, definedGroupCtxts));
+            }
+
+            // get top level Dependency definitions
+            if (appCtxt.getComponents().getDependencyContext() != null) {
+                DependencyOrder appDependencyOrder = new DependencyOrder();
+                Set<StartupOrder>  startupOrders = 
getStartupOrderForApplicationComponents(new 
HashSet<StartupOrderContext>(Arrays.asList(appCtxt.getComponents().
+                        getDependencyContext().getStartupOrderContext())));
+                if (startupOrders != null) {
+                    appDependencyOrder.setStartupOrders(startupOrders);
+                }
+                
appDependencyOrder.setKillbehavior(appCtxt.getComponents().getDependencyContext().getKillBehaviour());
+
+                application.setDependencyOrder(appDependencyOrder);
+            }
+        }
+
+        log.info("Application with id " + appCtxt.getApplicationId() + " 
parsed successfully");
+
+        ApplicationDataHolder applicationDataHolder = new 
ApplicationDataHolder();
+        applicationDataHolder.setClusters(clusters);
+        applicationDataHolder.setApplication(application);
+
+        return applicationDataHolder;
+    }
+
+    private Map<String, Group> getGroupInfo (Set<Cluster> clusters, 
List<GroupContext> groupCtxts,
+                                         Map<String, SubscribableInfoContext> 
subscribableInformation,
+                                         Map<String, GroupContext> 
definedGroupCtxts)
+            throws ApplicationDefinitionException {
+
+        Map<String, Group> groupNameToGroup = new HashMap<String, Group>();
+
+        for (GroupContext groupCtxt : groupCtxts) {
+            Group group = getGroup(clusters, groupCtxt, 
subscribableInformation, definedGroupCtxts);
+            groupNameToGroup.put(group.getName(), group);
+        }
+
+        //Set<GroupContext> topLevelGroupContexts = 
getTopLevelGroupContexts(groupNameToGroup);
+        Set<Group> nestedGroups = new HashSet<Group>();
+        getNestedGroupContexts(nestedGroups, groupNameToGroup.values());
+        filterDuplicatedGroupContexts(groupNameToGroup.values(), nestedGroups);
+
+        return groupNameToGroup;
+    }
+
+    private void getNestedGroupContexts (Set<Group> nestedGroups, 
Collection<Group> groups) {
+
+        if (groups != null) {
+            for (Group group : groups) {
+                if (group.getGroups() != null) {
+                    nestedGroups.addAll(group.getGroups());
+                    getNestedGroupContexts(nestedGroups, group.getGroups());
+                }
+            }
+        }
+    }
+
+    private void filterDuplicatedGroupContexts (Collection<Group> 
topLevelGroups, Set<Group> nestedGroups) {
+
+        for (Group nestedGroup : nestedGroups) {
+            filterNestedGroupFromTopLevel(topLevelGroups, nestedGroup);
+        }
+    }
+
+    private void filterNestedGroupFromTopLevel (Collection<Group> 
topLevelGroups, Group nestedGroup) {
+
+        Iterator<Group> parentIterator = topLevelGroups.iterator();
+        while (parentIterator.hasNext()) {
+            Group parentGroup = parentIterator.next();
+            // if there is an exactly similar nested Group Context and a top 
level Group Context
+            // it implies that they are duplicates. Should be removed from top 
level.
+            if (parentGroup.equals(nestedGroup)) {
+                parentIterator.remove();
+            }
+        }
+    }
+
+    private Group getGroup(Set<Cluster> clusters, GroupContext groupCtxt, 
Map<String, SubscribableInfoContext> subscribableInfoCtxts,
+                           Map<String, GroupContext> definedGroupCtxts) throws 
ApplicationDefinitionException {
+
+        // check if are in the defined Group set
+        GroupContext definedGroupDef = 
definedGroupCtxts.get(groupCtxt.getAlias());
+        if (definedGroupDef == null) {
+            throw new ApplicationDefinitionException("Group Definition with 
name: " + groupCtxt.getName() + ", alias: " +
+                    groupCtxt.getAlias() + " is not found in the all Group 
Definitions collection");
+        }
+
+        Group group = new Group(groupCtxt.getName(), groupCtxt.getAlias());
+
+        group.setAutoscalingPolicy(groupCtxt.getAutoscalingPolicy());
+        group.setDeploymentPolicy(groupCtxt.getDeploymentPolicy());
+        DependencyOrder dependencyOrder = new DependencyOrder();
+        // create the Dependency Ordering
+        Set<StartupOrder>  startupOrders = 
getStartupOrderForGroup(groupCtxt.getName());
+        if (startupOrders != null) {
+            dependencyOrder.setStartupOrders(startupOrders);
+        }
+        dependencyOrder.setKillbehavior(getKillbehaviour(groupCtxt.getName()));
+        group.setDependencyOrder(dependencyOrder);
+
+        ClusterDataHolder clusterDataHolder;
+
+        // get group level Subscribables
+        if (groupCtxt.getSubscribableContexts() != null) {
+            clusterDataHolder = 
getClusterInformation(Arrays.asList(groupCtxt.getSubscribableContexts()), 
subscribableInfoCtxts);
+            group.setClusterIds(clusterDataHolder.getClusterIdMap());
+            clusters.addAll(clusterDataHolder.getClusters());
+        }
+
+        // get nested groups
+        if (groupCtxt.getGroupContexts() != null) {
+            Map<String, Group> nestedGroups = new HashMap<String, Group>();
+            // check sub groups
+            for (GroupContext subGroupCtxt : groupCtxt.getGroupContexts()) {
+                // get the complete Group Definition
+                subGroupCtxt = definedGroupCtxts.get(subGroupCtxt.getAlias());
+                Group nestedGroup = getGroup(clusters, subGroupCtxt, 
subscribableInfoCtxts, definedGroupCtxts);
+                nestedGroups.put(nestedGroup.getName(), nestedGroup);
+            }
+
+            group.setGroups(nestedGroups);
+        }
+
+        return group;
+    }
+
+    private Set<StartupOrder> getStartupOrderForGroup(String serviceGroupName) 
throws ApplicationDefinitionException {
+
+        ServiceGroup serviceGroup = 
FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName);
+
+        if (serviceGroup == null) {
+            throw new ApplicationDefinitionException("Service Group Definition 
not found for name " + serviceGroupName);
+        }
+
+        if (serviceGroup.getDependencies() != null) {
+            if (serviceGroup.getDependencies().getStartupOrder() != null) {
+                return 
ParserUtils.convert(serviceGroup.getDependencies().getStartupOrder());
+            }
+        }
+
+        return null;
+    }
+
+    private Set<StartupOrder> getStartupOrderForApplicationComponents 
(Set<StartupOrderContext> startupOrderCtxts)
+            throws ApplicationDefinitionException {
+
+        if (startupOrderCtxts == null) {
+            return null;
+        }
+
+        Set<StartupOrder> startupOrders = new HashSet<StartupOrder>();
+
+        for (StartupOrderContext startupOrderContext : startupOrderCtxts) {
+            startupOrders.add(new StartupOrder(startupOrderContext.getStart(), 
startupOrderContext.getAfter()));
+        }
+
+        return startupOrders;
+    }
+
+    private String getKillbehaviour (String serviceGroupName) throws 
ApplicationDefinitionException {
+
+        ServiceGroup serviceGroup = 
FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName);
+
+        if (serviceGroup == null) {
+            throw new ApplicationDefinitionException("Service Group Definition 
not found for name " + serviceGroupName);
+        }
+
+        if (serviceGroup.getDependencies() != null) {
+            return serviceGroup.getDependencies().getKillBehaviour();
+        }
+
+        return null;
+
     }
 
-//    private Application buildCompositeAppStructure (ApplicationContext 
appCtxt,
-//                                                            Map<String, 
GroupContext> definedGroupCtxts,
-//                                                            Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
+//    private Set<SubscribableContext> getSubsribableContexts 
(List<SubscribableContext> subscribableCtxts,
+//                                                             Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
 //            throws ApplicationDefinitionException {
 //
-//        Application application = new 
Application(appCtxt.getApplicationId());
-//
-//        if (appCtxt.getComponents() != null) {
-//            // get top level Subscribables
-//            if (appCtxt.getComponents().getSubscribableContexts() != null) {
-//                
application.setSubscribableContexts(getSubsribableContexts(appCtxt.getComponents().getSubscribables(),
-//                        subscribableInfoCtxts));
-//            }
-//
-//            // get Groups
-//            if (appCtxt.getComponents().getGroups() != null) {
-//                
application.setGroupContexts(getGroupContexts(appCtxt.getComponents().getGroups(),
-//                        subscribableInfoCtxts, definedGroupCtxts));
-//            }
-//
-//            // get top level Dependency definitions
-//            if (appCtxt.getComponents().getDependencies() != null) {
-//                
application.setStartupOrder(getStartupOrderForApplicationComponents(appCtxt.getComponents().
-//                        getDependencies().getStartupOrder()));
-//
-//                
application.setKillBehaviour(appCtxt.getComponents().getDependencies().getKillBehaviour());
-//            }
-//        }
-//
-//        return application;
-//    }
-//
-//    private Set<GroupContext> getGroupContexts (List<GroupDefinition> 
groupDefinitions,
-//                                                Map<String, 
SubscribableInfo> subscribableInformation,
-//                                                Map<String, GroupDefinition> 
definedGroups)
-//            throws CompositeApplicationDefinitionException {
-//
-//        Set<GroupContext> groupContexts = new HashSet<GroupContext>();
-//
-//        for (GroupDefinition group : groupDefinitions) {
-//            groupContexts.add(getGroupContext(group, 
subscribableInformation, definedGroups));
-//        }
-//
-//        //Set<GroupContext> topLevelGroupContexts = 
getTopLevelGroupContexts(groupContexts);
-//        Set<GroupContext> nestedGroupContexts = new HashSet<GroupContext>();
-//        getNestedGroupContexts(nestedGroupContexts, groupContexts);
-//        filterDuplicatedGroupContexts(groupContexts, nestedGroupContexts);
-//
-//        return groupContexts;
-//    }
-//
-//    private void getNestedGroupContexts (Set<GroupContext> 
nestedGroupContexts, Set<GroupContext> groupContexts) {
-//
-//        if (groupContexts != null) {
-//            for (GroupContext groupContext : groupContexts) {
-//                if (groupContext.getGroupContexts() != null) {
-//                    
nestedGroupContexts.addAll(groupContext.getGroupContexts());
-//                    getNestedGroupContexts(nestedGroupContexts, 
groupContext.getGroupContexts());
-//                }
-//            }
-//        }
-//    }
-//
-//    private void filterDuplicatedGroupContexts (Set<GroupContext> 
topLevelGroupContexts, Set<GroupContext> nestedGroupContexts) {
-//
-//        for (GroupContext nestedGropCtxt : nestedGroupContexts) {
-//            filterNestedGroupFromTopLevel(topLevelGroupContexts, 
nestedGropCtxt);
-//        }
-//    }
-//
-//    private void filterNestedGroupFromTopLevel (Set<GroupContext> 
topLevelGroupContexts, GroupContext nestedGroupCtxt) {
-//
-//        Iterator<GroupContext> parentIterator = 
topLevelGroupContexts.iterator();
-//        while (parentIterator.hasNext()) {
-//            GroupContext parentGroupCtxt = parentIterator.next();
-//            // if there is an exactly similar nested Group Context and a top 
level Group Context
-//            // it implies that they are duplicates. Should be removed from 
top level.
-//            if (parentGroupCtxt.equals(nestedGroupCtxt)) {
-//                parentIterator.remove();
-//            }
-//        }
-//    }
-//
-//    private GroupContext getGroupContext (GroupDefinition group, Map<String, 
SubscribableInfo> subscribableInformation,
-//                                          Map<String, GroupDefinition> 
definedGroups) throws CompositeApplicationDefinitionException {
-//
-//        // check if are in the defined Group set
-//        GroupDefinition definedGroupDef = 
definedGroups.get(group.getAlias());
-//        if (definedGroupDef == null) {
-//            throw new CompositeApplicationDefinitionException("Group 
Definition with name: " + group.getName() + ", alias: " +
-//                    group.getAlias() + " is not found in the all Group 
Definitions collection");
-//        }
-//
-//        GroupContext groupContext = new GroupContext();
-//
-//        groupContext.setName(group.getName());
-//        groupContext.setAlias(group.getAlias());
-//        groupContext.setAutoscalingPolicy(group.getAutoscalingPolicy());
-//        groupContext.setDeploymentPolicy(group.getDeploymentPolicy());
-//        
groupContext.setStartupOrder(getStartupOrderForGroup(group.getName()));
-//        groupContext.setKillBehaviour(getKillbehaviour(group.getName()));
-//
-//        // get group level Subscribables
-//        if (group.getSubscribables() != null) {
-//            
groupContext.setSubscribableContexts(getSubsribableContexts(group.getSubscribables(),
 subscribableInformation));
-//        }
-//        // get nested groups
-//        if (group.getSubGroups() != null) {
-//            Set<GroupContext> nestedGroupContexts = new 
HashSet<GroupContext>();
-//            // check sub groups
-//            for (GroupDefinition subGroup : group.getSubGroups()) {
-//                // get the complete Group Definition
-//                subGroup = definedGroups.get(subGroup.getAlias());
-//                nestedGroupContexts.add(getGroupContext(subGroup, 
subscribableInformation, definedGroups));
-//            }
-//
-//            groupContext.setGroupContexts(nestedGroupContexts);
-//        }
-//
-//        return groupContext;
-//    }
-//
-//    private Set<StartupOrder> getStartupOrderForGroup(String 
serviceGroupName) throws CompositeApplicationDefinitionException {
-//
-//        ServiceGroupDefinition groupDefinition;
-//
-//        try {
-//            groupDefinition = 
dataInsertionAndRetrievalMgr.getServiceGroupDefinition(serviceGroupName);
-//
-//        } catch (PersistenceManagerException e) {
-//            throw new CompositeApplicationDefinitionException(e);
-//        }
-//
-//        if (groupDefinition == null) {
-//            throw new CompositeApplicationDefinitionException("Service Group 
Definition not found for name " + serviceGroupName);
-//        }
-//
-//        if (groupDefinition.getDependencies() != null) {
-//            if (groupDefinition.getDependencies().getStartupOrder() != null) 
{
-//                return 
ParserUtils.convert(groupDefinition.getDependencies().getStartupOrder());
-//            }
-//        }
-//
-//        return null;
-//    }
-//
-//    private Set<StartupOrder> getStartupOrderForApplicationComponents 
(List<StartupOrderDefinition> startupOrderDefinitions)
-//            throws CompositeApplicationDefinitionException {
-//
-//        if (startupOrderDefinitions == null) {
-//            return null;
-//        }
-//
-//        Set<StartupOrder> startupOrders = new HashSet<StartupOrder>();
-//
-//        for (StartupOrderDefinition startupOrderDefinition : 
startupOrderDefinitions) {
-//            startupOrders.add(new 
StartupOrder(startupOrderDefinition.getStart(), 
startupOrderDefinition.getAfter()));
-//        }
-//
-//        return startupOrders;
-//    }
-//
-//    private String getKillbehaviour (String serviceGroupName) throws 
CompositeApplicationDefinitionException {
-//
-//        ServiceGroupDefinition groupDefinition;
-//
-//        try {
-//            groupDefinition = 
dataInsertionAndRetrievalMgr.getServiceGroupDefinition(serviceGroupName);
-//
-//        } catch (PersistenceManagerException e) {
-//            throw new CompositeApplicationDefinitionException(e);
-//        }
-//
-//        if (groupDefinition == null) {
-//            throw new CompositeApplicationDefinitionException("Service Group 
Definition not found for name " + serviceGroupName);
-//        }
-//
-//        if (groupDefinition.getDependencies() != null) {
-//            return groupDefinition.getDependencies().getKillBehaviour();
-//        }
-//
-//        return null;
-//
-//    }
-//
-//    private Set<SubscribableContext> getSubsribableContexts 
(List<SubscribableDefinition> subscribableDefinitions,
-//                                                             Map<String, 
SubscribableInfo> subscribableInformation)
-//            throws CompositeApplicationDefinitionException {
-//
 //        Set<SubscribableContext> subscribableContexts = new 
HashSet<SubscribableContext>();
 //
-//        for (SubscribableDefinition subscribableDefinition : 
subscribableDefinitions) {
+//        for (SubscribableContext subscribableCtxt : subscribableCtxts) {
 //            // check is there is a related Subscribable Information
-//            SubscribableInfo subscribableInfo = 
subscribableInformation.get(subscribableDefinition.getAlias());
+//            SubscribableInfo subscribableInfo = 
subscribableInfoCtxts.get(subscribableCtxt.getAlias());
 //            if (subscribableInfo == null) {
 //                throw new CompositeApplicationDefinitionException("Related 
Subscribable Information not found for Subscribable with alias: "
-//                        + subscribableDefinition.getAlias());
+//                        + subscribableCtxt.getAlias());
 //            }
 //
 //            // check if Cartridge Type is valid
-//            if (subscribableDefinition.getType() == null || 
subscribableDefinition.getType().isEmpty()) {
+//            if (subscribableCtxt.getType() == null || 
subscribableCtxt.getType().isEmpty()) {
 //                throw new CompositeApplicationDefinitionException ("Invalid 
Cartridge Type specified : [ "
-//                        + subscribableDefinition.getType() + " ]");
+//                        + subscribableCtxt.getType() + " ]");
 //            }
 //
 //            // check if a cartridge with relevant type is already deployed. 
else, can't continue
-//            if (!isCartrigdeDeployed(subscribableDefinition.getType())) {
-//                throw new CompositeApplicationDefinitionException("No 
deployed Cartridge found with type [ " + subscribableDefinition.getType() +
+//            if (!isCartrigdeDeployed(subscribableCtxt.getType())) {
+//                throw new CompositeApplicationDefinitionException("No 
deployed Cartridge found with type [ " + subscribableCtxt.getType() +
 //                        " ] for Composite Application");
 //            }
 //
-//            
subscribableContexts.add(ParserUtils.convert(subscribableDefinition, 
subscribableInfo));
+//            subscribableContexts.add(ParserUtils.convert(subscribableCtxt, 
subscribableInfo));
 //        }
 //
 //        return subscribableContexts;
 //    }
+
+    private ClusterDataHolder getClusterInformation (List<SubscribableContext> 
subscribableCtxts,
+                                                               Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
+            throws ApplicationDefinitionException {
+
+        Map<String, String> clusterIdMap = new HashMap<String, String>();
+        Set<Cluster> clusters = new HashSet<Cluster>();
+
+        for (SubscribableContext subscribableCtxt : subscribableCtxts) {
+            // check is there is a related Subscribable Information
+            SubscribableInfoContext subscribableInfoCtxt = 
subscribableInfoCtxts.get(subscribableCtxt.getAlias());
+            if (subscribableInfoCtxt == null) {
+                throw new ApplicationDefinitionException("Related Subscribable 
Information Ctxt not found for Subscribable with alias: "
+                        + subscribableCtxt.getAlias());
+            }
+
+            // check if Cartridge Type is valid
+            if (subscribableCtxt.getType() == null || 
subscribableCtxt.getType().isEmpty()) {
+                throw new ApplicationDefinitionException ("Invalid Cartridge 
Type specified : [ "
+                        + subscribableCtxt.getType() + " ]");
+            }
+
+            // check if a cartridge with relevant type is already deployed. 
else, can't continue
+            Cartridge cartridge =  getCartridge(subscribableCtxt.getType());
+            if (cartridge == null) {
+                throw new ApplicationDefinitionException("No deployed 
Cartridge found with type [ " + subscribableCtxt.getType() +
+                        " ] for Composite Application");
+            }
+
+            Cluster cluster = getCluster(subscribableCtxt, 
subscribableInfoCtxt, cartridge);
+            clusters.add(cluster);
+            clusterIdMap.put(subscribableCtxt.getType(), 
cluster.getClusterId());
+        }
+
+        return new ClusterDataHolder(clusterIdMap, clusters);
+    }
+
+    private Cluster getCluster (SubscribableContext subscribableCtxt, 
SubscribableInfoContext subscribableInfoCtxt, Cartridge cartridge)
+            throws ApplicationDefinitionException {
+
+        // get hostname and cluster id
+        ClusterInformation clusterInfo;
+        if (cartridge.isMultiTenant()) {
+            clusterInfo = new MTClusterInformation();
+        } else {
+            clusterInfo = new STClusterInformation();
+        }
+
+        String hostname = clusterInfo.getHostName(subscribableCtxt.getAlias(), 
cartridge.getHostName());
+        String clusterId = 
clusterInfo.getClusterId(subscribableCtxt.getAlias(), 
subscribableCtxt.getType());
+
+        Cluster cluster = new Cluster(subscribableCtxt.getType(), clusterId, 
subscribableInfoCtxt.getDeploymentPolicy(),
+                subscribableInfoCtxt.getAutoscalingPolicy());
+
+        cluster.addHostName(hostname);
+        cluster.setLbCluster(false);
+        cluster.setStatus(ClusterStatus.Created);
+
+        return cluster;
+    }
+
+//    private GroupDataHolder getGroupInformation (List<GroupContext> 
groupCtxts,
+//                                                 Map<String, 
SubscribableInfoContext> subscribableInformation,
+//                                                 Map<String, GroupContext> 
definedGroupCtxts)
+//            throws ApplicationDefinitionException {
 //
-//    private boolean isCartrigdeDeployed (String cartridgeType) throws 
CompositeApplicationDefinitionException {
-//
-//        CloudControllerServiceClient ccServiceClient;
-//
-//        try {
-//            ccServiceClient = 
CloudControllerServiceClient.getServiceClient();
+//        Set<GroupContext> groupContexts = new HashSet<GroupContext>();
 //
-//        } catch (AxisFault axisFault) {
-//            throw new CompositeApplicationDefinitionException(axisFault);
+//        for (GroupContext groupCtxt : groupCtxts) {
+//            groupContexts.add(getGroup(groupCtxt, subscribableInformation, 
definedGroupCtxts));
 //        }
 //
-//        try {
-//            return ccServiceClient.getCartridgeInfo(cartridgeType) != null;
-//
-//        } catch (RemoteException e) {
-//            throw new CompositeApplicationDefinitionException(e);
-//
-//        } catch 
(CloudControllerServiceUnregisteredCartridgeExceptionException e) {
-//            throw new CompositeApplicationDefinitionException(e);
-//        }
+//        //Set<GroupContext> topLevelGroupContexts = 
getTopLevelGroupContexts(groupContexts);
+//        Set<GroupContext> nestedGroupContexts = new HashSet<GroupContext>();
+//        getNestedGroupContexts(nestedGroupContexts, groupContexts);
+//        filterDuplicatedGroupContexts(groupContexts, nestedGroupContexts);
 //    }
 
+    private Cartridge getCartridge (String cartridgeType)  {
+
+        return 
FasterLookUpDataHolder.getInstance().getCartridge(cartridgeType);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/ParserUtils.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/ParserUtils.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/ParserUtils.java
new file mode 100644
index 0000000..7ae9010
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/parser/ParserUtils.java
@@ -0,0 +1,43 @@
+/*
+ * 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.cloud.controller.application.parser;
+
+import org.apache.stratos.messaging.domain.topology.StartupOrder;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class ParserUtils {
+
+    public static Set<StartupOrder> convert 
(org.apache.stratos.cloud.controller.pojo.StartupOrder [] startupOrderArr) {
+
+        Set<StartupOrder> startupOrders = new HashSet<StartupOrder>();
+
+        if (startupOrderArr == null) {
+            return startupOrders;
+        }
+
+        for (int i = 0; i < startupOrderArr.length ; i++) {
+            startupOrders.add(new StartupOrder(startupOrderArr[i].getStart(), 
startupOrderArr[i].getAfter()));
+        }
+
+        return startupOrders;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
index aa24cec..2a1c52c 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
@@ -24,10 +24,12 @@ import com.google.common.net.InetAddresses;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import 
org.apache.stratos.cloud.controller.application.parser.DefaultApplicationParser;
 import 
org.apache.stratos.cloud.controller.concurrent.PartitionValidatorCallable;
 import org.apache.stratos.cloud.controller.concurrent.ThreadExecutor;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 import org.apache.stratos.cloud.controller.exception.*;
+import org.apache.stratos.cloud.controller.interfaces.ApplicationParser;
 import org.apache.stratos.cloud.controller.interfaces.CloudControllerService;
 import org.apache.stratos.cloud.controller.interfaces.Iaas;
 import org.apache.stratos.cloud.controller.persist.Deserializer;
@@ -1398,9 +1400,10 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
 
     public void deployApplicationDefinition (ApplicationContext 
applicationContext) throws ApplicationDefinitionException {
 
-        // TODO:
-        // 1. parse and create Composite App tree
-        // 2. send the ApplicationCreated event
+        ApplicationParser applicationParser = new DefaultApplicationParser();
+        ApplicationDataHolder applicationDataHolder = 
applicationParser.parse(applicationContext);
+
+        TopologyBuilder.handleApplicationDepolyed(applicationDataHolder);
     }
 
     private List<ConfigCompositeApplication> restoreConfigCompositeApplication 
() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java
index fc9fad8..48bae4f 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/ApplicationParser.java
@@ -20,9 +20,10 @@
 package org.apache.stratos.cloud.controller.interfaces;
 
 import 
org.apache.stratos.cloud.controller.exception.ApplicationDefinitionException;
+import org.apache.stratos.cloud.controller.pojo.ApplicationDataHolder;
 import org.apache.stratos.messaging.domain.topology.Application;
 
 public interface ApplicationParser {
 
-    public Application parse (Object obj) throws 
ApplicationDefinitionException;
+    public ApplicationDataHolder parse (Object obj) throws 
ApplicationDefinitionException;
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java
new file mode 100644
index 0000000..0007ab8
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationDataHolder.java
@@ -0,0 +1,48 @@
+/*
+ * 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.cloud.controller.pojo;
+
+import org.apache.stratos.messaging.domain.topology.Application;
+import org.apache.stratos.messaging.domain.topology.Cluster;
+
+import java.util.Set;
+
+public class ApplicationDataHolder {
+
+    private Application application;
+
+    private Set<Cluster> clusters;
+
+    public Application getApplication() {
+        return application;
+    }
+
+    public void setApplication(Application application) {
+        this.application = application;
+    }
+
+    public Set<Cluster> getClusters() {
+        return clusters;
+    }
+
+    public void setClusters(Set<Cluster> clusters) {
+        this.clusters = clusters;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.java
new file mode 100644
index 0000000..bc4f7eb
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ClusterDataHolder.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.cloud.controller.pojo;
+
+import org.apache.stratos.messaging.domain.topology.Cluster;
+
+import java.util.Map;
+import java.util.Set;
+
+public class ClusterDataHolder {
+
+    // Cluster Id map, key = service name
+    private Map<String, String> clusterIdMap;
+
+    // Cluster object collection
+    private Set<Cluster> clusters;
+
+   public ClusterDataHolder (Map<String, String> clusterIdMap, Set<Cluster> 
clusters) {
+       this.clusterIdMap = clusterIdMap;
+       this.clusters = clusters;
+   }
+
+    public Map<String, String> getClusterIdMap() {
+        return clusterIdMap;
+    }
+
+    public Set<Cluster> getClusters() {
+        return clusters;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/GroupDataHolder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/GroupDataHolder.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/GroupDataHolder.java
new file mode 100644
index 0000000..534814f
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/GroupDataHolder.java
@@ -0,0 +1,67 @@
+/*
+ * 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.cloud.controller.pojo;
+
+import org.apache.stratos.messaging.domain.topology.Group;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class GroupDataHolder {
+
+    // Sub Group Map, key = Group.name
+    private Map<String, Group> groupMap;
+    // Cluster Data Holder
+    private ClusterDataHolder clusterDataHolder;
+    // nested Group Data
+    private GroupDataHolder groupDataHolder;
+
+    public GroupDataHolder () {
+        this.groupMap = new HashMap<String, Group>();
+    }
+
+    public void addGroup (Group group) {
+        groupMap.put(group.getName(), group);
+    }
+
+    public void addGroups (Map<String, Group> groupNameToGroup) {
+        groupMap.putAll(groupNameToGroup);
+    }
+
+    public Map<String, Group> getGroupMap() {
+        return groupMap;
+    }
+
+    public ClusterDataHolder getClusterDataHolder() {
+        return clusterDataHolder;
+    }
+
+    public GroupDataHolder getGroupDataHolder() {
+        return groupDataHolder;
+    }
+
+    public void setGroupDataHolder(GroupDataHolder groupDataHolder) {
+        this.groupDataHolder = groupDataHolder;
+    }
+
+    public void setClusterDataHolder(ClusterDataHolder clusterDataHolder) {
+        this.clusterDataHolder = clusterDataHolder;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java
index 898dcdd..7dfdb44 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ApplicationContext.java
@@ -19,8 +19,6 @@
 
 package org.apache.stratos.cloud.controller.pojo.application;
 
-import java.util.List;
-
 public class ApplicationContext {
 
     private String applicationId;
@@ -29,7 +27,7 @@ public class ApplicationContext {
 
     private ComponentContext componentContext;
 
-    private List<SubscribableInfoContext> subscribableInfoContexts;
+    private SubscribableInfoContext[] subscribableInfoContexts;
 
     public String getApplicationId() {
         return applicationId;
@@ -55,11 +53,11 @@ public class ApplicationContext {
         this.componentContext = componentContext;
     }
 
-    public List<SubscribableInfoContext> getSubscribableInfoContext() {
+    public SubscribableInfoContext[] getSubscribableInfoContext() {
         return subscribableInfoContexts;
     }
 
-    public void setSubscribableInfoContext(List<SubscribableInfoContext> 
subscribableInfoContexts) {
+    public void setSubscribableInfoContext(SubscribableInfoContext[] 
subscribableInfoContexts) {
         this.subscribableInfoContexts = subscribableInfoContexts;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java
index f8ab53b..d1a13a5 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/ComponentContext.java
@@ -19,30 +19,28 @@
 
 package org.apache.stratos.cloud.controller.pojo.application;
 
-import java.util.List;
-
 public class ComponentContext {
 
-    private List<GroupContext> groupContexts;
+    private GroupContext[] groupContexts;
 
-    private List<SubscribableContext> subscribableContexts;
+    private SubscribableContext[] subscribableContexts;
 
     private DependencyContext dependencyContext;
 
 
-    public List<GroupContext> getGroupContexts() {
+    public GroupContext[] getGroupContexts() {
         return groupContexts;
     }
 
-    public void setGroupContexts(List<GroupContext> groupContexts) {
+    public void setGroupContexts(GroupContext[] groupContexts) {
         this.groupContexts = groupContexts;
     }
 
-    public List<SubscribableContext> getSubscribableContexts() {
+    public SubscribableContext[] getSubscribableContexts() {
         return subscribableContexts;
     }
 
-    public void setSubscribableContexts(List<SubscribableContext> 
subscribableContexts) {
+    public void setSubscribableContexts(SubscribableContext[] 
subscribableContexts) {
         this.subscribableContexts = subscribableContexts;
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java
index fe7331d..2b31729 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/DependencyContext.java
@@ -19,19 +19,18 @@
 
 package org.apache.stratos.cloud.controller.pojo.application;
 
-import java.util.List;
 
 public class DependencyContext {
 
-    private List<StartupOrderContext> startupOrderContexts;
+    private StartupOrderContext[] startupOrderContexts;
 
     private String killBehaviour;
 
-    public List<StartupOrderContext> getStartupOrder() {
+    public StartupOrderContext[] getStartupOrderContext() {
         return startupOrderContexts;
     }
 
-    public void setStartupOrder(List<StartupOrderContext> 
startupOrderContexts) {
+    public void setStartupOrderContext(StartupOrderContext[] 
startupOrderContexts) {
         this.startupOrderContexts = startupOrderContexts;
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java
index 54908c1..fda4bec 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/GroupContext.java
@@ -19,8 +19,6 @@
 
 package org.apache.stratos.cloud.controller.pojo.application;
 
-import java.util.List;
-
 public class GroupContext {
 
     private String name;
@@ -31,9 +29,9 @@ public class GroupContext {
 
     private String autoscalingPolicy;
 
-    private List<SubscribableContext> subscribableContexts;
+    private SubscribableContext[] subscribableContexts;
 
-    private List<GroupContext> groupContexts;
+    private GroupContext[] groupContexts;
 
 
     public String getName() {
@@ -68,19 +66,19 @@ public class GroupContext {
         this.autoscalingPolicy = autoscalingPolicy;
     }
 
-    public List<SubscribableContext> getSubscribableContexts() {
+    public SubscribableContext[] getSubscribableContexts() {
         return subscribableContexts;
     }
 
-    public void setSubscribableContexts(List<SubscribableContext> 
subscribableContexts) {
+    public void setSubscribableContexts(SubscribableContext[] 
subscribableContexts) {
         this.subscribableContexts = subscribableContexts;
     }
 
-    public List<GroupContext> getGroupContexts() {
+    public GroupContext[] getGroupContexts() {
         return groupContexts;
     }
 
-    public void setGroupContexts(List<GroupContext> groupContexts) {
+    public void setGroupContexts(GroupContext[] groupContexts) {
         this.groupContexts = groupContexts;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java
index 1312039..3c2a2da 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/application/StartupOrderContext.java
@@ -25,6 +25,10 @@ public class StartupOrderContext {
 
     private String after;
 
+    public StartupOrderContext () {
+
+    }
+
     public String getStart() {
         return start;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/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 a051cf4..4420b0b 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
@@ -613,6 +613,26 @@ public class TopologyBuilder {
         }
     }
 
+    public static void handleApplicationDepolyed (ApplicationDataHolder 
applicationDataHolder) {
+
+        Topology topology = TopologyManager.getTopology();
+        try {
+            TopologyManager.acquireWriteLock();
+
+            for (Cluster cluster : applicationDataHolder.getClusters()) {
+                String cartridgeType = cluster.getServiceName();
+                topology.getService(cartridgeType).addCluster(cluster);
+                log.info("Added Cluster " + cluster.toString() + " to Topology 
for Application with id: " + applicationDataHolder.getApplication().getId());
+            }
+            TopologyManager.updateTopology(topology);
+
+            
TopologyEventPublisher.sendApplicationCreatedEvent(applicationDataHolder.getApplication());
+
+        } finally {
+            TopologyManager.releaseWriteLock();
+        }
+    }
+
     public static void 
handleCompositeApplicationCreated(ConfigCompositeApplication messConfigApp) {
         Topology topology = TopologyManager.getTopology();
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
index 0ffc0ff..ee10f9d 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
@@ -90,6 +90,15 @@ public class TopologyEventPublisher {
 
     }
 
+    public static void sendApplicationCreatedEvent (Application application) {
+
+        if(log.isInfoEnabled()) {
+            log.info("Publishing Application created event: " + 
application.toString());
+        }
+
+        publishEvent(new ApplicationCreatedEvent(application));
+    }
+
     public static void sendClusterRemovedEvent(ClusterContext ctxt, String 
deploymentPolicy) {
 
         ClusterRemovedEvent clusterRemovedEvent = new 
ClusterRemovedEvent(ctxt.getCartridgeType(), ctxt.getClusterId(), 
deploymentPolicy, ctxt.isLbCluster());

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java
 
b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java
index 5c31ff9..92b9da7 100644
--- 
a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java
+++ 
b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java
@@ -24,18 +24,11 @@ import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.transport.http.HTTPConstants;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import 
org.apache.stratos.cloud.controller.stub.pojo.application.ApplicationContext;
+import org.apache.stratos.cloud.controller.stub.*;
 import org.apache.stratos.cloud.controller.stub.pojo.*;
 import org.apache.stratos.manager.internal.DataHolder;
 import org.apache.stratos.manager.utils.CartridgeConstants;
-import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeDefinitionExceptionException;
-import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
-import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidClusterExceptionException;
-import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException;
-import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidIaasProviderExceptionException;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceStub;
-import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException;
-import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredClusterExceptionException;
-import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidServiceGroupExceptionException;
 
 import java.rmi.RemoteException;
 import java.util.Iterator;
@@ -126,11 +119,11 @@ public class CloudControllerServiceClient {
        }
 
 
-       public void deployCompositeApplicationDefinition 
(CompositeApplicationDefinition compositeApplicationDefinition) 
-                       throws RemoteException, 
CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException, 
CloudControllerServiceInvalidIaasProviderExceptionException  
-                {
+       public void deployApplicationDefinition(ApplicationContext 
applicationContext)
+            throws RemoteException, 
CloudControllerServiceInvalidCompositeApplicationDefinitionExceptionException,
+            CloudControllerServiceInvalidIaasProviderExceptionException, 
CloudControllerServiceApplicationDefinitionExceptionException {
 
-               
stub.deployCompositeApplicationDefinition(compositeApplicationDefinition);
+               stub.deployApplicationDefinition(applicationContext);
 
        }
        

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
 
b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
index 4cb77f9..d7418c7 100644
--- 
a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
+++ 
b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
@@ -19,7 +19,6 @@
 
 package org.apache.stratos.manager.composite.application.beans;
 
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import java.util.List;
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
 
b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
index 9a2ea18..8735ab3 100644
--- 
a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
+++ 
b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
@@ -229,19 +229,24 @@ public class DefaultServiceGroupDeployer implements 
ServiceGroupDeployer {
        servicegroup.setCartridges(cartridges);
        
        DependencyDefinitions depDefs = 
serviceGroupDefinition.getDependencies();
-       List<StartupOrderDefinition> startDefs = depDefs.getStartupOrder();
-       
-       Dependencies deps = new Dependencies();
-       StartupOrder [] startups = new StartupOrder [startDefs.size()];
-       for (int i = 0; i < startDefs.size(); i++) {
-               StartupOrderDefinition stDef = startDefs.get(i);
-               StartupOrder st = new StartupOrder();
-               st.setStart(stDef.getStart());
-               st.setAfter(stDef.getAfter());
-               startups[i] = st;
-       }
-       deps.setStartupOrder(startups);
-       servicegroup.setDependencies(deps);
+        if (depDefs != null) {
+            List<StartupOrderDefinition> startDefs = depDefs.getStartupOrder();
+
+            Dependencies deps = new Dependencies();
+            if (startDefs != null) {
+                StartupOrder [] startups = new StartupOrder [startDefs.size()];
+                for (int i = 0; i < startDefs.size(); i++) {
+                    StartupOrderDefinition stDef = startDefs.get(i);
+                    StartupOrder st = new StartupOrder();
+                    st.setStart(stDef.getStart());
+                    st.setAfter(stDef.getAfter());
+                    startups[i] = st;
+                }
+                deps.setStartupOrder(startups);
+            }
+            deps.setKillBehaviour(depDefs.getKillBehaviour());
+            servicegroup.setDependencies(deps);
+        }
        
        return servicegroup;
     }
@@ -252,23 +257,33 @@ public class DefaultServiceGroupDeployer implements 
ServiceGroupDeployer {
        String [] cartridges = serviceGroup.getCartridges();
        String [] subGroups = serviceGroup.getSubGroups();
        Dependencies deps = serviceGroup.getDependencies();
-       StartupOrder [] startupOrders = deps.getStartupOrder();
-       
-       List<String> cartridgesDef = new 
ArrayList<String>(Arrays.asList(cartridges));
-       List<String> subGroupsDef = new 
ArrayList<String>(Arrays.asList(subGroups));
-       DependencyDefinitions depsDef = new DependencyDefinitions();
-       List<StartupOrderDefinition> startupsDef = new 
ArrayList<StartupOrderDefinition>();
-       for (StartupOrder startupOrder :  startupOrders) {
-               StartupOrderDefinition astartupDef = new 
StartupOrderDefinition();
-               astartupDef.setAfter(startupOrder.getAfter());
-               astartupDef.setStart(startupOrder.getStart());
-               startupsDef.add(astartupDef);
-       }
-       depsDef.setStartupOrder(startupsDef);
-       depsDef.setKillBehaviour(deps.getKillBehaviour());
+
+        if (deps != null) {
+            DependencyDefinitions depsDef = new DependencyDefinitions();
+            StartupOrder [] startupOrders = deps.getStartupOrder();
+            if (startupOrders != null && startupOrders.length > 0) {
+                List<StartupOrderDefinition> startupsDef = new 
ArrayList<StartupOrderDefinition>();
+                for (StartupOrder startupOrder :  startupOrders) {
+                    if (startupOrder != null) {
+                        StartupOrderDefinition astartupDef = new 
StartupOrderDefinition();
+                        astartupDef.setAfter(startupOrder.getAfter());
+                        astartupDef.setStart(startupOrder.getStart());
+                        startupsDef.add(astartupDef);
+                    }
+                }
+
+                depsDef.setStartupOrder(startupsDef);
+            }
+
+            depsDef.setKillBehaviour(deps.getKillBehaviour());
+            servicegroupDef.setDependencies(depsDef);
+        }
+
+        List<String> cartridgesDef = new 
ArrayList<String>(Arrays.asList(cartridges));
+        List<String> subGroupsDef = new 
ArrayList<String>(Arrays.asList(subGroups));
+
        servicegroupDef.setCartridges(cartridgesDef);
        servicegroupDef.setSubGroups(subGroupsDef);
-       servicegroupDef.setDependencies(depsDef);
    
        return servicegroupDef;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java
index 5e57a5d..e442996 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Application.java
@@ -27,6 +27,7 @@ import java.util.Map;
 
 public class Application implements SubscribableBehavior {
 
+    private static final long serialVersionUID = -5092959597171649688L;
     // Unique id for the Application, defined in Application Definition
     private String id;
     // Key used for authentication (with metadata service, etc.)
@@ -51,6 +52,11 @@ public class Application implements SubscribableBehavior {
     }
 
     @Override
+    public void setGroups(Map<String, Group> groupNameToGroup) {
+        groupMap.putAll(groupNameToGroup);
+    }
+
+    @Override
     public Group getGroup(String groupName) {
         return groupMap.get(groupName);
     }
@@ -76,6 +82,11 @@ public class Application implements SubscribableBehavior {
     }
 
     @Override
+    public void setClusterIds(Map<String, String> serviceNameToClusterId) {
+        clusterIdMap.putAll(serviceNameToClusterId);
+    }
+
+    @Override
     public String getClusterId(String serviceName) {
         return clusterIdMap.get(serviceName);
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
index 08bd262..80a2277 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
@@ -210,5 +210,22 @@ public class Cluster implements Serializable {
     public void setStatus(ClusterStatus status) {
         this.status = status;
     }
+
+    public boolean equals(Object other) {
+        if(other == null || !(other instanceof Cluster)) {
+            return false;
+        }
+
+        if(this == other) {
+            return true;
+        }
+
+        Cluster that = (Cluster)other;
+        return this.clusterId.equals(that.clusterId);
+    }
+
+    public int hashCode () {
+        return clusterId.hashCode();
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java
index b25b7ad..b5992ad 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/DependencyOrder.java
@@ -32,6 +32,10 @@ public class DependencyOrder {
         this.startupOrders = new HashSet<StartupOrder>();
     }
 
+    public void setStartupOrders (Set<StartupOrder> startupOrders) {
+        this.startupOrders.addAll(startupOrders);
+    }
+
     public Set<StartupOrder> getStartupOrders() {
         return startupOrders;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java
index 66cdb66..16ec775 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Group.java
@@ -25,15 +25,20 @@ import java.util.Map;
 
 public class Group implements SubscribableBehavior {
 
+    private static final long serialVersionUID = 8347096598203655846L;
     // Name of the Group, specified in Group Definition
     private String name;
     // Group alias
     private String alias;
+    // Group deployment policy
+    private String deploymentPolicy;
+    // Group level autoscaling policy
+    private String autoscalingPolicy;
     // Dependency Order
     private DependencyOrder dependencyOrder;
     // Sub Group Map, key = Group.name
     private Map<String, Group> groupMap;
-    // Cluster Id map, key = service name
+    // Cluster id map, key = service name
     private Map<String, String> clusterIdMap;
 
     public Group (String name, String alias) {
@@ -49,6 +54,11 @@ public class Group implements SubscribableBehavior {
     }
 
     @Override
+    public void setGroups(Map<String, Group> groupNameToGroup) {
+        groupMap.putAll(groupNameToGroup);
+    }
+
+    @Override
     public Group getGroup(String groupName) {
         return groupMap.get(groupName);
     }
@@ -74,6 +84,11 @@ public class Group implements SubscribableBehavior {
     }
 
     @Override
+    public void setClusterIds(Map<String, String> serviceNameToClusterId) {
+        clusterIdMap.putAll(serviceNameToClusterId);
+    }
+
+    @Override
     public String getClusterId(String serviceName) {
         return clusterIdMap.get(serviceName);
     }
@@ -90,4 +105,37 @@ public class Group implements SubscribableBehavior {
     public String getAlias() {
         return alias;
     }
+
+    public String getDeploymentPolicy() {
+        return deploymentPolicy;
+    }
+
+    public void setDeploymentPolicy(String deploymentPolicy) {
+        this.deploymentPolicy = deploymentPolicy;
+    }
+
+    public String getAutoscalingPolicy() {
+        return autoscalingPolicy;
+    }
+
+    public void setAutoscalingPolicy(String autoscalingPolicy) {
+        this.autoscalingPolicy = autoscalingPolicy;
+    }
+
+    public boolean equals(Object other) {
+        if(other == null || !(other instanceof Group)) {
+            return false;
+        }
+
+        if(this == other) {
+            return true;
+        }
+
+        Group that = (Group)other;
+        return this.name.equals(that.name) && this.alias.equals(that.alias);
+    }
+
+    public int hashCode () {
+        return name.hashCode() + alias.hashCode();
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/66f92f79/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java
index 05e42d1..b66b0c7 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/SubscribableBehavior.java
@@ -21,11 +21,14 @@ package org.apache.stratos.messaging.domain.topology;
 
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.Map;
 
 public interface SubscribableBehavior extends Serializable {
 
     public void addGroup (Group group);
 
+    public void setGroups (Map<String, Group> groupNameToGroup);
+
     public Group getGroup (String groupName);
 
     public Collection<Group> getGroups ();
@@ -36,6 +39,8 @@ public interface SubscribableBehavior extends Serializable {
 
     public void addClusterId (String serviceName, String clusterId);
 
+    public void setClusterIds (Map<String,String> serviceNameToClusterId);
+
     public String getClusterId (String serviceName);
 
     public Collection<String> getClusterIds ();

Reply via email to