You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2014/05/05 17:18:19 UTC

[2/2] git commit: Added application alias to subscription domain to manage virtual host setup in cartridge instance

Added application alias to subscription domain to manage virtual host setup in cartridge instance


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

Branch: refs/heads/master
Commit: 70ed85714e19ea8e6f4e937f720cdda26b8dd6c2
Parents: e0da580
Author: Imesh Gunaratne <im...@apache.org>
Authored: Mon May 5 20:47:23 2014 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Mon May 5 20:47:23 2014 +0530

----------------------------------------------------------------------
 .../stratos/cartridge/agent/CartridgeAgent.java | 36 +++++++
 .../agent/util/CartridgeAgentConstants.java     |  2 +
 .../cartridge/agent/util/ExtensionUtils.java    | 32 ++++++-
 .../LoadBalancerTenantEventReceiver.java        | 61 ++++++------
 .../context/LoadBalancerContextUtil.java        | 58 ++++++------
 .../manager/CartridgeSubscriptionManager.java   | 68 +++++++-------
 .../publisher/TenantSynzhronizerTask.java       |  7 +-
 .../subscription/CartridgeSubscription.java     | 32 ++++---
 .../subscription/SubscriptionDomain.java        | 46 +++++++++
 .../utils/CartridgeSubscriptionUtils.java       | 10 +-
 .../messaging/domain/tenant/Subscription.java   | 38 +++++---
 .../domain/tenant/SubscriptionDomain.java       | 41 ++++++++
 .../tenant/SubscriptionDomainAddedEvent.java    | 67 +++++++++++++
 .../tenant/SubscriptionDomainRemovedEvent.java  | 60 ++++++++++++
 .../tenant/SubscriptionDomainsAddedEvent.java   | 60 ------------
 .../tenant/SubscriptionDomainsRemovedEvent.java | 60 ------------
 .../event/tenant/TenantSubscribedEvent.java     |  8 +-
 ...SubscriptionDomainAddedMessageProcessor.java | 98 ++++++++++++++++++++
 ...bscriptionDomainRemovedMessageProcessor.java | 97 +++++++++++++++++++
 ...ubscriptionDomainsAddedMessageProcessor.java | 96 -------------------
 ...scriptionDomainsRemovedMessageProcessor.java | 96 -------------------
 .../tenant/TenantMessageProcessorChain.java     | 16 ++--
 .../TenantSubscribedMessageProcessor.java       |  7 +-
 .../messaging/test/TenantDomainTest.java        |  2 +-
 .../rest/endpoint/bean/CartridgeInfoBean.java   |  6 --
 .../bean/SubscriptionDomainRequest.java         | 19 +++-
 .../rest/endpoint/services/ServiceUtils.java    |  7 +-
 .../rest/endpoint/services/StratosAdmin.java    | 16 ++--
 28 files changed, 662 insertions(+), 484 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java
index e4ddaed..cc1687e 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java
@@ -38,10 +38,15 @@ import org.apache.stratos.messaging.event.Event;
 import org.apache.stratos.messaging.event.instance.notifier.ArtifactUpdatedEvent;
 import org.apache.stratos.messaging.event.instance.notifier.InstanceCleanupClusterEvent;
 import org.apache.stratos.messaging.event.instance.notifier.InstanceCleanupMemberEvent;
+import org.apache.stratos.messaging.event.tenant.SubscriptionDomainAddedEvent;
+import org.apache.stratos.messaging.event.tenant.SubscriptionDomainRemovedEvent;
 import org.apache.stratos.messaging.listener.instance.notifier.ArtifactUpdateEventListener;
 import org.apache.stratos.messaging.listener.instance.notifier.InstanceCleanupClusterEventListener;
 import org.apache.stratos.messaging.listener.instance.notifier.InstanceCleanupMemberEventListener;
+import org.apache.stratos.messaging.listener.tenant.SubscriptionDomainsAddedEventListener;
+import org.apache.stratos.messaging.listener.tenant.SubscriptionDomainsRemovedEventListener;
 import org.apache.stratos.messaging.message.receiver.instance.notifier.InstanceNotifierEventReceiver;
+import org.apache.stratos.messaging.message.receiver.tenant.TenantEventReceiver;
 
 import java.util.List;
 import java.util.concurrent.Executors;
@@ -156,6 +161,37 @@ public class CartridgeAgent implements Runnable {
         });
         Thread eventReceiverThread = new Thread(eventReceiver);
         eventReceiverThread.start();
+        if(log.isInfoEnabled()) {
+            log.info("Instance notifier event message receiver thread started");
+        }
+
+        if(log.isDebugEnabled()) {
+            log.debug("Starting tenant event message receiver thread");
+        }
+        TenantEventReceiver tenantEventReceiver = new TenantEventReceiver();
+
+        tenantEventReceiver.addEventListener(new SubscriptionDomainsAddedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+                SubscriptionDomainAddedEvent subscriptionDomainAddedEvent = (SubscriptionDomainAddedEvent)event;
+                ExtensionUtils.executeSubscriptionDomainAddedExtension(subscriptionDomainAddedEvent.getDomainName(),
+                        subscriptionDomainAddedEvent.getApplicationAlias());
+            }
+        });
+
+        tenantEventReceiver.addEventListener(new SubscriptionDomainsRemovedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+                SubscriptionDomainRemovedEvent subscriptionDomainRemovedEvent = (SubscriptionDomainRemovedEvent)event;
+                ExtensionUtils.executeSubscriptionDomainRemovedExtension(subscriptionDomainRemovedEvent.getDomainName());
+            }
+        });
+
+        Thread tenantEventReceiverThread = new Thread(tenantEventReceiver);
+        tenantEventReceiverThread.start();
+        if(log.isInfoEnabled()) {
+            log.info("Tenant event message receiver thread started");
+        }
 
         // Wait until message receiver is subscribed to the topic to
         // send the instance started event

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/CartridgeAgentConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/CartridgeAgentConstants.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/CartridgeAgentConstants.java
index 8434d6d..c36eb8c 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/CartridgeAgentConstants.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/CartridgeAgentConstants.java
@@ -33,6 +33,8 @@ public class CartridgeAgentConstants implements Serializable{
     public static final String ARTIFACTS_UPDATED_SH = "artifacts-updated.sh";
     public static final String CLEAN_UP_SH = "clean.sh";
     public static final String MOUNT_VOLUMES_SH = "mount_volumes.sh";
+    public static final String SUBSCRIPTION_DOMAIN_ADDED_SH = "subscription-domain-added.sh";
+    public static final String SUBSCRIPTION_DOMAIN_REMOVED_SH = "subscription-domain-removed.sh";
 	
 	public static final String CARTRIDGE_KEY = "CARTRIDGE_KEY";
 	public static final String APP_PATH = "APP_PATH";

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java
index 2a11103..6eef1f0 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java
@@ -117,19 +117,45 @@ public class ExtensionUtils {
     This will execute the volume mounting script which format and mount the
     persistance volumes.
      */
-    public static void executeVolumeMountExtension(String persistanceMappingsPayload) {
+    public static void executeVolumeMountExtension(String persistenceMappingsPayload) {
         try {
             if(log.isDebugEnabled()) {
-                    log.debug("Executing volume mounting extension");
+                    log.debug(String.format("Executing volume mounting extension: [payload] %s", persistenceMappingsPayload));
             }
             String command = prepareCommand(CartridgeAgentConstants.MOUNT_VOLUMES_SH);
             //String payloadPath = System.getProperty(CartridgeAgentConstants.PARAM_FILE_PATH);
             // add payload file path as argument so inside the script we can source
             // it  to get the env variables set by the startup script
-            CommandUtils.executeCommand(command + " " + persistanceMappingsPayload);
+            CommandUtils.executeCommand(command + " " + persistenceMappingsPayload);
         }
         catch (Exception e) {
                 log.error("Could not execute volume mounting extension", e);
         }
     }
+
+    public static void executeSubscriptionDomainAddedExtension(String domain, String applicationAlias) {
+        try {
+            if(log.isDebugEnabled()) {
+                log.debug("Executing subscription domain added extension: [domain] %s [application-alias] %s");
+            }
+            String command = prepareCommand(CartridgeAgentConstants.SUBSCRIPTION_DOMAIN_ADDED_SH + " " + domain + " " + applicationAlias);
+            CommandUtils.executeCommand(command);
+        }
+        catch (Exception e) {
+            log.error("Could not execute subscription domain added extension", e);
+        }
+    }
+
+    public static void executeSubscriptionDomainRemovedExtension(String domain) {
+        try {
+            if(log.isDebugEnabled()) {
+                log.debug("Executing subscription domain removed extension: [domain] %s");
+            }
+            String command = prepareCommand(CartridgeAgentConstants.SUBSCRIPTION_DOMAIN_ADDED_SH + " " + domain);
+            CommandUtils.executeCommand(command);
+        }
+        catch (Exception e) {
+            log.error("Could not execute subscription domain removed extension", e);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/LoadBalancerTenantEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/LoadBalancerTenantEventReceiver.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/LoadBalancerTenantEventReceiver.java
index e25bed9..6ff4fef 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/LoadBalancerTenantEventReceiver.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/LoadBalancerTenantEventReceiver.java
@@ -23,6 +23,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.load.balancer.context.LoadBalancerContextUtil;
 import org.apache.stratos.messaging.domain.tenant.Subscription;
+import org.apache.stratos.messaging.domain.tenant.SubscriptionDomain;
 import org.apache.stratos.messaging.domain.tenant.Tenant;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.ServiceType;
@@ -68,10 +69,12 @@ public class LoadBalancerTenantEventReceiver implements Runnable {
                                         subscription.getClusterIds());
                             }
 
-                            LoadBalancerContextUtil.addClustersAgainstDomains(
-                                    subscription.getServiceName(),
-                                    subscription.getClusterIds(),
-                                    subscription.getDomains());
+                            for (SubscriptionDomain subscriptionDomain : subscription.getSubscriptionDomains()) {
+                                LoadBalancerContextUtil.addClustersAgainstDomain(
+                                        subscription.getServiceName(),
+                                        subscription.getClusterIds(),
+                                        subscriptionDomain.getDomainName());
+                            }
                         }
                     }
                     initialized = true;
@@ -95,11 +98,6 @@ public class LoadBalancerTenantEventReceiver implements Runnable {
                             tenantSubscribedEvent.getTenantId(),
                             tenantSubscribedEvent.getClusterIds());
                 }
-
-                LoadBalancerContextUtil.addClustersAgainstDomains(
-                        tenantSubscribedEvent.getServiceName(),
-                        tenantSubscribedEvent.getClusterIds(),
-                        tenantSubscribedEvent.getDomains());
             }
         });
         tenantEventReceiver.addEventListener(new TenantUnSubscribedEventListener() {
@@ -130,37 +128,38 @@ public class LoadBalancerTenantEventReceiver implements Runnable {
         tenantEventReceiver.addEventListener(new SubscriptionDomainsAddedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                SubscriptionDomainsAddedEvent subscriptionDomainsAddedEvent = (SubscriptionDomainsAddedEvent) event;
+                SubscriptionDomainAddedEvent subscriptionDomainAddedEvent = (SubscriptionDomainAddedEvent) event;
                 if (log.isDebugEnabled()) {
-                    log.debug(String.format("Tenant subscription domains added event received: [tenant-id] %d " +
-                            "[service] %s [cluster-ids] %s [domains] %s",
-                            subscriptionDomainsAddedEvent.getTenantId(),
-                            subscriptionDomainsAddedEvent.getServiceName(),
-                            subscriptionDomainsAddedEvent.getClusterIds(),
-                            subscriptionDomainsAddedEvent.getDomains()));
+                    log.debug(String.format("Tenant subscription domain added event received: [tenant-id] %d " +
+                            "[service] %s [cluster-ids] %s [domain-name] %s",
+                            subscriptionDomainAddedEvent.getTenantId(),
+                            subscriptionDomainAddedEvent.getServiceName(),
+                            subscriptionDomainAddedEvent.getClusterIds(),
+                            subscriptionDomainAddedEvent.getDomainName()));
                 }
-                LoadBalancerContextUtil.addClustersAgainstDomains(
-                        subscriptionDomainsAddedEvent.getServiceName(),
-                        subscriptionDomainsAddedEvent.getClusterIds(),
-                        subscriptionDomainsAddedEvent.getDomains());
+
+                LoadBalancerContextUtil.addClustersAgainstDomain(
+                        subscriptionDomainAddedEvent.getServiceName(),
+                        subscriptionDomainAddedEvent.getClusterIds(),
+                        subscriptionDomainAddedEvent.getDomainName());
             }
         });
         tenantEventReceiver.addEventListener(new SubscriptionDomainsRemovedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                SubscriptionDomainsRemovedEvent subscriptionDomainsRemovedEvent = (SubscriptionDomainsRemovedEvent) event;
+                SubscriptionDomainRemovedEvent subscriptionDomainRemovedEvent = (SubscriptionDomainRemovedEvent) event;
                 if (log.isDebugEnabled()) {
-                    log.debug(String.format("Tenant subscription domains removed event received: [tenant-id] %d " +
-                            "[service] %s [cluster-ids] %s [domains] %s",
-                            subscriptionDomainsRemovedEvent.getTenantId(),
-                            subscriptionDomainsRemovedEvent.getServiceName(),
-                            subscriptionDomainsRemovedEvent.getClusterIds(),
-                            subscriptionDomainsRemovedEvent.getDomains()));
+                    log.debug(String.format("Tenant subscription domain removed event received: [tenant-id] %d " +
+                            "[service] %s [cluster-ids] %s [domain-name] %s",
+                            subscriptionDomainRemovedEvent.getTenantId(),
+                            subscriptionDomainRemovedEvent.getServiceName(),
+                            subscriptionDomainRemovedEvent.getClusterIds(),
+                            subscriptionDomainRemovedEvent.getDomainName()));
                 }
-                LoadBalancerContextUtil.removeClustersAgainstDomains(
-                        subscriptionDomainsRemovedEvent.getServiceName(),
-                        subscriptionDomainsRemovedEvent.getClusterIds(),
-                        subscriptionDomainsRemovedEvent.getDomains());
+                LoadBalancerContextUtil.removeClustersAgainstDomain(
+                        subscriptionDomainRemovedEvent.getServiceName(),
+                        subscriptionDomainRemovedEvent.getClusterIds(),
+                        subscriptionDomainRemovedEvent.getDomainName());
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContextUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContextUtil.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContextUtil.java
index c65d29e..a25d815 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContextUtil.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContextUtil.java
@@ -19,9 +19,11 @@
 
 package org.apache.stratos.load.balancer.context;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.messaging.domain.tenant.Subscription;
+import org.apache.stratos.messaging.domain.tenant.SubscriptionDomain;
 import org.apache.stratos.messaging.domain.tenant.Tenant;
 import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.messaging.domain.topology.Service;
@@ -171,13 +173,13 @@ public class LoadBalancerContextUtil {
     }
 
     /**
-     * Add clusters against domains for the given service, cluster ids.
+     * Add clusters against domain name for the given service, cluster ids.
      *
      * @param serviceName
      * @param clusterIds
-     * @param domains
+     * @param domainName
      */
-    public static void addClustersAgainstDomains(String serviceName, Set<String> clusterIds, Set<String> domains) {
+    public static void addClustersAgainstDomain(String serviceName, Set<String> clusterIds, String domainName) {
         try {
             TopologyManager.acquireReadLock();
             Service service = TopologyManager.getTopology().getService(serviceName);
@@ -191,7 +193,7 @@ public class LoadBalancerContextUtil {
             for (String clusterId : clusterIds) {
                 cluster = service.getCluster(clusterId);
                 if (cluster != null) {
-                    addClusterAgainstDomains(serviceName, cluster, domains);
+                    addClusterAgainstDomain(serviceName, cluster, domainName);
                 } else {
                     if (log.isWarnEnabled()) {
                         log.warn(String.format("Cluster not found in service: [service] %s [cluster] %s", serviceName, clusterId));
@@ -204,13 +206,13 @@ public class LoadBalancerContextUtil {
     }
 
     /**
-     * Remove clusters mapped against domains for the given service, cluster ids.
+     * Remove clusters mapped against domain name for the given service, cluster ids.
      *
      * @param serviceName
      * @param clusterIds
-     * @param domains
+     * @param domainName
      */
-    public static void removeClustersAgainstDomains(String serviceName, Set<String> clusterIds, Set<String> domains) {
+    public static void removeClustersAgainstDomain(String serviceName, Set<String> clusterIds, String domainName) {
         try {
             TopologyManager.acquireReadLock();
 
@@ -226,7 +228,7 @@ public class LoadBalancerContextUtil {
                 cluster = service.getCluster(clusterId);
                 if (cluster != null) {
                     // Remove clusters mapped against domain names
-                    removeClusterAgainstDomains(cluster, domains);
+                    removeClusterAgainstDomain(cluster, domainName);
                 } else {
                     if (log.isWarnEnabled()) {
                         log.warn(String.format("Cluster not found in service: [service] %s [cluster] %s", serviceName, clusterId));
@@ -309,21 +311,19 @@ public class LoadBalancerContextUtil {
      *
      * @param serviceName
      * @param cluster
-     * @param domains
+     * @param domainName
      */
-    private static void addClusterAgainstDomains(String serviceName, Cluster cluster, Set<String> domains) {
+    private static void addClusterAgainstDomain(String serviceName, Cluster cluster, String domainName) {
         if (log.isDebugEnabled()) {
-            log.debug(String.format("Adding cluster to host/domain name -> cluster map against domain names: [service] %s " +
-                    "[domains] %s [cluster] %s", serviceName, domains, cluster.getClusterId()));
+            log.debug(String.format("Adding cluster to host/domain name -> cluster map against domain: [service] %s " +
+                    "[domain-name] %s [cluster] %s", serviceName, domainName, cluster.getClusterId()));
         }
-        if ((domains != null) && (domains.size() > 0)) {
-            for (String domain : domains) {
-                addClusterToHostNameClusterMap(domain, cluster);
+        if (StringUtils.isNotBlank(domainName)) {
+            addClusterToHostNameClusterMap(domainName, cluster);
 
-                if (log.isDebugEnabled()) {
-                    log.debug(String.format("Cluster added to host/domain name -> cluster map: [domain-name] %s [cluster] %s",
-                            domain, cluster.getClusterId()));
-                }
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Cluster added to host/domain name -> cluster map: [domain-name] %s [cluster] %s",
+                        domainName, cluster.getClusterId()));
             }
         }
     }
@@ -354,10 +354,12 @@ public class LoadBalancerContextUtil {
                     for (Subscription subscription : tenant.getSubscriptions()) {
                         if (subscription.getServiceName().equals(serviceName)) {
                             if (log.isDebugEnabled()) {
-                                log.debug(String.format("Removing cluster from host/domain name -> cluster map against domain names: [service] %s " +
-                                        "[tenant-id] %d [domains] %s", serviceName, tenantId, subscription.getDomains()));
+                                log.debug(String.format("Removing cluster from host/domain name -> cluster map: [service] %s " +
+                                        "[tenant-id] %d [domains] %s", serviceName, tenantId, subscription.getSubscriptionDomains()));
+                            }
+                            for(SubscriptionDomain subscriptionDomain : subscription.getSubscriptionDomains()) {
+                                removeClusterAgainstDomain(cluster, subscriptionDomain.getDomainName());
                             }
-                            removeClusterAgainstDomains(cluster, subscription.getDomains());
                         } else {
                             if (log.isDebugEnabled()) {
                                 log.debug(String.format("Tenant not subscribed to service: %s", serviceName));
@@ -372,13 +374,11 @@ public class LoadBalancerContextUtil {
         }
     }
 
-    private static void removeClusterAgainstDomains(Cluster cluster, Set<String> domains) {
-        for (String domain : domains) {
-            removeClusterFromHostNameClusterMap(domain, cluster);
-            if (log.isDebugEnabled()) {
-                log.debug(String.format("Cluster removed from host/domain name -> cluster map: [domain-name] %s [cluster] %s",
-                        domain, cluster.getClusterId()));
-            }
+    private static void removeClusterAgainstDomain(Cluster cluster, String domainName) {
+        removeClusterFromHostNameClusterMap(domainName, cluster);
+        if (log.isDebugEnabled()) {
+            log.debug(String.format("Cluster removed from host/domain name -> cluster map: [domain-name] %s [cluster] %s",
+                    domainName, cluster.getClusterId()));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
index 1c0b2e7..f591b82 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
@@ -38,6 +38,7 @@ import org.apache.stratos.manager.subscriber.Subscriber;
 import org.apache.stratos.manager.subscription.CartridgeSubscription;
 import org.apache.stratos.manager.subscription.PersistenceContext;
 import org.apache.stratos.manager.subscription.SubscriptionData;
+import org.apache.stratos.manager.subscription.SubscriptionDomain;
 import org.apache.stratos.manager.subscription.factory.CartridgeSubscriptionFactory;
 import org.apache.stratos.manager.subscription.tenancy.SubscriptionMultiTenantBehaviour;
 import org.apache.stratos.manager.subscription.tenancy.SubscriptionSingleTenantBehaviour;
@@ -51,8 +52,8 @@ import org.apache.stratos.messaging.broker.publish.EventPublisher;
 import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
 import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.messaging.domain.topology.Member;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainsAddedEvent;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainsRemovedEvent;
+import org.apache.stratos.messaging.event.tenant.SubscriptionDomainAddedEvent;
+import org.apache.stratos.messaging.event.tenant.SubscriptionDomainRemovedEvent;
 import org.apache.stratos.messaging.util.Constants;
 import org.wso2.carbon.context.CarbonContext;
 import org.apache.stratos.manager.publisher.CartridgeSubscriptionDataPublisher;
@@ -250,7 +251,7 @@ public class CartridgeSubscriptionManager {
 
         // create subscription
         cartridgeSubscription.createSubscription(subscriber, lbAlias, lbDataContext.getAutoscalePolicy(),
-                lbDataContext.getDeploymentPolicy(), repository, new HashSet<String>());
+                lbDataContext.getDeploymentPolicy(), repository);
 
         // add LB category to the payload
         if (cartridgeSubscription.getPayloadData() != null) {
@@ -319,7 +320,7 @@ public class CartridgeSubscriptionManager {
 
         //create subscription
         cartridgeSubscription.createSubscription(subscriber, subscriptionData.getCartridgeAlias(), subscriptionData.getAutoscalingPolicyName(),
-                                                subscriptionData.getDeploymentPolicyName(), repository, subscriptionData.getDomains());
+                                                subscriptionData.getDeploymentPolicyName(), repository);
 
 		// publishing to bam
 		CartridgeSubscriptionDataPublisher.publish(
@@ -380,13 +381,13 @@ public class CartridgeSubscriptionManager {
 
         // Publish tenant subscribed event to message broker
         CartridgeSubscriptionUtils.publishTenantSubscribedEvent(cartridgeSubscription.getSubscriber().getTenantId(),
-                cartridgeSubscription.getCartridgeInfo().getType(), new HashSet<String>(cartridgeSubscription.getCluster().getId()),  cartridgeSubscription.getDomains());
+                cartridgeSubscription.getCartridgeInfo().getType(), new HashSet<String>(cartridgeSubscription.getCluster().getId()));
 
         return ApplicationManagementUtil.
                 createSubscriptionResponse(cartridgeSubscriptionInfo, cartridgeSubscription.getRepository());
     }
 
-    public void addSubscriptionDomains(int tenantId, String subscriptionAlias, List<String> domains)
+    public void addSubscriptionDomain(int tenantId, String subscriptionAlias, String domainName, String applicationAlias)
             throws ADCException {
 
         CartridgeSubscription cartridgeSubscription;
@@ -395,31 +396,31 @@ public class CartridgeSubscriptionManager {
             if(cartridgeSubscription == null) {
                 throw new ADCException("Cartridge subscription not found");
             }
-            for(String domain : domains) {
-                if(!isSubscriptionDomainValid(domain)) {
-                    throw new ADCException(String.format("Domain %s already exists", domain));
+
+                if(!isSubscriptionDomainValid(domainName)) {
+                    throw new ADCException(String.format("Domain name %s already registered", domainName));
                 }
-            }
-            cartridgeSubscription.addDomains(new HashSet<String>(domains));
+
+            cartridgeSubscription.addSubscriptionDomain(new SubscriptionDomain(domainName, applicationAlias));
             new DataInsertionAndRetrievalManager().cacheAndUpdateSubscription(cartridgeSubscription);
         } catch (PersistenceManagerException e) {
-            String errorMsg = "Could not add domains to cartridge subscription: [tenant-id] " + tenantId + " [subscription-alias] " + subscriptionAlias +
-            " [domains] " + domains;
+            String errorMsg = "Could not add domain to cartridge subscription: [tenant-id] " + tenantId + " [subscription-alias] " + subscriptionAlias +
+            " [domain-name] " + domainName + " [application-alias] " + applicationAlias;
             log.error(errorMsg);
             throw new ADCException(errorMsg, e);
         }
 
         log.info("Successfully added domains to cartridge subscription: [tenant-id] " + tenantId + " [subscription-alias] " + subscriptionAlias +
-                " [domains] " + domains);
+                " [domain-name] " + domainName + " [application-alias] " +applicationAlias);
 
         EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.TENANT_TOPIC);
-        SubscriptionDomainsAddedEvent event = new SubscriptionDomainsAddedEvent(tenantId, cartridgeSubscription.getType(),
+        SubscriptionDomainAddedEvent event = new SubscriptionDomainAddedEvent(tenantId, cartridgeSubscription.getType(),
                 new HashSet<String>(cartridgeSubscription.getCluster().getId()),
-                new HashSet<String>(domains));
+                domainName, applicationAlias);
         eventPublisher.publish(event);
     }
 
-    public void removeSubscriptionDomain(int tenantId, String subscriptionAlias, String domain)
+    public void removeSubscriptionDomain(int tenantId, String subscriptionAlias, String domainName)
             throws ADCException {
 
         CartridgeSubscription cartridgeSubscription;
@@ -428,24 +429,22 @@ public class CartridgeSubscriptionManager {
             if(cartridgeSubscription == null) {
                 throw new ADCException("Cartridge subscription not found");
             }
-            cartridgeSubscription.removeDomain(domain);
+            cartridgeSubscription.removeSubscriptionDomain(domainName);
             new DataInsertionAndRetrievalManager().cacheAndUpdateSubscription(cartridgeSubscription);
         } catch (PersistenceManagerException e) {
             String errorMsg = "Could not remove domain from cartridge subscription: [tenant-id] " + tenantId + " [subscription-alias] " + subscriptionAlias +
-                    " [domain] " + domain;
+                    " [domain-name] " + domainName;
             log.error(errorMsg);
             throw new ADCException(errorMsg, e);
         }
 
         log.info("Successfully removed domain from cartridge subscription: [tenant-id] " + tenantId + " [subscription-alias] " + subscriptionAlias +
-                " [domain] " + domain);
+                " [domain-name] " + domainName);
 
-        Set<String> domains = new HashSet<String>();
-        domains.add(domain);
         EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.TENANT_TOPIC);
-        SubscriptionDomainsRemovedEvent event = new SubscriptionDomainsRemovedEvent(tenantId, cartridgeSubscription.getType(),
+        SubscriptionDomainRemovedEvent event = new SubscriptionDomainRemovedEvent(tenantId, cartridgeSubscription.getType(),
                 new HashSet<String>(cartridgeSubscription.getCluster().getId()),
-                domains);
+                domainName);
         eventPublisher.publish(event);
     }
 
@@ -457,8 +456,11 @@ public class CartridgeSubscriptionManager {
             if(cartridgeSubscription == null) {
                 throw new ADCException("Cartridge subscription not found");
             }
-            Set<String> domains = cartridgeSubscription.getDomains();
-            return new ArrayList<String>(domains != null ? domains : new ArrayList<String>());
+            List<String> domainNames = new ArrayList<String>();
+            for(SubscriptionDomain subscriptionDomain : cartridgeSubscription.getSubscriptionDomains()) {
+                domainNames.add(subscriptionDomain.getDomainName());
+            }
+            return domainNames;
         } catch (Exception e) {
             String errorMsg = "Could not get domains of cartridge subscription: [tenant-id] " + tenantId + " [subscription-alias] " + subscriptionAlias;
             log.error(errorMsg);
@@ -466,10 +468,10 @@ public class CartridgeSubscriptionManager {
         }
     }
 
-    public boolean isSubscriptionDomainValid(String domain) throws ADCException {
+    public boolean isSubscriptionDomainValid(String domainName) throws ADCException {
         try {
             if(log.isDebugEnabled()) {
-                log.debug(String.format("Validating domain: %s", domain));
+                log.debug(String.format("Validating domain: %s", domainName));
             }
             org.wso2.carbon.user.core.tenant.TenantManager tenantManager = DataHolder.getRealmService().getTenantManager();
             org.wso2.carbon.user.api.Tenant[] tenants = tenantManager.getAllTenants();
@@ -483,21 +485,21 @@ public class CartridgeSubscriptionManager {
                     Collection<CartridgeSubscription> subscriptions = manager.getCartridgeSubscriptions(tenant.getId());
                     for (CartridgeSubscription subscription : subscriptions) {
                         if (log.isDebugEnabled()) {
-                            log.debug(String.format("Reading domains in subscription: [alias] %s [domains] %s",
-                                    subscription.getAlias(), subscription.getDomains()));
+                            log.debug(String.format("Reading domain names in subscription: [alias] %s [domain-names] %s",
+                                    subscription.getAlias(), subscription.getSubscriptionDomains()));
                         }
-                        if (subscription.getDomains().contains(domain)) {
+                        if (subscription.subscriptionDomainExists(domainName)) {
                             return false;
                         }
                     }
                 }
             }
             if(log.isDebugEnabled()) {
-                log.debug(String.format("Domain %s is valid", domain));
+                log.debug(String.format("Domain name %s is valid", domainName));
             }
             return true;
         } catch (Exception e) {
-            String errorMsg = "Could not validate domain:  " + domain;
+            String errorMsg = "Could not validate domain:  " + domainName;
             log.error(errorMsg);
             throw new ADCException(errorMsg, e);
         }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java
index a8f0cf0..8b760fa 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/publisher/TenantSynzhronizerTask.java
@@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.manager.internal.DataHolder;
 import org.apache.stratos.manager.retriever.DataInsertionAndRetrievalManager;
 import org.apache.stratos.manager.subscription.CartridgeSubscription;
+import org.apache.stratos.manager.subscription.SubscriptionDomain;
 import org.apache.stratos.messaging.broker.publish.EventPublisher;
 import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
 import org.apache.stratos.messaging.domain.tenant.Subscription;
@@ -75,8 +76,10 @@ public class TenantSynzhronizerTask implements Task {
                                     carbonTenant.getId(), carbonTenant.getDomain(), cartridgeSubscription.getType()));
                         }
                         Subscription subscription = new Subscription(cartridgeSubscription.getType(),
-                                new HashSet<String>(cartridgeSubscription.getCluster().getId()),
-                                cartridgeSubscription.getDomains());
+                                new HashSet<String>(cartridgeSubscription.getCluster().getId()));
+                        for(SubscriptionDomain subscriptionDomain : cartridgeSubscription.getSubscriptionDomains()) {
+                            subscription.addSubscriptionDomain(subscriptionDomain.getDomainName(), subscriptionDomain.getApplicationAlias());
+                        }
                         tenant.addSubscription(subscription);
                     }
                 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
index f32cd2f..755b559 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/CartridgeSubscription.java
@@ -58,7 +58,7 @@ public abstract class CartridgeSubscription implements Serializable {
     //private List<String> connectedSubscriptionAliases;
     private String subscriptionKey;
     private SubscriptionTenancyBehaviour subscriptionTenancyBehaviour;
-    private Set<String> domains;
+    private Map<String, SubscriptionDomain> subscriptionDomainMap;
     
     /**
      * Constructor
@@ -79,7 +79,7 @@ public abstract class CartridgeSubscription implements Serializable {
         //this.setSubscriptionStatus(CartridgeConstants.SUBSCRIBED);
         //this.connectedSubscriptionAliases = new ArrayList<String>();
         this.setSubscriptionTenancyBehaviour(subscriptionTenancyBehaviour);
-        this.domains = new HashSet<String>();
+        this.subscriptionDomainMap = new HashMap<String, SubscriptionDomain>();
     }
 
     /**
@@ -103,7 +103,7 @@ public abstract class CartridgeSubscription implements Serializable {
      * @throws org.apache.stratos.manager.exception.RepositoryTransportException
      */
     public void createSubscription (Subscriber subscriber, String alias, String autoscalingPolicy,
-                                    String deploymentPolicyName, Repository repository, Set<String> domains)
+                                    String deploymentPolicyName, Repository repository)
             throws ADCException, PolicyException, UnregisteredCartridgeException, InvalidCartridgeAliasException,
             DuplicateCartridgeAliasException, RepositoryRequiredException, AlreadySubscribedException,
             RepositoryCredentialsRequiredException, InvalidRepositoryException, RepositoryTransportException {
@@ -113,26 +113,32 @@ public abstract class CartridgeSubscription implements Serializable {
         setAutoscalingPolicyName(autoscalingPolicy);
         setDeploymentPolicyName(deploymentPolicyName);
         setRepository(repository);
-        addDomains(domains);
 
         setPayloadData(getSubscriptionTenancyBehaviour().create(getAlias(), getCluster(), getSubscriber(), getRepository(), getCartridgeInfo(),
                 getSubscriptionKey(), getCustomPayloadEntries()));
     }
 
-    public void addDomains(Set<String> domains) {
-        domains.addAll(domains);
+    public void addSubscriptionDomain(SubscriptionDomain subscriptionDomain) {
+        subscriptionDomainMap.put(subscriptionDomain.getDomainName(), subscriptionDomain);
     }
 
-    public void removeDomain(String domain) {
-        domains.remove(domain);
+    public void removeSubscriptionDomain(String domainName) {
+        if(subscriptionDomainExists(domainName)) {
+            subscriptionDomainMap.remove(domainName);
+        }
+        else {
+            if(log.isWarnEnabled()) {
+                log.warn("Subscription domain does not exist: " + domainName);
+            }
+        }
     }
 
-    public void removeDomains(Set<String> domains) {
-        domains.removeAll(domains);
+    public boolean subscriptionDomainExists(String domainName) {
+        return subscriptionDomainMap.containsKey(domainName);
     }
 
-    public Set<String> getDomains() {
-        return Collections.unmodifiableSet(domains);
+    public Collection<SubscriptionDomain> getSubscriptionDomains() {
+        return Collections.unmodifiableCollection(subscriptionDomainMap.values());
     }
 
     /**
@@ -405,7 +411,7 @@ public abstract class CartridgeSubscription implements Serializable {
                ", alias=" + alias + ", autoscalingPolicyName=" + autoscalingPolicyName +
                ", deploymentPolicyName=" + deploymentPolicyName + ", subscriber=" + subscriber +
                ", repository=" + repository + ", cartridgeInfo=" + cartridgeInfo + ", payload=" +
-               payloadData + ", cluster=" + cluster + "]" + ", domains=" + domains.toString();
+               payloadData + ", cluster=" + cluster + "]" + ", subscriptionDomainMap=" + subscriptionDomainMap.toString();
     }
 
     public String getLbClusterId() {

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionDomain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionDomain.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionDomain.java
new file mode 100644
index 0000000..c258e38
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/SubscriptionDomain.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.manager.subscription;
+
+/**
+ * Subscription domain definition.
+ */
+public class SubscriptionDomain {
+    private final String domainName;
+    private final String applicationAlias;
+
+    public SubscriptionDomain(String domainName, String applicationAlias) {
+        this.domainName = domainName;
+        this.applicationAlias = applicationAlias;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public String getApplicationAlias() {
+        return applicationAlias;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("[domain-name] %s [application-alias] %s", getDomainName(), getApplicationAlias());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
index 20e23e1..bd575ce 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
@@ -158,13 +158,11 @@ public class CartridgeSubscriptionUtils {
     	private int tenantId;
     	private String serviceName;
         private Set<String> clusterIds;
-        private Set<String> domains;
 
-        public TenantSubscribedEventPublisher(int tenantId, String service, Set<String> clusterIds, Set<String> domains) {
+        public TenantSubscribedEventPublisher(int tenantId, String service, Set<String> clusterIds) {
     		this.tenantId = tenantId;
     		this.serviceName = service;
             this.clusterIds = clusterIds;
-            this.domains = domains;
 		}
 		@Override
 		public void run() {
@@ -172,7 +170,7 @@ public class CartridgeSubscriptionUtils {
 				if(log.isInfoEnabled()) {
 					log.info(String.format("Publishing tenant subscribed event: [tenant-id] %d [service] %s", tenantId, serviceName));
 				}
-				TenantSubscribedEvent subscribedEvent = new TenantSubscribedEvent(tenantId, serviceName, clusterIds, domains);
+				TenantSubscribedEvent subscribedEvent = new TenantSubscribedEvent(tenantId, serviceName, clusterIds);
 				EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.TENANT_TOPIC);
 				eventPublisher.publish(subscribedEvent);
 			} catch (Exception e) {
@@ -184,7 +182,7 @@ public class CartridgeSubscriptionUtils {
 		}
     	
     }
-    public static void publishTenantSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds, Set<String> domains) {
+    public static void publishTenantSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds) {
     	
     	
     	Executor exec = new Executor() {
@@ -194,7 +192,7 @@ public class CartridgeSubscriptionUtils {
 			}
 		};
 		
-		exec.execute(new TenantSubscribedEventPublisher(tenantId, serviceName, clusterIds, domains));
+		exec.execute(new TenantSubscribedEventPublisher(tenantId, serviceName, clusterIds));
     }
 
     public static void publishTenantUnSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds) {

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java
index 36fca2b..911692c 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/Subscription.java
@@ -19,20 +19,25 @@
 
 package org.apache.stratos.messaging.domain.tenant;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import java.util.*;
 
 /**
  * Tenant's service subscription.
  */
 public class Subscription {
+    private static final Log log = LogFactory.getLog(Subscription.class);
+
     private final String serviceName;
     private final Set<String> clusterIds;
-    private final Set<String> domains;
+    private final Map<String, SubscriptionDomain> subscriptionDomainMap;
 
-    public Subscription(String serviceName, Set<String> clusterIds, Set<String> domains) {
+    public Subscription(String serviceName, Set<String> clusterIds) {
         this.serviceName = serviceName;
         this.clusterIds = clusterIds;
-        this.domains = (domains != null) ? domains : new HashSet<String>();
+        this.subscriptionDomainMap = new HashMap<String, SubscriptionDomain>();
     }
 
     public String getServiceName() {
@@ -43,23 +48,30 @@ public class Subscription {
         return Collections.unmodifiableSet(clusterIds);
     }
 
-    public void addDomain(String domain) {
-        domains.add(domain);
+    public void addSubscriptionDomain(SubscriptionDomain subscriptionDomain) {
+        subscriptionDomainMap.put(subscriptionDomain.getDomainName(), subscriptionDomain);
     }
 
-    public void addDomains(Set<String> domains) {
-        domains.addAll(domains);
+    public void addSubscriptionDomain(String domainName, String applicationAlias) {
+        addSubscriptionDomain(new SubscriptionDomain(domainName, applicationAlias));
     }
 
-    public void removeDomain(String domain) {
-        domains.remove(domain);
+    public void removeSubscriptionDomain(String domainName) {
+        if(subscriptionDomainExists(domainName)) {
+            subscriptionDomainMap.remove(domainName);
+        }
+        else {
+            if(log.isWarnEnabled()) {
+                log.warn("Subscription domain does not exist: " + domainName);
+            }
+        }
     }
 
-    public void removeDomains(Set<String> domains) {
-        domains.removeAll(domains);
+    public boolean subscriptionDomainExists(String domainName) {
+        return subscriptionDomainMap.containsKey(domainName);
     }
 
-    public Set<String> getDomains() {
-        return Collections.unmodifiableSet(domains);
+    public Collection<SubscriptionDomain> getSubscriptionDomains() {
+        return Collections.unmodifiableCollection(subscriptionDomainMap.values());
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/SubscriptionDomain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/SubscriptionDomain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/SubscriptionDomain.java
new file mode 100644
index 0000000..38448ae
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/tenant/SubscriptionDomain.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.messaging.domain.tenant;
+
+/**
+ * Subscription domain definition.
+ */
+public class SubscriptionDomain {
+    private final String domainName;
+    private final String applicationAlias;
+
+    public SubscriptionDomain(String domainName, String applicationAlias) {
+        this.domainName = domainName;
+        this.applicationAlias = applicationAlias;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public String getApplicationAlias() {
+        return applicationAlias;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java
new file mode 100644
index 0000000..baebb82
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java
@@ -0,0 +1,67 @@
+/*
+ * 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.messaging.event.tenant;
+
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * This event is fired when domains are added to a tenant subscription.
+ */
+public class SubscriptionDomainAddedEvent extends Event implements Serializable {
+    private static final long serialVersionUID = 3457484382856403382L;
+
+    private final int tenantId;
+    private final String serviceName;
+    private final Set<String> clusterIds;
+    private final String domainName;
+    private final String applicationAlias;
+
+    public SubscriptionDomainAddedEvent(int tenantId, String serviceName, Set<String> clusterIds, String domainName,
+                                        String applicationAlias) {
+        this.tenantId = tenantId;
+        this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
+        this.domainName = domainName;
+        this.applicationAlias = applicationAlias;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public String getApplicationAlias() {
+        return applicationAlias;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.java
new file mode 100644
index 0000000..b3d9578
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.java
@@ -0,0 +1,60 @@
+/*
+ * 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.messaging.event.tenant;
+
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * This event is fired when domains are removed from a tenant subscription.
+ */
+public class SubscriptionDomainRemovedEvent extends Event implements Serializable {
+    private static final long serialVersionUID = -8837521344795740210L;
+
+    private final int tenantId;
+    private final String serviceName;
+    private final Set<String> clusterIds;
+    private final String domainName;
+
+    public SubscriptionDomainRemovedEvent(int tenantId, String serviceName, Set<String> clusterIds, String domainName) {
+        this.tenantId = tenantId;
+        this.serviceName = serviceName;
+        this.clusterIds = clusterIds;
+        this.domainName = domainName;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public Set<String> getClusterIds() {
+        return Collections.unmodifiableSet(clusterIds);
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsAddedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsAddedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsAddedEvent.java
deleted file mode 100644
index 312571a..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsAddedEvent.java
+++ /dev/null
@@ -1,60 +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.messaging.event.tenant;
-
-import org.apache.stratos.messaging.event.Event;
-
-import java.io.Serializable;
-import java.util.*;
-
-/**
- * This event is fired when domains are added to a tenant subscription.
- */
-public class SubscriptionDomainsAddedEvent extends Event implements Serializable {
-    private static final long serialVersionUID = 3457484382856403382L;
-
-    private final int tenantId;
-    private final String serviceName;
-    private final Set<String> clusterIds;
-    private final Set<String> domains;
-
-    public SubscriptionDomainsAddedEvent(int tenantId, String serviceName, Set<String> clusterIds, Set<String> domains) {
-        this.tenantId = tenantId;
-        this.serviceName = serviceName;
-        this.clusterIds = clusterIds;
-        this.domains = (domains != null) ? domains : new HashSet<String>();
-    }
-
-    public int getTenantId() {
-        return tenantId;
-    }
-
-    public String getServiceName() {
-        return serviceName;
-    }
-
-    public Set<String> getClusterIds() {
-        return Collections.unmodifiableSet(clusterIds);
-    }
-
-    public Set<String> getDomains() {
-        return Collections.unmodifiableSet(domains);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsRemovedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsRemovedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsRemovedEvent.java
deleted file mode 100644
index 3cc5664..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainsRemovedEvent.java
+++ /dev/null
@@ -1,60 +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.messaging.event.tenant;
-
-import org.apache.stratos.messaging.event.Event;
-
-import java.io.Serializable;
-import java.util.*;
-
-/**
- * This event is fired when domains are removed from a tenant subscription.
- */
-public class SubscriptionDomainsRemovedEvent extends Event implements Serializable {
-    private static final long serialVersionUID = -8837521344795740210L;
-
-    private final int tenantId;
-    private final String serviceName;
-    private final Set<String> clusterIds;
-    private Set<String> domains;
-
-    public SubscriptionDomainsRemovedEvent(int tenantId, String serviceName, Set<String> clusterIds, Set<String> domains) {
-        this.tenantId = tenantId;
-        this.serviceName = serviceName;
-        this.clusterIds = clusterIds;
-        this.domains = (domains != null) ? domains : new HashSet<String>();
-    }
-
-    public int getTenantId() {
-        return tenantId;
-    }
-
-    public String getServiceName() {
-        return serviceName;
-    }
-
-    public Set<String> getClusterIds() {
-        return Collections.unmodifiableSet(clusterIds);
-    }
-
-    public Set<String> getDomains() {
-        return Collections.unmodifiableSet(domains);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java
index bf0e288..d89de12 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/TenantSubscribedEvent.java
@@ -31,13 +31,11 @@ public class TenantSubscribedEvent extends TenantEvent implements Serializable {
     private final int tenantId;
     private final String serviceName;
     private final Set<String> clusterIds;
-    private final Set<String> domains;
 
-    public TenantSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds, Set<String> domains) {
+    public TenantSubscribedEvent(int tenantId, String serviceName, Set<String> clusterIds) {
         this.tenantId = tenantId;
         this.serviceName = serviceName;
         this.clusterIds = clusterIds;
-        this.domains = (domains != null) ? domains : new HashSet<String>();
     }
 
     public int getTenantId() {
@@ -51,8 +49,4 @@ public class TenantSubscribedEvent extends TenantEvent implements Serializable {
     public Set<String> getClusterIds() {
         return Collections.unmodifiableSet(clusterIds);
     }
-
-    public Set<String> getDomains() {
-        return Collections.unmodifiableSet(domains);
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainAddedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainAddedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainAddedMessageProcessor.java
new file mode 100644
index 0000000..fa85e30
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainAddedMessageProcessor.java
@@ -0,0 +1,98 @@
+/*
+ * 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.messaging.message.processor.tenant;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.tenant.Subscription;
+import org.apache.stratos.messaging.domain.tenant.SubscriptionDomain;
+import org.apache.stratos.messaging.domain.tenant.Tenant;
+import org.apache.stratos.messaging.event.tenant.SubscriptionDomainAddedEvent;
+import org.apache.stratos.messaging.event.tenant.TenantSubscribedEvent;
+import org.apache.stratos.messaging.message.processor.MessageProcessor;
+import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
+import org.apache.stratos.messaging.util.Util;
+
+/**
+ * Tenant subscribed message processor for adding domains to tenant subscriptions.
+ */
+public class SubscriptionDomainAddedMessageProcessor extends MessageProcessor {
+
+    private static final Log log = LogFactory.getLog(SubscriptionDomainAddedMessageProcessor.class);
+
+    private MessageProcessor nextProcessor;
+
+    @Override
+    public void setNext(MessageProcessor nextProcessor) {
+        this.nextProcessor = nextProcessor;
+    }
+
+    @Override
+    public boolean process(String type, String message, Object object) {
+        if (SubscriptionDomainAddedEvent.class.getName().equals(type)) {
+            // Return if tenant manager has not initialized
+            if(!TenantManager.getInstance().isInitialized()) {
+                return false;
+            }
+
+            // Parse complete message and build event
+            SubscriptionDomainAddedEvent event = (SubscriptionDomainAddedEvent) Util.jsonToObject(message, TenantSubscribedEvent.class);
+
+            try {
+                TenantManager.acquireWriteLock();
+                Tenant tenant = TenantManager.getInstance().getTenant(event.getTenantId());
+                if(tenant == null) {
+                    if(log.isWarnEnabled()) {
+                        log.warn(String.format("Tenant not found: [tenant-id] %d", event.getTenantId()));
+                    }
+                    return false;
+                }
+                Subscription subscription = tenant.getSubscription(event.getServiceName());
+                if(subscription == null) {
+                    if(log.isWarnEnabled()) {
+                        log.warn(String.format("Subscription not found: [tenant-id] %d", event.getTenantId()));
+                    }
+                    return false;
+                }
+                subscription.addSubscriptionDomain(new SubscriptionDomain(event.getDomainName(), event.getApplicationAlias()));
+                if(log.isInfoEnabled()) {
+                    log.info(String.format("Domain added to tenant subscription: [tenant-id] %d [tenant-domain] %s " +
+                            "[service] %s [domain-name] %s [application-alias] %s", tenant.getTenantId(),
+                            tenant.getTenantDomain(), event.getServiceName(), event.getDomainName(), event.getApplicationAlias()));
+                }
+
+                // Notify event listeners
+                notifyEventListeners(event);
+                return true;
+            }
+            finally {
+                TenantManager.releaseWriteLock();
+            }
+        }
+        else {
+            if(nextProcessor != null) {
+                return nextProcessor.process(type, message, object);
+            }
+            else {
+                throw new RuntimeException(String.format("Failed to process tenant message using available message processors: [type] %s [body] %s", type, message));
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainRemovedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainRemovedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainRemovedMessageProcessor.java
new file mode 100644
index 0000000..9ec41a1
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainRemovedMessageProcessor.java
@@ -0,0 +1,97 @@
+/*
+ * 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.messaging.message.processor.tenant;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.tenant.Subscription;
+import org.apache.stratos.messaging.domain.tenant.Tenant;
+import org.apache.stratos.messaging.event.tenant.SubscriptionDomainAddedEvent;
+import org.apache.stratos.messaging.event.tenant.TenantSubscribedEvent;
+import org.apache.stratos.messaging.message.processor.MessageProcessor;
+import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
+import org.apache.stratos.messaging.util.Util;
+
+/**
+ * Tenant subscribed message processor for removing domains from tenant subscriptions.
+ */
+public class SubscriptionDomainRemovedMessageProcessor extends MessageProcessor {
+
+    private static final Log log = LogFactory.getLog(SubscriptionDomainRemovedMessageProcessor.class);
+
+    private MessageProcessor nextProcessor;
+
+    @Override
+    public void setNext(MessageProcessor nextProcessor) {
+        this.nextProcessor = nextProcessor;
+    }
+
+    @Override
+    public boolean process(String type, String message, Object object) {
+        if (SubscriptionDomainAddedEvent.class.getName().equals(type)) {
+            // Return if tenant manager has not initialized
+            if(!TenantManager.getInstance().isInitialized()) {
+                return false;
+            }
+
+            // Parse complete message and build event
+            SubscriptionDomainAddedEvent event = (SubscriptionDomainAddedEvent) Util.jsonToObject(message, TenantSubscribedEvent.class);
+
+            try {
+                TenantManager.acquireWriteLock();
+                Tenant tenant = TenantManager.getInstance().getTenant(event.getTenantId());
+                if(tenant == null) {
+                    if(log.isWarnEnabled()) {
+                        log.warn(String.format("Tenant not found: [tenant-id] %d", event.getTenantId()));
+                    }
+                    return false;
+                }
+                Subscription subscription = tenant.getSubscription(event.getServiceName());
+                if(subscription == null) {
+                    if(log.isWarnEnabled()) {
+                        log.warn(String.format("Subscription not found: [tenant-id] %d", event.getTenantId()));
+                    }
+                    return false;
+                }
+                subscription.removeSubscriptionDomain(event.getDomainName());
+                if(log.isInfoEnabled()) {
+                    log.info(String.format("Domain removed from tenant subscription: [tenant-id] %d [tenant-domain] %s " +
+                            "[service] %s [domain-name] %s", tenant.getTenantId(), tenant.getTenantDomain(),
+                            event.getServiceName(), event.getDomainName()));
+                }
+
+                // Notify event listeners
+                notifyEventListeners(event);
+                return true;
+            }
+            finally {
+                TenantManager.releaseWriteLock();
+            }
+        }
+        else {
+            if(nextProcessor != null) {
+                return nextProcessor.process(type, message, object);
+            }
+            else {
+                throw new RuntimeException(String.format("Failed to process tenant message using available message processors: [type] %s [body] %s", type, message));
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainsAddedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainsAddedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainsAddedMessageProcessor.java
deleted file mode 100644
index aeea6bf..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainsAddedMessageProcessor.java
+++ /dev/null
@@ -1,96 +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.messaging.message.processor.tenant;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.messaging.domain.tenant.Subscription;
-import org.apache.stratos.messaging.domain.tenant.Tenant;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainsAddedEvent;
-import org.apache.stratos.messaging.event.tenant.TenantSubscribedEvent;
-import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
-import org.apache.stratos.messaging.util.Util;
-
-/**
- * Tenant subscribed message processor for adding domains to tenant subscriptions.
- */
-public class SubscriptionDomainsAddedMessageProcessor extends MessageProcessor {
-
-    private static final Log log = LogFactory.getLog(SubscriptionDomainsAddedMessageProcessor.class);
-
-    private MessageProcessor nextProcessor;
-
-    @Override
-    public void setNext(MessageProcessor nextProcessor) {
-        this.nextProcessor = nextProcessor;
-    }
-
-    @Override
-    public boolean process(String type, String message, Object object) {
-        if (SubscriptionDomainsAddedEvent.class.getName().equals(type)) {
-            // Return if tenant manager has not initialized
-            if(!TenantManager.getInstance().isInitialized()) {
-                return false;
-            }
-
-            // Parse complete message and build event
-            SubscriptionDomainsAddedEvent event = (SubscriptionDomainsAddedEvent) Util.jsonToObject(message, TenantSubscribedEvent.class);
-
-            try {
-                TenantManager.acquireWriteLock();
-                Tenant tenant = TenantManager.getInstance().getTenant(event.getTenantId());
-                if(tenant == null) {
-                    if(log.isWarnEnabled()) {
-                        log.warn(String.format("Tenant not found: [tenant-id] %d", event.getTenantId()));
-                    }
-                    return false;
-                }
-                Subscription subscription = tenant.getSubscription(event.getServiceName());
-                if(subscription == null) {
-                    if(log.isWarnEnabled()) {
-                        log.warn(String.format("Subscription not found: [tenant-id] %d", event.getTenantId()));
-                    }
-                    return false;
-                }
-                subscription.addDomains(event.getDomains());
-                if(log.isInfoEnabled()) {
-                    log.info(String.format("Domains added to tenant subscription: [tenant-id] %d [tenant-domain] %s [service] %s [domains] %s",
-                             tenant.getTenantId(), tenant.getTenantDomain(), event.getServiceName(), event.getDomains()));
-                }
-
-                // Notify event listeners
-                notifyEventListeners(event);
-                return true;
-            }
-            finally {
-                TenantManager.releaseWriteLock();
-            }
-        }
-        else {
-            if(nextProcessor != null) {
-                return nextProcessor.process(type, message, object);
-            }
-            else {
-                throw new RuntimeException(String.format("Failed to process tenant message using available message processors: [type] %s [body] %s", type, message));
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/70ed8571/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainsRemovedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainsRemovedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainsRemovedMessageProcessor.java
deleted file mode 100644
index fc08357..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainsRemovedMessageProcessor.java
+++ /dev/null
@@ -1,96 +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.messaging.message.processor.tenant;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.messaging.domain.tenant.Subscription;
-import org.apache.stratos.messaging.domain.tenant.Tenant;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainsAddedEvent;
-import org.apache.stratos.messaging.event.tenant.TenantSubscribedEvent;
-import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
-import org.apache.stratos.messaging.util.Util;
-
-/**
- * Tenant subscribed message processor for removing domains from tenant subscriptions.
- */
-public class SubscriptionDomainsRemovedMessageProcessor extends MessageProcessor {
-
-    private static final Log log = LogFactory.getLog(SubscriptionDomainsRemovedMessageProcessor.class);
-
-    private MessageProcessor nextProcessor;
-
-    @Override
-    public void setNext(MessageProcessor nextProcessor) {
-        this.nextProcessor = nextProcessor;
-    }
-
-    @Override
-    public boolean process(String type, String message, Object object) {
-        if (SubscriptionDomainsAddedEvent.class.getName().equals(type)) {
-            // Return if tenant manager has not initialized
-            if(!TenantManager.getInstance().isInitialized()) {
-                return false;
-            }
-
-            // Parse complete message and build event
-            SubscriptionDomainsAddedEvent event = (SubscriptionDomainsAddedEvent) Util.jsonToObject(message, TenantSubscribedEvent.class);
-
-            try {
-                TenantManager.acquireWriteLock();
-                Tenant tenant = TenantManager.getInstance().getTenant(event.getTenantId());
-                if(tenant == null) {
-                    if(log.isWarnEnabled()) {
-                        log.warn(String.format("Tenant not found: [tenant-id] %d", event.getTenantId()));
-                    }
-                    return false;
-                }
-                Subscription subscription = tenant.getSubscription(event.getServiceName());
-                if(subscription == null) {
-                    if(log.isWarnEnabled()) {
-                        log.warn(String.format("Subscription not found: [tenant-id] %d", event.getTenantId()));
-                    }
-                    return false;
-                }
-                subscription.removeDomains(event.getDomains());
-                if(log.isInfoEnabled()) {
-                    log.info(String.format("Domains removed from tenant subscription: [tenant-id] %d [tenant-domain] %s [service] %s [domains] %s",
-                             tenant.getTenantId(), tenant.getTenantDomain(), event.getServiceName(), event.getDomains()));
-                }
-
-                // Notify event listeners
-                notifyEventListeners(event);
-                return true;
-            }
-            finally {
-                TenantManager.releaseWriteLock();
-            }
-        }
-        else {
-            if(nextProcessor != null) {
-                return nextProcessor.process(type, message, object);
-            }
-            else {
-                throw new RuntimeException(String.format("Failed to process tenant message using available message processors: [type] %s [body] %s", type, message));
-            }
-        }
-    }
-}