You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2014/01/08 06:51:40 UTC

[29/46] renaming package adc.mgt to manager

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/ApplicationManagementService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/ApplicationManagementService.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/ApplicationManagementService.java
new file mode 100644
index 0000000..df0cdb6
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/ApplicationManagementService.java
@@ -0,0 +1,679 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
+ * KIND, either express or implied.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.service;
+
+import org.apache.axis2.AxisFault;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.manager.client.CloudControllerServiceClient;
+import org.apache.stratos.manager.dao.CartridgeSubscriptionInfo;
+import org.apache.stratos.manager.dto.*;
+import org.apache.stratos.manager.exception.*;
+import org.apache.stratos.manager.subscription.CartridgeSubscription;
+import org.apache.stratos.manager.internal.DataHolder;
+import org.apache.stratos.manager.manager.CartridgeSubscriptionManager;
+import org.apache.stratos.manager.subscription.utils.CartridgeSubscriptionUtils;
+import org.apache.stratos.manager.utils.ApplicationManagementUtil;
+import org.apache.stratos.manager.utils.CartridgeConstants;
+import org.apache.stratos.manager.utils.PersistenceManager;
+import org.apache.stratos.manager.utils.PolicyHolder;
+import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+import org.wso2.carbon.core.AbstractAdmin;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.wso2.carbon.utils.DataPaginator;
+import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ *
+ *
+ *
+ */
+public class ApplicationManagementService extends AbstractAdmin {
+
+    private static final Log log = LogFactory.getLog(ApplicationManagementService.class);
+    //private RegistryManager registryManager = new RegistryManager();
+    private CartridgeSubscriptionManager cartridgeSubsciptionManager = new CartridgeSubscriptionManager();
+
+    /*
+     * Instantiate RepoNotificationService. Since this service is in the same 
+     * component (org.apache.stratos.manager), a new object is created.
+     * TODO: Is there a better way to get this service?
+     */
+    private RepoNotificationService repoNotificationService = new RepoNotificationService();
+
+	/**
+	 * Get Available Cartridges
+	 * 
+	 * @return Available Cartridges
+	 */
+	public Cartridge[] getAvailableCartridges(boolean multiTenant) throws ADCException {
+		List<Cartridge> cartridges = getAvailableCartridges(null, multiTenant);
+		// Following is very important when working with axis2
+		return cartridges.isEmpty() ? new Cartridge[0] : cartridges.toArray(new Cartridge[cartridges.size()]);
+	}
+
+	/**
+	 * Get Subscribed Cartridges
+	 * 
+	 * @return Subscribed Cartridges
+	 */
+	public Cartridge[] getSubscribedCartridges() throws ADCException {
+		checkSuperTenant();
+		List<Cartridge> cartridgeList = getSubscribedCartridges(null);
+		// Following is very important when working with axis2
+		return cartridgeList.isEmpty() ? new Cartridge[0] : cartridgeList.toArray(new Cartridge[cartridgeList.size()]);
+	}
+
+	/**
+	 * Get available cartridges
+	 */
+	public CartridgeWrapper getPagedAvailableCartridges(String cartridgeSearchString, int pageNumber, boolean multiTenant)
+			throws ADCException {
+		checkSuperTenant();
+		CartridgeWrapper cartridgeWrapper = new CartridgeWrapper();
+		List<Cartridge> cartridges = getAvailableCartridges(cartridgeSearchString, multiTenant);
+    	
+		// TODO Improve pagination
+		if (!cartridges.isEmpty()) {
+			// Paginate only if cartridges are there.
+			DataPaginator.doPaging(pageNumber, cartridges, cartridgeWrapper);
+		} else {
+			// Must set this value as axis2 stub client will return an array
+			// with length = 1 and null element if cartridges[] is null
+			cartridgeWrapper.set(cartridges);
+		}
+		return cartridgeWrapper;
+	}
+
+	private List<Cartridge> getAvailableCartridges(String cartridgeSearchString, Boolean multiTenant) throws ADCException {
+		List<Cartridge> cartridges = new ArrayList<Cartridge>();
+		
+		if (log.isDebugEnabled()) {
+			log.debug("Getting available cartridges. Search String: " + cartridgeSearchString + ", Multi-Tenant: " + multiTenant);
+		}
+		
+		boolean allowMultipleSubscription = new Boolean(
+				System.getProperty(CartridgeConstants.FEATURE_MULTI_TENANT_MULTIPLE_SUBSCRIPTION_ENABLED));
+
+		try {
+			Pattern searchPattern = getSearchStringPattern(cartridgeSearchString);
+
+			String[] availableCartridges = CloudControllerServiceClient.getServiceClient().getRegisteredCartridges();
+
+			if (availableCartridges != null) {
+				for (String cartridgeType : availableCartridges) {
+					CartridgeInfo cartridgeInfo = null;
+					try {
+						cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(cartridgeType);
+					} catch (Exception e) {
+						if (log.isWarnEnabled()) {
+							log.warn("Error when calling getCartridgeInfo for " + cartridgeType + ", Error: "
+									+ e.getMessage());
+						}
+					}
+					if (cartridgeInfo == null) {
+						// This cannot happen. But continue
+						if (log.isDebugEnabled()) {
+							log.debug("Cartridge Info not found: " + cartridgeType);
+						}
+						continue;
+					}
+					
+					if (multiTenant != null && !multiTenant && cartridgeInfo.getMultiTenant()) {
+						// Need only Single-Tenant cartridges
+						continue;
+					} else if (multiTenant != null && multiTenant && !cartridgeInfo.getMultiTenant()) {
+						// Need only Multi-Tenant cartridges
+						continue;
+					}
+					
+					if (!cartridgeMatches(cartridgeInfo, searchPattern)) {
+						continue;
+					}
+					
+					Cartridge cartridge = new Cartridge();
+					cartridge.setCartridgeType(cartridgeType);
+					cartridge.setProvider(cartridgeInfo.getProvider());
+					cartridge.setDisplayName(cartridgeInfo.getDisplayName());
+					cartridge.setDescription(cartridgeInfo.getDescription());
+					cartridge.setVersion(cartridgeInfo.getVersion());
+					cartridge.setMultiTenant(cartridgeInfo.getMultiTenant());
+					//cartridge.setStatus(CartridgeConstants.NOT_SUBSCRIBED);
+					cartridge.setCartridgeAlias("-");
+					//cartridge.setActiveInstances(0);
+					cartridges.add(cartridge);
+					
+					if (cartridgeInfo.getMultiTenant() && !allowMultipleSubscription) {
+						// If the cartridge is multi-tenant. We should not let users
+						// createSubscription twice.
+						if (PersistenceManager.isAlreadySubscribed(cartridgeType,
+								ApplicationManagementUtil.getTenantId(getConfigContext()))) {
+							if (log.isDebugEnabled()) {
+								log.debug("Already subscribed to " + cartridgeType
+										+ ". This multi-tenant cartridge will not be available to createSubscription");
+							}
+							//cartridge.setStatus(CartridgeConstants.SUBSCRIBED);
+						}
+					}
+				}
+			} else {
+				if (log.isDebugEnabled()) {
+					log.debug("There are no available cartridges");
+				}
+			}
+		} catch (Exception e) {
+			String msg = "Error when getting available cartridges. " + e.getMessage();
+			log.error(msg, e);
+			throw new ADCException("An error occurred getting available cartridges ", e);
+		}
+
+		Collections.sort(cartridges);
+
+		if (log.isDebugEnabled()) {
+			log.debug("Returning available cartridges " + cartridges.size());
+		}
+
+		return cartridges;
+	}
+
+	/**
+	 * Get subscribed cartridges
+	 */
+	public CartridgeWrapper getPagedSubscribedCartridges(String cartridgeSearchString, int pageNumber)
+			throws ADCException {
+		checkSuperTenant();
+		CartridgeWrapper cartridgeWrapper = new CartridgeWrapper();
+		List<Cartridge> cartridges = getSubscribedCartridges(cartridgeSearchString);
+
+		// TODO Improve pagination
+		if (!cartridges.isEmpty()) {
+			// Paginate only if cartridges are there.
+			DataPaginator.doPaging(pageNumber, cartridges, cartridgeWrapper);
+		} else {
+			cartridgeWrapper.set(cartridges);
+		}
+		return cartridgeWrapper;
+	}
+
+	private List<Cartridge> getSubscribedCartridges(String cartridgeSearchString) throws ADCException {
+		List<Cartridge> cartridges = new ArrayList<Cartridge>();
+		
+		if (log.isDebugEnabled()) {
+			log.debug("Getting subscribed cartridges. Search String: " + cartridgeSearchString);
+		}
+
+		try {
+			Pattern searchPattern = getSearchStringPattern(cartridgeSearchString);
+
+			List<CartridgeSubscriptionInfo> subscriptionList = PersistenceManager
+					.retrieveSubscribedCartridges(ApplicationManagementUtil.getTenantId(getConfigContext()));
+
+			if (subscriptionList != null && !subscriptionList.isEmpty()) {
+				for (CartridgeSubscriptionInfo subscription : subscriptionList) {
+					CartridgeInfo cartridgeInfo = null;
+					try {
+						cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(
+								subscription.getCartridge());
+					} catch (Exception e) {
+						if (log.isWarnEnabled()) {
+							log.warn("Error when calling getCartridgeInfo for " + subscription.getCartridge()
+									+ ", Error: " + e.getMessage());
+						}
+					}
+					if (cartridgeInfo == null) {
+						// This cannot happen. But continue
+						if (log.isDebugEnabled()) {
+							log.debug("Cartridge Info not found: " + subscription.getCartridge());
+						}
+						continue;
+					}
+					if (!cartridgeMatches(cartridgeInfo, subscription, searchPattern)) {
+						continue;
+					}
+					TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+					String[] ips = topologyMgtService.getActiveIPs(subscription.getCartridge(),
+							subscription.getClusterDomain(), subscription.getClusterSubdomain());
+					Cartridge cartridge = ApplicationManagementUtil.populateCartridgeInfo(cartridgeInfo, subscription, ips, getTenantDomain());
+					cartridges.add(cartridge);
+				}
+			} else {
+				if (log.isDebugEnabled()) {
+					log.debug("There are no subscribed cartridges");
+				}
+			}
+		} catch (Exception e) {
+			String msg = "Error when getting subscribed cartridges. " + e.getMessage();
+			log.error(msg, e);
+			throw new ADCException("An Error occurred when getting subscribed cartridges.", e);
+		}
+
+		Collections.sort(cartridges);
+
+		if (log.isDebugEnabled()) {
+			log.debug("Returning subscribed cartridges " + cartridges.size());
+		}
+
+		return cartridges;
+	}
+
+    private Pattern getSearchStringPattern(String searchString) {
+        if (log.isDebugEnabled()) {
+            log.debug("Creating search pattern for " + searchString);
+        }
+        if (searchString != null) {
+            // Copied from org.wso2.carbon.webapp.mgt.WebappAdmin.doesWebappSatisfySearchString(WebApplication, String)
+            String regex = searchString.toLowerCase().replace("..?", ".?").replace("..*", ".*").replaceAll("\\?", ".?")
+                    .replaceAll("\\*", ".*?");
+            if (log.isDebugEnabled()) {
+                log.debug("Created regex: " + regex + " for search string " + searchString);
+            }
+
+            Pattern pattern = Pattern.compile(regex);
+            return pattern;
+        }
+        return null;
+    }
+
+    // TODO: Improve search method
+    private boolean cartridgeMatches(CartridgeInfo cartridgeInfo, Pattern pattern) {
+        if (pattern != null) {
+            boolean matches = false;
+            if (cartridgeInfo.getDisplayName() != null) {
+                matches = pattern.matcher(cartridgeInfo.getDisplayName().toLowerCase()).find();
+            }
+            if (!matches && cartridgeInfo.getDescription() != null) {
+                matches = pattern.matcher(cartridgeInfo.getDescription().toLowerCase()).find();
+            }
+            return matches;
+        }
+        return true;
+    }
+
+    private boolean cartridgeMatches(CartridgeInfo cartridgeInfo, CartridgeSubscriptionInfo cartridgeSubscriptionInfo, Pattern pattern) {
+        if (pattern != null) {
+            boolean matches = false;
+            if (cartridgeInfo.getDisplayName() != null) {
+                matches = pattern.matcher(cartridgeInfo.getDisplayName().toLowerCase()).find();
+            }
+            if (!matches && cartridgeInfo.getDescription() != null) {
+                matches = pattern.matcher(cartridgeInfo.getDescription().toLowerCase()).find();
+            }
+            if (!matches && cartridgeSubscriptionInfo.getCartridge() != null) {
+                matches = pattern.matcher(cartridgeSubscriptionInfo.getCartridge().toLowerCase()).find();
+            }
+            if (!matches && cartridgeSubscriptionInfo.getAlias() != null) {
+                matches = pattern.matcher(cartridgeSubscriptionInfo.getAlias().toLowerCase()).find();
+            }
+            return matches;
+        }
+        return true;
+    }
+    
+    public Cartridge getCartridgeInfo(String alias) throws ADCException, NotSubscribedException {
+    	checkSuperTenant();
+    	return ApplicationManagementUtil.getCartridgeInfo(alias, getTenantDomain());
+    }
+
+    public String[] getSubscribedCartridgeAliases() throws AxisFault {
+        try {
+            List<CartridgeSubscriptionInfo> subscriptionList = PersistenceManager
+                    .retrieveSubscribedCartridges(ApplicationManagementUtil.getTenantId(getConfigContext()));
+            List<String> subscribedAliases = new ArrayList<String>();
+            for (CartridgeSubscriptionInfo cartridgeSubscriptionInfo : subscriptionList) {
+
+                if(cartridgeSubscriptionInfo.getProvider().equalsIgnoreCase(CartridgeConstants.PROVIDER_NAME_WSO2) &&
+                        getCartridgeInfo(cartridgeSubscriptionInfo.getAlias()).isMultiTenant()) {
+
+                    subscribedAliases.add(cartridgeSubscriptionInfo.getCartridge());
+                } else {
+                    subscribedAliases.add(cartridgeSubscriptionInfo.getAlias());
+                }
+            }
+            if(subscribedAliases.size() == 0) {
+                return new String[]{""};
+            } else {
+                return subscribedAliases.toArray(new String[subscribedAliases.size()]);
+            }
+
+        } catch (Exception e) {
+            String msg = "Exception in getting subscribed cartridge aliases :" + e.getMessage();
+            log.error(msg, e);
+            throw new AxisFault("An error occurred while getting subscribed cartridge aliases", e);
+        }
+    }
+    
+	public PolicyDefinition[] getPolicyDefinitions() {
+		List<PolicyDefinition> policyDefinitions = PolicyHolder.getInstance().getPolicyDefinitions();
+		return policyDefinitions == null || policyDefinitions.isEmpty() ? new PolicyDefinition[0] : policyDefinitions
+				.toArray(new PolicyDefinition[policyDefinitions.size()]);
+	}
+
+	/**
+	 * Subscribe to a cartridge
+	 */
+	public SubscriptionInfo subscribe(String cartridgeType, String alias, String policy, String repoURL,
+			boolean privateRepo, String repoUsername, String repoPassword, String dataCartridgeType,
+			String dataCartridgeAlias) throws ADCException, PolicyException, UnregisteredCartridgeException,
+            InvalidCartridgeAliasException, DuplicateCartridgeAliasException, RepositoryRequiredException,
+            AlreadySubscribedException, RepositoryCredentialsRequiredException, InvalidRepositoryException,
+            RepositoryTransportException {
+
+		checkSuperTenant();
+
+		//return ApplicationManagementUtil.doSubscribe(cartridgeType, alias, policy, repoURL, privateRepo, repoUsername,
+		//		repoPassword, dataCartridgeType, dataCartridgeAlias, getUsername(),
+		//		ApplicationManagementUtil.getTenantId(getConfigContext()), getTenantDomain());
+
+        CartridgeSubscription cartridgeSubscription = cartridgeSubsciptionManager.subscribeToCartridge(cartridgeType,
+                alias.trim(), "economyPolicy", "economy-deployment", getTenantDomain(), ApplicationManagementUtil.getTenantId(configurationContext),
+                getUsername(), "git", repoURL, privateRepo, repoUsername, repoPassword);
+
+        if(dataCartridgeAlias != null && !dataCartridgeAlias.trim().isEmpty()) {
+
+            /*dataCartridgeAlias = dataCartridgeAlias.trim();
+
+            CartridgeSubscription connectingCartridgeSubscription = null;
+            try {
+                connectingCartridgeSubscription = cartridgeSubsciptionManager.getCartridgeSubscription(getTenantDomain(),
+                        dataCartridgeAlias);
+            } catch (NotSubscribedException e) {
+                log.error(e.getMessage(), e);
+            }
+            if (connectingCartridgeSubscription != null) {
+                // Publish tenant subscribed event
+                CartridgeSubscriptionUtils.publishTenantSubscribedEvent(getTenantId(), connectingCartridgeSubscription.getCartridgeInfo().getType());
+
+                try {
+                    cartridgeSubsciptionManager.connectCartridges(getTenantDomain(), cartridgeSubscription,
+                            connectingCartridgeSubscription.getAlias());
+
+                } catch (NotSubscribedException e) {
+                    log.error(e.getMessage(), e);
+
+                } catch (AxisFault axisFault) {
+                    log.error(axisFault.getMessage(), axisFault);
+                }
+            } else {
+                log.error("Failed to connect. No cartridge subscription found for tenant " +
+                        ApplicationManagementUtil.getTenantId(configurationContext) + " with alias " + alias);
+            } */
+        }
+
+        return cartridgeSubsciptionManager.registerCartridgeSubscription(cartridgeSubscription);
+
+	}
+
+    /**
+     * Unsubscribing the cartridge
+     *
+     * @param alias name of the cartridge to be unsubscribed
+     */
+    public void unsubscribe(String alias) throws ADCException, NotSubscribedException {
+
+        checkSuperTenant();
+
+        // Find subscription of alias
+        CartridgeSubscriptionInfo subscription;
+        String errorMessage = String.format("Tenant %s is not subscribed for %s", getTenantDomain(), alias);
+        try {
+            subscription = PersistenceManager.getSubscription(getTenantDomain(), alias);
+            if(subscription == null) {
+                throw new ADCException(errorMessage);
+            }
+        } catch (Exception e) {
+            throw new ADCException(errorMessage);
+        }
+
+        // Un-subscribe from cartridge
+        cartridgeSubsciptionManager.unsubscribeFromCartridge(getTenantDomain(), alias);
+
+        // Publish tenant un-subscribed event
+        String serviceName = subscription.getCartridge();
+        CartridgeSubscriptionUtils.publishTenantUnSubscribedEvent(getTenantId(), serviceName);
+
+
+        /*CartridgeSubscriptionInfo subscription = null;
+        
+        try {
+			subscription = PersistenceManager.getSubscription(getTenantDomain(), alias);
+		} catch (Exception e) {
+			String msg = "Failed to get subscription for " + getTenantDomain() + " and alias " + alias;
+            log.error(msg, e);
+			throw new ADCException(msg, e);
+		}
+
+        if (subscription == null) {
+            String msg = "Tenant " + getTenantDomain() + " is not subscribed for " + alias;
+            log.error(msg);
+            throw new NotSubscribedException("You have not subscribed for " + alias, alias);
+        }
+        
+        try {
+            String clusterDomain = subscription.getClusterDomain();
+            String clusterSubDomain = subscription.getClusterSubdomain();
+
+            if (log.isDebugEnabled()) {
+                log.debug("Finding cartridge information for " + subscription.getCartridge());
+            }
+            CartridgeInfo cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(subscription.getCartridge());
+            if (log.isDebugEnabled()) {
+                log.debug("Found " + cartridgeInfo.getDisplayName() + " for " + subscription.getCartridge());
+            }
+            if (!cartridgeInfo.getMultiTenant()) {
+                log.info("Terminating all instances of " + clusterDomain + " " + clusterSubDomain);
+                CloudControllerServiceClient.getServiceClient().terminateAllInstances(clusterDomain, clusterSubDomain);
+                log.info("All instances terminated.");
+                log.info("Unregistering services...");
+                CloudControllerServiceClient.getServiceClient().unregisterService(clusterDomain, clusterSubDomain);
+                log.info("Successfully terminated instances ..");
+            } else {
+                if (log.isInfoEnabled()) {
+                    log.info("Cartridge "
+                            + subscription.getCartridge()
+                            + " is a multi-tenant cartridge and therefore will not terminate all instances and unregister services");
+                }
+            }
+
+            new RepositoryFactory().destroyRepository(alias, getTenantDomain(), getUsername());
+            log.info("Repo is destroyed successfully.. ");
+
+            PersistenceManager.updateSubscriptionState(subscription.getSubscriptionId(), "UNSUBSCRIBED");
+            new DNSManager().removeSubDomain(subscription.getHostName());
+            registryManager.removeDomainMappingFromRegistry(subscription.getHostName());
+            TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+			
+            String[] ips = topologyMgtService.getActiveIPs(subscription.getCartridge(),
+					subscription.getClusterDomain(), subscription.getClusterSubdomain());
+            PersistenceManager.updateInstanceState("INACTIVE", ips, subscription.getClusterDomain(), subscription.getClusterSubdomain(), subscription.getCartridge());
+
+        } catch (ADCException e) {
+        	log.error(e.getMessage(), e);
+        	throw e;
+        } catch (Exception e1) {
+            String msg1 = "Exception occurred :" + e1.getMessage();
+            log.error(msg1);
+            throw new ADCException("Unsubscribe failed for cartridge " + alias, e1);
+        }*/
+    }
+
+
+    public String addDomainMapping(String mappedDomain, String cartridgeAlias) throws ADCException, DomainMappingExistsException, NotSubscribedException {
+    	checkSuperTenant();
+    	// TODO Following was in CLI. Fix this
+		//		if (domain.indexOf('.') == -1) {
+		//			System.out.println("\nOwn domain should include a '.' ");
+		//		}
+
+        CartridgeSubscriptionInfo subscription = null;
+        String actualHost = null;
+        
+        try {
+			subscription = PersistenceManager.getSubscription(getTenantDomain(), cartridgeAlias);
+		} catch (Exception e) {
+			String msg = "Failed to get subscription for " + getTenantDomain() + " and alias " + cartridgeAlias;
+            log.error(msg, e);
+			throw new ADCException(msg, e);
+		}
+        if (subscription == null) {
+        	String msg = "Tenant " + getTenantDomain() + " is not subscribed for " + cartridgeAlias;
+            log.error(msg);
+            throw new NotSubscribedException("You have not subscribed for " + cartridgeAlias, cartridgeAlias);
+        }
+
+        try {
+        	actualHost = getActualHost(cartridgeAlias);
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //registryManager.addDomainMappingToRegistry(mappedDomain, actualHost);
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            log.info("Domain mapping is added for " + mappedDomain + " tenant: " + getTenantDomain());
+            PersistenceManager.updateDomainMapping(
+                    ApplicationManagementUtil.getTenantId(getConfigContext()), cartridgeAlias, mappedDomain);
+        } catch (RegistryException e) {
+            String msg = "Unable to add the mapping due to registry transaction error";
+            log.error(msg, e);
+            throw new ADCException("Unable to add the mapping due to internal error!", e);
+        } catch (DomainMappingExistsException e) {
+            String msg = "Domain mapping already exists.";
+            log.error(msg, e);
+            throw e;
+        } catch (Exception e) {
+            String msg = "Error occurred. Reason : " + e.getMessage();
+            log.error(msg, e);
+            throw new ADCException(msg, e);
+        }
+        return actualHost;
+    }
+
+	private String getActualHost(String cartridgeName) throws Exception {
+		return PersistenceManager.getHostNameForCartridgeName(
+				ApplicationManagementUtil.getTenantId(getConfigContext()), cartridgeName);
+	}
+
+    public void removeDomainMapping(String cartridgeAlias) throws ADCException, NotSubscribedException {
+    	checkSuperTenant();
+        CartridgeSubscriptionInfo subscription = null;
+        String actualHost = null;
+        
+        try {
+			subscription = PersistenceManager.getSubscription(getTenantDomain(), cartridgeAlias);
+		} catch (Exception e) {
+			String msg = "Failed to get subscription for " + getTenantDomain() + " and alias " + cartridgeAlias;
+            log.error(msg, e);
+			throw new ADCException(msg, e);
+		}
+        if (subscription == null) {
+        	String msg = "Tenant " + getTenantDomain() + " is not subscribed for " + cartridgeAlias;
+            log.error(msg);
+            throw new NotSubscribedException("You have not subscribed for " + cartridgeAlias, cartridgeAlias);
+        }
+        
+        try {
+        	actualHost = getActualHost(cartridgeAlias);
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            //registryManager.removeDomainMappingFromRegistry(actualHost);
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+            log.info("Domain mapping is removed for " + actualHost + " tenant: " + getTenantDomain());
+            PersistenceManager.updateDomainMapping(ApplicationManagementUtil.getTenantId(getConfigContext()),
+                    cartridgeAlias, null);
+        } catch (RegistryException e) {
+            String msg = "Unable to remove the mapping due to registry transaction error";
+            log.error(msg, e);
+            throw new ADCException("Unable to remove the mapping due to internal error!", e);
+        } catch (Exception e) {
+            String msg = "Error occurred. Reason : " + e.getMessage();
+            log.error(msg, e);
+            throw new ADCException(msg, e);
+        }
+    }
+
+	public void synchronizeRepository(String cartridgeAlias) throws ADCException, NotSubscribedException {
+		checkSuperTenant();
+        CartridgeSubscriptionInfo subscription = null;
+        
+        // Validating subscription
+        try {
+			subscription = PersistenceManager.getSubscription(getTenantDomain(), cartridgeAlias);
+		} catch (Exception e) {
+			String msg = "Failed to get subscription for " + getTenantDomain() + " and alias " + cartridgeAlias;
+            log.error(msg, e);
+			throw new ADCException(msg, e);
+		}
+        if (subscription == null) {
+        	String msg = "Tenant " + getTenantDomain() + " is not subscribed for " + cartridgeAlias;
+            log.error(msg);
+            throw new NotSubscribedException("You have not subscribed for " + cartridgeAlias, cartridgeAlias);
+        }
+		
+		try {
+			repoNotificationService.notifyRepoUpdate(getTenantDomain(), cartridgeAlias);
+		} catch (Exception e) {
+			throw new ADCException(e.getMessage() != null ? e.getMessage() : "Failed to synchronize repository", e);
+		}
+	}
+
+	public String getTenantDomain() {
+        PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        return carbonContext.getTenantDomain();
+	}
+
+    public int getTenantId() {
+        PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        return carbonContext.getTenantId();
+    }
+    
+	/**
+	 * Allow to check whether features are enabled in the back-end
+	 * 
+	 * @param key
+	 *            The propery key
+	 * @return {@code true} if feature is enabled
+	 */
+	public boolean isFeatureEnabled(String key) {
+		if (key != null && key.startsWith("feature.")) {
+			return new Boolean(System.getProperty(key));
+		}
+		return false;
+	}
+
+	
+	public RepositoryInformation testRepositoryConnection(String repoURL, String repoUsername, String repoPassword, boolean privateRepo)
+			throws RepositoryRequiredException, ADCException, RepositoryCredentialsRequiredException,
+			InvalidRepositoryException, RepositoryTransportException {
+		return ApplicationManagementUtil.validateRepository(repoURL, repoUsername, repoPassword, privateRepo, true);
+	}
+	
+	// TODO Remove following when we support cartridge subscription for Super-tenant
+	private void checkSuperTenant() throws ADCException {
+		if (log.isDebugEnabled()) {
+			log.debug("Checking whether super tenant accesses the service methods. Tenant ID: "
+					+ ApplicationManagementUtil.getTenantId(getConfigContext()) + ", Tenant Domain: " + getTenantDomain());
+		}
+		if (MultitenantConstants.SUPER_TENANT_ID == ApplicationManagementUtil.getTenantId(getConfigContext())) {
+			throw new ADCException("Super Tenant is not allowed to complete requested operation");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/InstanceInformationManagementService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/InstanceInformationManagementService.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/InstanceInformationManagementService.java
new file mode 100644
index 0000000..93bf70c
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/InstanceInformationManagementService.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
+ * KIND, either express or implied.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.manager.utils.PersistenceManager;
+
+public class InstanceInformationManagementService {
+
+	
+    private static final Log log = LogFactory.getLog(InstanceInformationManagementService.class);
+
+    /**
+    * Everytime an subscription is started up, this operation is invoked
+    *            (by the AgentService)
+    * @param instanceIp
+    * @param tenantId
+    * @param clusterDomain
+    * @param clusterSubDomain
+    * @param cartridge
+    * @param state
+    *
+    */
+    public void updateInstanceState(String instanceIp,
+                                  int tenantId,
+                                  String clusterDomain,
+                                  String clusterSubDomain,
+                                  String cartridge,
+                                  String state) {
+
+      log.info("Message receieved in Instance Info Service.." + instanceIp + tenantId + clusterDomain + clusterSubDomain
+               + cartridge + state);
+
+      try {
+        PersistenceManager.persistCartridgeInstanceInfo(instanceIp, clusterDomain, clusterSubDomain, cartridge, state);
+    } catch (Exception e) {
+       log.error("Exception is occurred in updating subscription state. Reason, " + e.getMessage());
+    }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/RepoNotificationService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/RepoNotificationService.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/RepoNotificationService.java
new file mode 100644
index 0000000..28a627c
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/RepoNotificationService.java
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
+ * KIND, either express or implied.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.service;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.axis2.clustering.ClusteringAgent;
+import org.apache.axis2.clustering.ClusteringFault;
+import org.apache.axis2.clustering.management.GroupManagementAgent;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.manager.dao.CartridgeSubscriptionInfo;
+import org.apache.stratos.manager.internal.DataHolder;
+import org.apache.stratos.manager.publisher.ArtifactUpdatePublisher;
+import org.apache.stratos.manager.utils.CartridgeConstants;
+import org.apache.stratos.manager.utils.PersistenceManager;
+import org.wso2.carbon.core.deployment.SynchronizeGitRepositoryRequest;
+
+
+public class RepoNotificationService {
+
+	private static final Log log = LogFactory.getLog(RepoNotificationService.class);
+	
+
+	public void notifyRepoUpdate(String tenantDomain, String cartridgeAlias) throws Exception {
+		// FIXME Throwing generic Exception is wrong
+		log.info("Updating repository of tenant : " + tenantDomain + " , cartridge: " +
+				cartridgeAlias);
+
+		CartridgeSubscriptionInfo subscription = null;
+		try {
+			subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
+		} catch (Exception e) {
+			String msg = "Failed to find subscription for " + cartridgeAlias + ". "
+					+ (e.getMessage() != null ? e.getMessage() : "");
+			log.error(msg, e);
+			throw new Exception(msg, e);
+		}
+		
+		if (subscription == null) {
+			String msg = "Tenant " + tenantDomain + " is not subscribed for " + cartridgeAlias;
+			log.error(msg);
+			throw new Exception("You have not subscribed for " + cartridgeAlias);
+		}
+		
+		try {
+			handleRepoSynch(subscription);
+		} catch (Exception e) {
+			String msg = "Failed to synchronize the repository for " + cartridgeAlias + ". "
+					+ (e.getMessage() != null ? e.getMessage() : "");
+			log.error(msg, e);
+			throw new Exception(msg, e);
+		}
+		
+	}
+
+	public void synchronize(String repositoryURL) throws Exception {
+
+		log.info(" repository URL received : " + repositoryURL);
+		List<CartridgeSubscriptionInfo> subscription = PersistenceManager.getSubscription(repositoryURL);
+		for (CartridgeSubscriptionInfo cartridgeSubscriptionInfo : subscription) {
+			handleRepoSynch(cartridgeSubscriptionInfo);
+        }
+	}
+
+	private void handleRepoSynch(CartridgeSubscriptionInfo subscription) throws Exception {
+		if (subscription == null) {
+			throw new Exception("Cannot synchronize repository. subscription is null");
+		}
+
+		if (CartridgeConstants.PROVIDER_NAME_WSO2.equals(subscription.getProvider())) {
+			createAndSendClusterMessage(subscription.getTenantId(), subscription.getTenantDomain(),
+			                            UUID.randomUUID(), subscription.getClusterDomain(),
+			                            subscription.getClusterSubdomain());
+			
+		} else {						
+			new ArtifactUpdatePublisher(subscription.getRepository(),
+					subscription.getClusterDomain(),
+					String.valueOf(subscription.getTenantId())).publish();;
+		}
+	}
+
+	private void createAndSendClusterMessage(int tenantId, String tenantDomain, UUID uuid,
+	                                         String clusterDomain, String clusterSubdomain) {
+
+		SynchronizeGitRepositoryRequest request =
+		                                          new SynchronizeGitRepositoryRequest(tenantId,
+		                                                                              tenantDomain,
+		                                                                              uuid);
+
+		ClusteringAgent clusteringAgent =
+		                                  DataHolder.getServerConfigContext()
+		                                            .getAxisConfiguration().getClusteringAgent();
+		GroupManagementAgent groupMgtAgent =
+		                                     clusteringAgent.getGroupManagementAgent(clusterDomain,
+		                                                                             clusterSubdomain);
+
+		try {
+			log.info("Sending Request to.. " + clusterDomain + " : " + clusterSubdomain);
+			groupMgtAgent.send(request);
+			
+		} catch (ClusteringFault e) {
+			e.printStackTrace();
+		}
+		 
+
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/RepositoryInfoBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/RepositoryInfoBean.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/RepositoryInfoBean.java
new file mode 100644
index 0000000..3ee4d83
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/service/RepositoryInfoBean.java
@@ -0,0 +1,98 @@
+/**
+ * 
+ */
+package org.apache.stratos.manager.service;
+/*
+ *
+ * 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.
+ *
+*/
+
+
+import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+
+/**
+ *
+ */
+public class RepositoryInfoBean {
+
+	private String repoURL;
+	private String cartridgeAlias;
+	private String tenantDomain;
+	private String userName;
+	private String password;
+	private String[] dirArray;
+	private CartridgeInfo cartridgeInfo;	
+	
+	
+	public RepositoryInfoBean(String repoURL, String cartridgeAlias, String tenantDomain,
+                              String userName, String password, String[] dirArray, CartridgeInfo cartridgeInfo) {
+	    this.repoURL = repoURL;
+	    this.cartridgeAlias = cartridgeAlias;
+	    this.tenantDomain = tenantDomain;
+	    this.userName = userName;
+	    this.setPassword(password);
+	    this.dirArray = dirArray;
+	    this.cartridgeInfo = cartridgeInfo;
+    }
+	public String getRepoURL() {
+    	return repoURL;
+    }
+	public void setRepoURL(String repoURL) {
+    	this.repoURL = repoURL;
+    }
+	public String getCartridgeAlias() {
+    	return cartridgeAlias;
+    }
+	public void setCartridgeAlias(String cartridgeAlias) {
+    	this.cartridgeAlias = cartridgeAlias;
+    }
+	public String getTenantDomain() {
+    	return tenantDomain;
+    }
+	public void setTenantDomain(String tenantDomain) {
+    	this.tenantDomain = tenantDomain;
+    }
+	public String getUserName() {
+    	return userName;
+    }
+	public void setUserName(String userName) {
+    	this.userName = userName;
+    }
+	public String[] getDirArray() {
+    	return dirArray;
+    }
+	public void setDirArray(String[] dirArray) {
+    	this.dirArray = dirArray;
+    }
+	public CartridgeInfo getCartridgeInfo() {
+    	return cartridgeInfo;
+    }
+	public void setCartridgeInfo(CartridgeInfo cartridgeInfo) {
+    	this.cartridgeInfo = cartridgeInfo;
+    }
+    public String getPassword() {
+        return password;
+    }
+    public void setPassword(String password) {
+        this.password = password;
+    }
+	
+	
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscriber/Subscriber.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscriber/Subscriber.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscriber/Subscriber.java
new file mode 100644
index 0000000..cec252b
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscriber/Subscriber.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.subscriber;
+
+import java.io.Serializable;
+
+public class Subscriber implements Serializable {
+
+    private static final long serialVersionUID = 6429685206817913437L;
+    private String adminUserName;
+    private int tenantId;
+    private String tenantDomain;
+
+    public Subscriber (String adminUserName, int tenantId, String tenantDomain) {
+
+        this.adminUserName = adminUserName;
+        this.tenantId = tenantId;
+        this.tenantDomain = tenantDomain;
+    }
+
+    public String getAdminUserName() {
+        return adminUserName;
+    }
+
+    public void setAdminUserName(String adminUserName) {
+        this.adminUserName = adminUserName;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(int tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getTenantDomain() {
+        return tenantDomain;
+    }
+
+    public void setTenantDomain(String tenantDomain) {
+        this.tenantDomain = tenantDomain;
+    }
+
+    @Override
+    public String toString() {
+        return "Subscriber [adminUserName=" + adminUserName + ", tenantId=" + tenantId +
+               ", tenantDomain=" + tenantDomain + "]";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/ApplicationCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/ApplicationCartridgeSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/ApplicationCartridgeSubscription.java
new file mode 100644
index 0000000..eed644a
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/ApplicationCartridgeSubscription.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.subscription;
+
+import org.apache.stratos.manager.repository.Repository;
+import org.apache.stratos.manager.subscription.tenancy.SubscriptionTenancyBehaviour;
+import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+
+public class ApplicationCartridgeSubscription extends CartridgeSubscription {
+
+
+    private static final long serialVersionUID = 3969055979835359336L;
+
+    /**
+     * Constructor
+     *
+     * @param cartridgeInfo CartridgeInfo instance
+     * @param subscriptionTenancyBehaviour SubscriptionTenancyBehaviour instance
+     */
+    public ApplicationCartridgeSubscription(CartridgeInfo cartridgeInfo, SubscriptionTenancyBehaviour
+            subscriptionTenancyBehaviour) {
+        super(cartridgeInfo, subscriptionTenancyBehaviour);
+    }
+
+
+    public Repository manageRepository (String repoURL, String repoUserName, String repoUserPassword,
+                                        boolean privateRepo, String cartridgeAlias, CartridgeInfo cartridgeInfo,
+                                        String tenantDomain) {
+
+        //no repository for application cartridge instances
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
new file mode 100644
index 0000000..acd3055
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
@@ -0,0 +1,467 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.subscription;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.manager.dao.CartridgeSubscriptionInfo;
+import org.apache.stratos.manager.dao.Cluster;
+import org.apache.stratos.manager.exception.*;
+import org.apache.stratos.manager.payload.PayloadData;
+import org.apache.stratos.manager.repository.Repository;
+import org.apache.stratos.manager.subscriber.Subscriber;
+import org.apache.stratos.manager.subscription.tenancy.SubscriptionTenancyBehaviour;
+import org.apache.stratos.manager.utils.ApplicationManagementUtil;
+import org.apache.stratos.manager.utils.CartridgeConstants;
+import org.apache.stratos.manager.utils.RepositoryFactory;
+import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+import org.apache.stratos.cloud.controller.pojo.Properties;
+
+import java.io.Serializable;
+import java.util.Map;
+
+public abstract class CartridgeSubscription implements Serializable {
+
+
+    private static final long serialVersionUID = -5197430500059231924L;
+    private static Log log = LogFactory.getLog(CartridgeSubscription.class);
+    private int subscriptionId;
+    private String type;
+    private String alias;
+    private String autoscalingPolicyName;
+    private String deploymentPolicyName;
+    private Subscriber subscriber;
+    private Repository repository;
+    private CartridgeInfo cartridgeInfo;
+    private PayloadData payloadData;
+    private Cluster cluster;
+    private String subscriptionStatus;
+    //private String serviceStatus;
+    private String mappedDomain;
+    //private List<String> connectedSubscriptionAliases;
+    private String subscriptionKey;
+    private SubscriptionTenancyBehaviour subscriptionTenancyBehaviour;
+
+    
+    /**
+     * Constructor
+     *
+     * @param cartridgeInfo CartridgeInfo instance
+     * @param subscriptionTenancyBehaviour SubscriptionTenancyBehaviour instance
+     */
+    public CartridgeSubscription(CartridgeInfo cartridgeInfo, SubscriptionTenancyBehaviour subscriptionTenancyBehaviour) {
+
+        this.setCartridgeInfo(cartridgeInfo);
+        this.setType(cartridgeInfo.getType());
+        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>();
+        this.setSubscriptionTenancyBehaviour(subscriptionTenancyBehaviour);
+    }
+
+    /**
+     * Subscribes to this cartridge subscription
+     *
+     * @param subscriber Subscriber subscription
+     * @param alias Alias of the cartridge subscription
+     * @param autoscalingPolicy Auto scaling policy
+     * @param deploymentPolicyName Deployment policy
+     * @param repository Relevenat Repository subscription
+     *
+     * @throws org.apache.stratos.manager.exception.ADCException
+     * @throws org.apache.stratos.manager.exception.PolicyException
+     * @throws org.apache.stratos.manager.exception.UnregisteredCartridgeException
+     * @throws org.apache.stratos.manager.exception.InvalidCartridgeAliasException
+     * @throws org.apache.stratos.manager.exception.DuplicateCartridgeAliasException
+     * @throws org.apache.stratos.manager.exception.RepositoryRequiredException
+     * @throws org.apache.stratos.manager.exception.AlreadySubscribedException
+     * @throws org.apache.stratos.manager.exception.RepositoryCredentialsRequiredException
+     * @throws org.apache.stratos.manager.exception.InvalidRepositoryException
+     * @throws org.apache.stratos.manager.exception.RepositoryTransportException
+     */
+    public void createSubscription (Subscriber subscriber, String alias, String autoscalingPolicy,
+                                    String deploymentPolicyName, Repository repository)
+            throws ADCException, PolicyException, UnregisteredCartridgeException, InvalidCartridgeAliasException,
+            DuplicateCartridgeAliasException, RepositoryRequiredException, AlreadySubscribedException,
+            RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException {
+
+        setSubscriber(subscriber);
+        setAlias(alias);
+        setAutoscalingPolicyName(autoscalingPolicy);
+        setDeploymentPolicyName(deploymentPolicyName);
+        setRepository(repository);
+        getSubscriptionTenancyBehaviour().createSubscription(this);
+    }
+
+    /**
+     * Unsubscribe from this cartridge subscription
+     *
+     * @throws ADCException
+     * @throws NotSubscribedException
+     */
+    public void removeSubscription() throws ADCException, NotSubscribedException {
+
+        getSubscriptionTenancyBehaviour().removeSubscription(this);
+        cleanupSubscription();
+    }
+
+    /**
+     * Registers the subscription
+     *
+     * @param properties Any additional properties needed
+     *
+     * @return CartridgeSubscriptionInfo subscription populated with relevant data
+     * @throws ADCException
+     * @throws UnregisteredCartridgeException
+     */
+    public CartridgeSubscriptionInfo registerSubscription(Properties properties)
+            throws ADCException, UnregisteredCartridgeException {
+
+        Properties props = new Properties();
+        props.setProperties(getCartridgeInfo().getProperties());
+
+        getSubscriptionTenancyBehaviour().registerSubscription(this, props);
+
+        return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicyName(),
+                getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
+                getRepository(), getCluster().getHostName(), getCluster().getClusterDomain(), getCluster().getClusterSubDomain(),
+                getCluster().getMgtClusterDomain(), getCluster().getMgtClusterSubDomain(), null, "PENDING", getSubscriptionKey());
+    }
+
+    /**
+     * Connect cartridges
+     *
+     * @param connectingCartridgeAlias Alias of connecting cartridge
+     */
+    public void connect (String connectingCartridgeAlias) {
+        //connectedSubscriptionAliases.add(connectingCartridgeAlias);
+    }
+
+    /**
+     * Disconnect from the cartridge subscription given by disconnectingCartridgeAlias
+     *
+     * @param disconnectingCartridgeAlias Alias of the cartridge subscription to disconnect
+     */
+    public void disconnect (String disconnectingCartridgeAlias) {
+        //connectedSubscriptionAliases.remove(disconnectingCartridgeAlias);
+    }
+
+    /**
+     * Manages the repository for the cartridge subscription
+     *
+     * @param repoURL Repository URL
+     * @param repoUserName Repository Username
+     * @param repoUserPassword Repository password
+     * @param privateRepo public/private repository
+     * @param cartridgeAlias Alias of the cartridge subscription
+     * @param cartridgeInfo CartridgeInfo subscription
+     * @param tenantDomain Domain of the tenant
+     *
+     * @return Repository populated with relevant information or null of not repository is relevant to this cartridge
+     * subscription
+     * @throws ADCException
+     * @throws RepositoryRequiredException
+     * @throws RepositoryCredentialsRequiredException
+     * @throws RepositoryTransportException
+     * @throws InvalidRepositoryException
+     */
+    public Repository manageRepository (String repoURL, String repoUserName, String repoUserPassword,
+                                        boolean privateRepo, String cartridgeAlias, CartridgeInfo cartridgeInfo,
+                                        String tenantDomain)
+
+            throws ADCException, RepositoryRequiredException, RepositoryCredentialsRequiredException,
+            RepositoryTransportException, InvalidRepositoryException {
+
+        if (!new Boolean(System.getProperty(CartridgeConstants.FEATURE_INTERNAL_REPO_ENABLED))) {
+            if (log.isDebugEnabled()) {
+                log.debug("Internal repo feature is not enabled.");
+            }
+        }
+
+        Repository repository = null;
+        if (repoURL != null && repoURL.trim().length() > 0) {
+        	repository = new Repository();
+            log.info("External REPO URL is provided as [" + repoURL +
+                    "]. Therefore not creating a new repo.");
+            //repository.setRepoName(repoURL.substring(0, repoURL.length()-4)); // remove .git part
+            repository.setUrl(repoURL);
+            repository.setUserName(repoUserName);
+            repository.setPassword(repoUserPassword);
+            repository.setPrivateRepository(privateRepo);
+
+        }
+
+        // Validate Remote Repository.
+        ApplicationManagementUtil.validateRepository(repoURL, repoUserName, repoUserPassword, privateRepo,
+                new Boolean(System.getProperty(CartridgeConstants.FEATURE_EXTERNAL_REPO_VAIDATION_ENABLED)));
+
+        return repository;
+    }
+
+    /**
+     * Cleans up the subscription information after unsubscribing
+     *
+     * @throws ADCException
+     */
+    protected void cleanupSubscription () throws ADCException {
+
+        try {
+            new RepositoryFactory().destroyRepository(alias, subscriber.getTenantDomain(),
+                    subscriber.getAdminUserName());
+            log.info("Repo is destroyed successfully.. ");
+
+        } catch (Exception e) {
+            String errorMsg = "Error in destroying repository for tenant " + subscriber.getTenantDomain() +
+                    "cartridge type " + type;
+            log.error(errorMsg);
+        }
+
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        /*try {
+            PersistenceManager.updateSubscriptionState(subscriptionId, "UNSUBSCRIBED");
+
+        } catch (Exception e) {
+            String errorMsg = "Error in unscubscribing from cartridge, alias " + alias + ", tenant " +
+                    subscriber.getTenantDomain();
+            throw new ADCException(errorMsg, e);
+        }*/
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+        //TODO: FIXME: do we need this?
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        /*new DNSManager().removeSubDomain(getCluster().getHostName());
+
+        try {
+            new RegistryManager().removeDomainMappingFromRegistry(getCluster().getHostName());
+
+        } catch (Exception e) {
+            String errorMsg = "Error in removing domain mapping, alias " + alias + ", tenant " +
+                    subscriber.getTenantDomain();
+            log.error(errorMsg, e);
+        }*/
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+        /*TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+        String[] ips = topologyMgtService.getActiveIPs(type, getCluster().getClusterDomain(), getCluster().getClusterSubDomain());
+        try {
+            PersistenceManager.updateInstanceState("INACTIVE", ips, getCluster().getClusterDomain(), getCluster().getClusterSubDomain(), type);
+
+        } catch (Exception e) {
+            String errorMsg = "Error in updating state to INACTIVE";
+            log.error(errorMsg, e);
+        }*/
+
+        //this.setSubscriptionStatus(CartridgeConstants.UNSUBSCRIBED);
+    }
+
+    public Map<String, String> getCustomPayloadEntries () {
+
+        //no custom payload entries by default
+        return null;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public Subscriber getSubscriber() {
+        return subscriber;
+    }
+
+    public Repository getRepository() {
+        return repository;
+    }
+
+    /*public List<String> getConnectedSubscriptionAliases() {
+        return connectedSubscriptionAliases;
+    }*/
+
+    public CartridgeInfo getCartridgeInfo() {
+        return cartridgeInfo;
+    }
+
+    public String getHostName() {
+        return getCluster().getHostName();
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public String getClusterDomain() {
+        return getCluster().getClusterDomain();
+    }
+
+    public void setClusterDomain(String clusterDomain) {
+        getCluster().setClusterDomain(clusterDomain);
+    }
+
+    public String getClusterSubDomain() {
+        return getCluster().getClusterSubDomain();
+    }
+
+    public void setClusterSubDomain(String clusterSubDomain) {
+        getCluster().setClusterSubDomain(clusterSubDomain);
+    }
+
+    public String getMgtClusterDomain() {
+        return getCluster().getMgtClusterDomain();
+    }
+
+    public void setMgtClusterDomain(String mgtClusterDomain) {
+        getCluster().setMgtClusterDomain(mgtClusterDomain);
+    }
+
+    public String getMgtClusterSubDomain() {
+        return getCluster().getMgtClusterSubDomain();
+    }
+
+    public void setMgtClusterSubDomain(String mgtClusterSubDomain) {
+        getCluster().setMgtClusterSubDomain(mgtClusterSubDomain);
+    }
+
+    public void setHostName(String hostName) {
+        getCluster().setHostName(hostName);
+    }
+
+    public String getAutoscalingPolicyName() {
+        return autoscalingPolicyName;
+    }
+
+    public void setAutoscalingPolicyName(String autoscalingPolicyName) {
+        this.autoscalingPolicyName = autoscalingPolicyName;
+    }
+
+    public void setSubscriber(Subscriber subscriber) {
+        this.subscriber = subscriber;
+    }
+
+    public void setRepository(Repository repository) {
+        this.repository = repository;
+    }
+
+    public void setCartridgeInfo(CartridgeInfo cartridgeInfo) {
+        this.cartridgeInfo = cartridgeInfo;
+    }
+
+    public PayloadData getPayloadData() {
+        return payloadData;
+    }
+
+    public void setPayloadData(PayloadData payloadData) {
+        this.payloadData = payloadData;
+    }
+
+    public int getSubscriptionId() {
+        return subscriptionId;
+    }
+
+    public void setSubscriptionId(int subscriptionId) {
+        this.subscriptionId = subscriptionId;
+    }
+
+    public String getMappedDomain() {
+        return mappedDomain;
+    }
+
+    public void setMappedDomain(String mappedDomain) {
+        this.mappedDomain = mappedDomain;
+    }
+
+    public String getSubscriptionStatus() {
+        return subscriptionStatus;
+    }
+
+    public void setSubscriptionStatus(String subscriptionStatus) {
+        this.subscriptionStatus = subscriptionStatus;
+    }
+
+    public String getSubscriptionKey() {
+        return subscriptionKey;
+    }
+
+    public void setSubscriptionKey(String subscriptionKey) {
+        this.subscriptionKey = subscriptionKey;
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public void setCluster(Cluster cluster) {
+        this.cluster = cluster;
+    }
+
+    public String getDeploymentPolicyName() {
+        return deploymentPolicyName;
+    }
+
+    public void setDeploymentPolicyName(String deploymentPolicyName) {
+        this.deploymentPolicyName = deploymentPolicyName;
+    }
+
+    public SubscriptionTenancyBehaviour getSubscriptionTenancyBehaviour() {
+        return subscriptionTenancyBehaviour;
+    }
+
+    public void setSubscriptionTenancyBehaviour(SubscriptionTenancyBehaviour subscriptionTenancyBehaviour) {
+        this.subscriptionTenancyBehaviour = subscriptionTenancyBehaviour;
+    }
+
+    public boolean equals(Object other) {
+
+        if(this == other) {
+            return true;
+        }
+        if(!(other instanceof CartridgeSubscription)) {
+            return false;
+        }
+
+        CartridgeSubscription that = (CartridgeSubscription)other;
+        return ((this.type.equals(that.type)) && (this.alias.equals(that.alias)));
+    }
+
+    public int hashCode () {
+
+        return type.hashCode() + alias.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return "CartridgeSubscription [subscriptionId=" + subscriptionId + ", type=" + type +
+               ", alias=" + alias + ", autoscalingPolicyName=" + autoscalingPolicyName +
+               ", deploymentPolicyName=" + deploymentPolicyName + ", subscriber=" + subscriber +
+               ", repository=" + repository + ", cartridgeInfo=" + cartridgeInfo + ", payload=" +
+               payloadData + ", cluster=" + cluster + "]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription_old.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription_old.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription_old.java
new file mode 100644
index 0000000..b77f3ab
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription_old.java
@@ -0,0 +1,431 @@
+///*
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *  http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing,
+// * software distributed under the License is distributed on an
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// * KIND, either express or implied.  See the License for the
+// * specific language governing permissions and limitations
+// * under the License.
+// */
+//
+//package org.apache.stratos.manager.subscription;
+//
+//import org.apache.commons.logging.Log;
+//import org.apache.commons.logging.LogFactory;
+//import org.apache.stratos.manager.domain.RegistryManager;
+//import org.apache.stratos.manager.dao.CartridgeSubscriptionInfo;
+//import org.apache.stratos.manager.dao.Cluster;
+//import org.apache.stratos.manager.dns.DNSManager;
+//import org.apache.stratos.manager.dto.Policy;
+//import org.apache.stratos.manager.exception.*;
+//import org.apache.stratos.manager.internal.DataHolder;
+//import org.apache.stratos.manager.payload.Payload;
+//import org.apache.stratos.manager.payload.PayloadArg;
+//import org.apache.stratos.manager.repository.Repository;
+//import org.apache.stratos.manager.service.RepositoryInfoBean;
+//import org.apache.stratos.manager.subscriber.Subscriber;
+//import org.apache.stratos.manager.utils.*;
+//import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+//import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//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 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;
+//    private String subscriptionKey;
+//
+//    /**
+//     * Constructor
+//     *
+//     * @param cartridgeInfo CartridgeInfo subscription
+//     */
+//    public CartridgeSubscription(CartridgeInfo cartridgeInfo) {
+//
+//        this.setCartridgeInfo(cartridgeInfo);
+//        this.setType(cartridgeInfo.getType());
+//        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>();
+//    }
+//
+//    /**
+//     * Subscribes to this cartridge subscription
+//     *
+//     * @param subscriber Subscriber subscription
+//     * @param alias Alias of the cartridge subscription
+//     * @param autoscalingPolicy Auto scaling policy
+//     * @param repository Relevenat Repository subscription
+//     *
+//     * @throws ADCException
+//     * @throws PolicyException
+//     * @throws UnregisteredCartridgeException
+//     * @throws InvalidCartridgeAliasException
+//     * @throws DuplicateCartridgeAliasException
+//     * @throws RepositoryRequiredException
+//     * @throws AlreadySubscribedException
+//     * @throws RepositoryCredentialsRequiredException
+//     * @throws InvalidRepositoryException
+//     * @throws RepositoryTransportException
+//     */
+//    public void createSubscription (Subscriber subscriber, String alias, Policy autoscalingPolicy,
+//                                   Repository repository)
+//            throws ADCException, PolicyException, UnregisteredCartridgeException, InvalidCartridgeAliasException,
+//            DuplicateCartridgeAliasException, RepositoryRequiredException, AlreadySubscribedException,
+//            RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException {
+//
+//        setSubscriber(subscriber);
+//        setAlias(alias);
+//        setAutoscalingPolicyName(autoscalingPolicy);
+//        setRepository(repository);
+//    }
+//
+//    /**
+//     * Unsubscribe from this cartridge subscription
+//     *
+//     * @throws ADCException
+//     * @throws NotSubscribedException
+//     */
+//    public abstract void removeSubscription() throws ADCException, NotSubscribedException;
+//
+//    /**
+//     * Registers the subscription
+//     *
+//     * @param properties Any additional properties needed
+//     *
+//     * @return CartridgeSubscriptionInfo subscription populated with relevant data
+//     * @throws ADCException
+//     * @throws UnregisteredCartridgeException
+//     */
+//    public abstract CartridgeSubscriptionInfo registerSubscription(Properties properties)
+//            throws ADCException, UnregisteredCartridgeException;
+//
+//    /**
+//     * Connect cartridges
+//     *
+//     * @param connectingCartridgeAlias Alias of connecting cartridge
+//     */
+//    public void connect (String connectingCartridgeAlias) {
+//        connectedSubscriptionAliases.add(connectingCartridgeAlias);
+//    }
+//
+//    /**
+//     * Disconnect from the cartridge subscription given by disconnectingCartridgeAlias
+//     *
+//     * @param disconnectingCartridgeAlias Alias of the cartridge subscription to disconnect
+//     */
+//    public void disconnect (String disconnectingCartridgeAlias) {
+//        connectedSubscriptionAliases.remove(disconnectingCartridgeAlias);
+//    }
+//
+//    /**
+//     * Creates the relevant payload parameters for this cartridge subscription
+//     *
+//     * @return PayloadArg subscription
+//     * @throws ADCException in an errpr
+//     */
+//    public PayloadArg createPayloadParameters() throws ADCException {
+//
+//        PayloadArg payloadArg = new PayloadArg();
+//        payloadArg.setCartridgeInfo(getCartridgeInfo());
+//        payloadArg.setPolicy(getAutoscalingPolicyName());
+//        payloadArg.setMultitenant(getCartridgeInfo().getMultiTenant());
+//        payloadArg.setTenantId(getSubscriber().getTenantId());
+//        payloadArg.setTenantDomain(getSubscriber().getTenantDomain());
+//        payloadArg.setCartridgeAlias(getAlias());
+//        payloadArg.setServiceName(getCartridgeInfo().getType());
+//        payloadArg.setSubscriptionKey(subscriptionKey);
+//        return payloadArg;
+//    }
+//
+//    /**
+//     * Manages the repository for the cartridge subscription
+//     *
+//     * @param repoURL Repository URL
+//     * @param repoUserName Repository Username
+//     * @param repoUserPassword Repository password
+//     * @param privateRepo public/private repository
+//     * @param cartridgeAlias Alias of the cartridge subscription
+//     * @param cartridgeInfo CartridgeInfo subscription
+//     * @param tenantDomain Domain of the tenant
+//     *
+//     * @return Repository populated with relevant information or null of not repository is relevant to this cartridge
+//     * subscription
+//     * @throws ADCException
+//     * @throws RepositoryRequiredException
+//     * @throws RepositoryCredentialsRequiredException
+//     * @throws RepositoryTransportException
+//     * @throws InvalidRepositoryException
+//     */
+//    public Repository manageRepository (String repoURL, String repoUserName, String repoUserPassword,
+//                                        boolean privateRepo, String cartridgeAlias, CartridgeInfo cartridgeInfo,
+//                                        String tenantDomain)
+//
+//            throws ADCException, RepositoryRequiredException, RepositoryCredentialsRequiredException,
+//            RepositoryTransportException, InvalidRepositoryException {
+//
+//        if (!new Boolean(System.getProperty(CartridgeConstants.FEATURE_INTERNAL_REPO_ENABLED))) {
+//            if (log.isDebugEnabled()) {
+//                log.debug("Internal repo feature is not enabled.");
+//            }
+//        }
+//
+//        Repository repository = new Repository();
+//        if (repoURL != null && repoURL.trim().length() > 0) {
+//            log.info("External REPO URL is provided as [" + repoURL +
+//                    "]. Therefore not creating a new repo.");
+//            //repository.setRepoName(repoURL.substring(0, repoURL.length()-4)); // remove .git part
+//            repository.setUrl(repoURL);
+//            repository.setUserName(repoUserName);
+//            repository.setPassword(repoUserPassword);
+//            repository.setPrivateRepository(privateRepo);
+//
+//        } else {
+//
+//            log.info("External git repo url not provided for tenant "
+//                    + tenantDomain + ", creating an git internal repository");
+//
+//            // for internal repos  internal git server username and password is used.
+//            repository.setUserName(System.getProperty(CartridgeConstants.INTERNAL_GIT_USERNAME));
+//            repository.setPassword(System.getProperty(CartridgeConstants.INTERNAL_GIT_PASSWORD));
+//            try {
+//                new RepositoryCreator(new RepositoryInfoBean(repoURL, cartridgeAlias, tenantDomain,
+//                        repository.getUserName(), repository.getPassword(), cartridgeInfo.getDeploymentDirs(),
+//                        cartridgeInfo)).createInternalRepository();
+//
+//            } catch (Exception e) {
+//                throw new ADCException(e.getMessage(), e);
+//            }
+//            String repoName = tenantDomain + "/" + cartridgeAlias;
+//            repository.setUrl("https://" + System.getProperty(CartridgeConstants.GIT_HOST_NAME) + ":8443/git/" +
+//                    repoName);
+//        }
+//
+//        // Validate Remote Repository.
+//        ApplicationManagementUtil.validateRepository(repoURL, repoUserName, repoUserPassword, privateRepo,
+//                new Boolean(System.getProperty(CartridgeConstants.FEATURE_EXTERNAL_REPO_VAIDATION_ENABLED)));
+//
+//        return repository;
+//    }
+//
+//    /**
+//     * Cleans up the subscription information after unsubscribing
+//     *
+//     * @throws ADCException
+//     */
+//    protected void cleanupSubscription () throws ADCException {
+//
+//        try {
+//            new RepositoryFactory().destroyRepository(alias, subscriber.getTenantDomain(),
+//                    subscriber.getAdminUserName());
+//            log.info("Repo is destroyed successfully.. ");
+//
+//        } catch (Exception e) {
+//            String errorMsg = "Error in destroying repository for tenant " + subscriber.getTenantDomain() +
+//                    "cartridge type " + type;
+//            log.error(errorMsg);
+//        }
+//
+//        try {
+//            PersistenceManager.updateSubscriptionState(subscriptionId, "UNSUBSCRIBED");
+//
+//        } catch (Exception e) {
+//            String errorMsg = "Error in unscubscribing from cartridge, alias " + alias + ", tenant " +
+//                    subscriber.getTenantDomain();
+//            throw new ADCException(errorMsg, e);
+//        }
+//
+//        //TODO: FIXME: do we need this?
+//        new DNSManager().removeSubDomain(getCluster().getHostName());
+//
+//        try {
+//            new RegistryManager().removeDomainMappingFromRegistry(getCluster().getHostName());
+//
+//        } catch (Exception e) {
+//            String errorMsg = "Error in removing domain mapping, alias " + alias + ", tenant " +
+//                    subscriber.getTenantDomain();
+//            log.error(errorMsg, e);
+//        }
+//
+//        TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+//        String[] ips = topologyMgtService.getActiveIPs(type, getCluster().getClusterDomain(), getCluster().getClusterSubDomain());
+//        try {
+//            PersistenceManager.updateInstanceState("INACTIVE", ips, getCluster().getClusterDomain(), getCluster().getClusterSubDomain(), type);
+//
+//        } catch (Exception e) {
+//            String errorMsg = "Error in updating state to INACTIVE";
+//            log.error(errorMsg, e);
+//        }
+//
+//        this.setSubscriptionStatus(CartridgeConstants.UNSUBSCRIBED);
+//    }
+//
+//    public String getType() {
+//        return type;
+//    }
+//
+//    public String getAlias() {
+//        return alias;
+//    }
+//
+//    public Subscriber getSubscriber() {
+//        return subscriber;
+//    }
+//
+//    public Repository getRepository() {
+//        return repository;
+//    }
+//
+//    public List<String> getConnectedSubscriptionAliases() {
+//        return connectedSubscriptionAliases;
+//    }
+//
+//    public CartridgeInfo getCartridgeInfo() {
+//        return cartridgeInfo;
+//    }
+//
+//    public String getHostName() {
+//        return getCluster().getHostName();
+//    }
+//
+//    public void setType(String type) {
+//        this.type = type;
+//    }
+//
+//    public void setAlias(String alias) {
+//        this.alias = alias;
+//    }
+//
+//    public String getClusterDomain() {
+//        return getCluster().getClusterDomain();
+//    }
+//
+//    public void setClusterDomain(String clusterDomain) {
+//        getCluster().setClusterDomain(clusterDomain);
+//    }
+//
+//    public String getClusterSubDomain() {
+//        return getCluster().getClusterSubDomain();
+//    }
+//
+//    public void setClusterSubDomain(String clusterSubDomain) {
+//        getCluster().setClusterSubDomain(clusterSubDomain);
+//    }
+//
+//    public String getMgtClusterDomain() {
+//        return getCluster().getMgtClusterDomain();
+//    }
+//
+//    public void setMgtClusterDomain(String mgtClusterDomain) {
+//        getCluster().setMgtClusterDomain(mgtClusterDomain);
+//    }
+//
+//    public String getMgtClusterSubDomain() {
+//        return getCluster().getMgtClusterSubDomain();
+//    }
+//
+//    public void setMgtClusterSubDomain(String mgtClusterSubDomain) {
+//        getCluster().setMgtClusterSubDomain(mgtClusterSubDomain);
+//    }
+//
+//    public void setHostName(String hostName) {
+//        getCluster().setHostName(hostName);
+//    }
+//
+//    public Policy getAutoscalingPolicyName() {
+//        return autoscalingPolicy;
+//    }
+//
+//    public void setAutoscalingPolicyName(Policy autoscalingPolicy) {
+//        this.autoscalingPolicy = autoscalingPolicy;
+//    }
+//
+//    public void setSubscriber(Subscriber subscriber) {
+//        this.subscriber = subscriber;
+//    }
+//
+//    public void setRepository(Repository repository) {
+//        this.repository = repository;
+//    }
+//
+//    public void setCartridgeInfo(CartridgeInfo cartridgeInfo) {
+//        this.cartridgeInfo = cartridgeInfo;
+//    }
+//
+//    public Payload getPayloadData() {
+//        return payload;
+//    }
+//
+//    public void setPayloadData(Payload payload) {
+//        this.payload = payload;
+//    }
+//
+//    public int getSubscriptionId() {
+//        return subscriptionId;
+//    }
+//
+//    public void setSubscriptionId(int subscriptionId) {
+//        this.subscriptionId = subscriptionId;
+//    }
+//
+//    public String getMappedDomain() {
+//        return mappedDomain;
+//    }
+//
+//    public void setMappedDomain(String mappedDomain) {
+//        this.mappedDomain = mappedDomain;
+//    }
+//
+//    public String getSubscriptionStatus() {
+//        return subscriptionStatus;
+//    }
+//
+//    public void setSubscriptionStatus(String subscriptionStatus) {
+//        this.subscriptionStatus = subscriptionStatus;
+//    }
+//
+//	public String getSubscriptionKey() {
+//		return subscriptionKey;
+//	}
+//
+//	public void setSubscriptionKey(String subscriptionKey) {
+//		this.subscriptionKey = subscriptionKey;
+//	}
+//
+//    public Cluster getCluster() {
+//        return cluster;
+//    }
+//
+//    public void setCluster(Cluster cluster) {
+//        this.cluster = cluster;
+//    }
+//
+//}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/9d280533/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/DataCartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/DataCartridgeSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/DataCartridgeSubscription.java
new file mode 100644
index 0000000..03cfecd
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/DataCartridgeSubscription.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.subscription;
+
+import org.apache.stratos.manager.dao.CartridgeSubscriptionInfo;
+import org.apache.stratos.manager.dao.DataCartridge;
+import org.apache.stratos.manager.exception.ADCException;
+import org.apache.stratos.manager.exception.UnregisteredCartridgeException;
+import org.apache.stratos.manager.repository.Repository;
+import org.apache.stratos.manager.subscription.tenancy.SubscriptionTenancyBehaviour;
+import org.apache.stratos.manager.utils.ApplicationManagementUtil;
+import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
+import org.apache.stratos.cloud.controller.pojo.Properties;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class DataCartridgeSubscription extends CartridgeSubscription {
+
+    private String host;
+    private String username;
+    private String password;
+
+    /**
+     * Constructor
+     *
+     * @param cartridgeInfo CartridgeInfo instance
+     * @param subscriptionTenancyBehaviour SubscriptionTenancyBehaviour instance
+     */
+    public DataCartridgeSubscription(CartridgeInfo cartridgeInfo, SubscriptionTenancyBehaviour
+            subscriptionTenancyBehaviour) {
+
+        super(cartridgeInfo, subscriptionTenancyBehaviour);
+        setHost("localhost");
+        setUsername("root");
+        setPassword(ApplicationManagementUtil.generatePassword());
+    }
+
+    @Override
+    public CartridgeSubscriptionInfo registerSubscription(Properties properties) throws ADCException,
+            UnregisteredCartridgeException {
+
+        Properties props = new Properties();
+        props.setProperties(getCartridgeInfo().getProperties());
+        getSubscriptionTenancyBehaviour().registerSubscription(this, props);
+
+        DataCartridge dataCartridge = new DataCartridge();
+        dataCartridge.setUserName(getUsername());
+        dataCartridge.setPassword(getPassword());
+        dataCartridge.setDataCartridgeType(getType());
+
+        return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicyName(),
+                getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
+                getRepository(), getCluster().getHostName(), getCluster().getClusterDomain(), getCluster().getClusterSubDomain(),
+                getCluster().getMgtClusterDomain(), getCluster().getMgtClusterSubDomain(), dataCartridge, "PENDING",getSubscriptionKey());
+    }
+
+    public Repository manageRepository (String repoURL, String repoUserName, String repoUserPassword,
+                                        boolean privateRepo, String cartridgeAlias, CartridgeInfo cartridgeInfo,
+                                        String tenantDomain) {
+
+        //no repository for data cartridge instances
+        return null;
+    }
+
+    @Override
+    public Map<String, String> getCustomPayloadEntries() {
+
+        Map<String, String> payloadEntriesMap = new HashMap<String, String>();
+        payloadEntriesMap.put("MYSQL_HOST", host);
+        payloadEntriesMap.put("MYSQL_USER", username);
+        payloadEntriesMap.put("MYSQL_PASSWORD", password);
+
+        return payloadEntriesMap;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    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;
+    }
+}