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/07/10 18:52:03 UTC

[28/45] fixing component version issues and adding currently refactored components to the parent pom

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingConstants.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingConstants.java
new file mode 100644
index 0000000..9259ea6
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingConstants.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.internal;
+
+/**
+ * Web Application Constants
+ */
+public final class HostingConstants {
+	public static final String WEBAPP_PREFIX = "webapps";
+	public static final String WEBAPP_DEPLOYMENT_FOLDER = "webapps";
+	public static final String WEBAPP_EXTENSION = "war";
+
+	public static final class WebappState {
+		public static final String STARTED = "started";
+		public static final String STOPPED = "stopped";
+
+		private WebappState() {
+		}
+	}
+
+	private HostingConstants() {
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingManagementActivator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingManagementActivator.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingManagementActivator.java
new file mode 100644
index 0000000..2e61894
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/HostingManagementActivator.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.internal;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.wso2.carbon.utils.CarbonUtils;
+
+/**
+ * Activator for the Webapp Management Bundle
+ */
+public class HostingManagementActivator implements BundleActivator {
+	private static final Log log = LogFactory.getLog(HostingManagementActivator.class);
+
+	@Override
+	public void start(final BundleContext bundleContext) {
+
+		// If Carbon is running as a webapp within some other servlet container,
+		// then we should
+		// uninstall this component
+		if (!CarbonUtils.isRunningInStandaloneMode()) {
+			Thread th = new Thread() {
+				@Override
+				public void run() {
+					try {
+						bundleContext.getBundle().uninstall();
+					} catch (Throwable e) {
+						log.warn("Error occurred while uninstalling hosting.mgt UI bundle", e);
+					}
+				}
+			};
+			try {
+				th.join();
+			} catch (InterruptedException ignored) {
+			}
+			th.start();
+		}
+	}
+
+	@Override
+	public void stop(BundleContext bundleContext) {
+		// No implementation required for this method
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
new file mode 100644
index 0000000..c977bc4
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/ApplicationManagementService.java
@@ -0,0 +1,620 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.service;
+
+import org.apache.axis2.AxisFault;
+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.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.dns.DNSManager;
+import org.apache.stratos.adc.mgt.dto.Cartridge;
+import org.apache.stratos.adc.mgt.dto.CartridgeWrapper;
+import org.apache.stratos.adc.mgt.dto.PolicyDefinition;
+import org.apache.stratos.adc.mgt.dto.RepositoryInformation;
+import org.apache.stratos.adc.mgt.dto.SubscriptionInfo;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.utils.*;
+import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+import org.wso2.carbon.core.AbstractAdmin;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+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);
+    RegistryManager registryManager = new RegistryManager();
+
+    PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+    String tenantDomain = carbonContext.getTenantDomain();
+    
+    /*
+     * Instantiate RepoNotificationService. Since this service is in the same 
+     * component (org.apache.stratos.adc.mgt), 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 = ApplicationManagementUtil.getServiceClient().getRegisteredCartridges();
+
+			if (availableCartridges != null) {
+				for (String cartridgeType : availableCartridges) {
+					CartridgeInfo cartridgeInfo = null;
+					try {
+						cartridgeInfo = ApplicationManagementUtil.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
+						// subscribe 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 subscribe");
+							}
+							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<CartridgeSubscription> subscriptionList = PersistenceManager
+					.retrieveSubscribedCartridges(ApplicationManagementUtil.getTenantId(getConfigContext()));
+
+			if (subscriptionList != null && !subscriptionList.isEmpty()) {
+				for (CartridgeSubscription subscription : subscriptionList) {
+					CartridgeInfo cartridgeInfo = null;
+					try {
+						cartridgeInfo = ApplicationManagementUtil.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, tenantDomain);
+					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, CartridgeSubscription cartridgeSubscription, 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 && cartridgeSubscription.getCartridge() != null) {
+                matches = pattern.matcher(cartridgeSubscription.getCartridge().toLowerCase()).find();
+            }
+            if (!matches && cartridgeSubscription.getAlias() != null) {
+                matches = pattern.matcher(cartridgeSubscription.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<CartridgeSubscription> subscriptionList = PersistenceManager
+                    .retrieveSubscribedCartridges(ApplicationManagementUtil.getTenantId(getConfigContext()));
+            List<String> subscribedAliases = new ArrayList<String>();
+            for (CartridgeSubscription cartridgeSubscription : subscriptionList) {
+
+                if(cartridgeSubscription.getProvider().equalsIgnoreCase(CartridgeConstants.PROVIDER_NAME_WSO2) &&
+                        getCartridgeInfo(cartridgeSubscription.getAlias()).isMultiTenant()) {
+
+                    subscribedAliases.add(cartridgeSubscription.getCartridge());
+                } else {
+                    subscribedAliases.add(cartridgeSubscription.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());
+
+	}
+
+
+    /**
+     * Unsubscribing the cartridge
+     *
+     * @param alias name of the cartridge to be unsubscribed
+     */
+    public void unsubscribe(String alias) throws ADCException, NotSubscribedException {
+    	checkSuperTenant();
+        CartridgeSubscription subscription = null;
+        
+        try {
+			subscription = PersistenceManager.getSubscription(tenantDomain, alias);
+		} catch (Exception e) {
+			String msg = "Failed to get subscription for " + tenantDomain + " and alias " + alias;
+            log.error(msg, e);
+			throw new ADCException(msg, e);
+		}
+
+        if (subscription == null) {
+            String msg = "Tenant " + tenantDomain + " 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 = ApplicationManagementUtil.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);
+                ApplicationManagementUtil.getServiceClient().terminateAllInstances(clusterDomain, clusterSubDomain);
+                log.info("All instances terminated.");
+                log.info("Unregistering services...");
+                ApplicationManagementUtil.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, tenantDomain, 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 '.' ");
+		//		}
+
+        CartridgeSubscription subscription = null;
+        String actualHost = null;
+        
+        try {
+			subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
+		} catch (Exception e) {
+			String msg = "Failed to get subscription for " + tenantDomain + " and alias " + cartridgeAlias;
+            log.error(msg, e);
+			throw new ADCException(msg, e);
+		}
+        if (subscription == null) {
+        	String msg = "Tenant " + tenantDomain + " 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: " + tenantDomain);
+            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();
+        CartridgeSubscription subscription = null;
+        String actualHost = null;
+        
+        try {
+			subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
+		} catch (Exception e) {
+			String msg = "Failed to get subscription for " + tenantDomain + " and alias " + cartridgeAlias;
+            log.error(msg, e);
+			throw new ADCException(msg, e);
+		}
+        if (subscription == null) {
+        	String msg = "Tenant " + tenantDomain + " 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: " + tenantDomain);
+            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();
+        CartridgeSubscription subscription = null;
+        
+        // Validating subscription
+        try {
+			subscription = PersistenceManager.getSubscription(tenantDomain, cartridgeAlias);
+		} catch (Exception e) {
+			String msg = "Failed to get subscription for " + tenantDomain + " and alias " + cartridgeAlias;
+            log.error(msg, e);
+			throw new ADCException(msg, e);
+		}
+        if (subscription == null) {
+        	String msg = "Tenant " + tenantDomain + " is not subscribed for " + cartridgeAlias;
+            log.error(msg);
+            throw new NotSubscribedException("You have not subscribed for " + cartridgeAlias, cartridgeAlias);
+        }
+		
+		try {
+			repoNotificationService.notifyRepoUpdate(tenantDomain, cartridgeAlias);
+		} catch (Exception e) {
+			throw new ADCException(e.getMessage() != null ? e.getMessage() : "Failed to synchronize repository", e);
+		}
+	}
+
+    /**
+     * Validate authentication.
+     * First call of cli tool in the prompt mode after log in.
+     *
+     * @return The tenant domain
+     */
+	public String getTenantDomain() {
+		if (tenantDomain != null) {
+			// This means, authentication is successful
+			log.info("Tenant " + tenantDomain + " is authorized to access Application Management Service!");
+		}
+		return tenantDomain;
+	}
+    
+	/**
+	 * 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: " + carbonContext.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/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
new file mode 100644
index 0000000..692dafa
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/InstanceInformationManagementService.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.utils.PersistenceManager;
+
+public class InstanceInformationManagementService {
+
+	
+    private static final Log log = LogFactory.getLog(InstanceInformationManagementService.class);
+
+    /**
+    * Everytime an instance 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 instance state. Reason, " + e.getMessage());
+    }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
new file mode 100644
index 0000000..b26e885
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepoNotificationService.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.service;
+
+import java.io.File;
+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.adc.mgt.dao.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.adc.mgt.utils.PersistenceManager;
+import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.wso2.carbon.core.deployment.SynchronizeGitRepositoryRequest;
+import org.wso2.carbon.utils.CarbonUtils;
+
+
+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);
+
+		CartridgeSubscription 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<CartridgeSubscription> subscription = PersistenceManager.getSubscription(repositoryURL);
+		for (CartridgeSubscription cartridgeSubscription : subscription) {			
+			handleRepoSynch(cartridgeSubscription);   
+        }
+	}
+
+	private void handleRepoSynch(CartridgeSubscription subscription) throws Exception {
+		if (subscription == null) {
+			throw new Exception("Cannot synchronize repository. subscription is null");
+		}
+
+		if (CartridgeConstants.PROVIDER_NAME_WSO2.equals(subscription.getProvider())) {
+			log.info(" wso2 cartridge.. ");
+			createAndSendClusterMessage(subscription.getTenantId(), subscription.getTenantDomain(),
+			                            UUID.randomUUID(), subscription.getClusterDomain(),
+			                            subscription.getClusterSubdomain());
+			//for manager node
+			           /* if (subscription.getMgtClusterSubDomain() != null && !subscription.getMgtClusterSubDomain().isEmpty()) {
+			                createAndSendClusterMessage(subscription.getTenantId(), subscription.getTenantDomain(),
+			                        UUID.randomUUID(), subscription.getMgtClusterDomain(),
+			                        subscription.getMgtClusterSubDomain());
+			            }
+			            else {
+			                if(log.isDebugEnabled())
+			                    log.debug("Manager node cluster information not found, not sending the SynchronizeGitRepositoryRequest");
+			            }*/
+
+		} else {
+
+			// Query DB and get all the IP s for this tenant 
+			// Invoke update-instance script
+			
+			String appPath = subscription.getBaseDirectory();
+			String cartridgePrivateKey = System.getProperty(CartridgeConstants.CARTRIDGE_KEY);
+			
+			File keyFile = new File(cartridgePrivateKey);
+			if (!keyFile.exists()) {
+				log.error("The key file does not exist! " + cartridgePrivateKey);
+			}
+
+			if (subscription != null) {
+				TopologyManagementService topologyMgtService = DataHolder.getTopologyMgtService();
+
+				
+				if (topologyMgtService == null) {
+					String msg = " Topology Management Service is null ";
+					log.error(msg);
+					throw new Exception(msg);
+				}
+
+				String[] activeIpArray =
+				                         topologyMgtService.getActiveIPs(subscription.getCartridge(),
+				                                                         subscription.getClusterDomain(),
+				                                                         subscription.getClusterSubdomain());
+				try {
+
+					for (String instanceIp : activeIpArray) {
+						String command =
+						                 CarbonUtils.getCarbonHome() + File.separator + "bin" +
+						                         File.separator + "update-instance.sh " +
+						                         instanceIp + " " + appPath + " " +
+						                         cartridgePrivateKey + " /";
+						log.info("Update instance command.... " + command);
+						Process proc = Runtime.getRuntime().exec(command);
+						proc.waitFor();
+					}
+
+				} catch (Exception e) {
+					log.error("Exception is occurred in notify update operation. Reason : " +
+					          e.getMessage());
+					throw e;
+				}
+			}
+		}
+	}
+
+	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/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInfoBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInfoBean.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInfoBean.java
new file mode 100644
index 0000000..7a6380c
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInfoBean.java
@@ -0,0 +1,78 @@
+/**
+ * 
+ */
+package org.apache.stratos.adc.mgt.service;
+
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+/**
+ * @author wso2
+ *
+ */
+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/ac065d73/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInformationService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInformationService.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInformationService.java
new file mode 100644
index 0000000..ad7db58
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/service/RepositoryInformationService.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed 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.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.dao.RepositoryCredentials;
+import org.apache.stratos.adc.mgt.utils.PersistenceManager;
+
+/**
+ * 
+ * Exposes information related to internally created repositories  
+ * 
+ */
+public class RepositoryInformationService {
+
+	private static final Log log = LogFactory.getLog(RepositoryInformationService.class);
+
+	public String getRepositoryUrl(int tenantId, String cartridgeType) throws Exception {
+
+		String repoUrl = null;
+		try {
+			repoUrl = PersistenceManager.getRepoURL(tenantId, cartridgeType);
+		} catch (Exception e) {
+			String msg = "System Exception is occurred when retriving repo URL";
+			log.error(msg + ". Reason :" + e.getMessage());
+			throw new Exception(msg);
+		}
+		if (repoUrl == null) {
+			log.error("Repository URL is not successfully retrieved " + "for tenant [" + tenantId +
+			          "] and cartridge [" + cartridgeType + "] ");
+		}
+		return repoUrl;
+	}
+
+    public RepositoryCredentials getRepositoryCredentials(int tenantId, String cartridgeType, String alias) throws Exception {
+
+    	RepositoryCredentials repoCredentials = null;
+        try {
+        	repoCredentials = PersistenceManager.getRepoCredentials(tenantId,cartridgeType, alias);
+        } catch (Exception e) {
+            String msg = "System Exception is occurred when retrieving user credentials";
+            log.error(msg + ". Reason :" + e.getMessage());
+            throw new Exception(msg);
+        }
+        if (repoCredentials == null) {
+            log.error("Repository credentials are not successfully retrieved " + "for tenant [" + tenantId +
+                    "] and cartridge [" + cartridgeType + "] ");
+        }
+        return repoCredentials;
+    }
+}