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/01/04 09:27:28 UTC

[02/12] git commit: registry based persistence - refactored the RegistryManager and PersistenceManager

registry based persistence - refactored the RegistryManager and PersistenceManager


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

Branch: refs/heads/master
Commit: fd6b573e93090b28b0be159d04aca29a380983d5
Parents: b3238bd
Author: Isuru <is...@wso2.com>
Authored: Fri Dec 27 00:36:09 2013 +0530
Committer: Isuru <is...@wso2.com>
Committed: Fri Dec 27 00:36:09 2013 +0530

----------------------------------------------------------------------
 .../adc/mgt/persistence/PersistenceManager.java |   9 +-
 .../RegistryBasedPersistenceManager.java        | 137 +++++++++++-----
 .../adc/mgt/registry/RegistryManager.java       | 158 +++++++++++++------
 3 files changed, 217 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fd6b573e/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java
index 09ea562..e3afaf2 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java
@@ -22,7 +22,7 @@ package org.apache.stratos.adc.mgt.persistence;
 import org.apache.stratos.adc.mgt.exception.PersistenceManagerException;
 import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
 
-import java.util.Collection;
+import java.util.List;
 
 public abstract class PersistenceManager {
 
@@ -35,13 +35,16 @@ public abstract class PersistenceManager {
     public abstract CartridgeSubscription getCartridgeSubscription(int tenantId, String alias)
             throws PersistenceManagerException;
 
-    public abstract Collection<CartridgeSubscription> getCartridgeSubscriptions(int tenantId)
+    public abstract List<CartridgeSubscription> getCartridgeSubscriptions()
+            throws PersistenceManagerException;
+
+    public abstract List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId)
             throws PersistenceManagerException;
 
     public abstract CartridgeSubscription getCartridgeSubscription (String clusterDomain)
             throws PersistenceManagerException;
 
-    public abstract Collection<CartridgeSubscription> getCartridgeSubscriptions(int tenantId, String cartridgeType)
+    public abstract List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId, String cartridgeType)
             throws PersistenceManagerException;
 
     /*public abstract Repository getRepository (int tenantId, String alias)

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fd6b573e/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java
index 2cd1cd5..0db3c19 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/RegistryBasedPersistenceManager.java
@@ -21,58 +21,81 @@ package org.apache.stratos.adc.mgt.persistence;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.adc.mgt.exception.ADCException;
 import org.apache.stratos.adc.mgt.exception.PersistenceManagerException;
 import org.apache.stratos.adc.mgt.lookup.ClusterIdToSubscription;
 import org.apache.stratos.adc.mgt.lookup.SubscriptionContext;
 import org.apache.stratos.adc.mgt.registry.RegistryManager;
 import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
 import org.apache.stratos.adc.mgt.utils.Deserializer;
+import org.apache.stratos.adc.mgt.utils.Serializer;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
-import java.util.Collection;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class RegistryBasedPersistenceManager extends PersistenceManager {
 
     private static final Log log = LogFactory.getLog(RegistryBasedPersistenceManager.class);
+    // Registry paths
+    private static final String STRATOS_MANAGER_REOSURCE = "/stratos.manager";
+    private static final String CLUSTER_ID_TO_SUBSCRIPTION = "/clusterIdToSubscription";
+    private static final String TENANT_ID_TO_SUBSCRIPTION_CONTEXT = "/tenantIdToSubscriptionContext";
 
     @Override
-    public void persistCartridgeSubscription(CartridgeSubscription cartridgeSubscription) throws PersistenceManagerException {
+    public void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription) throws PersistenceManagerException {
 
         SubscriptionContext subscriptionContext = new SubscriptionContext();
         subscriptionContext.addSubscription(cartridgeSubscription);
 
+        //TODO: need to synchronize?
+        // persist in the path TENANT_ID_TO_SUBSCRIPTION_CONTEXT
         try {
-            RegistryManager.getInstance().persistSubscriptionContext(cartridgeSubscription.getSubscriber().getTenantId(), subscriptionContext);
+            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT + "/" +
+                    Integer.toString(cartridgeSubscription.getSubscriber().getTenantId()), Serializer.serializeSubscriptionSontextToByteArray(subscriptionContext));
 
         } catch (RegistryException e) {
             throw new PersistenceManagerException(e);
 
-        } catch (ADCException e) {
+        } catch (IOException e) {
+            throw new PersistenceManagerException(e);
+        }
+
+        // persist in the path CLUSTER_ID_TO_SUBSCRIPTION
+        try {
+            RegistryManager.getInstance().persist(STRATOS_MANAGER_REOSURCE + CLUSTER_ID_TO_SUBSCRIPTION + "/" +
+                    cartridgeSubscription.getClusterDomain(), Serializer.serializeSubscriptionSontextToByteArray(subscriptionContext));
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+
+        } catch (IOException e) {
             throw new PersistenceManagerException(e);
         }
     }
 
     @Override
-    public void removeCartridgeSubscription(int tenantId, String alias) throws PersistenceManagerException {
+    public void removeCartridgeSubscription (int tenantId, String alias) throws PersistenceManagerException {
         //TODO
     }
 
     @Override
-    public CartridgeSubscription getCartridgeSubscription(int tenantId, String alias) throws PersistenceManagerException {
+    public CartridgeSubscription getCartridgeSubscription (int tenantId, String alias) throws PersistenceManagerException {
 
         Object byteObj;
 
         try {
-            byteObj = RegistryManager.getInstance().getSubscriptionContext(tenantId);
-
-        } catch (ADCException e) {
-            throw new PersistenceManagerException(e);
+            byteObj = RegistryManager.getInstance().retrieve(STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT + "/" +
+                Integer.toString(tenantId));
 
         } catch (RegistryException e) {
             throw new PersistenceManagerException(e);
         }
 
+        if (byteObj == null) {
+            return null;
+        }
+
         Object subscriptionContextObj;
 
         try {
@@ -92,15 +115,65 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
     }
 
     @Override
-    public Collection<CartridgeSubscription> getCartridgeSubscriptions(int tenantId) throws PersistenceManagerException {
+    public List<CartridgeSubscription> getCartridgeSubscriptions () throws PersistenceManagerException {
 
-        Object byteObj;
+        Object resourceObj;
 
         try {
-            byteObj = RegistryManager.getInstance().getSubscriptionContext(tenantId);
+            resourceObj = RegistryManager.getInstance().retrieve(STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT);
 
-        } catch (ADCException e) {
+        } catch (RegistryException e) {
             throw new PersistenceManagerException(e);
+        }
+
+        if ((resourceObj == null) || !(resourceObj instanceof String[])) {
+            return null;
+        }
+
+        // get the paths for all SubscriptionContext instnaces
+        String[] subscriptionCtxtResourcePaths = (String[]) resourceObj;
+
+        List<CartridgeSubscription> cartridgeSubscriptions = new ArrayList<CartridgeSubscription>();
+        //for each path, get the SubscriptionContext instance
+        for (String subscriptionCtxResourcePath : subscriptionCtxtResourcePaths) {
+
+            Object serializedSubscriptionCtxObj = null;
+            try {
+                serializedSubscriptionCtxObj = RegistryManager.getInstance().retrieve(subscriptionCtxResourcePath);
+
+            } catch (RegistryException e) {
+                // issue might be at only this path, therefore log and continue
+                log.error("Error while retrieving Resource at " + subscriptionCtxResourcePath, e);
+                continue;
+            }
+
+            //De-serialize
+            Object subscriptionCtxObj = null;
+            try {
+                subscriptionCtxObj = Deserializer.deserializeFromByteArray((byte[]) serializedSubscriptionCtxObj);
+
+            } catch (Exception e) {
+                // issue might be de-serializing only this object, therefore log and continue
+                log.error("Error while de-serializing the object retrieved from "  + subscriptionCtxResourcePath, e);
+                continue;
+            }
+
+            if (subscriptionCtxObj != null && subscriptionCtxObj instanceof SubscriptionContext) {
+                SubscriptionContext subscriptionContext = (SubscriptionContext) subscriptionCtxObj;
+                cartridgeSubscriptions.addAll(subscriptionContext.getSubscriptions());
+            }
+        }
+
+        return cartridgeSubscriptions;
+    }
+
+    @Override
+    public List<CartridgeSubscription> getCartridgeSubscriptions (int tenantId) throws PersistenceManagerException {
+
+        Object byteObj;
+
+        try {
+            byteObj = RegistryManager.getInstance().retrieve(STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT + "/" + Integer.toString(tenantId));
 
         } catch (RegistryException e) {
             throw new PersistenceManagerException(e);
@@ -115,25 +188,22 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
             throw new PersistenceManagerException(e);
         }
 
-        SubscriptionContext subscriptionContext;
+        List<CartridgeSubscription> cartridgeSubscriptions = new ArrayList<CartridgeSubscription>();
         if (subscriptionContextObj instanceof SubscriptionContext) {
-            subscriptionContext = (SubscriptionContext) subscriptionContextObj;
-            return subscriptionContext.getSubscriptions();
+            //get all Subscriptions for this tenant
+            cartridgeSubscriptions.addAll(((SubscriptionContext) subscriptionContextObj).getSubscriptions());
         }
 
-        return null;
+        return cartridgeSubscriptions;
     }
 
     @Override
-    public CartridgeSubscription getCartridgeSubscription(String clusterDomain) throws PersistenceManagerException {
+    public CartridgeSubscription getCartridgeSubscription (String clusterDomain) throws PersistenceManagerException {
 
         Object byteObj;
 
         try {
-            byteObj = RegistryManager.getInstance().getClusterIdToSubscription();
-
-        } catch (ADCException e) {
-            throw new PersistenceManagerException(e);
+            byteObj = RegistryManager.getInstance().retrieve(STRATOS_MANAGER_REOSURCE + CLUSTER_ID_TO_SUBSCRIPTION + "/" + clusterDomain);
 
         } catch (RegistryException e) {
             throw new PersistenceManagerException(e);
@@ -148,25 +218,20 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
             throw new PersistenceManagerException(e);
         }
 
-        ClusterIdToSubscription clusterIdToSubscription;
         if (clusterIdToSubscriptionObj instanceof ClusterIdToSubscription) {
-            clusterIdToSubscription = (ClusterIdToSubscription) clusterIdToSubscriptionObj;
-            return clusterIdToSubscription.getSubscription(clusterDomain);
+            ((ClusterIdToSubscription) clusterIdToSubscriptionObj).getSubscription(clusterDomain);
         }
 
         return null;
     }
 
     @Override
-    public Collection<CartridgeSubscription> getCartridgeSubscriptions(int tenantId, String cartridgeType) throws PersistenceManagerException {
+    public List<CartridgeSubscription> getCartridgeSubscriptions (int tenantId, String cartridgeType) throws PersistenceManagerException {
 
         Object byteObj;
 
         try {
-            byteObj = RegistryManager.getInstance().getSubscriptionContext(tenantId);
-
-        } catch (ADCException e) {
-            throw new PersistenceManagerException(e);
+            byteObj = RegistryManager.getInstance().retrieve(STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT + "/" + Integer.toString(tenantId));
 
         } catch (RegistryException e) {
             throw new PersistenceManagerException(e);
@@ -181,12 +246,12 @@ public class RegistryBasedPersistenceManager extends PersistenceManager {
             throw new PersistenceManagerException(e);
         }
 
-        SubscriptionContext subscriptionContext;
+        List<CartridgeSubscription> cartridgeSubscriptions = new ArrayList<CartridgeSubscription>();
         if (subscriptionContextObj instanceof SubscriptionContext) {
-            subscriptionContext = (SubscriptionContext) subscriptionContextObj;
-            return subscriptionContext.getSubscriptionsOfType(cartridgeType);
+            //get all Subscriptions for this tenant and the type
+            cartridgeSubscriptions.addAll(((SubscriptionContext) subscriptionContextObj).getSubscriptionsOfType(cartridgeType));
         }
 
-        return null;
+        return cartridgeSubscriptions;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fd6b573e/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java
index 707d772..821418a 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java
@@ -21,11 +21,7 @@ package org.apache.stratos.adc.mgt.registry;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.adc.mgt.exception.ADCException;
 import org.apache.stratos.adc.mgt.internal.DataHolder;
-import org.apache.stratos.adc.mgt.lookup.ClusterIdToSubscription;
-import org.apache.stratos.adc.mgt.lookup.SubscriptionContext;
-import org.apache.stratos.adc.mgt.utils.Serializer;
 import org.wso2.carbon.registry.core.Resource;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
 import org.wso2.carbon.registry.core.exceptions.ResourceNotFoundException;
@@ -36,20 +32,16 @@ public class RegistryManager {
 
     private final static Log log = LogFactory.getLog(RegistryManager.class);
                                                                                                                           ;
-    private final static String STRATOS_MANAGER_REOSURCE = "/stratos.manager";
-    private final static String CLUSTER_ID_TO_SUBSCRIPTION = "/clusterIdToSubscription";
-    private final static String TENENTID_TO_SUBSCRIPTION_CONTEXT = "/tenantIdToSubscriptionContext";
+    private static final String STRATOS_MANAGER_REOSURCE = "/stratos.manager";
 
     private static RegistryService registryService;
     private static volatile RegistryManager registryManager;
 
     public static RegistryManager getInstance() {
 
-        registryService = DataHolder.getRegistryService();
-
         if (registryManager == null) {
             synchronized (RegistryManager.class) {
-                if (registryService == null) {
+                if (registryManager == null) {
                     return registryManager;
                 }
                 registryManager = new RegistryManager();
@@ -59,60 +51,64 @@ public class RegistryManager {
     }
 
     private RegistryManager() {
-
+        registryService = DataHolder.getRegistryService();
     }
 
-    private UserRegistry initRegistry (int tenantId) throws RegistryException, ADCException {
+    private UserRegistry initRegistry (int tenantId) throws RegistryException {
 
         UserRegistry tenantGovRegistry = registryService.getGovernanceSystemRegistry(tenantId);
-        if (tenantGovRegistry == null) {
+        /*if (tenantGovRegistry == null) {
             String errorMsg = "Tenant " + tenantId + "'s governance registry is not initialized";
             log.error(errorMsg);
             throw new ADCException(errorMsg);
-        }
+        }*/
 
-        synchronized (RegistryManager.class) {
-            // check if the resource is available, else create it
-            try {
-                if (!tenantGovRegistry.resourceExists(STRATOS_MANAGER_REOSURCE)) {
-                    tenantGovRegistry.put(STRATOS_MANAGER_REOSURCE, tenantGovRegistry.newCollection());
+        // check if the resource is available, else create it
+        if (!tenantGovRegistry.resourceExists(STRATOS_MANAGER_REOSURCE)) {
+            synchronized (RegistryManager.class) {
+                try {
+                    if (!tenantGovRegistry.resourceExists(STRATOS_MANAGER_REOSURCE)) {
+                        tenantGovRegistry.put(STRATOS_MANAGER_REOSURCE, tenantGovRegistry.newCollection());
+                    }
+                } catch (RegistryException e) {
+                    String errorMsg = "Failed to create the registry resource " + STRATOS_MANAGER_REOSURCE;
+                    log.error(errorMsg, e);
+                    throw e;
                 }
-            } catch (RegistryException e) {
-                String errorMsg = "Failed to create the registry resource " + STRATOS_MANAGER_REOSURCE;
-                log.error(errorMsg, e);
-                throw new ADCException(errorMsg, e);
             }
         }
 
         return tenantGovRegistry;
     }
 
-    private UserRegistry initRegistry () throws RegistryException, ADCException {
+    private UserRegistry initRegistry () throws RegistryException {
 
         UserRegistry govRegistry = registryService.getGovernanceSystemRegistry();
-        if (govRegistry == null) {
+        /*if (govRegistry == null) {
             String errorMsg = "Governance registry is not initialized";
             log.error(errorMsg);
             throw new ADCException(errorMsg);
-        }
+        }*/
 
-        synchronized (RegistryManager.class) {
-            // check if the resource is available, else create it
-            try {
-                if (!govRegistry.resourceExists(STRATOS_MANAGER_REOSURCE)) {
-                    govRegistry.put(STRATOS_MANAGER_REOSURCE, govRegistry.newCollection());
+        // check if the resource is available, else create it
+        if (!govRegistry.resourceExists(STRATOS_MANAGER_REOSURCE)) {
+            synchronized (RegistryManager.class) {
+                try {
+                    if (!govRegistry.resourceExists(STRATOS_MANAGER_REOSURCE)) {
+                        govRegistry.put(STRATOS_MANAGER_REOSURCE, govRegistry.newCollection());
+                    }
+                } catch (RegistryException e) {
+                    String errorMsg = "Failed to create the registry resource " + STRATOS_MANAGER_REOSURCE;
+                    log.error(errorMsg, e);
+                    throw e;
                 }
-            } catch (RegistryException e) {
-                String errorMsg = "Failed to create the registry resource " + STRATOS_MANAGER_REOSURCE;
-                log.error(errorMsg, e);
-                throw new ADCException(errorMsg, e);
             }
         }
 
         return govRegistry;
     }
 
-    public void persistSubscriptionContext(int tenantId, SubscriptionContext subscriptionContext)
+    /*public void persistSubscriptionContext (int tenantId, SubscriptionContext subscriptionContext)
             throws RegistryException, ADCException {
 
         //TODO: uncomment
@@ -124,10 +120,7 @@ public class RegistryManager {
             tenantGovRegistry.beginTransaction();
             Resource nodeResource = tenantGovRegistry.newResource();
             nodeResource.setContent(Serializer.serializeSubscriptionSontextToByteArray(subscriptionContext));
-            //TODO: uncomment
-            //tenantGovRegistry.put(STRATOS_MANAGER_REOSURCE + TENENTID_TO_SUBSCRIPTION_CONTEXT, nodeResource);
-            //temporary
-            tenantGovRegistry.put(STRATOS_MANAGER_REOSURCE + TENENTID_TO_SUBSCRIPTION_CONTEXT + "/" + Integer.toString(tenantId), nodeResource);
+            tenantGovRegistry.put(STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT, nodeResource);
             tenantGovRegistry.commitTransaction();
 
         } catch (Exception e) {
@@ -138,11 +131,12 @@ public class RegistryManager {
         }
     }
 
+    //TODO: retun the de-serialized object
     public Object getSubscriptionContext(int tenantId) throws ADCException, RegistryException {
 
         //TODO: uncomment
         //UserRegistry tenantGovRegistry = registryService.getGovernanceSystemRegistry(tenantId);
-        //temprary
+        //temporary
         UserRegistry tenantGovRegistry = registryService.getGovernanceSystemRegistry();
 
         if (tenantGovRegistry == null) {
@@ -152,14 +146,11 @@ public class RegistryManager {
         }
 
         try {
-            //TODO: uncomment
-            //Resource resource = tenantGovRegistry.get(STRATOS_MANAGER_REOSURCE + TENENTID_TO_SUBSCRIPTION_CONTEXT);
-            //temporary
-            Resource resource = tenantGovRegistry.get(STRATOS_MANAGER_REOSURCE + TENENTID_TO_SUBSCRIPTION_CONTEXT + "/" + Integer.toString(tenantId));
+            Resource resource = tenantGovRegistry.get(STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT);
             return resource.getContent();
 
         } catch (ResourceNotFoundException ignore) {
-            log.error("Sepcified resource not found at " + STRATOS_MANAGER_REOSURCE + TENENTID_TO_SUBSCRIPTION_CONTEXT);
+            log.error("Sepcified resource not found at " + STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT);
             return null;
 
         } catch (RegistryException e) {
@@ -167,9 +158,33 @@ public class RegistryManager {
             log.error(errorMsg, e);
             throw new ADCException(errorMsg, e);
         }
-    }
+    }*/
+
+    /*public Object getSubscriptionContexts() throws RegistryException {
 
-    public void persistClusterIdToSubscription (ClusterIdToSubscription clusterIdToSubscription)
+        UserRegistry registry = registryService.getGovernanceSystemRegistry();
+        return retrieve(registry, STRATOS_MANAGER_REOSURCE + TENANT_ID_TO_SUBSCRIPTION_CONTEXT);
+
+
+        if ((resourceObj == null) || !(resourceObj instanceof String[])) {
+            return null;
+        }
+
+        // get the paths for all SubscriptionContext instnaces
+        String[] subscriptionCtxtResourcePaths = (String[]) resourceObj;
+
+        Collection<SubscriptionContext> cartridgeSubscriptionCtxts;
+        //for each path, get the SubscriptionContext instance
+        for (String subscriptionCtxResourcePath : subscriptionCtxtResourcePaths) {
+            Object subscriptionCtxObj = retrieve(registry, subscriptionCtxResourcePath);
+            if (subscriptionCtxObj != null && subscriptionCtxObj instanceof SubscriptionContext) {
+
+            }
+        }
+
+    }*/
+
+    /*public void persistClusterIdToSubscription (ClusterIdToSubscription clusterIdToSubscription)
             throws RegistryException, ADCException {
 
         UserRegistry govRegistry = initRegistry();
@@ -189,6 +204,7 @@ public class RegistryManager {
         }
     }
 
+    //TODO: retun the de-serialized object
     public Object getClusterIdToSubscription () throws ADCException, RegistryException {
 
         UserRegistry govRegistry = registryService.getGovernanceSystemRegistry();
@@ -210,5 +226,51 @@ public class RegistryManager {
             log.error(errorMsg, e);
             throw new ADCException(errorMsg, e);
         }
+    }*/
+
+    public void persist (String path, byte [] resourceBytes) throws RegistryException {
+
+        UserRegistry registry = initRegistry();
+
+        try {
+            registry.beginTransaction();
+            Resource nodeResource = registry.newResource();
+            nodeResource.setContent(resourceBytes);
+            registry.put(path, nodeResource);
+            registry.commitTransaction();
+
+        } catch (RegistryException e) {
+            registry.rollbackTransaction();
+            String errorMsg = "Failed to persist the given resource in registry path " + path;
+            log.error(errorMsg, e);
+            throw e;
+        }
+    }
+
+    public Object retrieve (String resourcePath) throws RegistryException {
+
+        UserRegistry registry = initRegistry();
+
+        Resource resource;
+
+        try {
+            resource = registry.get(resourcePath);
+
+        } catch (ResourceNotFoundException ignore) {
+            String errorMsg = "Resource not found at path " + resourcePath;
+            log.error(errorMsg);
+            return null;
+
+        } catch (RegistryException e) {
+            String errorMsg = "Failed to retrieve the Resource at " + resourcePath + " from registry.";
+            log.error(errorMsg, e);
+            throw e;
+        }
+
+        if(resource == null) {
+            return null;
+        }
+
+        return resource.getContent();
     }
 }