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/10/15 18:13:43 UTC

[3/3] git commit: committing cartridge subscription model changes

committing cartridge subscription model changes


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

Branch: refs/heads/master
Commit: fce0c67dd1709675cd80510fdff17395dc8149c9
Parents: 221982e
Author: Isuru <is...@wso2.com>
Authored: Tue Oct 15 21:42:51 2013 +0530
Committer: Isuru <is...@wso2.com>
Committed: Tue Oct 15 21:42:51 2013 +0530

----------------------------------------------------------------------
 .../client/CloudControllerServiceClient.java    |  21 +-
 .../connector/CartridgeInstanceConnector.java   |  42 ++
 .../CartridgeInstanceConnectorFactory.java      |  41 ++
 .../data/DataCartridgeInstanceConnector.java    |  92 +++++
 .../adc/mgt/dao/CartridgeSubscription.java      |   2 +
 .../apache/stratos/adc/mgt/dao/Repository.java  |  59 ---
 .../adc/mgt/instance/CartridgeInstance.java     | 405 +++++++++++++++++++
 .../adc/mgt/instance/DataCartridgeInstance.java | 110 +++++
 .../instance/MultiTenantCartridgeInstance.java  | 134 ++++++
 .../instance/SingleTenantCartridgeInstance.java | 138 +++++++
 .../instance/cache/CartridgeInstanceCache.java  | 119 ++++++
 .../cache/CartridgeInstanceCacheKey.java        |  59 +++
 .../factory/CartridgeInstanceFactory.java       |  65 +++
 .../instance/utils/CartridgeInstanceUtils.java  | 240 +++++++++++
 .../manager/CartridgeSubscriptionManager.java   | 400 ++++++++++++++++++
 .../stratos/adc/mgt/payload/CarbonPayload.java  |  44 ++
 .../stratos/adc/mgt/payload/DataPayload.java    |  40 ++
 .../adc/mgt/payload/NonCarbonPayload.java       | 121 ++++++
 .../apache/stratos/adc/mgt/payload/Payload.java | 257 ++++++++++++
 .../stratos/adc/mgt/payload/PayloadArg.java     | 185 +++++++++
 .../stratos/adc/mgt/payload/PayloadFactory.java |  64 +++
 .../stratos/adc/mgt/repository/Repository.java  |  60 +++
 .../service/ApplicationManagementService.java   |  80 +++-
 .../stratos/adc/mgt/subscriber/Subscriber.java  |  64 +++
 .../mgt/utils/ApplicationManagementUtil.java    | 158 +++-----
 .../adc/mgt/utils/CartridgeConstants.java       |   3 +
 .../adc/mgt/utils/PersistenceManager.java       |  77 ++--
 .../adc/mgt/utils/RepositoryCreator.java        |   3 +-
 .../adc/mgt/utils/RepositoryFactory.java        |   5 +-
 .../adc/mgt/test/CartridgeInstanceTest.java     |  71 ++++
 .../stratos/adc/mgt/test/PayloadTest.java       | 195 +++++++++
 31 files changed, 3148 insertions(+), 206 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/client/CloudControllerServiceClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/client/CloudControllerServiceClient.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/client/CloudControllerServiceClient.java
index cc5bc62..cfd29c7 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/client/CloudControllerServiceClient.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/client/CloudControllerServiceClient.java
@@ -19,26 +19,27 @@
 
 package org.apache.stratos.adc.mgt.client;
 
-import java.rmi.RemoteException;
-
-import javax.activation.DataHandler;
-
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.adc.mgt.exception.UnregisteredCartridgeException;
 import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceStub;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException;
 import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
 import org.apache.stratos.cloud.controller.util.xsd.Properties;
 
+import javax.activation.DataHandler;
+import java.rmi.RemoteException;
+
 public class CloudControllerServiceClient {
 
 	private CloudControllerServiceStub stub;
 
 	private static final Log log = LogFactory.getLog(CloudControllerServiceClient.class);
+    private static volatile CloudControllerServiceClient serviceClient;
 
 	public CloudControllerServiceClient(String epr) throws AxisFault {
 
@@ -55,6 +56,18 @@ public class CloudControllerServiceClient {
 
 	}
 
+    public static CloudControllerServiceClient getServiceClient() throws AxisFault {
+        if (serviceClient == null) {
+            synchronized (CloudControllerServiceClient.class) {
+                if (serviceClient == null) {
+                    serviceClient = new CloudControllerServiceClient(
+                            System.getProperty(CartridgeConstants.AUTOSCALER_SERVICE_URL));
+                }
+            }
+        }
+        return serviceClient;
+    }
+
 	public boolean register(String domainName, String subDomain, String cartridgeType,
 	                        DataHandler payload, String tenantRange, String hostName, Properties properties) throws RemoteException, CloudControllerServiceUnregisteredCartridgeExceptionException
 	                                                                                  {		

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/CartridgeInstanceConnector.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/CartridgeInstanceConnector.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/CartridgeInstanceConnector.java
new file mode 100644
index 0000000..19389a4
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/CartridgeInstanceConnector.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.connector;
+
+import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.instance.CartridgeInstance;
+
+import java.util.Properties;
+
+public abstract class CartridgeInstanceConnector {
+
+    /**
+     * Connects two cartridge instances
+     *
+     * @param cartridgeInstance CartridgeInstance instance
+     * @param connectingCartridgeInstance CartridgeInstance instance that is connecting with cartridgeInstance
+     *
+     * @return Custom properties for the connection as a key value set
+     * @throws ADCException in case of an error
+     */
+    public abstract Properties createConnection (CartridgeInstance cartridgeInstance,
+                                                 CartridgeInstance connectingCartridgeInstance) throws ADCException;
+    public abstract Properties teminateConnection (CartridgeInstance cartridgeInstance,
+                                                   CartridgeInstance connectedCartridgeInstance) throws ADCException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/CartridgeInstanceConnectorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/CartridgeInstanceConnectorFactory.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/CartridgeInstanceConnectorFactory.java
new file mode 100644
index 0000000..61ca81c
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/CartridgeInstanceConnectorFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.connector;
+
+import org.apache.stratos.adc.mgt.connector.data.DataCartridgeInstanceConnector;
+import org.apache.stratos.adc.mgt.exception.ADCException;
+
+public class CartridgeInstanceConnectorFactory {
+
+    public static CartridgeInstanceConnector getCartridgeInstanceConnector (String type) throws ADCException {
+
+        CartridgeInstanceConnector cartridgeInstanceConnector = null;
+
+        if(type.equals("mysql")) {
+            cartridgeInstanceConnector = new DataCartridgeInstanceConnector();
+        }
+
+        if(cartridgeInstanceConnector == null) {
+            throw new ADCException("Unable to find matching CartridgeInstanceConnector for " + type);
+        }
+
+        return cartridgeInstanceConnector;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/data/DataCartridgeInstanceConnector.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/data/DataCartridgeInstanceConnector.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/data/DataCartridgeInstanceConnector.java
new file mode 100644
index 0000000..e9d35e6
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/connector/data/DataCartridgeInstanceConnector.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.connector.data;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.connector.CartridgeInstanceConnector;
+import org.apache.stratos.adc.mgt.dto.Cartridge;
+import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.exception.NotSubscribedException;
+import org.apache.stratos.adc.mgt.instance.CartridgeInstance;
+import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+
+import java.util.Properties;
+
+public class DataCartridgeInstanceConnector extends CartridgeInstanceConnector {
+
+    private static Log log = LogFactory.getLog(DataCartridgeInstanceConnector.class);
+
+    @Override
+    public Properties createConnection(CartridgeInstance cartridgeInstance,
+                                       CartridgeInstance connectingCartridgeInstance) throws ADCException {
+
+        //TODO: change the logic to do with topology information
+        log.info("Retrieving cartridge information for connecting ... alias : " +
+                connectingCartridgeInstance.getAlias() + ", Type: " + connectingCartridgeInstance.getType());
+
+        Properties connectionProperties = new Properties();
+
+        int maxAttempts = Integer.parseInt(System.getProperty(CartridgeConstants.MAX_ATTEMPTS, "50"));
+        int attempts = 0;
+        while (attempts < maxAttempts) {
+            attempts++;
+            Cartridge cartridge = null;
+            try {
+                cartridge = ApplicationManagementUtil.getCartridgeInfo(
+                        connectingCartridgeInstance.getAlias(),
+                        connectingCartridgeInstance.getSubscriber().getTenantDomain());
+
+            } catch (NotSubscribedException e) {
+                // This cannot happen here.
+            }
+            if (cartridge != null) {
+                if (!cartridge.getStatus().equals("ACTIVE")) {
+                    try {
+                        Thread.sleep(3000);
+                    } catch (InterruptedException ignore) {
+                    }
+                } else {
+                    connectionProperties.setProperty("MYSQL_HOST", cartridge.getIp());
+                    connectionProperties.setProperty("MYSQL_USER", cartridge.getDbUserName());
+                    connectionProperties.setProperty("MYSQL_PASSWORD", cartridge.getPassword());
+                    log.info("Connection information retrieved for " + cartridgeInstance + " and " +
+                            connectingCartridgeInstance);
+                    break;
+                }
+            }
+
+            if(attempts == maxAttempts) {
+                String errorMsg = "Failed to connect " + cartridgeInstance + " and " + connectingCartridgeInstance;
+                log.error(errorMsg);
+                throw  new ADCException(errorMsg);
+            }
+        }
+
+        return connectionProperties;
+    }
+
+    @Override
+    public Properties teminateConnection(CartridgeInstance cartridgeInstance,
+                                         CartridgeInstance connectedCartridgeInstance) throws ADCException {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/CartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/CartridgeSubscription.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/CartridgeSubscription.java
index 666dc00..be17cd7 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/CartridgeSubscription.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/CartridgeSubscription.java
@@ -19,6 +19,8 @@
 
 package org.apache.stratos.adc.mgt.dao;
 
+import org.apache.stratos.adc.mgt.repository.Repository;
+
 import java.util.List;
 
 public class CartridgeSubscription {

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/Repository.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/Repository.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/Repository.java
deleted file mode 100644
index 8f7adc9..0000000
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/dao/Repository.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one 
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
- * KIND, either express or implied.  See the License for the 
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.stratos.adc.mgt.dao;
-
-public class Repository {
-	private int repoId;
-	private String repoName;
-    private String repoUserName;
-    private String repoUserPassword;
-
-	public int getRepoId() {
-		return repoId;
-	}
-
-	public void setRepoId(int repoId) {
-		this.repoId = repoId;
-	}
-
-	public String getRepoName() {
-		return repoName;
-	}
-
-	public void setRepoName(String repoName) {
-		this.repoName = repoName;
-	}
-
-    public String getRepoUserName() {
-        return repoUserName;
-    }
-
-    public void setRepoUserName(String repoUserName) {
-        this.repoUserName=repoUserName;
-    }
-
-    public String getRepoUserPassword() {
-        return repoUserPassword;
-    }
-
-    public void setRepoUserPassword(String repoUserPassword) {
-        this.repoUserPassword=repoUserPassword;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/CartridgeInstance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/CartridgeInstance.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/CartridgeInstance.java
new file mode 100644
index 0000000..0d0c7d6
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/CartridgeInstance.java
@@ -0,0 +1,405 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.instance;
+
+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.Policy;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.payload.Payload;
+import org.apache.stratos.adc.mgt.payload.PayloadArg;
+import org.apache.stratos.adc.mgt.repository.Repository;
+import org.apache.stratos.adc.mgt.service.RepositoryInfoBean;
+import org.apache.stratos.adc.mgt.subscriber.Subscriber;
+import org.apache.stratos.adc.mgt.utils.*;
+import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+public abstract class CartridgeInstance {
+
+    private static Log log = LogFactory.getLog(CartridgeInstance.class);
+
+    private String type;
+    private String alias;
+    private String clusterDomain;
+    private String clusterSubDomain;
+    private String mgtClusterDomain;
+    private String mgtClusterSubDomain;
+    private String hostName;
+    private Policy autoscalingPolicy;
+    private Subscriber subscriber;
+    private Repository repository;
+    private CartridgeInfo cartridgeInfo;
+    private Payload payload;
+    private String mappedDomain;
+    private List<String> connectedCartridgeAliases;
+    //TODO:fixme : to be removed after designing the new DB schema
+    private int subscriptionId;
+
+    /**
+     * Constructor
+     *
+     * @param cartridgeInfo CartridgeInfo instance
+     */
+    public CartridgeInstance (CartridgeInfo cartridgeInfo) {
+
+        this.setCartridgeInfo(cartridgeInfo);
+        this.setType(cartridgeInfo.getType());
+        this.setClusterDomain("");
+        this.setClusterSubDomain(CartridgeConstants.DEFAULT_SUBDOMAIN);
+        this.setMgtClusterDomain("");
+        this.setMgtClusterSubDomain(CartridgeConstants.DEFAULT_MGT_SUBDOMAIN);
+        this.setHostName(cartridgeInfo.getHostName());
+        this.connectedCartridgeAliases = new ArrayList<String>();
+    }
+
+    /**
+     * Subscribes to this cartridge instance
+     *
+     * @param subscriber Subscriber instance
+     * @param alias Alias of the cartridge instance
+     * @param autoscalingPolicy Auto scaling policy
+     * @param repository Relevenat Repository instance
+     *
+     * @throws ADCException
+     * @throws PolicyException
+     * @throws UnregisteredCartridgeException
+     * @throws InvalidCartridgeAliasException
+     * @throws DuplicateCartridgeAliasException
+     * @throws RepositoryRequiredException
+     * @throws AlreadySubscribedException
+     * @throws RepositoryCredentialsRequiredException
+     * @throws InvalidRepositoryException
+     * @throws RepositoryTransportException
+     */
+    public void subscribe (Subscriber subscriber, String alias, Policy autoscalingPolicy,
+                                    Repository repository)
+            throws ADCException, PolicyException, UnregisteredCartridgeException, InvalidCartridgeAliasException,
+            DuplicateCartridgeAliasException, RepositoryRequiredException, AlreadySubscribedException,
+            RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException {
+
+        setSubscriber(subscriber);
+        setAlias(alias);
+        setAutoscalingPolicy(autoscalingPolicy);
+        setRepository(repository);
+    }
+
+    /**
+     * Unsubscribe from this cartridge instance
+     *
+     * @throws ADCException
+     * @throws NotSubscribedException
+     */
+    public abstract void unsubscribe () throws ADCException, NotSubscribedException;
+
+    /**
+     * Registers the subscription
+     *
+     * @param properties Any additional properties needed
+     *
+     * @return CartridgeSubscription instance populated with relevant data
+     * @throws ADCException
+     * @throws UnregisteredCartridgeException
+     */
+    public abstract CartridgeSubscription registerSubscription(Properties properties)
+            throws ADCException, UnregisteredCartridgeException;
+
+    /**
+     * Connect cartridges
+     *
+     * @param connectingCartridgeAlias Alias of connecting cartridge
+     */
+    public void connect (String connectingCartridgeAlias) {
+        connectedCartridgeAliases.add(connectingCartridgeAlias);
+    }
+
+    /**
+     * Disconnect from the cartridge instance given by disconnectingCartridgeAlias
+     *
+     * @param disconnectingCartridgeAlias Alias of the cartridge instance to disconnect
+     */
+    public void disconnect (String disconnectingCartridgeAlias) {
+        connectedCartridgeAliases.remove(disconnectingCartridgeAlias);
+    }
+
+    /**
+     * Creates the relevant payload parameters for this cartridge instance
+     *
+     * @return PayloadArg instance
+     * @throws ADCException in an errpr
+     */
+    public PayloadArg createPayloadParameters() throws ADCException {
+
+        PayloadArg payloadArg = new PayloadArg();
+        payloadArg.setCartridgeInfo(getCartridgeInfo());
+        payloadArg.setPolicy(getAutoscalingPolicy());
+        payloadArg.setMultitenant(getCartridgeInfo().getMultiTenant());
+        payloadArg.setTenantId(getSubscriber().getTenantId());
+        payloadArg.setTenantDomain(getSubscriber().getTenantDomain());
+        payloadArg.setCartridgeAlias(getAlias());
+        payloadArg.setServiceName(getCartridgeInfo().getType());
+
+        return payloadArg;
+    }
+
+    /**
+     * Manages the repository for the cartridge instance
+     *
+     * @param repoURL Repository URL
+     * @param repoUserName Repository Username
+     * @param repoUserPassword Repository password
+     * @param privateRepo public/private repository
+     * @param cartridgeAlias Alias of the cartridge instance
+     * @param cartridgeInfo CartridgeInfo instance
+     * @param tenantDomain Domain of the tenant
+     *
+     * @return Repository populated with relevant information or null of not repository is relevant to this cartridge
+     * instance
+     * @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(hostName);
+
+        try {
+            new RegistryManager().removeDomainMappingFromRegistry(hostName);
+
+        } 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, clusterDomain, clusterSubDomain);
+        try {
+            PersistenceManager.updateInstanceState("INACTIVE", ips, clusterDomain, clusterSubDomain, type);
+
+        } catch (Exception e) {
+            String errorMsg = "Error in updating state to INACTIVE";
+            log.error(errorMsg, e);
+        }
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public Subscriber getSubscriber() {
+        return subscriber;
+    }
+
+    public Repository getRepository() {
+        return repository;
+    }
+
+    public List<String> getConnectedCartridgeAliases () {
+        return connectedCartridgeAliases;
+    }
+
+    public CartridgeInfo getCartridgeInfo() {
+        return cartridgeInfo;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public String getClusterDomain() {
+        return clusterDomain;
+    }
+
+    public void setClusterDomain(String clusterDomain) {
+        this.clusterDomain = clusterDomain;
+    }
+
+    public String getClusterSubDomain() {
+        return clusterSubDomain;
+    }
+
+    public void setClusterSubDomain(String clusterSubDomain) {
+        this.clusterSubDomain = clusterSubDomain;
+    }
+
+    public String getMgtClusterDomain() {
+        return mgtClusterDomain;
+    }
+
+    public void setMgtClusterDomain(String mgtClusterDomain) {
+        this.mgtClusterDomain = mgtClusterDomain;
+    }
+
+    public String getMgtClusterSubDomain() {
+        return mgtClusterSubDomain;
+    }
+
+    public void setMgtClusterSubDomain(String mgtClusterSubDomain) {
+        this.mgtClusterSubDomain = mgtClusterSubDomain;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public Policy getAutoscalingPolicy() {
+        return autoscalingPolicy;
+    }
+
+    public void setAutoscalingPolicy(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 getPayload() {
+        return payload;
+    }
+
+    public void setPayload(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;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/DataCartridgeInstance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/DataCartridgeInstance.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/DataCartridgeInstance.java
new file mode 100644
index 0000000..f441de4
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/DataCartridgeInstance.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.instance;
+
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.dao.DataCartridge;
+import org.apache.stratos.adc.mgt.dto.Policy;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.payload.PayloadArg;
+import org.apache.stratos.adc.mgt.repository.Repository;
+import org.apache.stratos.adc.mgt.subscriber.Subscriber;
+import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+import java.util.Properties;
+
+public class DataCartridgeInstance extends SingleTenantCartridgeInstance {
+
+    protected String host;
+    protected String username;
+    protected String password;
+
+    public DataCartridgeInstance(CartridgeInfo cartridgeInfo) {
+
+        super(cartridgeInfo);
+        this.host = "localhost";
+        this.username = CartridgeConstants.MYSQL_DEFAULT_USER;
+        this.password = ApplicationManagementUtil.generatePassword();
+    }
+
+    @Override
+    public void subscribe(Subscriber subscriber, String alias, Policy autoscalingPolicy, Repository repository)
+
+            throws InvalidCartridgeAliasException,
+            DuplicateCartridgeAliasException, ADCException, RepositoryCredentialsRequiredException,
+            RepositoryTransportException, UnregisteredCartridgeException, AlreadySubscribedException,
+            RepositoryRequiredException, InvalidRepositoryException, PolicyException {
+
+        super.subscribe(subscriber, alias, autoscalingPolicy, repository);
+    }
+
+    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;
+    }
+
+    public PayloadArg createPayloadParameters() throws ADCException {
+
+        PayloadArg payloadArg = super.createPayloadParameters();
+        payloadArg.setDataCartridgeHost(this.getHost());
+        payloadArg.setDataCartridgeAdminUser(username);
+        payloadArg.setDataCartridgeAdminPassword(password);
+
+        return payloadArg;
+    }
+
+    public CartridgeSubscription registerSubscription(Properties payloadProperties)
+            throws ADCException, UnregisteredCartridgeException {
+
+        ApplicationManagementUtil.registerService(getType(),
+                getClusterDomain(),
+                getClusterSubDomain(),
+                getPayload().createPayload(),
+                getPayload().getPayloadArg().getTenantRange(),
+                getHostName(),
+                ApplicationManagementUtil.setRegisterServiceProperties(getAutoscalingPolicy(),
+                        getSubscriber().getTenantId(), getAlias()));
+
+        getPayload().delete();
+
+        DataCartridge dataCartridge = new DataCartridge();
+        dataCartridge.setUserName(username);
+        dataCartridge.setPassword(password);
+        dataCartridge.setDataCartridgeType(getType());
+
+        return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(),
+                getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
+                getRepository(), getHostName(), getClusterDomain(), getClusterSubDomain(),
+                getMgtClusterDomain(), getMgtClusterSubDomain(), dataCartridge, "PENDING");
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/MultiTenantCartridgeInstance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/MultiTenantCartridgeInstance.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/MultiTenantCartridgeInstance.java
new file mode 100644
index 0000000..b4a51b0
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/MultiTenantCartridgeInstance.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.instance;
+
+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.dto.Policy;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.adc.mgt.payload.PayloadArg;
+import org.apache.stratos.adc.mgt.repository.Repository;
+import org.apache.stratos.adc.mgt.subscriber.Subscriber;
+import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
+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.apache.stratos.adc.topology.mgt.serviceobjects.DomainContext;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+import java.util.Properties;
+
+public class MultiTenantCartridgeInstance extends CartridgeInstance {
+
+    private static Log log = LogFactory.getLog(MultiTenantCartridgeInstance.class);
+
+    public MultiTenantCartridgeInstance(CartridgeInfo cartridgeInfo) {
+        super(cartridgeInfo);
+    }
+
+    @Override
+    public void subscribe(Subscriber subscriber, String alias, Policy autoscalingPolicy, Repository repository)
+
+            throws InvalidCartridgeAliasException,
+            DuplicateCartridgeAliasException, ADCException, AlreadySubscribedException,
+            RepositoryCredentialsRequiredException, RepositoryTransportException, UnregisteredCartridgeException,
+            InvalidRepositoryException, RepositoryRequiredException, PolicyException {
+
+        super.subscribe(subscriber, alias, autoscalingPolicy, repository);
+
+        boolean allowMultipleSubscription = Boolean.
+                valueOf(System.getProperty(CartridgeConstants.FEATURE_MULTI_TENANT_MULTIPLE_SUBSCRIPTION_ENABLED));
+
+        if (!allowMultipleSubscription) {
+            // If the cartridge is multi-tenant. We should not let users subscribe twice.
+            boolean subscribed;
+            try {
+                subscribed = PersistenceManager.isAlreadySubscribed(getType(), subscriber.getTenantId());
+            } catch (Exception e) {
+                String msg = "Error checking whether the cartridge type " + getType()
+                        + " is already subscribed";
+                log.error(msg, e);
+                throw new ADCException(msg, e);
+            }
+
+            if (subscribed) {
+                String msg = "Already subscribed to " + getType()
+                        + ". This multi-tenant cartridge will not be available to subscribe";
+                if (log.isDebugEnabled()) {
+                    log.debug(msg);
+                }
+                throw new AlreadySubscribedException(msg, getType());
+            }
+        }
+
+        TopologyManagementService topologyService = DataHolder.getTopologyMgtService();
+        DomainContext[] domainContexts = topologyService.getDomainsAndSubdomains(getType(), subscriber.getTenantId());
+        log.info("Retrieved " + domainContexts.length + " domain and corresponding subdomain pairs");
+
+        if (domainContexts.length > 0) {
+            if(domainContexts.length > 2) {
+                if(log.isDebugEnabled())
+                    log.debug("Too many domain sub domain pairs");
+            }
+
+            for (DomainContext domainContext : domainContexts) {
+                if (domainContext.getSubDomain().equalsIgnoreCase("mgt")) {
+                    setMgtClusterDomain(domainContext.getDomain());
+                    setMgtClusterSubDomain(domainContext.getSubDomain());
+                } else {
+                    setClusterDomain(domainContext.getDomain());
+                    setClusterSubDomain(domainContext.getSubDomain());
+                }
+            }
+        } else {
+            String msg = "Domain contexts not found for " + getType() + " and tenant id " + subscriber.getTenantId();
+            log.warn(msg);
+            throw new ADCException(msg);
+        }
+    }
+
+    @Override
+    public void unsubscribe() throws ADCException, NotSubscribedException {
+
+        log.info("Cartridge with alias " + getAlias() + ", and type " + getType() +
+                " is a multi-tenant cartridge and therefore will not terminate all instances and " +
+                "unregister services");
+
+        super.cleanupSubscription();
+    }
+
+    @Override
+    public CartridgeSubscription registerSubscription(Properties properties) {
+
+        return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(),
+                getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
+                getRepository(), getHostName(), getClusterDomain(), getClusterSubDomain(),
+                getMgtClusterDomain(), getMgtClusterSubDomain(), null, "PENDING");
+    }
+
+    @Override
+    public PayloadArg createPayloadParameters() {
+
+        return null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/SingleTenantCartridgeInstance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/SingleTenantCartridgeInstance.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/SingleTenantCartridgeInstance.java
new file mode 100644
index 0000000..8b27657
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/SingleTenantCartridgeInstance.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.instance;
+
+import org.apache.axis2.AxisFault;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.client.CloudControllerServiceClient;
+import org.apache.stratos.adc.mgt.dao.CartridgeSubscription;
+import org.apache.stratos.adc.mgt.dto.Policy;
+import org.apache.stratos.adc.mgt.exception.*;
+import org.apache.stratos.adc.mgt.payload.PayloadArg;
+import org.apache.stratos.adc.mgt.repository.Repository;
+import org.apache.stratos.adc.mgt.subscriber.Subscriber;
+import org.apache.stratos.adc.mgt.utils.ApplicationManagementUtil;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+import java.util.Properties;
+
+public class SingleTenantCartridgeInstance extends CartridgeInstance {
+
+    private static Log log = LogFactory.getLog(SingleTenantCartridgeInstance.class);
+
+
+    public SingleTenantCartridgeInstance(CartridgeInfo cartridgeInfo) {
+        super(cartridgeInfo);
+    }
+
+    @Override
+    public void subscribe(Subscriber subscriber, String alias, Policy autoscalingPolicy,
+                                           Repository repository) throws
+            InvalidCartridgeAliasException, DuplicateCartridgeAliasException, ADCException,
+            RepositoryCredentialsRequiredException, RepositoryTransportException, UnregisteredCartridgeException,
+            AlreadySubscribedException, RepositoryRequiredException, InvalidRepositoryException, PolicyException {
+
+        super.subscribe(subscriber, alias, autoscalingPolicy, repository);
+        setClusterDomain(alias + "." + getHostName() + "." + getType() + ".domain");
+        setHostName(alias + "." + getHostName());
+    }
+
+    @Override
+    public CartridgeSubscription registerSubscription(Properties payloadProperties)
+            throws ADCException, UnregisteredCartridgeException {
+
+        ApplicationManagementUtil.registerService(getType(),
+                getClusterDomain(),
+                getClusterSubDomain(),
+                getPayload().createPayload(),
+                getPayload().getPayloadArg().getTenantRange(),
+                getHostName(),
+                null);
+
+        getPayload().delete();
+
+        return ApplicationManagementUtil.createCartridgeSubscription(getCartridgeInfo(), getAutoscalingPolicy(),
+                getType(), getAlias(), getSubscriber().getTenantId(), getSubscriber().getTenantDomain(),
+                getRepository(), getHostName(), getClusterDomain(), getClusterSubDomain(),
+                getMgtClusterDomain(), getMgtClusterSubDomain(), null, "PENDING");
+    }
+
+    @Override
+    public void unsubscribe() throws ADCException, NotSubscribedException {
+
+        try {
+            CloudControllerServiceClient.getServiceClient().terminateAllInstances(getClusterDomain(),
+                    getClusterSubDomain());
+
+        } catch (AxisFault e) {
+            String errorMsg = "Error in terminating cartridge instance, alias " + getAlias();
+            log.error(errorMsg);
+            throw new ADCException(errorMsg, e);
+
+        } catch (Exception e) {
+            String errorMsg = "Error in terminating cartridge instance, alias " + getAlias();
+            log.error(errorMsg);
+            throw new ADCException(errorMsg, e);
+        }
+
+        log.info("Terminated all instances of " + getClusterDomain() + " " + getClusterSubDomain());
+
+        try {
+            CloudControllerServiceClient.getServiceClient().unregisterService(getClusterDomain(),
+                    getClusterSubDomain());
+
+        } catch (Exception e) {
+            String errorMsg = "Error in unregistering service cluster with domain " + getClusterDomain() +
+                    ", sub domain " + getClusterSubDomain();
+            log.error(errorMsg);
+            throw new ADCException(errorMsg, e);
+        }
+
+        log.info("Unregistered service cluster, domain " + getClusterDomain() + ", sub domain " +
+                getClusterSubDomain());
+
+        cleanupSubscription();
+    }
+
+    @Override
+    public PayloadArg createPayloadParameters()
+            throws ADCException {
+
+        PayloadArg payloadArg = super.createPayloadParameters();
+        if(getRepository() != null) {
+            payloadArg.setRepoURL(getRepository().getUrl());
+        }
+        payloadArg.setHostName(getHostName());
+        payloadArg.setServiceDomain(getClusterDomain());
+        payloadArg.setServiceSubDomain(getMgtClusterSubDomain());
+        payloadArg.setMgtServiceDomain(getMgtClusterDomain());
+        payloadArg.setMgtServiceSubDomain(getMgtClusterSubDomain());
+        if(getCartridgeInfo().getProvider().equals(CartridgeConstants.PROVIDER_NAME_WSO2)) {
+            payloadArg.setTenantRange(Integer.toString(getSubscriber().getTenantId()));
+        }
+        else {
+            payloadArg.setTenantRange("*");
+        }
+
+        return payloadArg;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/cache/CartridgeInstanceCache.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/cache/CartridgeInstanceCache.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/cache/CartridgeInstanceCache.java
new file mode 100644
index 0000000..f9a4cdb
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/cache/CartridgeInstanceCache.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.instance.cache;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.instance.CartridgeInstance;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class CartridgeInstanceCache {
+
+    private static final Log log = LogFactory.getLog(CartridgeInstanceCache.class);
+
+    private Map<CartridgeInstanceCacheKey, CartridgeInstance> cartridgeInstanceKeyToCartridgeInstance;
+    private final Map<Integer, List<CartridgeInstance>> tenantIdToCartridgeInstance;
+
+    private static CartridgeInstanceCache cartridgeInstanceCache;
+
+    private CartridgeInstanceCache() {
+        cartridgeInstanceKeyToCartridgeInstance = new ConcurrentHashMap<CartridgeInstanceCacheKey,
+                CartridgeInstance>();
+        tenantIdToCartridgeInstance = new ConcurrentHashMap<Integer, List<CartridgeInstance>>();
+    }
+
+    public static CartridgeInstanceCache getCartridgeInstanceCache()  {
+
+        if (cartridgeInstanceCache == null) {
+            synchronized(CartridgeInstanceCache.class) {
+                if (cartridgeInstanceCache == null)  {
+                    cartridgeInstanceCache = new CartridgeInstanceCache();
+                }
+            }
+        }
+        return cartridgeInstanceCache;
+    }
+
+    public void addCartridgeInstances (int tenantId, List<CartridgeInstance> cartridgeInstances) {
+
+        //tenantIdToCartridgeInstance.put(tenantId, cartridgeInstances);
+        for(CartridgeInstance cartridgeInstance : cartridgeInstances) {
+            addCartridgeInstance(new CartridgeInstanceCacheKey(tenantId, cartridgeInstance.getAlias()),
+                    cartridgeInstance);
+        }
+    }
+
+    public void addCartridgeInstance(CartridgeInstanceCacheKey cartridgeInstanceCacheKey,
+                                     CartridgeInstance cartridgeInstance) {
+
+        cartridgeInstanceKeyToCartridgeInstance.put(cartridgeInstanceCacheKey, cartridgeInstance);
+
+        List<CartridgeInstance> cartridgeInstances = tenantIdToCartridgeInstance.get(cartridgeInstanceCacheKey.
+                getTenantId());
+        if(cartridgeInstances != null) {
+            cartridgeInstances.add(cartridgeInstance);
+        }
+        else {
+            cartridgeInstances = new Vector<CartridgeInstance>();
+            cartridgeInstances.add(cartridgeInstance);
+            tenantIdToCartridgeInstance.put(cartridgeInstanceCacheKey.getTenantId(), cartridgeInstances);
+        }
+
+        log.info("Added tenant " + cartridgeInstanceCacheKey.getTenantId() + "'s cartridge instance with alias " +
+                cartridgeInstanceCacheKey.getCartridgeInstanceAlias() + " to the cache");
+    }
+
+    public CartridgeInstance getCartridgeInstance (CartridgeInstanceCacheKey cartridgeInstanceCacheKey) {
+
+        return cartridgeInstanceKeyToCartridgeInstance.get(cartridgeInstanceCacheKey);
+    }
+
+    public List<CartridgeInstance> getCartridgeInstances (int tenantId) {
+
+        return tenantIdToCartridgeInstance.get(tenantId);
+    }
+
+    public boolean alreadyExists (CartridgeInstanceCacheKey cartridgeInstanceCacheKey) {
+
+        return cartridgeInstanceKeyToCartridgeInstance.containsKey(cartridgeInstanceCacheKey);
+    }
+
+    public void removeCartridgeInstances (int tenantId) {
+
+        List<CartridgeInstance> cartridgeInstances = tenantIdToCartridgeInstance.get(tenantId);
+        for (CartridgeInstance cartridgeInstance : cartridgeInstances) {
+            removeCartridgeInstance(new CartridgeInstanceCacheKey(tenantId, cartridgeInstance.getAlias()));
+        }
+    }
+
+    public void removeCartridgeInstance (CartridgeInstanceCacheKey cartridgeInstanceCacheKey) {
+
+        if (cartridgeInstanceKeyToCartridgeInstance.remove(cartridgeInstanceCacheKey) != null &&
+        tenantIdToCartridgeInstance.remove(cartridgeInstanceCacheKey.getTenantId()) != null) {
+
+            log.info("Removed tenant " + cartridgeInstanceCacheKey.getTenantId() + "'s cartridge instance with alias " +
+                    cartridgeInstanceCacheKey.getCartridgeInstanceAlias() + " from the cache");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/cache/CartridgeInstanceCacheKey.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/cache/CartridgeInstanceCacheKey.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/cache/CartridgeInstanceCacheKey.java
new file mode 100644
index 0000000..480db2c
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/cache/CartridgeInstanceCacheKey.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.instance.cache;
+
+public class CartridgeInstanceCacheKey {
+
+    private int tenantId;
+    private String cartridgeAlias;
+
+    public CartridgeInstanceCacheKey (int tenantId, String cartridgeAlias) {
+
+        this.tenantId = tenantId;
+        this.cartridgeAlias = cartridgeAlias;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getCartridgeInstanceAlias() {
+        return cartridgeAlias;
+    }
+
+    public boolean equals (Object object) {
+
+        if(object == this) {
+            return true;
+        }
+        else if (object == null || !(object instanceof CartridgeInstanceCacheKey)) {
+            return false;
+        }
+
+        CartridgeInstanceCacheKey subscriptionKey = (CartridgeInstanceCacheKey)object;
+        return this.getCartridgeInstanceAlias().equals(subscriptionKey.getCartridgeInstanceAlias()) &&
+                this.getTenantId() == subscriptionKey.getTenantId();
+    }
+
+    public int hashCode () {
+
+        return getCartridgeInstanceAlias().hashCode() + Integer.toString(getTenantId()).hashCode();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/factory/CartridgeInstanceFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/factory/CartridgeInstanceFactory.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/factory/CartridgeInstanceFactory.java
new file mode 100644
index 0000000..c4ab89a
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/factory/CartridgeInstanceFactory.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.instance.factory;
+
+import org.apache.stratos.adc.mgt.exception.ADCException;
+import org.apache.stratos.adc.mgt.instance.CartridgeInstance;
+import org.apache.stratos.adc.mgt.instance.DataCartridgeInstance;
+import org.apache.stratos.adc.mgt.instance.MultiTenantCartridgeInstance;
+import org.apache.stratos.adc.mgt.instance.SingleTenantCartridgeInstance;
+import org.apache.stratos.adc.mgt.utils.CartridgeConstants;
+import org.apache.stratos.cloud.controller.util.xsd.CartridgeInfo;
+
+public class CartridgeInstanceFactory {
+
+    /**
+     * Returns the relevant CartridgeInstance object for the given criteria
+     *
+     * @param cartridgeInfo CartridgeInfo instance
+     * @return CartridgeInstance instance
+     * @throws ADCException if no matching criteria is there to create a CartridgeInstance object
+     */
+    public static CartridgeInstance getCartridgeInstance (CartridgeInfo cartridgeInfo)
+            throws ADCException {
+
+        CartridgeInstance cartridgeInstance = null;
+        if(cartridgeInfo.getMultiTenant()) {
+            cartridgeInstance = new MultiTenantCartridgeInstance(cartridgeInfo);
+
+        } else {
+            if(cartridgeInfo.getType().equals(CartridgeConstants.MYSQL_CARTRIDGE_NAME)) {
+                cartridgeInstance = new DataCartridgeInstance(cartridgeInfo);
+            }
+            else if (cartridgeInfo.getType().equals(CartridgeConstants.PHP_CARTRIDGE_NAME)) {
+                cartridgeInstance = new SingleTenantCartridgeInstance(cartridgeInfo);
+            }
+            else if (cartridgeInfo.getType().equals(CartridgeConstants.TOMCAT_CARTRIDGE_NAME)) {
+                cartridgeInstance = new SingleTenantCartridgeInstance(cartridgeInfo);
+            }
+        }
+
+        if(cartridgeInstance == null) {
+            throw new ADCException("Unable to find matching CartridgeInstance for "
+                    + cartridgeInfo);
+        }
+
+        return cartridgeInstance;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/fce0c67d/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/utils/CartridgeInstanceUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/utils/CartridgeInstanceUtils.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/utils/CartridgeInstanceUtils.java
new file mode 100644
index 0000000..40f151f
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/instance/utils/CartridgeInstanceUtils.java
@@ -0,0 +1,240 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.instance.utils;
+
+public class CartridgeInstanceUtils {
+    /*
+    private static Log log = LogFactory.getLog(CartridgeInstanceUtils.class);
+
+    public static void validateCartridgeAlias(String alias, String cartridgeType) throws InvalidCartridgeAliasException,
+            DuplicateCartridgeAliasException, ADCException {
+
+        // Do not use quotes in messages, current UI JavaScript does not work if there are quotes
+        // TODO: Fix message display in UI
+        String patternString = "([a-z0-9]+([-][a-z0-9])*)+";
+        Pattern pattern = Pattern.compile(patternString);
+
+        if (!pattern.matcher(alias).matches()) {
+            String msg = "The alias " + alias + " can contain only alpha-numeric lowercase characters. Please enter a valid alias.";
+            log.error(msg);
+            throw new InvalidCartridgeAliasException(msg, cartridgeType, alias);
+        }
+
+        boolean isAliasTaken = false;
+        try {
+            isAliasTaken = PersistenceManager.isAliasAlreadyTaken(alias, cartridgeType);
+        } catch (Exception e) {
+            String msg = "Exception : " + e.getMessage();
+            log.error(msg, e);
+            throw new ADCException("Error when checking alias is already taken", e);
+        }
+
+        if (isAliasTaken) {
+            String msg = "The alias " + alias + " is already taken. Please try again with a different alias.";
+            log.error(msg);
+            throw new DuplicateCartridgeAliasException(msg, cartridgeType, alias);
+        }
+    }
+
+    public static String generatePassword() {
+
+        final int PASSWORD_LENGTH = 8;
+        StringBuffer sb = new StringBuffer();
+        for (int x = 0; x < PASSWORD_LENGTH; x++) {
+            sb.append((char) ((int) (Math.random() * 26) + 97));
+        }
+        return sb.toString();
+
+    }
+
+    public static CartridgeSubscription createCartridgeSubscription(CartridgeInfo cartridgeInfo,
+                                                                     Policy policy,
+                                                                     String cartridgeType,
+                                                                     String cartridgeAlias,
+                                                                     int tenantId,
+                                                                     String tenantDomain,
+                                                                     Repository repository,
+                                                                     String clusterDomain,
+                                                                     String clusterSubDomain,
+                                                                     String hostName,
+                                                                     String mgtClusterDomain,
+                                                                     String mgtClusterSubDomain,
+                                                                     DataCartridge dataCartridge) {
+
+        CartridgeSubscription cartridgeSubscription = new CartridgeSubscription();
+        cartridgeSubscription.setCartridge(cartridgeType);
+        cartridgeSubscription.setAlias(cartridgeAlias);
+        cartridgeSubscription.setClusterDomain(clusterDomain);
+        cartridgeSubscription.setClusterSubdomain(clusterSubDomain);
+        cartridgeSubscription.setMgtClusterDomain(mgtClusterDomain);
+        cartridgeSubscription.setMgtClusterSubDomain(mgtClusterSubDomain);
+        cartridgeSubscription.setHostName(hostName);
+        cartridgeSubscription.setPolicy(policy.getName());
+        cartridgeSubscription.setRepository(repository);
+        cartridgeSubscription.setPortMappings(createPortMappings(cartridgeInfo));
+        cartridgeSubscription.setProvider(cartridgeInfo.getProvider());
+        cartridgeSubscription.setDataCartridge(dataCartridge);
+        cartridgeSubscription.setTenantId(tenantId);
+        cartridgeSubscription.setTenantDomain(tenantDomain);
+        cartridgeSubscription.setBaseDirectory(cartridgeInfo.getBaseDir());
+        cartridgeSubscription.setState("PENDING");
+
+        return cartridgeSubscription;
+    }
+
+    private static List<PortMapping> createPortMappings(CartridgeInfo cartridgeInfo) {
+        List<PortMapping> portMappings = new ArrayList<PortMapping>();
+
+        if (cartridgeInfo.getPortMappings() != null) {
+            for (org.apache.stratos.cloud.controller.util.xsd.PortMapping portMapping : cartridgeInfo.getPortMappings()) {
+                PortMapping portMap = new PortMapping();
+                portMap.setPrimaryPort(portMapping.getPort());
+                portMap.setProxyPort(portMapping.getProxyPort());
+                portMap.setType(portMapping.getProtocol());
+                portMappings.add(portMap);
+            }
+        }
+        return portMappings;
+    }
+
+    public static void addDNSEntry(String alias, String cartridgeType) {
+        new DNSManager().addNewSubDomain(alias + "." + cartridgeType, System.getProperty(CartridgeConstants.ELB_IP));
+    }
+
+    public static SubscriptionInfo createSubscriptionResponse(CartridgeSubscription cartridgeSubscription, Repository repository) {
+        SubscriptionInfo subscriptionInfo = new SubscriptionInfo();
+
+        if (repository != null && repository.getUrl() != null) {
+            subscriptionInfo.setRepositoryURL(convertRepoURL(repository.getUrl()));
+        }
+        subscriptionInfo.setHostname(cartridgeSubscription.getHostName());
+
+        return subscriptionInfo;
+    }
+
+    private static String convertRepoURL(String gitURL) {
+        String convertedHttpURL = null;
+        if (gitURL != null && gitURL.startsWith("git@")) {
+            StringBuilder httpRepoUrl = new StringBuilder();
+            httpRepoUrl.append("http://");
+            String[] urls = gitURL.split(":");
+            String[] hostNameArray = urls[0].split("@");
+            String hostName = hostNameArray[1];
+            httpRepoUrl.append(hostName).append("/").append(urls[1]);
+            convertedHttpURL = httpRepoUrl.toString();
+        } else if (gitURL != null && gitURL.startsWith("http")) {
+            convertedHttpURL = gitURL;
+        }
+        return convertedHttpURL;
+    }
+
+    public static RepositoryInformation validateRepository(String repoURL, String repoUsername, String repoPassword,
+                                                           boolean privateRepo, boolean testConnection)
+
+            throws RepositoryRequiredException, ADCException,
+            RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException {
+
+        RepositoryInformation repositoryInformation = new RepositoryInformation();
+        repositoryInformation.setRepoURL(repoURL);
+        if (log.isDebugEnabled()) {
+            log.debug("Validating Git Repository");
+        }
+
+        if (repoURL == null || repoURL.trim().length() == 0) {
+            throw new RepositoryRequiredException("External repository required for subscription");
+        }
+
+        if (repoURL != null && repoURL.trim().length() > 0 && privateRepo) {
+            if (log.isDebugEnabled()) {
+                log.debug("External repo validation is a private repo: " + repoURL);
+            }
+            if (repoUsername == null || repoUsername.trim().length() == 0 || repoPassword == null
+                    || repoPassword.trim().length() == 0) {
+                throw new RepositoryCredentialsRequiredException(
+                        "Username and Password are required for private repository");
+            }
+        }
+
+        if (!testConnection) {
+            if (log.isDebugEnabled()) {
+                log.debug("External repo validation is not enabled");
+            }
+            return repositoryInformation;
+        }
+
+        if (repoURL == null || repoURL.trim().length() == 0) {
+            // This means, no repo to validate.
+            return repositoryInformation;
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("External repo validation enabled");
+        }
+
+        // This assumes running on Linux.
+        String parentDirName = "/tmp/" + UUID.randomUUID().toString();
+        CredentialsProvider credentialsProvider = null;
+        if (repoUsername != null && repoUsername.trim().length() > 0 && repoPassword != null
+                && repoPassword.trim().length() > 0) {
+            if (log.isDebugEnabled()) {
+                log.debug("External repo credentails are passed: " + repoUsername);
+            }
+            credentialsProvider = new UsernamePasswordCredentialsProvider(repoUsername, repoPassword.toCharArray());
+        }
+
+        // Initialize temp local file repo
+        FileRepository localRepo = null;
+        try {
+            File f = new File(parentDirName + "/.git");
+            localRepo = new FileRepository(f);
+            if (log.isDebugEnabled()) {
+                log.debug("Local File Repo: " + f.getAbsoluteFile());
+            }
+        } catch (IOException e) {
+            throw new ADCException("Error creating local file repo", e);
+        }
+
+        Git git = new Git(localRepo);
+        LsRemoteCommand cmd = git.lsRemote().setRemote(repoURL);
+        if (credentialsProvider != null) {
+            cmd.setCredentialsProvider(credentialsProvider);
+        }
+        try {
+            Collection<Ref> collection = cmd.call();
+            List<String> refNames = new ArrayList<String>();
+            if (collection != null) {
+                for (Ref ref : collection) {
+                    if (log.isDebugEnabled()) {
+                        log.debug(repoURL + ": " + ref.getName());
+                    }
+                    refNames.add(ref.getName());
+                }
+            }
+            repositoryInformation.setRefName(refNames.toArray(new String[refNames.size()]));
+        } catch (InvalidRemoteException e) {
+            throw new InvalidRepositoryException("Provided repository url is not valid", e);
+        } catch (TransportException e) {
+            throw new RepositoryTransportException("Transport error when checking remote repository", e);
+        } catch (GitAPIException e) {
+            throw new ADCException("Git API error when checking remote repository", e);
+        }
+        return repositoryInformation;
+    }*/
+}