You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ud...@apache.org on 2014/07/17 13:42:51 UTC

[1/3] git commit: change application definition to allow inner groups subscribable details

Repository: stratos
Updated Branches:
  refs/heads/4.0.0-grouping 8499edac4 -> 11ff72422


change application definition to allow inner groups subscribable details


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

Branch: refs/heads/4.0.0-grouping
Commit: fabc64a0639218e952b1927495a70b0f14c90c1b
Parents: 308f6d3
Author: Udara Liyanage <ud...@wso2.com>
Authored: Tue Jul 15 11:55:54 2014 +0530
Committer: Udara Liyanage <ud...@wso2.com>
Committed: Tue Jul 15 11:55:54 2014 +0530

----------------------------------------------------------------------
 .../pojo/CompositeApplicationDefinition.java    |   1 -
 .../CompositeApplicationManager.java            | 135 ++++++--
 .../application/beans/CartridgeDefinition.java  |  77 -----
 .../application/beans/ComponentDefinition.java  |  46 +--
 .../beans/CompositeAppDefinition.java           |  16 +-
 .../application/beans/GroupDefinition.java      |  13 +-
 .../beans/SubscribableDefinition.java           |  56 +---
 .../application/beans/SubscribableInfo.java     |  13 +-
 .../parser/CompositeApplicationParser.java      |   5 +-
 .../DefaultCompositeApplicationParser.java      | 333 +++++++++++++++----
 .../application/parser/ParserUtils.java         |  64 ++++
 .../structure/CompositeAppContext.java          |  75 +++++
 .../application/structure/GroupContext.java     | 107 ++++++
 .../application/structure/StartupOrder.java     |  48 +++
 .../structure/SubscribableContext.java          | 108 ++++++
 .../CompositeApplicationException.java          |  47 +++
 .../manager/CartridgeSubscriptionManager.java   |  29 ++
 .../subscription/CompositeAppSubscription.java  |  47 +++
 .../rest/endpoint/services/ServiceUtils.java    |  36 +-
 .../rest/endpoint/services/StratosAdmin.java    |  43 ++-
 20 files changed, 978 insertions(+), 321 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/CompositeApplicationDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/CompositeApplicationDefinition.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/CompositeApplicationDefinition.java
index 97a9948..04476f6 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/CompositeApplicationDefinition.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/CompositeApplicationDefinition.java
@@ -1,7 +1,6 @@
 package org.apache.stratos.cloud.controller.pojo;
 
 import java.io.Serializable;
-import java.util.List;
 
 public class CompositeApplicationDefinition  implements Serializable {
 	

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/CompositeApplicationManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/CompositeApplicationManager.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/CompositeApplicationManager.java
index 2a02646..02893e8 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/CompositeApplicationManager.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/CompositeApplicationManager.java
@@ -1,17 +1,23 @@
 package org.apache.stratos.manager.composite.application;
 
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.manager.composite.application.beans.CompositeAppDefinition;
 import org.apache.stratos.manager.composite.application.parser.CompositeApplicationParser;
 import org.apache.stratos.manager.composite.application.parser.DefaultCompositeApplicationParser;
+import org.apache.stratos.manager.composite.application.structure.CompositeAppContext;
+import org.apache.stratos.manager.composite.application.structure.GroupContext;
+import org.apache.stratos.manager.composite.application.structure.SubscribableContext;
 import org.apache.stratos.manager.composite.application.utils.ApplicationUtils;
-import org.apache.stratos.manager.exception.ADCException;
-import org.apache.stratos.manager.exception.CompositeApplicationDefinitionException;
-import org.apache.stratos.manager.exception.PersistenceManagerException;
+import org.apache.stratos.manager.exception.*;
+import org.apache.stratos.manager.manager.CartridgeSubscriptionManager;
 import org.apache.stratos.manager.retriever.DataInsertionAndRetrievalManager;
+import org.apache.stratos.manager.subscription.CartridgeSubscription;
+import org.apache.stratos.manager.subscription.SubscriptionData;
 import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication;
 
 //Grouping
@@ -19,30 +25,117 @@ public class CompositeApplicationManager {
 	
 	private static Log log = LogFactory.getLog(CompositeApplicationManager.class);
 	
-	public void deployCompositeApplication (CompositeAppDefinition compositeAppDefinition) throws CompositeApplicationDefinitionException, PersistenceManagerException {
-//		if (log.isDebugEnabled()) {
-//			log.debug("deploying composite application " + configCompositeApplication.getAlias());
-//		}
-//		registerCompositeApplication(configCompositeApplication);
-//		if (log.isDebugEnabled()) {
-//			log.debug("publishing composite application " + configCompositeApplication.getAlias());
-//		}
-//		ApplicationUtils.publishApplicationCreatedEvent(configCompositeApplication);
-//		if (log.isDebugEnabled()) {
-//			log.debug("composite application successfully deployed" + configCompositeApplication.getAlias());
-//		}
+	public void deployCompositeApplication (CompositeAppDefinition compositeAppDefinition, int tenantId, String tenantDomain,
+                                            String tenantAdminUsername) throws CompositeApplicationException, CompositeApplicationDefinitionException,
+            PersistenceManagerException {
 
         CompositeApplicationParser compositeAppParser = new DefaultCompositeApplicationParser();
-        compositeAppParser.parse(compositeAppDefinition);
-        
-        DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
-        mgr.persistCompositeApplication(compositeAppDefinition);
-
-        // TODO: traverse the data structure and create the subscriptions
+        CompositeAppContext compositeAppContext = compositeAppParser.parse(compositeAppDefinition);
 
         log.info("Composite Application [ Id: " + compositeAppDefinition.getApplicationId() + " , alias: "
                 + compositeAppDefinition.getAlias() + " ] deployed successfully");
+        
+        //DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
+        //mgr.persistCompositeApplication(compositeAppDefinition);
+        Set<CartridgeSubscription> cartridgeSubscriptions = new HashSet<CartridgeSubscription>();
+
+        // traverse through the Composite App Structure and create Cartridge Subscriptions
+        if(compositeAppContext.getSubscribableContexts() != null) {
+            // Subscription relevant to top level Subscribables
+            cartridgeSubscriptions.addAll(getCartridgeSybscriptionsForSubscribables(compositeAppContext.getSubscribableContexts(),
+                    tenantId, tenantDomain, tenantAdminUsername));
+        }
+
+        if (compositeAppContext.getGroupContexts() != null) {
+            // Subscriptions relevant to Groups
+            cartridgeSubscriptions.addAll(getCartridgeSubscriptionForGroups(compositeAppContext.getGroupContexts(), tenantId,
+                    tenantDomain, tenantAdminUsername));
+        }
 	}
+
+    private Set<CartridgeSubscription> getCartridgeSubscriptionForGroups (Set<GroupContext> groupContexts,
+                                                                          int tenantId, String tenantDomain,
+                                                                          String tenantAdminUsername)
+            throws CompositeApplicationException {
+
+        Set<CartridgeSubscription> cartridgeSubscriptions = new HashSet<CartridgeSubscription>();
+        for (GroupContext groupContext : groupContexts) {
+            // create Subscriptions for the Group's top level Subscribables
+            if (groupContext.getSubscribableContexts() != null) {
+                cartridgeSubscriptions.addAll(getCartridgeSybscriptionsForSubscribables(groupContext.getSubscribableContexts(),
+                        tenantId, tenantDomain, tenantAdminUsername));
+            }
+            // create Subscriptions for the nested Group's Subscribables
+            if (groupContext.getGroupContexts() != null) {
+                cartridgeSubscriptions.addAll(getCartridgeSubscriptionForGroups(groupContext.getGroupContexts(), tenantId,
+                        tenantDomain, tenantAdminUsername));
+            }
+        }
+
+        return cartridgeSubscriptions;
+    }
+
+    private Set<CartridgeSubscription> getCartridgeSybscriptionsForSubscribables (Set<SubscribableContext> subscribableContexts,
+                                                                                  int tenantId, String tenantDomain,
+                                                                                  String tenantAdminUsername)
+            throws CompositeApplicationException {
+
+        Set<CartridgeSubscription> cartridgeSubscriptions = new HashSet<CartridgeSubscription>();
+
+        for (SubscribableContext subscribableContext : subscribableContexts) {
+            cartridgeSubscriptions.add(getCartridgeSubscription(subscribableContext, tenantId, tenantDomain, tenantAdminUsername));
+        }
+
+        return cartridgeSubscriptions;
+    }
+
+    private CartridgeSubscription getCartridgeSubscription (SubscribableContext subscribableContext, int tenantId, String tenantDomain,
+                                                            String tenantAdminUsername) throws CompositeApplicationException {
+
+        SubscriptionData subscriptionData = new SubscriptionData();
+        subscriptionData.setCartridgeType(subscribableContext.getCartridgeType());
+        subscriptionData.setCartridgeAlias(subscribableContext.getAlias());
+        subscriptionData.setAutoscalingPolicyName(subscribableContext.getAutoscalingPolicy());
+        subscriptionData.setDeploymentPolicyName(subscribableContext.getDeploymentPolicy());
+        subscriptionData.setTenantId(tenantId);
+        subscriptionData.setTenantDomain(tenantDomain);
+        subscriptionData.setTenantAdminUsername(tenantAdminUsername);
+
+        if (subscribableContext.getRepoUrl() != null && !subscribableContext.getRepoUrl().isEmpty()) {
+            subscriptionData.setRepositoryType("git");
+            subscriptionData.setRepositoryURL(subscribableContext.getRepoUrl());
+            subscriptionData.setPrivateRepository(subscribableContext.isPrivateRepo());
+            subscriptionData.setRepositoryUsername(subscribableContext.getUsername());
+            subscriptionData.setRepositoryPassword(subscribableContext.getPassword());
+        }
+
+        CartridgeSubscriptionManager cartridgeSubscriptionManager = new CartridgeSubscriptionManager();
+        try {
+            return cartridgeSubscriptionManager.createCartridgeSubscription(subscriptionData);
+
+        } catch (ADCException e) {
+            throw new CompositeApplicationException(e);
+        } catch (InvalidCartridgeAliasException e) {
+            throw new CompositeApplicationException(e);
+        } catch (DuplicateCartridgeAliasException e) {
+            throw new CompositeApplicationException(e);
+        } catch (PolicyException e) {
+            throw new CompositeApplicationException(e);
+        } catch (UnregisteredCartridgeException e) {
+            throw new CompositeApplicationException(e);
+        } catch (RepositoryRequiredException e) {
+            throw new CompositeApplicationException(e);
+        } catch (RepositoryCredentialsRequiredException e) {
+            throw new CompositeApplicationException(e);
+        } catch (RepositoryTransportException e) {
+            throw new CompositeApplicationException(e);
+        } catch (AlreadySubscribedException e) {
+            throw new CompositeApplicationException(e);
+        } catch (InvalidRepositoryException e) {
+            throw new CompositeApplicationException(e);
+        }
+
+    }
 	
 	public void unDeployCompositeApplication(String configApplicationAlias) throws ADCException {
 		if (log.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CartridgeDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CartridgeDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CartridgeDefinition.java
deleted file mode 100644
index bb19145..0000000
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CartridgeDefinition.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.apache.stratos.manager.composite.application.beans;
-
-
-public class CartridgeDefinition {
-    private String alias;
-    private String type;
-    private String deploymentPolicy;
-    private String autoscalingPolicy;
-    private String repoUrl;
-    private boolean privateRepo;
-    private String username;
-    private String password;
-
-    public String getAlias() {
-        return alias;
-    }
-
-    public void setAlias(String alias) {
-        this.alias = alias;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getDeploymentPolicy() {
-        return deploymentPolicy;
-    }
-
-    public void setDeploymentPolicy(String deploymentPolicy) {
-        this.deploymentPolicy = deploymentPolicy;
-    }
-
-    public String getAutoscalingPolicy() {
-        return autoscalingPolicy;
-    }
-
-    public void setAutoscalingPolicy(String autoscalingPolicy) {
-        this.autoscalingPolicy = autoscalingPolicy;
-    }
-
-    public String getRepoUrl() {
-        return repoUrl;
-    }
-
-    public void setRepoUrl(String repoUrl) {
-        this.repoUrl = repoUrl;
-    }
-
-    public boolean isPrivateRepo() {
-        return privateRepo;
-    }
-
-    public void setPrivateRepo(boolean privateRepo) {
-        this.privateRepo = privateRepo;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ComponentDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ComponentDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ComponentDefinition.java
index 55be3fe..176ab14 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ComponentDefinition.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/ComponentDefinition.java
@@ -1,51 +1,41 @@
 package org.apache.stratos.manager.composite.application.beans;
 
+import org.apache.stratos.manager.grouping.definitions.DependencyDefinitions;
+import org.apache.stratos.manager.grouping.definitions.StartupOrderDefinition;
+
+import javax.xml.bind.annotation.XmlRootElement;
 import java.util.List;
 
+@XmlRootElement(name = "components")
 public class ComponentDefinition {
-    private String group;
-    private String alias;
-    private List<SubscribableInfo> subscribables;
-    private String deploymentPolicy;
-    private String autoscalingPolicy;
-
-    public String getGroup() {
-        return group;
-    }
 
-    public void setGroup(String group) {
-        this.group = group;
-    }
+    private List<GroupDefinition> groups;
 
-    public String getAlias() {
-        return alias;
-    }
+    private List<SubscribableDefinition> subscribables;
 
-    public void setAlias(String alias) {
-        this.alias = alias;
-    }
+    private DependencyDefinitions dependencies;
 
-    public List<SubscribableInfo> getSubscribables() {
+    public List<SubscribableDefinition> getSubscribables() {
         return subscribables;
     }
 
-    public void setSubscribables(List<SubscribableInfo> subscribables) {
+    public void setSubscribables(List<SubscribableDefinition> subscribables) {
         this.subscribables = subscribables;
     }
 
-    public String getDeploymentPolicy() {
-        return deploymentPolicy;
+    public List<GroupDefinition> getGroups() {
+        return groups;
     }
 
-    public void setDeploymentPolicy(String deploymentPolicy) {
-        this.deploymentPolicy = deploymentPolicy;
+    public void setGroups(List<GroupDefinition> groups) {
+        this.groups = groups;
     }
 
-    public String getAutoscalingPolicy() {
-        return autoscalingPolicy;
+    public DependencyDefinitions getDependencies() {
+        return dependencies;
     }
 
-    public void setAutoscalingPolicy(String autoscalingPolicy) {
-        this.autoscalingPolicy = autoscalingPolicy;
+    public void setDependencies(DependencyDefinitions dependencies) {
+        this.dependencies = dependencies;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CompositeAppDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CompositeAppDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CompositeAppDefinition.java
index 477e098..353d7db 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CompositeAppDefinition.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/CompositeAppDefinition.java
@@ -29,9 +29,9 @@ public class CompositeAppDefinition {
 
     private String alias;
 
-    private List<ComponentDefinition> components;
+    private ComponentDefinition components;
 
-    private List<CartridgeDefinition> cartridges;
+    private List<SubscribableInfo> subscribableInfo;
 
     public String getApplicationId() {
         return applicationId;
@@ -49,19 +49,19 @@ public class CompositeAppDefinition {
         this.alias = alias;
     }
 
-    public List<ComponentDefinition> getComponents() {
+    public ComponentDefinition getComponents() {
         return components;
     }
 
-    public void setComponents(List<ComponentDefinition> components) {
+    public void setComponents(ComponentDefinition components) {
         this.components = components;
     }
 
-    public List<CartridgeDefinition> getCartridges() {
-        return cartridges;
+    public List<SubscribableInfo> getSubscribableInfo() {
+        return subscribableInfo;
     }
 
-    public void setCartridges(List<CartridgeDefinition> cartridges) {
-        this.cartridges = cartridges;
+    public void setSubscribableInfo(List<SubscribableInfo> subscribableInfo) {
+        this.subscribableInfo = subscribableInfo;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
index 3e92eb5..4cb77f9 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
@@ -19,10 +19,11 @@
 
 package org.apache.stratos.manager.composite.application.beans;
 
+import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import java.util.List;
 
-@XmlRootElement
+@XmlRootElement(name = "groups")
 public class GroupDefinition {
 
     private String name;
@@ -35,7 +36,7 @@ public class GroupDefinition {
 
     private List<SubscribableDefinition> subscribables;
 
-    private List<GroupDefinition> groups;
+    private List<GroupDefinition> subGroups;
 
     public String getName() {
         return name;
@@ -77,11 +78,11 @@ public class GroupDefinition {
         this.subscribables = subscribableDefinitions;
     }
 
-    public List<GroupDefinition> getGroups() {
-        return groups;
+    public List<GroupDefinition> getSubGroups() {
+        return subGroups;
     }
 
-    public void setGroups(List<GroupDefinition> groups) {
-        this.groups = groups;
+    public void setSubGroups(List<GroupDefinition> subGroups) {
+        this.subGroups = subGroups;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableDefinition.java
index d85f235..77d409a 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableDefinition.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableDefinition.java
@@ -21,20 +21,13 @@ package org.apache.stratos.manager.composite.application.beans;
 
 import javax.xml.bind.annotation.XmlRootElement;
 
-@XmlRootElement
+@XmlRootElement (name = "subscribables")
 public class SubscribableDefinition {
 
     private String type;
 
     private String alias;
 
-    private String deploymentPolicy;
-    private String autoscalingPolicy;
-    private String repoUrl;
-    private boolean isPrivateRepo;
-    private String repoUsername;
-    private String repoPassword;
-
 
     public String getType() {
         return type;
@@ -52,51 +45,4 @@ public class SubscribableDefinition {
         this.alias = alias;
     }
 
-    public String getDeploymentPolicy() {
-        return deploymentPolicy;
-    }
-
-    public void setDeploymentPolicy(String deploymentPolicy) {
-        this.deploymentPolicy = deploymentPolicy;
-    }
-
-    public String getAutoscalingPolicy() {
-        return autoscalingPolicy;
-    }
-
-    public void setAutoscalingPolicy(String autoscalingPolicy) {
-        this.autoscalingPolicy = autoscalingPolicy;
-    }
-
-    public String getRepoUrl() {
-        return repoUrl;
-    }
-
-    public void setRepoUrl(String repoUrl) {
-        this.repoUrl = repoUrl;
-    }
-
-    public boolean isPrivateRepo() {
-        return isPrivateRepo;
-    }
-
-    public void setPrivateRepo(boolean isPrivateRepo) {
-        this.isPrivateRepo = isPrivateRepo;
-    }
-
-    public String getRepoUsername() {
-        return repoUsername;
-    }
-
-    public void setRepoUsername(String repoUsername) {
-        this.repoUsername = repoUsername;
-    }
-
-    public String getRepoPassword() {
-        return repoPassword;
-    }
-
-    public void setRepoPassword(String repoPassword) {
-        this.repoPassword = repoPassword;
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableInfo.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableInfo.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableInfo.java
index 0190599..09130c3 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableInfo.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/SubscribableInfo.java
@@ -19,9 +19,10 @@
 
 package org.apache.stratos.manager.composite.application.beans;
 
-public class SubscribableInfo {
+import javax.xml.bind.annotation.XmlRootElement;
 
-    private String type;
+@XmlRootElement(name = "subscribableInfo")
+public class SubscribableInfo {
 
     private String alias;
 
@@ -92,12 +93,4 @@ public class SubscribableInfo {
     public void setPassword(String password) {
         this.password = password;
     }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/CompositeApplicationParser.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/CompositeApplicationParser.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/CompositeApplicationParser.java
index 829da0f..e319742 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/CompositeApplicationParser.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/CompositeApplicationParser.java
@@ -19,11 +19,12 @@
 
 package org.apache.stratos.manager.composite.application.parser;
 
-import org.apache.stratos.cloud.controller.stub.pojo.CompositeApplicationDefinition;
+import org.apache.stratos.manager.composite.application.structure.CompositeAppContext;
 import org.apache.stratos.manager.exception.CompositeApplicationDefinitionException;
 
 
+
 public interface CompositeApplicationParser {
 
-    public CompositeApplicationDefinition parse (Object obj) throws CompositeApplicationDefinitionException;
+    public CompositeAppContext parse (Object obj) throws CompositeApplicationDefinitionException;
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
index 8e67c80..9bfc864 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
@@ -19,141 +19,328 @@
 
 package org.apache.stratos.manager.composite.application.parser;
 
-import org.apache.commons.lang3.StringUtils;
-import org.apache.stratos.cloud.controller.stub.pojo.CompositeApplicationDefinition;
-import org.apache.stratos.manager.composite.application.beans.*;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.manager.composite.application.beans.CompositeAppDefinition;
+import org.apache.stratos.manager.composite.application.beans.GroupDefinition;
+import org.apache.stratos.manager.composite.application.beans.SubscribableDefinition;
+import org.apache.stratos.manager.composite.application.beans.SubscribableInfo;
+import org.apache.stratos.manager.composite.application.structure.CompositeAppContext;
+import org.apache.stratos.manager.composite.application.structure.GroupContext;
+import org.apache.stratos.manager.composite.application.structure.StartupOrder;
+import org.apache.stratos.manager.composite.application.structure.SubscribableContext;
 import org.apache.stratos.manager.exception.CompositeApplicationDefinitionException;
 import org.apache.stratos.manager.exception.PersistenceManagerException;
 import org.apache.stratos.manager.grouping.definitions.ServiceGroupDefinition;
+import org.apache.stratos.manager.grouping.definitions.StartupOrderDefinition;
 import org.apache.stratos.manager.retriever.DataInsertionAndRetrievalManager;
 
-import java.util.List;
+import java.util.*;
 
 public class DefaultCompositeApplicationParser implements CompositeApplicationParser {
 
-    DataInsertionAndRetrievalManager dataInsertionAndRetrievalManager;
+    private static Log log = LogFactory.getLog(DefaultCompositeApplicationParser.class);
+
+    DataInsertionAndRetrievalManager dataInsertionAndRetrievalMgr;
 
     public DefaultCompositeApplicationParser () {
-        dataInsertionAndRetrievalManager = new DataInsertionAndRetrievalManager();
+        dataInsertionAndRetrievalMgr = new DataInsertionAndRetrievalManager();
     }
 
     @Override
-    public CompositeApplicationDefinition parse (Object compositeAppObj) throws CompositeApplicationDefinitionException {
+    public CompositeAppContext parse(Object obj) throws CompositeApplicationDefinitionException {
 
         CompositeAppDefinition compositeAppDefinition = null;
 
-        if (compositeAppObj instanceof CompositeAppDefinition) {
-            compositeAppDefinition = (CompositeAppDefinition) compositeAppObj;
-
-        } else {
-            throw new CompositeApplicationDefinitionException("Invalid Composite Application definition");
+        if (obj instanceof CompositeAppDefinition) {
+            compositeAppDefinition = (CompositeAppDefinition) obj;
         }
 
         if (compositeAppDefinition == null) {
-            throw new CompositeApplicationDefinitionException("Composite Application definition not found");
+            throw new CompositeApplicationDefinitionException("Invlaid Composite Application Defintion");
         }
 
-        String compositeAppId = compositeAppDefinition.getApplicationId();
-        if(StringUtils.isEmpty(compositeAppId)){
-            throw new CompositeApplicationDefinitionException("Application ID can not be empty");
+        if (compositeAppDefinition.getAlias() == null || compositeAppDefinition.getAlias().isEmpty()) {
+            throw new CompositeApplicationDefinitionException("Invalid alias specified");
         }
-        String compositeAppAlias = compositeAppDefinition.getAlias();
 
-        // components
-        processComponents(compositeAppDefinition.getComponents());
+        if (compositeAppDefinition.getApplicationId() == null || compositeAppDefinition.getApplicationId().isEmpty()) {
+            throw new CompositeApplicationDefinitionException("Invalid Composite App id specified");
+        }
 
-        return null;
+        // get the defined groups
+        Map<String, GroupDefinition> definedGroups = getDefinedGroups(compositeAppDefinition);
+        if (log.isDebugEnabled()) {
+            Set<Map.Entry<String, GroupDefinition>> groupEntries = definedGroups.entrySet();
+            log.debug("Defined Groups: [ ");
+            for (Map.Entry<String, GroupDefinition> groupEntry : groupEntries) {
+                log.debug("Group alias: " + groupEntry.getKey());
+            }
+            log.debug(" ]");
+        }
+
+        // get the Subscribables Information
+        Map<String, SubscribableInfo> subscribablesInfo = getSubscribableInformation(compositeAppDefinition);
+        if (log.isDebugEnabled()) {
+            Set<Map.Entry<String, SubscribableInfo>> subscribableInfoEntries = subscribablesInfo.entrySet();
+            log.debug("Defined Subscribable Information: [ ");
+            for (Map.Entry<String, SubscribableInfo> subscribableInfoEntry : subscribableInfoEntries) {
+                log.debug("Subscribable Information alias: " + subscribableInfoEntry.getKey());
+            }
+            log.debug(" ]");
+        }
+
+        return buildCompositeAppStructure (compositeAppDefinition, definedGroups, subscribablesInfo);
+    }
+
+    private Map<String, GroupDefinition> getDefinedGroups (CompositeAppDefinition compositeAppDefinition) throws
+            CompositeApplicationDefinitionException {
+
+        // map [group alias -> Group Definition]
+        Map<String, GroupDefinition> definedGroups = null;
+
+        if (compositeAppDefinition.getComponents() != null) {
+            if (compositeAppDefinition.getComponents().getGroups() != null) {
+                definedGroups = new HashMap<String, GroupDefinition>();
+
+                for (GroupDefinition group : compositeAppDefinition.getComponents().getGroups()) {
+
+                    // check validity of group name
+                    if (group.getName() == null || group.getName().isEmpty()) {
+                        throw new CompositeApplicationDefinitionException("Invalid Group name specified");
+                    }
+
+                    // check if group is deployed
+                    if(isGroupDeployed(group.getName())) {
+                        throw new CompositeApplicationDefinitionException("Group with name " + group.getName() + " not deployed");
+                    }
+
+                    // check validity of group alias
+                    if (group.getAlias() == null || group.getAlias().isEmpty()) {
+                        throw new CompositeApplicationDefinitionException("Invalid Group alias specified");
+                    }
+
+                    // check if a group is already defined under the same alias
+                    if(definedGroups.get(group.getAlias()) != null) {
+                        // a group with same alias already exists, can't continue
+                        throw new CompositeApplicationDefinitionException("A Group with alias " + group.getAlias() + " already exists");
+                    }
+
+                    definedGroups.put(group.getAlias(), group);
+                    if (log.isDebugEnabled()) {
+                        log.debug("Added Group Definition [ " + group.getName() +" , " + group.getAlias() + " ] to map [group alias -> Group Definition]");
+                    }
+                }
+            }
+        }
+
+        return definedGroups;
+    }
+
+    private Map<String, SubscribableInfo> getSubscribableInformation (CompositeAppDefinition compositeAppDefinition) throws
+            CompositeApplicationDefinitionException {
+
+        // map [cartridge alias -> Subscribable Information]
+        Map<String, SubscribableInfo> subscribableInformation = null;
+
+        if (compositeAppDefinition.getSubscribableInfo() != null) {
+            subscribableInformation = new HashMap<String, SubscribableInfo>();
+
+            for (SubscribableInfo subscribableInfo : compositeAppDefinition.getSubscribableInfo()) {
+
+                if (subscribableInfo.getAlias() == null || subscribableInfo.getAlias().isEmpty()) {
+                    throw new CompositeApplicationDefinitionException("Invalid alias specified for Subscribable Information Obj");
+                }
+
+                // check if a group is already defined under the same alias
+                if(subscribableInformation.get(subscribableInfo.getAlias()) != null) {
+                    // a group with same alias already exists, can't continue
+                    throw new CompositeApplicationDefinitionException("A Subscribable Info obj with alias " + subscribableInfo.getAlias() + " already exists");
+                }
+
+                subscribableInformation.put(subscribableInfo.getAlias(), subscribableInfo);
+                if (log.isDebugEnabled()) {
+                    log.debug("Added Subcribables Info obj [ " + subscribableInfo.getAlias() + " ] to map [cartridge alias -> Subscribable Information]");
+                }
+            }
+        }
+
+        return subscribableInformation;
     }
 
-    // TODO: should return the relevant object type to send to CC
-    private void processComponents(List<ComponentDefinition> components) throws CompositeApplicationDefinitionException {
+    private boolean isGroupDeployed (String serviceGroupName) throws CompositeApplicationDefinitionException {
 
-        if (components == null) {
-            return;
+        try {
+           return dataInsertionAndRetrievalMgr.getServiceGroupDefinition(serviceGroupName) != null;
+
+        } catch (PersistenceManagerException e) {
+            throw new CompositeApplicationDefinitionException(e);
         }
 
-        for (ComponentDefinition component : components) {
-            // process the group definitions
-            String groupName = component.getGroup();
-            String groupAlias = component.getAlias();
+    }
+
+    private CompositeAppContext buildCompositeAppStructure (CompositeAppDefinition compositeAppDefinition,
+                                                            Map<String, GroupDefinition> definedGroups,
+                                                            Map<String, SubscribableInfo> subscribableInformation)
+            throws CompositeApplicationDefinitionException {
 
-            // neither group name nor alias can be empty
-            if (StringUtils.isEmpty(groupName)) {
-                throw new CompositeApplicationDefinitionException("Group Name is invalid");
+        CompositeAppContext compositeAppContext = new CompositeAppContext();
+
+        // get top level Subscribables
+        if (compositeAppDefinition.getComponents() != null) {
+            if (compositeAppDefinition.getComponents().getSubscribables() != null) {
+                compositeAppContext.setSubscribableContexts(getSubsribableContexts(compositeAppDefinition.getComponents().getSubscribables(),
+                        subscribableInformation));
             }
-            if (StringUtils.isEmpty(groupAlias)) {
-                throw new CompositeApplicationDefinitionException("Group Alias is invalid");
+
+            // get Groups
+            if (compositeAppDefinition.getComponents().getGroups() != null) {
+                compositeAppContext.setGroupContexts(getGroupContexts(compositeAppDefinition.getComponents().getGroups(),
+                        subscribableInformation, definedGroups));
             }
 
-            // check if the group is deployed. if not can't continue
-            if (!isGroupDeployed(groupName)) {
-                throw new CompositeApplicationDefinitionException(String.format("No Service Group found with name [ %s ]", groupName));
+            // get top level Dependency definitions
+            if (compositeAppDefinition.getComponents().getDependencies() != null) {
+                compositeAppContext.setStartupOrder(getStartupOrderForApplicationComponents(compositeAppDefinition.getComponents().
+                        getDependencies().getStartupOrder()));
+
+                compositeAppContext.setKillBehaviour(compositeAppDefinition.getComponents().getDependencies().getKillBehaviour());
             }
+        }
+
+        return compositeAppContext;
+    }
+
+    private Set<GroupContext> getGroupContexts (List<GroupDefinition> groupDefinitions,
+                                                 Map<String, SubscribableInfo> subscribableInformation,
+                                                 Map<String, GroupDefinition> definedGroups)
+            throws CompositeApplicationDefinitionException {
+
+        Set<GroupContext> groupContexts = new HashSet<GroupContext>();
+
+        for (GroupDefinition group : groupDefinitions) {
+            groupContexts.add(getGroupContext(group, subscribableInformation, definedGroups));
+        }
+
+        return groupContexts;
+    }
+
+    private GroupContext getGroupContext (GroupDefinition group, Map<String, SubscribableInfo> subscribableInformation,
+                                          Map<String, GroupDefinition> definedGroups) throws CompositeApplicationDefinitionException {
+
+        // check if are in the defined Group set
+        GroupDefinition definedGroupDef = definedGroups.get(group.getAlias());
+        if (definedGroupDef == null) {
+            throw new CompositeApplicationDefinitionException("Group Definition with name: " + group.getName() + ", alias: " +
+                    group.getAlias() + " is not found in the all Group Definitions collection");
+        }
 
-            // get group level policy information
-            String groupDepPolicy = component.getDeploymentPolicy();
-            String groupScalePolicy = component.getAutoscalingPolicy();
+        GroupContext groupContext = new GroupContext();
+        // get group level Subscribables
+        if (group.getSubscribables() != null) {
+            groupContext.setName(group.getName());
+            groupContext.setAlias(group.getAlias());
+            groupContext.setAutoscalingPolicy(group.getAutoscalingPolicy());
+            groupContext.setDeploymentPolicy(group.getDeploymentPolicy());
+            groupContext.setSubscribableContexts(getSubsribableContexts(group.getSubscribables(), subscribableInformation));
+            groupContext.setStartupOrder(getStartupOrderForGroup(group.getName()));
+            groupContext.setKillBehaviour(getKillbehaviour(group.getName()));
+        }
+        // get nested groups
+        if (group.getSubGroups() != null) {
+            Set<GroupContext> nestedGroupContexts = new HashSet<GroupContext>();
+            // check sub groups
+            for (GroupDefinition subGroup : group.getSubGroups()) {
+                nestedGroupContexts.add(getGroupContext(subGroup, subscribableInformation, definedGroups));
+            }
 
-            // subscribables
-            processSubscribables(component.getSubscribables());
+            groupContext.setGroupContexts(nestedGroupContexts);
         }
+
+        return groupContext;
     }
 
-    private boolean isGroupDeployed (String groupName) throws CompositeApplicationDefinitionException {
+    private Set<StartupOrder> getStartupOrderForGroup(String serviceGroupName) throws CompositeApplicationDefinitionException {
 
-        ServiceGroupDefinition serviceGroupDefinition = null;
+        ServiceGroupDefinition groupDefinition;
 
         try {
-            serviceGroupDefinition = dataInsertionAndRetrievalManager.getServiceGroupDefinition(groupName);
+            groupDefinition = dataInsertionAndRetrievalMgr.getServiceGroupDefinition(serviceGroupName);
 
         } catch (PersistenceManagerException e) {
             throw new CompositeApplicationDefinitionException(e);
         }
 
-        return serviceGroupDefinition != null;
+        if (groupDefinition == null) {
+            throw new CompositeApplicationDefinitionException("Service Group Definition not found for name " + serviceGroupName);
+        }
+
+        if (groupDefinition.getDependencies() != null) {
+            if (groupDefinition.getDependencies().getStartupOrder() != null) {
+                return ParserUtils.convert(groupDefinition.getDependencies().getStartupOrder());
+            }
+        }
+
+        return null;
     }
 
-    // TODO: should return the relevant object type to send to CC
-    private void processSubscribables (List<SubscribableInfo> subscribables) throws CompositeApplicationDefinitionException {
+    private Set<StartupOrder> getStartupOrderForApplicationComponents (List<StartupOrderDefinition> startupOrderDefinitions)
+            throws CompositeApplicationDefinitionException {
 
-        if (subscribables == null) {
-            return;
+        if (startupOrderDefinitions == null) {
+            return null;
         }
 
-        for (SubscribableInfo subscribable : subscribables) {
+        Set<StartupOrder> startupOrders = new HashSet<StartupOrder>();
 
-            String cartridgeType = subscribable.getType();
-            String subscriptionAlias = subscribable.getAlias();
+        for (StartupOrderDefinition startupOrderDefinition : startupOrderDefinitions) {
+            startupOrders.add(new StartupOrder(startupOrderDefinition.getStart(), startupOrderDefinition.getAfter()));
+        }
 
-            // neither cartridge type nor alias can be empty
-            if (cartridgeType == null || cartridgeType.isEmpty()) {
-                throw new CompositeApplicationDefinitionException("Cartridge Type is invalid");
-            }
-            if (subscriptionAlias == null || subscriptionAlias.isEmpty()) {
-                throw new CompositeApplicationDefinitionException("Subscription Alias is invalid");
-            }
-        // TODO should validate if there exist a cartridge with  $cartridgeType
+        return startupOrders;
+    }
+
+    private String getKillbehaviour (String serviceGroupName) throws CompositeApplicationDefinitionException {
+
+        ServiceGroupDefinition groupDefinition;
+
+        try {
+            groupDefinition = dataInsertionAndRetrievalMgr.getServiceGroupDefinition(serviceGroupName);
+
+        } catch (PersistenceManagerException e) {
+            throw new CompositeApplicationDefinitionException(e);
+        }
 
+        if (groupDefinition == null) {
+            throw new CompositeApplicationDefinitionException("Service Group Definition not found for name " + serviceGroupName);
         }
+
+        if (groupDefinition.getDependencies() != null) {
+            return groupDefinition.getDependencies().getKillBehaviour();
+        }
+
+        return null;
+
     }
 
-    // TODO: should return the relevant object type to send to CC
-    private void getSubscriptionInformation (List<SubscribableInfo> subscribables, String subscriptionAlias) throws CompositeApplicationDefinitionException {
+    private Set<SubscribableContext> getSubsribableContexts (List<SubscribableDefinition> subscribableDefinitions,
+                                                              Map<String, SubscribableInfo> subscribableInformation)
+            throws CompositeApplicationDefinitionException {
 
-        for (SubscribableInfo subscribable : subscribables) {
+        Set<SubscribableContext> subscribableContexts = new HashSet<SubscribableContext>();
 
-            if (subscribable.getAlias().equals(subscriptionAlias)) {
-                // match found, retrieve the information
-                String deploymentPolicy = subscribable.getDeploymentPolicy();
-                String autoscalingPolicy = subscribable.getAutoscalingPolicy();
-                String repoUrl = subscribable.getRepoUrl();
-                if (repoUrl != null && !repoUrl.isEmpty()) {
-                    boolean privateRepo = subscribable.isPrivateRepo();
-                    String repoUsername = subscribable.getUsername();
-                    String repoPassword = subscribable.getPassword();
-                }
+        for (SubscribableDefinition subscribableDefinition : subscribableDefinitions) {
+            // check is there is a related Subscribable Information
+            SubscribableInfo subscribableInfo = subscribableInformation.get(subscribableDefinition.getAlias());
+            if (subscribableInfo == null) {
+                throw new CompositeApplicationDefinitionException("Related Subscribable Information not found for Subscribable with alias: "
+                        + subscribableDefinition.getAlias());
             }
+
+            subscribableContexts.add(ParserUtils.convert(subscribableDefinition, subscribableInfo));
         }
+
+        return subscribableContexts;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/ParserUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/ParserUtils.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/ParserUtils.java
new file mode 100644
index 0000000..be9e703
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/ParserUtils.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.composite.application.parser;
+
+import org.apache.stratos.manager.composite.application.beans.GroupDefinition;
+import org.apache.stratos.manager.composite.application.beans.SubscribableDefinition;
+import org.apache.stratos.manager.composite.application.beans.SubscribableInfo;
+import org.apache.stratos.manager.composite.application.structure.GroupContext;
+import org.apache.stratos.manager.composite.application.structure.StartupOrder;
+import org.apache.stratos.manager.composite.application.structure.SubscribableContext;
+import org.apache.stratos.manager.grouping.definitions.ServiceGroupDefinition;
+import org.apache.stratos.manager.grouping.definitions.StartupOrderDefinition;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ParserUtils {
+
+    public static SubscribableContext convert (SubscribableDefinition subscribable, SubscribableInfo subscribableInfo) {
+
+        SubscribableContext subscribableContext = new SubscribableContext(subscribable.getType(), subscribable.getAlias());
+        subscribableContext.setAutoscalingPolicy(subscribableInfo.getAutoscalingPolicy());
+        subscribableContext.setDeploymentPolicy(subscribableInfo.getDeploymentPolicy());
+
+        if (subscribableInfo.getRepoUrl() != null && !subscribableInfo.getRepoUrl().isEmpty()) {
+            subscribableContext.setRepoUrl(subscribableInfo.getRepoUrl());
+            subscribableContext.setPrivateRepo(subscribableInfo.isPrivateRepo());
+            subscribableContext.setUsername(subscribableInfo.getUsername());
+            subscribableContext.setPassword(subscribableInfo.getPassword());
+        }
+
+        return subscribableContext;
+    }
+
+    public static Set<StartupOrder> convert (List<StartupOrderDefinition> startupOrderDefinitions) {
+
+        Set<StartupOrder> startupOrders = new HashSet<StartupOrder>();
+        for (StartupOrderDefinition startupOrderDefinition : startupOrderDefinitions) {
+            StartupOrder startupOrder = new StartupOrder(startupOrderDefinition.getStart(), startupOrderDefinition.getAfter());
+            startupOrders.add(startupOrder);
+        }
+
+        return startupOrders;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/CompositeAppContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/CompositeAppContext.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/CompositeAppContext.java
new file mode 100644
index 0000000..6a589e7
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/CompositeAppContext.java
@@ -0,0 +1,75 @@
+/*
+ * 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.manager.composite.application.structure;
+
+import java.util.Set;
+
+public class CompositeAppContext {
+
+    private String appId;
+
+    private Set<GroupContext> groupContexts;
+
+    private Set<SubscribableContext> subscribableContexts;
+
+    private Set<StartupOrder> startupOrder;
+
+    private String killBehaviour;
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public Set<GroupContext> getGroupContexts() {
+        return groupContexts;
+    }
+
+    public void setGroupContexts(Set<GroupContext> groupContexts) {
+        this.groupContexts = groupContexts;
+    }
+
+    public Set<SubscribableContext> getSubscribableContexts() {
+        return subscribableContexts;
+    }
+
+    public void setSubscribableContexts(Set<SubscribableContext> subscribableContexts) {
+        this.subscribableContexts = subscribableContexts;
+    }
+
+    public Set<StartupOrder> getStartupOrder() {
+        return startupOrder;
+    }
+
+    public void setStartupOrder(Set<StartupOrder> startupOrder) {
+        this.startupOrder = startupOrder;
+    }
+
+    public String getKillBehaviour() {
+        return killBehaviour;
+    }
+
+    public void setKillBehaviour(String killBehaviour) {
+        this.killBehaviour = killBehaviour;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/GroupContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/GroupContext.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/GroupContext.java
new file mode 100644
index 0000000..e7736ea
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/GroupContext.java
@@ -0,0 +1,107 @@
+/*
+ * 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.manager.composite.application.structure;
+
+import java.util.List;
+import java.util.Set;
+
+public class GroupContext {
+
+    private String name;
+
+    private String alias;
+
+    private String deploymentPolicy;
+
+    private String autoscalingPolicy;
+
+    private Set<GroupContext> groupContexts;
+
+    private Set<SubscribableContext> subscribableContexts;
+
+    private Set<StartupOrder> startupOrder;
+
+    private String killBehaviour;
+
+
+    public Set<StartupOrder> getStartupOrder() {
+        return startupOrder;
+    }
+
+    public void setStartupOrder(Set<StartupOrder> startupOrder) {
+        this.startupOrder = startupOrder;
+    }
+
+    public String getKillBehaviour() {
+        return killBehaviour;
+    }
+
+    public void setKillBehaviour(String killBehaviour) {
+        this.killBehaviour = killBehaviour;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public String getDeploymentPolicy() {
+        return deploymentPolicy;
+    }
+
+    public void setDeploymentPolicy(String deploymentPolicy) {
+        this.deploymentPolicy = deploymentPolicy;
+    }
+
+    public String getAutoscalingPolicy() {
+        return autoscalingPolicy;
+    }
+
+    public void setAutoscalingPolicy(String autoscalingPolicy) {
+        this.autoscalingPolicy = autoscalingPolicy;
+    }
+
+    public Set<GroupContext> getGroupContexts() {
+        return groupContexts;
+    }
+
+    public void setGroupContexts(Set<GroupContext> groupContexts) {
+        this.groupContexts = groupContexts;
+    }
+
+    public Set<SubscribableContext> getSubscribableContexts() {
+        return subscribableContexts;
+    }
+
+    public void setSubscribableContexts(Set<SubscribableContext> subscribableContexts) {
+        this.subscribableContexts = subscribableContexts;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/StartupOrder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/StartupOrder.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/StartupOrder.java
new file mode 100644
index 0000000..4553a9f
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/StartupOrder.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.composite.application.structure;
+
+public class StartupOrder {
+
+    private String start;
+
+    private String after;
+
+    public StartupOrder (String start, String after) {
+        this.start = start;
+        this.after = after;
+    }
+
+    public String getStart() {
+        return start;
+    }
+
+    public void setStart(String start) {
+        this.start = start;
+    }
+
+    public String getAfter() {
+        return after;
+    }
+
+    public void setAfter(String after) {
+        this.after = after;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/SubscribableContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/SubscribableContext.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/SubscribableContext.java
new file mode 100644
index 0000000..2e30c1b
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/structure/SubscribableContext.java
@@ -0,0 +1,108 @@
+/*
+ * 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.manager.composite.application.structure;
+
+public class SubscribableContext {
+
+    private String cartridgeType;
+
+    private String alias;
+
+    private String deploymentPolicy;
+
+    private String autoscalingPolicy;
+
+    private String repoUrl;
+
+    private boolean privateRepo;
+
+    private String username;
+
+    private String password;
+
+    public SubscribableContext (String cartridgeType, String alias) {
+        this.cartridgeType = cartridgeType;
+        this.alias = alias;
+    }
+
+    public String getCartridgeType() {
+        return cartridgeType;
+    }
+
+    public void setCartridgeType(String cartridgeType) {
+        this.cartridgeType = cartridgeType;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public String getDeploymentPolicy() {
+        return deploymentPolicy;
+    }
+
+    public void setDeploymentPolicy(String deploymentPolicy) {
+        this.deploymentPolicy = deploymentPolicy;
+    }
+
+    public String getAutoscalingPolicy() {
+        return autoscalingPolicy;
+    }
+
+    public void setAutoscalingPolicy(String autoscalingPolicy) {
+        this.autoscalingPolicy = autoscalingPolicy;
+    }
+
+    public String getRepoUrl() {
+        return repoUrl;
+    }
+
+    public void setRepoUrl(String repoUrl) {
+        this.repoUrl = repoUrl;
+    }
+
+    public boolean isPrivateRepo() {
+        return privateRepo;
+    }
+
+    public void setPrivateRepo(boolean privateRepo) {
+        this.privateRepo = privateRepo;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/CompositeApplicationException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/CompositeApplicationException.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/CompositeApplicationException.java
new file mode 100644
index 0000000..ea47536
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/CompositeApplicationException.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.exception;
+
+public class CompositeApplicationException extends Exception {
+
+    private String message;
+
+    public CompositeApplicationException () {
+        super();
+    }
+
+    public CompositeApplicationException (String message, Throwable cause) {
+        super(message, cause);
+        this.message = message;
+    }
+
+    public CompositeApplicationException (String message) {
+        super(message);
+        this.message = message;
+    }
+
+    public CompositeApplicationException (Throwable cause) {
+        super(cause);
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
index 88641fc..f778760 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
@@ -59,6 +59,35 @@ public class CartridgeSubscriptionManager {
 
     private static Log log = LogFactory.getLog(CartridgeSubscriptionManager.class);
     //private static DataInsertionAndRetrievalManager dataInsertionAndRetrievalManager = new DataInsertionAndRetrievalManager();
+
+    public CartridgeSubscription createCartridgeSubscription (SubscriptionData subscriptionData) throws ADCException,
+            InvalidCartridgeAliasException, DuplicateCartridgeAliasException, PolicyException, UnregisteredCartridgeException,
+            RepositoryRequiredException, RepositoryCredentialsRequiredException, RepositoryTransportException,
+            AlreadySubscribedException, InvalidRepositoryException {
+
+
+        CartridgeSubscriptionUtils.validateCartridgeAlias(subscriptionData.getTenantId(), subscriptionData.getCartridgeType(), subscriptionData.getCartridgeAlias());
+
+        CartridgeInfo cartridgeInfo;
+        try {
+            cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(subscriptionData.getCartridgeType());
+
+        } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) {
+            String message = subscriptionData.getCartridgeType() + " is not a valid cartridgeSubscription type. Please try again with a valid cartridgeSubscription type.";
+            log.error(message);
+            throw new ADCException(message, e);
+
+        } catch (Exception e) {
+            String message = "Error getting info for " + subscriptionData.getCartridgeType();
+            log.error(message, e);
+            throw new ADCException(message, e);
+        }
+
+        // subscribe to relevant service cartridge
+        CartridgeSubscription serviceCartridgeSubscription = subscribe (subscriptionData, cartridgeInfo, null);
+
+        return serviceCartridgeSubscription;
+    }
     
     public SubscriptionInfo subscribeToCartridgeWithProperties(SubscriptionData subscriptionData)  throws ADCException,
                                                                                             InvalidCartridgeAliasException,

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CompositeAppSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CompositeAppSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CompositeAppSubscription.java
new file mode 100644
index 0000000..d60e939
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CompositeAppSubscription.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.subscription;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+public class CompositeAppSubscription implements Serializable {
+
+    private static Log log = LogFactory.getLog(CompositeAppSubscription.class);
+
+    private Map<String, String> compositeAppToCartridgeSubcription;
+
+    public CompositeAppSubscription () {
+        compositeAppToCartridgeSubcription = new HashMap<String, String>();
+    }
+
+    public void addCartridgeSubscription (String compositeAppAlias, String cartridgeSubscriptionAlias) {
+
+        compositeAppToCartridgeSubcription.put(compositeAppAlias, cartridgeSubscriptionAlias);
+        if (log.isDebugEnabled()) {
+            log.debug("Cartridge Subscription alias [ "+ cartridgeSubscriptionAlias +" ] stored against Composite Application alias [ "
+                    + compositeAppAlias + " ]");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
index d09451c..804e4b5 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
@@ -251,25 +251,25 @@ public class ServiceUtils {
             return stratosAdminResponse;
         }
 */
-    static StratosAdminResponse deployCompositeApplicationDefintion (CompositeAppDefinition compositeAppDefinition)
+    static void deployCompositeApplicationDefintion (CompositeAppDefinition compositeAppDefinition, ConfigurationContext ctxt,
+                                                                     String userName, String tenantDomain)
             throws RestAPIException {
 
+        int tenantId = ApplicationManagementUtil.getTenantId(ctxt);
+
         try {
-            compositeApplicationManager.deployCompositeApplication(compositeAppDefinition);
+            compositeApplicationManager.deployCompositeApplication(compositeAppDefinition, tenantId, tenantDomain, userName);
 
         } catch (CompositeApplicationDefinitionException e) {
-            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+            throw new RestAPIException(e);
         } catch (PersistenceManagerException e) {
-            e.printStackTrace();
+            throw new RestAPIException(e);
+        } catch (CompositeApplicationException e) {
+            throw new RestAPIException(e);
         }
-        //TODO send to CC
-        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
-        stratosAdminResponse.setMessage("Successfully deployed Composite Application [ Id: " + compositeAppDefinition.getApplicationId()
-                + " , alias: " + compositeAppDefinition.getAlias() + " ]");
-        return stratosAdminResponse;
     }
     
-    static StratosAdminResponse unDeployApplication(String configCompositeApplicationAlias, ConfigurationContext ctxt,
+    static void unDeployApplication(String configCompositeApplicationAlias, ConfigurationContext ctxt,
             String userName, String tenantDomain) throws RestAPIException {
 
     		log.info("Starting to undeploy a composite application definition " + configCompositeApplicationAlias);
@@ -308,10 +308,6 @@ public class ServiceUtils {
             }
     		
     		log.info(String.format("[type] %s", configCompositeApplicationAlias));
-
-    		StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
-    		stratosAdminResponse.setMessage("Successfully un-deployed application with alias " + configCompositeApplicationAlias);
-    		return stratosAdminResponse;
     }
     
     
@@ -1423,7 +1419,7 @@ public class ServiceUtils {
         return stratosAdminResponse;
     }
 
-    static StratosAdminResponse deployServiceGroupDefinition (ServiceGroupDefinition serviceGroupDefinition) throws RestAPIException {
+    static void deployServiceGroupDefinition (ServiceGroupDefinition serviceGroupDefinition) throws RestAPIException {
 
         try {
             serviceGropingManager.deployServiceGroupDefinition(serviceGroupDefinition);
@@ -1439,10 +1435,6 @@ public class ServiceUtils {
         }
 
         log.info("Successfully deployed the Service Group Definition with name " + serviceGroupDefinition.getName());
-
-        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
-        stratosAdminResponse.setMessage("Successfully deployed Service Group Definition with name " + serviceGroupDefinition.getName());
-        return stratosAdminResponse;
     }
 
     static ServiceGroupDefinition getServiceGroupDefinition (String serviceGroupDefinitionName) throws RestAPIException {
@@ -1455,7 +1447,7 @@ public class ServiceUtils {
         }
     }
 
-    static StratosAdminResponse undeployServiceGroupDefinition (String serviceGroupDefinitionName) throws RestAPIException {
+    static void undeployServiceGroupDefinition (String serviceGroupDefinitionName) throws RestAPIException {
 
         try {
             serviceGropingManager.undeployServiceGroupDefinition(serviceGroupDefinitionName);
@@ -1465,9 +1457,5 @@ public class ServiceUtils {
         }
 
         log.info("Successfully undeployed the Service Group Definition with name " + serviceGroupDefinitionName);
-
-        StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
-        stratosAdminResponse.setMessage("Successfully undeplpoyed Service Group Definition with name " + serviceGroupDefinitionName);
-        return stratosAdminResponse;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/fabc64a0/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java
index 8cdf16b..98b3725 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java
@@ -63,7 +63,9 @@ import javax.ws.rs.*;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
 
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
@@ -73,6 +75,8 @@ public class StratosAdmin extends AbstractAdmin {
     private static Log log = LogFactory.getLog(StratosAdmin.class);
     @Context
     HttpServletRequest httpServletRequest;
+    @Context
+    UriInfo uriInfo;
 
     @POST
     @Path("/init")
@@ -130,10 +134,13 @@ public class StratosAdmin extends AbstractAdmin {
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
     @SuperTenantService(true)
     // Grouping
-    public StratosAdminResponse deployApplicationDefinition(CompositeAppDefinition applicationDefinitionBean)
+    public Response deployApplicationDefinition(CompositeAppDefinition applicationDefinitionBean)
             throws RestAPIException {
-        return ServiceUtils.deployCompositeApplicationDefintion(applicationDefinitionBean);
+         ServiceUtils.deployCompositeApplicationDefintion(applicationDefinitionBean, getConfigContext(),
+                getUsername(), getTenantDomain());
 
+         URI url =  uriInfo.getAbsolutePathBuilder().path(applicationDefinitionBean.getApplicationId()).build();
+         return Response.created(url).build();
     }
 
  /*   @POST
@@ -157,12 +164,12 @@ public class StratosAdmin extends AbstractAdmin {
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
     @SuperTenantService(true)
     // Grouping
-    public StratosAdminResponse unDeployApplicationDefinition(String alias)
+    public Response unDeployApplicationDefinition(String alias)
             throws RestAPIException {
 
-        return ServiceUtils.unDeployApplication(alias, getConfigContext(), getUsername(),
-                                     getTenantDomain());
-
+        ServiceUtils.unDeployApplication(alias, getConfigContext(), getUsername(),
+                getTenantDomain());
+        return Response.noContent().build();
     }
     
 
@@ -174,11 +181,12 @@ public class StratosAdmin extends AbstractAdmin {
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
     @SuperTenantService(true)
     // Grouping
-    public StratosAdminResponse unDeployApplicationDefinitionX(@PathParam("applicationAlias")String  configCompositeApplicationAlias)
+    public Response unDeployApplicationDefinitionX(@PathParam("applicationAlias")String  configCompositeApplicationAlias)
             throws RestAPIException {
 
-        return ServiceUtils.unDeployApplication(configCompositeApplicationAlias, getConfigContext(), getUsername(),
-                getTenantDomain());
+         ServiceUtils.unDeployApplication(configCompositeApplicationAlias, getConfigContext(), getUsername(),
+                 getTenantDomain());
+        return Response.noContent().build();
 
     }
     
@@ -232,10 +240,12 @@ public class StratosAdmin extends AbstractAdmin {
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
     @SuperTenantService(true)
-    public StratosAdminResponse deployServiceGroupDefinition (ServiceGroupDefinition serviceGroupDefinition)
+    public Response deployServiceGroupDefinition (ServiceGroupDefinition serviceGroupDefinition)
             throws RestAPIException {
 
-        return ServiceUtils.deployServiceGroupDefinition(serviceGroupDefinition);
+        ServiceUtils.deployServiceGroupDefinition(serviceGroupDefinition);
+        URI url =  uriInfo.getAbsolutePathBuilder().path(serviceGroupDefinition.getName()).build();
+        return Response.created(url).build();
     }
 
     @GET
@@ -243,10 +253,10 @@ public class StratosAdmin extends AbstractAdmin {
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public ServiceGroupDefinition getServiceGroupDefinition (@PathParam("groupDefinitionName") String groupDefinitionName)
+    public Response getServiceGroupDefinition (@PathParam("groupDefinitionName") String groupDefinitionName)
             throws RestAPIException {
-
-        return ServiceUtils.getServiceGroupDefinition(groupDefinitionName);
+        Response.ResponseBuilder rb = Response.ok().entity(ServiceUtils.getServiceGroupDefinition(groupDefinitionName));
+        return rb.build();
     }
 
     @DELETE
@@ -255,10 +265,11 @@ public class StratosAdmin extends AbstractAdmin {
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
     @SuperTenantService(true)
-    public StratosAdminResponse undeployServiceGroupDefinition (@PathParam("groupDefinitionName") String groupDefinitionName)
+    public Response undeployServiceGroupDefinition (@PathParam("groupDefinitionName") String groupDefinitionName)
             throws RestAPIException {
 
-        return ServiceUtils.undeployServiceGroupDefinition(groupDefinitionName);
+        ServiceUtils.undeployServiceGroupDefinition(groupDefinitionName);
+        return Response.noContent().build();
     }
 
     @POST


[3/3] git commit: Merge branch '4.0.0-grouping' of https://git-wip-us.apache.org/repos/asf/stratos into grouping

Posted by ud...@apache.org.
Merge branch '4.0.0-grouping' of https://git-wip-us.apache.org/repos/asf/stratos into grouping

Conflicts:
	components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/CompositeApplicationManager.java
	components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
	components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
	components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CompositeAppSubscription.java
	components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
	components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/StratosAdmin.java


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

Branch: refs/heads/4.0.0-grouping
Commit: 11ff72422cb1c77b066b83728240aa761c24d0d1
Parents: 60f2359 8499eda
Author: Udara Liyanage <ud...@wso2.com>
Authored: Thu Jul 17 17:12:14 2014 +0530
Committer: Udara Liyanage <ud...@wso2.com>
Committed: Thu Jul 17 17:12:14 2014 +0530

----------------------------------------------------------------------
 .../CompositeApplicationManager.java            | 338 +++++++++++++------
 .../DefaultCompositeApplicationParser.java      |  12 +-
 .../application/utils/ApplicationUtils.java     |  14 +
 .../CompositeAppSubscriptionException.java      |  47 +++
 .../exception/GroupSubscriptionException.java   |  47 +++
 .../manager/CartridgeSubscriptionManager.java   |  52 ++-
 .../manager/persistence/PersistenceManager.java |  32 +-
 .../RegistryBasedPersistenceManager.java        | 259 ++------------
 .../DataInsertionAndRetrievalManager.java       | 107 ++----
 .../subscription/CompositeAppSubscription.java  |  54 ++-
 .../manager/subscription/GroupSubscription.java |  83 +++++
 .../rest/endpoint/services/ServiceUtils.java    |  25 --
 12 files changed, 590 insertions(+), 480 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/11ff7242/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
index 9bfc864,fdd0138..a2b36bd
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
@@@ -116,8 -117,8 +117,8 @@@ public class DefaultCompositeApplicatio
                      }
  
                      // check validity of group alias
-                     if (group.getAlias() == null || group.getAlias().isEmpty()) {
-                         throw new CompositeApplicationDefinitionException("Invalid Group alias specified");
 -                    if (group.getAlias() == null || group.getAlias().isEmpty() || ApplicationUtils.isAliasValid(group.getAlias())) {
++                    if (group.getAlias() == null || group.getAlias().isEmpty() || !ApplicationUtils.isAliasValid(group.getAlias())) {
+                         throw new CompositeApplicationDefinitionException("Invalid Group alias specified: [ " + group.getAlias() + " ]");
                      }
  
                      // check if a group is already defined under the same alias
@@@ -148,8 -149,9 +149,9 @@@
  
              for (SubscribableInfo subscribableInfo : compositeAppDefinition.getSubscribableInfo()) {
  
-                 if (subscribableInfo.getAlias() == null || subscribableInfo.getAlias().isEmpty()) {
-                     throw new CompositeApplicationDefinitionException("Invalid alias specified for Subscribable Information Obj");
+                 if (subscribableInfo.getAlias() == null || subscribableInfo.getAlias().isEmpty() ||
 -                        ApplicationUtils.isAliasValid(subscribableInfo.getAlias())) {
++                        !ApplicationUtils.isAliasValid(subscribableInfo.getAlias())) {
+                     throw new CompositeApplicationDefinitionException("Invalid alias specified for Subscribable Information Obj: [ " + subscribableInfo.getAlias() + " ]");
                  }
  
                  // check if a group is already defined under the same alias

http://git-wip-us.apache.org/repos/asf/stratos/blob/11ff7242/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
index 804e4b5,e02ea11..9b7fff8
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
@@@ -308,32 -314,36 +308,7 @@@ public class ServiceUtils 
              }
      		
      		log.info(String.format("[type] %s", configCompositeApplicationAlias));
 -
 -    		StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
 -    		stratosAdminResponse.setMessage("Successfully un-deployed application with alias " + configCompositeApplicationAlias);
 -    		return stratosAdminResponse;
      }
--    
--    
-     static StratosAdminResponse unDeployApplicationOld(String configCompositeApplicationAlias, ConfigurationContext ctxt,
-             String userName, String tenantDomain) throws RestAPIException {
- 
-     		log.info("Starting to undeploy a composite application " + configCompositeApplicationAlias);
-     		
-     		CompositeApplicationManager manager = new CompositeApplicationManager();	
-     		
- 			try {
- 				manager.unDeployCompositeApplication(configCompositeApplicationAlias);
- 			} catch (ADCException e) {
- 				// TODO Auto-generated catch block
- 				e.printStackTrace();
- 				String message = e.getMessage();
- 				log.error(message, e);
- 				throw new RestAPIException(message, e);
- 			}
-     		
-     		log.info("l [type] " + configCompositeApplicationAlias);
- 
-     		StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
-     		stratosAdminResponse.setMessage("Successfully un-deployed application with alias " + configCompositeApplicationAlias);
-     		return stratosAdminResponse;
-     }
 -//    static StratosAdminResponse unDeployApplicationOld(String configCompositeApplicationAlias, ConfigurationContext ctxt,
 -//            String userName, String tenantDomain) throws RestAPIException {
 -//
 -//    		log.info("Starting to undeploy a composite application " + configCompositeApplicationAlias);
 -//
 -//    		CompositeApplicationManager manager = new CompositeApplicationManager();
 -//
 -//			try {
 -//				manager.unDeployCompositeApplication(configCompositeApplicationAlias);
 -//			} catch (ADCException e) {
 -//				// TODO Auto-generated catch block
 -//				e.printStackTrace();
 -//				String message = e.getMessage();
 -//				log.error(message, e);
 -//				throw new RestAPIException(message, e);
 -//			}
 -//
 -//    		log.info("l [type] " + configCompositeApplicationAlias);
 -//
 -//    		StratosAdminResponse stratosAdminResponse = new StratosAdminResponse();
 -//    		stratosAdminResponse.setMessage("Successfully un-deployed application with alias " + configCompositeApplicationAlias);
 -//    		return stratosAdminResponse;
 -//    }
  
      @SuppressWarnings("unused")
      private static DeploymentPolicy[] intersection(


[2/3] git commit: Merge branch '4.0.0-grouping' of https://git-wip-us.apache.org/repos/asf/stratos into grouping

Posted by ud...@apache.org.
Merge branch '4.0.0-grouping' of https://git-wip-us.apache.org/repos/asf/stratos into grouping


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

Branch: refs/heads/4.0.0-grouping
Commit: 60f23599569b076e65bb95d1f43f6a40d977be0c
Parents: fabc64a 1fa2d66
Author: Udara Liyanage <ud...@wso2.com>
Authored: Wed Jul 16 10:47:24 2014 +0530
Committer: Udara Liyanage <ud...@wso2.com>
Committed: Wed Jul 16 10:47:24 2014 +0530

----------------------------------------------------------------------
 .../stratos/autoscaler/AutoscalerContext.java   |  37 +-
 .../autoscaler/ComplexApplicationContext.java   |  38 +-
 .../AutoscalerTopologyEventReceiver.java        | 393 +++++++++++--------
 .../autoscaler/monitor/AbstractMonitor.java     | 145 ++++---
 .../autoscaler/monitor/ClusterMonitor.java      |  38 +-
 .../monitor/CompositeApplicationMonitor.java    | 254 ++++++++++++
 .../autoscaler/monitor/LbClusterMonitor.java    |  25 +-
 .../messaging/domain/topology/Cartridge.java    |  14 +-
 .../domain/topology/CompositeApplication.java   |  24 +-
 .../util/CompositeApplicationBuilder.java       |  18 +-
 .../event/topology/MemberActivatedEvent.java    |  13 +-
 11 files changed, 681 insertions(+), 318 deletions(-)
----------------------------------------------------------------------