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/11/22 07:52:11 UTC

[1/2] committing initial changes related to Persistence Manager refactoring

Updated Branches:
  refs/heads/master 4df9f714c -> c658beb2b


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java
index 4ed9bc5..b4f2f7f 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/SingleTenantCartridgeSubscription.java
@@ -52,8 +52,8 @@ public class SingleTenantCartridgeSubscription extends CartridgeSubscription {
             AlreadySubscribedException, RepositoryRequiredException, InvalidRepositoryException, PolicyException {
 
         super.createSubscription(subscriber, alias, autoscalingPolicy, repository);
-        setClusterDomain(alias + "." + getHostName() + "." + getType() + ".domain");
-        setHostName(alias + "." + getHostName());
+        getCluster().setClusterDomain(alias + "." + getCluster().getHostName() + "." + getType() + ".domain");
+        getCluster().setHostName(alias + "." + getCluster().getHostName());
     }
 
     @Override
@@ -61,26 +61,26 @@ public class SingleTenantCartridgeSubscription extends CartridgeSubscription {
             throws ADCException, UnregisteredCartridgeException {
 
         ApplicationManagementUtil.registerService(getType(),
-                getClusterDomain(),
-                getClusterSubDomain(),
+                getCluster().getClusterDomain(),
+                getCluster().getClusterSubDomain(),
                 getPayload().createPayload(),
                 getPayload().getPayloadArg().getTenantRange(),
-                getHostName(),
+                getCluster().getHostName(),
                 null);
 
         getPayload().delete();
 
         return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(),
                 getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
-                getRepository(), getHostName(), getClusterDomain(), getClusterSubDomain(),
-                getMgtClusterDomain(), getMgtClusterSubDomain(), null, "PENDING");
+                getRepository(), getCluster().getHostName(), getCluster().getClusterDomain(), getCluster().getClusterSubDomain(),
+                getCluster().getMgtClusterDomain(), getCluster().getMgtClusterSubDomain(), null, "PENDING");
     }
 
     @Override
     public void removeSubscription() throws ADCException, NotSubscribedException {
 
         try {
-            CloudControllerServiceClient.getServiceClient().terminateAllInstances(getClusterDomain());
+            CloudControllerServiceClient.getServiceClient().terminateAllInstances(getCluster().getClusterDomain());
 
         } catch (AxisFault e) {
             String errorMsg = "Error in terminating cartridge subscription, alias " + getAlias();
@@ -93,20 +93,20 @@ public class SingleTenantCartridgeSubscription extends CartridgeSubscription {
             throw new ADCException(errorMsg, e);
         }
 
-        log.info("Terminated all instances of " + getClusterDomain() + " " + getClusterSubDomain());
+        log.info("Terminated all instances of " + getCluster().getClusterDomain() + " " + getCluster().getClusterSubDomain());
 
         try {
-            CloudControllerServiceClient.getServiceClient().unregisterService(getClusterDomain());
+            CloudControllerServiceClient.getServiceClient().unregisterService(getCluster().getClusterDomain());
 
         } catch (Exception e) {
-            String errorMsg = "Error in unregistering service cluster with domain " + getClusterDomain() +
-                    ", sub domain " + getClusterSubDomain();
+            String errorMsg = "Error in unregistering service cluster with domain " + getCluster().getClusterDomain() +
+                    ", sub domain " + getCluster().getClusterSubDomain();
             log.error(errorMsg);
             throw new ADCException(errorMsg, e);
         }
 
-        log.info("Unregistered service cluster, domain " + getClusterDomain() + ", sub domain " +
-                getClusterSubDomain());
+        log.info("Unregistered service cluster, domain " + getCluster().getClusterDomain() + ", sub domain " +
+                getCluster().getClusterSubDomain());
 
         cleanupSubscription();
     }
@@ -119,11 +119,11 @@ public class SingleTenantCartridgeSubscription extends CartridgeSubscription {
         if(getRepository() != null) {
             payloadArg.setRepoURL(getRepository().getUrl());
         }
-        payloadArg.setHostName(getHostName());
-        payloadArg.setServiceDomain(getClusterDomain());
-        payloadArg.setServiceSubDomain(getMgtClusterSubDomain());
-        payloadArg.setMgtServiceDomain(getMgtClusterDomain());
-        payloadArg.setMgtServiceSubDomain(getMgtClusterSubDomain());
+        payloadArg.setHostName(getCluster().getHostName());
+        payloadArg.setServiceDomain(getCluster().getClusterDomain());
+        payloadArg.setServiceSubDomain(getCluster().getMgtClusterSubDomain());
+        payloadArg.setMgtServiceDomain(getCluster().getMgtClusterDomain());
+        payloadArg.setMgtServiceSubDomain(getCluster().getMgtClusterSubDomain());
         if(getCartridgeInfo().getProvider().equals(CartridgeConstants.PROVIDER_NAME_WSO2)) {
             payloadArg.setTenantRange(Integer.toString(getSubscriber().getTenantId()));
         }


[2/2] git commit: committing initial changes related to Persistence Manager refactoring

Posted by is...@apache.org.
committing initial changes related to Persistence Manager refactoring


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

Branch: refs/heads/master
Commit: c658beb2bd9f3fc70564c57425c68d643dec60f8
Parents: 4df9f71
Author: Isuru <is...@wso2.com>
Authored: Fri Nov 22 12:20:52 2013 +0530
Committer: Isuru <is...@wso2.com>
Committed: Fri Nov 22 12:20:52 2013 +0530

----------------------------------------------------------------------
 .../org/apache/stratos/adc/mgt/dao/Cluster.java |   71 +
 .../stratos/adc/mgt/dao/DataCartridge.java      |   10 +
 .../exception/PersistenceManagerException.java  |   49 +
 .../DatabaseBasedPersistenceManager.java        | 1408 ++++++++++++++++++
 .../adc/mgt/persistence/PersistenceManager.java |   79 +
 .../stratos/adc/mgt/repository/Repository.java  |    9 +
 .../mgt/subscription/CartridgeSubscription.java |   55 +-
 .../subscription/DataCartridgeSubscription.java |   46 +-
 .../MultiTenantCartridgeSubscription.java       |   12 +-
 .../SingleTenantCartridgeSubscription.java      |   38 +-
 10 files changed, 1712 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/Cluster.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/Cluster.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/Cluster.java
new file mode 100644
index 0000000..df926fd
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/Cluster.java
@@ -0,0 +1,71 @@
+package org.apache.stratos.adc.mgt.dao;
+
+public class Cluster {
+
+    private int id;
+    private String clusterDomain;
+    private String clusterSubDomain;
+    private String mgtClusterDomain;
+    private String mgtClusterSubDomain;
+    private String hostName;
+    private String serviceStatus;
+
+    public Cluster() {
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public String getClusterDomain() {
+        return clusterDomain;
+    }
+
+    public void setClusterDomain(String clusterDomain) {
+        this.clusterDomain = clusterDomain;
+    }
+
+    public String getClusterSubDomain() {
+        return clusterSubDomain;
+    }
+
+    public void setClusterSubDomain(String clusterSubDomain) {
+        this.clusterSubDomain = clusterSubDomain;
+    }
+
+    public String getMgtClusterDomain() {
+        return mgtClusterDomain;
+    }
+
+    public void setMgtClusterDomain(String mgtClusterDomain) {
+        this.mgtClusterDomain = mgtClusterDomain;
+    }
+
+    public String getMgtClusterSubDomain() {
+        return mgtClusterSubDomain;
+    }
+
+    public void setMgtClusterSubDomain(String mgtClusterSubDomain) {
+        this.mgtClusterSubDomain = mgtClusterSubDomain;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getServiceStatus() {
+        return serviceStatus;
+    }
+
+    public void setServiceStatus(String serviceStatus) {
+        this.serviceStatus = serviceStatus;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/DataCartridge.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/DataCartridge.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/DataCartridge.java
index 1e1ec11..25ace7a 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/DataCartridge.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/DataCartridge.java
@@ -23,8 +23,10 @@ public class DataCartridge {
 
 	private int id;
 	private String dataCartridgeType;
+    private String host;
 	private String userName;
 	private String password;
+
 	public int getId() {
     	return id;
     }
@@ -49,4 +51,12 @@ public class DataCartridge {
 	public void setPassword(String password) {
     	this.password = password;
     }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/exception/PersistenceManagerException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/exception/PersistenceManagerException.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/exception/PersistenceManagerException.java
new file mode 100644
index 0000000..ccf2f9c
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/exception/PersistenceManagerException.java
@@ -0,0 +1,49 @@
+/*
+ * 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.exception;
+
+public class PersistenceManagerException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    private String message;
+
+    public PersistenceManagerException() {
+        super();
+    }
+
+    public PersistenceManagerException(String message, Throwable cause) {
+        super(message, cause);
+        this.message = message;
+    }
+
+    public PersistenceManagerException(String message) {
+        super(message);
+        this.message = message;
+    }
+
+    public PersistenceManagerException(Throwable cause) {
+        super(cause);
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/DatabaseBasedPersistenceManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/DatabaseBasedPersistenceManager.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/DatabaseBasedPersistenceManager.java
new file mode 100644
index 0000000..eb8ebb0
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/DatabaseBasedPersistenceManager.java
@@ -0,0 +1,1408 @@
+/*
+ * 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.persistence;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.client.CloudControllerServiceClient;
+import org.apache.stratos.adc.mgt.dao.Cluster;
+import org.apache.stratos.adc.mgt.dao.DataCartridge;
+import org.apache.stratos.adc.mgt.dto.Policy;
+import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.exception.PersistenceManagerException;
+import org.apache.stratos.adc.mgt.repository.Repository;
+import org.apache.stratos.adc.mgt.subscriber.Subscriber;
+import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.subscription.DataCartridgeSubscription;
+import org.apache.stratos.adc.mgt.subscription.SingleTenantCartridgeSubscription;
+import org.apache.stratos.adc.mgt.subscription.factory.CartridgeSubscriptionFactory;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.adc.mgt.utils.PolicyHolder;
+import org.apache.stratos.adc.mgt.utils.RepoPasswordMgtUtil;
+import org.apache.stratos.adc.mgt.utils.StratosDBUtils;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+import org.wso2.carbon.context.CarbonContext;
+
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DatabaseBasedPersistenceManager extends PersistenceManager {
+
+    private static final Log log = LogFactory.getLog(DatabaseBasedPersistenceManager.class);
+
+    @Override
+    public void persistCartridgeSubscription(CartridgeSubscription cartridgeSubscription)
+            throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+             connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        int repositoryId = -1;
+        //persist Repository if available
+        if(cartridgeSubscription.getRepository() != null) {
+            repositoryId = persistRepository(connection, cartridgeSubscription.getRepository());
+        }
+
+        int dataCartridgeInfoId = -1;
+        //persist Data Cartridge Subscription specific details if available
+        if(cartridgeSubscription.getCartridgeInfo().getProvider().equals(CartridgeConstants.DATA_CARTRIDGE_PROVIDER) &&
+                cartridgeSubscription instanceof DataCartridgeSubscription) {
+            DataCartridgeSubscription dataCartridgeSubscription = (DataCartridgeSubscription) cartridgeSubscription;
+            dataCartridgeInfoId = persistDataCartridgeInformation(connection, dataCartridgeSubscription.getHost(),
+                    dataCartridgeSubscription.getUsername(), dataCartridgeSubscription.getPassword());
+        }
+
+        PreparedStatement persistSubscriptionStmt = null;
+
+        String insertSubscription = "INSERT INTO SUBSCRIPTION (CARTRIDGE_TYPE,CARTRIDGE_ALIAS,MAPPED_DOMAIN," +
+                "SUBSCRIPTION_STATUS,MULTITENANT,PROVIDER,AUTOSCALING_POLICY,HOSTNAME,DOMAIN,SUBDOMAIN,MGT_DOMAIN," +
+                "MGT_SUBDOMAIN,SERVICE_STATUS,DATA_CARTRIDGE_ID,REPOSITORY_ID)"
+                + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
+
+        try {
+            persistSubscriptionStmt = connection.prepareStatement(insertSubscription);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for persisting Subscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistSubscriptionStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistSubscriptionStmt.setString(1, cartridgeSubscription.getType());
+            persistSubscriptionStmt.setString(2, cartridgeSubscription.getAlias());
+            persistSubscriptionStmt.setString(3, cartridgeSubscription.getMappedDomain());
+            persistSubscriptionStmt.setString(4, cartridgeSubscription.getSubscriptionStatus());
+            persistSubscriptionStmt.setBoolean(5, cartridgeSubscription.getCartridgeInfo().getMultiTenant());
+            persistSubscriptionStmt.setString(6, cartridgeSubscription.getCartridgeInfo().getProvider());
+            persistSubscriptionStmt.setString(7, cartridgeSubscription.getAutoscalingPolicy().getName());
+            persistSubscriptionStmt.setString(8, cartridgeSubscription.getHostName());
+            persistSubscriptionStmt.setString(9, cartridgeSubscription.getClusterDomain());
+            persistSubscriptionStmt.setString(10, cartridgeSubscription.getClusterSubDomain());
+            persistSubscriptionStmt.setString(11, cartridgeSubscription.getMgtClusterDomain());
+            persistSubscriptionStmt.setString(12, cartridgeSubscription.getMgtClusterSubDomain());
+            persistSubscriptionStmt.setString(13, "CLUSTER_CREATED");//TODO: fix properly
+            persistSubscriptionStmt.setInt(14, dataCartridgeInfoId);
+            persistSubscriptionStmt.setInt(15, repositoryId);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for persisting Subscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistSubscriptionStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistSubscriptionStmt.executeUpdate();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for persisting Subscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistSubscriptionStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            connection.commit();
+
+        } catch (SQLException e) {
+            try {
+                connection.rollback();
+
+            } catch (SQLException e1) {
+                log.error("Failed to rollback", e);
+            }
+            String errorMsg = "Failed to commit the changes for persisting Subscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistSubscriptionStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, persistSubscriptionStmt);
+        }
+    }
+
+    private int persistRepository (Connection connection, Repository repository) throws PersistenceManagerException{
+
+        PreparedStatement persistRepoStmt = null;
+        ResultSet resultSet = null;
+        int repoId = -1;
+
+        String insertRepo = "INSERT INTO REPOSITORY (URL,USERNAME,PASSWORD,IS_PRIVATE)"
+                + " VALUES (?,?,?,?)";
+
+        try {
+            persistRepoStmt = connection.prepareStatement(insertRepo, Statement.RETURN_GENERATED_KEYS);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for persisting Repository";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistRepoStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistRepoStmt.setString(1, repository.getUrl());
+            persistRepoStmt.setString(2, repository.getUserName());
+            persistRepoStmt.setString(3, RepoPasswordMgtUtil.encryptPassword(repository.getPassword()));
+            persistRepoStmt.setBoolean(4, repository.isPrivateRepository());
+
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for persisting Repository";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistRepoStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistRepoStmt.executeUpdate();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for persisting Repository";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistRepoStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+        try {
+            resultSet = persistRepoStmt.getGeneratedKeys();
+            if (resultSet.next()) {
+                repoId = resultSet.getInt(1);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to get the generated keys for the Result Set of persisting Repository";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistRepoStmt, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeStatement(persistRepoStmt);
+            StratosDBUtils.closeResultSet(resultSet);
+        }
+
+        return repoId;
+    }
+
+    /*private int persistCluster (Connection connection, Cluster cluster) throws PersistenceManagerException {
+
+        PreparedStatement persistClusterStmt = null;
+        ResultSet resultSet = null;
+        int clusterId = -1;
+
+        String insertCluster = "INSERT INTO CLUSTER (HOSTNAME,DOMAIN,SUBDOMAIN,MGT_DOMAIN,MGT_SUBDOMAIN,SERVICE_STATUS)"
+                + " VALUES (?,?,?,?,?,?,?)";
+
+        try {
+            persistClusterStmt = connection.prepareStatement(insertCluster, Statement.RETURN_GENERATED_KEYS);
+
+        } catch (SQLException e) {
+            StratosDBUtils.closeAllConnections(connection, persistClusterStmt);
+            throw new PersistenceManagerException("Failed create a Prepared Statement for persisting Cluster", e);
+        }
+
+        try {
+            persistClusterStmt.setString(1, cluster.getHostName());
+            persistClusterStmt.setString(2, cluster.getClusterDomain());
+            persistClusterStmt.setString(3, cluster.getClusterSubDomain());
+            persistClusterStmt.setString(4, cluster.getMgtClusterDomain());
+            persistClusterStmt.setString(5, cluster.getMgtClusterSubDomain());
+            persistClusterStmt.setString(6, "CREATED");//TODO:refactor
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for persisting Cluster";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistClusterStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistClusterStmt.executeUpdate();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for persisting Cluster";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistClusterStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+        try {
+            resultSet = persistClusterStmt.getGeneratedKeys();
+            if (resultSet.next()) {
+                clusterId = resultSet.getInt(1);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to get the generated keys for the Result Set of persisting Repository";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistClusterStmt, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeStatement(persistClusterStmt);
+            StratosDBUtils.closeResultSet(resultSet);
+        }
+
+        return clusterId;
+    } */
+
+    private int persistDataCartridgeInformation (Connection connection, String host, String adminUserName,
+                                                 String adminPassword) throws PersistenceManagerException {
+
+        PreparedStatement persistDataCartridgeInformationStmt = null;
+        ResultSet resultSet = null;
+        int dataCartridgeInfoId = -1;
+
+        String insertDataCartridgeInfo = "INSERT INTO DATA_CARTRIDGE (HOST,ADMIN_USERNAME,ADMIN_PASSWORD)"
+                + " VALUES (?,?,?)";
+
+        try {
+            persistDataCartridgeInformationStmt = connection.prepareStatement(insertDataCartridgeInfo,
+                    Statement.RETURN_GENERATED_KEYS);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for persisting Data Cartridge Information";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistDataCartridgeInformationStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistDataCartridgeInformationStmt.setString(1, host);
+            persistDataCartridgeInformationStmt.setString(2, adminUserName);
+            persistDataCartridgeInformationStmt.setString(3, RepoPasswordMgtUtil.encryptPassword(adminPassword));
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for persisting Data Cartridge Information";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistDataCartridgeInformationStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistDataCartridgeInformationStmt.executeUpdate();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for persisting Data Cartridge Information";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistDataCartridgeInformationStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+        try {
+            resultSet = persistDataCartridgeInformationStmt.getGeneratedKeys();
+            if (resultSet.next()) {
+                dataCartridgeInfoId = resultSet.getInt(1);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to get the generated keys for the Result Set of persisting Data Cartridge " +
+                    "Information";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistDataCartridgeInformationStmt, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeStatement(persistDataCartridgeInformationStmt);
+            StratosDBUtils.closeResultSet(resultSet);
+        }
+
+        return dataCartridgeInfoId;
+    }
+
+    /*private int persistSubscriber (Connection connection, Subscriber subscriber) throws PersistenceManagerException {
+
+        PreparedStatement persistSubscriberStmt = null;
+
+        String insertSubscriber = "INSERT INTO TENANT (TENANT_ID,USERNAME,PASSWORD) VALUES (?,?,?)";
+
+        try {
+            persistSubscriberStmt = connection.prepareStatement(insertSubscriber);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for persisting Subscriber";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistSubscriberStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistSubscriberStmt.setInt(1, subscriber.getTenantId());
+            persistSubscriberStmt.setString(2, subscriber.getAdminUserName());
+            persistSubscriberStmt.setString(3, subscriber.getTenantDomain());
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for persisting Subscriber";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistSubscriberStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            persistSubscriberStmt.executeUpdate();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for persisting Subscriber";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, persistSubscriberStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeStatement(persistSubscriberStmt);
+        }
+
+        return subscriber.getTenantId();
+    }*/
+
+    @Override
+    public void removeCartridgeSubscription(int tenantId, String alias) throws PersistenceManagerException {
+        //TODO
+    }
+
+    @Override
+    public CartridgeSubscription getCartridgeSubscription(int tenantId, String alias) throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT * FROM SUBSCRIPTION S " +
+                "WHERE S.CARTRIDGE_ALIAS=? AND S.TENANT_ID=? AND S.STATE != 'UNSUBSCRIBED' " +
+                "inner join REPOSITORY R on S.REPOSITORY_ID=R.REPOSITORY_ID " +
+                "inner join DATA_CARTRIDGE D on S.DATA_CARTRIDGE_ID=D.DATA_CARTRIDGE_ID ";
+
+        PreparedStatement getSubscriptionStatement = null;
+        try {
+            getSubscriptionStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retreiving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            getSubscriptionStatement.setString(1, alias);
+            getSubscriptionStatement.setInt(2, tenantId);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = getSubscriptionStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        CartridgeSubscription cartridgeSubscription = null;
+        try {
+            while (resultSet.next()) {
+                cartridgeSubscription = populateCartridgeSubscription(resultSet);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionStatement, resultSet);
+        }
+
+        return cartridgeSubscription;
+    }
+
+    private CartridgeSubscription populateCartridgeSubscription (ResultSet resultSet)
+            throws PersistenceManagerException, SQLException {
+
+        String cartridgeType = resultSet.getString("CARTRIDGE_TYPE");
+
+        CartridgeInfo cartridgeInfo = null;
+        try {
+            cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(cartridgeType);
+
+        } catch (Exception e) {
+            //Cannot happen, but can continue
+            String message = "Error getting Cartridge Definition for " + cartridgeType;
+            log.error(message, e);
+        }
+
+        //If an error occurred while getting the CartridgeInfo instance, create an instance with a minimal data set
+        if(cartridgeInfo == null) {
+            cartridgeInfo = new CartridgeInfo();
+            cartridgeInfo.setMultiTenant(resultSet.getBoolean("MULTITENANT"));
+            cartridgeInfo.setProvider(resultSet.getString("PROVIDER"));
+        }
+
+        CartridgeSubscription cartridgeSubscription = null;
+        try {
+            cartridgeSubscription = CartridgeSubscriptionFactory.getCartridgeSubscriptionInstance(cartridgeInfo);
+
+        } catch (ADCException e) {
+            throw new PersistenceManagerException(e);
+        }
+
+        Policy autoScalingPolicy = PolicyHolder.getInstance().getPolicy(resultSet.getString("AUTOSCALING_POLICY"));
+        if(autoScalingPolicy == null) {
+            //get the default AutoScaling policy
+            autoScalingPolicy = PolicyHolder.getInstance().getDefaultPolicy();
+        }
+
+        //populate data
+        cartridgeSubscription.setSubscriptionId(resultSet.getInt("SUBSCRIPTION_ID"));
+        cartridgeSubscription.setType(cartridgeType);
+        cartridgeSubscription.setAlias(resultSet.getString("CARTRIDGE_ALIAS"));
+        cartridgeSubscription.setMappedDomain(resultSet.getString("MAPPED_DOMAIN"));
+        cartridgeSubscription.setSubscriptionStatus(resultSet.getString("SUBSCRIPTION_STATUS"));
+        cartridgeSubscription.setAutoscalingPolicy(autoScalingPolicy);
+
+        //Repository related data
+        if (resultSet.getInt("REPOSITORY_ID") != -1) {
+            Repository repository = new Repository();
+            repository.setId(resultSet.getInt("REPOSITORY_ID"));
+            repository.setUrl(resultSet.getString("URL"));
+            repository.setUserName(resultSet.getString("USERNAME"));
+            repository.setPassword(RepoPasswordMgtUtil.decryptPassword(resultSet.getString("PASSWORD")));
+            repository.setPrivateRepository(resultSet.getBoolean("IS_PRIVATE"));
+            cartridgeSubscription.setRepository(repository);
+        }
+
+        //Cluster related data
+        Cluster cluster = new Cluster();
+        cluster.setId(resultSet.getInt("CLUSTER_ID"));
+        cluster.setHostName(resultSet.getString("HOSTNAME"));
+        cluster.setClusterDomain(resultSet.getString("DOMAIN"));
+        cluster.setClusterSubDomain(resultSet.getString("SUBDOMAIN"));
+        cluster.setMgtClusterDomain(resultSet.getString("MGT_DOMAIN"));
+        cluster.setMgtClusterSubDomain(resultSet.getString("MGT_SUBDOMAIN"));
+        cluster.setServiceStatus(resultSet.getString("SERVICE_STATUS"));
+        cartridgeSubscription.setCluster(cluster);
+
+        //data cartridge specific information
+        if (resultSet.getInt("DATA_CARTRIDGE_ID") != -1 && cartridgeSubscription instanceof
+                SingleTenantCartridgeSubscription) {
+            DataCartridgeSubscription dataCartridgeSubscription = (DataCartridgeSubscription)cartridgeSubscription;
+            dataCartridgeSubscription.setHost(resultSet.getString("HOST"));
+            dataCartridgeSubscription.setUsername(resultSet.getString("ADMIN_USERNAME"));
+            dataCartridgeSubscription.setPassword(RepoPasswordMgtUtil.decryptPassword(resultSet.
+                    getString("ADMIN_PASSWORD")));
+        }
+
+        //Subscriber related data
+        CarbonContext carbonContext = CarbonContext.getThreadLocalCarbonContext();
+        Subscriber subscriber = new Subscriber(carbonContext.getUsername(), carbonContext.getTenantId(),
+                carbonContext.getTenantDomain());
+        cartridgeSubscription.setSubscriber(subscriber);
+
+        return cartridgeSubscription;
+    }
+
+    @Override
+    public List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId) throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT * FROM SUBSCRIPTION S " +
+                "WHERE S.TENANT_ID=? AND S.STATE != 'UNSUBSCRIBED' " +
+                "inner join REPOSITORY R on S.REPOSITORY_ID=R.REPOSITORY_ID " +
+                "inner join DATA_CARTRIDGE D on S.DATA_CARTRIDGE_ID=D.DATA_CARTRIDGE_ID ";
+
+        PreparedStatement getSubscriptionsStatement = null;
+        try {
+            getSubscriptionsStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retreiving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            getSubscriptionsStatement.setInt(1, tenantId);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = getSubscriptionsStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        List<CartridgeSubscription> cartridgeSubscriptions = new ArrayList<CartridgeSubscription>();
+        try {
+            while(resultSet.next()) {
+                CartridgeSubscription cartridgeSubscription = populateCartridgeSubscription(resultSet);
+                cartridgeSubscriptions.add(cartridgeSubscription);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement, resultSet);
+        }
+
+        return cartridgeSubscriptions;
+    }
+
+    @Override
+    public List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId, String cartridgeType)
+            throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT * FROM SUBSCRIPTION S " +
+                "WHERE S.CARTRIDGE_TYPE=? AND S.TENANT_ID=? AND S.STATE != 'UNSUBSCRIBED' " +
+                "inner join REPOSITORY R on S.REPOSITORY_ID=R.REPOSITORY_ID " +
+                "inner join DATA_CARTRIDGE D on S.DATA_CARTRIDGE_ID=D.DATA_CARTRIDGE_ID ";
+
+        PreparedStatement getSubscriptionsStatement = null;
+        try {
+            getSubscriptionsStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            getSubscriptionsStatement.setString(1, cartridgeType);
+            getSubscriptionsStatement.setInt(2, tenantId);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = getSubscriptionsStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        List<CartridgeSubscription> cartridgeSubscriptions = new ArrayList<CartridgeSubscription>();
+        try {
+            while(resultSet.next()) {
+                CartridgeSubscription cartridgeSubscription = populateCartridgeSubscription(resultSet);
+                cartridgeSubscriptions.add(cartridgeSubscription);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, getSubscriptionsStatement, resultSet);
+        }
+
+        return cartridgeSubscriptions;
+    }
+
+    @Override
+    public Repository getRepository(int tenantId, String alias) throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT * FROM SUBSCRIPTION S " +
+                "WHERE S.TENANT_ID=? AND S.CARTRIDGE_ALIAS=? AND S.STATE != 'UNSUBSCRIBED' " +
+                "inner join REPOSITORY R on S.REPOSITORY_ID=R.REPOSITORY_ID ";
+
+        PreparedStatement getRepositoryStatement = null;
+        try {
+            getRepositoryStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retreiving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            getRepositoryStatement.setInt(1, tenantId);
+            getRepositoryStatement.setString(2, alias);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = getRepositoryStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        Repository repository = null;
+        try {
+            while(resultSet.next()) {
+                repository = populateRepository(resultSet);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement, resultSet);
+        }
+
+        return repository;
+    }
+
+    private Repository populateRepository (ResultSet resultSet) throws SQLException {
+
+        if(resultSet.getInt("REPOSITORY_ID") == -1) {
+            return null;
+        }
+
+        Repository repository = new Repository();
+        repository.setId(resultSet.getInt("REPOSITORY_ID"));
+        repository.setUrl(resultSet.getString("URL"));
+        repository.setUserName(resultSet.getString("USERNAME"));
+        repository.setPassword(RepoPasswordMgtUtil.decryptPassword(resultSet.getString("PASSWORD")));
+        repository.setPrivateRepository(resultSet.getBoolean("IS_PRIVATE"));
+
+        return repository;
+    }
+
+    @Override
+    public Repository getRepository(String clusterDomain) throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT * FROM SUBSCRIPTION S " +
+                "WHERE S.DOMAIN=? AND S.STATE != 'UNSUBSCRIBED' " +
+                "inner join REPOSITORY R on S.REPOSITORY_ID=R.REPOSITORY_ID ";
+
+        PreparedStatement getRepositoryStatement = null;
+        try {
+            getRepositoryStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retreiving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            getRepositoryStatement.setString(1, clusterDomain);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = getRepositoryStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        Repository repository = null;
+        try {
+            while(resultSet.next()) {
+                repository = populateRepository(resultSet);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, getRepositoryStatement, resultSet);
+        }
+
+        return repository;
+    }
+
+    @Override
+    public DataCartridge getDataCartridgeSubscriptionInfo(int tenantId, String alias)
+            throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT * FROM SUBSCRIPTION S " +
+                "WHERE S.CARTRIDGE_ALIAS=? AND S.TENANT_ID=? AND S.STATE != 'UNSUBSCRIBED' " +
+                "inner join DATA_CARTRIDGE D on S.DATA_CARTRIDGE_ID=D.DATA_CARTRIDGE_ID ";
+
+        PreparedStatement getDataCartridgeSubscriptionInfoStatement = null;
+        try {
+            getDataCartridgeSubscriptionInfoStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retreiving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getDataCartridgeSubscriptionInfoStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            getDataCartridgeSubscriptionInfoStatement.setString(1, alias);
+            getDataCartridgeSubscriptionInfoStatement.setInt(2, tenantId);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getDataCartridgeSubscriptionInfoStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = getDataCartridgeSubscriptionInfoStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getDataCartridgeSubscriptionInfoStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        DataCartridge dataCartridge = null;
+        try {
+            while (resultSet.next()) {
+                dataCartridge = populateDataCartridgeInfo(resultSet);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getDataCartridgeSubscriptionInfoStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, getDataCartridgeSubscriptionInfoStatement, resultSet);
+        }
+
+        return dataCartridge;
+    }
+
+    private DataCartridge populateDataCartridgeInfo (ResultSet resultSet) throws SQLException {
+
+        if(resultSet.getInt("DATA_CARTRIDGE_ID") == -1) {
+            return null;
+        }
+
+        DataCartridge dataCartridge = new DataCartridge();
+        dataCartridge.setId(resultSet.getInt("DATA_CARTRIDGE_ID"));
+        dataCartridge.setDataCartridgeType(resultSet.getString("CARTRIDGE_TYPE"));
+        dataCartridge.setHost(resultSet.getString("HOST"));
+        dataCartridge.setUserName(resultSet.getString("ADMIN_USERNAME"));
+        dataCartridge.setPassword(resultSet.getString("ADMIN_PASSWORD"));
+
+        return dataCartridge;
+    }
+
+    @Override
+    public boolean isAliasTaken(int tenantId, String alias) throws PersistenceManagerException {
+
+        boolean isAliasTaken = false;
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT * FROM SUBSCRIPTION S " +
+                "WHERE S.CARTRIDGE_ALIAS=? AND S.TENANT_ID=? AND S.STATE != 'UNSUBSCRIBED'";
+
+        PreparedStatement isAliasTakenStatement = null;
+        try {
+            isAliasTakenStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retreiving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, isAliasTakenStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            isAliasTakenStatement.setString(1, alias);
+            isAliasTakenStatement.setInt(2, tenantId);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, isAliasTakenStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = isAliasTakenStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, isAliasTakenStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            if(resultSet.next()) {
+                log.info("Alias " + alias + " has been already used for tenant " + tenantId);
+                isAliasTaken = true;
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, isAliasTakenStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, isAliasTakenStatement, resultSet);
+        }
+
+        return isAliasTaken;
+    }
+
+    @Override
+    public boolean hasSubscribed(int tenantId, String cartridgeType) throws PersistenceManagerException {
+
+        boolean hasSubscribed = false;
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT * FROM SUBSCRIPTION S " +
+                "WHERE S.CARTRIDGE_TYPE=? AND S.TENANT_ID=? AND S.STATE != 'UNSUBSCRIBED'";
+
+        PreparedStatement hasSubscribedStatement = null;
+        try {
+            hasSubscribedStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, hasSubscribedStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            hasSubscribedStatement.setString(1, cartridgeType);
+            hasSubscribedStatement.setInt(2, tenantId);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, hasSubscribedStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = hasSubscribedStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, hasSubscribedStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            if(resultSet.next()) {
+                log.info("Tenant " + tenantId + " has already subscribed for the Cartridge Type " + cartridgeType);
+                hasSubscribed = true;
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, hasSubscribedStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, hasSubscribedStatement, resultSet);
+        }
+
+        return hasSubscribed;
+    }
+
+    @Override
+    public void updateDomianMapping(int tenantId, String cartridgeAlias, String newDomain)
+            throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        PreparedStatement updateDomainMappingStmt = null;
+
+        String insertDataCartridgeInfo = "UPDATE CARTRIDGE_SUBSCRIPTION SET MAPPED_DOMAIN = ? " +
+                "WHERE TENANT_ID = ? AND ALIAS = ?";
+
+        try {
+            updateDomainMappingStmt = connection.prepareStatement(insertDataCartridgeInfo);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateDomainMappingStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            updateDomainMappingStmt.setString(1, newDomain);
+            updateDomainMappingStmt.setInt(2, tenantId);
+            updateDomainMappingStmt.setString(3, cartridgeAlias);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateDomainMappingStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            updateDomainMappingStmt.executeUpdate();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateDomainMappingStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, updateDomainMappingStmt);
+        }
+    }
+
+    @Override
+    public String getMappedDomain(int tenantId, String cartridgeAlias) throws PersistenceManagerException {
+
+        String mappedDomain = null;
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT MAPPED_DOMAIN FROM SUBSCRIPTION S " +
+                "WHERE S.TENANT_ID=? AND S.CARTRIDGE_ALIAS=? AND S.STATE != 'UNSUBSCRIBED'";
+
+        PreparedStatement getMappedDomainStatement = null;
+        try {
+            getMappedDomainStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getMappedDomainStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            getMappedDomainStatement.setInt(1, tenantId);
+            getMappedDomainStatement.setString(2, cartridgeAlias);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getMappedDomainStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = getMappedDomainStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getMappedDomainStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            if(resultSet.next()) {
+                mappedDomain = resultSet.getString("MAPPED_DOMAIN");
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getMappedDomainStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, getMappedDomainStatement, resultSet);
+        }
+
+        return mappedDomain;
+    }
+
+    @Override
+    public Cluster getCluster(int tenantId, String cartridgeAlias) throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        String sqlQuery = "SELECT HOSTNAME,DOMAIN,SUBDOMAIN,MGT_DOMAIN,MGT_SUBDOMAIN,SERVICE_STATUS FROM SUBSCRIPTION S " +
+                "WHERE S.CARTRIDGE_ALIAS=? AND S.TENANT_ID=? AND S.STATE != 'UNSUBSCRIBED'";
+
+        PreparedStatement getClusterStatement = null;
+        try {
+            getClusterStatement = connection.prepareStatement(sqlQuery);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for retreiving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getClusterStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            getClusterStatement.setString(1, cartridgeAlias);
+            getClusterStatement.setInt(2, tenantId);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getClusterStatement);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        ResultSet resultSet = null;
+
+        try {
+            resultSet = getClusterStatement.executeQuery();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for retrieving CartridgeSubscription";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getClusterStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        Cluster cluster = null;
+        try {
+            if(resultSet.next()) {
+                cluster = populateCluster(resultSet);
+            }
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to populate CartridgeSubscription instance";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, getClusterStatement, resultSet);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, getClusterStatement, resultSet);
+        }
+
+        return cluster;
+    }
+
+    @Override
+    public void updateSubscriptionStatus(int tenantId, String cartridgeAlias, String newStatus)
+            throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        PreparedStatement updateSubscriptionStatusStmt = null;
+
+        String insertDataCartridgeInfo = "UPDATE CARTRIDGE_SUBSCRIPTION SET SUBSCRIPTION_STATUS = ? " +
+                "WHERE TENANT_ID = ? AND ALIAS = ?";
+
+        try {
+            updateSubscriptionStatusStmt = connection.prepareStatement(insertDataCartridgeInfo);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateSubscriptionStatusStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            updateSubscriptionStatusStmt.setString(1, newStatus);
+            updateSubscriptionStatusStmt.setInt(2, tenantId);
+            updateSubscriptionStatusStmt.setString(3, cartridgeAlias);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateSubscriptionStatusStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            updateSubscriptionStatusStmt.executeUpdate();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateSubscriptionStatusStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, updateSubscriptionStatusStmt);
+        }
+
+    }
+
+    @Override
+    public void updateServiceStatus(int tenantId, String cartridgeAlias, String newStatus)
+            throws PersistenceManagerException {
+
+        Connection connection = null;
+        try {
+            connection = StratosDBUtils.getConnection();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to obtain a DB connection";
+            log.error(errorMsg);
+            StratosDBUtils.closeConnection(connection);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        PreparedStatement updateServiceStatusStmt = null;
+
+        String insertDataCartridgeInfo = "UPDATE CARTRIDGE_SUBSCRIPTION SET SUBSCRIPTION_STATUS = ? " +
+                "WHERE TENANT_ID = ? AND ALIAS = ?";
+
+        try {
+            updateServiceStatusStmt = connection.prepareStatement(insertDataCartridgeInfo);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed create a Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateServiceStatusStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            updateServiceStatusStmt.setString(1, newStatus);
+            updateServiceStatusStmt.setInt(2, tenantId);
+            updateServiceStatusStmt.setString(3, cartridgeAlias);
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to add data to Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateServiceStatusStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+        }
+
+        try {
+            updateServiceStatusStmt.executeUpdate();
+
+        } catch (SQLException e) {
+            String errorMsg = "Failed to execute the Prepared Statement for updating Domain Mapping";
+            log.error(errorMsg);
+            StratosDBUtils.closeAllConnections(connection, updateServiceStatusStmt);
+            throw new PersistenceManagerException(errorMsg, e);
+
+        } finally {
+            StratosDBUtils.closeAllConnections(connection, updateServiceStatusStmt);
+        }
+    }
+
+    private Cluster populateCluster (ResultSet resultSet) throws SQLException {
+
+        Cluster cluster = new Cluster();
+        cluster.setHostName(resultSet.getString("HOSTNAME"));
+        cluster.setClusterDomain(resultSet.getString("DOMAIN"));
+        cluster.setClusterSubDomain(resultSet.getString("SUBDOMAIN"));
+        cluster.setMgtClusterDomain(resultSet.getString("MGT_DOMAIN"));
+        cluster.setMgtClusterSubDomain(resultSet.getString("MGT_SUBDOMAIN"));
+        cluster.setServiceStatus(resultSet.getString("SERVICE_STATUS"));
+
+        return cluster;
+    }
+
+    @Override
+    public void removeDomainMapping(int tenantId, String cartridgeAlias)
+            throws PersistenceManagerException {
+
+        updateDomianMapping(tenantId, cartridgeAlias, null);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/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
new file mode 100644
index 0000000..c28f265
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/persistence/PersistenceManager.java
@@ -0,0 +1,79 @@
+/*
+ * 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.persistence;
+
+import org.apache.stratos.adc.mgt.dao.Cluster;
+import org.apache.stratos.adc.mgt.dao.DataCartridge;
+import org.apache.stratos.adc.mgt.exception.PersistenceManagerException;
+import org.apache.stratos.adc.mgt.repository.Repository;
+import org.apache.stratos.adc.mgt.subscription.CartridgeSubscription;
+
+import java.util.List;
+
+public abstract class PersistenceManager {
+
+    public abstract void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription)
+            throws PersistenceManagerException;
+
+    public abstract void removeCartridgeSubscription (int tenantId, String alias)
+            throws PersistenceManagerException;
+
+    public abstract CartridgeSubscription getCartridgeSubscription(int tenantId, String alias)
+            throws PersistenceManagerException;
+
+    public abstract List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId)
+            throws PersistenceManagerException;
+
+    public abstract List<CartridgeSubscription> getCartridgeSubscriptions(int tenantId, String cartridgeType)
+            throws PersistenceManagerException;
+
+    public abstract Repository getRepository (int tenantId, String alias)
+            throws PersistenceManagerException;
+
+    public abstract Repository getRepository (String clusterDomain)
+            throws PersistenceManagerException;
+
+    public abstract DataCartridge getDataCartridgeSubscriptionInfo (int tenantId, String alias)
+            throws PersistenceManagerException;
+
+    public abstract boolean isAliasTaken (int tenantId, String alias)
+            throws PersistenceManagerException;
+
+    public abstract boolean hasSubscribed (int tenantId, String cartridgeType)
+            throws PersistenceManagerException;
+
+    public abstract void removeDomainMapping (int tenantId, String cartridgeAlias)
+            throws PersistenceManagerException;
+
+    public abstract void updateDomianMapping (int tenantId, String cartridgeAlias, String newDomain)
+            throws PersistenceManagerException;
+
+    public abstract String getMappedDomain (int tenantId, String cartridgeAlias)
+            throws PersistenceManagerException;
+
+    public abstract Cluster getCluster (int tenantId, String cartridgeAlias)
+            throws PersistenceManagerException;
+
+    public abstract void updateSubscriptionStatus (int tenantId, String cartridgeAlias, String newStatus)
+            throws PersistenceManagerException;
+
+    public abstract void updateServiceStatus (int tenantId, String cartridgeAlias, String newStatus)
+            throws PersistenceManagerException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java
index 43b6bb5..dbd532e 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/repository/Repository.java
@@ -21,6 +21,7 @@ package org.apache.stratos.adc.mgt.repository;
 
 public class Repository {
 
+    private int id;
     private String url;
     private String userName;
     private String password;
@@ -57,4 +58,12 @@ public class Repository {
     public void setPrivateRepository(boolean privateRepository) {
         isPrivateRepository = privateRepository;
     }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java
index afd3791..d1994ff 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/CartridgeSubscription.java
@@ -23,6 +23,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.adc.mgt.custom.domain.RegistryManager;
 import org.apache.stratos.adc.mgt.dao.CartridgeSubscriptionInfo;
+import org.apache.stratos.adc.mgt.dao.Cluster;
 import org.apache.stratos.adc.mgt.dns.DNSManager;
 import org.apache.stratos.adc.mgt.dto.Policy;
 import org.apache.stratos.adc.mgt.exception.*;
@@ -43,20 +44,15 @@ import java.util.Properties;
 public abstract class CartridgeSubscription {
 
     private static Log log = LogFactory.getLog(CartridgeSubscription.class);
-
     private int subscriptionId;
     private String type;
     private String alias;
-    private String clusterDomain;
-    private String clusterSubDomain;
-    private String mgtClusterDomain;
-    private String mgtClusterSubDomain;
-    private String hostName;
     private Policy autoscalingPolicy;
     private Subscriber subscriber;
     private Repository repository;
     private CartridgeInfo cartridgeInfo;
     private Payload payload;
+    private Cluster cluster;
     private String subscriptionStatus;
     private String mappedDomain;
     private List<String> connectedSubscriptionAliases;
@@ -70,11 +66,12 @@ public abstract class CartridgeSubscription {
 
         this.setCartridgeInfo(cartridgeInfo);
         this.setType(cartridgeInfo.getType());
-        this.setClusterDomain("");
-        this.setClusterSubDomain(CartridgeConstants.DEFAULT_SUBDOMAIN);
-        this.setMgtClusterDomain("");
-        this.setMgtClusterSubDomain(CartridgeConstants.DEFAULT_MGT_SUBDOMAIN);
-        this.setHostName(cartridgeInfo.getHostName());
+        this.setCluster(new Cluster());
+        getCluster().setClusterDomain("");
+        getCluster().setClusterSubDomain(CartridgeConstants.DEFAULT_SUBDOMAIN);
+        getCluster().setMgtClusterDomain("");
+        getCluster().setMgtClusterSubDomain(CartridgeConstants.DEFAULT_MGT_SUBDOMAIN);
+        getCluster().setHostName(cartridgeInfo.getHostName());
         this.setSubscriptionStatus(CartridgeConstants.SUBSCRIBED);
         this.connectedSubscriptionAliases = new ArrayList<String>();
     }
@@ -266,10 +263,10 @@ public abstract class CartridgeSubscription {
         }
 
         //TODO: FIXME: do we need this?
-        new DNSManager().removeSubDomain(hostName);
+        new DNSManager().removeSubDomain(getCluster().getHostName());
 
         try {
-            new RegistryManager().removeDomainMappingFromRegistry(hostName);
+            new RegistryManager().removeDomainMappingFromRegistry(getCluster().getHostName());
 
         } catch (Exception e) {
             String errorMsg = "Error in removing domain mapping, alias " + alias + ", tenant " +
@@ -278,9 +275,9 @@ public abstract class CartridgeSubscription {
         }
 
         TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
-        String[] ips = topologyMgtService.getActiveIPs(type, clusterDomain, clusterSubDomain);
+        String[] ips = topologyMgtService.getActiveIPs(type, getCluster().getClusterDomain(), getCluster().getClusterSubDomain());
         try {
-            PersistenceManager.updateInstanceState("INACTIVE", ips, clusterDomain, clusterSubDomain, type);
+            PersistenceManager.updateInstanceState("INACTIVE", ips, getCluster().getClusterDomain(), getCluster().getClusterSubDomain(), type);
 
         } catch (Exception e) {
             String errorMsg = "Error in updating state to INACTIVE";
@@ -315,7 +312,7 @@ public abstract class CartridgeSubscription {
     }
 
     public String getHostName() {
-        return hostName;
+        return getCluster().getHostName();
     }
 
     public void setType(String type) {
@@ -327,39 +324,39 @@ public abstract class CartridgeSubscription {
     }
 
     public String getClusterDomain() {
-        return clusterDomain;
+        return getCluster().getClusterDomain();
     }
 
     public void setClusterDomain(String clusterDomain) {
-        this.clusterDomain = clusterDomain;
+        getCluster().setClusterDomain(clusterDomain);
     }
 
     public String getClusterSubDomain() {
-        return clusterSubDomain;
+        return getCluster().getClusterSubDomain();
     }
 
     public void setClusterSubDomain(String clusterSubDomain) {
-        this.clusterSubDomain = clusterSubDomain;
+        getCluster().setClusterSubDomain(clusterSubDomain);
     }
 
     public String getMgtClusterDomain() {
-        return mgtClusterDomain;
+        return getCluster().getMgtClusterDomain();
     }
 
     public void setMgtClusterDomain(String mgtClusterDomain) {
-        this.mgtClusterDomain = mgtClusterDomain;
+        getCluster().setMgtClusterDomain(mgtClusterDomain);
     }
 
     public String getMgtClusterSubDomain() {
-        return mgtClusterSubDomain;
+        return getCluster().getMgtClusterSubDomain();
     }
 
     public void setMgtClusterSubDomain(String mgtClusterSubDomain) {
-        this.mgtClusterSubDomain = mgtClusterSubDomain;
+        getCluster().setMgtClusterSubDomain(mgtClusterSubDomain);
     }
 
     public void setHostName(String hostName) {
-        this.hostName = hostName;
+        getCluster().setHostName(hostName);
     }
 
     public Policy getAutoscalingPolicy() {
@@ -413,4 +410,12 @@ public abstract class CartridgeSubscription {
     public void setSubscriptionStatus(String subscriptionStatus) {
         this.subscriptionStatus = subscriptionStatus;
     }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public void setCluster(Cluster cluster) {
+        this.cluster = cluster;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
index fcc7700..c905044 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/DataCartridgeSubscription.java
@@ -34,16 +34,16 @@ import java.util.Properties;
 
 public class DataCartridgeSubscription extends SingleTenantCartridgeSubscription {
 
-    protected String host;
-    protected String username;
-    protected String password;
+    private String host;
+    private String username;
+    private String password;
 
     public DataCartridgeSubscription(CartridgeInfo cartridgeInfo) {
 
         super(cartridgeInfo);
-        this.host = "localhost";
-        this.username = CartridgeConstants.MYSQL_DEFAULT_USER;
-        this.password = ApplicationManagementUtil.generatePassword();
+        this.setHost("localhost");
+        this.setUsername(CartridgeConstants.MYSQL_DEFAULT_USER);
+        this.setPassword(ApplicationManagementUtil.generatePassword());
     }
 
     @Override
@@ -69,8 +69,8 @@ public class DataCartridgeSubscription extends SingleTenantCartridgeSubscription
 
         PayloadArg payloadArg = super.createPayloadParameters();
         payloadArg.setDataCartridgeHost(this.getHost());
-        payloadArg.setDataCartridgeAdminUser(username);
-        payloadArg.setDataCartridgeAdminPassword(password);
+        payloadArg.setDataCartridgeAdminUser(getUsername());
+        payloadArg.setDataCartridgeAdminPassword(getPassword());
 
         return payloadArg;
     }
@@ -79,25 +79,25 @@ public class DataCartridgeSubscription extends SingleTenantCartridgeSubscription
             throws ADCException, UnregisteredCartridgeException {
 
         ApplicationManagementUtil.registerService(getType(),
-                getClusterDomain(),
-                getClusterSubDomain(),
+                getCluster().getClusterDomain(),
+                getCluster().getClusterSubDomain(),
                 getPayload().createPayload(),
                 getPayload().getPayloadArg().getTenantRange(),
-                getHostName(),
+                getCluster().getHostName(),
                 ApplicationManagementUtil.setRegisterServiceProperties(getAutoscalingPolicy(),
                         getSubscriber().getTenantId(), getAlias()));
 
         getPayload().delete();
 
         DataCartridge dataCartridge = new DataCartridge();
-        dataCartridge.setUserName(username);
-        dataCartridge.setPassword(password);
+        dataCartridge.setUserName(getUsername());
+        dataCartridge.setPassword(getPassword());
         dataCartridge.setDataCartridgeType(getType());
 
         return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(),
                 getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
-                getRepository(), getHostName(), getClusterDomain(), getClusterSubDomain(),
-                getMgtClusterDomain(), getMgtClusterSubDomain(), dataCartridge, "PENDING");
+                getRepository(), getCluster().getHostName(), getCluster().getClusterDomain(), getCluster().getClusterSubDomain(),
+                getCluster().getMgtClusterDomain(), getCluster().getMgtClusterSubDomain(), dataCartridge, "PENDING");
     }
 
     public String getHost() {
@@ -107,4 +107,20 @@ public class DataCartridgeSubscription extends SingleTenantCartridgeSubscription
     public void setHost(String host) {
         this.host = host;
     }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c658beb2/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java
index 4e7796d..a9a1a6c 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/subscription/MultiTenantCartridgeSubscription.java
@@ -92,11 +92,11 @@ public class MultiTenantCartridgeSubscription extends CartridgeSubscription {
 
             for (DomainContext domainContext : domainContexts) {
                 if (domainContext.getSubDomain().equalsIgnoreCase("mgt")) {
-                    setMgtClusterDomain(domainContext.getDomain());
-                    setMgtClusterSubDomain(domainContext.getSubDomain());
+                    getCluster().setMgtClusterDomain(domainContext.getDomain());
+                    getCluster().setMgtClusterSubDomain(domainContext.getSubDomain());
                 } else {
-                    setClusterDomain(domainContext.getDomain());
-                    setClusterSubDomain(domainContext.getSubDomain());
+                    getCluster().setClusterDomain(domainContext.getDomain());
+                    getCluster().setClusterSubDomain(domainContext.getSubDomain());
                 }
             }
         } else {
@@ -121,8 +121,8 @@ public class MultiTenantCartridgeSubscription extends CartridgeSubscription {
 
         return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(),
                 getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
-                getRepository(), getHostName(), getClusterDomain(), getClusterSubDomain(),
-                getMgtClusterDomain(), getMgtClusterSubDomain(), null, "PENDING");
+                getRepository(), getCluster().getHostName(), getCluster().getClusterDomain(), getCluster().getClusterSubDomain(),
+                getCluster().getMgtClusterDomain(), getCluster().getMgtClusterSubDomain(), null, "PENDING");
     }
 
     @Override