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

[4/6] git commit: persisting composite app subscriptions and group subscriptions

persisting composite app subscriptions and group subscriptions


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

Branch: refs/heads/4.0.0-grouping
Commit: 7f5f19b5ef8bd811fd4094d1c47226c81dc46c59
Parents: a8182ac
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Wed Jul 16 18:52:49 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Wed Jul 16 18:52:49 2014 +0530

----------------------------------------------------------------------
 .../CompositeApplicationManager.java            | 269 +++++++++++--------
 .../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  |  15 ++
 .../manager/subscription/GroupSubscription.java |  21 +-
 .../rest/endpoint/services/ServiceUtils.java    |  46 ++--
 10 files changed, 432 insertions(+), 463 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/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 0ca6ebc..fafcdcf 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
@@ -10,20 +10,23 @@ import org.apache.stratos.manager.composite.application.parser.DefaultCompositeA
 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.*;
 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.CompositeAppSubscription;
 import org.apache.stratos.manager.subscription.GroupSubscription;
 import org.apache.stratos.manager.subscription.SubscriptionData;
-import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication;
 
 //Grouping
 public class CompositeApplicationManager {
 	
 	private static Log log = LogFactory.getLog(CompositeApplicationManager.class);
+
+    CartridgeSubscriptionManager cartridgeSubscriptionManager;
+
+    public CompositeApplicationManager () {
+        cartridgeSubscriptionManager = new CartridgeSubscriptionManager();
+    }
 	
 	public void deployCompositeApplication (CompositeAppDefinition compositeAppDefinition, int tenantId, String tenantDomain,
                                             String tenantAdminUsername) throws CompositeApplicationException, CompositeApplicationDefinitionException,
@@ -34,18 +37,22 @@ public class CompositeApplicationManager {
 
         log.info("Composite Application [ Id: " + compositeAppDefinition.getApplicationId() + " , alias: "
                 + compositeAppDefinition.getAlias() + " ] deployed successfully");
-        
-        //DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
-        //mgr.persistCompositeApplication(compositeAppDefinition);
 
         // create the CompositeAppSubscription
-        CompositeAppSubscription compositeAppSubscription = new CompositeAppSubscription(compositeAppContext.getAppId());
+        CompositeAppSubscription compositeAppSubscription;
+        try {
+            compositeAppSubscription = cartridgeSubscriptionManager.createCompositeAppSubscription(compositeAppContext.getAppId(),
+                    tenantAdminUsername, tenantDomain, tenantId);
+
+        } catch (CompositeAppSubscriptionException e) {
+            throw new CompositeApplicationDefinitionException(e);
+        }
 
         // keep track of all CartridgeSubscriptions, against the alias
         Map<String, CartridgeSubscription> aliasToCartridgeSubscription = new HashMap<String, CartridgeSubscription>();
 
         // Keep track of all Group Subscriptions
-        Set<GroupSubscription> groupSubscriptions = new HashSet<GroupSubscription>();
+        Map<String, GroupSubscription> groupAliasToGroupSubscription = new HashMap<String, GroupSubscription>();
 
         // traverse through the Composite App Structure and create Cartridge Subscriptions
         if(compositeAppContext.getSubscribableContexts() != null) {
@@ -53,6 +60,13 @@ public class CompositeApplicationManager {
 
             for (CartridgeSubscription cartridgeSubscription : getCartridgeSybscriptionsForSubscribables(compositeAppContext.getSubscribableContexts(),
                     tenantId, tenantDomain, tenantAdminUsername)) {
+
+                // check if a Cartridge Subscription already exists with this alias for this Composite App
+                if (cartridgeSubscriptionExistsForAlias(aliasToCartridgeSubscription, cartridgeSubscription.getAlias())) {
+                    throw new CompositeApplicationException("Cartridge Subscription with alias [ " + cartridgeSubscription.getAlias()
+                            + " ] already exists in Composite Application [ " + compositeAppSubscription.getAppId() + " ]");
+                }
+
                 aliasToCartridgeSubscription.put(cartridgeSubscription.getAlias(), cartridgeSubscription);
             }
             // get top level cartridge aliases to add to Composite App Subscription
@@ -64,13 +78,31 @@ public class CompositeApplicationManager {
 
             for (CartridgeSubscription cartridgeSubscription : getCartridgeSubscriptionForGroups(compositeAppContext.getGroupContexts(), tenantId,
                     tenantDomain, tenantAdminUsername)) {
+
+                // check if a Cartridge Subscription already exists with this alias for this Composite App
+                if (cartridgeSubscriptionExistsForAlias(aliasToCartridgeSubscription, cartridgeSubscription.getAlias())) {
+                    throw new CompositeApplicationException("Cartridge Subscription with alias [ " + cartridgeSubscription.getAlias()
+                            + " ] already exists in Composite Application [ " + compositeAppSubscription.getAppId() + " ]");
+                }
+
                 aliasToCartridgeSubscription.put(cartridgeSubscription.getAlias(), cartridgeSubscription);
             }
 
+            // create Group Subscriptions and collect them
+            for (GroupSubscription groupSubscription : getGroupSubscriptions(compositeAppContext.getGroupContexts(),
+                    tenantAdminUsername, tenantDomain, tenantId)) {
+
+                // check if a Group Subscription already exists with this alias for this Composite App
+                if (groupSubscriptionExistsForAlias(groupAliasToGroupSubscription, groupSubscription.getGroupAlias())) {
+                    throw new CompositeApplicationException("Group Subscription with alias [ " + groupSubscription.getGroupAlias()
+                            + " ] already exists in Composite Application [ " + compositeAppSubscription.getAppId() + " ]");
+                }
+
+                groupAliasToGroupSubscription.put(groupSubscription.getGroupAlias(), groupSubscription);
+            }
+
             // set top level group aliases to Composite App Subscription
             compositeAppSubscription.addGroupSubscriptionAliases(getGroupSubscriptionAliases(compositeAppContext.getGroupContexts()));
-
-            groupSubscriptions.addAll(getGroupSubscriptions(compositeAppContext.getGroupContexts()));
         }
 	}
 
@@ -84,12 +116,20 @@ public class CompositeApplicationManager {
         return cartridgeSubscriptionAliases;
     }
 
-    private Set<GroupSubscription> getGroupSubscriptions (Set<GroupContext> groupContexts) throws CompositeApplicationException {
+    private Set<GroupSubscription> getGroupSubscriptions (Set<GroupContext> groupContexts, String tenantAdminUsername,
+                                                          String tenantDomain, int tenantID) throws CompositeApplicationException {
 
         Set<GroupSubscription> groupSubscriptions = new HashSet<GroupSubscription>();
         for (GroupContext groupContext : groupContexts) {
             // create Group Subscriptions for this Group
-            GroupSubscription groupSubscription = new GroupSubscription(groupContext.getAlias());
+            GroupSubscription groupSubscription;
+            try {
+                groupSubscription = cartridgeSubscriptionManager.createGroupSubscription(groupContext.getName(),
+                        groupContext.getAlias(), tenantAdminUsername, tenantDomain, tenantID);
+
+            } catch (GroupSubscriptionException e) {
+                throw new CompositeApplicationException(e);
+            }
             if (groupContext.getSubscribableContexts() != null) {
                 groupSubscription.addCartridgeSubscriptionAliases(getCartrigdeSubscriptionAliases(groupContext.getSubscribableContexts()));
             }
@@ -98,7 +138,7 @@ public class CompositeApplicationManager {
             if (groupContext.getGroupContexts() != null) {
                 groupSubscription.addGroupSubscriptionAliases(getGroupSubscriptionAliases(groupContext.getGroupContexts()));
                 // need to recurse to get other nested groups, if any
-                getGroupSubscriptions(groupContext.getGroupContexts());
+                getGroupSubscriptions(groupContext.getGroupContexts(),tenantAdminUsername, tenantDomain, tenantID);
             }
 
             groupSubscriptions.add(groupSubscription);
@@ -201,104 +241,117 @@ public class CompositeApplicationManager {
         }
 
     }
+
+    private boolean cartridgeSubscriptionExistsForAlias (Map<String, CartridgeSubscription> aliasToCartridgeSubscription,
+                                                                 String newCartridgeSubscriptionAlias) {
+
+        return aliasToCartridgeSubscription.get(newCartridgeSubscriptionAlias) != null;
+    }
+
+
+    private boolean groupSubscriptionExistsForAlias (Map<String, GroupSubscription> groupAliasToGroupSubscription,
+                                                         String newGroupSubscriptionAlias) {
+
+        return groupAliasToGroupSubscription.get(newGroupSubscriptionAlias) != null;
+    }
 	
-	public void unDeployCompositeApplication(String configApplicationAlias) throws ADCException {
-		if (log.isDebugEnabled()) {
-			log.debug("undeploying composite application " + configApplicationAlias);
-		}
-		// unregister application
-		unRegisterCompositeApplication(configApplicationAlias);
-		if (log.isDebugEnabled()) {
-			log.debug("publishing composite application removed event" + configApplicationAlias);
-		}
-		ApplicationUtils.publishApplicationUnDeployEvent(configApplicationAlias);
-		if (log.isDebugEnabled()) {
-			log.debug("composite application successfully removed " + configApplicationAlias);
-		}
-	}
+//	public void unDeployCompositeApplication(String configApplicationAlias) throws ADCException {
+//		if (log.isDebugEnabled()) {
+//			log.debug("undeploying composite application " + configApplicationAlias);
+//		}
+//		// unregister application
+//		unRegisterCompositeApplication(configApplicationAlias);
+//		if (log.isDebugEnabled()) {
+//			log.debug("publishing composite application removed event" + configApplicationAlias);
+//		}
+//		ApplicationUtils.publishApplicationUnDeployEvent(configApplicationAlias);
+//		if (log.isDebugEnabled()) {
+//			log.debug("composite application successfully removed " + configApplicationAlias);
+//		}
+//	}
 	
-	private void registerCompositeApplication(ConfigCompositeApplication configCompositeApplication) throws ADCException {
-		
-		try {
-			if (log.isDebugEnabled()) {
-				log.debug("registering composite application " + configCompositeApplication.getAlias());
-			}
-			DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
-			mgr.persistCompositeApplication ( configCompositeApplication);
-			
-			if (log.isDebugEnabled()) {
-				log.debug("testing to retrieve persisted composite application ");
-				Collection<ConfigCompositeApplication> apps = mgr.getCompositeApplications();
-				log.debug("retrieved persisted composite application " + apps.size());
-				for (ConfigCompositeApplication app : apps) {
-					log.debug("retrieved persisted composite application " + app.getAlias());
-				}
-			}
-
-        } catch (PersistenceManagerException e) {
-            String errorMsg = "Error saving composite application " + configCompositeApplication.getAlias();
-            log.error(errorMsg);
-            throw new ADCException(errorMsg, e);
-        }
-
-        log.info("Successfully registered composite application " + configCompositeApplication.getAlias());
-		
-	}
+//	private void registerCompositeApplication(ConfigCompositeApplication configCompositeApplication) throws ADCException {
+//
+//		try {
+//			if (log.isDebugEnabled()) {
+//				log.debug("registering composite application " + configCompositeApplication.getAlias());
+//			}
+//			DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
+//			mgr.persistCompositeApplication ( configCompositeApplication);
+//
+//			if (log.isDebugEnabled()) {
+//				log.debug("testing to retrieve persisted composite application ");
+//				Collection<ConfigCompositeApplication> apps = mgr.getCompositeApplications();
+//				log.debug("retrieved persisted composite application " + apps.size());
+//				for (ConfigCompositeApplication app : apps) {
+//					log.debug("retrieved persisted composite application " + app.getAlias());
+//				}
+//			}
+//
+//        } catch (PersistenceManagerException e) {
+//            String errorMsg = "Error saving composite application " + configCompositeApplication.getAlias();
+//            log.error(errorMsg);
+//            throw new ADCException(errorMsg, e);
+//        }
+//
+//        log.info("Successfully registered composite application " + configCompositeApplication.getAlias());
+//
+//	}
 	
-	private void unRegisterCompositeApplication(String configApplicationAlias) throws ADCException {
-		
-		try {
-			if (log.isDebugEnabled()) {
-				log.debug("unregistering composite application " + configApplicationAlias);
-			}
-			DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
-			mgr.removeCompositeApplication(configApplicationAlias); 
-			
-			if (log.isDebugEnabled()) {
-				log.debug("removed persisted composite application successfully");
-			}
-
-        } catch (PersistenceManagerException e) {
-            String errorMsg = "Error undeploying composite application " + configApplicationAlias;
-            log.error(errorMsg);
-            throw new ADCException(errorMsg, e);
-        }
-
-        log.info("Successfully undeployed composite application " + configApplicationAlias);
-		
-	}
+//	private void unRegisterCompositeApplication(String configApplicationAlias) throws ADCException {
+//
+//		try {
+//			if (log.isDebugEnabled()) {
+//				log.debug("unregistering composite application " + configApplicationAlias);
+//			}
+//			DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
+//			mgr.removeCompositeApplication(configApplicationAlias);
+//
+//			if (log.isDebugEnabled()) {
+//				log.debug("removed persisted composite application successfully");
+//			}
+//
+//        } catch (PersistenceManagerException e) {
+//            String errorMsg = "Error undeploying composite application " + configApplicationAlias;
+//            log.error(errorMsg);
+//            throw new ADCException(errorMsg, e);
+//        }
+//
+//        log.info("Successfully undeployed composite application " + configApplicationAlias);
+//
+//	}
 	
-	public void restoreCompositeApplications () throws ADCException {
-		try {
-			if (log.isDebugEnabled()) {
-				log.debug("restoring composite applications " );
-			}
-			DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
-			Collection<ConfigCompositeApplication> apps = mgr.getCompositeApplications();
-			
-			if (apps == null) {
-				if (log.isDebugEnabled()) {			
-					log.debug("no composite application configured");
-				}
-				return;
-			}
-			if (log.isDebugEnabled()) {			
-				log.debug("retrieved persisted composite application " + apps.size());
-				for (ConfigCompositeApplication app : apps) {
-					log.debug("retrieved persisted composite application " + app.getAlias());
-				}
-			}
-			// sending application created event to restore in Toplogy
-			for (ConfigCompositeApplication app : apps) {
-				log.debug("restoring composite application " + app.getAlias());
-				ApplicationUtils.publishApplicationCreatedEvent(app);
-			}
-
-        } catch (PersistenceManagerException e) {
-            String errorMsg = "Error restoring composite application ";
-            log.error(errorMsg);
-            throw new ADCException(errorMsg, e);
-        }
-	}
+//	public void restoreCompositeApplications () throws ADCException {
+//		try {
+//			if (log.isDebugEnabled()) {
+//				log.debug("restoring composite applications " );
+//			}
+//			DataInsertionAndRetrievalManager mgr = new DataInsertionAndRetrievalManager();
+//			Collection<ConfigCompositeApplication> apps = mgr.getCompositeApplications();
+//
+//			if (apps == null) {
+//				if (log.isDebugEnabled()) {
+//					log.debug("no composite application configured");
+//				}
+//				return;
+//			}
+//			if (log.isDebugEnabled()) {
+//				log.debug("retrieved persisted composite application " + apps.size());
+//				for (ConfigCompositeApplication app : apps) {
+//					log.debug("retrieved persisted composite application " + app.getAlias());
+//				}
+//			}
+//			// sending application created event to restore in Toplogy
+//			for (ConfigCompositeApplication app : apps) {
+//				log.debug("restoring composite application " + app.getAlias());
+//				ApplicationUtils.publishApplicationCreatedEvent(app);
+//			}
+//
+//        } catch (PersistenceManagerException e) {
+//            String errorMsg = "Error restoring composite application ";
+//            log.error(errorMsg);
+//            throw new ADCException(errorMsg, e);
+//        }
+//	}
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/CompositeAppSubscriptionException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/CompositeAppSubscriptionException.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/CompositeAppSubscriptionException.java
new file mode 100644
index 0000000..710c5f5
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/CompositeAppSubscriptionException.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 CompositeAppSubscriptionException extends Exception {
+
+    private String message;
+
+    public CompositeAppSubscriptionException() {
+        super();
+    }
+
+    public CompositeAppSubscriptionException(String message, Throwable cause) {
+        super(message, cause);
+        this.message = message;
+    }
+
+    public CompositeAppSubscriptionException(String message) {
+        super(message);
+        this.message = message;
+    }
+
+    public CompositeAppSubscriptionException(Throwable cause) {
+        super(cause);
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/GroupSubscriptionException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/GroupSubscriptionException.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/GroupSubscriptionException.java
new file mode 100644
index 0000000..de24a45
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/GroupSubscriptionException.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 GroupSubscriptionException extends Exception {
+
+    private String message;
+
+    public GroupSubscriptionException () {
+        super();
+    }
+
+    public GroupSubscriptionException (String message, Throwable cause) {
+        super(message, cause);
+        this.message = message;
+    }
+
+    public GroupSubscriptionException (String message) {
+        super(message);
+        this.message = message;
+    }
+
+    public GroupSubscriptionException (Throwable cause) {
+        super(cause);
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/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 f778760..a86c379 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
@@ -31,9 +31,7 @@ import org.apache.stratos.manager.lb.category.*;
 import org.apache.stratos.manager.repository.Repository;
 import org.apache.stratos.manager.retriever.DataInsertionAndRetrievalManager;
 import org.apache.stratos.manager.subscriber.Subscriber;
-import org.apache.stratos.manager.subscription.CartridgeSubscription;
-import org.apache.stratos.manager.subscription.PersistenceContext;
-import org.apache.stratos.manager.subscription.SubscriptionData;
+import org.apache.stratos.manager.subscription.*;
 import org.apache.stratos.manager.subscription.factory.CartridgeSubscriptionFactory;
 import org.apache.stratos.manager.subscription.tenancy.SubscriptionMultiTenantBehaviour;
 import org.apache.stratos.manager.subscription.tenancy.SubscriptionSingleTenantBehaviour;
@@ -60,6 +58,54 @@ public class CartridgeSubscriptionManager {
     private static Log log = LogFactory.getLog(CartridgeSubscriptionManager.class);
     //private static DataInsertionAndRetrievalManager dataInsertionAndRetrievalManager = new DataInsertionAndRetrievalManager();
 
+    public GroupSubscription createGroupSubscription (String groupName, String groupAlias, String tenantAdminUsername,
+                                                      String tenantDomain, int tenantId) throws GroupSubscriptionException {
+
+        DataInsertionAndRetrievalManager dataInsertionAndRetrievalMgr = new DataInsertionAndRetrievalManager();
+        GroupSubscription groupSubscription;
+
+        try {
+            groupSubscription = dataInsertionAndRetrievalMgr.getGroupSubscription(tenantId, groupName, groupAlias);
+
+        } catch (PersistenceManagerException e) {
+            throw new GroupSubscriptionException(e);
+        }
+
+        if (groupSubscription != null) {
+            // Group Subscription already exists with same Group name and alias
+            throw new GroupSubscriptionException("Group Subscription already exists with name [ " + groupName + " ], alias [ " + groupAlias + " ]");
+        }
+
+        groupSubscription = new GroupSubscription(groupName, groupAlias);
+        Subscriber subscriber = new Subscriber(tenantAdminUsername, tenantId, tenantDomain);
+        groupSubscription.setSubscriber(subscriber);
+        return groupSubscription;
+    }
+
+    public CompositeAppSubscription createCompositeAppSubscription (String appId, String tenantAdminUsername,
+                                                                    String tenantDomain, int tenantId)  throws CompositeAppSubscriptionException {
+
+        DataInsertionAndRetrievalManager dataInsertionAndRetrievalMgr = new DataInsertionAndRetrievalManager();
+        CompositeAppSubscription compositeAppSubscription;
+
+        try {
+            compositeAppSubscription = dataInsertionAndRetrievalMgr.getCompositeAppSubscription(tenantId, appId);
+
+        } catch (PersistenceManagerException e) {
+            throw new CompositeAppSubscriptionException(e);
+        }
+
+        if (compositeAppSubscription != null) {
+            // Composite App Subscription already exists with same app id
+            throw new CompositeAppSubscriptionException("Composite App Subscription already exists with Id [ " +  appId + " ]");
+        }
+
+        compositeAppSubscription = new CompositeAppSubscription(appId);
+        Subscriber subscriber = new Subscriber(tenantAdminUsername, tenantId, tenantDomain);
+        compositeAppSubscription.setSubscriber(subscriber);
+        return compositeAppSubscription;
+    }
+
     public CartridgeSubscription createCartridgeSubscription (SubscriptionData subscriptionData) throws ADCException,
             InvalidCartridgeAliasException, DuplicateCartridgeAliasException, PolicyException, UnregisteredCartridgeException,
             RepositoryRequiredException, RepositoryCredentialsRequiredException, RepositoryTransportException,

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/PersistenceManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/PersistenceManager.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/PersistenceManager.java
index c0203eb..9fba1a0 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/PersistenceManager.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/PersistenceManager.java
@@ -19,12 +19,12 @@
 
 package org.apache.stratos.manager.persistence;
 
-import org.apache.stratos.manager.composite.application.beans.CompositeAppDefinition;
 import org.apache.stratos.manager.deploy.service.Service;
 import org.apache.stratos.manager.exception.PersistenceManagerException;
 import org.apache.stratos.manager.grouping.definitions.ServiceGroupDefinition;
 import org.apache.stratos.manager.subscription.CartridgeSubscription;
-import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication;
+import org.apache.stratos.manager.subscription.CompositeAppSubscription;
+import org.apache.stratos.manager.subscription.GroupSubscription;
 
 import java.util.Collection;
 
@@ -33,6 +33,15 @@ public abstract class PersistenceManager {
     public abstract void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription)
             throws PersistenceManagerException;
 
+    public abstract void persistGroupSubscription (GroupSubscription groupSubscription)
+            throws PersistenceManagerException;
+
+    public abstract GroupSubscription getGroupSubscription (int tenantId, String groupName, String groupAlias)
+                throws PersistenceManagerException;
+
+    public abstract void removeGroupSubscription (int tenantId, String groupName, String groupAlias)
+            throws PersistenceManagerException;
+
     public abstract void removeCartridgeSubscription (int tenantId, String type, String alias)
             throws PersistenceManagerException;
 
@@ -42,6 +51,15 @@ public abstract class PersistenceManager {
     public abstract Collection<CartridgeSubscription> getCartridgeSubscriptions(int tenantId)
             throws PersistenceManagerException;
 
+    public abstract void persistCompositeAppSubscription (CompositeAppSubscription compositeAppSubscription)
+            throws PersistenceManagerException;
+
+    public abstract CompositeAppSubscription getCompositeAppSubscription (int tenantId, String compositeAppId)
+            throws PersistenceManagerException;
+
+    public abstract void removeCompositeAppSubscription (int tenantId, String compositeAppId)
+            throws PersistenceManagerException;
+
     public abstract void persistService (Service service) throws PersistenceManagerException;
 
     public abstract Collection<Service> getServices () throws PersistenceManagerException;
@@ -55,14 +73,4 @@ public abstract class PersistenceManager {
     public abstract ServiceGroupDefinition getServiceGroupDefinition (String serviceGroupDefinitionName) throws PersistenceManagerException;
 
     public abstract void removeServiceGroupDefinition (String serviceGroupDefinitionName) throws PersistenceManagerException;
-    
-    //Grouping
-    public abstract void persistDeployedCompositeApplication(ConfigCompositeApplication configCompositeApplication)  throws PersistenceManagerException;
-    public abstract void persistCompositeApplication(CompositeAppDefinition compositeApplication)  throws PersistenceManagerException;
-
-    //Grouping
-    public abstract void removeDeployedCompositeApplication(String configCompositeApplicationAlias)  throws PersistenceManagerException;
-
-    public abstract Collection<ConfigCompositeApplication> getDeployedCompositeApplications () throws PersistenceManagerException;
-
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/RegistryBasedPersistenceManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/RegistryBasedPersistenceManager.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/RegistryBasedPersistenceManager.java
index 2ef2680..239f815 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/RegistryBasedPersistenceManager.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/persistence/RegistryBasedPersistenceManager.java
@@ -27,6 +27,8 @@ import org.apache.stratos.manager.exception.PersistenceManagerException;
 import org.apache.stratos.manager.grouping.definitions.ServiceGroupDefinition;
 import org.apache.stratos.manager.registry.RegistryManager;
 import org.apache.stratos.manager.subscription.CartridgeSubscription;
+import org.apache.stratos.manager.subscription.CompositeAppSubscription;
+import org.apache.stratos.manager.subscription.GroupSubscription;
 import org.apache.stratos.manager.utils.Deserializer;
 import org.apache.stratos.manager.utils.Serializer;
 import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication;
@@ -136,6 +138,22 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
         }
     }
 
+
+    @Override
+    public void persistGroupSubscription(GroupSubscription groupSubscription) throws PersistenceManagerException {
+        //TODO
+    }
+
+    public GroupSubscription getGroupSubscription (int tenantId, String groupName, String groupAlias) throws PersistenceManagerException {
+        //TODO
+        return null;
+    }
+
+    @Override
+    public void removeGroupSubscription(int tenantId, String groupName, String groupAlias) throws PersistenceManagerException {
+        //TODO
+    }
+
     @Override
     public Collection<CartridgeSubscription> getCartridgeSubscriptions () throws PersistenceManagerException {
 
@@ -222,244 +240,23 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
 
         return traverseAndGetCartridgeSubscriptions(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + "/" + Integer.toString(tenantId));
     }
-    
-
-    //Grouping
-    public void persistDeployedCompositeApplication (ConfigCompositeApplication configCompositeAapplication) 
-    		throws PersistenceManagerException {
-
-    	if (log.isDebugEnabled()) {
-            log.debug(String.format("trying to persist ConfigCompositeApplication [ %s ]", configCompositeAapplication.getAlias()));
-        }
-        int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
-        if (tenantId != MultitenantConstants.SUPER_TENANT_ID) {
-            // TODO: This is only a workaround. Proper fix is to write to tenant registry
-            try {
-                PrivilegedCarbonContext.startTenantFlow();
-                PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-                carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-                carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-
-                persistCompApplication(configCompositeAapplication);
-
-            } finally {
-                PrivilegedCarbonContext.endTenantFlow();
-            }
-
-        } else {
-        	persistCompApplication(configCompositeAapplication);
-        }
-    }
-
-    public void persistCompositeApplication (CompositeAppDefinition configCompositeApplication)
-            throws PersistenceManagerException {
-
-        if (log.isDebugEnabled()) {
-            log.debug(String.format("trying to persist ConfigCompositeApplication [ %s ]", configCompositeApplication.getAlias()));
-        }
-        int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
-        if (tenantId != MultitenantConstants.SUPER_TENANT_ID) {
-            // TODO: This is only a workaround. Proper fix is to write to tenant registry
-            try {
-                PrivilegedCarbonContext.startTenantFlow();
-                PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-                carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-                carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-
-                persistCompApplication(configCompositeApplication);
-
-            } finally {
-                PrivilegedCarbonContext.endTenantFlow();
-            }
-
-        } else {
-            persistCompApplication(configCompositeApplication);
-        }
-    }
-
-    // Grouping
-    private void persistCompApplication (ConfigCompositeApplication configCompositeAapplication) throws PersistenceManagerException  {
-
-        // persist Service
-        try {
-            //RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + COMPOSITE_APPLICATION + "/" + configCompositeAapplication.getAlias(),
-        	RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + COMPOSITE_APPLICATION + "/" + "compositeApplicationAlias",
-        														Serializer.serializeServiceToByteArray(configCompositeAapplication), null);
-
-            if (log.isDebugEnabled()) {
-                log.debug("Persisted ConfigCompositeApplication successfully: hardcoded [ " + configCompositeAapplication.getAlias() + " ]");
-            }
-
-        } catch (RegistryException e) {
-            throw new PersistenceManagerException(e);
-
-        } catch (IOException e) {
-            throw new PersistenceManagerException(e);
-        }
-    }
-
-    // Grouping
-    private void persistCompApplication (CompositeAppDefinition configCompositeAapplication) throws PersistenceManagerException  {
-
-        // persist Service
-        try {
-            //RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + COMPOSITE_APPLICATION + "/" + configCompositeAapplication.getAlias(),
-            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + COMPOSITE_APPLICATION + "/" + "compositeApplicationAlias",
-                    Serializer.serializeServiceToByteArray(configCompositeAapplication), null);
 
-            if (log.isDebugEnabled()) {
-                log.debug("Persisted ConfigCompositeApplication successfully: hardcoded [ " + configCompositeAapplication.getAlias() + " ]");
-            }
-
-        } catch (RegistryException e) {
-            throw new PersistenceManagerException(e);
-
-        } catch (IOException e) {
-            throw new PersistenceManagerException(e);
-        }
-    }
-    
-    public void removeDeployedCompositeApplication(String configCompositeApplicationAlias)  throws PersistenceManagerException {
-
-        int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
-        if (tenantId != MultitenantConstants.SUPER_TENANT_ID) {
-            // TODO: This is only a workaround. Proper fix is to write to tenant registry
-            try {
-                PrivilegedCarbonContext.startTenantFlow();
-                PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-                carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-                carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-
-                if (log.isDebugEnabled()) {
-                    log.debug("removing persisted ConfigCompositeApplication : [ " + configCompositeApplicationAlias + " ]");
-                }
-                removeCompApplication(configCompositeApplicationAlias);
-                
-                if (log.isDebugEnabled()) {
-                    log.debug("successfully removed persisted ConfigCompositeApplication : [ " + configCompositeApplicationAlias + " ]");
-                }
-
-            } finally {
-                PrivilegedCarbonContext.endTenantFlow();
-            }
-
-        } else {
-        	if (log.isDebugEnabled()) {
-                log.debug("removing persisted ConfigCompositeApplication 1 : [ " + configCompositeApplicationAlias + " ]");
-            }
-            removeCompApplication(configCompositeApplicationAlias);
-            
-            if (log.isDebugEnabled()) {
-                log.debug("successfully removed persisted ConfigCompositeApplication 1 : [ " + configCompositeApplicationAlias + " ]");
-            }
-        }
+    @Override
+    public void persistCompositeAppSubscription(CompositeAppSubscription compositeAppSubscription) throws PersistenceManagerException {
+        //TODO
     }
 
-    
-    public Collection<ConfigCompositeApplication> getDeployedCompositeApplications () throws PersistenceManagerException {;
-    	if (log.isDebugEnabled()) {
-            log.debug("retrieving persisted ConfigCompositeApplication ");
-        }
-    	
-    	int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
-        if (tenantId != MultitenantConstants.SUPER_TENANT_ID) {
-            // TODO: This is only a workaround. Proper fix is to write to tenant registry
-            try {
-                PrivilegedCarbonContext.startTenantFlow();
-                PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-                carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-                carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-                if (log.isDebugEnabled()) {
-                    log.debug("traversing ConfigCompositeApplications ");
-                }
-                return traverseAndGetDeloyedCompositeApplication(STRATOS_MANAGER_REOSURCE + COMPOSITE_APPLICATION);
-
-            } finally {
-                PrivilegedCarbonContext.endTenantFlow();
-            }
-
-        } else {
-            return traverseAndGetDeloyedCompositeApplication(STRATOS_MANAGER_REOSURCE + COMPOSITE_APPLICATION);
-        }
-
+    @Override
+    public CompositeAppSubscription getCompositeAppSubscription(int tenantId, String compositeAppId) throws PersistenceManagerException {
+        //TODO
+        return null;
     }
 
-
-    public Collection<ConfigCompositeApplication> traverseAndGetDeloyedCompositeApplication (String resourcePath) throws PersistenceManagerException {
-
-        if (log.isDebugEnabled()) {
-            log.debug("traverseAndGetDeloyedCompositeApplication: Root resource path: " + resourcePath);
-        }
-
-        Object resourceObj;
-
-        try {
-            resourceObj = RegistryManager.getInstance().retrieve(resourcePath);
-            if (log.isDebugEnabled()) {
-                log.debug("traversing com apps , retrieving resource: " + resourceObj);
-            }
-
-        } catch (RegistryException e) {
-            throw new PersistenceManagerException(e);
-        }
-
-        Collection<ConfigCompositeApplication> comApps = new ArrayList<ConfigCompositeApplication>();
-
-        if (resourceObj == null) {
-            // there is no resource at the given path
-            return null;
-
-        } else if (resourceObj instanceof String[]) {
-
-            // get the paths for all Service instances
-            String[] compAppResourcePaths = (String[]) resourceObj;
-            if (log.isDebugEnabled()) {
-                for (String retrievedResourcePath : compAppResourcePaths) {
-                    log.debug("Retrieved resource sub-path " + retrievedResourcePath);
-                }
-            }
-
-            // traverse the paths recursively
-            for (String compAppResourcePath : compAppResourcePaths) {
-
-                if (log.isDebugEnabled()) {
-                    log.debug("Traversing resource path " + compAppResourcePath);
-                }
-
-                comApps.addAll(traverseAndGetDeloyedCompositeApplication(compAppResourcePath));
-            }
-
-        } else {
-            // De-serialize
-            Object compAppObj;
-
-            try {
-            	compAppObj = Deserializer.deserializeFromByteArray((byte[]) resourceObj);
-
-            } catch (Exception e) {
-                // issue might be de-serializing only this object, therefore log and continue without throwing
-                log.error("Error while de-serializing the object retrieved from "  + resourcePath, e);
-                return null;
-            }
-
-            if (compAppObj != null && compAppObj instanceof ConfigCompositeApplication) {
-
-            	ConfigCompositeApplication deserilizedCompApp = (ConfigCompositeApplication) compAppObj;
-                if (log.isDebugEnabled()) {
-                    log.debug("Successfully de-serialized ConfigCompositeApplication: " + deserilizedCompApp.toString());
-                }
-
-                comApps.add(deserilizedCompApp);
-
-            }
-        }
-
-        // remove any nulls
-        comApps.removeAll(Collections.singleton(null));
-        return comApps;
+    @Override
+    public void removeCompositeAppSubscription(int tenantId, String compositeAppId) throws PersistenceManagerException {
+        //TODO
     }
 
-
     @Override
     public void persistService(Service service) throws PersistenceManagerException {
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java
index 4f88f2c..c9b92aa 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/retriever/DataInsertionAndRetrievalManager.java
@@ -29,6 +29,8 @@ import org.apache.stratos.manager.lookup.LookupDataHolder;
 import org.apache.stratos.manager.persistence.PersistenceManager;
 import org.apache.stratos.manager.persistence.RegistryBasedPersistenceManager;
 import org.apache.stratos.manager.subscription.CartridgeSubscription;
+import org.apache.stratos.manager.subscription.CompositeAppSubscription;
+import org.apache.stratos.manager.subscription.GroupSubscription;
 import org.apache.stratos.messaging.domain.topology.ConfigCompositeApplication;
 
 import java.util.Collection;
@@ -337,114 +339,49 @@ public class DataInsertionAndRetrievalManager {
             LookupDataHolder.getInstance().releaseReadLock();
         }
     }
-    
-    // Grouping
-    public void persistCompositeApplication (ConfigCompositeApplication configCompositeApplication) throws PersistenceManagerException {
 
-        // get the write lock
-        //LookupDataHolder.getInstance().acquireWriteLock();
-
-        try {
-            // store in LookupDataHolder
-        	//ToDo ... add to data holder
-            // LookupDataHolder.getInstance().putSubscription(cartridgeSubscription);
-
-            try {
-                // store in Persistence Manager
-                persistenceManager.persistDeployedCompositeApplication(configCompositeApplication);
-
-            } catch (PersistenceManagerException e) {
-                String errorMsg = "Error in persisting CartridgeSubscription in Persistence Manager";
-                log.error(errorMsg, e);
-                // remove from the in memory model since persisting failed
-                /* TODO
-                LookupDataHolder.getInstance().removeSubscription(cartridgeSubscription.getSubscriber().getTenantId(), cartridgeSubscription.getType(),
-                        cartridgeSubscription.getAlias(), cartridgeSubscription.getClusterDomain(),
-                        cartridgeSubscription.getRepository() != null ? cartridgeSubscription.getRepository().getUrl() : null);
-				*/
-                throw e;
-            }
+    public void peristServiceGroupDefinition (ServiceGroupDefinition serviceGroupDefinition) throws PersistenceManagerException {
 
-        } finally {
-            // release the write lock
-            //LookupDataHolder.getInstance().releaseWriteLock();
-        }
+        persistenceManager.persistServiceGroupDefinition(serviceGroupDefinition);
     }
 
-    public void persistCompositeApplication (CompositeAppDefinition compositeApplication) throws PersistenceManagerException {
-
-        // get the write lock
-        //LookupDataHolder.getInstance().acquireWriteLock();
-
-        try {
-            // store in LookupDataHolder
-            //ToDo ... add to data holder
-            // LookupDataHolder.getInstance().putSubscription(cartridgeSubscription);
+    public ServiceGroupDefinition getServiceGroupDefinition (String serviceGroupDefinitionName) throws PersistenceManagerException {
 
-            try {
-                // store in Persistence Manager
-                persistenceManager.persistCompositeApplication(compositeApplication);
+        return persistenceManager.getServiceGroupDefinition(serviceGroupDefinitionName);
+    }
 
-            } catch (PersistenceManagerException e) {
-                String errorMsg = "Error in persisting CartridgeSubscription in Persistence Manager";
-                log.error(errorMsg, e);
-                // remove from the in memory model since persisting failed
-                /* TODO
-                LookupDataHolder.getInstance().removeSubscription(cartridgeSubscription.getSubscriber().getTenantId(), cartridgeSubscription.getType(),
-                        cartridgeSubscription.getAlias(), cartridgeSubscription.getClusterDomain(),
-                        cartridgeSubscription.getRepository() != null ? cartridgeSubscription.getRepository().getUrl() : null);
-				*/
-                throw e;
-            }
+    public void removeServiceGroupDefinition (String serviceGroupName) throws PersistenceManagerException {
 
-        } finally {
-            // release the write lock
-            //LookupDataHolder.getInstance().releaseWriteLock();
-        }
+        persistenceManager.removeServiceGroupDefinition(serviceGroupName);
     }
-    // Grouping
-    
-    public void removeCompositeApplication (String configCompositeApplicationAlias) throws PersistenceManagerException {
 
-        LookupDataHolder.getInstance().acquireWriteLock();
+    public void persistGroupSubscription (GroupSubscription groupSubscription) throws PersistenceManagerException {
 
-        try {
-            // remove from persistence manager
-            try {
-                persistenceManager.removeDeployedCompositeApplication(configCompositeApplicationAlias);
+        persistenceManager.persistGroupSubscription(groupSubscription);
+    }
 
-            } catch (PersistenceManagerException e) {
-                String errorMsg = "Error in removing Composite application from Persistence Manager";
-                log.error(errorMsg, e);
-                throw e;
-            }
+    public GroupSubscription getGroupSubscription (int tenantId, String groupName, String groupAlias) throws PersistenceManagerException {
 
-        } finally {
-            LookupDataHolder.getInstance().releaseWriteLock();
-        }
+        return persistenceManager.getGroupSubscription(tenantId, groupName, groupAlias);
     }
 
-    
-    // Grouping
-    
-    
-    public Collection<ConfigCompositeApplication> getCompositeApplications() throws PersistenceManagerException {
+    public void removeGroupSubscription (int tenantId, String groupName, String groupAlias) throws PersistenceManagerException {
 
-        return persistenceManager.getDeployedCompositeApplications();
+        persistenceManager.removeGroupSubscription(tenantId, groupName, groupAlias);
     }
 
-    public void peristServiceGroupDefinition (ServiceGroupDefinition serviceGroupDefinition) throws PersistenceManagerException {
+    public void persistCompositeAppSubscription (CompositeAppSubscription compositeAppSubscription) throws PersistenceManagerException {
 
-        persistenceManager.persistServiceGroupDefinition(serviceGroupDefinition);
+        persistenceManager.persistCompositeAppSubscription(compositeAppSubscription);
     }
 
-    public ServiceGroupDefinition getServiceGroupDefinition (String serviceGroupDefinitionName) throws PersistenceManagerException {
+    public CompositeAppSubscription getCompositeAppSubscription (int tenantId, String appId) throws PersistenceManagerException {
 
-        return persistenceManager.getServiceGroupDefinition(serviceGroupDefinitionName);
+        return persistenceManager.getCompositeAppSubscription(tenantId, appId);
     }
 
-    public void removeServiceGroupDefinition (String serviceGroupName) throws PersistenceManagerException {
+    public void removeCompositeAppSubscription (int tenantId, String appId) throws PersistenceManagerException {
 
-        persistenceManager.removeServiceGroupDefinition(serviceGroupName);
+        persistenceManager.removeCompositeAppSubscription(tenantId, appId);
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/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
index 86fb0cd..018d1c4 100644
--- 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
@@ -21,6 +21,7 @@ package org.apache.stratos.manager.subscription;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.manager.subscriber.Subscriber;
 import org.jboss.util.propertyeditor.StringArrayEditor;
 
 import java.io.Serializable;
@@ -39,6 +40,8 @@ public class CompositeAppSubscription implements Serializable {
 
     private Set<String> groupSubscriptionAliases;
 
+    private Subscriber subscriber;
+
     public CompositeAppSubscription (String appId) {
 
         this.appId = appId;
@@ -65,4 +68,16 @@ public class CompositeAppSubscription implements Serializable {
     public void addGroupSubscriptionAliases (Set<String> groupSubscriptionAliases) {
         cartridgeSubscriptionAliases.addAll(groupSubscriptionAliases);
     }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public Subscriber getSubscriber() {
+        return subscriber;
+    }
+
+    public void setSubscriber(Subscriber subscriber) {
+        this.subscriber = subscriber;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/GroupSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/GroupSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/GroupSubscription.java
index 31fcb73..ef327f5 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/GroupSubscription.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/GroupSubscription.java
@@ -19,20 +19,27 @@
 
 package org.apache.stratos.manager.subscription;
 
+import org.apache.stratos.manager.subscriber.Subscriber;
+
 import java.io.Serializable;
 import java.util.HashSet;
 import java.util.Set;
 
 public class GroupSubscription implements Serializable {
 
+    private String name;
+
     private String groupAlias;
 
     private Set<String> cartridgeSubscriptionAliases;
 
     private Set<String> groupSubscriptionAliases;
 
-    public GroupSubscription (String groupAlias) {
+    private Subscriber subscriber;
+
+    public GroupSubscription (String name, String groupAlias) {
 
+        this.name = name;
         this.groupAlias = groupAlias;
         cartridgeSubscriptionAliases = new HashSet<String>();
         groupSubscriptionAliases = new HashSet<String>();
@@ -61,4 +68,16 @@ public class GroupSubscription implements Serializable {
     public String getGroupAlias() {
         return groupAlias;
     }
+
+    public String getName() {
+        return name;
+    }
+
+    public Subscriber getSubscriber() {
+        return subscriber;
+    }
+
+    public void setSubscriber(Subscriber subscriber) {
+        this.subscriber = subscriber;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7f5f19b5/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 8e10fda..e02ea11 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
@@ -321,29 +321,29 @@ public class ServiceUtils {
     }
     
     
-    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(