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/20 18:48:11 UTC

[1/3] git commit: persisting Group Subscriptions and Composite App Subscriptions

Repository: stratos
Updated Branches:
  refs/heads/4.0.0-grouping 4b30f2385 -> b097cbc48


persisting Group Subscriptions and Composite App Subscriptions


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

Branch: refs/heads/4.0.0-grouping
Commit: e997fc5db71a25012496253254e70ea9e7e20a3b
Parents: 4b30f23
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Thu Jul 17 19:48:09 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Thu Jul 17 19:48:09 2014 +0530

----------------------------------------------------------------------
 .../CompositeApplicationManager.java            | 149 +++------
 .../manager/CartridgeSubscriptionManager.java   |  39 +++
 .../RegistryBasedPersistenceManager.java        | 334 ++++++++++++++++---
 .../stratos/manager/utils/Serializer.java       |  42 +--
 4 files changed, 387 insertions(+), 177 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/e997fc5d/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 9448438..b4db5de 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
@@ -102,6 +102,12 @@ public class CompositeApplicationManager {
             // set top level group aliases to Composite App Subscription
             compositeAppSubscription.addGroupSubscriptionAliases(getGroupSubscriptionAliases(compositeAppContext.getGroupContexts()));
         }
+
+        // TODO: send the Composite App structure to CC
+
+        persistCartridgeSubscriptions(aliasToCartridgeSubscription.values());
+        persistGroupSubscriptions(groupAliasToGroupSubscription.values());
+        persistCompositeAppSubscription(compositeAppSubscription);
 	}
 
     private Set<String> getCartrigdeSubscriptionAliases (Set<SubscribableContext> subscribableContexts) throws CompositeApplicationException {
@@ -250,104 +256,49 @@ public class CompositeApplicationManager {
 
         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);
-//		}
-//	}
-	
-//	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);
-//
-//	}
-	
-//	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);
-//        }
-//	}
+
+    private void persistCartridgeSubscriptions (Collection<CartridgeSubscription> cartridgeSubscriptions) throws CompositeApplicationException {
+
+        if (cartridgeSubscriptions == null) {
+            return;
+        }
+
+        for (CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) {
+            try {
+                cartridgeSubscriptionManager.persistCartridgeSubscription(cartridgeSubscription);
+
+            } catch (ADCException e) {
+                throw new CompositeApplicationException(e);
+            }
+        }
+    }
+
+    private void persistGroupSubscriptions (Collection<GroupSubscription> groupSubscriptions) throws CompositeApplicationException {
+
+        if (groupSubscriptions == null) {
+            return;
+        }
+
+        for (GroupSubscription groupSubscription : groupSubscriptions) {
+            try {
+                cartridgeSubscriptionManager.persistGroupSubscription(groupSubscription);
+
+            } catch (ADCException e) {
+                throw new CompositeApplicationException(e);
+            }
+        }
+    }
+
+    private void persistCompositeAppSubscription (CompositeAppSubscription compositeAppSubscription) throws CompositeApplicationException {
+
+        if (compositeAppSubscription != null) {
+            try {
+                cartridgeSubscriptionManager.persistCompositeAppSubscription(compositeAppSubscription);
+
+            } catch (ADCException e) {
+                throw new CompositeApplicationException(e);
+            }
+        }
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/e997fc5d/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 cbf0b01..7d6be7c 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
@@ -127,6 +127,45 @@ public class CartridgeSubscriptionManager {
 
         return serviceCartridgeSubscription;
     }
+
+    public void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription) throws ADCException {
+
+        try {
+            new DataInsertionAndRetrievalManager().cacheAndPersistSubcription(cartridgeSubscription);
+
+        } catch (PersistenceManagerException e) {
+            String errorMsg = "Error saving subscription for tenant " +
+                    cartridgeSubscription.getSubscriber().getTenantDomain() + ", alias " + cartridgeSubscription.getType();
+            log.error(errorMsg);
+            throw new ADCException(errorMsg, e);
+        }
+
+        log.info("Successful Subscription: " + cartridgeSubscription.toString());
+
+        // Publish tenant subscribed event to message broker
+        CartridgeSubscriptionUtils.publishTenantSubscribedEvent(cartridgeSubscription.getSubscriber().getTenantId(),
+                cartridgeSubscription.getCartridgeInfo().getType());
+    }
+
+    public void persistGroupSubscription (GroupSubscription groupSubscription) throws ADCException {
+
+        try {
+            new DataInsertionAndRetrievalManager().persistGroupSubscription(groupSubscription);
+
+        } catch (PersistenceManagerException e) {
+            throw new ADCException(e);
+        }
+    }
+
+    public void persistCompositeAppSubscription (CompositeAppSubscription compositeAppSubscription) throws ADCException {
+
+        try {
+            new DataInsertionAndRetrievalManager().persistCompositeAppSubscription(compositeAppSubscription);
+
+        } catch (PersistenceManagerException e) {
+            throw new ADCException(e);
+        }
+    }
     
     public SubscriptionInfo subscribeToCartridgeWithProperties(SubscriptionData subscriptionData)  throws ADCException,
                                                                                             InvalidCartridgeAliasException,

http://git-wip-us.apache.org/repos/asf/stratos/blob/e997fc5d/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 390c7c6..6a829bb 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
@@ -21,7 +21,6 @@ package org.apache.stratos.manager.persistence;
 
 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.deploy.service.Service;
 import org.apache.stratos.manager.exception.PersistenceManagerException;
 import org.apache.stratos.manager.grouping.definitions.ServiceGroupDefinition;
@@ -31,7 +30,6 @@ 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;
 import org.wso2.carbon.context.CarbonContext;
 import org.wso2.carbon.context.PrivilegedCarbonContext;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
@@ -50,7 +48,9 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
     private static final String ACTIVE_SUBSCRIPTIONS = "/subscriptions/active";
     private static final String INACTIVE_SUBSCRIPTIONS = "/subscriptions/inactive";
     private static final String SERVICES = "/services";
-    private static final String COMPOSITE_APPLICATION = "/composite_applications";
+    private static final String CARTRIDGES = "/cartridges";
+    private static final String GROUPS = "/groups";
+    private static final String COMPOSITE_APPLICATIONS = "/composite_applications";
     private static final String SERVICE_GROUPING = "/service.grouping";
     private static final String SERVICE_GROUPING_DEFINITIONS = SERVICE_GROUPING + "/definitions";
 
@@ -81,7 +81,7 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
 
         // persist
         try {
-            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + "/" +
+            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + CARTRIDGES + ACTIVE_SUBSCRIPTIONS + "/" +
                     Integer.toString(cartridgeSubscription.getSubscriber().getTenantId()) + "/" +
                     cartridgeSubscription.getType() + "/" +
                     cartridgeSubscription.getAlias(), Serializer.serializeSubscriptionSontextToByteArray(cartridgeSubscription), cartridgeSubscription.getClusterDomain());
@@ -124,8 +124,8 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
     private void removeSubscription (int tenantId, String type, String alias) throws PersistenceManagerException {
 
         // move the subscription from active set to inactive set
-        String sourcePath = STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + "/" + Integer.toString(tenantId) + "/" + type + "/" + alias;
-        String targetPath = STRATOS_MANAGER_REOSURCE + INACTIVE_SUBSCRIPTIONS + "/" + Integer.toString(tenantId) + "/" + type + "/" + alias;
+        String sourcePath = STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + CARTRIDGES + "/" + Integer.toString(tenantId) + "/" + type + "/" + alias;
+        String targetPath = STRATOS_MANAGER_REOSURCE + INACTIVE_SUBSCRIPTIONS + CARTRIDGES + "/" + Integer.toString(tenantId) + "/" + type + "/" + alias;
 
         try {
             RegistryManager.getInstance().move(sourcePath, targetPath);
@@ -138,26 +138,149 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
         }
     }
 
-
     @Override
     public void persistGroupSubscription(GroupSubscription groupSubscription) throws PersistenceManagerException {
-        //TODO
+
+        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);
+
+                persistSubscription(tenantId, groupSubscription);
+
+            } finally {
+                PrivilegedCarbonContext.endTenantFlow();
+            }
+
+        } else {
+            persistSubscription(tenantId, groupSubscription);
+        }
+    }
+
+    private void persistSubscription (int tenantId, GroupSubscription groupSubscription) throws PersistenceManagerException {
+
+        // persist
+        try {
+            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + GROUPS + "/" +
+                    Integer.toString(tenantId) + "/" + groupSubscription.getName() + "/" +
+                    groupSubscription.getGroupAlias(),
+                    Serializer.serializeGroupSubscriptionToByteArray(groupSubscription), null);
+
+            if (log.isDebugEnabled()) {
+                log.debug("Persisted Group Subscription successfully: [ " + groupSubscription.getName() + ", " + groupSubscription.getGroupAlias() + " ] ");
+            }
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+
+        } catch (IOException e) {
+            throw new PersistenceManagerException(e);
+        }
     }
 
     public GroupSubscription getGroupSubscription (int tenantId, String groupName, String groupAlias) throws PersistenceManagerException {
-        //TODO
+
+        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);
+
+                return getSubscription(tenantId, groupName, groupAlias);
+
+
+            } finally {
+                PrivilegedCarbonContext.endTenantFlow();
+            }
+
+        } else {
+            return getSubscription(tenantId, groupName, groupAlias);
+        }
+    }
+
+    public GroupSubscription getSubscription (int tenantId, String groupName, String groupAlias) throws PersistenceManagerException {
+
+        Object byteObj;
+
+        try {
+            byteObj = RegistryManager.getInstance().retrieve(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + GROUPS + "/" +
+                    Integer.toString(tenantId) + "/" + groupName + "/" + groupAlias);
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+        }
+
+        if (byteObj == null) {
+            return null;
+        }
+
+        Object groupSubscriptionObj;
+
+        try {
+            groupSubscriptionObj = Deserializer.deserializeFromByteArray((byte[]) byteObj);
+
+        } catch (Exception e) {
+            throw new PersistenceManagerException(e);
+        }
+
+        if (groupSubscriptionObj instanceof GroupSubscription) {
+            return (GroupSubscription) groupSubscriptionObj;
+        }
+
         return null;
     }
 
     @Override
     public void removeGroupSubscription(int tenantId, String groupName, String groupAlias) throws PersistenceManagerException {
-        //TODO
+
+        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);
+
+                remove(tenantId, groupName, groupAlias);
+
+            } finally {
+                PrivilegedCarbonContext.endTenantFlow();
+            }
+
+        } else {
+            remove(tenantId, groupName, groupAlias);
+        }
+    }
+
+    private void remove (int tenantId, String groupName, String groupAlias) throws PersistenceManagerException {
+
+        // move the subscription from active set to inactive set
+        String sourcePath = STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + GROUPS + "/" + Integer.toString(tenantId) +
+                "/" + groupName + "/" + groupAlias;
+        String targetPath = STRATOS_MANAGER_REOSURCE + INACTIVE_SUBSCRIPTIONS + GROUPS + "/" + Integer.toString(tenantId) +
+                "/" + groupName + "/" + groupAlias;
+
+        try {
+            RegistryManager.getInstance().move(sourcePath, targetPath);
+            if (log.isDebugEnabled()) {
+                log.debug("Moved Group Subscription on " + sourcePath + " to " + targetPath + " successfully");
+            }
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+        }
     }
 
     @Override
     public Collection<CartridgeSubscription> getCartridgeSubscriptions () throws PersistenceManagerException {
 
-        return traverseAndGetCartridgeSubscriptions(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS);
+        return traverseAndGetCartridgeSubscriptions(STRATOS_MANAGER_REOSURCE  + ACTIVE_SUBSCRIPTIONS + CARTRIDGES);
     }
 
     private Collection<CartridgeSubscription> traverseAndGetCartridgeSubscriptions (String resourcePath) throws PersistenceManagerException  {
@@ -238,23 +361,146 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
     @Override
     public Collection<CartridgeSubscription> getCartridgeSubscriptions (int tenantId) throws PersistenceManagerException {
 
-        return traverseAndGetCartridgeSubscriptions(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + "/" + Integer.toString(tenantId));
+        return traverseAndGetCartridgeSubscriptions(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + CARTRIDGES + "/" + Integer.toString(tenantId));
     }
 
     @Override
     public void persistCompositeAppSubscription(CompositeAppSubscription compositeAppSubscription) throws PersistenceManagerException {
-        //TODO
+
+        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);
+
+                persistSubscription(tenantId, compositeAppSubscription);
+
+            } finally {
+                PrivilegedCarbonContext.endTenantFlow();
+            }
+
+        } else {
+            persistSubscription(tenantId, compositeAppSubscription);
+        }
+    }
+
+    private void persistSubscription (int tenantId, CompositeAppSubscription compositeAppSubscription) throws PersistenceManagerException {
+
+        // persist
+        try {
+            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + COMPOSITE_APPLICATIONS + "/" +
+                    Integer.toString(tenantId) + "/" + compositeAppSubscription.getAppId(),
+                    Serializer.serializeCompositeAppSubscriptionToByteArray(compositeAppSubscription), null);
+
+            if (log.isDebugEnabled()) {
+                log.debug("Persisted Group Subscription successfully: [ " + compositeAppSubscription.getAppId() + " ] ");
+            }
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+
+        } catch (IOException e) {
+            throw new PersistenceManagerException(e);
+        }
     }
 
     @Override
     public CompositeAppSubscription getCompositeAppSubscription(int tenantId, String compositeAppId) throws PersistenceManagerException {
-        //TODO
+
+        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);
+
+                return getSubscription(tenantId, compositeAppId);
+
+
+            } finally {
+                PrivilegedCarbonContext.endTenantFlow();
+            }
+
+        } else {
+            return getSubscription(tenantId, compositeAppId);
+        }
+    }
+
+    public CompositeAppSubscription getSubscription (int tenantId, String appId) throws PersistenceManagerException {
+
+        Object byteObj;
+
+        try {
+            byteObj = RegistryManager.getInstance().retrieve(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + COMPOSITE_APPLICATIONS + "/" +
+                    Integer.toString(tenantId) + "/" + appId);
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+        }
+
+        if (byteObj == null) {
+            return null;
+        }
+
+        Object compositeAppSubscriptionObj;
+
+        try {
+            compositeAppSubscriptionObj = Deserializer.deserializeFromByteArray((byte[]) byteObj);
+
+        } catch (Exception e) {
+            throw new PersistenceManagerException(e);
+        }
+
+        if (compositeAppSubscriptionObj instanceof CompositeAppSubscription) {
+            return (CompositeAppSubscription) compositeAppSubscriptionObj;
+        }
+
         return null;
     }
 
     @Override
     public void removeCompositeAppSubscription(int tenantId, String compositeAppId) throws PersistenceManagerException {
-        //TODO
+
+        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);
+
+                remove(tenantId, compositeAppId);
+
+            } finally {
+                PrivilegedCarbonContext.endTenantFlow();
+            }
+
+        } else {
+            remove(tenantId, compositeAppId);
+        }
+    }
+
+    private void remove (int tenantId, String compositeAppId) throws PersistenceManagerException {
+
+        // move the subscription from active set to inactive set
+        String sourcePath = STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + COMPOSITE_APPLICATIONS + "/" + Integer.toString(tenantId) +
+                "/" + compositeAppId;
+        String targetPath = STRATOS_MANAGER_REOSURCE + INACTIVE_SUBSCRIPTIONS + COMPOSITE_APPLICATIONS + "/" + Integer.toString(tenantId) +
+                "/" + compositeAppId;
+
+        try {
+            RegistryManager.getInstance().move(sourcePath, targetPath);
+            if (log.isDebugEnabled()) {
+                log.debug("Moved Composite App Subscription on " + sourcePath + " to " + targetPath + " successfully");
+            }
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+        }
     }
 
     @Override
@@ -485,36 +731,36 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
             throw new PersistenceManagerException(e);
         }
     }
-    
-    private void removeCompApplication(String alias) throws PersistenceManagerException {
 
-        String resourcePath = STRATOS_MANAGER_REOSURCE + COMPOSITE_APPLICATION + "/" + alias;
-
-        try {
-        	Object obj = RegistryManager.getInstance().retrieve(resourcePath);
-        	if (obj != null) {
-        		if (log.isDebugEnabled()) {
-        			log.debug(" found composite application to remve " + obj + " at resource path " + resourcePath);
-        		}
-        	}
-            RegistryManager.getInstance().delete(resourcePath);
-            if (log.isDebugEnabled()) {
-                log.debug("Deleted composite application on path " + resourcePath + " successfully");
-            }
-
-    		if (log.isDebugEnabled()) {
-    			obj = RegistryManager.getInstance().retrieve(resourcePath);
-     			if (obj == null) {
-     	   			log.debug(" veriying that composite application is remvoved, obj is null "  + resourcePath);
-    			} else {
-    				log.debug(" unsuccessful removing  composite application  " +  obj + " at resource path " +  resourcePath);
-    			}
-    		}
-
-        } catch (RegistryException e) {
-            throw new PersistenceManagerException(e);
-        }
-    }
+//    private void removeCompApplication(String alias) throws PersistenceManagerException {
+//
+//        String resourcePath = STRATOS_MANAGER_REOSURCE + COMPOSITE_APPLICATION + "/" + alias;
+//
+//        try {
+//        	Object obj = RegistryManager.getInstance().retrieve(resourcePath);
+//        	if (obj != null) {
+//        		if (log.isDebugEnabled()) {
+//        			log.debug(" found composite application to remve " + obj + " at resource path " + resourcePath);
+//        		}
+//        	}
+//            RegistryManager.getInstance().delete(resourcePath);
+//            if (log.isDebugEnabled()) {
+//                log.debug("Deleted composite application on path " + resourcePath + " successfully");
+//            }
+//
+//    		if (log.isDebugEnabled()) {
+//    			obj = RegistryManager.getInstance().retrieve(resourcePath);
+//     			if (obj == null) {
+//     	   			log.debug(" veriying that composite application is remvoved, obj is null "  + resourcePath);
+//    			} else {
+//    				log.debug(" unsuccessful removing  composite application  " +  obj + " at resource path " +  resourcePath);
+//    			}
+//    		}
+//
+//        } catch (RegistryException e) {
+//            throw new PersistenceManagerException(e);
+//        }
+//    }
 
     @Override
     public void persistServiceGroupDefinition(ServiceGroupDefinition serviceGroupDefinition) throws PersistenceManagerException {

http://git-wip-us.apache.org/repos/asf/stratos/blob/e997fc5d/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/Serializer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/Serializer.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/Serializer.java
index 6597499..743be48 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/Serializer.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/utils/Serializer.java
@@ -24,6 +24,8 @@ import org.apache.stratos.manager.deploy.service.Service;
 import org.apache.stratos.manager.grouping.definitions.ServiceGroupDefinition;
 import org.apache.stratos.manager.lookup.ClusterIdToSubscription;
 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.io.ByteArrayOutputStream;
@@ -59,20 +61,14 @@ public class Serializer {
 
     }
 
-    /**
-     * Serialize a ClusterIdToSubscription instance to a byte array.
-     * @param clusterIdToSubscription
-     * @return byte[]
-     * @throws java.io.IOException
-     */
-    public static byte[] serializeClusterIdToSubscriptionToByteArray(ClusterIdToSubscription clusterIdToSubscription)
+    public static byte[] serializeGroupSubscriptionToByteArray (GroupSubscription groupSubscription)
             throws IOException {
 
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutput out = null;
         try {
             out = new ObjectOutputStream(bos);
-            out.writeObject(clusterIdToSubscription);
+            out.writeObject(groupSubscription);
 
             return bos.toByteArray();
 
@@ -85,14 +81,14 @@ public class Serializer {
 
     }
 
-    public static byte[] serializeServiceToByteArray(Service service)
+    public static byte[] serializeCompositeAppSubscriptionToByteArray (CompositeAppSubscription compositeAppSubscription)
             throws IOException {
 
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutput out = null;
         try {
             out = new ObjectOutputStream(bos);
-            out.writeObject(service);
+            out.writeObject(compositeAppSubscription);
 
             return bos.toByteArray();
 
@@ -104,37 +100,15 @@ public class Serializer {
         }
 
     }
-    
-    // Grouping
-    public static byte[] serializeServiceToByteArray(ConfigCompositeApplication configCompositeApplication)
-            throws IOException {
 
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        ObjectOutput out = null;
-        try {
-            out = new ObjectOutputStream(bos);
-            out.writeObject(configCompositeApplication);
-
-            return bos.toByteArray();
-
-        } finally {
-            if (out != null) {
-                out.close();
-            }
-            bos.close();
-        }
-
-    }
-
-    // Grouping
-    public static byte[] serializeServiceToByteArray(CompositeAppDefinition configCompositeApplication)
+    public static byte[] serializeServiceToByteArray(Service service)
             throws IOException {
 
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutput out = null;
         try {
             out = new ObjectOutputStream(bos);
-            out.writeObject(configCompositeApplication);
+            out.writeObject(service);
 
             return bos.toByteArray();
 


[2/3] git commit: filterng out duplicated top level Groups from ApplicationContext

Posted by is...@apache.org.
filterng out duplicated top level Groups from ApplicationContext


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

Branch: refs/heads/4.0.0-grouping
Commit: 744386833c3f30899975ab8d077099a39861e73a
Parents: e997fc5
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Fri Jul 18 19:02:10 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Fri Jul 18 19:02:10 2014 +0530

----------------------------------------------------------------------
 .../CompositeApplicationManager.java            |  2 +
 .../DefaultCompositeApplicationParser.java      | 60 ++++++++++++++++++--
 2 files changed, 56 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/74438683/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 b4db5de..75434d0 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
@@ -35,6 +35,8 @@ public class CompositeApplicationManager {
         CompositeApplicationParser compositeAppParser = new DefaultCompositeApplicationParser();
         CompositeAppContext compositeAppContext = compositeAppParser.parse(compositeAppDefinition);
 
+        Set<GroupContext> topLevelGroupsContexts = compositeAppContext.getGroupContexts();
+
         log.info("Composite Application [ Id: " + compositeAppDefinition.getApplicationId() + " , alias: "
                 + compositeAppDefinition.getAlias() + " ] deployed successfully");
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/74438683/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 a2b36bd..436e647 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
@@ -224,9 +224,53 @@ public class DefaultCompositeApplicationParser implements CompositeApplicationPa
             groupContexts.add(getGroupContext(group, subscribableInformation, definedGroups));
         }
 
+        //Set<GroupContext> topLevelGroupContexts = getTopLevelGroupContexts(groupContexts);
+        Set<GroupContext> nestedGroupContexts = new HashSet<GroupContext>();
+        getNestedGroupContexts(nestedGroupContexts, groupContexts);
+        filterDuplicatedGroupContexts(groupContexts, nestedGroupContexts);
+
         return groupContexts;
     }
 
+//    private Set<GroupContext> getTopLevelGroupContexts (Set<GroupContext> groupContexts) {
+//
+//        Set<GroupContext> topLevelGroupContexts = new HashSet<GroupContext>();
+//        for (GroupContext groupContext : groupContexts) {
+//            topLevelGroupContexts.add(groupContext);
+//        }
+//
+//        return topLevelGroupContexts;
+//    }
+
+    private void getNestedGroupContexts (Set<GroupContext> nestedGroupContexts, Set<GroupContext> groupContexts) {
+
+        if (groupContexts != null) {
+            for (GroupContext groupContext : groupContexts) {
+                if (groupContext.getGroupContexts() != null) {
+                    nestedGroupContexts.addAll(groupContext.getGroupContexts());
+                    getNestedGroupContexts(nestedGroupContexts, groupContext.getGroupContexts());
+                }
+            }
+        }
+    }
+
+    private void filterDuplicatedGroupContexts (Set<GroupContext> topLevelGroupContexts, Set<GroupContext> nestedGroupContexts) {
+
+        Iterator<GroupContext> parentIterator = topLevelGroupContexts.iterator();
+        Iterator<GroupContext> nestedIterator = nestedGroupContexts.iterator();
+
+        while (parentIterator.hasNext()) {
+            GroupContext parentGroupCtxt = parentIterator.next();
+            while (nestedIterator.hasNext()) {
+                GroupContext nestedGroupCtxt = nestedIterator.next();
+                if (parentGroupCtxt.getName().equals(nestedGroupCtxt.getName()) &&
+                        parentGroupCtxt.getAlias().equals(nestedGroupCtxt.getAlias())) {
+                    parentIterator.remove();
+                }
+            }
+        }
+    }
+
     private GroupContext getGroupContext (GroupDefinition group, Map<String, SubscribableInfo> subscribableInformation,
                                           Map<String, GroupDefinition> definedGroups) throws CompositeApplicationDefinitionException {
 
@@ -238,21 +282,25 @@ public class DefaultCompositeApplicationParser implements CompositeApplicationPa
         }
 
         GroupContext groupContext = new GroupContext();
+
+        groupContext.setName(group.getName());
+        groupContext.setAlias(group.getAlias());
+        groupContext.setAutoscalingPolicy(group.getAutoscalingPolicy());
+        groupContext.setDeploymentPolicy(group.getDeploymentPolicy());
+        groupContext.setStartupOrder(getStartupOrderForGroup(group.getName()));
+        groupContext.setKillBehaviour(getKillbehaviour(group.getName()));
+
         // get group level Subscribables
         if (group.getSubscribables() != null) {
-            groupContext.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()) {
+                // get the complete Group Definition
+                subGroup = definedGroups.get(subGroup.getAlias());
                 nestedGroupContexts.add(getGroupContext(subGroup, subscribableInformation, definedGroups));
             }
 


[3/3] git commit: removing duplicated groups from top level

Posted by is...@apache.org.
removing duplicated groups from top level


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

Branch: refs/heads/4.0.0-grouping
Commit: b097cbc48fae7e56d0b2d22d9b0d6c4c69d2699f
Parents: 7443868
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Sun Jul 20 22:17:33 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Sun Jul 20 22:17:33 2014 +0530

----------------------------------------------------------------------
 .../CompositeApplicationManager.java            |  2 --
 .../DefaultCompositeApplicationParser.java      |  4 ++--
 .../structure/CompositeAppContext.java          | 22 ++++++++++++++++++++
 .../application/structure/GroupContext.java     | 19 ++++++++++++++++-
 .../application/structure/StartupOrder.java     | 18 ++++++++++++++++
 .../structure/SubscribableContext.java          | 18 ++++++++++++++++
 .../deployer/DefaultServiceGroupDeployer.java   |  2 +-
 .../RegistryBasedPersistenceManager.java        |  2 +-
 8 files changed, 80 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/b097cbc4/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 75434d0..b4db5de 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
@@ -35,8 +35,6 @@ public class CompositeApplicationManager {
         CompositeApplicationParser compositeAppParser = new DefaultCompositeApplicationParser();
         CompositeAppContext compositeAppContext = compositeAppParser.parse(compositeAppDefinition);
 
-        Set<GroupContext> topLevelGroupsContexts = compositeAppContext.getGroupContexts();
-
         log.info("Composite Application [ Id: " + compositeAppDefinition.getApplicationId() + " , alias: "
                 + compositeAppDefinition.getAlias() + " ] deployed successfully");
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/b097cbc4/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 436e647..ef6814b 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
@@ -186,10 +186,10 @@ public class DefaultCompositeApplicationParser implements CompositeApplicationPa
                                                             Map<String, SubscribableInfo> subscribableInformation)
             throws CompositeApplicationDefinitionException {
 
-        CompositeAppContext compositeAppContext = new CompositeAppContext();
+        CompositeAppContext compositeAppContext = new CompositeAppContext(compositeAppDefinition.getApplicationId());
 
-        // get top level Subscribables
         if (compositeAppDefinition.getComponents() != null) {
+            // get top level Subscribables
             if (compositeAppDefinition.getComponents().getSubscribables() != null) {
                 compositeAppContext.setSubscribableContexts(getSubsribableContexts(compositeAppDefinition.getComponents().getSubscribables(),
                         subscribableInformation));

http://git-wip-us.apache.org/repos/asf/stratos/blob/b097cbc4/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
index 6a589e7..4cb7073 100644
--- 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
@@ -33,6 +33,10 @@ public class CompositeAppContext {
 
     private String killBehaviour;
 
+    public CompositeAppContext (String appId) {
+        this.appId = appId;
+    }
+
     public String getAppId() {
         return appId;
     }
@@ -72,4 +76,22 @@ public class CompositeAppContext {
     public void setKillBehaviour(String killBehaviour) {
         this.killBehaviour = killBehaviour;
     }
+
+    public boolean equals(Object other) {
+
+        if(this == other) {
+            return true;
+        }
+        if(!(other instanceof CompositeAppContext)) {
+            return false;
+        }
+
+        CompositeAppContext that = (CompositeAppContext)other;
+        return this.appId.equals(that.appId);
+    }
+
+    public int hashCode () {
+
+        return appId.hashCode();
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b097cbc4/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
index e7736ea..b235c1b 100644
--- 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
@@ -19,7 +19,6 @@
 
 package org.apache.stratos.manager.composite.application.structure;
 
-import java.util.List;
 import java.util.Set;
 
 public class GroupContext {
@@ -104,4 +103,22 @@ public class GroupContext {
     public void setSubscribableContexts(Set<SubscribableContext> subscribableContexts) {
         this.subscribableContexts = subscribableContexts;
     }
+
+    public boolean equals(Object other) {
+
+        if(this == other) {
+            return true;
+        }
+        if(!(other instanceof GroupContext)) {
+            return false;
+        }
+
+        GroupContext that = (GroupContext)other;
+        return this.name.equals(that.name) && this.alias.equals(that.alias);
+    }
+
+    public int hashCode () {
+
+        return name.hashCode() + alias.hashCode();
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b097cbc4/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
index 4553a9f..4617090 100644
--- 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
@@ -45,4 +45,22 @@ public class StartupOrder {
     public void setAfter(String after) {
         this.after = after;
     }
+
+    public boolean equals(Object other) {
+
+        if(this == other) {
+            return true;
+        }
+        if(!(other instanceof StartupOrder)) {
+            return false;
+        }
+
+        StartupOrder that = (StartupOrder)other;
+        return this.start.equals(that.start) && this.after.equals(that.after);
+    }
+
+    public int hashCode () {
+
+        return start.hashCode() + after.hashCode();
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b097cbc4/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
index 2e30c1b..a336a62 100644
--- 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
@@ -105,4 +105,22 @@ public class SubscribableContext {
     public void setPassword(String password) {
         this.password = password;
     }
+
+    public boolean equals(Object other) {
+
+        if(this == other) {
+            return true;
+        }
+        if(!(other instanceof SubscribableContext)) {
+            return false;
+        }
+
+        SubscribableContext that = (SubscribableContext)other;
+        return this.cartridgeType.equals(that.cartridgeType) && this.alias.equals(that.alias);
+    }
+
+    public int hashCode () {
+
+        return cartridgeType.hashCode() + alias.hashCode();
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b097cbc4/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
index 4744f9f..2fd3eee 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
@@ -59,7 +59,7 @@ public class DefaultServiceGroupDeployer implements ServiceGroupDeployer {
             throw new InvalidServiceGroupException("Service Group definition not found");
         }
 
-        // if any cartridges are specified in the group, they should be already deployed
+//        if any cartridges are specified in the group, they should be already deployed
         if (serviceGroupDefinition.getCartridges() != null) {
             List<String> cartridgeTypes = serviceGroupDefinition.getCartridges();
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/b097cbc4/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 6a829bb..9bab469 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
@@ -81,7 +81,7 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
 
         // persist
         try {
-            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + CARTRIDGES + ACTIVE_SUBSCRIPTIONS + "/" +
+            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + ACTIVE_SUBSCRIPTIONS + CARTRIDGES + "/" +
                     Integer.toString(cartridgeSubscription.getSubscriber().getTenantId()) + "/" +
                     cartridgeSubscription.getType() + "/" +
                     cartridgeSubscription.getAlias(), Serializer.serializeSubscriptionSontextToByteArray(cartridgeSubscription), cartridgeSubscription.getClusterDomain());