Repository: stratos
Updated Branches:
  refs/heads/4.0.0-grouping d7eb101f0 -> 7778756ad


doing code review changes


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

Branch: refs/heads/4.0.0-grouping
Commit: 0aeed04723650d63cc4d7166f38fea066aa73789
Parents: 67b00b9
Author: Isuru Haththotuwa <[email protected]>
Authored: Mon Oct 6 17:12:01 2014 +0530
Committer: Isuru Haththotuwa <[email protected]>
Committed: Mon Oct 6 17:12:01 2014 +0530

----------------------------------------------------------------------
 .../parser/DefaultApplicationParser.java        | 320 ++++++++-----------
 .../impl/CloudControllerServiceImpl.java        |   4 +-
 .../interfaces/ApplicationParser.java           |  17 +
 .../controller/topology/TopologyBuilder.java    |   9 +-
 4 files changed, 162 insertions(+), 188 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/0aeed047/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 27c4126..156ab77 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,6 +19,7 @@
 
 package org.apache.stratos.cloud.controller.application.parser;
 
+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.ApplicationUtils;
@@ -56,11 +57,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
     @Override
     public Application parse(Object obj) throws ApplicationDefinitionException 
{
 
-        ApplicationContext applicationCtxt = null;
-
-        if (obj instanceof ApplicationContext) {
-            applicationCtxt = (ApplicationContext) obj;
-        }
+        ApplicationContext applicationCtxt = (ApplicationContext) obj;
 
         if (applicationCtxt == null) {
             handleError("Invalid Composite Application Definition");
@@ -118,6 +115,14 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return metaDataHolders;
     }
 
+    /**
+     * Extract Group information from Application Definition
+     *
+     * @param appCtxt ApplicationContext object with Application information
+     * @return Map [group alias -> Group]
+     *
+     * @throws ApplicationDefinitionException if the Group information is 
invalid
+     */
     private Map<String, GroupContext> getDefinedGroups (ApplicationContext 
appCtxt) throws
             ApplicationDefinitionException {
 
@@ -131,7 +136,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
                 for (GroupContext groupContext : 
appCtxt.getComponents().getGroupContexts()) {
 
                     // check validity of group name
-                    if (groupContext.getName() == null || 
groupContext.getName().isEmpty()) {
+                    if (StringUtils.isEmpty(groupContext.getName())) {
                         handleError("Invalid Group name specified");
                     }
 
@@ -141,7 +146,8 @@ public class DefaultApplicationParser implements 
ApplicationParser {
                     }
 
                     // check validity of group alias
-                    if (groupContext.getAlias() == null || 
groupContext.getAlias().isEmpty() || 
!ApplicationUtils.isAliasValid(groupContext.getAlias())) {
+
+                    if (StringUtils.isEmpty(groupContext.getAlias()) || 
!ApplicationUtils.isAliasValid(groupContext.getAlias())) {
                         handleError("Invalid Group alias specified: [ " + 
groupContext.getAlias() + " ]");
                     }
 
@@ -162,6 +168,14 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return definedGroups;
     }
 
+    /**
+     * Extract Subscription Information from the Application Definition
+     *
+     * @param appCtxt ApplicationContext object with Application information
+     * @return Map [cartridge alias -> Group]
+     *
+     * @throws ApplicationDefinitionException if the Subscription information 
is invalid
+     */
     private Map<String, SubscribableInfoContext> getSubscribableInformation 
(ApplicationContext appCtxt) throws
             ApplicationDefinitionException {
 
@@ -173,7 +187,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
 
             for (SubscribableInfoContext subscribableInfoCtxt : 
appCtxt.getSubscribableInfoContext()) {
 
-                if (subscribableInfoCtxt.getAlias() == null || 
subscribableInfoCtxt.getAlias().isEmpty() ||
+                if (StringUtils.isEmpty(subscribableInfoCtxt.getAlias()) ||
                         
!ApplicationUtils.isAliasValid(subscribableInfoCtxt.getAlias())) {
                     handleError("Invalid alias specified for Subscribable 
Information Obj: [ " + subscribableInfoCtxt.getAlias() + " ]");
                 }
@@ -194,11 +208,29 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return subscribableInformation;
     }
 
+    /**
+     * Check if a Group Definition is deployed
+     *
+     * @param serviceGroupName Group name
+     * @return true if the Group is deployed, else false
+     *
+     * @throws ApplicationDefinitionException
+     */
     private boolean isGroupDeployed (String serviceGroupName) throws 
ApplicationDefinitionException {
 
         return 
FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName) != null;
     }
 
+    /**
+     * Builds the Application structure
+     *
+     * @param appCtxt ApplicationContext object with Application information
+     * @param definedGroupCtxts Map [cartridge alias -> Group] with extracted 
Group Information
+     * @param subscribableInfoCtxts Map [cartridge alias -> Group] with 
extracted Subscription Information
+     * @return Application Application object denoting the Application 
structure
+     *
+     * @throws ApplicationDefinitionException If an error occurs in building 
the Application structure
+     */
     private Application buildCompositeAppStructure (ApplicationContext appCtxt,
                                                             Map<String, 
GroupContext> definedGroupCtxts,
                                                             Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
@@ -252,6 +284,19 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return application;
     }
 
+    /**
+     * Parse Group information
+     *
+     * @param appId Application id
+     * @param tenantId tenant id of tenant which deployed the Application
+     * @param key Generated key for the Application
+     * @param groupCtxts  Group information
+     * @param subscribableInformation Subscribable Information
+     * @param definedGroupCtxts Map [group alias -> Group] with extracted 
Group Information
+     * @return Map [alias -> Group]
+     *
+     * @throws ApplicationDefinitionException if an error occurs in parsing 
Group Information
+     */
     private Map<String, Group> parseGroups (String appId, int tenantId, String 
key, List<GroupContext> groupCtxts,
                                            Map<String, 
SubscribableInfoContext> subscribableInformation,
                                            Map<String, GroupContext> 
definedGroupCtxts)
@@ -272,6 +317,12 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return groupAliasToGroup;
     }
 
+    /**
+     * Extracts nested Group information recursively
+     *
+     * @param nestedGroups Nested Groups set to be populated recursively
+     * @param groups Collection of Groups
+     */
     private void getNestedGroupContexts (Set<Group> nestedGroups, 
Collection<Group> groups) {
 
         if (groups != null) {
@@ -284,6 +335,12 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         }
     }
 
+    /**
+     * Filters duplicated Groups from top level
+     *
+     * @param topLevelGroups Top level Groups
+     * @param nestedGroups nested Groups
+     */
     private void filterDuplicatedGroupContexts (Collection<Group> 
topLevelGroups, Set<Group> nestedGroups) {
 
         for (Group nestedGroup : nestedGroups) {
@@ -304,6 +361,19 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         }
     }
 
+    /**
+     * Parses an individual Group
+     *
+     * @param appId Application id
+     * @param tenantId tenant id of tenant which deployed the Application
+     * @param key Generated key for the Application
+     * @param groupCtxt Group definition information
+     * @param subscribableInfoCtxts Map [cartridge alias -> Group] with 
extracted Subscription Information
+     * @param definedGroupCtxts Map [group alias -> Group] with extracted 
Group Information
+     * @return  Group object
+     *
+     * @throws ApplicationDefinitionException if unable to parse
+     */
     private Group parseGroup (String appId, int tenantId, String key, 
GroupContext groupCtxt,
                              Map<String, SubscribableInfoContext> 
subscribableInfoCtxts,
                              Map<String, GroupContext> definedGroupCtxts)
@@ -357,6 +427,14 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return group;
     }
 
+    /**
+     * Find the startup order
+     *
+     * @param groupContext GroupContext with Group defintion information
+     * @return Set of Startup Orders which are defined in the Group
+     *
+     * @throws ApplicationDefinitionException
+     */
     private Set<StartupOrder> getStartupOrderForGroup(GroupContext 
groupContext) throws ApplicationDefinitionException {
 
         ServiceGroup serviceGroup = 
FasterLookUpDataHolder.getInstance().getServiceGroup(groupContext.getName());
@@ -377,6 +455,14 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return null;
     }
 
+    /**
+     * Find the startup order for an Application
+     *
+     * @param startupOrderCtxts Startup Order information related to the 
Application
+     * @return Set of Startup Orders
+     *
+     * @throws ApplicationDefinitionException if an error occurs
+     */
     private Set<StartupOrder> getStartupOrderForApplicationComponents 
(Set<StartupOrderContext> startupOrderCtxts)
             throws ApplicationDefinitionException {
 
@@ -393,6 +479,14 @@ public class DefaultApplicationParser implements 
ApplicationParser {
         return startupOrders;
     }
 
+    /**
+     * Get kill behaviour related to a Group
+     *
+     * @param serviceGroupName Group name
+     * @return String indicating the kill behavior
+     *
+     * @throws ApplicationDefinitionException if an error occurs
+     */
     private String getKillbehaviour (String serviceGroupName) throws 
ApplicationDefinitionException {
 
         ServiceGroup serviceGroup = 
FasterLookUpDataHolder.getInstance().getServiceGroup(serviceGroupName);
@@ -410,46 +504,25 @@ public class DefaultApplicationParser implements 
ApplicationParser {
 
     }
 
-//    private Set<SubscribableContext> getSubsribableContexts 
(List<SubscribableContext> subscribableCtxts,
-//                                                             Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
-//            throws ApplicationDefinitionException {
-//
-//        Set<SubscribableContext> subscribableContexts = new 
HashSet<SubscribableContext>();
-//
-//        for (SubscribableContext subscribableCtxt : subscribableCtxts) {
-//            // check is there is a related Subscribable Information
-//            SubscribableInfo subscribableInfo = 
subscribableInfoCtxts.get(subscribableCtxt.getAlias());
-//            if (subscribableInfo == null) {
-//                throw new CompositeApplicationDefinitionException("Related 
Subscribable Information not found for Subscribable with alias: "
-//                        + subscribableCtxt.getAlias());
-//            }
-//
-//            // check if Cartridge Type is valid
-//            if (subscribableCtxt.getType() == null || 
subscribableCtxt.getType().isEmpty()) {
-//                throw new CompositeApplicationDefinitionException ("Invalid 
Cartridge Type specified : [ "
-//                        + subscribableCtxt.getType() + " ]");
-//            }
-//
-//            // check if a cartridge with relevant type is already deployed. 
else, can't continue
-//            if (!isCartrigdeDeployed(subscribableCtxt.getType())) {
-//                throw new CompositeApplicationDefinitionException("No 
deployed Cartridge found with type [ " + subscribableCtxt.getType() +
-//                        " ] for Composite Application");
-//            }
-//
-//            subscribableContexts.add(ParserUtils.convert(subscribableCtxt, 
subscribableInfo));
-//        }
-//
-//        return subscribableContexts;
-//    }
-
+    /**
+     * Parse Subscription Information
+     *
+     * @param appId Application id
+     * @param tenantId Tenant id of tenant which deployed the Application
+     * @param key Generated key for the Application
+     * @param groupName Group name (if relevant)
+     * @param subscribableCtxts Subscribable Information
+     * @param subscribableInfoCtxts Map [cartridge alias -> Group] with 
extracted Subscription Information
+     * @return Map [subscription alias -> ClusterDataHolder]
+     *
+     * @throws ApplicationDefinitionException
+     */
     private Map<String, ClusterDataHolder> parseLeafLevelSubscriptions (String 
appId, int tenantId, String key, String groupName,
                                                                  
List<SubscribableContext> subscribableCtxts,
                                                                  Map<String, 
SubscribableInfoContext> subscribableInfoCtxts)
             throws ApplicationDefinitionException {
 
         Map<String, ClusterDataHolder> clusterDataMap = new HashMap<String, 
ClusterDataHolder>();
-//        Set<Cluster> clusters = new HashSet<Cluster>();
-        //Set<PayloadDataHolder> payloadDataHolders = new 
HashSet<PayloadDataHolder>();
 
         for (SubscribableContext subscribableCtxt : subscribableCtxts) {
 
@@ -461,7 +534,7 @@ public class DefaultApplicationParser implements 
ApplicationParser {
             }
 
             // check if Cartridge Type is valid
-            if (subscribableCtxt.getType() == null || 
subscribableCtxt.getType().isEmpty()) {
+            if (StringUtils.isEmpty(subscribableCtxt.getType())) {
                 handleError("Invalid Cartridge Type specified : [ "
                         + subscribableCtxt.getType() + " ]");
             }
@@ -493,34 +566,31 @@ public class DefaultApplicationParser implements 
ApplicationParser {
             
appClusterCtxt.setAutoscalePolicyName(subscribableInfoCtxt.getAutoscalingPolicy());
             this.applicationClusterContexts.add(appClusterCtxt);
 
-            // TODO: I will bring you back when meta data service is completed 
B-)
-            // create cluster level meta data
-            
//this.metaDataHolders.add(ApplicationUtils.getClusterLevelPayloadData(appId, 
groupName, tenantId, key,
-            //        hostname, appClusterCtxt.getTenantRange(), clusterId, 
subscribableCtxt, subscribableInfoCtxt, cartridge));
-
             // add relevant information to the map
             clusterDataMap.put(subscribableCtxt.getAlias(), new 
ClusterDataHolder(subscribableCtxt.getType(), clusterId));
-
-            ////////////
-            //Cluster cluster = getCluster(subscribableCtxt, 
subscribableInfoCtxt, cartridge);
-            //addClusterId(clusterDataMap, subscribableCtxt.getType(), 
clusterId);
-            //clusterDataMap.put(subscribableCtxt.getType(), 
cluster.getClusterId());
-            //clusters.add(cluster);
-//            if (clusterDataMap.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");
-//            }
-            ///////////////
-
-//            createClusterContext(appId, groupName, 
subscribableCtxt.getType(), cluster.getClusterId(),
-//                    cluster.getHostNames().get(0));
         }
 
         return clusterDataMap;
-        //return new ClusterDataHolder(clusterDataMap, clusters);
-        //clusterDataHolder.setPayloadDataHolders(payloadDataHolders);
     }
 
+    /**
+     * Creates a ApplicationClusterContext object to keep information related 
to a Cluster in this Application
+     *
+     * @param appId Application id
+     * @param groupName Group name
+     * @param cartridge Cartridge information
+     * @param subscriptionKey Generated key for the Application
+     * @param tenantId Tenant Id of the tenant which deployed the Application
+     * @param repoUrl Repository URL
+     * @param alias alias specified for this Subscribable in the Application 
Definition
+     * @param clusterId Cluster id
+     * @param hostname Hostname
+     * @param deploymentPolicy Deployment policy used
+     * @param isLB if this cluster is an LB
+     * @return ApplicationClusterContext object with relevant information
+     *
+     * @throws ApplicationDefinitionException If any error occurs
+     */
     private ApplicationClusterContext createApplicationClusterContext (String 
appId, String groupName, Cartridge cartridge,
                                                                        String 
subscriptionKey, int tenantId, String repoUrl,
                                                                        String 
alias, String clusterId, String hostname,
@@ -528,134 +598,12 @@ public class DefaultApplicationParser implements 
ApplicationParser {
             throws ApplicationDefinitionException {
 
         // Create text payload
-        //String textPayload = ApplicationUtils.getTextPayload(appId, 
groupName, clusterId).toString();
-
         String textPayload = ApplicationUtils.createPayload(appId, groupName, 
cartridge, subscriptionKey, tenantId, clusterId,
                 hostname, repoUrl, alias, null).toString();
 
         return new ApplicationClusterContext(cartridge.getType(), clusterId, 
hostname, textPayload, deploymentPolicy, isLB);
     }
 
-//    public void addClusterId (Map<String, Set<String>> 
serviceNameToClusterIdsMap, String serviceName, String clusterId) {
-//
-//        if (serviceNameToClusterIdsMap.get(serviceName) == null) {
-//            // not found, create
-//            Set<String> clusterIds = new HashSet<String>();
-//            clusterIds.add(clusterId);
-//            serviceNameToClusterIdsMap.put(serviceName, clusterIds);
-//        } else {
-//            // the cluster id set already exists, update
-//            serviceNameToClusterIdsMap.get(serviceName).add(clusterId);
-//        }
-//    }
-
-//    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,
-//                                                 Map<String, GroupContext> 
definedGroupCtxts)
-//            throws ApplicationDefinitionException {
-//
-//        Set<GroupContext> groupContexts = new HashSet<GroupContext>();
-//
-//        for (GroupContext groupCtxt : groupCtxts) {
-//            groupContexts.add(parseGroup(groupCtxt, subscribableInformation, 
definedGroupCtxts));
-//        }
-//
-//        //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/0aeed047/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 e99a722..a6f74df 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
@@ -1456,7 +1456,9 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
     @Override
     public void unDeployApplicationDefinition(String applicationId, int 
tenantId, String tenantDomain) throws ApplicationDefinitionException {
 
-        TopologyBuilder.handleApplicationUndeployed(applicationId, tenantId, 
tenantDomain);
+        TopologyBuilder.handleApplicationUndeployed(dataHolder, applicationId, 
tenantId, tenantDomain);
+
+        persist();
     }
 
     private List<ConfigCompositeApplication> restoreConfigCompositeApplication 
() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/0aeed047/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 77cbe33..7bd471d 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
@@ -28,9 +28,26 @@ import java.util.Set;
 
 public interface ApplicationParser {
 
+    /**
+     * Parses the Application Definition
+     *
+     * @param obj Object with the Application Definition. An Object is used 
here since there can be
+     *            significant changes between the way composite Applications 
are defined in different
+     *            conventions
+     * @return Application structure denoting the parsed Application
+     * @throws ApplicationDefinitionException If the Application Definition is 
invalid
+     */
     public Application parse (Object obj) throws 
ApplicationDefinitionException;
 
+    /**
+     * Returns a set of ApplicationClusterContext which will comprise of 
cluster related information
+     * extracted from the Application definition
+     *
+     * @return  Set of ApplicationClusterContext objects
+     * @throws ApplicationDefinitionException if any error occurs
+     */
     public Set<ApplicationClusterContext> getApplicationClusterContexts() 
throws ApplicationDefinitionException;
 
+    // TODO: remove
     public Set<MetaDataHolder> getPayloadData () throws 
ApplicationDefinitionException;
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/0aeed047/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 9541ac0..6d50f6c 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
@@ -653,7 +653,7 @@ public class TopologyBuilder {
         }
     }
 
-    public static void handleApplicationUndeployed(String applicationId, int 
tenantId, String tenantDomain) {
+    public static void handleApplicationUndeployed(FasterLookUpDataHolder 
dataHolder, String applicationId, int tenantId, String tenantDomain) {
 
         Topology topology = TopologyManager.getTopology();
 
@@ -670,6 +670,7 @@ public class TopologyBuilder {
                 for (ClusterDataHolder clusterDataHolder : 
application.getClusterDataRecursively()) {
                     Service service = 
topology.getService(clusterDataHolder.getServiceType());
                     if (service != null) {
+                        // remove Cluster
                         
service.removeCluster(clusterDataHolder.getClusterId());
                         if (log.isDebugEnabled()) {
                             log.debug("Removed cluster with id " + 
clusterDataHolder.getClusterId());
@@ -678,6 +679,12 @@ public class TopologyBuilder {
                         log.warn("Unable to remove cluster with cluster id: " 
+ clusterDataHolder.getClusterId() + " from Topology, " +
                                 " associated Service [ " + 
clusterDataHolder.getServiceType() + " ] npt found");
                     }
+
+                    // remove runtime data
+                    
dataHolder.removeClusterContext(clusterDataHolder.getClusterId());
+                    if(log.isDebugEnabled()) {
+                        log.debug("Removed Cluster Context for Cluster id: " + 
clusterDataHolder.getClusterId());
+                    }
                 }
 
                 // remove application

Reply via email to