Repository: stratos
Updated Branches:
  refs/heads/4.0.0-grouping b2a254895 -> 0434c2ffd


refactoring App definition parsing logic - part 1


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

Branch: refs/heads/4.0.0-grouping
Commit: 0434c2ffd39238a79cdd9ad735d84d8310cba9f6
Parents: b2a2548
Author: Isuru Haththotuwa <[email protected]>
Authored: Wed Sep 24 01:09:15 2014 +0530
Committer: Isuru Haththotuwa <[email protected]>
Committed: Wed Sep 24 01:09:15 2014 +0530

----------------------------------------------------------------------
 .../application/ApplicationUtils.java           |  31 +-
 .../parser/DefaultApplicationParser.java        | 363 +++++++++++--------
 .../impl/CloudControllerServiceImpl.java        |  18 +-
 .../interfaces/ApplicationParser.java           |  11 +-
 .../internal/CloudControllerDSComponent.java    |   2 +
 .../pojo/ApplicationClusterContext.java         | 116 ++++++
 .../controller/pojo/ApplicationDataHolder.java  |  12 +-
 .../controller/pojo/ClusterDataHolder.java      | 122 +++----
 .../controller/pojo/payload/MetaDataHolder.java |  93 +++++
 .../pojo/payload/PayloadDataHolder.java         |  93 -----
 .../controller/topology/TopologyBuilder.java    |  36 +-
 11 files changed, 545 insertions(+), 352 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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 43f9786..ce9b112 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
@@ -23,8 +23,7 @@ import org.apache.stratos.cloud.controller.pojo.Cartridge;
 import org.apache.stratos.cloud.controller.pojo.PortMapping;
 import 
org.apache.stratos.cloud.controller.pojo.application.SubscribableContext;
 import 
org.apache.stratos.cloud.controller.pojo.application.SubscribableInfoContext;
-import org.apache.stratos.cloud.controller.pojo.payload.PayloadDataHolder;
-import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder;
 import org.apache.stratos.metadata.client.config.MetaDataClientConfig;
 
 import java.util.*;
@@ -69,13 +68,13 @@ public class ApplicationUtils {
         return globalProperties;
     }
 
-    public static PayloadDataHolder getClusterLevelPayloadData (String appId, 
String groupName, int tenantId, String key,
-                                                                Cluster 
cluster,
+    public static MetaDataHolder getClusterLevelPayloadData (String appId, 
String groupName, int tenantId, String key,
+                                                                String 
hostname, String tenantRange, String clusterId,
                                                                 
SubscribableContext subscribableCtxt,
                                                                 
SubscribableInfoContext subscribableInfoCtxt,
                                                                 Cartridge 
cartridge) {
 
-        PayloadDataHolder payloadDataHolder = new PayloadDataHolder(appId, 
subscribableCtxt.getType(), cluster.getClusterId());
+        MetaDataHolder metaDataHolder = new MetaDataHolder(appId, 
subscribableCtxt.getType(), clusterId);
 
         Properties clusterLevelPayloadProperties = new Properties();
         // app id
@@ -89,22 +88,22 @@ public class ApplicationUtils {
             clusterLevelPayloadProperties.put("SERVICE_NAME", 
subscribableCtxt.getType());
         }
         // host name
-        if  (cluster.getHostNames().get(0) != null) {
-            clusterLevelPayloadProperties.put("HOST_NAME", 
cluster.getHostNames().get(0));
+        if  (hostname != null) {
+            clusterLevelPayloadProperties.put("HOST_NAME", hostname);
         }
         // multi tenant
         clusterLevelPayloadProperties.put("MULTITENANT", 
String.valueOf(cartridge.isMultiTenant()));
         // tenant range
-        if (cluster.getTenantRange() != null) {
-            clusterLevelPayloadProperties.put("TENANT_RANGE", 
cluster.getTenantRange());
+        if (tenantRange != null) {
+            clusterLevelPayloadProperties.put("TENANT_RANGE", tenantRange);
         }
         // cartridge alias
         if (subscribableCtxt.getAlias() != null) {
             clusterLevelPayloadProperties.put("CARTRIDGE_ALIAS", 
subscribableCtxt.getAlias());
         }
         // cluster id
-        if (cluster.getClusterId() != null) {
-            clusterLevelPayloadProperties.put("CLUSTER_ID", 
cluster.getClusterId());
+        if (clusterId != null) {
+            clusterLevelPayloadProperties.put("CLUSTER_ID", clusterId);
         }
         // repo url
         if (subscribableInfoCtxt.getRepoUrl() != null) {
@@ -125,8 +124,8 @@ public class ApplicationUtils {
         // get global payload params
         
clusterLevelPayloadProperties.putAll(ApplicationUtils.getGlobalPayloadData());
 
-        payloadDataHolder.setProperties(clusterLevelPayloadProperties);
-        return payloadDataHolder;
+        metaDataHolder.setProperties(clusterLevelPayloadProperties);
+        return metaDataHolder;
     }
 
     private static String createPortMappingPayloadString (Cartridge cartridge) 
{
@@ -156,9 +155,11 @@ public class ApplicationUtils {
         payloadBuilder.append("CLUSTER_ID=" + clusterId);
         // meta data endpoint
         if (MetaDataClientConfig.getInstance().getMetaDataServiceBaseUrl() != 
null) {
-            payloadBuilder.append(",");
-            payloadBuilder.append("METADATA_ENDPOINT=" + 
MetaDataClientConfig.getInstance().getMetaDataServiceBaseUrl());
+            // TODO
+            //payloadBuilder.append(",");
+            //payloadBuilder.append("METADATA_ENDPOINT=" + 
MetaDataClientConfig.getInstance().getMetaDataServiceBaseUrl());
         }
+        payloadBuilder.append(",");
 
         return payloadBuilder;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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 a693942..341f42a 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
@@ -26,30 +26,35 @@ 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.exception.CloudControllerException;
 import org.apache.stratos.cloud.controller.interfaces.ApplicationParser;
 import org.apache.stratos.cloud.controller.pojo.*;
 import org.apache.stratos.cloud.controller.pojo.Cartridge;
 import org.apache.stratos.cloud.controller.pojo.application.*;
-import org.apache.stratos.cloud.controller.pojo.payload.PayloadDataHolder;
-import org.apache.stratos.cloud.controller.registry.RegistryManager;
+import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder;
 import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
 import org.apache.stratos.messaging.domain.topology.*;
 import org.apache.stratos.messaging.domain.topology.StartupOrder;
-import org.apache.stratos.messaging.util.Constants;
-import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
 import java.util.*;
-import java.util.Properties;
 
 public class DefaultApplicationParser implements ApplicationParser {
 
     private static Log log = LogFactory.getLog(DefaultApplicationParser.class);
 
-    private static FasterLookUpDataHolder dataHolder = 
FasterLookUpDataHolder.getInstance();
+//    private static FasterLookUpDataHolder dataHolder = 
FasterLookUpDataHolder.getInstance();
+
+    private Set<ApplicationClusterContext> applicationClusterContexts;
+
+    private Set<MetaDataHolder> metaDataHolders;
+
+    public DefaultApplicationParser () {
+
+        this.applicationClusterContexts = new 
HashSet<ApplicationClusterContext>();
+        this.metaDataHolders = new HashSet<MetaDataHolder>();
+    }
 
     @Override
-    public ApplicationDataHolder parse(Object obj) throws 
ApplicationDefinitionException {
+    public Application parse(Object obj) throws ApplicationDefinitionException 
{
 
         ApplicationContext applicationCtxt = null;
 
@@ -99,6 +104,16 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return buildCompositeAppStructure (applicationCtxt, definedGroups, 
subscribablesInfo);
     }
 
+    @Override
+    public Set<ApplicationClusterContext> getApplicationClusterContexts() 
throws ApplicationDefinitionException {
+        return applicationClusterContexts;
+    }
+
+    @Override
+    public Set<MetaDataHolder> getPayloadData() throws 
ApplicationDefinitionException {
+        return metaDataHolders;
+    }
+
     private Map<String, GroupContext> getDefinedGroups (ApplicationContext 
appCtxt) throws
             ApplicationDefinitionException {
 
@@ -180,7 +195,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return 
FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName) != null;
     }
 
-    private ApplicationDataHolder buildCompositeAppStructure 
(ApplicationContext appCtxt,
+    private Application buildCompositeAppStructure (ApplicationContext appCtxt,
                                                             Map<String, 
GroupContext> definedGroupCtxts,
                                                             Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
             throws ApplicationDefinitionException {
@@ -194,24 +209,24 @@ public class DefaultApplicationParser implements 
ApplicationParser {
 
         // following keeps track of all Clusters created for this application
         //Set<Cluster> clusters = new HashSet<Cluster>();
-        ClusterDataHolder clusterDataHolder = null;
+        //ClusterDataHolder clusterDataHolder = null;
+        Map<String, Set<String>> serviceNameToClusterIds;
 
         if (appCtxt.getComponents() != null) {
             // get top level Subscribables
             if (appCtxt.getComponents().getSubscribableContexts() != null) {
-                clusterDataHolder = 
getClusterInformation(appCtxt.getApplicationId(), appCtxt.getTenantId(),
+                serviceNameToClusterIds = 
parseLeafLevelSubscriptions(appCtxt.getApplicationId(), appCtxt.getTenantId(),
                         application.getKey(), null, 
Arrays.asList(appCtxt.getComponents().getSubscribableContexts()),
                         subscribableInfoCtxts);
-                application.setClusterIds(clusterDataHolder.getClusterIdMap());
-                //clusters.addAll(clusterDataHolder.getClusters());
+                application.setClusterIds(serviceNameToClusterIds);
+                
//clusters.addAll(clusterDataHolder.getApplicationClusterContexts());
             }
 
             // get Groups
             if (appCtxt.getComponents().getGroupContexts() != null) {
-                application.setGroups(getGroupInfo(appCtxt.getApplicationId(), 
appCtxt.getTenantId(),
-                        application.getKey(), clusterDataHolder,
-                        
Arrays.asList(appCtxt.getComponents().getGroupContexts()), 
subscribableInfoCtxts,
-                        definedGroupCtxts));
+                application.setGroups(parseGroups(appCtxt.getApplicationId(), 
appCtxt.getTenantId(),
+                        application.getKey(), 
Arrays.asList(appCtxt.getComponents().getGroupContexts()),
+                        subscribableInfoCtxts, definedGroupCtxts));
             }
 
             // get top level Dependency definitions
@@ -230,41 +245,38 @@ public class DefaultApplicationParser implements 
ApplicationParser {
 
         log.info("Application with id " + appCtxt.getApplicationId() + " 
parsed successfully");
 
-        ApplicationDataHolder applicationDataHolder = new 
ApplicationDataHolder();
-        assert clusterDataHolder != null;
-        applicationDataHolder.setClusters(clusterDataHolder.getClusters());
-        
applicationDataHolder.setPayloadDataHolders(clusterDataHolder.getPayloadDataHolders());
-        applicationDataHolder.setApplication(application);
+        return application;
+
+        //ApplicationDataHolder applicationDataHolder = new 
ApplicationDataHolder();
+        //assert clusterDataHolder != null;
+        
//applicationDataHolder.setClusters(clusterDataHolder.getApplicationClusterContexts());
+        
//applicationDataHolder.setPayloadDataHolders(clusterDataHolder.getPayloadDataHolders());
+        //applicationDataHolder.setApplication(application);
 
         // persist the information in FasterLookUpDataHolder
-        persist(dataHolder);
+        //persist(dataHolder);
 
-        return applicationDataHolder;
+        //return applicationDataHolder;
     }
 
-    private Map<String, Group> getGroupInfo (String appId, int tenantId, 
String key,
-                                             ClusterDataHolder 
clusterDataHolder,  List<GroupContext> groupCtxts,
-                                         Map<String, SubscribableInfoContext> 
subscribableInformation,
-                                         Map<String, GroupContext> 
definedGroupCtxts)
+    private Map<String, Group> parseGroups (String appId, int tenantId, String 
key, List<GroupContext> groupCtxts,
+                                           Map<String, 
SubscribableInfoContext> subscribableInformation,
+                                           Map<String, GroupContext> 
definedGroupCtxts)
             throws ApplicationDefinitionException {
 
-        Map<String, Group> groupNameToGroup = new HashMap<String, Group>();
+        Map<String, Group> groupAliasToGroup = new HashMap<String, Group>();
 
         for (GroupContext groupCtxt : groupCtxts) {
-            Group group = getGroup(appId, tenantId, key, clusterDataHolder, 
groupCtxt, subscribableInformation, definedGroupCtxts);
-            groupNameToGroup.put(group.getName(), group);
-//            if(groupNameToGroup.put(group.getName(), group) != null) {
-//                // Application Definition has same Group multiple times at 
the top-level
-//                handleError("Group [ " + group.getName() + " ] appears twice 
in the Application Definition's top level");
-//            }
+            Group group = parseGroup(appId, tenantId, key, groupCtxt, 
subscribableInformation, definedGroupCtxts);
+            groupAliasToGroup.put(group.getAlias(), group);
         }
 
-        //Set<GroupContext> topLevelGroupContexts = 
getTopLevelGroupContexts(groupNameToGroup);
+        //Set<GroupContext> topLevelGroupContexts = 
getTopLevelGroupContexts(groupAliasToGroup);
         Set<Group> nestedGroups = new HashSet<Group>();
-        getNestedGroupContexts(nestedGroups, groupNameToGroup.values());
-        filterDuplicatedGroupContexts(groupNameToGroup.values(), nestedGroups);
+        getNestedGroupContexts(nestedGroups, groupAliasToGroup.values());
+        filterDuplicatedGroupContexts(groupAliasToGroup.values(), 
nestedGroups);
 
-        return groupNameToGroup;
+        return groupAliasToGroup;
     }
 
     private void getNestedGroupContexts (Set<Group> nestedGroups, 
Collection<Group> groups) {
@@ -299,9 +311,9 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         }
     }
 
-    private Group getGroup(String appId, int tenantId, String key, 
ClusterDataHolder clusterDataHolder,
-                           GroupContext groupCtxt, 
Map<String,SubscribableInfoContext> subscribableInfoCtxts,
-                           Map<String, GroupContext> definedGroupCtxts)
+    private Group parseGroup (String appId, int tenantId, String key, 
GroupContext groupCtxt,
+                             Map<String, SubscribableInfoContext> 
subscribableInfoCtxts,
+                             Map<String, GroupContext> definedGroupCtxts)
             throws ApplicationDefinitionException {
 
         // check if are in the defined Group set
@@ -324,21 +336,22 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         dependencyOrder.setKillbehavior(getKillbehaviour(groupCtxt.getName()));
         group.setDependencyOrder(dependencyOrder);
 
-        ClusterDataHolder clusterDataHolderOfGroup;
+        //ClusterDataHolder clusterDataHolderOfGroup;
+        Map<String, Set<String>> serviceNameToClusterIds;
 
         // get group level Subscribables
         if (groupCtxt.getSubscribableContexts() != null) {
-            clusterDataHolderOfGroup = getClusterInformation(appId, tenantId, 
key, groupCtxt.getName(),
+            serviceNameToClusterIds = parseLeafLevelSubscriptions(appId, 
tenantId, key, groupCtxt.getName(),
                     Arrays.asList(groupCtxt.getSubscribableContexts()), 
subscribableInfoCtxts);
-            group.setClusterIds(clusterDataHolderOfGroup.getClusterIdMap());
-            //clusters.addAll(clusterDataHolderOfGroup.getClusters());
-            if (clusterDataHolder == null) {
-                clusterDataHolder = clusterDataHolderOfGroup;
-            } else {
-                
clusterDataHolder.getClusters().addAll(clusterDataHolderOfGroup.getClusters());
-                
clusterDataHolder.getClusterIdMap().putAll(clusterDataHolderOfGroup.getClusterIdMap());
-                
clusterDataHolder.getPayloadDataHolders().addAll(clusterDataHolderOfGroup.getPayloadDataHolders());
-            }
+            group.setClusterIds(serviceNameToClusterIds);
+            
//clusters.addAll(clusterDataHolderOfGroup.getApplicationClusterContexts());
+//            if (clusterDataHolder == null) {
+//                clusterDataHolder = clusterDataHolderOfGroup;
+//            } else {
+//                
clusterDataHolder.getApplicationClusterContexts().addAll(clusterDataHolderOfGroup.getApplicationClusterContexts());
+//                
clusterDataHolder.getClusterIdMap().putAll(clusterDataHolderOfGroup.getClusterIdMap());
+//                
//clusterDataHolder.getPayloadDataHolders().addAll(clusterDataHolderOfGroup.getPayloadDataHolders());
+//            }
         }
 
         // get nested groups
@@ -348,7 +361,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
             for (GroupContext subGroupCtxt : groupCtxt.getGroupContexts()) {
                 // get the complete Group Definition
                 subGroupCtxt = definedGroupCtxts.get(subGroupCtxt.getAlias());
-                Group nestedGroup = getGroup(appId, tenantId, key, 
clusterDataHolder, subGroupCtxt,
+                Group nestedGroup = parseGroup(appId, tenantId, key, 
subGroupCtxt,
                         subscribableInfoCtxts,
                         definedGroupCtxts);
                 nestedGroups.put(nestedGroup.getName(), nestedGroup);
@@ -443,16 +456,17 @@ public class DefaultApplicationParser implements 
ApplicationParser {
 //        return subscribableContexts;
 //    }
 
-    private ClusterDataHolder getClusterInformation (String appId, int 
tenantId, String key, String groupName,
-                                                     List<SubscribableContext> 
subscribableCtxts,
-                                                     Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
+    private Map<String, Set<String>> parseLeafLevelSubscriptions (String 
appId, int tenantId, String key, String groupName,
+                                                                 
List<SubscribableContext> subscribableCtxts,
+                                                                 Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
             throws ApplicationDefinitionException {
 
         Map<String, Set<String>> clusterIdMap = new HashMap<String, 
Set<String>>();
-        Set<Cluster> clusters = new HashSet<Cluster>();
-        Set<PayloadDataHolder> payloadDataHolders = new 
HashSet<PayloadDataHolder>();
+//        Set<Cluster> clusters = new HashSet<Cluster>();
+        //Set<PayloadDataHolder> payloadDataHolders = new 
HashSet<PayloadDataHolder>();
 
         for (SubscribableContext subscribableCtxt : subscribableCtxts) {
+
             // check is there is a related Subscribable Information
             SubscribableInfoContext subscribableInfoCtxt = 
subscribableInfoCtxts.get(subscribableCtxt.getAlias());
             if (subscribableInfoCtxt == null) {
@@ -473,25 +487,56 @@ public class DefaultApplicationParser implements 
ApplicationParser {
                         " ] for Composite Application");
             }
 
-            Cluster cluster = getCluster(subscribableCtxt, 
subscribableInfoCtxt, cartridge);
-            addClusterId(clusterIdMap, subscribableCtxt.getType(), 
cluster.getClusterId());
+            // get hostname and cluster id
+            ClusterInformation clusterInfo;
+            assert cartridge != null;
+            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());
+
+            // create and collect this cluster's information
+            assert subscribableInfoCtxt != null;
+            ApplicationClusterContext appClusterCtxt = 
createApplicationClusterContext(subscribableCtxt.getType(),
+                    appId, groupName, clusterId, hostname, 
subscribableInfoCtxt.getDeploymentPolicy(), false);
+            this.applicationClusterContexts.add(appClusterCtxt);
+
+            // create cluster level meta data
+            
this.metaDataHolders.add(ApplicationUtils.getClusterLevelPayloadData(appId, 
groupName, tenantId, key,
+                    hostname, appClusterCtxt.getTenantRange(), clusterId, 
subscribableCtxt, subscribableInfoCtxt, cartridge));
+            ////////////
+            //Cluster cluster = getCluster(subscribableCtxt, 
subscribableInfoCtxt, cartridge);
+            addClusterId(clusterIdMap, subscribableCtxt.getType(), clusterId);
             //clusterIdMap.put(subscribableCtxt.getType(), 
cluster.getClusterId());
-            clusters.add(cluster);
+            //clusters.add(cluster);
 //            if (clusterIdMap.put(subscribableCtxt.getType(), 
cluster.getClusterId()) != null) {
 //                // Application Definition has same cartridge multiple times 
at the top-level
 //                handleError("Cartridge [ " + subscribableCtxt.getType() + " 
] appears twice in the Application Definition's top level");
 //            }
+            ///////////////
 
-            
payloadDataHolders.add(ApplicationUtils.getClusterLevelPayloadData(appId, 
groupName, tenantId, key, cluster,
-                    subscribableCtxt, subscribableInfoCtxt, cartridge));
-            createClusterContext(appId, groupName, subscribableCtxt.getType(), 
cluster.getClusterId(),
-                    cluster.getHostNames().get(0));
+//            createClusterContext(appId, groupName, 
subscribableCtxt.getType(), cluster.getClusterId(),
+//                    cluster.getHostNames().get(0));
         }
 
-        ClusterDataHolder clusterDataHolder = new 
ClusterDataHolder(clusterIdMap, clusters);
-        clusterDataHolder.setPayloadDataHolders(payloadDataHolders);
+        return clusterIdMap;
+        //return new ClusterDataHolder(clusterIdMap, clusters);
+        //clusterDataHolder.setPayloadDataHolders(payloadDataHolders);
+    }
+
+    private ApplicationClusterContext createApplicationClusterContext (String 
serviceType, String appId,
+                                                                       String 
groupName, String clusterId,
+                                                                       String 
hostname, String deploymentPolicy,
+                                                                       boolean 
isLB) {
 
-        return clusterDataHolder;
+        // Create text payload
+        String textPayload = ApplicationUtils.getTextPayload(appId, groupName, 
clusterId).toString();
+
+        return new ApplicationClusterContext(serviceType, clusterId, hostname, 
textPayload, deploymentPolicy, isLB);
     }
 
     public void addClusterId (Map<String, Set<String>> 
serviceNameToClusterIdsMap, String serviceName, String clusterId) {
@@ -507,95 +552,95 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         }
     }
 
-    private void createClusterContext (String appId, String groupName, String 
serviceType, String clusterId,
-                                              String hostName) throws 
ApplicationDefinitionException {
-
-        Cartridge cartridge;
-        if ((cartridge = dataHolder.getCartridge(serviceType)) == null) {
-
-            String msg = "Unregistered Cartridge type: " + serviceType;
-            log.error(msg);
-            throw new ApplicationDefinitionException(msg);
-        }
-
-        //Properties props = 
CloudControllerUtil.toJavaUtilProperties(registrant.getProperties());
-        //String property = props.getProperty(Constants.IS_LOAD_BALANCER);
-        //boolean isLb = property != null ? Boolean.parseBoolean(property) : 
false;
-        String payload = ApplicationUtils.getTextPayload(appId, groupName, 
clusterId).toString();
-
-        ClusterContext ctxt = buildClusterContext(cartridge, clusterId,
-                payload, hostName, null, false, null);
-
-        dataHolder.addClusterContext(ctxt);
-    }
-
-    private void persist(FasterLookUpDataHolder dataHolder) {
-        try {
-            RegistryManager.getInstance().persist(
-                    dataHolder);
-        } catch (RegistryException e) {
-
-            String msg = "Failed to persist the Cloud Controller data in 
registry. Further, transaction roll back also failed.";
-            log.fatal(msg);
-            throw new CloudControllerException(msg, e);
-        }
-    }
-
-    private ClusterContext buildClusterContext(Cartridge cartridge,
-                                               String clusterId, String 
payload, String hostName,
-                                               Properties props, boolean isLb, 
Persistence persistence) {
-
-
-        // initialize ClusterContext
-        ClusterContext ctxt = new ClusterContext(clusterId, 
cartridge.getType(), payload,
-                hostName, isLb);
-
-        String property = null;
-        if (props != null) {
-            property = props.getProperty(Constants.GRACEFUL_SHUTDOWN_TIMEOUT);
-        }
-
-        long timeout = property != null ? Long.parseLong(property) : 30000;
-
-        boolean persistanceRequired = false;
-        if(persistence != null){
-            persistanceRequired = persistence.isPersistanceRequired();
-        }
-
-        if(persistanceRequired){
-            ctxt.setVolumes(persistence.getVolumes());
-            ctxt.setVolumeRequired(true);
-        }else{
-            ctxt.setVolumeRequired(false);
-        }
-        ctxt.setTimeoutInMillis(timeout);
-        return ctxt;
-    }
-
-    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(Status.Created);
-
-        return cluster;
-    }
+//    private void createClusterContext (String appId, String groupName, 
String serviceType, String clusterId,
+//                                              String hostName) throws 
ApplicationDefinitionException {
+//
+//        Cartridge cartridge;
+//        if ((cartridge = dataHolder.getCartridge(serviceType)) == null) {
+//
+//            String msg = "Unregistered Cartridge type: " + serviceType;
+//            log.error(msg);
+//            throw new ApplicationDefinitionException(msg);
+//        }
+//
+//        //Properties props = 
CloudControllerUtil.toJavaUtilProperties(registrant.getProperties());
+//        //String property = props.getProperty(Constants.IS_LOAD_BALANCER);
+//        //boolean isLb = property != null ? Boolean.parseBoolean(property) : 
false;
+//        String payload = ApplicationUtils.getTextPayload(appId, groupName, 
clusterId).toString();
+//
+//        ClusterContext ctxt = buildClusterContext(cartridge, clusterId,
+//                payload, hostName, null, false, null);
+//
+//        dataHolder.addClusterContext(ctxt);
+//    }
+//
+//    private void persist(FasterLookUpDataHolder dataHolder) {
+//        try {
+//            RegistryManager.getInstance().persist(
+//                    dataHolder);
+//        } catch (RegistryException e) {
+//
+//            String msg = "Failed to persist the Cloud Controller data in 
registry. Further, transaction roll back also failed.";
+//            log.fatal(msg);
+//            throw new CloudControllerException(msg, e);
+//        }
+//    }
+//
+//    private ClusterContext buildClusterContext(Cartridge cartridge,
+//                                               String clusterId, String 
payload, String hostName,
+//                                               Properties props, boolean 
isLb, Persistence persistence) {
+//
+//
+//        // initialize ClusterContext
+//        ClusterContext ctxt = new ClusterContext(clusterId, 
cartridge.getType(), payload,
+//                hostName, isLb);
+//
+//        String property = null;
+//        if (props != null) {
+//            property = 
props.getProperty(Constants.GRACEFUL_SHUTDOWN_TIMEOUT);
+//        }
+//
+//        long timeout = property != null ? Long.parseLong(property) : 30000;
+//
+//        boolean persistanceRequired = false;
+//        if(persistence != null){
+//            persistanceRequired = persistence.isPersistanceRequired();
+//        }
+//
+//        if(persistanceRequired){
+//            ctxt.setVolumes(persistence.getVolumes());
+//            ctxt.setVolumeRequired(true);
+//        }else{
+//            ctxt.setVolumeRequired(false);
+//        }
+//        ctxt.setTimeoutInMillis(timeout);
+//        return ctxt;
+//    }
+//
+//    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());
+//                                                                             
                             Clo
+//        cluster.addHostName(hostname);
+//        cluster.setLbCluster(false);
+//        cluster.setStatus(Status.Created);
+//
+//        return cluster;
+//    }
 
 //    private GroupDataHolder getGroupInformation (List<GroupContext> 
groupCtxts,
 //                                                 Map<String, 
SubscribableInfoContext> subscribableInformation,
@@ -605,7 +650,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
 //        Set<GroupContext> groupContexts = new HashSet<GroupContext>();
 //
 //        for (GroupContext groupCtxt : groupCtxts) {
-//            groupContexts.add(getGroup(groupCtxt, subscribableInformation, 
definedGroupCtxts));
+//            groupContexts.add(parseGroup(groupCtxt, subscribableInformation, 
definedGroupCtxts));
 //        }
 //
 //        //Set<GroupContext> topLevelGroupContexts = 
getTopLevelGroupContexts(groupContexts);

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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 f0971c3..6f72e63 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
@@ -43,6 +43,7 @@ import 
org.apache.stratos.cloud.controller.topology.TopologyManager;
 import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import 
org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator;
+import org.apache.stratos.messaging.domain.topology.Application;
 import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication;
 import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
@@ -1427,12 +1428,21 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
     public void deployApplicationDefinition (ApplicationContext 
applicationContext) throws ApplicationDefinitionException {
 
         ApplicationParser applicationParser = new DefaultApplicationParser();
-        ApplicationDataHolder applicationDataHolder = 
applicationParser.parse(applicationContext);
+        Application application = applicationParser.parse(applicationContext);
 
-        //TODO: publish the data to the meta data service
-        applicationDataHolder.getPayloadDataHolders();
+        for (ApplicationClusterContext applicationClusterContext : 
applicationParser.getApplicationClusterContexts()) {
+            dataHolder.addClusterContext(new 
ClusterContext(applicationClusterContext.getClusterId(),
+                    applicationClusterContext.getCartridgeType(), 
applicationClusterContext.getTextPayload(),
+                    applicationClusterContext.getHostName(), 
applicationClusterContext.isLbCluster()));
+        }
+
+        //TODO: publish data to meta data service
+        applicationParser.getPayloadData();
 
-        TopologyBuilder.handleApplicationDeployed(applicationDataHolder);
+        TopologyBuilder.handleApplicationDeployed(application, 
applicationParser.getApplicationClusterContexts(),
+                applicationParser.getPayloadData());
+
+        persist();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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 48bae4f..77cbe33 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,10 +20,17 @@
 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.cloud.controller.pojo.ApplicationClusterContext;
+import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder;
 import org.apache.stratos.messaging.domain.topology.Application;
 
+import java.util.Set;
+
 public interface ApplicationParser {
 
-    public ApplicationDataHolder parse (Object obj) throws 
ApplicationDefinitionException;
+    public Application parse (Object obj) throws 
ApplicationDefinitionException;
+
+    public Set<ApplicationClusterContext> getApplicationClusterContexts() 
throws ApplicationDefinitionException;
+
+    public Set<MetaDataHolder> getPayloadData () throws 
ApplicationDefinitionException;
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
index b1d6c6d..572e619 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
@@ -89,6 +89,8 @@ public class CloudControllerDSComponent {
                        TopologySynchronizerTaskScheduler
                                                
.schedule(ServiceReferenceHolder.getInstance()
                                                                
.getTaskService());
+
+
                        
         } catch (Throwable e) {
             log.error("******* Cloud Controller Service bundle is failed to 
activate ****", e);

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationClusterContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationClusterContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationClusterContext.java
new file mode 100644
index 0000000..fb37d99
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/ApplicationClusterContext.java
@@ -0,0 +1,116 @@
+/*
+ * 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;
+
+public class ApplicationClusterContext {
+
+    // cluster id
+    private String clusterId;
+    // cartridge type
+    private String cartridgeType;
+    // payload as a String
+    private String textPayload;
+    // host name
+    private String hostName;
+    // flag to indicate LB cluster
+    private boolean isLbCluster;
+    // autoscaling policy
+    private String autoscalePolicyName;
+    // deployment policy
+    private String deploymentPolicyName;
+    // tenant rance
+    private String tenantRange;
+
+    public ApplicationClusterContext (String cartridgeType, String clusterId, 
String hostName,
+                                      String textPayload, String 
deploymentPolicyName, boolean isLbCluster) {
+
+        this.cartridgeType = cartridgeType;
+        this.clusterId = clusterId;
+        this.hostName = hostName;
+        this.textPayload = textPayload;
+        this.deploymentPolicyName = deploymentPolicyName;
+        this.isLbCluster = isLbCluster;
+        this.tenantRange = "*";
+    }
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public void setClusterId(String clusterId) {
+        this.clusterId = clusterId;
+    }
+
+    public String getCartridgeType() {
+        return cartridgeType;
+    }
+
+    public void setCartridgeType(String cartridgeType) {
+        this.cartridgeType = cartridgeType;
+    }
+
+    public String getTextPayload() {
+        return textPayload;
+    }
+
+    public void setTextPayload(String textPayload) {
+        this.textPayload = textPayload;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public boolean isLbCluster() {
+        return isLbCluster;
+    }
+
+    public void setLbCluster(boolean lbCluster) {
+        isLbCluster = lbCluster;
+    }
+
+    public String getAutoscalePolicyName() {
+        return autoscalePolicyName;
+    }
+
+    public void setAutoscalePolicyName(String autoscalePolicyName) {
+        this.autoscalePolicyName = autoscalePolicyName;
+    }
+
+    public String getDeploymentPolicyName() {
+        return deploymentPolicyName;
+    }
+
+    public void setDeploymentPolicyName(String deploymentPolicyName) {
+        this.deploymentPolicyName = deploymentPolicyName;
+    }
+
+    public String getTenantRange() {
+        return tenantRange;
+    }
+
+    public void setTenantRange(String tenantRange) {
+        this.tenantRange = tenantRange;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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
index c1fa44b..601f625 100644
--- 
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
@@ -19,7 +19,7 @@
 
 package org.apache.stratos.cloud.controller.pojo;
 
-import org.apache.stratos.cloud.controller.pojo.payload.PayloadDataHolder;
+import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder;
 import org.apache.stratos.messaging.domain.topology.Application;
 import org.apache.stratos.messaging.domain.topology.Cluster;
 
@@ -31,7 +31,7 @@ public class ApplicationDataHolder {
 
     private Set<Cluster> clusters;
 
-    private Set<PayloadDataHolder> payloadDataHolders;
+    private Set<MetaDataHolder> metaDataHolders;
 
     public Application getApplication() {
         return application;
@@ -49,11 +49,11 @@ public class ApplicationDataHolder {
         this.clusters = clusters;
     }
 
-    public Set<PayloadDataHolder> getPayloadDataHolders() {
-        return payloadDataHolders;
+    public Set<MetaDataHolder> getMetaDataHolders() {
+        return metaDataHolders;
     }
 
-    public void setPayloadDataHolders(Set<PayloadDataHolder> 
payloadDataHolders) {
-        this.payloadDataHolders = payloadDataHolders;
+    public void setMetaDataHolders(Set<MetaDataHolder> metaDataHolders) {
+        this.metaDataHolders = metaDataHolders;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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
index af81c8e..874d18e 100644
--- 
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
@@ -1,61 +1,61 @@
-/*
- * 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.cloud.controller.pojo.payload.PayloadDataHolder;
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.metadata.client.pojo.DataContext;
-
-import java.util.Map;
-import java.util.Set;
-
-public class ClusterDataHolder {
-
-    // Cluster Ids map, key = service name
-    private Map<String, Set<String>> clusterIdMap;
-
-    // Cluster object collection
-    private Set<Cluster> clusters;
-
-    // payload related information
-    private Set<PayloadDataHolder> payloadDataHolders;
-
-   public ClusterDataHolder (Map<String, Set<String>> clusterIdMap, 
Set<Cluster> clusters) {
-       this.clusterIdMap = clusterIdMap;
-       this.clusters = clusters;
-   }
-
-    public Map<String, Set<String>> getClusterIdMap() {
-        return clusterIdMap;
-    }
-
-    public Set<Cluster> getClusters() {
-        return clusters;
-    }
-
-
-    public Set<PayloadDataHolder> getPayloadDataHolders() {
-        return payloadDataHolders;
-    }
-
-    public void setPayloadDataHolders(Set<PayloadDataHolder> 
payloadDataHolders) {
-        this.payloadDataHolders = payloadDataHolders;
-    }
-}
+///*
+// * 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.cloud.controller.pojo.payload.PayloadDataHolder;
+//import org.apache.stratos.messaging.domain.topology.Cluster;
+//import org.apache.stratos.metadata.client.pojo.DataContext;
+//
+//import java.util.Map;
+//import java.util.Set;
+//
+//public class ClusterDataHolder {
+//
+//    // Cluster Ids map, key = service name
+//    private Map<String, Set<String>> clusterIdMap;
+//
+//    // Cluster object collection
+//    private Set<Cluster> clusters;
+//
+////    // payload related information
+////    private Set<PayloadDataHolder> payloadDataHolders;
+//
+//   public ClusterDataHolder (Map<String, Set<String>> clusterIdMap, 
Set<Cluster> clusters) {
+//       this.clusterIdMap = clusterIdMap;
+//       this.clusters = clusters;
+//   }
+//
+//    public Map<String, Set<String>> getClusterIdMap() {
+//        return clusterIdMap;
+//    }
+//
+//    public Set<Cluster> getApplicationClusterContexts() {
+//        return clusters;
+//    }
+//
+//
+////    public Set<PayloadDataHolder> getPayloadDataHolders() {
+////        return payloadDataHolders;
+////    }
+////
+////    public void setPayloadDataHolders(Set<PayloadDataHolder> 
payloadDataHolders) {
+////        this.payloadDataHolders = payloadDataHolders;
+////    }
+//}

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java
new file mode 100644
index 0000000..8ab745e
--- /dev/null
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java
@@ -0,0 +1,93 @@
+/*
+ * 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.payload;
+
+import java.util.Properties;
+
+/**
+ * Holds payload/meta data related to a cluster
+ */
+
+public class MetaDataHolder {
+
+    private String appId;
+
+    private String groupName;
+
+    private String clusterId;
+
+    private Properties properties;
+
+    public MetaDataHolder(String appId, String groupName, String clusterId) {
+
+        this.appId = appId;
+        this.groupName = groupName;
+        this.clusterId = clusterId;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public boolean equals(Object other) {
+
+        if(other == null || !(other instanceof MetaDataHolder)) {
+            return false;
+        }
+
+        if(this == other) {
+            return true;
+        }
+
+        MetaDataHolder that = (MetaDataHolder)other;
+
+        if (this.groupName == null || that.groupName == null) {
+            return this.appId.equals(that.appId) && 
this.clusterId.equals(that.clusterId);
+        } else {
+            return this.appId.equals(that.appId) && 
this.groupName.equals(that.groupName) &&
+                    this.clusterId.equals(that.clusterId);
+        }
+    }
+
+    public int hashCode () {
+
+        if (this.getGroupName() == null) {
+            return this.appId.hashCode() + this.clusterId.hashCode();
+        } else {
+            return this.appId.hashCode() + this.groupName.hashCode() + 
this.clusterId.hashCode();
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/PayloadDataHolder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/PayloadDataHolder.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/PayloadDataHolder.java
deleted file mode 100644
index 6f74453..0000000
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/PayloadDataHolder.java
+++ /dev/null
@@ -1,93 +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.cloud.controller.pojo.payload;
-
-import java.util.Properties;
-
-/**
- * Holds payload/meta data related to a cluster
- */
-
-public class PayloadDataHolder {
-
-    private String appId;
-
-    private String groupName;
-
-    private String clusterId;
-
-    private Properties properties;
-
-    public PayloadDataHolder (String appId, String groupName, String 
clusterId) {
-
-        this.appId = appId;
-        this.groupName = groupName;
-        this.clusterId = clusterId;
-    }
-
-    public String getAppId() {
-        return appId;
-    }
-
-    public String getGroupName() {
-        return groupName;
-    }
-
-    public String getClusterId() {
-        return clusterId;
-    }
-
-    public boolean equals(Object other) {
-
-        if(other == null || !(other instanceof PayloadDataHolder)) {
-            return false;
-        }
-
-        if(this == other) {
-            return true;
-        }
-
-        PayloadDataHolder that = (PayloadDataHolder)other;
-
-        if (this.groupName == null || that.groupName == null) {
-            return this.appId.equals(that.appId) && 
this.clusterId.equals(that.clusterId);
-        } else {
-            return this.appId.equals(that.appId) && 
this.groupName.equals(that.groupName) &&
-                    this.clusterId.equals(that.clusterId);
-        }
-    }
-
-    public int hashCode () {
-
-        if (this.getGroupName() == null) {
-            return this.appId.hashCode() + this.clusterId.hashCode();
-        } else {
-            return this.appId.hashCode() + this.groupName.hashCode() + 
this.clusterId.hashCode();
-        }
-    }
-
-    public Properties getProperties() {
-        return properties;
-    }
-
-    public void setProperties(Properties properties) {
-        this.properties = properties;
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/0434c2ff/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 c958ec2..a926411 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
@@ -27,6 +27,7 @@ import 
org.apache.stratos.cloud.controller.pojo.ClusterContext;
 import org.apache.stratos.cloud.controller.pojo.PortMapping;
 import org.apache.stratos.cloud.controller.pojo.Registrant;
 import org.apache.stratos.cloud.controller.pojo.*;
+import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder;
 import 
org.apache.stratos.cloud.controller.publisher.CartridgeInstanceDataPublisher;
 import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
@@ -612,34 +613,45 @@ public class TopologyBuilder {
         }
     }
 
-    public static void handleApplicationDeployed(ApplicationDataHolder 
applicationDataHolder) {
+    public static void handleApplicationDeployed(Application application,
+                                                 
Set<ApplicationClusterContext> applicationClusterContexts,
+                                                 Set<MetaDataHolder> 
metaDataHolders) {
+
+
 
         Topology topology = TopologyManager.getTopology();
         try {
             TopologyManager.acquireWriteLock();
 
-            if 
(topology.applicationExists(applicationDataHolder.getApplication().getId())) {
-                log.warn("Application with id [ " + 
applicationDataHolder.getApplication().getId() + " ] already exists in 
Topology");
+            if (topology.applicationExists(application.getId())) {
+                log.warn("Application with id [ " + application.getId() + " ] 
already exists in Topology");
                 return;
             }
 
-            for (Cluster cluster : applicationDataHolder.getClusters()) {
-                String cartridgeType = cluster.getServiceName();
-                Service service = topology.getService(cartridgeType);
+            for (ApplicationClusterContext applicationClusterContext : 
applicationClusterContexts) {
+                Cluster cluster = new 
Cluster(applicationClusterContext.getCartridgeType(),
+                        applicationClusterContext.getClusterId(), 
applicationClusterContext.getDeploymentPolicyName(),
+                        applicationClusterContext.getAutoscalePolicyName());
+                cluster.setStatus(Status.Created);
+                cluster.addHostName(applicationClusterContext.getHostName());
+                
cluster.setTenantRange(applicationClusterContext.getTenantRange());
+
+                Service service = 
topology.getService(applicationClusterContext.getCartridgeType());
                 if (service != null) {
-                    topology.getService(cartridgeType).addCluster(cluster);
-                    log.info("Added Cluster " + cluster.toString() + " to 
Topology for Application with id: " + 
applicationDataHolder.getApplication().getId());
+                    service.addCluster(cluster);
+                    log.info("Added Cluster " + cluster.toString() + " to 
Topology for Application with id: " + application.getId());
                 } else {
-                    log.error("Service " + cartridgeType + " not found");
+                    log.error("Service " + 
applicationClusterContext.getCartridgeType() + " not found");
                     return;
                 }
             }
+
             // add to Topology and update
-            topology.addApplication(applicationDataHolder.getApplication());
+            topology.addApplication(application);
             TopologyManager.updateTopology(topology);
-            log.info("Application with id [ " + 
applicationDataHolder.getApplication().getId() + " ] added to Topology 
successfully");
+            log.info("Application with id [ " + application.getId() + " ] 
added to Topology successfully");
 
-            
TopologyEventPublisher.sendApplicationCreatedEvent(applicationDataHolder.getApplication());
+            TopologyEventPublisher.sendApplicationCreatedEvent(application);
 
         } finally {
             TopologyManager.releaseWriteLock();

Reply via email to