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 2013/12/10 05:16:15 UTC

[5/5] git commit: registry based persistence

registry based persistence


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

Branch: refs/heads/master
Commit: aebdb0879b017ab4b722a626521a46a22eaa4bff
Parents: 1c2f93c
Author: Isuru <is...@wso2.com>
Authored: Tue Dec 10 09:44:57 2013 +0530
Committer: Isuru <is...@wso2.com>
Committed: Tue Dec 10 09:44:57 2013 +0530

----------------------------------------------------------------------
 .../ClusterIdToCartridgeSubscriptionMap.java    |  70 ++++++++++
 .../adc/mgt/lookup/LookupDataHolder.java        | 116 +++++++++-------
 ...criptionAliasToCartridgeSubscriptionMap.java |  71 ++++++++++
 .../adc/mgt/persistence/PersistenceManager.java |  22 ++-
 .../RegistryBasedPersistenceManager.java        | 102 ++++++++++++--
 .../adc/mgt/registry/RegistryManager.java       | 138 +++++++++++++++++++
 .../adc/mgt/retriever/DataRetrievalManager.java |  89 +++++++-----
 .../stratos/adc/mgt/utils/Deserializer.java     |  52 +++++++
 .../stratos/adc/mgt/utils/Serializer.java       |  83 +++++++++++
 9 files changed, 642 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/ClusterIdToCartridgeSubscriptionMap.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/ClusterIdToCartridgeSubscriptionMap.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/ClusterIdToCartridgeSubscriptionMap.java
new file mode 100644
index 0000000..864ffb2
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/ClusterIdToCartridgeSubscriptionMap.java
@@ -0,0 +1,70 @@
+/*
+ * 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.adc.mgt.lookup;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ClusterIdToCartridgeSubscriptionMap implements Serializable {
+
+    private static final Log log = LogFactory.getLog(ClusterIdToCartridgeSubscriptionMap.class);
+
+    private Map<String, CartridgeSubscription> clusterItToCartridgeSubscrptionMap;
+
+    public ClusterIdToCartridgeSubscriptionMap () {
+        clusterItToCartridgeSubscrptionMap = new HashMap<String, CartridgeSubscription>();
+    }
+
+    public Map<String, CartridgeSubscription> getSubscriptionAliasToCartridgeSubscriptionMap() {
+        return clusterItToCartridgeSubscrptionMap;
+    }
+
+    public void addSubscription(String clusterId, CartridgeSubscription cartridgeSubscription) {
+
+        if(clusterItToCartridgeSubscrptionMap.put(clusterId, cartridgeSubscription) != null) {
+            log.info("Overwrote the previous CartridgeSubscription value for cluster " + clusterId);
+        }
+    }
+
+    public boolean isEmpty () {
+        return clusterItToCartridgeSubscrptionMap.isEmpty();
+    }
+
+    public void removeSubscription (String clusterId) {
+
+        if(clusterItToCartridgeSubscrptionMap.remove(clusterId) == null) {
+            log.info("No CartridgeSubscription entry found for cluster " + clusterId);
+        }
+    }
+
+    public CartridgeSubscription getCartridgeSubscription (String clusterId) {
+        return clusterItToCartridgeSubscrptionMap.get(clusterId);
+    }
+
+    public Collection<CartridgeSubscription> getCartridgeSubscriptions () {
+        return clusterItToCartridgeSubscrptionMap.values();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java
index f283753..5e704db 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/LookupDataHolder.java
@@ -23,16 +23,20 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
 
-import java.util.*;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
-public class LookupDataHolder {
+public class LookupDataHolder implements Serializable {
 
     private static final Log log = LogFactory.getLog(LookupDataHolder.class);
 
     private Map<Integer, SubscriptionAliasToCartridgeSubscriptionMap> tenantIdToCartridgeSubscriptionCache;
-    private Map<String, CartridgeSubscription> clusterItToCartridgeSubscrptionMatch;
+    //private Map<String, CartridgeSubscription> clusterItToCartridgeSubscrptionMap;
     //private static LookupDataHolder lookupDataHolder;
+    private ClusterIdToCartridgeSubscriptionMap clusterIdToCartridgeSubscriptionMap;
 
     //locks
     private static volatile ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
@@ -41,7 +45,8 @@ public class LookupDataHolder {
 
     public LookupDataHolder () {
         tenantIdToCartridgeSubscriptionCache = new HashMap<Integer, SubscriptionAliasToCartridgeSubscriptionMap>();
-        clusterItToCartridgeSubscrptionMatch = new HashMap<String, CartridgeSubscription>();
+        //clusterItToCartridgeSubscrptionMap = new HashMap<String, CartridgeSubscription>();
+        clusterIdToCartridgeSubscriptionMap = new ClusterIdToCartridgeSubscriptionMap();
     }
 
     /*public static LookupDataHolder getInstance ()  {
@@ -77,10 +82,31 @@ public class LookupDataHolder {
                 aliasToSubscriptionMap.addSubscription(subscriptionAlias, cartridgeSubscription);
             }
 
-            if(clusterItToCartridgeSubscrptionMatch.put(cartridgeSubscription.getClusterDomain(), cartridgeSubscription)
-                    != null) {
-                log.info("Overwrote the CartridgeSubscription value for cluster Id " +
-                        cartridgeSubscription.getClusterDomain());
+            clusterIdToCartridgeSubscriptionMap.addSubscription(cartridgeSubscription.getClusterDomain(), cartridgeSubscription);
+
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+    public void addCartridgeSubscriptions (int tenantId, SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) {
+
+    }
+
+    private void addSubscriptions (int tenantId, SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) {
+
+        writeLock.lock();
+
+        try {
+            if(tenantIdToCartridgeSubscriptionCache.put(tenantId, aliasToSubscriptionMap) != null) {
+                log.info("Existing SubscriptionAliasToCartridgeSubscriptionMap instance overwritten for tenant " +
+                        tenantId);
+            }
+
+            Collection<CartridgeSubscription> cartridgeSubscriptions = aliasToSubscriptionMap.getCartridgeSubscriptions();
+            for (CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) {
+                clusterIdToCartridgeSubscriptionMap.addSubscription(cartridgeSubscription.getCluster().getClusterDomain(),
+                        cartridgeSubscription);
             }
 
         } finally {
@@ -110,8 +136,37 @@ public class LookupDataHolder {
                 log.info("No SubscriptionAliasToCartridgeSubscriptionMap entry found for tenant Id " + tenantId);
             }
 
-            if(clusterItToCartridgeSubscrptionMatch.remove(clusterId) != null) {
-                log.info("No CartridgeSubscription entry found for cluster Id " + clusterId);
+            clusterIdToCartridgeSubscriptionMap.removeSubscription(clusterId);
+
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+    public void removeCartridgeSubscriptions (int tenantId) {
+        removeSubscriptions(tenantId);
+    }
+
+    private void removeSubscriptions (int tenantId) {
+
+        writeLock.lock();
+
+        try {
+            SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap = tenantIdToCartridgeSubscriptionCache.
+                    get(tenantId);
+
+            if(aliasToSubscriptionMap != null) {
+                //remove the subscriptions referenced by cluster domain for this tenant
+                Collection<CartridgeSubscription> cartridgeSubscriptions = aliasToSubscriptionMap.getCartridgeSubscriptions();
+
+                for (CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) {
+                    clusterIdToCartridgeSubscriptionMap.removeSubscription(cartridgeSubscription.getClusterDomain());
+                }
+                //remove the map for this tenant ID
+                tenantIdToCartridgeSubscriptionCache.remove(tenantId);
+
+            } else {
+                log.info("No SubscriptionAliasToCartridgeSubscriptionMap entry found for tenant Id " + tenantId);
             }
 
         } finally {
@@ -154,7 +209,7 @@ public class LookupDataHolder {
 
         readLock.lock();
         try {
-            return clusterItToCartridgeSubscrptionMatch.get(clusterId);
+            return clusterIdToCartridgeSubscriptionMap.getCartridgeSubscription(clusterId);
 
         } finally {
             readLock.unlock();
@@ -196,43 +251,4 @@ public class LookupDataHolder {
              readLock.unlock();
         }
     }
-
-    private class SubscriptionAliasToCartridgeSubscriptionMap {
-
-        private Map<String, CartridgeSubscription> subscriptionAliasToCartridgeSubscriptionMap;
-
-        public SubscriptionAliasToCartridgeSubscriptionMap () {
-            subscriptionAliasToCartridgeSubscriptionMap = new HashMap<String, CartridgeSubscription>();
-        }
-
-        public Map<String, CartridgeSubscription> getSubscriptionAliasToCartridgeSubscriptionMap() {
-            return subscriptionAliasToCartridgeSubscriptionMap;
-        }
-
-        public void addSubscription(String subscriptionAlias, CartridgeSubscription cartridgeSubscription) {
-
-            if(subscriptionAliasToCartridgeSubscriptionMap.put(subscriptionAlias, cartridgeSubscription) != null) {
-                log.info("Overwrote the previous CartridgeSubscription value for subscription alias" + subscriptionAlias);
-            }
-        }
-
-        public boolean isEmpty () {
-            return subscriptionAliasToCartridgeSubscriptionMap.isEmpty();
-        }
-
-        public void removeSubscription (String subscriptionAlias) {
-
-            if(subscriptionAliasToCartridgeSubscriptionMap.remove(subscriptionAlias) == null) {
-                log.info("No CartridgeSubscription entry found for subscription alias " + subscriptionAlias);
-            }
-        }
-
-        public CartridgeSubscription getCartridgeSubscription (String cartridgeSubscriptionAlias) {
-            return subscriptionAliasToCartridgeSubscriptionMap.get(cartridgeSubscriptionAlias);
-        }
-
-        public Collection<CartridgeSubscription> getCartridgeSubscriptions () {
-            return subscriptionAliasToCartridgeSubscriptionMap.values();
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/SubscriptionAliasToCartridgeSubscriptionMap.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/SubscriptionAliasToCartridgeSubscriptionMap.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/SubscriptionAliasToCartridgeSubscriptionMap.java
new file mode 100644
index 0000000..56e9d7d
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/lookup/SubscriptionAliasToCartridgeSubscriptionMap.java
@@ -0,0 +1,71 @@
+/*
+ * 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.adc.mgt.lookup;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+public class SubscriptionAliasToCartridgeSubscriptionMap implements Serializable {
+
+    private static final Log log = LogFactory.getLog(SubscriptionAliasToCartridgeSubscriptionMap.class);
+
+
+    private Map<String, CartridgeSubscription> subscriptionAliasToCartridgeSubscriptionMap;
+
+    public SubscriptionAliasToCartridgeSubscriptionMap () {
+        subscriptionAliasToCartridgeSubscriptionMap = new HashMap<String, CartridgeSubscription>();
+    }
+
+    public Map<String, CartridgeSubscription> getSubscriptionAliasToCartridgeSubscriptionMap() {
+        return subscriptionAliasToCartridgeSubscriptionMap;
+    }
+
+    public void addSubscription(String subscriptionAlias, CartridgeSubscription cartridgeSubscription) {
+
+        if(subscriptionAliasToCartridgeSubscriptionMap.put(subscriptionAlias, cartridgeSubscription) != null) {
+            log.info("Overwrote the previous CartridgeSubscription value for subscription alias" + subscriptionAlias);
+        }
+    }
+
+    public boolean isEmpty () {
+        return subscriptionAliasToCartridgeSubscriptionMap.isEmpty();
+    }
+
+    public void removeSubscription (String subscriptionAlias) {
+
+        if(subscriptionAliasToCartridgeSubscriptionMap.remove(subscriptionAlias) == null) {
+            log.info("No CartridgeSubscription entry found for subscription alias " + subscriptionAlias);
+        }
+    }
+
+    public CartridgeSubscription getCartridgeSubscription (String cartridgeSubscriptionAlias) {
+        return subscriptionAliasToCartridgeSubscriptionMap.get(cartridgeSubscriptionAlias);
+    }
+
+    public Collection<CartridgeSubscription> getCartridgeSubscriptions () {
+        return subscriptionAliasToCartridgeSubscriptionMap.values();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/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 1e8936a..b948e84 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
@@ -20,13 +20,25 @@
 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.List;
+import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap;
+import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap;
 
 public abstract class PersistenceManager {
 
-    public abstract void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription)
+    public abstract void persistCartridgeSubscriptions (int tenantId, SubscriptionAliasToCartridgeSubscriptionMap
+                                                                aliasToSubscriptionMap)
+            throws PersistenceManagerException;
+
+    public abstract SubscriptionAliasToCartridgeSubscriptionMap retrieveCartridgeSubscriptions (int tenantId)
+            throws PersistenceManagerException;
+
+    public abstract void persistCartridgeSubscriptions (String clusterId, ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap)
+            throws PersistenceManagerException;
+
+    public abstract ClusterIdToCartridgeSubscriptionMap retrieveCartridgeSubscriptions (String clusterId)
+            throws PersistenceManagerException;
+
+    /*public abstract void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription)
             throws PersistenceManagerException;
 
     public abstract void removeCartridgeSubscription (int tenantId, String alias)
@@ -41,7 +53,7 @@ public abstract class PersistenceManager {
     public abstract CartridgeSubscription getCartridgeSubscription (String clusterDomain)
             throws PersistenceManagerException;
 
-    /*public abstract List<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/aebdb087/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 e69585c..c796767 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
@@ -19,35 +19,107 @@
 
 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.subscription.CartridgeSubscription;
-
-import java.util.List;
+import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap;
+import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap;
+import org.apache.stratos.adc.mgt.registry.RegistryManager;
+import org.apache.stratos.adc.mgt.utils.Deserializer;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
 public class RegistryBasedPersistenceManager extends PersistenceManager {
 
-    @Override
-    public void persistCartridgeSubscription(CartridgeSubscription cartridgeSubscription) throws PersistenceManagerException {
-        //To change body of implemented methods use File | Settings | File Templates.
-    }
+    private static final Log log = LogFactory.getLog(RegistryBasedPersistenceManager.class);
 
     @Override
-    public void removeCartridgeSubscription(int tenantId, String alias) throws PersistenceManagerException {
-        //To change body of implemented methods use File | Settings | File Templates.
+    public void persistCartridgeSubscriptions(int tenantId, SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) throws PersistenceManagerException {
+
+        try {
+            RegistryManager.getInstance().persistAliastoSubscriptionMap(tenantId, aliasToSubscriptionMap);
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+
+        } catch (ADCException e) {
+            throw new PersistenceManagerException(e);
+        }
     }
 
     @Override
-    public CartridgeSubscription getCartridgeSubscription(int tenantId, String alias) throws PersistenceManagerException {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public SubscriptionAliasToCartridgeSubscriptionMap retrieveCartridgeSubscriptions(int tenantId) throws PersistenceManagerException {
+
+        Object aliasToSubscriptionMapObj;
+
+        try {
+            aliasToSubscriptionMapObj = RegistryManager.getInstance().getAliastoSubscriptionMap(tenantId);
+
+        } catch (ADCException e) {
+            throw new PersistenceManagerException(e);
+        }
+
+        if (aliasToSubscriptionMapObj != null) {
+            try {
+                Object dataObj = Deserializer
+                        .deserializeFromByteArray((byte[]) aliasToSubscriptionMapObj);
+                if(dataObj instanceof SubscriptionAliasToCartridgeSubscriptionMap) {
+                    return (SubscriptionAliasToCartridgeSubscriptionMap) dataObj;
+                } else {
+                    return null;
+                }
+
+            } catch (Exception e) {
+                String errorMsg = "Unable to retrieve data from Registry. Hence, any historical data will not get reflected.";
+                log.warn(errorMsg, e);
+            }
+        }
+
+        return null;
     }
 
     @Override
-    public List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId) throws PersistenceManagerException {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public void persistCartridgeSubscriptions(String clusterId, ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap) throws PersistenceManagerException {
+
+        try {
+            RegistryManager.getInstance().persistClusterIdToSubscriptionMap(clusterIdToSubscriptionMap);
+
+        } catch (RegistryException e) {
+            throw new PersistenceManagerException(e);
+
+        } catch (ADCException e) {
+            throw new PersistenceManagerException(e);
+        }
     }
 
     @Override
-    public CartridgeSubscription getCartridgeSubscription(String clusterDomain) throws PersistenceManagerException {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public ClusterIdToCartridgeSubscriptionMap retrieveCartridgeSubscriptions(String clusterId) throws PersistenceManagerException {
+
+        Object clusterIdToSubscriptionMapObj;
+
+        try {
+            clusterIdToSubscriptionMapObj = RegistryManager.getInstance().getClusterIdtoSubscriptionMap();
+
+        } catch (ADCException e) {
+            throw new PersistenceManagerException(e);
+        }
+
+        if (clusterIdToSubscriptionMapObj != null) {
+            try {
+                Object dataObj = Deserializer
+                        .deserializeFromByteArray((byte[]) clusterIdToSubscriptionMapObj);
+                if(dataObj instanceof ClusterIdToCartridgeSubscriptionMap) {
+                    return (ClusterIdToCartridgeSubscriptionMap) dataObj;
+                } else {
+                    return null;
+                }
+
+            } catch (Exception e) {
+                String errorMsg = "Unable to retrieve data from Registry. Hence, any historical data will not get reflected.";
+                log.warn(errorMsg, e);
+            }
+        }
+
+        return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/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
new file mode 100644
index 0000000..da7fdec
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/registry/RegistryManager.java
@@ -0,0 +1,138 @@
+/*
+ * 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.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.ClusterIdToCartridgeSubscriptionMap;
+import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap;
+import org.apache.stratos.adc.mgt.utils.Serializer;
+import org.wso2.carbon.registry.core.Registry;
+import org.wso2.carbon.registry.core.Resource;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.wso2.carbon.registry.core.exceptions.ResourceNotFoundException;
+
+public class RegistryManager {
+
+    private final static Log log = LogFactory.getLog(RegistryManager.class);
+    private final static String STRATOS_MANAGER_REOSURCE = "/stratos.manager";
+    private static Registry registryService;
+    private static RegistryManager registryManager;
+
+    public static RegistryManager getInstance() {
+
+        registryService = DataHolder.getRegistry();
+
+        if (registryManager == null) {
+            synchronized (RegistryManager.class) {
+                if (registryService == null) {
+                    return registryManager;
+                }
+                registryManager = new RegistryManager();
+            }
+        }
+        return registryManager;
+    }
+
+    private RegistryManager() {
+        try {
+            if (!registryService.resourceExists(STRATOS_MANAGER_REOSURCE)) {
+                registryService.put(STRATOS_MANAGER_REOSURCE, registryService.newCollection());
+            }
+        } catch (RegistryException e) {
+            String errorMsg = "Failed to create the registry resource " + STRATOS_MANAGER_REOSURCE;
+            log.error(errorMsg, e);;
+        }
+    }
+
+    public void persistAliastoSubscriptionMap (int tenantId,
+                                               SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap)
+            throws RegistryException, ADCException {
+
+        try {
+            registryService.beginTransaction();
+            Resource nodeResource = registryService.newResource();
+            nodeResource.setContent(Serializer.serializeAliasToSubscriptionMapToByteArray(aliasToSubscriptionMap));
+            registryService.put(STRATOS_MANAGER_REOSURCE + "/subscription/tenant" + Integer.toString(tenantId),
+                    nodeResource);
+            registryService.commitTransaction();
+
+        } catch (Exception e) {
+            String errorMsg = "Failed to persist SubscriptionAliasToCartridgeSubscriptionMap in registry.";
+            registryService.rollbackTransaction();
+            log.error(errorMsg, e);
+            throw new ADCException(errorMsg, e);
+        }
+    }
+
+    public Object getAliastoSubscriptionMap (int tenantId) throws ADCException {
+
+        try {
+            Resource resource = registryService.get(STRATOS_MANAGER_REOSURCE + "/subscription/tenant" +
+                    Integer.toString(tenantId));
+            return resource.getContent();
+
+        } catch (ResourceNotFoundException ignore) {
+            return null;
+
+        } catch (RegistryException e) {
+            String errorMsg = "Failed to retrieve SubscriptionAliasToCartridgeSubscriptionMap from registry.";
+            log.error(errorMsg, e);
+            throw new ADCException(errorMsg, e);
+        }
+    }
+
+    public void persistClusterIdToSubscriptionMap (ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap)
+            throws RegistryException, ADCException {
+
+        try {
+            registryService.beginTransaction();
+            Resource nodeResource = registryService.newResource();
+            nodeResource.setContent(Serializer.serializeClusterIdToSubscriptionMapToByteArray(clusterIdToSubscriptionMap));
+            registryService.put(STRATOS_MANAGER_REOSURCE + "/subscription/cluster",
+                    nodeResource);
+            registryService.commitTransaction();
+
+        } catch (Exception e) {
+            String errorMsg = "Failed to persist ClusterIdToCartridgeSubscriptionMap in registry.";
+            registryService.rollbackTransaction();
+            log.error(errorMsg, e);
+            throw new ADCException(errorMsg, e);
+        }
+    }
+
+    public Object getClusterIdtoSubscriptionMap () throws ADCException {
+
+        try {
+            Resource resource = registryService.get(STRATOS_MANAGER_REOSURCE + "/subscription/cluster");
+            return resource.getContent();
+
+        } catch (ResourceNotFoundException ignore) {
+            return null;
+
+        } catch (RegistryException e) {
+            String errorMsg = "Failed to retrieve ClusterIdToCartridgeSubscriptionMap from registry.";
+            log.error(errorMsg, e);
+            throw new ADCException(errorMsg, e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java
index 11093d3..27022c5 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/retriever/DataRetrievalManager.java
@@ -19,8 +19,11 @@
 
 package org.apache.stratos.adc.mgt.retriever;
 
+import org.apache.stratos.adc.mgt.exception.ADCException;
 import org.apache.stratos.adc.mgt.exception.PersistenceManagerException;
+import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap;
 import org.apache.stratos.adc.mgt.lookup.LookupDataHolder;
+import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap;
 import org.apache.stratos.adc.mgt.persistence.PersistenceManager;
 import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
 import org.jgroups.logging.Log;
@@ -46,46 +49,45 @@ public class DataRetrievalManager {
         cartridgeSubscriptionUpdateThreadPool = Executors.newCachedThreadPool();
     }
 
-    public CartridgeSubscription getCartridgeSubscription (int tenantId, String subscriptionAlias)
-            throws PersistenceManagerException {
+    public CartridgeSubscription getCartridgeSubscriptionByAlias (int tenantId, String subscriptionAlias)
+            throws PersistenceManagerException, ADCException {
 
         CartridgeSubscription cartridgeSubscription = null;
 
         if(lookupDataHolder != null) {
-            //look in the local cache
-            cartridgeSubscription = lookupDataHolder.getCartridgeSubscription(tenantId, subscriptionAlias);
+            cartridgeSubscription = lookupDataHolder.getCartridgeSubscription(subscriptionAlias);
         }
-        //if not found in the local cache, look in the Persistence Manager
-        if (cartridgeSubscription == null) {
-            persistenceManager.getCartridgeSubscription(tenantId, subscriptionAlias);
-        } else {
-            if(log.isDebugEnabled()) {
-                log.debug("Cartridge subscription entry for tenant Id " + tenantId + ", subscription alias " +
-                        subscriptionAlias + " found in the local cache");
+        else {
+            //look in the persistence manager
+            SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap =
+                    persistenceManager.retrieveCartridgeSubscriptions(tenantId);
+
+            if(aliasToSubscriptionMap != null) {
+                cartridgeSubscription = aliasToSubscriptionMap.getCartridgeSubscription(subscriptionAlias);
+                populateLookupDataHolder(aliasToSubscriptionMap);
             }
         }
 
         return cartridgeSubscription;
     }
 
-    public CartridgeSubscription getCartridgeSubscription (String clusterId)
-            throws PersistenceManagerException {
+    public CartridgeSubscription getCartridgeSubscriptionByClusterId (String clusterId)
+            throws PersistenceManagerException, ADCException {
 
         CartridgeSubscription cartridgeSubscription = null;
 
         if(lookupDataHolder != null) {
-            //look in the local cache
             cartridgeSubscription = lookupDataHolder.getCartridgeSubscription(clusterId);
         }
-        //if not found in the local cache, look in the Persistence Manager
-        if (cartridgeSubscription == null) {
-            persistenceManager.getCartridgeSubscription(clusterId);
-
-        } else {
-            if(log.isDebugEnabled()) {
-                log.debug("Cartridge subscription entry for cluster domain " + clusterId +
-                        " found in the local cache");
+        else {
+            //look in the persistence manager
+            ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap =
+                    persistenceManager.retrieveCartridgeSubscriptions(clusterId);
+            if(clusterIdToSubscriptionMap != null) {
+                cartridgeSubscription = clusterIdToSubscriptionMap.getCartridgeSubscription(clusterId);
+                populateLookupDataHolder(clusterIdToSubscriptionMap);
             }
+
         }
 
         return cartridgeSubscription;
@@ -101,7 +103,10 @@ public class DataRetrievalManager {
         }
         //if not found in the local cache, look in the Persistence Manager
         if (cartridgeSubscriptionCollection == null) {
-            persistenceManager.getCartridgeSubscriptions(tenantId);
+            SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap = persistenceManager.
+                    retrieveCartridgeSubscriptions(tenantId);
+            //populate the LookupDataHolder
+            populateLookupDataHolder(aliasToSubscriptionMap);
 
         } else {
             if(log.isDebugEnabled()) {
@@ -118,29 +123,51 @@ public class DataRetrievalManager {
         return cartridgeSubscriptionList;
     }
 
-    public void putCartridgeSubscription (CartridgeSubscription cartridgeSubscription) {
+    private void populateLookupDataHolder (SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) {
+
+        //populate the cache
+        Collection<CartridgeSubscription> cartridgeSubscriptions = aliasToSubscriptionMap.getCartridgeSubscriptions();
+        for (CartridgeSubscription subscription : cartridgeSubscriptions) {
+            lookupDataHolder.addCartridgeSubscription(subscription.getSubscriber().getTenantId(),
+                    subscription.getAlias(),
+                    subscription);
+        }
+    }
+
+    private void populateLookupDataHolder (ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap) {
 
-        cartridgeSubscriptionUpdateThreadPool.submit(new CartridgeSubscriptionUpdater(cartridgeSubscription,
+        //populate the cache
+        Collection<CartridgeSubscription> cartridgeSubscriptions = clusterIdToSubscriptionMap.getCartridgeSubscriptions();
+        for (CartridgeSubscription subscription : cartridgeSubscriptions) {
+            lookupDataHolder.addCartridgeSubscription(subscription.getSubscriber().getTenantId(),
+                    subscription.getAlias(),
+                    subscription);
+        }
+    }
+
+    public void putCartridgeSubscriptions (SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap) {
+
+        cartridgeSubscriptionUpdateThreadPool.submit(new CartridgeSubscriptionUpdater(aliasToSubscriptionMap,
                 lookupDataHolder, persistenceManager));
     }
 
     private class CartridgeSubscriptionUpdater implements Runnable {
 
-        CartridgeSubscription cartridgeSubscription;
+        SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap;
         LookupDataHolder lookupDataHolder;
         PersistenceManager persistenceManager;
 
-        public CartridgeSubscriptionUpdater (CartridgeSubscription cartridgeSubscription, LookupDataHolder
-                lookupDataHolder, PersistenceManager persistenceManager) {
+        public CartridgeSubscriptionUpdater (SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap,
+                                             LookupDataHolder lookupDataHolder, PersistenceManager persistenceManager) {
 
-            this.cartridgeSubscription = cartridgeSubscription;
+            this.aliasToSubscriptionMap = aliasToSubscriptionMap;
             this.lookupDataHolder = lookupDataHolder;
             this.persistenceManager = persistenceManager;
         }
 
         public void run() {
 
-            if(lookupDataHolder != null) {
+            /*if(lookupDataHolder != null) {
                 lookupDataHolder.addCartridgeSubscription(cartridgeSubscription.getSubscriber().getTenantId(),
                         cartridgeSubscription.getAlias(), cartridgeSubscription);
             }
@@ -150,7 +177,7 @@ public class DataRetrievalManager {
             } catch (PersistenceManagerException e) {
                 String errorMsg = "Error in persisting Cartridge Subscription instance";
                 log.error(errorMsg, e);
-            }
+            }*/
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Deserializer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Deserializer.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Deserializer.java
new file mode 100644
index 0000000..95edaf1
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Deserializer.java
@@ -0,0 +1,52 @@
+/*
+ * 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.adc.mgt.utils;
+
+import java.io.ByteArrayInputStream;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+
+public class Deserializer {
+
+
+    /**
+     * Deserialize a byte array and retrieve the object.
+     * @param bytes bytes to be deserialized
+     * @return the deserialized {@link Object}
+     * @throws Exception if the deserialization is failed.
+     */
+    public static Object deserializeFromByteArray(byte[] bytes) throws Exception {
+
+        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
+        ObjectInput in = null;
+        try {
+            in = new ObjectInputStream(bis);
+            Object o = in.readObject();
+
+            return o;
+
+        } finally {
+            bis.close();
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/aebdb087/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Serializer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Serializer.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Serializer.java
new file mode 100644
index 0000000..b0b0b77
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/utils/Serializer.java
@@ -0,0 +1,83 @@
+/*
+ * 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.adc.mgt.utils;
+
+import org.apache.stratos.adc.mgt.lookup.ClusterIdToCartridgeSubscriptionMap;
+import org.apache.stratos.adc.mgt.lookup.SubscriptionAliasToCartridgeSubscriptionMap;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+
+public class Serializer {
+
+    /**
+     * Serialize a SubscriptionAliasToCartridgeSubscriptionMap to a byte array.
+     * @param aliasToSubscriptionMap
+     * @return byte[]
+     * @throws java.io.IOException
+     */
+    public static byte[] serializeAliasToSubscriptionMapToByteArray (SubscriptionAliasToCartridgeSubscriptionMap aliasToSubscriptionMap)
+            throws IOException {
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectOutput out = null;
+        try {
+            out = new ObjectOutputStream(bos);
+            out.writeObject(aliasToSubscriptionMap);
+
+            return bos.toByteArray();
+
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+            bos.close();
+        }
+
+    }
+
+    /**
+     * Serialize a ClusterIdToCartridgeSubscriptionMap to a byte array.
+     * @param clusterIdToSubscriptionMap
+     * @return byte[]
+     * @throws java.io.IOException
+     */
+    public static byte[] serializeClusterIdToSubscriptionMapToByteArray (ClusterIdToCartridgeSubscriptionMap clusterIdToSubscriptionMap)
+            throws IOException {
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectOutput out = null;
+        try {
+            out = new ObjectOutputStream(bos);
+            out.writeObject(clusterIdToSubscriptionMap);
+
+            return bos.toByteArray();
+
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+            bos.close();
+        }
+
+    }
+}