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 2015/01/09 17:39:59 UTC

[1/5] stratos git commit: Replacing signup-id with tenant-id and introducing domain mapping stratos manager service methods and rest api methods

Repository: stratos
Updated Branches:
  refs/heads/master e54f24203 -> 8edb91a36


http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/impl/StratosManagerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/impl/StratosManagerServiceImpl.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/impl/StratosManagerServiceImpl.java
index f4780df..f037d6e 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/impl/StratosManagerServiceImpl.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/impl/StratosManagerServiceImpl.java
@@ -21,12 +21,15 @@ package org.apache.stratos.manager.services.impl;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.manager.components.ApplicationSignUpManager;
+import org.apache.stratos.manager.components.ApplicationSignUpHandler;
 import org.apache.stratos.manager.components.ArtifactDistributionCoordinator;
+import org.apache.stratos.manager.components.DomainMappingHandler;
 import org.apache.stratos.manager.domain.ApplicationSignUp;
 import org.apache.stratos.manager.exception.ApplicationSignUpException;
 import org.apache.stratos.manager.exception.ArtifactDistributionCoordinatorException;
+import org.apache.stratos.manager.exception.DomainMappingException;
 import org.apache.stratos.manager.services.StratosManagerService;
+import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
 
 import java.util.List;
 
@@ -37,41 +40,58 @@ public class StratosManagerServiceImpl implements StratosManagerService {
 
     private static final Log log = LogFactory.getLog(StratosManagerServiceImpl.class);
 
-    private ApplicationSignUpManager signUpManager;
+    private ApplicationSignUpHandler signUpHandler;
     private ArtifactDistributionCoordinator artifactDistributionCoordinator;
+    private DomainMappingHandler domainMappingHandler;
 
     public StratosManagerServiceImpl() {
-        signUpManager = new ApplicationSignUpManager();
+        signUpHandler = new ApplicationSignUpHandler();
         artifactDistributionCoordinator = new ArtifactDistributionCoordinator();
+        domainMappingHandler = new DomainMappingHandler();
     }
 
     @Override
-    public String addApplicationSignUp(ApplicationSignUp applicationSignUp) throws ApplicationSignUpException {
-        return signUpManager.addApplicationSignUp(applicationSignUp);
+    public void addApplicationSignUp(ApplicationSignUp applicationSignUp) throws ApplicationSignUpException {
+        signUpHandler.addApplicationSignUp(applicationSignUp);
     }
 
     @Override
-    public void removeApplicationSignUp(String signUpId) throws ApplicationSignUpException {
-        signUpManager.removeApplicationSignUp(signUpId);
+    public void removeApplicationSignUp(String applicationId, int tenantId) throws ApplicationSignUpException {
+        signUpHandler.removeApplicationSignUp(applicationId, tenantId);
     }
 
     @Override
-    public ApplicationSignUp getApplicationSignUp(String signUpId) throws ApplicationSignUpException {
-        return signUpManager.getApplicationSignUp(signUpId);
+    public ApplicationSignUp getApplicationSignUp(String applicationId, int tenantId) throws ApplicationSignUpException {
+        return signUpHandler.getApplicationSignUp(applicationId, tenantId);
     }
 
     @Override
-    public List<ApplicationSignUp> getApplicationSignUps(String applicationId) throws ApplicationSignUpException {
-        return signUpManager.getApplicationSignUps(applicationId);
+    public ApplicationSignUp[] getApplicationSignUps(String applicationId) throws ApplicationSignUpException {
+        return signUpHandler.getApplicationSignUps(applicationId);
     }
 
     @Override
-    public void notifyArtifactUpdatedEventForSignUp(String signUpId) throws ArtifactDistributionCoordinatorException {
-        artifactDistributionCoordinator.notifyArtifactUpdatedEventForSignUp(signUpId);
+    public void notifyArtifactUpdatedEventForSignUp(String applicationId, int tenantId) throws ArtifactDistributionCoordinatorException {
+        artifactDistributionCoordinator.notifyArtifactUpdatedEventForSignUp(applicationId, tenantId);
     }
 
     @Override
     public void notifyArtifactUpdatedEventForRepository(String repoUrl) throws ArtifactDistributionCoordinatorException {
         artifactDistributionCoordinator.notifyArtifactUpdatedEventForRepository(repoUrl);
     }
+
+    @Override
+    public void addDomainMapping(DomainMapping domainMapping) throws DomainMappingException {
+        domainMappingHandler.addDomainMapping(domainMapping);
+    }
+
+    @Override
+    public DomainMapping[] getDomainMappings(String applicationId, int tenantId) throws DomainMappingException {
+        return domainMappingHandler.getDomainMappings(applicationId, tenantId);
+    }
+
+    @Override
+    public void removeDomainMapping(String applicationId, int tenantId, String domainName) throws DomainMappingException {
+        domainMappingHandler.removeDomainMapping(applicationId, tenantId, domainName);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/CompleteDomainMappingsEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/CompleteDomainMappingsEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/CompleteDomainMappingsEvent.java
deleted file mode 100644
index 5d73dcf..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/CompleteDomainMappingsEvent.java
+++ /dev/null
@@ -1,45 +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.domain.mapping;
-
-import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
-import org.apache.stratos.messaging.event.Event;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * This event is fired periodically to be able for client's to initialize the current state
- * of the domain mappings.
- */
-public class CompleteDomainMappingsEvent extends Event implements Serializable {
-
-    private static final long serialVersionUID = -3540099493690136278L;
-
-    private final List<DomainMapping> domainMappings;
-
-    public CompleteDomainMappingsEvent(List<DomainMapping> domainMappings) {
-        this.domainMappings = domainMappings;
-    }
-
-    public List<DomainMapping> getDomainMappings() {
-        return domainMappings;
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java
index 2a3583e..83be807 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java
@@ -30,31 +30,31 @@ public class DomainMappingAddedEvent extends Event implements Serializable {
 
     private static final long serialVersionUID = 3457484382856403382L;
 
-    private final int tenantId;
     private final String applicationId;
+    private final int tenantId;
     private final String serviceName;
     private final String clusterId;
     private final String domainName;
     private final String contextPath;
 
-    public DomainMappingAddedEvent(int tenantId, String applicationId, String serviceName, String clusterId,
+    public DomainMappingAddedEvent(String applicationId, int tenantId, String serviceName, String clusterId,
                                    String domainName, String contextPath) {
-        this.tenantId = tenantId;
         this.applicationId = applicationId;
+        this.tenantId = tenantId;
         this.serviceName = serviceName;
         this.clusterId = clusterId;
         this.domainName = domainName;
         this.contextPath = contextPath;
     }
 
-    public int getTenantId() {
-        return tenantId;
-    }
-
     public String getApplicationId() {
         return applicationId;
     }
 
+    public int getTenantId() {
+        return tenantId;
+    }
+
     public String getServiceName() {
         return serviceName;
     }
@@ -70,4 +70,11 @@ public class DomainMappingAddedEvent extends Event implements Serializable {
     public String getContextPath() {
         return contextPath;
     }
+
+    @Override
+    public String toString() {
+        return String.format("[application-id] %s [tenant-id] %d [service-name] %s [cluster-id] %s [domain-name] %s " +
+                "[context-path] %s", getApplicationId(), getTenantId(), getServiceName(), getClusterId(), getDomainName(),
+                getContextPath());
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java
index 9c529b1..4b9728b 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java
@@ -29,29 +29,29 @@ import java.io.Serializable;
 public class DomainMappingRemovedEvent extends Event implements Serializable {
     private static final long serialVersionUID = -8837521344795740210L;
 
-    private final int tenantId;
     private final String applicationId;
+    private final int tenantId;
     private final String serviceName;
     private final String clusterId;
     private final String domainName;
 
-    public DomainMappingRemovedEvent(int tenantId, String applicationId, String serviceName,
+    public DomainMappingRemovedEvent(String applicationId, int tenantId, String serviceName,
                                      String clusterId, String domainName) {
-        this.tenantId = tenantId;
         this.applicationId = applicationId;
+        this.tenantId = tenantId;
         this.serviceName = serviceName;
         this.clusterId = clusterId;
         this.domainName = domainName;
     }
 
-    public int getTenantId() {
-        return tenantId;
-    }
-
     public String getApplicationId() {
         return applicationId;
     }
 
+    public int getTenantId() {
+        return tenantId;
+    }
+
     public String getServiceName() {
         return serviceName;
     }
@@ -63,4 +63,10 @@ public class DomainMappingRemovedEvent extends Event implements Serializable {
     public String getDomainName() {
         return domainName;
     }
+
+    @Override
+    public String toString() {
+        return String.format("[application-id] %s [tenant-id] %d [service-name] %s [cluster-id] %s [domain-name] %s ",
+                getApplicationId(), getTenantId(), getServiceName(), getClusterId(), getDomainName());
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/CompleteDomainMappingsEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/CompleteDomainMappingsEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/CompleteDomainMappingsEventListener.java
deleted file mode 100644
index f62a3d8..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/CompleteDomainMappingsEventListener.java
+++ /dev/null
@@ -1,28 +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.listener.domain.mapping;
-
-import org.apache.stratos.messaging.listener.EventListener;
-
-/**
- * Complete domain mappings event listener.
- */
-public abstract class CompleteDomainMappingsEventListener extends EventListener {
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/CompleteDomainMappingsMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/CompleteDomainMappingsMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/CompleteDomainMappingsMessageProcessor.java
deleted file mode 100644
index 3b20eb0..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/CompleteDomainMappingsMessageProcessor.java
+++ /dev/null
@@ -1,81 +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.domain.mapping;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.messaging.event.domain.mapping.CompleteDomainMappingsEvent;
-import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.domain.mapping.DomainMappingManager;
-import org.apache.stratos.messaging.util.Util;
-
-/**
- * Complete domain mappings message processor.
- */
-public class CompleteDomainMappingsMessageProcessor extends MessageProcessor {
-
-    private static final Log log = LogFactory.getLog(CompleteDomainMappingsMessageProcessor.class);
-
-    private MessageProcessor nextProcessor;
-
-    @Override
-    public void setNext(MessageProcessor nextProcessor) {
-        this.nextProcessor = nextProcessor;
-    }
-
-    @Override
-    public boolean process(String type, String message, Object object) {
-        if (CompleteDomainMappingsEvent.class.getName().equals(type)) {
-            // Return if domain mappings manager has already initialized
-            if(DomainMappingManager.getInstance().isInitialized()) {
-                return false;
-            }
-
-            // Parse complete message and build event
-            CompleteDomainMappingsEvent event = (CompleteDomainMappingsEvent) Util.jsonToObject(message,
-                    CompleteDomainMappingsEvent.class);
-
-            try {
-                DomainMappingManager.acquireWriteLock();
-                DomainMappingManager.getInstance().addDomainMappings(event.getDomainMappings());
-                if(log.isInfoEnabled()) {
-                    log.info("Domain mappings manager initialized");
-                }
-                DomainMappingManager.getInstance().setInitialized(true);
-
-                // Notify event listeners
-                notifyEventListeners(event);
-                return true;
-            }
-            finally {
-                DomainMappingManager.releaseWriteLock();
-            }
-        }
-        else {
-            if(nextProcessor != null) {
-                return nextProcessor.process(type, message, object);
-            }
-            else {
-                throw new RuntimeException(String.format("Failed to process domain mapping event message using " +
-                        "available message processors: [type] %s [body] %s", type, message));
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java
index dd03cd5..75a14bd 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java
@@ -22,7 +22,6 @@ package org.apache.stratos.messaging.message.processor.domain.mapping;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.messaging.listener.EventListener;
-import org.apache.stratos.messaging.listener.domain.mapping.CompleteDomainMappingsEventListener;
 import org.apache.stratos.messaging.listener.domain.mapping.DomainMappingAddedEventListener;
 import org.apache.stratos.messaging.listener.domain.mapping.DomainMappingRemovedEventListener;
 import org.apache.stratos.messaging.message.processor.MessageProcessorChain;
@@ -34,15 +33,11 @@ public class DomainMappingMessageProcessorChain extends MessageProcessorChain {
 
     private static final Log log = LogFactory.getLog(DomainMappingMessageProcessorChain.class);
 
-    private CompleteDomainMappingsMessageProcessor completeDomainMappingsMessageProcessor;
     private DomainNameAddedMessageProcessor domainNameAddedMessageProcessor;
     private DomainNameRemovedMessageProcessor domainNameRemovedMessageProcessor;
 
     @Override
     protected void initialize() {
-        completeDomainMappingsMessageProcessor = new CompleteDomainMappingsMessageProcessor();
-        add(completeDomainMappingsMessageProcessor);
-
         domainNameAddedMessageProcessor = new DomainNameAddedMessageProcessor();
         add(domainNameAddedMessageProcessor);
 
@@ -52,9 +47,7 @@ public class DomainMappingMessageProcessorChain extends MessageProcessorChain {
 
     @Override
     public void addEventListener(EventListener eventListener) {
-        if (eventListener instanceof CompleteDomainMappingsEventListener) {
-            completeDomainMappingsMessageProcessor.addEventListener(eventListener);
-        } else if (eventListener instanceof DomainMappingAddedEventListener) {
+        if (eventListener instanceof DomainMappingAddedEventListener) {
             domainNameAddedMessageProcessor.addEventListener(eventListener);
         } else if (eventListener instanceof DomainMappingRemovedEventListener) {
             domainNameRemovedMessageProcessor.addEventListener(eventListener);

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
index 43de224..4802b8a 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
@@ -413,7 +413,7 @@ public class StratosApiV41 extends AbstractApi {
     }
 
     @POST
-    @Path("/applications/{applicationId}/signups")
+    @Path("/applications/{applicationId}/signup")
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
@@ -424,13 +424,13 @@ public class StratosApiV41 extends AbstractApi {
     }
 
     @GET
-    @Path("/applications/{applicationId}/signups/{signUpId}")
+    @Path("/applications/{applicationId}/signup")
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
     public Response getApplicationSignUp(@PathParam("applicationId") String applicationId,
                                          @PathParam("signUpId") String signUpId) throws RestAPIException {
-        ApplicationSignUpBean applicationSignUpBean = StratosApiV41Utils.getApplicationSignUp(applicationId, signUpId);
+        ApplicationSignUpBean applicationSignUpBean = StratosApiV41Utils.getApplicationSignUp(applicationId);
         if (applicationSignUpBean == null) {
             return Response.status(Response.Status.NOT_FOUND).build();
         }
@@ -438,28 +438,15 @@ public class StratosApiV41 extends AbstractApi {
     }
 
     @DELETE
-    @Path("/applications/{applicationId}/signups/{signUpId}")
+    @Path("/applications/{applicationId}/signup")
     @Produces("application/json")
     @Consumes("application/json")
     @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public Response removeApplicationSignUp(@PathParam("applicationId") String applicationId,
-                                            @PathParam("signUpId") String signUpId) throws RestAPIException {
-        StratosApiV41Utils.removeApplicationSignUp(applicationId, signUpId);
+    public Response removeApplicationSignUp(@PathParam("applicationId") String applicationId) throws RestAPIException {
+        StratosApiV41Utils.removeApplicationSignUp(applicationId);
         return Response.ok().build();
     }
 
-    @GET
-    @Path("/applications/{applicationId}/signups")
-    @Produces("application/json")
-    @Consumes("application/json")
-    @AuthorizationAction("/permission/protected/manage/monitor/tenants")
-    public Response getApplicationSignUps(@PathParam("applicationId") String applicationId) throws RestAPIException {
-        List<ApplicationSignUpBean> applicationSignUpBeans = StratosApiV41Utils.getApplicationSignUps(applicationId);
-        ApplicationSignUpBean[] applicationSignUpBeansArray = applicationSignUpBeans.toArray(
-                new ApplicationSignUpBean[applicationSignUpBeans.size()]);
-        return Response.ok(applicationSignUpBeansArray).build();
-    }
-
     /**
      * Undeploy application.
      *

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
index f9fabc1..cb7a4ef 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
@@ -60,6 +60,7 @@ import org.apache.stratos.messaging.message.receiver.applications.ApplicationMan
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 import org.apache.stratos.rest.endpoint.exception.RestAPIException;
 import org.apache.stratos.rest.endpoint.util.converter.ObjectConverter;
+import org.wso2.carbon.context.CarbonContext;
 
 import java.rmi.RemoteException;
 import java.util.*;
@@ -1359,18 +1360,22 @@ public class StratosApiV41Utils {
                 log.info(String.format("Adding application signup: [application-id] %s", applicationId));
             }
 
+            int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
+
             StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance();
             ApplicationSignUp applicationSignUp = ObjectConverter.convertApplicationSignUpBeanToStubApplicationSignUp(applicationSignUpBean);
-            String signupId = serviceClient.addApplicationSignUp(applicationSignUp);
+            applicationSignUp.setTenantId(tenantId);
+            serviceClient.addApplicationSignUp(applicationSignUp);
+
             if(log.isInfoEnabled()) {
-                log.info(String.format("Application signup added successfully: [application-id] %s [signup-id] %s",
-                        applicationId, signupId));
+                log.info(String.format("Application signup added successfully: [application-id] %s [tenant-id] %d",
+                        applicationId, tenantId));
             }
 
-            serviceClient.notifyArtifactUpdatedEventForSignUp(signupId);
+            serviceClient.notifyArtifactUpdatedEventForSignUp(applicationId, tenantId);
             if(log.isInfoEnabled()) {
-                log.info(String.format("Artifact updated event sent: [application-id] %s [signup-id] %s",
-                        applicationId, signupId));
+                log.info(String.format("Artifact updated event sent: [application-id] %s [tenant-id] %d",
+                        applicationId, tenantId));
             }
         } catch (Exception e) {
             String message = "Error in application signup: [application-id] " + applicationId;
@@ -1379,7 +1384,7 @@ public class StratosApiV41Utils {
         }
     }
 
-    public static ApplicationSignUpBean getApplicationSignUp(String applicationId, String signUpId) throws RestAPIException {
+    public static ApplicationSignUpBean getApplicationSignUp(String applicationId) throws RestAPIException {
         if(StringUtils.isBlank(applicationId)) {
             throw new RestAPIException("Application id is null");
         }
@@ -1393,26 +1398,24 @@ public class StratosApiV41Utils {
             throw new RestAPIException("Application singups not available for single-tenant applications");
         }
 
-        if(StringUtils.isBlank(signUpId)) {
-            throw new RestAPIException("Signup id is null");
-        }
+        int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
 
         try {
             StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance();
-            ApplicationSignUp applicationSignUp = serviceClient.getApplicationSignUp(signUpId);
+            ApplicationSignUp applicationSignUp = serviceClient.getApplicationSignUp(applicationId, tenantId);
             if(applicationSignUp != null) {
                 return ObjectConverter.convertStubApplicationSignUpToApplicationSignUpBean(applicationSignUp);
             }
             return null;
         } catch (Exception e) {
-            String message = String.format("Could not get application signup: [application-id] %s [sign-up] %s",
-                    applicationId, signUpId);
+            String message = String.format("Could not get application signup: [application-id] %s [tenant-id] %d",
+                    applicationId, tenantId);
             log.error(message, e);
             throw new RestAPIException(message, e);
         }
     }
 
-    public static void removeApplicationSignUp(String applicationId, String signUpId) throws RestAPIException {
+    public static void removeApplicationSignUp(String applicationId) throws RestAPIException {
         if(StringUtils.isBlank(applicationId)) {
             throw new RestAPIException("Application id is null");
         }
@@ -1426,20 +1429,19 @@ public class StratosApiV41Utils {
             throw new RestAPIException("Application singups not available for single-tenant applications");
         }
 
-        if(StringUtils.isBlank(signUpId)) {
-            throw new RestAPIException("Signup id is null");
-        }
+        int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
 
         try {
             StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance();
-            serviceClient.removeApplicationSignUp(signUpId);
+            serviceClient.removeApplicationSignUp(applicationId, tenantId);
 
             if(log.isInfoEnabled()) {
                 log.info(String.format("Application signup removed successfully: [application-id] %s" +
-                        "[signup-id] %s", applicationId, signUpId));
+                        "[tenant-id] %d", applicationId, tenantId));
             }
         } catch (Exception e) {
-            String message = "Could not remove application signup: [application-id] " + applicationId;
+            String message = String.format("Could not remove application signup: [application-id] %s [tenant-id] %d ",
+                    applicationId, tenantId);
             log.error(message, e);
             throw new RestAPIException(message, e);
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
index ee6bb92..e3f18f8 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
@@ -1720,7 +1720,6 @@ public class ObjectConverter {
     public static ApplicationSignUpBean convertStubApplicationSignUpToApplicationSignUpBean(ApplicationSignUp applicationSignUp) {
         ApplicationSignUpBean applicationSignUpBean = new ApplicationSignUpBean();
         applicationSignUpBean.setApplicationId(applicationSignUp.getApplicationId());
-        applicationSignUpBean.setSignUpId(applicationSignUp.getSignUpId());
 
         if(applicationSignUp.getArtifactRepositories() != null) {
             List<ArtifactRepositoryBean> artifactRepositoryBeanList = new ArrayList<ArtifactRepositoryBean>();

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/service-stubs/org.apache.stratos.manager.service.stub/src/main/resources/StratosManagerService.wsdl
----------------------------------------------------------------------
diff --git a/service-stubs/org.apache.stratos.manager.service.stub/src/main/resources/StratosManagerService.wsdl b/service-stubs/org.apache.stratos.manager.service.stub/src/main/resources/StratosManagerService.wsdl
index 6db4f44..93e3acc 100644
--- a/service-stubs/org.apache.stratos.manager.service.stub/src/main/resources/StratosManagerService.wsdl
+++ b/service-stubs/org.apache.stratos.manager.service.stub/src/main/resources/StratosManagerService.wsdl
@@ -1,11 +1,24 @@
-<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://impl.services.manager.stratos.apache.org" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ax23="http://domain.manager.stratos.apache.org/xsd" xmlns:ax21="http://exception.manager.stratos.apache.org/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://impl.services.manager.stratos.apache.org">
+<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://impl.services.manager.stratos.apache.org" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ax23="http://domain.manager.stratos.apache.org/xsd" xmlns:ax24="http://mapping.domain.domain.messaging.stratos.apache.org/xsd" xmlns:ax21="http://exception.manager.stratos.apache.org/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://impl.services.manager.stratos.apache.org">
     <wsdl:types>
-        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://domain.manager.stratos.apache.org/xsd">
+        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mapping.domain.domain.messaging.stratos.apache.org/xsd">
+            <xs:complexType name="DomainMapping">
+                <xs:sequence>
+                    <xs:element minOccurs="0" name="applicationId" nillable="true" type="xs:string"/>
+                    <xs:element minOccurs="0" name="clusterId" nillable="true" type="xs:string"/>
+                    <xs:element minOccurs="0" name="contextPath" nillable="true" type="xs:string"/>
+                    <xs:element minOccurs="0" name="domainName" nillable="true" type="xs:string"/>
+                    <xs:element minOccurs="0" name="serviceName" nillable="true" type="xs:string"/>
+                    <xs:element minOccurs="0" name="tenantId" type="xs:int"/>
+                </xs:sequence>
+            </xs:complexType>
+        </xs:schema>
+        <xs:schema xmlns:ax25="http://mapping.domain.domain.messaging.stratos.apache.org/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://domain.manager.stratos.apache.org/xsd">
+            <xs:import namespace="http://mapping.domain.domain.messaging.stratos.apache.org/xsd"/>
             <xs:complexType name="ApplicationSignUp">
                 <xs:sequence>
                     <xs:element minOccurs="0" name="applicationId" nillable="true" type="xs:string"/>
                     <xs:element maxOccurs="unbounded" minOccurs="0" name="artifactRepositories" nillable="true" type="ax23:ArtifactRepository"/>
-                    <xs:element minOccurs="0" name="signUpId" nillable="true" type="xs:string"/>
+                    <xs:element maxOccurs="unbounded" minOccurs="0" name="domainMappings" nillable="true" type="ax25:DomainMapping"/>
                     <xs:element minOccurs="0" name="tenantId" type="xs:int"/>
                 </xs:sequence>
             </xs:complexType>
@@ -20,96 +33,143 @@
                 </xs:sequence>
             </xs:complexType>
         </xs:schema>
-        <xs:schema xmlns:ax24="http://domain.manager.stratos.apache.org/xsd" xmlns:ax22="http://exception.manager.stratos.apache.org/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://impl.services.manager.stratos.apache.org">
+        <xs:schema xmlns:ax27="http://mapping.domain.domain.messaging.stratos.apache.org/xsd" xmlns:ax26="http://domain.manager.stratos.apache.org/xsd" xmlns:ax22="http://exception.manager.stratos.apache.org/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://impl.services.manager.stratos.apache.org">
             <xs:import namespace="http://exception.manager.stratos.apache.org/xsd"/>
             <xs:import namespace="http://domain.manager.stratos.apache.org/xsd"/>
-            <xs:element name="StratosManagerServiceArtifactDistributionCoordinatorException">
+            <xs:import namespace="http://mapping.domain.domain.messaging.stratos.apache.org/xsd"/>
+            <xs:element name="StratosManagerServiceApplicationSignUpException">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="ArtifactDistributionCoordinatorException" nillable="true" type="ax21:ArtifactDistributionCoordinatorException"/>
+                        <xs:element minOccurs="0" name="ApplicationSignUpException" nillable="true" type="ax21:ApplicationSignUpException"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="notifyArtifactUpdatedEventForSignUp">
+            <xs:element name="addApplicationSignUp">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="signUpId" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="applicationSignUp" nillable="true" type="ax26:ApplicationSignUp"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="notifyArtifactUpdatedEventForRepository">
+            <xs:element name="removeApplicationSignUp">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="repoUrl" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="applicationId" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="tenantId" type="xs:int"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="StratosManagerServiceApplicationSignUpException">
+            <xs:element name="getApplicationSignUp">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="ApplicationSignUpException" nillable="true" type="ax21:ApplicationSignUpException"/>
+                        <xs:element minOccurs="0" name="applicationId" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="tenantId" type="xs:int"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="removeApplicationSignUp">
+            <xs:element name="getApplicationSignUpResponse">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="signUpId" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="return" nillable="true" type="ax26:ApplicationSignUp"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="getApplicationSignUp">
+            <xs:element name="getApplicationSignUps">
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element minOccurs="0" name="applicationId" nillable="true" type="xs:string"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="getApplicationSignUpsResponse">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="signUpId" nillable="true" type="xs:string"/>
+                        <xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="ax26:ApplicationSignUp"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="getApplicationSignUpResponse">
+            <xs:element name="StratosManagerServiceDomainMappingException">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="return" nillable="true" type="ax23:ApplicationSignUp"/>
+                        <xs:element minOccurs="0" name="DomainMappingException" nillable="true" type="ax21:DomainMappingException"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="getApplicationSignUps">
+            <xs:element name="getDomainMappings">
                 <xs:complexType>
                     <xs:sequence>
                         <xs:element minOccurs="0" name="applicationId" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="tenantId" type="xs:int"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="getApplicationSignUpsResponse">
+            <xs:element name="getDomainMappingsResponse">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="ax23:ApplicationSignUp"/>
+                        <xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="ax27:DomainMapping"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="addApplicationSignUp">
+            <xs:element name="removeDomainMapping">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="applicationSignUp" nillable="true" type="ax23:ApplicationSignUp"/>
+                        <xs:element minOccurs="0" name="applicationId" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="tenantId" type="xs:int"/>
+                        <xs:element minOccurs="0" name="domainName" nillable="true" type="xs:string"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
-            <xs:element name="addApplicationSignUpResponse">
+            <xs:element name="StratosManagerServiceArtifactDistributionCoordinatorException">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="ArtifactDistributionCoordinatorException" nillable="true" type="ax21:ArtifactDistributionCoordinatorException"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="notifyArtifactUpdatedEventForSignUp">
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element minOccurs="0" name="applicationId" nillable="true" type="xs:string"/>
+                        <xs:element minOccurs="0" name="tenantId" type="xs:int"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="notifyArtifactUpdatedEventForRepository">
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element minOccurs="0" name="repoUrl" nillable="true" type="xs:string"/>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+            <xs:element name="addDomainMapping">
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element minOccurs="0" name="domainMapping" nillable="true" type="ax27:DomainMapping"/>
                     </xs:sequence>
                 </xs:complexType>
             </xs:element>
         </xs:schema>
         <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://exception.manager.stratos.apache.org/xsd">
-            <xs:complexType name="ArtifactDistributionCoordinatorException">
+            <xs:complexType name="ApplicationSignUpException">
                 <xs:sequence/>
             </xs:complexType>
-            <xs:complexType name="ApplicationSignUpException">
+            <xs:complexType name="DomainMappingException">
+                <xs:sequence/>
+            </xs:complexType>
+            <xs:complexType name="ArtifactDistributionCoordinatorException">
                 <xs:sequence/>
             </xs:complexType>
         </xs:schema>
     </wsdl:types>
+    <wsdl:message name="getDomainMappingsRequest">
+        <wsdl:part name="parameters" element="ns:getDomainMappings"/>
+    </wsdl:message>
+    <wsdl:message name="getDomainMappingsResponse">
+        <wsdl:part name="parameters" element="ns:getDomainMappingsResponse"/>
+    </wsdl:message>
+    <wsdl:message name="StratosManagerServiceDomainMappingException">
+        <wsdl:part name="parameters" element="ns:StratosManagerServiceDomainMappingException"/>
+    </wsdl:message>
     <wsdl:message name="getApplicationSignUpsRequest">
         <wsdl:part name="parameters" element="ns:getApplicationSignUps"/>
     </wsdl:message>
@@ -125,9 +185,15 @@
     <wsdl:message name="StratosManagerServiceArtifactDistributionCoordinatorException">
         <wsdl:part name="parameters" element="ns:StratosManagerServiceArtifactDistributionCoordinatorException"/>
     </wsdl:message>
+    <wsdl:message name="addDomainMappingRequest">
+        <wsdl:part name="parameters" element="ns:addDomainMapping"/>
+    </wsdl:message>
     <wsdl:message name="removeApplicationSignUpRequest">
         <wsdl:part name="parameters" element="ns:removeApplicationSignUp"/>
     </wsdl:message>
+    <wsdl:message name="removeDomainMappingRequest">
+        <wsdl:part name="parameters" element="ns:removeDomainMapping"/>
+    </wsdl:message>
     <wsdl:message name="notifyArtifactUpdatedEventForRepositoryRequest">
         <wsdl:part name="parameters" element="ns:notifyArtifactUpdatedEventForRepository"/>
     </wsdl:message>
@@ -140,10 +206,12 @@
     <wsdl:message name="addApplicationSignUpRequest">
         <wsdl:part name="parameters" element="ns:addApplicationSignUp"/>
     </wsdl:message>
-    <wsdl:message name="addApplicationSignUpResponse">
-        <wsdl:part name="parameters" element="ns:addApplicationSignUpResponse"/>
-    </wsdl:message>
     <wsdl:portType name="StratosManagerServicePortType">
+        <wsdl:operation name="getDomainMappings">
+            <wsdl:input message="ns:getDomainMappingsRequest" wsaw:Action="urn:getDomainMappings"/>
+            <wsdl:output message="ns:getDomainMappingsResponse" wsaw:Action="urn:getDomainMappingsResponse"/>
+            <wsdl:fault message="ns:StratosManagerServiceDomainMappingException" name="StratosManagerServiceDomainMappingException" wsaw:Action="urn:getDomainMappingsStratosManagerServiceDomainMappingException"/>
+        </wsdl:operation>
         <wsdl:operation name="getApplicationSignUps">
             <wsdl:input message="ns:getApplicationSignUpsRequest" wsaw:Action="urn:getApplicationSignUps"/>
             <wsdl:output message="ns:getApplicationSignUpsResponse" wsaw:Action="urn:getApplicationSignUpsResponse"/>
@@ -153,10 +221,18 @@
             <wsdl:input message="ns:notifyArtifactUpdatedEventForSignUpRequest" wsaw:Action="urn:notifyArtifactUpdatedEventForSignUp"/>
             <wsdl:fault message="ns:StratosManagerServiceArtifactDistributionCoordinatorException" name="StratosManagerServiceArtifactDistributionCoordinatorException" wsaw:Action="urn:notifyArtifactUpdatedEventForSignUpStratosManagerServiceArtifactDistributionCoordinatorException"/>
         </wsdl:operation>
+        <wsdl:operation name="addDomainMapping">
+            <wsdl:input message="ns:addDomainMappingRequest" wsaw:Action="urn:addDomainMapping"/>
+            <wsdl:fault message="ns:StratosManagerServiceDomainMappingException" name="StratosManagerServiceDomainMappingException" wsaw:Action="urn:addDomainMappingStratosManagerServiceDomainMappingException"/>
+        </wsdl:operation>
         <wsdl:operation name="removeApplicationSignUp">
             <wsdl:input message="ns:removeApplicationSignUpRequest" wsaw:Action="urn:removeApplicationSignUp"/>
             <wsdl:fault message="ns:StratosManagerServiceApplicationSignUpException" name="StratosManagerServiceApplicationSignUpException" wsaw:Action="urn:removeApplicationSignUpStratosManagerServiceApplicationSignUpException"/>
         </wsdl:operation>
+        <wsdl:operation name="removeDomainMapping">
+            <wsdl:input message="ns:removeDomainMappingRequest" wsaw:Action="urn:removeDomainMapping"/>
+            <wsdl:fault message="ns:StratosManagerServiceDomainMappingException" name="StratosManagerServiceDomainMappingException" wsaw:Action="urn:removeDomainMappingStratosManagerServiceDomainMappingException"/>
+        </wsdl:operation>
         <wsdl:operation name="notifyArtifactUpdatedEventForRepository">
             <wsdl:input message="ns:notifyArtifactUpdatedEventForRepositoryRequest" wsaw:Action="urn:notifyArtifactUpdatedEventForRepository"/>
             <wsdl:fault message="ns:StratosManagerServiceArtifactDistributionCoordinatorException" name="StratosManagerServiceArtifactDistributionCoordinatorException" wsaw:Action="urn:notifyArtifactUpdatedEventForRepositoryStratosManagerServiceArtifactDistributionCoordinatorException"/>
@@ -168,12 +244,23 @@
         </wsdl:operation>
         <wsdl:operation name="addApplicationSignUp">
             <wsdl:input message="ns:addApplicationSignUpRequest" wsaw:Action="urn:addApplicationSignUp"/>
-            <wsdl:output message="ns:addApplicationSignUpResponse" wsaw:Action="urn:addApplicationSignUpResponse"/>
             <wsdl:fault message="ns:StratosManagerServiceApplicationSignUpException" name="StratosManagerServiceApplicationSignUpException" wsaw:Action="urn:addApplicationSignUpStratosManagerServiceApplicationSignUpException"/>
         </wsdl:operation>
     </wsdl:portType>
     <wsdl:binding name="StratosManagerServiceSoap11Binding" type="ns:StratosManagerServicePortType">
         <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <wsdl:operation name="getDomainMappings">
+            <soap:operation soapAction="urn:getDomainMappings" style="document"/>
+            <wsdl:input>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body use="literal"/>
+            </wsdl:output>
+            <wsdl:fault name="StratosManagerServiceDomainMappingException">
+                <soap:fault use="literal" name="StratosManagerServiceDomainMappingException"/>
+            </wsdl:fault>
+        </wsdl:operation>
         <wsdl:operation name="getApplicationSignUps">
             <soap:operation soapAction="urn:getApplicationSignUps" style="document"/>
             <wsdl:input>
@@ -195,6 +282,15 @@
                 <soap:fault use="literal" name="StratosManagerServiceArtifactDistributionCoordinatorException"/>
             </wsdl:fault>
         </wsdl:operation>
+        <wsdl:operation name="addDomainMapping">
+            <soap:operation soapAction="urn:addDomainMapping" style="document"/>
+            <wsdl:input>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:fault name="StratosManagerServiceDomainMappingException">
+                <soap:fault use="literal" name="StratosManagerServiceDomainMappingException"/>
+            </wsdl:fault>
+        </wsdl:operation>
         <wsdl:operation name="removeApplicationSignUp">
             <soap:operation soapAction="urn:removeApplicationSignUp" style="document"/>
             <wsdl:input>
@@ -204,6 +300,15 @@
                 <soap:fault use="literal" name="StratosManagerServiceApplicationSignUpException"/>
             </wsdl:fault>
         </wsdl:operation>
+        <wsdl:operation name="removeDomainMapping">
+            <soap:operation soapAction="urn:removeDomainMapping" style="document"/>
+            <wsdl:input>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:fault name="StratosManagerServiceDomainMappingException">
+                <soap:fault use="literal" name="StratosManagerServiceDomainMappingException"/>
+            </wsdl:fault>
+        </wsdl:operation>
         <wsdl:operation name="notifyArtifactUpdatedEventForRepository">
             <soap:operation soapAction="urn:notifyArtifactUpdatedEventForRepository" style="document"/>
             <wsdl:input>
@@ -230,9 +335,6 @@
             <wsdl:input>
                 <soap:body use="literal"/>
             </wsdl:input>
-            <wsdl:output>
-                <soap:body use="literal"/>
-            </wsdl:output>
             <wsdl:fault name="StratosManagerServiceApplicationSignUpException">
                 <soap:fault use="literal" name="StratosManagerServiceApplicationSignUpException"/>
             </wsdl:fault>
@@ -240,6 +342,18 @@
     </wsdl:binding>
     <wsdl:binding name="StratosManagerServiceSoap12Binding" type="ns:StratosManagerServicePortType">
         <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <wsdl:operation name="getDomainMappings">
+            <soap12:operation soapAction="urn:getDomainMappings" style="document"/>
+            <wsdl:input>
+                <soap12:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap12:body use="literal"/>
+            </wsdl:output>
+            <wsdl:fault name="StratosManagerServiceDomainMappingException">
+                <soap12:fault use="literal" name="StratosManagerServiceDomainMappingException"/>
+            </wsdl:fault>
+        </wsdl:operation>
         <wsdl:operation name="getApplicationSignUps">
             <soap12:operation soapAction="urn:getApplicationSignUps" style="document"/>
             <wsdl:input>
@@ -261,6 +375,15 @@
                 <soap12:fault use="literal" name="StratosManagerServiceArtifactDistributionCoordinatorException"/>
             </wsdl:fault>
         </wsdl:operation>
+        <wsdl:operation name="addDomainMapping">
+            <soap12:operation soapAction="urn:addDomainMapping" style="document"/>
+            <wsdl:input>
+                <soap12:body use="literal"/>
+            </wsdl:input>
+            <wsdl:fault name="StratosManagerServiceDomainMappingException">
+                <soap12:fault use="literal" name="StratosManagerServiceDomainMappingException"/>
+            </wsdl:fault>
+        </wsdl:operation>
         <wsdl:operation name="removeApplicationSignUp">
             <soap12:operation soapAction="urn:removeApplicationSignUp" style="document"/>
             <wsdl:input>
@@ -270,6 +393,15 @@
                 <soap12:fault use="literal" name="StratosManagerServiceApplicationSignUpException"/>
             </wsdl:fault>
         </wsdl:operation>
+        <wsdl:operation name="removeDomainMapping">
+            <soap12:operation soapAction="urn:removeDomainMapping" style="document"/>
+            <wsdl:input>
+                <soap12:body use="literal"/>
+            </wsdl:input>
+            <wsdl:fault name="StratosManagerServiceDomainMappingException">
+                <soap12:fault use="literal" name="StratosManagerServiceDomainMappingException"/>
+            </wsdl:fault>
+        </wsdl:operation>
         <wsdl:operation name="notifyArtifactUpdatedEventForRepository">
             <soap12:operation soapAction="urn:notifyArtifactUpdatedEventForRepository" style="document"/>
             <wsdl:input>
@@ -296,9 +428,6 @@
             <wsdl:input>
                 <soap12:body use="literal"/>
             </wsdl:input>
-            <wsdl:output>
-                <soap12:body use="literal"/>
-            </wsdl:output>
             <wsdl:fault name="StratosManagerServiceApplicationSignUpException">
                 <soap12:fault use="literal" name="StratosManagerServiceApplicationSignUpException"/>
             </wsdl:fault>
@@ -306,6 +435,15 @@
     </wsdl:binding>
     <wsdl:binding name="StratosManagerServiceHttpBinding" type="ns:StratosManagerServicePortType">
         <http:binding verb="POST"/>
+        <wsdl:operation name="getDomainMappings">
+            <http:operation location="getDomainMappings"/>
+            <wsdl:input>
+                <mime:content type="text/xml" part="parameters"/>
+            </wsdl:input>
+            <wsdl:output>
+                <mime:content type="text/xml" part="parameters"/>
+            </wsdl:output>
+        </wsdl:operation>
         <wsdl:operation name="getApplicationSignUps">
             <http:operation location="getApplicationSignUps"/>
             <wsdl:input>
@@ -321,12 +459,24 @@
                 <mime:content type="text/xml" part="parameters"/>
             </wsdl:input>
         </wsdl:operation>
+        <wsdl:operation name="addDomainMapping">
+            <http:operation location="addDomainMapping"/>
+            <wsdl:input>
+                <mime:content type="text/xml" part="parameters"/>
+            </wsdl:input>
+        </wsdl:operation>
         <wsdl:operation name="removeApplicationSignUp">
             <http:operation location="removeApplicationSignUp"/>
             <wsdl:input>
                 <mime:content type="text/xml" part="parameters"/>
             </wsdl:input>
         </wsdl:operation>
+        <wsdl:operation name="removeDomainMapping">
+            <http:operation location="removeDomainMapping"/>
+            <wsdl:input>
+                <mime:content type="text/xml" part="parameters"/>
+            </wsdl:input>
+        </wsdl:operation>
         <wsdl:operation name="notifyArtifactUpdatedEventForRepository">
             <http:operation location="notifyArtifactUpdatedEventForRepository"/>
             <wsdl:input>
@@ -347,9 +497,6 @@
             <wsdl:input>
                 <mime:content type="text/xml" part="parameters"/>
             </wsdl:input>
-            <wsdl:output>
-                <mime:content type="text/xml" part="parameters"/>
-            </wsdl:output>
         </wsdl:operation>
     </wsdl:binding>
     <wsdl:service name="StratosManagerService">


[5/5] stratos git commit: Introducing domain mapping messaging events, listeners, processors, receiver & manager

Posted by im...@apache.org.
Introducing domain mapping messaging events, listeners, processors, receiver & manager


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

Branch: refs/heads/master
Commit: 1b749533efcdcd8d8e59e0989c5a38ef632d99fd
Parents: e54f242
Author: Imesh Gunaratne <im...@apache.org>
Authored: Thu Jan 8 18:52:50 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Fri Jan 9 22:09:46 2015 +0530

----------------------------------------------------------------------
 .../domain/domain/mapping/DomainMapping.java    |  71 ++++++++
 .../mapping/CompleteDomainMappingsEvent.java    |  45 +++++
 .../domain/mapping/DomainMappingAddedEvent.java |  73 ++++++++
 .../mapping/DomainMappingRemovedEvent.java      |  66 +++++++
 .../tenant/SubscriptionDomainAddedEvent.java    |  67 -------
 .../tenant/SubscriptionDomainRemovedEvent.java  |  60 -------
 .../tenant/SubscriptionDomainsAddedEvent.java   |  60 -------
 .../tenant/SubscriptionDomainsRemovedEvent.java |  60 -------
 .../CompleteDomainMappingsEventListener.java    |  28 +++
 .../DomainMappingAddedEventListener.java        |  28 +++
 .../DomainMappingRemovedEventListener.java      |  28 +++
 .../SubscriptionDomainsAddedEventListener.java  |  28 ---
 ...SubscriptionDomainsRemovedEventListener.java |  28 ---
 .../CompleteDomainMappingsMessageProcessor.java |  81 +++++++++
 .../DomainMappingMessageProcessorChain.java     |  66 +++++++
 .../DomainNameAddedMessageProcessor.java        | 119 ++++++++++++
 .../DomainNameRemovedMessageProcessor.java      | 132 ++++++++++++++
 ...SubscriptionDomainAddedMessageProcessor.java | 100 -----------
 ...bscriptionDomainRemovedMessageProcessor.java |  97 ----------
 .../tenant/TenantMessageProcessorChain.java     |  14 +-
 .../DomainMappingEventMessageDelegator.java     |  93 ++++++++++
 .../DomainMappingEventMessageListener.java      |  55 ++++++
 .../mapping/DomainMappingEventMessageQueue.java |  29 +++
 .../mapping/DomainMappingEventReceiver.java     |  91 ++++++++++
 .../domain/mapping/DomainMappingManager.java    | 180 +++++++++++++++++++
 .../receiver/tenant/TenantEventReceiver.java    |   1 -
 .../topology/TopologyEventMessageDelegator.java |   1 +
 .../topology/TopologyEventReceiver.java         |   2 +
 .../org/apache/stratos/messaging/util/Util.java |   3 +-
 29 files changed, 1191 insertions(+), 515 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/domain/mapping/DomainMapping.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/domain/mapping/DomainMapping.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/domain/mapping/DomainMapping.java
new file mode 100644
index 0000000..6ac9e63
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/domain/mapping/DomainMapping.java
@@ -0,0 +1,71 @@
+/*
+ * 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.domain.mapping;
+
+import java.io.Serializable;
+
+/**
+ * Domain mapping definition.
+ */
+public class DomainMapping implements Serializable {
+
+    private static final long serialVersionUID = -3718485901172753504L;
+
+    private final int tenantId;
+    private final String applicationId;
+    private final String serviceName;
+    private final String clusterId;
+    private final String domainName;
+    private final String contextPath;
+
+    public DomainMapping(int tenantId, String applicationId, String serviceName, String clusterId,
+                         String domainName, String contextPath) {
+        this.tenantId = tenantId;
+        this.applicationId = applicationId;
+        this.serviceName = serviceName;
+        this.clusterId = clusterId;
+        this.domainName = domainName;
+        this.contextPath = contextPath;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getApplicationId() {
+        return applicationId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public String getContextPath() {
+        return contextPath;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/CompleteDomainMappingsEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/CompleteDomainMappingsEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/CompleteDomainMappingsEvent.java
new file mode 100644
index 0000000..5d73dcf
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/CompleteDomainMappingsEvent.java
@@ -0,0 +1,45 @@
+/*
+ * 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.domain.mapping;
+
+import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * This event is fired periodically to be able for client's to initialize the current state
+ * of the domain mappings.
+ */
+public class CompleteDomainMappingsEvent extends Event implements Serializable {
+
+    private static final long serialVersionUID = -3540099493690136278L;
+
+    private final List<DomainMapping> domainMappings;
+
+    public CompleteDomainMappingsEvent(List<DomainMapping> domainMappings) {
+        this.domainMappings = domainMappings;
+    }
+
+    public List<DomainMapping> getDomainMappings() {
+        return domainMappings;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java
new file mode 100644
index 0000000..2a3583e
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingAddedEvent.java
@@ -0,0 +1,73 @@
+/*
+ * 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.domain.mapping;
+
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+
+/**
+ * This event is fired when a domain name is added.
+ */
+public class DomainMappingAddedEvent extends Event implements Serializable {
+
+    private static final long serialVersionUID = 3457484382856403382L;
+
+    private final int tenantId;
+    private final String applicationId;
+    private final String serviceName;
+    private final String clusterId;
+    private final String domainName;
+    private final String contextPath;
+
+    public DomainMappingAddedEvent(int tenantId, String applicationId, String serviceName, String clusterId,
+                                   String domainName, String contextPath) {
+        this.tenantId = tenantId;
+        this.applicationId = applicationId;
+        this.serviceName = serviceName;
+        this.clusterId = clusterId;
+        this.domainName = domainName;
+        this.contextPath = contextPath;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getApplicationId() {
+        return applicationId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public String getContextPath() {
+        return contextPath;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java
new file mode 100644
index 0000000..9c529b1
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/domain/mapping/DomainMappingRemovedEvent.java
@@ -0,0 +1,66 @@
+/*
+ * 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.domain.mapping;
+
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+
+/**
+ * This event is fired when a domain name is removed.
+ */
+public class DomainMappingRemovedEvent extends Event implements Serializable {
+    private static final long serialVersionUID = -8837521344795740210L;
+
+    private final int tenantId;
+    private final String applicationId;
+    private final String serviceName;
+    private final String clusterId;
+    private final String domainName;
+
+    public DomainMappingRemovedEvent(int tenantId, String applicationId, String serviceName,
+                                     String clusterId, String domainName) {
+        this.tenantId = tenantId;
+        this.applicationId = applicationId;
+        this.serviceName = serviceName;
+        this.clusterId = clusterId;
+        this.domainName = domainName;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public String getApplicationId() {
+        return applicationId;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/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
deleted file mode 100644
index e2b87d4..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainAddedEvent.java
+++ /dev/null
@@ -1,67 +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 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 applicationContext;
-
-    public SubscriptionDomainAddedEvent(int tenantId, String serviceName, Set<String> clusterIds, String domainName,
-                                        String applicationContext) {
-        this.tenantId = tenantId;
-        this.serviceName = serviceName;
-        this.clusterIds = clusterIds;
-        this.domainName = domainName;
-        this.applicationContext = applicationContext;
-    }
-
-    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 getApplicationContext() {
-        return applicationContext;
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/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
deleted file mode 100644
index b3d9578..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/SubscriptionDomainRemovedEvent.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 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/stratos/blob/1b749533/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/stratos/blob/1b749533/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/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/CompleteDomainMappingsEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/CompleteDomainMappingsEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/CompleteDomainMappingsEventListener.java
new file mode 100644
index 0000000..f62a3d8
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/CompleteDomainMappingsEventListener.java
@@ -0,0 +1,28 @@
+/*
+ * 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.listener.domain.mapping;
+
+import org.apache.stratos.messaging.listener.EventListener;
+
+/**
+ * Complete domain mappings event listener.
+ */
+public abstract class CompleteDomainMappingsEventListener extends EventListener {
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/DomainMappingAddedEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/DomainMappingAddedEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/DomainMappingAddedEventListener.java
new file mode 100644
index 0000000..51910a8
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/DomainMappingAddedEventListener.java
@@ -0,0 +1,28 @@
+/*
+ * 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.listener.domain.mapping;
+
+import org.apache.stratos.messaging.listener.EventListener;
+
+/**
+ * Domain name added event listener.
+ */
+public abstract class DomainMappingAddedEventListener extends EventListener {
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/DomainMappingRemovedEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/DomainMappingRemovedEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/DomainMappingRemovedEventListener.java
new file mode 100644
index 0000000..7e3406e
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/domain/mapping/DomainMappingRemovedEventListener.java
@@ -0,0 +1,28 @@
+/*
+ * 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.listener.domain.mapping;
+
+import org.apache.stratos.messaging.listener.EventListener;
+
+/**
+ * Domain name removed event listener.
+ */
+public abstract class DomainMappingRemovedEventListener extends EventListener {
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsAddedEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsAddedEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsAddedEventListener.java
deleted file mode 100644
index 3f169b7..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsAddedEventListener.java
+++ /dev/null
@@ -1,28 +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.listener.tenant;
-
-import org.apache.stratos.messaging.listener.EventListener;
-
-/**
- * Tenant subscription domains added event listener.
- */
-public abstract class SubscriptionDomainsAddedEventListener extends EventListener {
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsRemovedEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsRemovedEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsRemovedEventListener.java
deleted file mode 100644
index 5c81ad6..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/tenant/SubscriptionDomainsRemovedEventListener.java
+++ /dev/null
@@ -1,28 +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.listener.tenant;
-
-import org.apache.stratos.messaging.listener.EventListener;
-
-/**
- * Tenant subscription domains removed event listener.
- */
-public abstract class SubscriptionDomainsRemovedEventListener extends EventListener {
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/CompleteDomainMappingsMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/CompleteDomainMappingsMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/CompleteDomainMappingsMessageProcessor.java
new file mode 100644
index 0000000..3b20eb0
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/CompleteDomainMappingsMessageProcessor.java
@@ -0,0 +1,81 @@
+/*
+ * 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.domain.mapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.event.domain.mapping.CompleteDomainMappingsEvent;
+import org.apache.stratos.messaging.message.processor.MessageProcessor;
+import org.apache.stratos.messaging.message.receiver.domain.mapping.DomainMappingManager;
+import org.apache.stratos.messaging.util.Util;
+
+/**
+ * Complete domain mappings message processor.
+ */
+public class CompleteDomainMappingsMessageProcessor extends MessageProcessor {
+
+    private static final Log log = LogFactory.getLog(CompleteDomainMappingsMessageProcessor.class);
+
+    private MessageProcessor nextProcessor;
+
+    @Override
+    public void setNext(MessageProcessor nextProcessor) {
+        this.nextProcessor = nextProcessor;
+    }
+
+    @Override
+    public boolean process(String type, String message, Object object) {
+        if (CompleteDomainMappingsEvent.class.getName().equals(type)) {
+            // Return if domain mappings manager has already initialized
+            if(DomainMappingManager.getInstance().isInitialized()) {
+                return false;
+            }
+
+            // Parse complete message and build event
+            CompleteDomainMappingsEvent event = (CompleteDomainMappingsEvent) Util.jsonToObject(message,
+                    CompleteDomainMappingsEvent.class);
+
+            try {
+                DomainMappingManager.acquireWriteLock();
+                DomainMappingManager.getInstance().addDomainMappings(event.getDomainMappings());
+                if(log.isInfoEnabled()) {
+                    log.info("Domain mappings manager initialized");
+                }
+                DomainMappingManager.getInstance().setInitialized(true);
+
+                // Notify event listeners
+                notifyEventListeners(event);
+                return true;
+            }
+            finally {
+                DomainMappingManager.releaseWriteLock();
+            }
+        }
+        else {
+            if(nextProcessor != null) {
+                return nextProcessor.process(type, message, object);
+            }
+            else {
+                throw new RuntimeException(String.format("Failed to process domain mapping event message using " +
+                        "available message processors: [type] %s [body] %s", type, message));
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java
new file mode 100644
index 0000000..dd03cd5
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainMappingMessageProcessorChain.java
@@ -0,0 +1,66 @@
+/*
+ * 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.domain.mapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.listener.EventListener;
+import org.apache.stratos.messaging.listener.domain.mapping.CompleteDomainMappingsEventListener;
+import org.apache.stratos.messaging.listener.domain.mapping.DomainMappingAddedEventListener;
+import org.apache.stratos.messaging.listener.domain.mapping.DomainMappingRemovedEventListener;
+import org.apache.stratos.messaging.message.processor.MessageProcessorChain;
+
+/**
+ * Domain mapping message processor chain.
+ */
+public class DomainMappingMessageProcessorChain extends MessageProcessorChain {
+
+    private static final Log log = LogFactory.getLog(DomainMappingMessageProcessorChain.class);
+
+    private CompleteDomainMappingsMessageProcessor completeDomainMappingsMessageProcessor;
+    private DomainNameAddedMessageProcessor domainNameAddedMessageProcessor;
+    private DomainNameRemovedMessageProcessor domainNameRemovedMessageProcessor;
+
+    @Override
+    protected void initialize() {
+        completeDomainMappingsMessageProcessor = new CompleteDomainMappingsMessageProcessor();
+        add(completeDomainMappingsMessageProcessor);
+
+        domainNameAddedMessageProcessor = new DomainNameAddedMessageProcessor();
+        add(domainNameAddedMessageProcessor);
+
+        domainNameRemovedMessageProcessor = new DomainNameRemovedMessageProcessor();
+        add(domainNameRemovedMessageProcessor);
+    }
+
+    @Override
+    public void addEventListener(EventListener eventListener) {
+        if (eventListener instanceof CompleteDomainMappingsEventListener) {
+            completeDomainMappingsMessageProcessor.addEventListener(eventListener);
+        } else if (eventListener instanceof DomainMappingAddedEventListener) {
+            domainNameAddedMessageProcessor.addEventListener(eventListener);
+        } else if (eventListener instanceof DomainMappingRemovedEventListener) {
+            domainNameRemovedMessageProcessor.addEventListener(eventListener);
+        }
+        else {
+            throw new RuntimeException("Unknown event listener");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainNameAddedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainNameAddedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainNameAddedMessageProcessor.java
new file mode 100644
index 0000000..c87c48f
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainNameAddedMessageProcessor.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.messaging.message.processor.domain.mapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.applications.Application;
+import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
+import org.apache.stratos.messaging.domain.tenant.Tenant;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingAddedEvent;
+import org.apache.stratos.messaging.message.processor.MessageProcessor;
+import org.apache.stratos.messaging.message.receiver.applications.ApplicationManager;
+import org.apache.stratos.messaging.message.receiver.domain.mapping.DomainMappingManager;
+import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
+import org.apache.stratos.messaging.util.Util;
+
+/**
+ * Url mapping added message processor.
+ */
+public class DomainNameAddedMessageProcessor extends MessageProcessor {
+
+    private static final Log log = LogFactory.getLog(DomainNameAddedMessageProcessor.class);
+
+    private MessageProcessor nextProcessor;
+
+    @Override
+    public void setNext(MessageProcessor nextProcessor) {
+        this.nextProcessor = nextProcessor;
+    }
+
+    @Override
+    public boolean process(String type, String message, Object object) {
+        if (DomainMappingAddedEvent.class.getName().equals(type)) {
+
+            // Return if domain mapping manager has not initialized
+            if (!DomainMappingManager.getInstance().isInitialized()) {
+                return false;
+            }
+
+            // Parse complete message and build event
+            DomainMappingAddedEvent event = (DomainMappingAddedEvent) Util.jsonToObject(message, DomainMappingAddedEvent.class);
+
+            int tenantId = event.getTenantId();
+            String applicationId = event.getApplicationId();
+
+            try {
+                TenantManager.acquireReadLock();
+                Tenant tenant = TenantManager.getInstance().getTenant(tenantId);
+                if (tenant == null) {
+                    if (log.isWarnEnabled()) {
+                        log.warn(String.format("Tenant not found: [tenant-id] %d", tenantId));
+                    }
+                    return false;
+                }
+
+                ApplicationManager.acquireReadLockForApplication(applicationId);
+                Application application = ApplicationManager.getApplications().getApplication(applicationId);
+                if (application == null) {
+                    if (log.isWarnEnabled()) {
+                        log.warn(String.format("Application not found: [application-id] %d", applicationId));
+                    }
+                    return false;
+                }
+
+                try {
+                    DomainMappingManager.acquireWriteLock();
+                    DomainMapping domainMapping = new DomainMapping(event.getTenantId(), event.getApplicationId(),
+                            event.getServiceName(), event.getClusterId(), event.getDomainName(), event.getContextPath());
+                    DomainMappingManager.getInstance().addDomainMapping(domainMapping);
+
+                    if (log.isInfoEnabled()) {
+                        log.info(String.format("Domain mapping added: [application-id] %s [cluster-id] %s " +
+                                "[domain-name]", event.getApplicationId(), event.getClusterId(), event.getDomainName()));
+                    }
+
+                    // Notify event listeners
+                    notifyEventListeners(event);
+                    return true;
+                } catch (Exception e) {
+                    String error = String.format("Could not add domain mapping: [application-id] %s [cluster-id] %s " +
+                            "[domain-name]", event.getApplicationId(), event.getClusterId(), event.getDomainName());
+                    log.error(error, e);
+                    return false;
+                } finally {
+                    DomainMappingManager.releaseWriteLock();
+                }
+            }
+            finally {
+                ApplicationManager.releaseReadLockForApplication(applicationId);
+                TenantManager.releaseReadLock();
+            }
+        }
+        else {
+            if (nextProcessor != null) {
+                return nextProcessor.process(type, message, object);
+            } else {
+                throw new RuntimeException(String.format("Failed to process domain mapping using available " +
+                        "message processors: [type] %s [body] %s", type, message));
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainNameRemovedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainNameRemovedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainNameRemovedMessageProcessor.java
new file mode 100644
index 0000000..f0c22ef
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/domain/mapping/DomainNameRemovedMessageProcessor.java
@@ -0,0 +1,132 @@
+/*
+ * 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.domain.mapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.applications.Application;
+import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
+import org.apache.stratos.messaging.domain.tenant.Subscription;
+import org.apache.stratos.messaging.domain.tenant.Tenant;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingRemovedEvent;
+import org.apache.stratos.messaging.message.processor.MessageProcessor;
+import org.apache.stratos.messaging.message.receiver.applications.ApplicationManager;
+import org.apache.stratos.messaging.message.receiver.domain.mapping.DomainMappingManager;
+import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
+import org.apache.stratos.messaging.util.Util;
+
+/**
+ * Subscription domain removed message processor for removing domains from tenant subscriptions.
+ */
+public class DomainNameRemovedMessageProcessor extends MessageProcessor {
+
+    private static final Log log = LogFactory.getLog(DomainNameRemovedMessageProcessor.class);
+
+    private MessageProcessor nextProcessor;
+
+    @Override
+    public void setNext(MessageProcessor nextProcessor) {
+        this.nextProcessor = nextProcessor;
+    }
+
+    @Override
+    public boolean process(String type, String message, Object object) {
+        if (DomainMappingRemovedEvent.class.getName().equals(type)) {
+
+            // Return if domain mapping manager has not initialized
+            if (!DomainMappingManager.getInstance().isInitialized()) {
+                return false;
+            }
+
+            // Parse complete message and build event
+            DomainMappingRemovedEvent event = (DomainMappingRemovedEvent) Util.jsonToObject(message, DomainMappingRemovedEvent.class);
+
+            int tenantId = event.getTenantId();
+            String applicationId = event.getApplicationId();
+
+            try {
+                TenantManager.acquireWriteLock();
+                Tenant tenant = TenantManager.getInstance().getTenant(tenantId);
+                if(tenant == null) {
+                    if(log.isWarnEnabled()) {
+                        log.warn(String.format("Tenant not found: [tenant-id] %d", event.getTenantId()));
+                    }
+                    return false;
+                }
+
+                ApplicationManager.acquireReadLockForApplication(applicationId);
+                Application application = ApplicationManager.getApplications().getApplication(applicationId);
+                if (application == null) {
+                    if (log.isWarnEnabled()) {
+                        log.warn(String.format("Application not found: [application-id] %d", applicationId));
+                    }
+                    return false;
+                }
+
+                try {
+                    DomainMappingManager.acquireReadLock();
+                    DomainMapping domainMapping = DomainMappingManager.getInstance().getDomainMapping(
+                            event.getClusterId(), event.getDomainName());
+                    if(domainMapping == null) {
+                        if (log.isWarnEnabled()) {
+                            log.warn(String.format("Domain mapping not found: [application-id] %s [cluster-id] %s " +
+                                            "[domain-name]", event.getApplicationId(), event.getClusterId(),
+                                    event.getDomainName()));
+                        }
+                        return false;
+                    }
+                } finally {
+                    DomainMappingManager.releaseReadLock();
+                }
+
+                try {
+                    DomainMappingManager.acquireWriteLock();
+                    DomainMappingManager.getInstance().removeDomainMapping(event.getClusterId(), event.getDomainName());
+
+                    if (log.isInfoEnabled()) {
+                        log.info(String.format("Domain mapping removed: [application-id] %s [cluster-id] %s [domain-name]",
+                                event.getApplicationId(), event.getClusterId(), event.getDomainName()));
+                    }
+
+                    // Notify event listeners
+                    notifyEventListeners(event);
+                    return true;
+                } catch (Exception e) {
+                    String error = String.format("Could not remove domain mapping: [application-id] %s [cluster-id] %s " +
+                                    "[domain-name]", event.getApplicationId(), event.getClusterId(), event.getDomainName());
+                    log.error(error, e);
+                    return false;
+                } finally {
+                    DomainMappingManager.releaseWriteLock();
+                }
+            }
+            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/stratos/blob/1b749533/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
deleted file mode 100644
index a185cd2..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainAddedMessageProcessor.java
+++ /dev/null
@@ -1,100 +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.SubscriptionDomain;
-import org.apache.stratos.messaging.domain.tenant.Tenant;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainAddedEvent;
-import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
-import org.apache.stratos.messaging.util.Util;
-
-/**
- * Subscription domain added 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, SubscriptionDomainAddedEvent.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.getApplicationContext()));
-
-                if (log.isInfoEnabled()) {
-                    log.info(String.format("Domain added to tenant subscription: [tenant-id] %d [tenant-domain] %s " +
-                                    "[service] %s [domain-name] %s [application-context] %s", tenant.getTenantId(),
-                            tenant.getTenantDomain(), event.getServiceName(), event.getDomainName(), event.getApplicationContext()
-                    ));
-                }
-
-                // 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/stratos/blob/1b749533/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
deleted file mode 100644
index 88b3690..0000000
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/SubscriptionDomainRemovedMessageProcessor.java
+++ /dev/null
@@ -1,97 +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.SubscriptionDomainRemovedEvent;
-import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
-import org.apache.stratos.messaging.util.Util;
-
-/**
- * Subscription domain removed 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 (SubscriptionDomainRemovedEvent.class.getName().equals(type)) {
-            // Return if tenant manager has not initialized
-            if (!TenantManager.getInstance().isInitialized()) {
-                return false;
-            }
-
-            // Parse complete message and build event
-            SubscriptionDomainRemovedEvent event = (SubscriptionDomainRemovedEvent) Util.jsonToObject(message, SubscriptionDomainRemovedEvent.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/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/TenantMessageProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/TenantMessageProcessorChain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/TenantMessageProcessorChain.java
index b5edfc1..5ab8af8 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/TenantMessageProcessorChain.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/TenantMessageProcessorChain.java
@@ -37,11 +37,9 @@ public class TenantMessageProcessorChain extends MessageProcessorChain {
     private TenantRemovedMessageProcessor tenantRemovedMessageProcessor;
     private TenantSubscribedMessageProcessor tenantSubscribedMessageProcessor;
     private TenantUnSubscribedMessageProcessor tenantUnSubscribedMessageProcessor;
-    private SubscriptionDomainAddedMessageProcessor subscriptionDomainAddedMessageProcessor;
-    private SubscriptionDomainRemovedMessageProcessor subscriptionDomainRemovedMessageProcessor;
 
     public void initialize() {
-        // Add tenant event processors
+        // Initialize tenant event processors
         completeTenantMessageProcessor = new CompleteTenantMessageProcessor();
         add(completeTenantMessageProcessor);
 
@@ -60,12 +58,6 @@ public class TenantMessageProcessorChain extends MessageProcessorChain {
         tenantUnSubscribedMessageProcessor = new TenantUnSubscribedMessageProcessor();
         add(tenantUnSubscribedMessageProcessor);
 
-        subscriptionDomainAddedMessageProcessor = new SubscriptionDomainAddedMessageProcessor();
-        add(subscriptionDomainAddedMessageProcessor);
-
-        subscriptionDomainRemovedMessageProcessor = new SubscriptionDomainRemovedMessageProcessor();
-        add(subscriptionDomainRemovedMessageProcessor);
-
         if (log.isDebugEnabled()) {
             log.debug("Tenant message processor chain initialized");
         }
@@ -84,10 +76,6 @@ public class TenantMessageProcessorChain extends MessageProcessorChain {
             tenantSubscribedMessageProcessor.addEventListener(eventListener);
         } else if (eventListener instanceof TenantUnSubscribedEventListener) {
             tenantUnSubscribedMessageProcessor.addEventListener(eventListener);
-        } else if (eventListener instanceof SubscriptionDomainsAddedEventListener) {
-            subscriptionDomainAddedMessageProcessor.addEventListener(eventListener);
-        } else if (eventListener instanceof SubscriptionDomainsRemovedEventListener) {
-            subscriptionDomainRemovedMessageProcessor.addEventListener(eventListener);
         }
         else {
             throw new RuntimeException("Unknown event listener");

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageDelegator.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageDelegator.java
new file mode 100644
index 0000000..2af000d
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageDelegator.java
@@ -0,0 +1,93 @@
+/*
+ * 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.receiver.domain.mapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.Message;
+import org.apache.stratos.messaging.listener.EventListener;
+import org.apache.stratos.messaging.message.processor.MessageProcessorChain;
+import org.apache.stratos.messaging.message.processor.domain.mapping.DomainMappingMessageProcessorChain;
+
+/**
+ * Domain mapping event message delegator.
+ */
+class DomainMappingEventMessageDelegator implements Runnable {
+
+    private static final Log log = LogFactory.getLog(DomainMappingEventMessageDelegator.class);
+
+    private MessageProcessorChain processorChain;
+    private DomainMappingEventMessageQueue messageQueue;
+    private boolean terminated;
+
+    public DomainMappingEventMessageDelegator(DomainMappingEventMessageQueue messageQueue) {
+        this.messageQueue = messageQueue;
+        this.processorChain = new DomainMappingMessageProcessorChain();
+    }
+
+    public void addEventListener(EventListener eventListener) {
+        processorChain.addEventListener(eventListener);
+    }
+
+    @Override
+    public void run() {
+        try {
+            if (log.isInfoEnabled()) {
+                log.info("Domain mapping event message delegator started");
+            }
+
+            while (!terminated) {
+                try {
+                    Message message = messageQueue.take();
+                    String type = message.getEventClassName();
+
+                    // Retrieve the actual message
+                    String json = message.getText();
+
+                    if (log.isDebugEnabled()) {
+                        log.debug(String.format("Domain mapping event message received from queue: [event-class-name] %s " +
+                                        "[message-queue] %s", type, messageQueue.getClass()));
+                    }
+
+                    if (log.isDebugEnabled()) {
+                        log.debug(String.format("Delegating domain mapping event message: %s", type));
+                    }
+                    processorChain.process(type, json, DomainMappingManager.getInstance());
+                } catch (InterruptedException e) {
+                    log.info("Domain mapping event message delegator is shutting down...");
+                    return;
+                } catch (Exception e) {
+                    log.error("Failed to retrieve domain mapping event message", e);
+                }
+            }
+        } catch (Exception e) {
+            if (log.isErrorEnabled()) {
+                log.error("Domain mapping event message delegator failed", e);
+            }
+        }
+    }
+
+    /**
+     * Terminate topology event message delegator thread.
+     */
+    public void terminate() {
+        terminated = true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageListener.java
new file mode 100644
index 0000000..a872296
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageListener.java
@@ -0,0 +1,55 @@
+/*
+ * 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.receiver.domain.mapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.broker.subscribe.MessageListener;
+import org.apache.stratos.messaging.domain.Message;
+
+/**
+ * Domain mapping event message listener.
+ */
+class DomainMappingEventMessageListener implements MessageListener {
+
+    private static final Log log = LogFactory.getLog(DomainMappingEventMessageListener.class);
+
+    private final DomainMappingEventMessageQueue messageQueue;
+
+    public DomainMappingEventMessageListener(DomainMappingEventMessageQueue messageQueue) {
+        this.messageQueue = messageQueue;
+    }
+
+    @Override
+    public void messageReceived(Message message) {
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Domain mapping message received: %s", message.getText()));
+            }
+            // Add received message to the queue
+            messageQueue.add(message);
+
+        } catch (Exception e) {
+            String error = "An error occurred while receiving domain mapping event message";
+            log.error(error, e);
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageQueue.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageQueue.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageQueue.java
new file mode 100644
index 0000000..fb37429
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventMessageQueue.java
@@ -0,0 +1,29 @@
+/*
+ * 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.receiver.domain.mapping;
+
+import org.apache.stratos.messaging.domain.Message;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * Domain mapping event message queue.
+ */
+class DomainMappingEventMessageQueue extends LinkedBlockingQueue<Message> {
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventReceiver.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventReceiver.java
new file mode 100644
index 0000000..824329f
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingEventReceiver.java
@@ -0,0 +1,91 @@
+/*
+ * 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.receiver.domain.mapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.broker.subscribe.TopicSubscriber;
+import org.apache.stratos.messaging.listener.EventListener;
+import org.apache.stratos.messaging.util.Util;
+
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Domain mapping event receiver.
+ */
+public class DomainMappingEventReceiver {
+
+    private static final Log log = LogFactory.getLog(DomainMappingEventReceiver.class);
+
+    private DomainMappingEventMessageDelegator messageDelegator;
+    private DomainMappingEventMessageListener messageListener;
+    private TopicSubscriber topicSubscriber;
+    private ExecutorService executorService;
+
+    public DomainMappingEventReceiver() {
+        DomainMappingEventMessageQueue messageQueue = new DomainMappingEventMessageQueue();
+        this.messageDelegator = new DomainMappingEventMessageDelegator(messageQueue);
+        this.messageListener = new DomainMappingEventMessageListener(messageQueue);
+    }
+
+    public void addEventListener(EventListener eventListener) {
+        messageDelegator.addEventListener(eventListener);
+    }
+
+
+    public void execute() {
+        try {
+            // Start topic subscriber thread
+            topicSubscriber = new TopicSubscriber(Util.Topics.DOMAIN_MAPPING_TOPIC.getTopicName(), messageListener);
+            // subscriber.setMessageListener(messageListener);
+            executorService.execute(topicSubscriber);
+
+
+            if (log.isDebugEnabled()) {
+                log.debug("Domain mapping event message receiver thread started");
+            }
+
+            // Start topology event message delegator thread
+            executorService.execute(messageDelegator);
+            if (log.isDebugEnabled()) {
+                log.debug("Domain mapping event message delegator thread started");
+            }
+
+
+        } catch (Exception e) {
+            if (log.isErrorEnabled()) {
+                log.error("Domain mapping receiver failed", e);
+            }
+        }
+    }
+
+    public void terminate() {
+        topicSubscriber.terminate();
+        messageDelegator.terminate();
+    }
+
+    public ExecutorService getExecutorService() {
+        return executorService;
+    }
+
+    public void setExecutorService(ExecutorService executorService) {
+        this.executorService = executorService;
+    }
+}


[2/5] stratos git commit: Replacing signup-id with tenant-id and introducing domain mapping stratos manager service methods and rest api methods

Posted by im...@apache.org.
http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerTopologyEventReceiver.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerTopologyEventReceiver.java
new file mode 100644
index 0000000..2f8b087
--- /dev/null
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerTopologyEventReceiver.java
@@ -0,0 +1,421 @@
+/*
+ * 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.load.balancer.messaging.receiver;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.load.balancer.context.LoadBalancerContext;
+import org.apache.stratos.load.balancer.context.LoadBalancerContextUtil;
+import org.apache.stratos.load.balancer.context.map.AlgorithmContextMap;
+import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.messaging.domain.topology.Member;
+import org.apache.stratos.messaging.domain.topology.MemberStatus;
+import org.apache.stratos.messaging.domain.topology.Service;
+import org.apache.stratos.messaging.event.Event;
+import org.apache.stratos.messaging.event.topology.*;
+import org.apache.stratos.messaging.listener.topology.*;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Load balancer topology receiver updates load balancer context according to
+ * incoming topology events.
+ */
+public class LoadBalancerTopologyEventReceiver {
+
+    private static final Log log = LogFactory.getLog(LoadBalancerTopologyEventReceiver.class);
+	private ExecutorService executorService;
+    private TopologyEventReceiver topologyEventReceiver;
+    private boolean terminated;
+
+    public LoadBalancerTopologyEventReceiver() {
+        this.topologyEventReceiver = new TopologyEventReceiver();
+        addEventListeners();
+    }
+
+    public void execute() {
+		topologyEventReceiver.setExecutorService(executorService);
+	    topologyEventReceiver.execute();
+        if (log.isInfoEnabled()) {
+            log.info("Load balancer topology receiver thread started");
+        }
+
+
+    }
+
+    private void addEventListeners() {
+        // Listen to topology events that affect clusters
+        topologyEventReceiver.addEventListener(new CompleteTopologyEventListener() {
+            private boolean initialized;
+
+            @Override
+            protected void onEvent(Event event) {
+                if(!initialized) {
+                    try {
+                        TopologyManager.acquireReadLock();
+                        for (Service service : TopologyManager.getTopology().getServices()) {
+                            for (Cluster cluster : service.getClusters()) {
+                                if (clusterHasActiveMembers(cluster)) {
+                                    LoadBalancerContextUtil.addClusterAgainstHostNames(cluster);
+                                } else {
+                                    if (log.isDebugEnabled()) {
+                                        log.debug("Cluster does not have any active members");
+                                    }
+                                }
+                                for (Member member : cluster.getMembers()) {
+                                    if (member.getStatus() == MemberStatus.Activated) {
+                                        addMemberIpsToMemberIpHostnameMap(cluster, member);
+                                    }
+
+                                }
+                            }
+                        }
+                        initialized = true;
+                    } catch (Exception e) {
+                        log.error("Error processing event", e);
+                    } finally {
+                        TopologyManager.releaseReadLock();
+                    }
+                }
+            }
+
+            private boolean clusterHasActiveMembers(Cluster cluster) {
+                for (Member member : cluster.getMembers()) {
+                    if (member.getStatus() == MemberStatus.Activated) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+        });
+        topologyEventReceiver.addEventListener(new MemberActivatedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+
+                MemberActivatedEvent memberActivatedEvent = (MemberActivatedEvent) event;
+
+                //TopologyManager.acquireReadLock();
+                TopologyManager.acquireReadLockForCluster(memberActivatedEvent.getServiceName(),
+                        memberActivatedEvent.getClusterId());
+
+                try {
+
+                    Service service = TopologyManager.getTopology().getService(memberActivatedEvent.getServiceName());
+                    if (service == null) {
+                        if (log.isWarnEnabled()) {
+                            log.warn(String.format("Service not found in topology: [service] %s",
+                                    memberActivatedEvent.getServiceName()));
+                        }
+                        return;
+                    }
+                    Cluster cluster = service.getCluster(memberActivatedEvent.getClusterId());
+                    if (cluster == null) {
+                        if (log.isWarnEnabled()) {
+                            log.warn(String.format("Cluster not found in topology: [service] %s [cluster] %s",
+                                    memberActivatedEvent.getServiceName(), memberActivatedEvent.getClusterId()));
+                        }
+                        return;
+                    }
+                    Member member = cluster.getMember(memberActivatedEvent.getMemberId());
+                    if (member == null) {
+                        if (log.isWarnEnabled()) {
+                            log.warn(String.format("Member not found in topology: [service] %s [cluster] %s [member] %s",
+                                    memberActivatedEvent.getServiceName(), memberActivatedEvent.getClusterId(),
+                                    memberActivatedEvent.getMemberId()));
+                        }
+                        return;
+                    }
+
+                    // Add member to member-ip -> hostname map
+                    addMemberIpsToMemberIpHostnameMap(cluster,  member);
+
+                    if (LoadBalancerContext.getInstance().getClusterIdClusterMap().containsCluster(
+                            member.getClusterId())) {
+                        if (log.isDebugEnabled()) {
+                            log.debug(String.format("Cluster already exists in load balancer context: [service] %s " +
+                                    "[cluster] %s", member.getServiceName(), member.getClusterId()));
+                        }
+                        // At this point member is already added to the cluster object in load balancer context
+                        return;
+                    }
+
+                    // Add cluster to load balancer context when its first member is activated:
+                    // Cluster not found in load balancer context, add it
+                    LoadBalancerContextUtil.addClusterAgainstHostNames(cluster);
+                } catch (Exception e) {
+                    log.error("Error processing event", e);
+                } finally {
+                    //TopologyManager.releaseReadLock();
+                    TopologyManager.releaseReadLockForCluster(memberActivatedEvent.getServiceName(),
+                            memberActivatedEvent.getClusterId());
+                }
+            }
+        });
+        topologyEventReceiver.addEventListener(new MemberMaintenanceListener() {
+            @Override
+            protected void onEvent(Event event) {
+
+                MemberMaintenanceModeEvent memberMaintenanceModeEvent = (MemberMaintenanceModeEvent) event;
+
+                TopologyManager.acquireReadLockForCluster(memberMaintenanceModeEvent.getServiceName(),
+                        memberMaintenanceModeEvent.getClusterId());
+
+                try {
+                    //TopologyManager.acquireReadLock();
+
+                    Member member = findMember(memberMaintenanceModeEvent.getServiceName(),
+                            memberMaintenanceModeEvent.getClusterId(), memberMaintenanceModeEvent.getMemberId());
+
+                    if (member != null) {
+                        removeMemberIpsFromMemberIpHostnameMap(member);
+                    }
+                } catch (Exception e) {
+                    log.error("Error processing event", e);
+                } finally {
+                    //TopologyManager.releaseReadLock();
+                    TopologyManager.releaseReadLockForCluster(memberMaintenanceModeEvent.getServiceName(),
+                            memberMaintenanceModeEvent.getClusterId());
+                }
+            }
+        });
+        topologyEventReceiver.addEventListener(new MemberSuspendedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+
+                MemberSuspendedEvent memberSuspendedEvent = (MemberSuspendedEvent) event;
+                TopologyManager.acquireReadLockForCluster(memberSuspendedEvent.getServiceName(),
+                        memberSuspendedEvent.getClusterId());
+
+                try {
+                    //TopologyManager.acquireReadLock();
+                    Member member = findMember(memberSuspendedEvent.getServiceName(),
+                            memberSuspendedEvent.getClusterId(), memberSuspendedEvent.getMemberId());
+
+                    if (member != null) {
+                        removeMemberIpsFromMemberIpHostnameMap(member);
+                    }
+                } catch (Exception e) {
+                    log.error("Error processing event", e);
+                } finally {
+                    //TopologyManager.releaseReadLock();
+                    TopologyManager.releaseReadLockForCluster(memberSuspendedEvent.getServiceName(),
+                            memberSuspendedEvent.getClusterId());
+                }
+            }
+        });
+        topologyEventReceiver.addEventListener(new MemberTerminatedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+
+                //TopologyManager.acquireReadLock();
+                MemberTerminatedEvent memberTerminatedEvent = (MemberTerminatedEvent) event;
+
+                TopologyManager.acquireReadLockForCluster(memberTerminatedEvent.getServiceName(),
+                        memberTerminatedEvent.getClusterId());
+
+                try {
+                    Member member = findMember(memberTerminatedEvent.getServiceName(),
+                            memberTerminatedEvent.getClusterId(), memberTerminatedEvent.getMemberId());
+
+                    if (member != null) {
+                        removeMemberIpsFromMemberIpHostnameMap(member);
+                    }
+                } catch (Exception e) {
+                    log.error("Error processing event", e);
+                } finally {
+                    //TopologyManager.releaseReadLock();
+                    TopologyManager.releaseReadLockForCluster(memberTerminatedEvent.getServiceName(),
+                            memberTerminatedEvent.getClusterId());
+                }
+            }
+        });
+        topologyEventReceiver.addEventListener(new ClusterRemovedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+
+                // Remove cluster from context
+                ClusterRemovedEvent clusterRemovedEvent = (ClusterRemovedEvent) event;
+                TopologyManager.acquireReadLockForCluster(clusterRemovedEvent.getServiceName(),
+                        clusterRemovedEvent.getClusterId());
+
+                try {
+                    AlgorithmContextMap.getInstance().removeCluster(clusterRemovedEvent.getServiceName(),
+                            clusterRemovedEvent.getClusterId());
+                } catch (Exception e) {
+                    log.error("Could not remove cluster from load balancer algorithm context map", e);
+                }
+
+                try {
+                    Cluster cluster = LoadBalancerContext.getInstance().getClusterIdClusterMap().getCluster(clusterRemovedEvent.getClusterId());
+                    if (cluster != null) {
+                        for (Member member : cluster.getMembers()) {
+                            removeMemberIpsFromMemberIpHostnameMap(member);
+                        }
+                        LoadBalancerContextUtil.removeClusterAgainstHostNames(cluster.getClusterId());
+                    } else {
+                        if (log.isWarnEnabled()) {
+                            log.warn(String.format("Cluster not found in load balancer context: [service] %s [cluster] %s",
+                                    clusterRemovedEvent.getServiceName(), clusterRemovedEvent.getClusterId()));
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("Error processing event", e);
+                } finally {
+                    TopologyManager.releaseReadLockForCluster(clusterRemovedEvent.getServiceName(),
+                            clusterRemovedEvent.getClusterId());
+                }
+            }
+        });
+        topologyEventReceiver.addEventListener(new ServiceRemovedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+
+                ServiceRemovedEvent serviceRemovedEvent = (ServiceRemovedEvent) event;
+                TopologyManager.acquireReadLockForService(serviceRemovedEvent.getServiceName());
+
+                try {
+                    //TopologyManager.acquireReadLock();
+
+                    // Remove all clusters of given service from context
+                    Service service = TopologyManager.getTopology().getService(serviceRemovedEvent.getServiceName());
+                    if (service != null) {
+                        for (Cluster cluster : service.getClusters()) {
+                            for (Member member : cluster.getMembers()) {
+                                removeMemberIpsFromMemberIpHostnameMap(member);
+                            }
+                            LoadBalancerContextUtil.removeClusterAgainstHostNames(cluster.getClusterId());
+                        }
+                    } else {
+                        if (log.isWarnEnabled()) {
+                            log.warn(String.format("Service not found in topology: [service] %s",
+                                    serviceRemovedEvent.getServiceName()));
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("Error processing event", e);
+                } finally {
+                    //TopologyManager.releaseReadLock();
+                    TopologyManager.releaseReadLockForService(serviceRemovedEvent.getServiceName());
+                }
+            }
+        });
+    }
+
+    private Member findMember(String serviceName, String clusterId, String memberId) {
+        Service service = TopologyManager.getTopology().getService(serviceName);
+        if (service == null) {
+            if (log.isWarnEnabled()) {
+                log.warn(String.format("Service not found in topology: [service] %s", serviceName));
+            }
+            return null;
+        }
+
+        Cluster cluster = service.getCluster(clusterId);
+        if (cluster == null) {
+            if (log.isWarnEnabled()) {
+                log.warn(String.format("Cluster not found in topology: [service] %s [cluster] %s", serviceName, clusterId));
+            }
+            return null;
+        }
+
+        Member member = cluster.getMember(memberId);
+        if (member == null) {
+            if (log.isWarnEnabled()) {
+                log.warn(String.format("Member not found in topology: [service] %s [cluster] %s [member] %s", serviceName,
+                        clusterId, memberId));
+            }
+            return null;
+        }
+        return member;
+    }
+
+    private void addMemberIpsToMemberIpHostnameMap(Cluster cluster, Member member) {
+        if ((cluster.getHostNames() == null) || (cluster.getHostNames().size() == 0)) {
+            if (log.isWarnEnabled()) {
+                log.warn(String.format("Hostnames not found in cluster %s, could not add member ips to member-ip " +
+                        "-> hostname map", member.getClusterId()));
+            }
+            return;
+        }
+
+        String hostname = cluster.getHostNames().get(0);
+        if (cluster.getHostNames().size() > 1) {
+            if (log.isWarnEnabled()) {
+                log.warn(String.format("Multiple hostnames found in cluster %s, using %s",
+                        cluster.getHostNames().toString(), hostname));
+            }
+        }
+
+        if (StringUtils.isNotBlank(member.getDefaultPrivateIP())) {
+            LoadBalancerContext.getInstance().getMemberIpHostnameMap().put(member.getDefaultPrivateIP(), hostname);
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Member private ip added to member-ip -> hostname map: [service] %s [cluster] " +
+                                "%s [member] %s [private-ip] %s", member.getServiceName(), member.getClusterId(),
+                        member.getMemberId(), member.getDefaultPrivateIP()
+                ));
+            }
+        }
+        if (StringUtils.isNotBlank(member.getDefaultPublicIP())) {
+            LoadBalancerContext.getInstance().getMemberIpHostnameMap().put(member.getDefaultPublicIP(), hostname);
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Member public ip added to member-ip -> hostname map: [service] %s [cluster] " +
+                                "%s [member] %s [public-ip] %s", member.getServiceName(), member.getClusterId(),
+                        member.getMemberId(), member.getDefaultPublicIP()
+                ));
+            }
+        }
+    }
+
+    private void removeMemberIpsFromMemberIpHostnameMap(Member member) {
+        if (StringUtils.isNotBlank(member.getDefaultPrivateIP())) {
+            LoadBalancerContext.getInstance().getMemberIpHostnameMap().remove(member.getDefaultPrivateIP());
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Member private ip removed from member-ip -> hostname map: [private-ip] %s",
+                        member.getDefaultPrivateIP()));
+            }
+        }
+        if (StringUtils.isNotBlank(member.getDefaultPublicIP())) {
+            LoadBalancerContext.getInstance().getMemberIpHostnameMap().remove(member.getDefaultPublicIP());
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Member public ip removed from member-ip -> hostname map: [public-ip] %s",
+                        member.getDefaultPublicIP()));
+            }
+        }
+    }
+
+    /**
+     * Terminate load balancer topology receiver thread.
+     */
+    public void terminate() {
+        topologyEventReceiver.terminate();
+        terminated = true;
+    }
+
+	public ExecutorService getExecutorService() {
+		return executorService;
+	}
+
+	public void setExecutorService(ExecutorService executorService) {
+		this.executorService = executorService;
+	}
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ApplicationSignUpHandler.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ApplicationSignUpHandler.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ApplicationSignUpHandler.java
new file mode 100644
index 0000000..aceb1c2
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ApplicationSignUpHandler.java
@@ -0,0 +1,324 @@
+/*
+ * 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.components;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.common.util.CommonUtil;
+import org.apache.stratos.manager.domain.ApplicationSignUp;
+import org.apache.stratos.manager.domain.ArtifactRepository;
+import org.apache.stratos.manager.exception.ApplicationSignUpException;
+import org.apache.stratos.manager.registry.RegistryManager;
+import org.apache.stratos.messaging.domain.applications.Application;
+import org.apache.stratos.messaging.message.receiver.applications.ApplicationManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Application signup handler.
+ */
+public class ApplicationSignUpHandler {
+
+    private static final Log log = LogFactory.getLog(ApplicationSignUpHandler.class);
+
+    private static final String APPLICATION_SIGNUP_RESOURCE_PATH = "/stratos.manager/application.signups/";
+
+    private String prepareApplicationSignupResourcePath(String applicationId, int tenantId) {
+        return APPLICATION_SIGNUP_RESOURCE_PATH + applicationId + "-tenant-" + tenantId;
+    }
+
+    /**
+     * Add application signup.
+     *
+     * @param applicationSignUp
+     * @throws ApplicationSignUpException
+     */
+    public void addApplicationSignUp(ApplicationSignUp applicationSignUp) throws ApplicationSignUpException {
+        try {
+            if (applicationSignUp == null) {
+                throw new RuntimeException("Application signup is null");
+            }
+
+            String applicationId = applicationSignUp.getApplicationId();
+            int tenantId = applicationSignUp.getTenantId();
+
+            if (log.isInfoEnabled()) {
+                log.info(String.format("Adding application signup: [application-id] %s [tenant-id] %d",
+                        applicationId, tenantId));
+            }
+
+            // Encrypt artifact repository passwords
+            Application application = ApplicationManager.getApplications().getApplication(applicationId);
+            if (application == null) {
+                throw new RuntimeException(String.format("Application not found: [application-id] %s", applicationId));
+            }
+
+            if (applicationSignUpExist(applicationId, tenantId)) {
+                throw new RuntimeException(String.format("Tenant has already signed up for application: " +
+                        "[application-id] %s [tenant-id] %d", applicationId, tenantId));
+            }
+
+            encryptRepositoryPasswords(applicationSignUp, application.getKey());
+
+            // Persist application signup
+            String resourcePath = prepareApplicationSignupResourcePath(applicationId, tenantId);
+            RegistryManager.getInstance().persist(resourcePath, applicationSignUp);
+
+            if (log.isInfoEnabled()) {
+                log.info(String.format("Application signup added successfully: [application-id] %s [tenant-id] %d",
+                        applicationId, tenantId));
+            }
+        } catch (Exception e) {
+            String message = "Could not add application signup";
+            log.error(message, e);
+            throw new ApplicationSignUpException(message, e);
+        }
+    }
+
+    /**
+     * Check application signup availability.
+     * @param applicationId
+     * @param tenantId
+     * @return
+     * @throws ApplicationSignUpException
+     */
+    public boolean applicationSignUpExist(String applicationId, int tenantId) throws ApplicationSignUpException {
+        try {
+            String resourcePath = prepareApplicationSignupResourcePath(applicationId, tenantId);
+            ApplicationSignUp applicationSignUp = (ApplicationSignUp) RegistryManager.getInstance().read(resourcePath);
+            return (applicationSignUp != null);
+        } catch (Exception e) {
+            String message = "Could not check application signup availability";
+            log.error(message, e);
+            throw new ApplicationSignUpException(message, e);
+        }
+    }
+
+    /**
+     * Encrypt artifact repository passwords.
+     * @param applicationSignUp
+     * @param applicationKey
+     */
+    private void encryptRepositoryPasswords(ApplicationSignUp applicationSignUp, String applicationKey) {
+        if (applicationSignUp.getArtifactRepositories() != null) {
+            for (ArtifactRepository artifactRepository : applicationSignUp.getArtifactRepositories()) {
+                String repoPassword = artifactRepository.getRepoPassword();
+                if ((artifactRepository != null) && (StringUtils.isNotBlank(repoPassword))) {
+                    String encryptedRepoPassword = CommonUtil.encryptPassword(repoPassword,
+                            applicationKey);
+                    artifactRepository.setRepoPassword(encryptedRepoPassword);
+
+                    if (log.isDebugEnabled()) {
+                        log.debug(String.format("Artifact repository password encrypted: [application-id] %s " +
+                                        "[tenant-id] %d [repo-url] %s", applicationSignUp.getApplicationId(),
+                                applicationSignUp.getTenantId(), artifactRepository.getRepoUrl()));
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Remove application signup by application id, tenant id.
+     *
+     * @param applicationId
+     * @param tenantId
+     * @throws ApplicationSignUpException
+     */
+    public void removeApplicationSignUp(String applicationId, int tenantId) throws ApplicationSignUpException {
+        try {
+            if (log.isInfoEnabled()) {
+                log.info(String.format("Removing application signup: [application-id] %s [tenant-id] %d",
+                        applicationId, tenantId));
+            }
+
+            if (!applicationSignUpExist(applicationId, tenantId)) {
+                throw new RuntimeException(String.format("Application signup not found: [application-id] %s " +
+                        "[tenant-id] %d", applicationId, tenantId));
+            }
+
+            String resourcePath = prepareApplicationSignupResourcePath(applicationId, tenantId);
+            RegistryManager.getInstance().remove(resourcePath);
+
+            if (log.isInfoEnabled()) {
+                log.info(String.format("Application signup removed successfully: [application-id] %s [tenant-id] %d",
+                        applicationId, tenantId));
+            }
+        } catch (Exception e) {
+            String message = "Could not remove application signup";
+            log.error(message, e);
+            throw new ApplicationSignUpException(message, e);
+        }
+    }
+
+    /**
+     * Get application signup by application id, tenant id.
+     *
+     * @param applicationId
+     * @param tenantId
+     * @return
+     * @throws ApplicationSignUpException
+     */
+    public ApplicationSignUp getApplicationSignUp(String applicationId, int tenantId) throws ApplicationSignUpException {
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Get application signup: [application-id] %s [tenant-id] %d",
+                        applicationId, tenantId));
+            }
+
+            String resourcePath = prepareApplicationSignupResourcePath(applicationId, tenantId);
+            ApplicationSignUp applicationSignUp = (ApplicationSignUp) RegistryManager.getInstance().read(resourcePath);
+            return applicationSignUp;
+        } catch (Exception e) {
+            String message = String.format("Could not get application signup: [application-id] %s [tenant-id] %d",
+                    applicationId, tenantId);
+            log.error(message, e);
+            throw new ApplicationSignUpException(message, e);
+        }
+    }
+
+    /**
+     * Get application singups available of an application by application id.
+     *
+     * @param applicationId
+     * @return
+     * @throws ApplicationSignUpException
+     */
+    public ApplicationSignUp[] getApplicationSignUps(String applicationId) throws ApplicationSignUpException {
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Get application signups: [application-id] %s", applicationId));
+            }
+
+            if (StringUtils.isBlank(applicationId)) {
+                throw new RuntimeException("Application id is null");
+            }
+            List<ApplicationSignUp> applicationSignUps = new ArrayList<ApplicationSignUp>();
+
+            String[] resourcePaths = (String[]) RegistryManager.getInstance().read(APPLICATION_SIGNUP_RESOURCE_PATH);
+            if (resourcePaths != null) {
+                for (String resourcePath : resourcePaths) {
+                    if (resourcePath != null) {
+                        ApplicationSignUp applicationSignUp = (ApplicationSignUp)
+                                RegistryManager.getInstance().read(resourcePath);
+                        if (applicationId.equals(applicationSignUp.getApplicationId())) {
+                            applicationSignUps.add(applicationSignUp);
+                        }
+                    }
+                }
+            }
+
+            return applicationSignUps.toArray(new ApplicationSignUp[applicationSignUps.size()]);
+        } catch (Exception e) {
+            String message = "Could not get application signups: [application-id] " + applicationId;
+            log.error(message, e);
+            throw new ApplicationSignUpException(message, e);
+        }
+    }
+
+    /**
+     * Get all application signups.
+     * @return
+     * @throws ApplicationSignUpException
+     */
+    List<ApplicationSignUp> getApplicationSignUps() throws ApplicationSignUpException {
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Reading application signups"));
+            }
+
+            List<ApplicationSignUp> applicationSignUps = new ArrayList<ApplicationSignUp>();
+
+            String[] resourcePaths = (String[]) RegistryManager.getInstance().read(APPLICATION_SIGNUP_RESOURCE_PATH);
+            if (resourcePaths != null) {
+                for (String resourcePath : resourcePaths) {
+                    if (resourcePath != null) {
+                        ApplicationSignUp applicationSignUp = (ApplicationSignUp)
+                                RegistryManager.getInstance().read(resourcePath);
+                        applicationSignUps.add(applicationSignUp);
+                    }
+                }
+            }
+
+            return applicationSignUps;
+        } catch (Exception e) {
+            String message = "Could not get application signups";
+            log.error(message, e);
+            throw new ApplicationSignUpException(message, e);
+        }
+    }
+
+    /**
+     * Get application signups for artifact repository
+     *
+     * @param repoUrl
+     * @return
+     * @throws ApplicationSignUpException
+     */
+    public List<ApplicationSignUp> getApplicationSignUpsForRepository(String repoUrl) throws ApplicationSignUpException {
+        try {
+            List<ApplicationSignUp> filteredResult = new ArrayList<ApplicationSignUp>();
+
+            List<ApplicationSignUp> applicationSignUps = getApplicationSignUps();
+            for (ApplicationSignUp applicationSignUp : applicationSignUps) {
+                if (applicationSignUp.getArtifactRepositories() != null) {
+                    for (ArtifactRepository artifactRepository : applicationSignUp.getArtifactRepositories()) {
+                        if (artifactRepository != null) {
+                            if (artifactRepository.getRepoUrl().equals(repoUrl)) {
+                                filteredResult.add(applicationSignUp);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            return filteredResult;
+        } catch (Exception e) {
+            String message = "Could not get artifact repositories for repository: [repo-url] " + repoUrl;
+            log.error(message, e);
+            throw new ApplicationSignUpException(message, e);
+        }
+    }
+
+    public void updateApplicationSignUp(ApplicationSignUp applicationSignUp) throws ApplicationSignUpException {
+
+        String applicationId = applicationSignUp.getApplicationId();
+        int tenantId = applicationSignUp.getTenantId();
+
+        try {
+            // Persist application signup
+            String resourcePath = prepareApplicationSignupResourcePath(applicationId, tenantId);
+            RegistryManager.getInstance().persist(resourcePath, applicationSignUp);
+
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Application signup updated successfully: [application-id] %s [tenant-id] %d",
+                        applicationId, tenantId));
+            }
+        } catch (Exception e) {
+            String message = String.format("Could not get application signup: [application-id] %s [tenant-id] %d",
+                    applicationId, tenantId);
+            log.error(message, e);
+            throw new ApplicationSignUpException(message, e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ApplicationSignUpManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ApplicationSignUpManager.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ApplicationSignUpManager.java
deleted file mode 100644
index 2924682..0000000
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ApplicationSignUpManager.java
+++ /dev/null
@@ -1,257 +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.manager.components;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.common.util.CommonUtil;
-import org.apache.stratos.manager.domain.ArtifactRepository;
-import org.apache.stratos.manager.registry.RegistryManager;
-import org.apache.stratos.manager.domain.ApplicationSignUp;
-import org.apache.stratos.manager.exception.ApplicationSignUpException;
-import org.apache.stratos.messaging.domain.applications.Application;
-import org.apache.stratos.messaging.message.receiver.applications.ApplicationManager;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-/**
- * Application signup manager.
- */
-public class ApplicationSignUpManager {
-
-    private static final Log log = LogFactory.getLog(ApplicationSignUpManager.class);
-
-    private static final String APPLICATION_SIGNUP_RESOURCE_PATH = "/stratos.manager/application.signups/";
-
-    /**
-     * Add application signup.
-     * @param applicationSignUp
-     * @throws ApplicationSignUpException
-     */
-    public String addApplicationSignUp(ApplicationSignUp applicationSignUp) throws ApplicationSignUpException {
-        try {
-            if(applicationSignUp == null) {
-                throw new RuntimeException("Application signup is null");
-            }
-
-            if(log.isInfoEnabled()) {
-                log.info(String.format("Adding application signup: [application-id] %s",
-                        applicationSignUp.getApplicationId()));
-            }
-
-            // Generate application signup id
-            String signUpId = UUID.randomUUID().toString();
-            applicationSignUp.setSignUpId(signUpId);
-
-            // Encrypt artifact repository passwords
-            String applicationId = applicationSignUp.getApplicationId();
-            Application application = ApplicationManager.getApplications().getApplication(applicationId);
-            if(application == null) {
-                throw new RuntimeException(String.format("Application not found: [application-id] %s", applicationId));
-            }
-            encryptRepositoryPasswords(applicationSignUp, application.getKey());
-
-            // Persist application signup
-            String resourcePath = APPLICATION_SIGNUP_RESOURCE_PATH + applicationSignUp.getSignUpId();
-            RegistryManager.getInstance().persist(resourcePath, applicationSignUp);
-
-            if(log.isInfoEnabled()) {
-                log.info(String.format("Application signup added successfully: [application-id] %s [signup-id] %s",
-                        applicationSignUp.getApplicationId(), applicationSignUp.getSignUpId()));
-            }
-            return signUpId;
-        } catch (Exception e) {
-            String message = "Could not add application signup";
-            log.error(message, e);
-            throw new ApplicationSignUpException(message, e);
-        }
-    }
-
-    private void encryptRepositoryPasswords(ApplicationSignUp applicationSignUp, String applicationKey) {
-        if(applicationSignUp.getArtifactRepositories() != null) {
-            for(ArtifactRepository artifactRepository : applicationSignUp.getArtifactRepositories()) {
-                String repoPassword = artifactRepository.getRepoPassword();
-                if((artifactRepository != null) && (StringUtils.isNotBlank(repoPassword))) {
-                    String encryptedRepoPassword = CommonUtil.encryptPassword(repoPassword,
-                            applicationKey);
-                    artifactRepository.setRepoPassword(encryptedRepoPassword);
-
-                    if(log.isDebugEnabled()) {
-                        log.debug(String.format("Artifact repository password encrypted: [application-id] %s " +
-                                "[signup-id] %s [repo-url] %s", applicationSignUp.getApplicationId(),
-                                applicationSignUp.getSignUpId(), artifactRepository.getRepoUrl()));
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Remove application signup by signup id.
-     * @param signUpId
-     * @throws ApplicationSignUpException
-     */
-    public void removeApplicationSignUp(String signUpId) throws ApplicationSignUpException {
-        try {
-            if(log.isInfoEnabled()) {
-                log.info(String.format("Removing application signup: [signup-id] %s", signUpId));
-            }
-
-            String resourcePath = APPLICATION_SIGNUP_RESOURCE_PATH + signUpId;
-            ApplicationSignUp applicationSignUp = (ApplicationSignUp) RegistryManager.getInstance().read(resourcePath);
-            if(applicationSignUp == null) {
-                throw new RuntimeException(String.format("Application signup not found: [signup-id] %s", signUpId));
-            }
-
-            RegistryManager.getInstance().remove(resourcePath);
-
-            if(log.isInfoEnabled()) {
-                log.info(String.format("Application signup removed successfully: [application-id] %s [signup-id] %s",
-                        applicationSignUp.getApplicationId(), applicationSignUp.getSignUpId()));
-            }
-        } catch (Exception e) {
-            String message = "Could not add application signup";
-            log.error(message, e);
-            throw new ApplicationSignUpException(message, e);
-        }
-    }
-
-    /**
-     * Get application signup by signup id.
-     * @param signUpId
-     * @return
-     * @throws ApplicationSignUpException
-     */
-    public ApplicationSignUp getApplicationSignUp(String signUpId) throws ApplicationSignUpException {
-        try {
-            if(log.isDebugEnabled()) {
-                log.debug(String.format("Reading application signup: [signup-id] %s", signUpId));
-            }
-
-            String resourcePath = APPLICATION_SIGNUP_RESOURCE_PATH + signUpId;
-            ApplicationSignUp applicationSignUp = (ApplicationSignUp) RegistryManager.getInstance().read(resourcePath);
-            return applicationSignUp;
-        } catch (Exception e) {
-            String message = "Could not get application signup";
-            log.error(message, e);
-            throw new ApplicationSignUpException(message, e);
-        }
-    }
-
-    /**
-     * Get application singups of an application by application id.
-     * @param applicationId
-     * @return
-     * @throws ApplicationSignUpException
-     */
-    public List<ApplicationSignUp> getApplicationSignUps(String applicationId) throws ApplicationSignUpException {
-        try {
-            if(log.isDebugEnabled()) {
-                log.debug(String.format("Reading application signups: [application-id] %s", applicationId));
-            }
-
-            if(StringUtils.isBlank(applicationId)) {
-                throw new RuntimeException("Application id is null");
-            }
-            List<ApplicationSignUp> applicationSignUps = new ArrayList<ApplicationSignUp>();
-
-            String[] resourcePaths = (String[]) RegistryManager.getInstance().read(APPLICATION_SIGNUP_RESOURCE_PATH);
-            if(resourcePaths != null) {
-                for (String resourcePath : resourcePaths) {
-                    if(resourcePath != null) {
-                        ApplicationSignUp applicationSignUp = (ApplicationSignUp)
-                                RegistryManager.getInstance().read(resourcePath);
-                        if (applicationId.equals(applicationSignUp.getApplicationId())) {
-                            applicationSignUps.add(applicationSignUp);
-                        }
-                    }
-                }
-            }
-
-            return applicationSignUps;
-        } catch (Exception e) {
-            String message = "Could not get application signups";
-            log.error(message, e);
-            throw new ApplicationSignUpException(message, e);
-        }
-    }
-
-    private List<ApplicationSignUp> getApplicationSignUps() throws ApplicationSignUpException {
-        try {
-            if(log.isDebugEnabled()) {
-                log.debug(String.format("Reading application signups"));
-            }
-
-            List<ApplicationSignUp> applicationSignUps = new ArrayList<ApplicationSignUp>();
-
-            String[] resourcePaths = (String[]) RegistryManager.getInstance().read(APPLICATION_SIGNUP_RESOURCE_PATH);
-            if(resourcePaths != null) {
-                for (String resourcePath : resourcePaths) {
-                    if(resourcePath != null) {
-                        ApplicationSignUp applicationSignUp = (ApplicationSignUp)
-                                RegistryManager.getInstance().read(resourcePath);
-                            applicationSignUps.add(applicationSignUp);
-                    }
-                }
-            }
-
-            return applicationSignUps;
-        } catch (Exception e) {
-            String message = "Could not get application signups";
-            log.error(message, e);
-            throw new ApplicationSignUpException(message, e);
-        }
-    }
-
-    /**
-     * Get application signups for artifact repository
-     * @param repoUrl
-     * @return
-     * @throws ApplicationSignUpException
-     */
-    public List<ApplicationSignUp> getApplicationSignUpsForRepository(String repoUrl) throws ApplicationSignUpException {
-        try {
-            List<ApplicationSignUp> filteredResult = new ArrayList<ApplicationSignUp>();
-
-            List<ApplicationSignUp> applicationSignUps = getApplicationSignUps();
-            for(ApplicationSignUp applicationSignUp : applicationSignUps) {
-                if(applicationSignUp.getArtifactRepositories() != null) {
-                    for(ArtifactRepository artifactRepository : applicationSignUp.getArtifactRepositories()) {
-                        if(artifactRepository != null) {
-                            if(artifactRepository.getRepoUrl().equals(repoUrl)) {
-                                filteredResult.add(applicationSignUp);
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-
-            return filteredResult;
-        } catch (Exception e) {
-            String message = "Could not get artifact repositories for repository: [repo-url] " + repoUrl;
-            log.error(message, e);
-            throw new ApplicationSignUpException(message, e);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ArtifactDistributionCoordinator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ArtifactDistributionCoordinator.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ArtifactDistributionCoordinator.java
index cc97824..a9b4ba7 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ArtifactDistributionCoordinator.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/ArtifactDistributionCoordinator.java
@@ -40,42 +40,46 @@ public class ArtifactDistributionCoordinator {
 
     private static final Log log = LogFactory.getLog(ArtifactDistributionCoordinator.class);
 
-    private ApplicationSignUpManager applicationSignUpManager;
+    private ApplicationSignUpHandler applicationSignUpManager;
     private InstanceNotificationPublisher publisher;
 
 
     public ArtifactDistributionCoordinator() {
-        applicationSignUpManager = new ApplicationSignUpManager();
+        applicationSignUpManager = new ApplicationSignUpHandler();
         publisher = new InstanceNotificationPublisher();
     }
 
     /**
      * Notify artifact updated event for an application signup.
-     * @param signUpId
+     * @param applicationId
+     * @param tenantId
      * @throws ArtifactDistributionCoordinatorException
      */
-    public void notifyArtifactUpdatedEventForSignUp(String signUpId) throws ArtifactDistributionCoordinatorException {
-        notifyArtifactUpdatedEventForSignUp(signUpId, null);
+    public void notifyArtifactUpdatedEventForSignUp(String applicationId, int tenantId) throws ArtifactDistributionCoordinatorException {
+        notifyArtifactUpdatedEventForSignUp(applicationId, tenantId, null);
     }
 
     /**
      * Notify artifact updated event for an application signup, cluster.
-     * @param signUpId
+     * @param applicationId
+     * @param tenantId
      * @param clusterId
      * @throws ArtifactDistributionCoordinatorException
      */
-    public void notifyArtifactUpdatedEventForSignUp(String signUpId, String clusterId) throws ArtifactDistributionCoordinatorException {
+    public void notifyArtifactUpdatedEventForSignUp(String applicationId, int tenantId, String clusterId)
+            throws ArtifactDistributionCoordinatorException {
+
         try {
-            ApplicationSignUp applicationSignUp = applicationSignUpManager.getApplicationSignUp(signUpId);
+            ApplicationSignUp applicationSignUp = applicationSignUpManager.getApplicationSignUp(applicationId, tenantId);
             if (applicationSignUp == null) {
-                throw new RuntimeException(String.format("Application signup not found: [signup-id] %s", signUpId));
+                throw new RuntimeException(String.format("Application signup not found: [application-id] %s " +
+                        "[tenant-id] %d", applicationId, tenantId));
             }
 
-            String applicationId = applicationSignUp.getApplicationId();
             if (!artifactRepositoriesExist(applicationSignUp)) {
                 log.warn(String.format("Artifact repositories not found for application signup, " +
-                                "artifact updated event not sent: [application-id] %s [signup-id] %s ",
-                        applicationId, applicationSignUp.getSignUpId()));
+                                "artifact updated event not sent: [application-id] %s [tenant-id] %s ",
+                        applicationId, tenantId));
             } else {
                 for (ArtifactRepository artifactRepository : applicationSignUp.getArtifactRepositories()) {
                     if (artifactRepository != null) {
@@ -90,9 +94,9 @@ public class ArtifactDistributionCoordinator {
 
                             if (log.isInfoEnabled()) {
                                 log.info(String.format("Artifact updated event published: [application-id] %s " +
-                                                "[signup-id] %s [cartridge-type] %s [alias] %s [repo-url] %s",
+                                                "[tenant-id] %d [cartridge-type] %s [alias] %s [repo-url] %s",
                                         applicationId,
-                                        applicationSignUp.getSignUpId(),
+                                        tenantId,
                                         artifactRepository.getCartridgeType(),
                                         artifactRepository.getAlias(),
                                         artifactRepository.getRepoUrl()));
@@ -128,6 +132,7 @@ public class ArtifactDistributionCoordinator {
                             if((artifactRepository != null) && (artifactRepository.getRepoUrl().equals(repoUrl))) {
 
                                 String applicationId = applicationSignUp.getApplicationId();
+                                int tenantId = applicationSignUp.getTenantId();
                                 String clusterId = findClusterId(applicationId, artifactRepository.getAlias());
 
                                 publisher.publishArtifactUpdatedEvent(clusterId,
@@ -138,9 +143,9 @@ public class ArtifactDistributionCoordinator {
 
                                 if (log.isInfoEnabled()) {
                                     log.info(String.format("Artifact updated event published: [application-id] %s " +
-                                                    "[signup-id] %s [cartridge-type] %s [alias] %s [repo-url] %s",
+                                                    "[tenant-id] %d [cartridge-type] %s [alias] %s [repo-url] %s",
                                             applicationId,
-                                            applicationSignUp.getSignUpId(),
+                                            tenantId,
                                             artifactRepository.getCartridgeType(),
                                             artifactRepository.getAlias(),
                                             artifactRepository.getRepoUrl()));

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/DomainMappingHandler.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/DomainMappingHandler.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/DomainMappingHandler.java
new file mode 100644
index 0000000..83fd4b0
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/components/DomainMappingHandler.java
@@ -0,0 +1,169 @@
+/*
+ * 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.components;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.manager.domain.ApplicationSignUp;
+import org.apache.stratos.manager.exception.DomainMappingException;
+import org.apache.stratos.manager.messaging.publisher.DomainMappingEventPublisher;
+import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Domain mapping handler.
+ */
+public class DomainMappingHandler {
+
+    private static final Log log = LogFactory.getLog(DomainMappingHandler.class);
+
+    private ApplicationSignUpHandler applicationSignUpHandler;
+
+    public DomainMappingHandler() {
+        applicationSignUpHandler = new ApplicationSignUpHandler();
+    }
+
+    public void addDomainMapping(DomainMapping domainMapping) throws DomainMappingException {
+        try {
+            String applicationId = domainMapping.getApplicationId();
+            int tenantId = domainMapping.getTenantId();
+            String domainName = domainMapping.getDomainName();
+
+            // Check domain name availability
+            checkDomainNameAvailability(domainName);
+
+            // Add domain name to application signup
+            ApplicationSignUp applicationSignUp = applicationSignUpHandler.getApplicationSignUp(applicationId, tenantId);
+            DomainMapping[] domainMappingArray = applicationSignUp.getDomainMappings();
+            if(domainMappingArray == null) {
+                domainMappingArray = new DomainMapping[1];
+                domainMappingArray[0] = domainMapping;
+            } else {
+                List<DomainMapping> domainMappingList = convertDomainMappingArrayToList(domainMappingArray);
+                domainMappingList.add(domainMapping);
+                domainMappingArray = domainMappingList.toArray(new DomainMapping[domainMappingList.size()]);
+            }
+
+            applicationSignUp.setDomainMappings(domainMappingArray);
+            applicationSignUpHandler.updateApplicationSignUp(applicationSignUp);
+
+            DomainMappingEventPublisher.publishDomainMappingAddedEvent(applicationId, tenantId,
+                    domainMapping.getServiceName(), domainMapping.getClusterId(),
+                    domainMapping.getDomainName(), domainMapping.getContextPath());
+
+            if(log.isInfoEnabled()) {
+                log.info(String.format("Domain mapping added successfully: [application-id] %s [tenant-id] %d " +
+                        "[domain-name] %s", applicationId, tenantId, domainName));
+            }
+        } catch (Exception e) {
+            String message = "Could not add domain mapping";
+            log.error(message, e);
+            throw new DomainMappingException(message, e);
+        }
+    }
+
+    private List<DomainMapping> convertDomainMappingArrayToList(DomainMapping[] domainMappingArray) {
+        List<DomainMapping> domainMappingList = new ArrayList<DomainMapping>();
+        for(DomainMapping arrayItem : domainMappingArray) {
+            if(arrayItem != null) {
+                domainMappingList.add(arrayItem);
+            }
+        }
+        return domainMappingList;
+    }
+
+    private void checkDomainNameAvailability(String domainName) throws DomainMappingException {
+        if(domainNameExist(domainName)) {
+            throw new RuntimeException(String.format("Domain name is already mapped: [domain-name] %s", domainName));
+        }
+    }
+
+    public boolean domainNameExist(String domainName) throws DomainMappingException {
+        try {
+            List<ApplicationSignUp> applicationSignUps = applicationSignUpHandler.getApplicationSignUps();
+            if(applicationSignUps != null) {
+                for(ApplicationSignUp applicationSignUp : applicationSignUps) {
+                    if(applicationSignUp.getDomainMappings() != null) {
+                        for(DomainMapping domainMapping : applicationSignUp.getDomainMappings()) {
+                            if((domainMapping != null) && (domainMapping.getDomainName().equals(domainName))) {
+                                 return true;
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            String message = String.format("Could not check domain name existence: [domain-name] %s", domainName);
+            log.error(message, e);
+            throw new DomainMappingException(message, e);
+        }
+        return false;
+    }
+
+    public DomainMapping[] getDomainMappings(String applicationId, int tenantId) throws DomainMappingException {
+        try {
+            ApplicationSignUp applicationSignUp = applicationSignUpHandler.getApplicationSignUp(applicationId, tenantId);
+            return applicationSignUp.getDomainMappings();
+        } catch (Exception e) {
+            String message = String.format("Could not get domain mappings: [application-id] %s [tenant-id] %d",
+                    applicationId, tenantId);
+            log.error(message, e);
+            throw new DomainMappingException(message, e);
+        }
+    }
+
+    public void removeDomainMapping(String applicationId, int tenantId, String domainName) throws DomainMappingException {
+        try {
+            // Add domain name to application signup
+            ApplicationSignUp applicationSignUp = applicationSignUpHandler.getApplicationSignUp(applicationId, tenantId);
+            DomainMapping[] domainMappingArray = applicationSignUp.getDomainMappings();
+            List<DomainMapping> domainMappingList = convertDomainMappingArrayToList(domainMappingArray);
+
+            Iterator<DomainMapping> iterator = domainMappingList.iterator();
+            while(iterator.hasNext()) {
+                DomainMapping domainMapping = iterator.next();
+                if(domainMapping.getDomainName().equals(domainName)) {
+                    iterator.remove();
+
+                    domainMappingArray = domainMappingList.toArray(new DomainMapping[domainMappingList.size()]);
+                    applicationSignUp.setDomainMappings(domainMappingArray);
+                    applicationSignUpHandler.updateApplicationSignUp(applicationSignUp);
+
+                    DomainMappingEventPublisher.publishDomainNameRemovedEvent(applicationId, tenantId,
+                            domainMapping.getServiceName(), domainMapping.getClusterId(), domainName);
+
+                    if(log.isInfoEnabled()) {
+                        String.format("Domain mapping removed: [application-id] %s [tenant-id] %d " +
+                                "[domain-name] %s", applicationId, tenantId, domainName);
+                    }
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            String message = String.format("Could not remove domain mappings: [application-id] %s [tenant-id] %d " +
+                            "[domain-name] %s", applicationId, tenantId, domainName);
+            log.error(message, e);
+            throw new DomainMappingException(message, e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/domain/ApplicationSignUp.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/domain/ApplicationSignUp.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/domain/ApplicationSignUp.java
index 1e1aa62..dbb836e 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/domain/ApplicationSignUp.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/domain/ApplicationSignUp.java
@@ -19,6 +19,8 @@
 
 package org.apache.stratos.manager.domain;
 
+import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
+
 import java.io.Serializable;
 
 /**
@@ -28,18 +30,10 @@ public class ApplicationSignUp implements Serializable {
 
     private static final long serialVersionUID = -3055522170914869018L;
 
-    private String signUpId;
     private int tenantId;
     private String applicationId;
     private ArtifactRepository[] artifactRepositories;
-
-    public String getSignUpId() {
-        return signUpId;
-    }
-
-    public void setSignUpId(String signUpId) {
-        this.signUpId = signUpId;
-    }
+    private DomainMapping[] domainMappings;
 
     public int getTenantId() {
         return tenantId;
@@ -64,4 +58,12 @@ public class ApplicationSignUp implements Serializable {
     public void setArtifactRepositories(ArtifactRepository[] artifactRepositories) {
         this.artifactRepositories = artifactRepositories;
     }
+
+    public DomainMapping[] getDomainMappings() {
+        return domainMappings;
+    }
+
+    public void setDomainMappings(DomainMapping[] domainMappings) {
+        this.domainMappings = domainMappings;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/DomainMappingException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/DomainMappingException.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/DomainMappingException.java
new file mode 100644
index 0000000..35da2fd
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/DomainMappingException.java
@@ -0,0 +1,30 @@
+/*
+ * 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.exception;
+
+/**
+ * Domain mapping exception.
+ */
+public class DomainMappingException extends Exception {
+
+    public DomainMappingException(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/DomainMappingExistsException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/DomainMappingExistsException.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/DomainMappingExistsException.java
deleted file mode 100644
index 544f6b7..0000000
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/exception/DomainMappingExistsException.java
+++ /dev/null
@@ -1,48 +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.manager.exception;
-
-public class DomainMappingExistsException extends Exception {
-
-	private static final long serialVersionUID = 1L;
-
-	private final String message;
-
-	private final String domain;
-
-	public DomainMappingExistsException(String message, String domain, Throwable cause) {
-		super(message, cause);
-		this.message = message;
-		this.domain = domain;
-	}
-
-	public DomainMappingExistsException(String message, String domain) {
-		super(message);
-		this.message = message;
-		this.domain = domain;
-	}
-
-	public String getMessage() {
-		return message;
-	}
-
-	public String getDomain() {
-		return domain;
-	}
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/TenantSynzhronizerTask.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/TenantSynzhronizerTask.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/TenantSynzhronizerTask.java
index 2b354c4..2195d8c 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/TenantSynzhronizerTask.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/TenantSynzhronizerTask.java
@@ -70,39 +70,11 @@ public class TenantSynzhronizerTask implements Task {
 					TenantInfoBean tenantBean = new TenantInfoBean();
 					tenantBean.setTenantId(carbonTenant.getId());
 					tenantBean.setTenantDomain(carbonTenant.getDomain());
-					//TenantMgtUtil.triggerAddTenant(tenantBean);
-					// add tenant to Tenant Manager
+
+					// Add tenant to Tenant Manager
 					org.apache.stratos.messaging.message.receiver.tenant.TenantManager.getInstance()
 					                                                                  .addTenant(tenant);
 				}
-
-				// Add subscriptions
-				// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-				// List<CartridgeSubscriptionInfo> cartridgeSubscriptions =
-				// PersistenceManager.getSubscriptionsForTenant(tenant.getTenantId());
-				// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//				Collection<CartridgeSubscription> cartridgeSubscriptions =
-//				                                                           new DataInsertionAndRetrievalManager().getCartridgeSubscriptions(tenant.getTenantId());
-//				if (cartridgeSubscriptions != null && !cartridgeSubscriptions.isEmpty()) {
-//					for (CartridgeSubscription cartridgeSubscription : cartridgeSubscriptions) {
-//						if (log.isDebugEnabled()) {
-//							log.debug(String.format("Tenant subscription found: [tenant-id] %d [tenant-domain] %s [service] %s",
-//							                        carbonTenant.getId(), carbonTenant.getDomain(),
-//							                        cartridgeSubscription.getType()));
-//						}
-//						HashSet<String> clusterIds = new HashSet<String>();
-//						clusterIds.add(cartridgeSubscription.getCluster().getClusterDomain());
-//						Subscription subscription =
-//						                            new Subscription(
-//						                                             cartridgeSubscription.getType(),
-//						                                             clusterIds);
-//						for (SubscriptionDomain subscriptionDomain : cartridgeSubscription.getSubscriptionDomains()) {
-//							subscription.addSubscriptionDomain(subscriptionDomain.getDomainName(),
-//							                                   subscriptionDomain.getApplicationContext());
-//						}
-//						tenant.addSubscription(subscription);
-//					}
-//				}
 				tenants.add(tenant);
 			}
 			CompleteTenantEvent event = new CompleteTenantEvent(tenants);

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/DomainMappingEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/DomainMappingEventPublisher.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/DomainMappingEventPublisher.java
new file mode 100644
index 0000000..eb9a9d6
--- /dev/null
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/DomainMappingEventPublisher.java
@@ -0,0 +1,62 @@
+/*
+ * 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.messaging.publisher;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.broker.publish.EventPublisher;
+import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingAddedEvent;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingRemovedEvent;
+import org.apache.stratos.messaging.util.Util;
+
+/**
+ * Domain mapping event publisher.
+ */
+public class DomainMappingEventPublisher {
+
+    private static final Log log = LogFactory.getLog(DomainMappingEventPublisher.class);
+
+    public static void publishDomainMappingAddedEvent(String applicationId, int tenantId, String serviceName,
+                                                      String clusterId, String domainName, String contextPath) {
+        DomainMappingAddedEvent domainMappingAddedEvent = new DomainMappingAddedEvent(applicationId, tenantId,
+                serviceName, clusterId, domainName, contextPath);
+
+        EventPublisher eventPublisher = EventPublisherPool.getPublisher(Util.Topics.DOMAIN_MAPPING_TOPIC.getTopicName());
+        eventPublisher.publish(domainMappingAddedEvent);
+
+        if(log.isInfoEnabled()) {
+            log.info(String.format("Domain mapping added event published: %s", domainMappingAddedEvent.toString()));
+        }
+    }
+
+    public static void publishDomainNameRemovedEvent(String applicationId, int tenantId, String serviceName,
+                                                     String clusterId, String domainName) {
+        DomainMappingRemovedEvent domainNameRemovedEvent = new DomainMappingRemovedEvent(applicationId, tenantId,
+                serviceName, clusterId, domainName);
+
+        EventPublisher eventPublisher = EventPublisherPool.getPublisher(Util.Topics.DOMAIN_MAPPING_TOPIC.getTopicName());
+        eventPublisher.publish(domainNameRemovedEvent);
+
+        if(log.isInfoEnabled()) {
+            log.info(String.format("Domain mapping removed event published: %s", domainNameRemovedEvent.toString()));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/InstanceNotificationPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/InstanceNotificationPublisher.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/InstanceNotificationPublisher.java
index c82e644..e9eb78a 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/InstanceNotificationPublisher.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/publisher/InstanceNotificationPublisher.java
@@ -33,6 +33,7 @@ import org.apache.stratos.messaging.util.Util;
  * instances.
  */
 public class InstanceNotificationPublisher {
+
 	private static final Log log = LogFactory.getLog(InstanceNotificationPublisher.class);
 
 	public InstanceNotificationPublisher() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/receiver/StratosManagerInstanceStatusEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/receiver/StratosManagerInstanceStatusEventReceiver.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/receiver/StratosManagerInstanceStatusEventReceiver.java
index decb544..365661d 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/receiver/StratosManagerInstanceStatusEventReceiver.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/messaging/receiver/StratosManagerInstanceStatusEventReceiver.java
@@ -23,7 +23,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.stub.pojo.*;
-import org.apache.stratos.manager.components.ApplicationSignUpManager;
+import org.apache.stratos.manager.components.ApplicationSignUpHandler;
 import org.apache.stratos.manager.components.ArtifactDistributionCoordinator;
 import org.apache.stratos.manager.domain.ApplicationSignUp;
 import org.apache.stratos.messaging.event.Event;
@@ -41,12 +41,12 @@ public class StratosManagerInstanceStatusEventReceiver extends InstanceStatusEve
 
     private static final Log log = LogFactory.getLog(StratosManagerInstanceStatusEventReceiver.class);
 
-    private ApplicationSignUpManager signUpManager;
+    private ApplicationSignUpHandler signUpManager;
     private ArtifactDistributionCoordinator artifactDistributionCoordinator;
 
 
     public StratosManagerInstanceStatusEventReceiver() {
-        signUpManager = new ApplicationSignUpManager();
+        signUpManager = new ApplicationSignUpHandler();
         artifactDistributionCoordinator = new ArtifactDistributionCoordinator();
 
         addEventListeners();
@@ -89,8 +89,9 @@ public class StratosManagerInstanceStatusEventReceiver extends InstanceStatusEve
                         throw new RuntimeException("Cluster id not found in instance started event: " + instanceStartedEvent);
                     }
 
-                    List<ApplicationSignUp> applicationSignUps = signUpManager.getApplicationSignUps(applicationId);
-                    if ((applicationSignUps == null) || (applicationSignUps.size() == 0)) {
+                    ApplicationSignUp[] applicationSignUps = signUpManager.getApplicationSignUps(applicationId);
+                    if ((applicationSignUps == null) || (applicationSignUps.length == 0) || (
+                            (applicationSignUps.length == 1) && (applicationSignUps[0] == null))) {
                         log.warn(String.format("Application signups not found for application, artifact updated event" +
                                 "not sent: [application-id] %s [cartridge-type] %s", applicationId, serviceName));
                         return;
@@ -98,7 +99,7 @@ public class StratosManagerInstanceStatusEventReceiver extends InstanceStatusEve
 
                     for (ApplicationSignUp applicationSignUp : applicationSignUps) {
                         artifactDistributionCoordinator.notifyArtifactUpdatedEventForSignUp(
-                                applicationSignUp.getSignUpId(), clusterId);
+                                applicationSignUp.getApplicationId(), applicationSignUp.getTenantId(), clusterId);
                     }
                 } catch (Exception e) {
                     String message = "Could not send artifact updated event";

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/StratosManagerService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/StratosManagerService.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/StratosManagerService.java
index d937785..d9e92ea 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/StratosManagerService.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/services/StratosManagerService.java
@@ -22,6 +22,8 @@ package org.apache.stratos.manager.services;
 import org.apache.stratos.manager.domain.ApplicationSignUp;
 import org.apache.stratos.manager.exception.ApplicationSignUpException;
 import org.apache.stratos.manager.exception.ArtifactDistributionCoordinatorException;
+import org.apache.stratos.manager.exception.DomainMappingException;
+import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
 
 import java.util.List;
 
@@ -33,36 +35,39 @@ public interface StratosManagerService {
     /**
      * Add application signup
      * @param applicationSignUp
-     * @return signup id
      * @throws ApplicationSignUpException
      */
-    public String addApplicationSignUp(ApplicationSignUp applicationSignUp) throws ApplicationSignUpException;
+    public void addApplicationSignUp(ApplicationSignUp applicationSignUp) throws ApplicationSignUpException;
 
     /**
      * Remove application signup.
-     * @param signUpId
+     * @param applicationId
+     * @param tenantId
      */
-    public void removeApplicationSignUp(String signUpId) throws ApplicationSignUpException;
+    public void removeApplicationSignUp(String applicationId, int tenantId) throws ApplicationSignUpException;
 
     /**
      * Get application signup.
-     * @param signUpId
+     * @param applicationId
+     * @param tenantId
      * @return
      */
-    public ApplicationSignUp getApplicationSignUp(String signUpId) throws ApplicationSignUpException;
+    public ApplicationSignUp getApplicationSignUp(String applicationId, int tenantId) throws ApplicationSignUpException;
 
     /**
-     * Get application signups.
+     * Get application signups available for an application.
      * @return
      */
-    public List<ApplicationSignUp> getApplicationSignUps(String applicationId) throws ApplicationSignUpException;
+    public ApplicationSignUp[] getApplicationSignUps(String applicationId) throws ApplicationSignUpException;
 
     /**
      * Notify artifact updated event for application signup.
-     * @param signUpId
+     * @param applicationId
+     * @param tenantId
      * @throws ArtifactDistributionCoordinatorException
      */
-    public void notifyArtifactUpdatedEventForSignUp(String signUpId) throws ArtifactDistributionCoordinatorException;
+    public void notifyArtifactUpdatedEventForSignUp(String applicationId, int tenantId)
+            throws ArtifactDistributionCoordinatorException;
 
     /**
      * Notify artifact updated event for artifact repository.
@@ -70,4 +75,29 @@ public interface StratosManagerService {
      * @throws ArtifactDistributionCoordinatorException
      */
     public void notifyArtifactUpdatedEventForRepository(String repoUrl) throws ArtifactDistributionCoordinatorException;
+
+    /**
+     * Add domain mapping
+     * @param domainMapping
+     * @throws DomainMappingException
+     */
+    public void addDomainMapping(DomainMapping domainMapping) throws DomainMappingException;
+
+    /**
+     * Get domain mappings available for application signup.
+     * @param applicationId
+     * @param tenantId
+     * @return
+     * @throws DomainMappingException
+     */
+    public DomainMapping[] getDomainMappings(String applicationId, int tenantId) throws DomainMappingException;
+
+    /**
+     * Remove domain mapping by domain name.
+     * @param applicationId
+     * @param tenantId
+     * @param domainName
+     * @throws DomainMappingException
+     */
+    public void removeDomainMapping(String applicationId, int tenantId, String domainName) throws DomainMappingException;
 }


[3/5] stratos git commit: Replacing signup-id with tenant-id and introducing domain mapping stratos manager service methods and rest api methods

Posted by im...@apache.org.
Replacing signup-id with tenant-id and introducing domain mapping stratos manager service methods and rest api methods


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

Branch: refs/heads/master
Commit: 8edb91a365e6a69682023e23de1cb1c01bc871fd
Parents: 1b74953
Author: Imesh Gunaratne <im...@apache.org>
Authored: Fri Jan 9 22:04:54 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Fri Jan 9 22:09:46 2015 +0530

----------------------------------------------------------------------
 .../stratos/cartridge/agent/CartridgeAgent.java |  16 +-
 .../extensions/DefaultExtensionHandler.java     |  12 +-
 .../agent/extensions/ExtensionHandler.java      |   8 +-
 .../common/beans/ApplicationSignUpBean.java     |   9 -
 .../client/StratosManagerServiceClient.java     |  27 +-
 .../balancer/context/LoadBalancerContext.java   |   2 +-
 .../context/LoadBalancerContextUtil.java        |  54 ++-
 .../context/map/HostNameAppContextMap.java      |   6 +-
 .../TenantAwareLoadBalanceEndpoint.java         |   4 +-
 .../internal/LoadBalancerServiceComponent.java  |   4 +-
 .../LoadBalancerTenantEventReceiver.java        | 211 ----------
 .../LoadBalancerTopologyEventReceiver.java      | 421 -------------------
 .../LoadBalancerDomainMappingEventReceiver.java |  89 ++++
 .../LoadBalancerTenantEventReceiver.java        | 156 +++++++
 .../LoadBalancerTopologyEventReceiver.java      | 421 +++++++++++++++++++
 .../components/ApplicationSignUpHandler.java    | 324 ++++++++++++++
 .../components/ApplicationSignUpManager.java    | 257 -----------
 .../ArtifactDistributionCoordinator.java        |  37 +-
 .../components/DomainMappingHandler.java        | 169 ++++++++
 .../manager/domain/ApplicationSignUp.java       |  20 +-
 .../exception/DomainMappingException.java       |  30 ++
 .../exception/DomainMappingExistsException.java |  48 ---
 .../messaging/TenantSynzhronizerTask.java       |  32 +-
 .../publisher/DomainMappingEventPublisher.java  |  62 +++
 .../InstanceNotificationPublisher.java          |   1 +
 ...ratosManagerInstanceStatusEventReceiver.java |  13 +-
 .../manager/services/StratosManagerService.java |  50 ++-
 .../impl/StratosManagerServiceImpl.java         |  46 +-
 .../mapping/CompleteDomainMappingsEvent.java    |  45 --
 .../domain/mapping/DomainMappingAddedEvent.java |  21 +-
 .../mapping/DomainMappingRemovedEvent.java      |  20 +-
 .../CompleteDomainMappingsEventListener.java    |  28 --
 .../CompleteDomainMappingsMessageProcessor.java |  81 ----
 .../DomainMappingMessageProcessorChain.java     |   9 +-
 .../rest/endpoint/api/StratosApiV41.java        |  25 +-
 .../rest/endpoint/api/StratosApiV41Utils.java   |  42 +-
 .../util/converter/ObjectConverter.java         |   1 -
 .../main/resources/StratosManagerService.wsdl   | 227 ++++++++--
 38 files changed, 1675 insertions(+), 1353 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/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 f294348..ffaaad4 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
@@ -36,13 +36,13 @@ 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.event.domain.mapping.DomainMappingAddedEvent;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingRemovedEvent;
 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.listener.domain.mapping.DomainMappingAddedEventListener;
+import org.apache.stratos.messaging.listener.domain.mapping.DomainMappingRemovedEventListener;
 import org.apache.stratos.messaging.message.receiver.instance.notifier.InstanceNotifierEventReceiver;
 import org.apache.stratos.messaging.message.receiver.tenant.TenantEventReceiver;
 import org.apache.stratos.messaging.event.tenant.CompleteTenantEvent;
@@ -428,7 +428,7 @@ public class CartridgeAgent implements Runnable {
             log.debug("Starting tenant event message receiver thread");
         }
         TenantEventReceiver tenantEventReceiver = new TenantEventReceiver();
-        tenantEventReceiver.addEventListener(new SubscriptionDomainsAddedEventListener() {
+        tenantEventReceiver.addEventListener(new DomainMappingAddedEventListener() {
             @Override
             protected void onEvent(Event event) {
                 try {
@@ -436,7 +436,7 @@ public class CartridgeAgent implements Runnable {
                     if (log.isDebugEnabled()) {
                         log.debug("Subscription domain added event received");
                     }
-                    SubscriptionDomainAddedEvent subscriptionDomainAddedEvent = (SubscriptionDomainAddedEvent) event;
+                    DomainMappingAddedEvent subscriptionDomainAddedEvent = (DomainMappingAddedEvent) event;
                     extensionHandler.onSubscriptionDomainAddedEvent(subscriptionDomainAddedEvent);
                 } catch (Exception e) {
                     if (log.isErrorEnabled()) {
@@ -449,7 +449,7 @@ public class CartridgeAgent implements Runnable {
             }
         });
 
-        tenantEventReceiver.addEventListener(new SubscriptionDomainsRemovedEventListener() {
+        tenantEventReceiver.addEventListener(new DomainMappingRemovedEventListener() {
             @Override
             protected void onEvent(Event event) {
                 try {
@@ -457,7 +457,7 @@ public class CartridgeAgent implements Runnable {
                     if (log.isDebugEnabled()) {
                         log.debug("Subscription domain removed event received");
                     }
-                    SubscriptionDomainRemovedEvent subscriptionDomainRemovedEvent = (SubscriptionDomainRemovedEvent) event;
+                    DomainMappingRemovedEvent subscriptionDomainRemovedEvent = (DomainMappingRemovedEvent) event;
                     extensionHandler.onSubscriptionDomainRemovedEvent(subscriptionDomainRemovedEvent);
                 } catch (Exception e) {
                     if (log.isErrorEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java
index eb321bc..ce11eb5 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java
@@ -37,8 +37,8 @@ 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.CompleteTenantEvent;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainAddedEvent;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainRemovedEvent;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingAddedEvent;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingRemovedEvent;
 import org.apache.stratos.messaging.event.tenant.TenantSubscribedEvent;
 import org.apache.stratos.messaging.event.tenant.TenantUnSubscribedEvent;
 import org.apache.stratos.messaging.event.topology.*;
@@ -946,7 +946,7 @@ public class DefaultExtensionHandler implements ExtensionHandler {
     }
 
     @Override
-    public void onSubscriptionDomainAddedEvent(SubscriptionDomainAddedEvent subscriptionDomainAddedEvent) {
+    public void onSubscriptionDomainAddedEvent(DomainMappingAddedEvent subscriptionDomainAddedEvent) {
         String tenantDomain = findTenantDomain(subscriptionDomainAddedEvent.getTenantId());
         if (log.isInfoEnabled()) {
             log.info(String.format("Subscription domain added event received: [tenant-id] %d [tenant-domain] %s " +
@@ -954,7 +954,7 @@ public class DefaultExtensionHandler implements ExtensionHandler {
                     subscriptionDomainAddedEvent.getTenantId(),
                     tenantDomain,
                     subscriptionDomainAddedEvent.getDomainName(),
-                    subscriptionDomainAddedEvent.getApplicationContext()
+                    subscriptionDomainAddedEvent.getContextPath()
             ));
         }
 
@@ -968,7 +968,7 @@ public class DefaultExtensionHandler implements ExtensionHandler {
         env.put("STRATOS_SUBSCRIPTION_DOMAIN_NAME", subscriptionDomainAddedEvent.getDomainName());
         env.put("STRATOS_SUBSCRIPTION_TENANT_ID", Integer.toString(subscriptionDomainAddedEvent.getTenantId()));
         env.put("STRATOS_SUBSCRIPTION_TENANT_DOMAIN", tenantDomain);
-        env.put("STRATOS_SUBSCRIPTION_APPLICATION_CONTEXT", subscriptionDomainAddedEvent.getApplicationContext());
+        env.put("STRATOS_SUBSCRIPTION_APPLICATION_CONTEXT", subscriptionDomainAddedEvent.getContextPath());
         ExtensionUtils.executeSubscriptionDomainAddedExtension(env);
     }
 
@@ -986,7 +986,7 @@ public class DefaultExtensionHandler implements ExtensionHandler {
     }
 
     @Override
-    public void onSubscriptionDomainRemovedEvent(SubscriptionDomainRemovedEvent subscriptionDomainRemovedEvent) {
+    public void onSubscriptionDomainRemovedEvent(DomainMappingRemovedEvent subscriptionDomainRemovedEvent) {
         String tenantDomain = findTenantDomain(subscriptionDomainRemovedEvent.getTenantId());
         if (log.isInfoEnabled()) {
             log.info(String.format("Subscription domain removed event received: [tenant-id] %d [tenant-domain] %s " +

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/ExtensionHandler.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/ExtensionHandler.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/ExtensionHandler.java
index dd5f8ce..b710147 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/ExtensionHandler.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/ExtensionHandler.java
@@ -23,8 +23,8 @@ 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.CompleteTenantEvent;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainAddedEvent;
-import org.apache.stratos.messaging.event.tenant.SubscriptionDomainRemovedEvent;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingAddedEvent;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingRemovedEvent;
 import org.apache.stratos.messaging.event.tenant.TenantSubscribedEvent;
 import org.apache.stratos.messaging.event.tenant.TenantUnSubscribedEvent;
 import org.apache.stratos.messaging.event.topology.*;
@@ -61,9 +61,9 @@ public interface ExtensionHandler {
 
     public void volumeMountExtension(String persistenceMappingsPayload);
 
-    public void onSubscriptionDomainAddedEvent(SubscriptionDomainAddedEvent subscriptionDomainAddedEvent);
+    public void onSubscriptionDomainAddedEvent(DomainMappingAddedEvent subscriptionDomainAddedEvent);
 
-    public void onSubscriptionDomainRemovedEvent(SubscriptionDomainRemovedEvent subscriptionDomainRemovedEvent);
+    public void onSubscriptionDomainRemovedEvent(DomainMappingRemovedEvent subscriptionDomainRemovedEvent);
 
     public void onCopyArtifactsExtension(String src, String des);
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationSignUpBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationSignUpBean.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationSignUpBean.java
index 627210e..0577e09 100644
--- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationSignUpBean.java
+++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/ApplicationSignUpBean.java
@@ -31,18 +31,9 @@ public class ApplicationSignUpBean implements Serializable {
 
     private static final long serialVersionUID = -3055522170914869018L;
 
-    private String signUpId;
     private String applicationId;
     private List<ArtifactRepositoryBean> artifactRepositories;
 
-    public String getSignUpId() {
-        return signUpId;
-    }
-
-    public void setSignUpId(String signUpId) {
-        this.signUpId = signUpId;
-    }
-
     public String getApplicationId() {
         return applicationId;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/StratosManagerServiceClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/StratosManagerServiceClient.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/StratosManagerServiceClient.java
index 8df8551..f36d6a9 100644
--- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/StratosManagerServiceClient.java
+++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/StratosManagerServiceClient.java
@@ -85,27 +85,29 @@ public class StratosManagerServiceClient {
      *
      * @param applicationSignUp
      */
-    public String addApplicationSignUp(ApplicationSignUp applicationSignUp) throws StratosManagerServiceApplicationSignUpExceptionException, RemoteException {
-        return stub.addApplicationSignUp(applicationSignUp);
+    public void addApplicationSignUp(ApplicationSignUp applicationSignUp) throws StratosManagerServiceApplicationSignUpExceptionException, RemoteException {
+        stub.addApplicationSignUp(applicationSignUp);
     }
 
     /**
      * Remove application signup.
      *
-     * @param signUpId
+     * @param applicationId
+     * @param tenantId
      */
-    public void removeApplicationSignUp(String signUpId) throws StratosManagerServiceApplicationSignUpExceptionException, RemoteException {
-        stub.removeApplicationSignUp(signUpId);
+    public void removeApplicationSignUp(String applicationId, int tenantId) throws StratosManagerServiceApplicationSignUpExceptionException, RemoteException {
+        stub.removeApplicationSignUp(applicationId, tenantId);
     }
 
     /**
      * Get application signup.
      *
-     * @param signUpId
+     * @param applicationId
+     * @param tenantId
      * @return
      */
-    public ApplicationSignUp getApplicationSignUp(String signUpId) throws StratosManagerServiceApplicationSignUpExceptionException, RemoteException {
-        return stub.getApplicationSignUp(signUpId);
+    public ApplicationSignUp getApplicationSignUp(String applicationId, int tenantId) throws StratosManagerServiceApplicationSignUpExceptionException, RemoteException {
+        return stub.getApplicationSignUp(applicationId, tenantId);
     }
 
     /**
@@ -119,16 +121,19 @@ public class StratosManagerServiceClient {
 
     /**
      * Notify artifact updated event for application signup.
-     * @param signUpId
+     *
+     * @param applicationId
+     * @param tenantId
      * @throws StratosManagerServiceArtifactDistributionCoordinatorExceptionException
      * @throws RemoteException
      */
-    public void notifyArtifactUpdatedEventForSignUp(String signUpId) throws StratosManagerServiceArtifactDistributionCoordinatorExceptionException, RemoteException {
-        stub.notifyArtifactUpdatedEventForSignUp(signUpId);
+    public void notifyArtifactUpdatedEventForSignUp(String applicationId, int tenantId) throws StratosManagerServiceArtifactDistributionCoordinatorExceptionException, RemoteException {
+        stub.notifyArtifactUpdatedEventForSignUp(applicationId, tenantId);
     }
 
     /**
      * Notify artifact updated event for artifact repository.
+     *
      * @param repoUrl
      * @throws StratosManagerServiceArtifactDistributionCoordinatorExceptionException
      * @throws RemoteException

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContext.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContext.java
index 4638754..895d0d9 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContext.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/LoadBalancerContext.java
@@ -108,7 +108,7 @@ public class LoadBalancerContext {
         return hostNameClusterMap;
     }
 
-    public HostNameAppContextMap getHostNameAppContextMap() {
+    public HostNameAppContextMap getHostNameContextPathMap() {
         return hostNameAppContextMap;
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/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 bfe0ddf..3fec1dd 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
@@ -176,10 +176,10 @@ public class LoadBalancerContextUtil {
      * Add clusters against domain name for the given service, cluster ids.
      *
      * @param serviceName
-     * @param clusterIds
+     * @param clusterId
      * @param domainName
      */
-    public static void addClustersAgainstDomain(String serviceName, Set<String> clusterIds, String domainName) {
+    public static void addClusterAgainstDomain(String serviceName, String clusterId, String domainName) {
         try {
             TopologyManager.acquireReadLock();
             Service service = TopologyManager.getTopology().getService(serviceName);
@@ -189,15 +189,12 @@ public class LoadBalancerContextUtil {
                 }
                 return;
             }
-            Cluster cluster;
-            for (String clusterId : clusterIds) {
-                cluster = service.getCluster(clusterId);
-                if (cluster != null) {
-                    addClusterAgainstDomain(serviceName, cluster, domainName);
-                } else {
-                    if (log.isWarnEnabled()) {
-                        log.warn(String.format("Cluster not found in service: [service] %s [cluster] %s", serviceName, clusterId));
-                    }
+            Cluster cluster = service.getCluster(clusterId);
+            if (cluster != null) {
+                addClusterAgainstDomain(serviceName, cluster, domainName);
+            } else {
+                if (log.isWarnEnabled()) {
+                    log.warn(String.format("Cluster not found in service: [service] %s [cluster] %s", serviceName, clusterId));
                 }
             }
         } finally {
@@ -209,10 +206,10 @@ public class LoadBalancerContextUtil {
      * Remove clusters mapped against domain name for the given service, cluster ids.
      *
      * @param serviceName
-     * @param clusterIds
+     * @param clusterId
      * @param domainName
      */
-    public static void removeClustersAgainstDomain(String serviceName, Set<String> clusterIds, String domainName) {
+    public static void removeClusterAgainstDomain(String serviceName, String clusterId, String domainName) {
         try {
             TopologyManager.acquireReadLock();
 
@@ -223,16 +220,13 @@ public class LoadBalancerContextUtil {
                 }
                 return;
             }
-            Cluster cluster;
-            for (String clusterId : clusterIds) {
-                cluster = service.getCluster(clusterId);
-                if (cluster != null) {
-                    // Remove clusters mapped against domain names
-                    removeClusterAgainstDomain(cluster, domainName);
-                } else {
-                    if (log.isWarnEnabled()) {
-                        log.warn(String.format("Cluster not found in service: [service] %s [cluster] %s", serviceName, clusterId));
-                    }
+            Cluster cluster = service.getCluster(clusterId);
+            if (cluster != null) {
+                // Remove clusters mapped against domain names
+                removeClusterAgainstDomain(cluster, domainName);
+            } else {
+                if (log.isWarnEnabled()) {
+                    log.warn(String.format("Cluster not found in service: [service] %s [cluster] %s", serviceName, clusterId));
                 }
             }
         } finally {
@@ -426,18 +420,18 @@ public class LoadBalancerContextUtil {
         }
     }
 
-    public static void addAppContextAgainstDomain(String domainName, String appContext) {
-        LoadBalancerContext.getInstance().getHostNameAppContextMap().addAppContext(domainName, appContext);
+    public static void addContextPathAgainstDomain(String domainName, String appContext) {
+        LoadBalancerContext.getInstance().getHostNameContextPathMap().addContextPath(domainName, appContext);
         if (log.isDebugEnabled()) {
-            log.debug(String.format("Application context added against domain name: [domain-name] %s [app-context] %s",
+            log.debug(String.format("Context path added against domain name: [domain-name] %s [context-path] %s",
                     domainName, appContext));
         }
     }
 
-    public static void removeAppContextAgainstDomain(String domainName) {
-        LoadBalancerContext.getInstance().getHostNameAppContextMap().removeAppContext(domainName);
+    public static void removeContextPathAgainstDomain(String domainName) {
+        LoadBalancerContext.getInstance().getHostNameContextPathMap().removeContextPath(domainName);
         if (log.isDebugEnabled()) {
-            log.debug(String.format("Application context removed against domain name: [domain-name] %s",
+            log.debug(String.format("Context path removed against domain name: [domain-name] %s",
                     domainName));
         }
     }
@@ -464,7 +458,7 @@ public class LoadBalancerContextUtil {
                                     "[tenant-id] %d [domains] %s", serviceName, tenantId, subscription.getSubscriptionDomains()));
                         }
                         for (SubscriptionDomain subscriptionDomain : subscription.getSubscriptionDomains()) {
-                            removeAppContextAgainstDomain(subscriptionDomain.getDomainName());
+                            removeContextPathAgainstDomain(subscriptionDomain.getDomainName());
                         }
                     } else {
                         if (log.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/map/HostNameAppContextMap.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/map/HostNameAppContextMap.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/map/HostNameAppContextMap.java
index e2ccfa3..3e71093 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/map/HostNameAppContextMap.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/context/map/HostNameAppContextMap.java
@@ -22,7 +22,7 @@ package org.apache.stratos.load.balancer.context.map;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * Host/domain name application context map.
+ * Host/domain name context path map.
  */
 public class HostNameAppContextMap {
     private ConcurrentHashMap<String, String> concurrentHashMap;
@@ -31,7 +31,7 @@ public class HostNameAppContextMap {
         concurrentHashMap = new ConcurrentHashMap<String, String>();
     }
 
-    public void addAppContext(String hostName, String appContext) {
+    public void addContextPath(String hostName, String appContext) {
         concurrentHashMap.put(hostName, appContext);
     }
 
@@ -39,7 +39,7 @@ public class HostNameAppContextMap {
         return concurrentHashMap.get(hostName);
     }
 
-    public void removeAppContext(String hostName) {
+    public void removeContextPath(String hostName) {
         if(contains(hostName)) {
             concurrentHashMap.remove(hostName);
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java
index ec25537..5aed58c 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java
@@ -596,8 +596,8 @@ public class TenantAwareLoadBalanceEndpoint extends org.apache.synapse.endpoints
             }
 
             String hostName = extractTargetHost(synCtx);
-            if (LoadBalancerContext.getInstance().getHostNameAppContextMap().contains(hostName)) {
-                String appContext = LoadBalancerContext.getInstance().getHostNameAppContextMap().getAppContext(hostName);
+            if (LoadBalancerContext.getInstance().getHostNameContextPathMap().contains(hostName)) {
+                String appContext = LoadBalancerContext.getInstance().getHostNameContextPathMap().getAppContext(hostName);
                 if(StringUtils.isNotBlank(appContext)) {
                     if (log.isDebugEnabled()) {
                         log.debug(String.format("Domain mapping found with application context: [domain-name] %s [app-context] %s", hostName, appContext));

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/internal/LoadBalancerServiceComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/internal/LoadBalancerServiceComponent.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/internal/LoadBalancerServiceComponent.java
index 739383f..20d7fe8 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/internal/LoadBalancerServiceComponent.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/internal/LoadBalancerServiceComponent.java
@@ -27,8 +27,8 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.common.clustering.DistributedObjectProvider;
 import org.apache.stratos.common.threading.StratosThreadPool;
 import org.apache.stratos.load.balancer.endpoint.EndpointDeployer;
-import org.apache.stratos.load.balancer.messaging.LoadBalancerTenantEventReceiver;
-import org.apache.stratos.load.balancer.messaging.LoadBalancerTopologyEventReceiver;
+import org.apache.stratos.load.balancer.messaging.receiver.LoadBalancerTenantEventReceiver;
+import org.apache.stratos.load.balancer.messaging.receiver.LoadBalancerTopologyEventReceiver;
 import org.apache.stratos.load.balancer.exception.TenantAwareLoadBalanceEndpointException;
 import org.apache.stratos.load.balancer.common.statistics.notifier.LoadBalancerStatisticsNotifier;
 import org.apache.stratos.load.balancer.conf.LoadBalancerConfiguration;

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTenantEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTenantEventReceiver.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTenantEventReceiver.java
deleted file mode 100644
index e729dd5..0000000
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTenantEventReceiver.java
+++ /dev/null
@@ -1,211 +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.load.balancer.messaging;
-
-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;
-import org.apache.stratos.messaging.event.Event;
-import org.apache.stratos.messaging.event.tenant.*;
-import org.apache.stratos.messaging.listener.tenant.*;
-import org.apache.stratos.messaging.message.receiver.tenant.TenantEventReceiver;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
-
-/**
- * Load balancer tenant receiver updates load balancer context according to
- * incoming tenant events.
- */
-public class LoadBalancerTenantEventReceiver{
-
-    private static final Log log = LogFactory.getLog(LoadBalancerTenantEventReceiver.class);
-
-    private final TenantEventReceiver tenantEventReceiver;
-    private boolean terminated;
-
-    public LoadBalancerTenantEventReceiver() {
-        tenantEventReceiver = new TenantEventReceiver();
-        addEventListeners();
-    }
-
-    private void addEventListeners() {
-        tenantEventReceiver.addEventListener(new CompleteTenantEventListener() {
-            private boolean initialized;
-
-            @Override
-            protected void onEvent(Event event) {
-                if (!initialized) {
-                    CompleteTenantEvent completeTenantEvent = (CompleteTenantEvent) event;
-                    if (log.isDebugEnabled()) {
-                        log.debug("Complete tenant event received");
-                    }
-                    for (Tenant tenant : completeTenantEvent.getTenants()) {
-                        for (Subscription subscription : tenant.getSubscriptions()) {
-                            if (isMultiTenantService(subscription.getServiceName())) {
-                                LoadBalancerContextUtil.addClustersAgainstHostNamesAndTenantIds(
-                                        subscription.getServiceName(),
-                                        tenant.getTenantId(),
-                                        subscription.getClusterIds());
-                            }
-
-                            for (SubscriptionDomain subscriptionDomain : subscription.getSubscriptionDomains()) {
-                                LoadBalancerContextUtil.addClustersAgainstDomain(
-                                        subscription.getServiceName(),
-                                        subscription.getClusterIds(),
-                                        subscriptionDomain.getDomainName());
-
-                                LoadBalancerContextUtil.addAppContextAgainstDomain(subscriptionDomain.getDomainName(),
-                                        subscriptionDomain.getApplicationContext());
-                            }
-                        }
-                    }
-                    initialized = true;
-                }
-            }
-        });
-        tenantEventReceiver.addEventListener(new TenantSubscribedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-                TenantSubscribedEvent tenantSubscribedEvent = (TenantSubscribedEvent) event;
-                if (log.isDebugEnabled()) {
-                    log.debug(String.format("Tenant subscribed event received: [tenant-id] %d [service] %s [cluster-ids] %s",
-                            tenantSubscribedEvent.getTenantId(),
-                            tenantSubscribedEvent.getServiceName(),
-                            tenantSubscribedEvent.getClusterIds()));
-                }
-
-                if (isMultiTenantService(tenantSubscribedEvent.getServiceName())) {
-                    LoadBalancerContextUtil.addClustersAgainstHostNamesAndTenantIds(
-                            tenantSubscribedEvent.getServiceName(),
-                            tenantSubscribedEvent.getTenantId(),
-                            tenantSubscribedEvent.getClusterIds());
-                }
-            }
-        });
-        tenantEventReceiver.addEventListener(new TenantUnSubscribedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-                TenantUnSubscribedEvent tenantUnSubscribedEvent = (TenantUnSubscribedEvent) event;
-                if (log.isDebugEnabled()) {
-                    log.debug(String.format("Tenant un-subscribed event received: [tenant-id] %d [service] %s [cluster-ids] %s",
-                            tenantUnSubscribedEvent.getTenantId(),
-                            tenantUnSubscribedEvent.getServiceName(),
-                            tenantUnSubscribedEvent.getClusterIds()));
-                }
-
-                if (isMultiTenantService(tenantUnSubscribedEvent.getServiceName())) {
-                    LoadBalancerContextUtil.removeClustersAgainstHostNamesAndTenantIds(
-                            tenantUnSubscribedEvent.getServiceName(),
-                            tenantUnSubscribedEvent.getTenantId(),
-                            tenantUnSubscribedEvent.getClusterIds()
-                    );
-                }
-
-                LoadBalancerContextUtil.removeClustersAgainstAllDomains(
-                        tenantUnSubscribedEvent.getServiceName(),
-                        tenantUnSubscribedEvent.getTenantId(),
-                        tenantUnSubscribedEvent.getClusterIds());
-
-                LoadBalancerContextUtil.removeAppContextAgainstAllDomains(
-                        tenantUnSubscribedEvent.getServiceName(),
-                        tenantUnSubscribedEvent.getTenantId());
-            }
-        });
-        tenantEventReceiver.addEventListener(new SubscriptionDomainsAddedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-                SubscriptionDomainAddedEvent subscriptionDomainAddedEvent = (SubscriptionDomainAddedEvent) event;
-                if (log.isDebugEnabled()) {
-                    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.addClustersAgainstDomain(
-                        subscriptionDomainAddedEvent.getServiceName(),
-                        subscriptionDomainAddedEvent.getClusterIds(),
-                        subscriptionDomainAddedEvent.getDomainName());
-
-                LoadBalancerContextUtil.addAppContextAgainstDomain(
-                        subscriptionDomainAddedEvent.getDomainName(),
-                        subscriptionDomainAddedEvent.getApplicationContext());
-            }
-        });
-        tenantEventReceiver.addEventListener(new SubscriptionDomainsRemovedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-                SubscriptionDomainRemovedEvent subscriptionDomainRemovedEvent = (SubscriptionDomainRemovedEvent) event;
-                if (log.isDebugEnabled()) {
-                    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.removeClustersAgainstDomain(
-                        subscriptionDomainRemovedEvent.getServiceName(),
-                        subscriptionDomainRemovedEvent.getClusterIds(),
-                        subscriptionDomainRemovedEvent.getDomainName());
-
-                LoadBalancerContextUtil.removeAppContextAgainstDomain(
-                        subscriptionDomainRemovedEvent.getDomainName());
-            }
-        });
-    }
-
-    private boolean isMultiTenantService(String serviceName) {
-        try {
-            TopologyManager.acquireReadLock();
-            Service service = TopologyManager.getTopology().getService(serviceName);
-            if (service != null) {
-                return (service.getServiceType() == ServiceType.MultiTenant);
-            }
-            return false;
-        } finally {
-            TopologyManager.releaseReadLock();
-        }
-    }
-
-
-    public void execute() {
-        tenantEventReceiver.execute();
-
-        if (log.isInfoEnabled()) {
-            log.info("Load balancer tenant receiver thread terminated");
-        }
-    }
-
-    /**
-     * Terminate load balancer tenant receiver thread.
-     */
-    public void terminate() {
-        tenantEventReceiver.terminate();
-        terminated = true;
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTopologyEventReceiver.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTopologyEventReceiver.java
deleted file mode 100644
index 4c75bf2..0000000
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTopologyEventReceiver.java
+++ /dev/null
@@ -1,421 +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.load.balancer.messaging;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.load.balancer.context.LoadBalancerContext;
-import org.apache.stratos.load.balancer.context.LoadBalancerContextUtil;
-import org.apache.stratos.load.balancer.context.map.AlgorithmContextMap;
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.messaging.domain.topology.Member;
-import org.apache.stratos.messaging.domain.topology.MemberStatus;
-import org.apache.stratos.messaging.domain.topology.Service;
-import org.apache.stratos.messaging.event.Event;
-import org.apache.stratos.messaging.event.topology.*;
-import org.apache.stratos.messaging.listener.topology.*;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
-
-import java.util.concurrent.ExecutorService;
-
-/**
- * Load balancer topology receiver updates load balancer context according to
- * incoming topology events.
- */
-public class LoadBalancerTopologyEventReceiver {
-
-    private static final Log log = LogFactory.getLog(LoadBalancerTopologyEventReceiver.class);
-	private ExecutorService executorService;
-    private TopologyEventReceiver topologyEventReceiver;
-    private boolean terminated;
-
-    public LoadBalancerTopologyEventReceiver() {
-        this.topologyEventReceiver = new TopologyEventReceiver();
-        addEventListeners();
-    }
-
-    public void execute() {
-		topologyEventReceiver.setExecutorService(executorService);
-	    topologyEventReceiver.execute();
-        if (log.isInfoEnabled()) {
-            log.info("Load balancer topology receiver thread started");
-        }
-
-
-    }
-
-    private void addEventListeners() {
-        // Listen to topology events that affect clusters
-        topologyEventReceiver.addEventListener(new CompleteTopologyEventListener() {
-            private boolean initialized;
-
-            @Override
-            protected void onEvent(Event event) {
-                if(!initialized) {
-                    try {
-                        TopologyManager.acquireReadLock();
-                        for (Service service : TopologyManager.getTopology().getServices()) {
-                            for (Cluster cluster : service.getClusters()) {
-                                if (clusterHasActiveMembers(cluster)) {
-                                    LoadBalancerContextUtil.addClusterAgainstHostNames(cluster);
-                                } else {
-                                    if (log.isDebugEnabled()) {
-                                        log.debug("Cluster does not have any active members");
-                                    }
-                                }
-                                for (Member member : cluster.getMembers()) {
-                                    if (member.getStatus() == MemberStatus.Activated) {
-                                        addMemberIpsToMemberIpHostnameMap(cluster, member);
-                                    }
-
-                                }
-                            }
-                        }
-                        initialized = true;
-                    } catch (Exception e) {
-                        log.error("Error processing event", e);
-                    } finally {
-                        TopologyManager.releaseReadLock();
-                    }
-                }
-            }
-
-            private boolean clusterHasActiveMembers(Cluster cluster) {
-                for (Member member : cluster.getMembers()) {
-                    if (member.getStatus() == MemberStatus.Activated) {
-                        return true;
-                    }
-                }
-                return false;
-            }
-        });
-        topologyEventReceiver.addEventListener(new MemberActivatedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-
-                MemberActivatedEvent memberActivatedEvent = (MemberActivatedEvent) event;
-
-                //TopologyManager.acquireReadLock();
-                TopologyManager.acquireReadLockForCluster(memberActivatedEvent.getServiceName(),
-                        memberActivatedEvent.getClusterId());
-
-                try {
-
-                    Service service = TopologyManager.getTopology().getService(memberActivatedEvent.getServiceName());
-                    if (service == null) {
-                        if (log.isWarnEnabled()) {
-                            log.warn(String.format("Service not found in topology: [service] %s",
-                                    memberActivatedEvent.getServiceName()));
-                        }
-                        return;
-                    }
-                    Cluster cluster = service.getCluster(memberActivatedEvent.getClusterId());
-                    if (cluster == null) {
-                        if (log.isWarnEnabled()) {
-                            log.warn(String.format("Cluster not found in topology: [service] %s [cluster] %s",
-                                    memberActivatedEvent.getServiceName(), memberActivatedEvent.getClusterId()));
-                        }
-                        return;
-                    }
-                    Member member = cluster.getMember(memberActivatedEvent.getMemberId());
-                    if (member == null) {
-                        if (log.isWarnEnabled()) {
-                            log.warn(String.format("Member not found in topology: [service] %s [cluster] %s [member] %s",
-                                    memberActivatedEvent.getServiceName(), memberActivatedEvent.getClusterId(),
-                                    memberActivatedEvent.getMemberId()));
-                        }
-                        return;
-                    }
-
-                    // Add member to member-ip -> hostname map
-                    addMemberIpsToMemberIpHostnameMap(cluster,  member);
-
-                    if (LoadBalancerContext.getInstance().getClusterIdClusterMap().containsCluster(
-                            member.getClusterId())) {
-                        if (log.isDebugEnabled()) {
-                            log.debug(String.format("Cluster already exists in load balancer context: [service] %s " +
-                                    "[cluster] %s", member.getServiceName(), member.getClusterId()));
-                        }
-                        // At this point member is already added to the cluster object in load balancer context
-                        return;
-                    }
-
-                    // Add cluster to load balancer context when its first member is activated:
-                    // Cluster not found in load balancer context, add it
-                    LoadBalancerContextUtil.addClusterAgainstHostNames(cluster);
-                } catch (Exception e) {
-                    log.error("Error processing event", e);
-                } finally {
-                    //TopologyManager.releaseReadLock();
-                    TopologyManager.releaseReadLockForCluster(memberActivatedEvent.getServiceName(),
-                            memberActivatedEvent.getClusterId());
-                }
-            }
-        });
-        topologyEventReceiver.addEventListener(new MemberMaintenanceListener() {
-            @Override
-            protected void onEvent(Event event) {
-
-                MemberMaintenanceModeEvent memberMaintenanceModeEvent = (MemberMaintenanceModeEvent) event;
-
-                TopologyManager.acquireReadLockForCluster(memberMaintenanceModeEvent.getServiceName(),
-                        memberMaintenanceModeEvent.getClusterId());
-
-                try {
-                    //TopologyManager.acquireReadLock();
-
-                    Member member = findMember(memberMaintenanceModeEvent.getServiceName(),
-                            memberMaintenanceModeEvent.getClusterId(), memberMaintenanceModeEvent.getMemberId());
-
-                    if (member != null) {
-                        removeMemberIpsFromMemberIpHostnameMap(member);
-                    }
-                } catch (Exception e) {
-                    log.error("Error processing event", e);
-                } finally {
-                    //TopologyManager.releaseReadLock();
-                    TopologyManager.releaseReadLockForCluster(memberMaintenanceModeEvent.getServiceName(),
-                            memberMaintenanceModeEvent.getClusterId());
-                }
-            }
-        });
-        topologyEventReceiver.addEventListener(new MemberSuspendedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-
-                MemberSuspendedEvent memberSuspendedEvent = (MemberSuspendedEvent) event;
-                TopologyManager.acquireReadLockForCluster(memberSuspendedEvent.getServiceName(),
-                        memberSuspendedEvent.getClusterId());
-
-                try {
-                    //TopologyManager.acquireReadLock();
-                    Member member = findMember(memberSuspendedEvent.getServiceName(),
-                            memberSuspendedEvent.getClusterId(), memberSuspendedEvent.getMemberId());
-
-                    if (member != null) {
-                        removeMemberIpsFromMemberIpHostnameMap(member);
-                    }
-                } catch (Exception e) {
-                    log.error("Error processing event", e);
-                } finally {
-                    //TopologyManager.releaseReadLock();
-                    TopologyManager.releaseReadLockForCluster(memberSuspendedEvent.getServiceName(),
-                            memberSuspendedEvent.getClusterId());
-                }
-            }
-        });
-        topologyEventReceiver.addEventListener(new MemberTerminatedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-
-                //TopologyManager.acquireReadLock();
-                MemberTerminatedEvent memberTerminatedEvent = (MemberTerminatedEvent) event;
-
-                TopologyManager.acquireReadLockForCluster(memberTerminatedEvent.getServiceName(),
-                        memberTerminatedEvent.getClusterId());
-
-                try {
-                    Member member = findMember(memberTerminatedEvent.getServiceName(),
-                            memberTerminatedEvent.getClusterId(), memberTerminatedEvent.getMemberId());
-
-                    if (member != null) {
-                        removeMemberIpsFromMemberIpHostnameMap(member);
-                    }
-                } catch (Exception e) {
-                    log.error("Error processing event", e);
-                } finally {
-                    //TopologyManager.releaseReadLock();
-                    TopologyManager.releaseReadLockForCluster(memberTerminatedEvent.getServiceName(),
-                            memberTerminatedEvent.getClusterId());
-                }
-            }
-        });
-        topologyEventReceiver.addEventListener(new ClusterRemovedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-
-                // Remove cluster from context
-                ClusterRemovedEvent clusterRemovedEvent = (ClusterRemovedEvent) event;
-                TopologyManager.acquireReadLockForCluster(clusterRemovedEvent.getServiceName(),
-                        clusterRemovedEvent.getClusterId());
-
-                try {
-                    AlgorithmContextMap.getInstance().removeCluster(clusterRemovedEvent.getServiceName(),
-                            clusterRemovedEvent.getClusterId());
-                } catch (Exception e) {
-                    log.error("Could not remove cluster from load balancer algorithm context map", e);
-                }
-
-                try {
-                    Cluster cluster = LoadBalancerContext.getInstance().getClusterIdClusterMap().getCluster(clusterRemovedEvent.getClusterId());
-                    if (cluster != null) {
-                        for (Member member : cluster.getMembers()) {
-                            removeMemberIpsFromMemberIpHostnameMap(member);
-                        }
-                        LoadBalancerContextUtil.removeClusterAgainstHostNames(cluster.getClusterId());
-                    } else {
-                        if (log.isWarnEnabled()) {
-                            log.warn(String.format("Cluster not found in load balancer context: [service] %s [cluster] %s",
-                                    clusterRemovedEvent.getServiceName(), clusterRemovedEvent.getClusterId()));
-                        }
-                    }
-                } catch (Exception e) {
-                    log.error("Error processing event", e);
-                } finally {
-                    TopologyManager.releaseReadLockForCluster(clusterRemovedEvent.getServiceName(),
-                            clusterRemovedEvent.getClusterId());
-                }
-            }
-        });
-        topologyEventReceiver.addEventListener(new ServiceRemovedEventListener() {
-            @Override
-            protected void onEvent(Event event) {
-
-                ServiceRemovedEvent serviceRemovedEvent = (ServiceRemovedEvent) event;
-                TopologyManager.acquireReadLockForService(serviceRemovedEvent.getServiceName());
-
-                try {
-                    //TopologyManager.acquireReadLock();
-
-                    // Remove all clusters of given service from context
-                    Service service = TopologyManager.getTopology().getService(serviceRemovedEvent.getServiceName());
-                    if (service != null) {
-                        for (Cluster cluster : service.getClusters()) {
-                            for (Member member : cluster.getMembers()) {
-                                removeMemberIpsFromMemberIpHostnameMap(member);
-                            }
-                            LoadBalancerContextUtil.removeClusterAgainstHostNames(cluster.getClusterId());
-                        }
-                    } else {
-                        if (log.isWarnEnabled()) {
-                            log.warn(String.format("Service not found in topology: [service] %s",
-                                    serviceRemovedEvent.getServiceName()));
-                        }
-                    }
-                } catch (Exception e) {
-                    log.error("Error processing event", e);
-                } finally {
-                    //TopologyManager.releaseReadLock();
-                    TopologyManager.releaseReadLockForService(serviceRemovedEvent.getServiceName());
-                }
-            }
-        });
-    }
-
-    private Member findMember(String serviceName, String clusterId, String memberId) {
-        Service service = TopologyManager.getTopology().getService(serviceName);
-        if (service == null) {
-            if (log.isWarnEnabled()) {
-                log.warn(String.format("Service not found in topology: [service] %s", serviceName));
-            }
-            return null;
-        }
-
-        Cluster cluster = service.getCluster(clusterId);
-        if (cluster == null) {
-            if (log.isWarnEnabled()) {
-                log.warn(String.format("Cluster not found in topology: [service] %s [cluster] %s", serviceName, clusterId));
-            }
-            return null;
-        }
-
-        Member member = cluster.getMember(memberId);
-        if (member == null) {
-            if (log.isWarnEnabled()) {
-                log.warn(String.format("Member not found in topology: [service] %s [cluster] %s [member] %s", serviceName,
-                        clusterId, memberId));
-            }
-            return null;
-        }
-        return member;
-    }
-
-    private void addMemberIpsToMemberIpHostnameMap(Cluster cluster, Member member) {
-        if ((cluster.getHostNames() == null) || (cluster.getHostNames().size() == 0)) {
-            if (log.isWarnEnabled()) {
-                log.warn(String.format("Hostnames not found in cluster %s, could not add member ips to member-ip " +
-                        "-> hostname map", member.getClusterId()));
-            }
-            return;
-        }
-
-        String hostname = cluster.getHostNames().get(0);
-        if (cluster.getHostNames().size() > 1) {
-            if (log.isWarnEnabled()) {
-                log.warn(String.format("Multiple hostnames found in cluster %s, using %s",
-                        cluster.getHostNames().toString(), hostname));
-            }
-        }
-
-        if (StringUtils.isNotBlank(member.getDefaultPrivateIP())) {
-            LoadBalancerContext.getInstance().getMemberIpHostnameMap().put(member.getDefaultPrivateIP(), hostname);
-            if (log.isDebugEnabled()) {
-                log.debug(String.format("Member private ip added to member-ip -> hostname map: [service] %s [cluster] " +
-                                "%s [member] %s [private-ip] %s", member.getServiceName(), member.getClusterId(),
-                        member.getMemberId(), member.getDefaultPrivateIP()
-                ));
-            }
-        }
-        if (StringUtils.isNotBlank(member.getDefaultPublicIP())) {
-            LoadBalancerContext.getInstance().getMemberIpHostnameMap().put(member.getDefaultPublicIP(), hostname);
-            if (log.isDebugEnabled()) {
-                log.debug(String.format("Member public ip added to member-ip -> hostname map: [service] %s [cluster] " +
-                                "%s [member] %s [public-ip] %s", member.getServiceName(), member.getClusterId(),
-                        member.getMemberId(), member.getDefaultPublicIP()
-                ));
-            }
-        }
-    }
-
-    private void removeMemberIpsFromMemberIpHostnameMap(Member member) {
-        if (StringUtils.isNotBlank(member.getDefaultPrivateIP())) {
-            LoadBalancerContext.getInstance().getMemberIpHostnameMap().remove(member.getDefaultPrivateIP());
-            if (log.isDebugEnabled()) {
-                log.debug(String.format("Member private ip removed from member-ip -> hostname map: [private-ip] %s",
-                        member.getDefaultPrivateIP()));
-            }
-        }
-        if (StringUtils.isNotBlank(member.getDefaultPublicIP())) {
-            LoadBalancerContext.getInstance().getMemberIpHostnameMap().remove(member.getDefaultPublicIP());
-            if (log.isDebugEnabled()) {
-                log.debug(String.format("Member public ip removed from member-ip -> hostname map: [public-ip] %s",
-                        member.getDefaultPublicIP()));
-            }
-        }
-    }
-
-    /**
-     * Terminate load balancer topology receiver thread.
-     */
-    public void terminate() {
-        topologyEventReceiver.terminate();
-        terminated = true;
-    }
-
-	public ExecutorService getExecutorService() {
-		return executorService;
-	}
-
-	public void setExecutorService(ExecutorService executorService) {
-		this.executorService = executorService;
-	}
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerDomainMappingEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerDomainMappingEventReceiver.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerDomainMappingEventReceiver.java
new file mode 100644
index 0000000..78d7950
--- /dev/null
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerDomainMappingEventReceiver.java
@@ -0,0 +1,89 @@
+/*
+ * 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.load.balancer.messaging.receiver;
+
+import org.apache.stratos.load.balancer.context.LoadBalancerContextUtil;
+import org.apache.stratos.messaging.event.Event;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingAddedEvent;
+import org.apache.stratos.messaging.event.domain.mapping.DomainMappingRemovedEvent;
+import org.apache.stratos.messaging.listener.domain.mapping.DomainMappingAddedEventListener;
+import org.apache.stratos.messaging.listener.domain.mapping.DomainMappingRemovedEventListener;
+import org.apache.stratos.messaging.message.receiver.domain.mapping.DomainMappingEventReceiver;
+
+/**
+ * Load balancer domain mapping event receiver.
+ */
+public class LoadBalancerDomainMappingEventReceiver extends DomainMappingEventReceiver {
+
+    public LoadBalancerDomainMappingEventReceiver() {
+        addEventListeners();
+    }
+
+    private void addEventListeners() {
+
+//        addEventListener(new CompleteDomainMappingsEventListener() {
+//            @Override
+//            protected void onEvent(Event event) {
+//                CompleteDomainMappingsEvent completeDomainMappingsEvent = (CompleteDomainMappingsEvent)event;
+//
+//                for(DomainMapping domainMapping : completeDomainMappingsEvent.getDomainMappings()) {
+//                    LoadBalancerContextUtil.addClusterAgainstDomain(
+//                            domainMapping.getServiceName(),
+//                            domainMapping.getClusterId(),
+//                            domainMapping.getDomainName());
+//
+//                    LoadBalancerContextUtil.addContextPathAgainstDomain(domainMapping.getDomainName(),
+//                            domainMapping.getContextPath());
+//                }
+//            }
+//        });
+
+        addEventListener(new DomainMappingAddedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+                DomainMappingAddedEvent domainMappingAddedEvent = (DomainMappingAddedEvent)event;
+
+                LoadBalancerContextUtil.addClusterAgainstDomain(
+                        domainMappingAddedEvent.getServiceName(),
+                        domainMappingAddedEvent.getClusterId(),
+                        domainMappingAddedEvent.getDomainName());
+
+                LoadBalancerContextUtil.addContextPathAgainstDomain(
+                        domainMappingAddedEvent.getDomainName(),
+                        domainMappingAddedEvent.getContextPath());
+            }
+        });
+
+        addEventListener(new DomainMappingRemovedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+                DomainMappingRemovedEvent domainMappingRemovedEvent = (DomainMappingRemovedEvent)event;
+
+                LoadBalancerContextUtil.removeClusterAgainstDomain(
+                        domainMappingRemovedEvent.getServiceName(),
+                        domainMappingRemovedEvent.getClusterId(),
+                        domainMappingRemovedEvent.getDomainName());
+
+                LoadBalancerContextUtil.removeContextPathAgainstDomain(
+                        domainMappingRemovedEvent.getDomainName());
+            }
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/8edb91a3/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerTenantEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerTenantEventReceiver.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerTenantEventReceiver.java
new file mode 100644
index 0000000..b223de8
--- /dev/null
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/receiver/LoadBalancerTenantEventReceiver.java
@@ -0,0 +1,156 @@
+/*
+ * 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.load.balancer.messaging.receiver;
+
+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.Tenant;
+import org.apache.stratos.messaging.domain.topology.Service;
+import org.apache.stratos.messaging.domain.topology.ServiceType;
+import org.apache.stratos.messaging.event.Event;
+import org.apache.stratos.messaging.event.tenant.*;
+import org.apache.stratos.messaging.listener.tenant.*;
+import org.apache.stratos.messaging.message.receiver.tenant.TenantEventReceiver;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+
+/**
+ * Load balancer tenant receiver updates load balancer context according to
+ * incoming tenant events.
+ */
+public class LoadBalancerTenantEventReceiver{
+
+    private static final Log log = LogFactory.getLog(LoadBalancerTenantEventReceiver.class);
+
+    private final TenantEventReceiver tenantEventReceiver;
+    private boolean terminated;
+
+    public LoadBalancerTenantEventReceiver() {
+        tenantEventReceiver = new TenantEventReceiver();
+        addEventListeners();
+    }
+
+    private void addEventListeners() {
+        tenantEventReceiver.addEventListener(new CompleteTenantEventListener() {
+            private boolean initialized;
+
+            @Override
+            protected void onEvent(Event event) {
+                if (!initialized) {
+                    CompleteTenantEvent completeTenantEvent = (CompleteTenantEvent) event;
+                    if (log.isDebugEnabled()) {
+                        log.debug("Complete tenant event received");
+                    }
+                    for (Tenant tenant : completeTenantEvent.getTenants()) {
+                        for (Subscription subscription : tenant.getSubscriptions()) {
+                            if (isMultiTenantService(subscription.getServiceName())) {
+                                LoadBalancerContextUtil.addClustersAgainstHostNamesAndTenantIds(
+                                        subscription.getServiceName(),
+                                        tenant.getTenantId(),
+                                        subscription.getClusterIds());
+                            }
+                        }
+                    }
+                    initialized = true;
+                }
+            }
+        });
+
+        tenantEventReceiver.addEventListener(new TenantSubscribedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+                TenantSubscribedEvent tenantSubscribedEvent = (TenantSubscribedEvent) event;
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Tenant subscribed event received: [tenant-id] %d [service] %s [cluster-ids] %s",
+                            tenantSubscribedEvent.getTenantId(),
+                            tenantSubscribedEvent.getServiceName(),
+                            tenantSubscribedEvent.getClusterIds()));
+                }
+
+                if (isMultiTenantService(tenantSubscribedEvent.getServiceName())) {
+                    LoadBalancerContextUtil.addClustersAgainstHostNamesAndTenantIds(
+                            tenantSubscribedEvent.getServiceName(),
+                            tenantSubscribedEvent.getTenantId(),
+                            tenantSubscribedEvent.getClusterIds());
+                }
+            }
+        });
+
+        tenantEventReceiver.addEventListener(new TenantUnSubscribedEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+                TenantUnSubscribedEvent tenantUnSubscribedEvent = (TenantUnSubscribedEvent) event;
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Tenant un-subscribed event received: [tenant-id] %d [service] %s [cluster-ids] %s",
+                            tenantUnSubscribedEvent.getTenantId(),
+                            tenantUnSubscribedEvent.getServiceName(),
+                            tenantUnSubscribedEvent.getClusterIds()));
+                }
+
+                if (isMultiTenantService(tenantUnSubscribedEvent.getServiceName())) {
+                    LoadBalancerContextUtil.removeClustersAgainstHostNamesAndTenantIds(
+                            tenantUnSubscribedEvent.getServiceName(),
+                            tenantUnSubscribedEvent.getTenantId(),
+                            tenantUnSubscribedEvent.getClusterIds()
+                    );
+                }
+
+                LoadBalancerContextUtil.removeClustersAgainstAllDomains(
+                        tenantUnSubscribedEvent.getServiceName(),
+                        tenantUnSubscribedEvent.getTenantId(),
+                        tenantUnSubscribedEvent.getClusterIds());
+
+                LoadBalancerContextUtil.removeAppContextAgainstAllDomains(
+                        tenantUnSubscribedEvent.getServiceName(),
+                        tenantUnSubscribedEvent.getTenantId());
+            }
+        });
+    }
+
+    private boolean isMultiTenantService(String serviceName) {
+        try {
+            TopologyManager.acquireReadLock();
+            Service service = TopologyManager.getTopology().getService(serviceName);
+            if (service != null) {
+                return (service.getServiceType() == ServiceType.MultiTenant);
+            }
+            return false;
+        } finally {
+            TopologyManager.releaseReadLock();
+        }
+    }
+
+    public void execute() {
+        tenantEventReceiver.execute();
+
+        if (log.isInfoEnabled()) {
+            log.info("Load balancer tenant receiver thread terminated");
+        }
+    }
+
+    /**
+     * Terminate load balancer tenant receiver thread.
+     */
+    public void terminate() {
+        tenantEventReceiver.terminate();
+        terminated = true;
+    }
+}


[4/5] stratos git commit: Introducing domain mapping messaging events, listeners, processors, receiver & manager

Posted by im...@apache.org.
http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingManager.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingManager.java
new file mode 100644
index 0000000..a23bf9a
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/domain/mapping/DomainMappingManager.java
@@ -0,0 +1,180 @@
+/*
+ * 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.receiver.domain.mapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.domain.mapping.DomainMapping;
+
+import java.util.*;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * Domain mapping manager.
+ */
+public class DomainMappingManager {
+
+    private static final Log log = LogFactory.getLog(DomainMappingManager.class);
+
+    private static volatile DomainMappingManager instance;
+    private static volatile ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
+    private static volatile ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
+    private static volatile ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
+
+    private Map<String, List<DomainMapping>> clusterIdToDomainMappingsMap;
+    private boolean initialized;
+
+    public static void acquireReadLock() {
+        if(log.isDebugEnabled()) {
+            log.debug("Read lock acquired");
+        }
+        readLock.lock();
+    }
+
+    public static void releaseReadLock() {
+        if(log.isDebugEnabled()) {
+            log.debug("Read lock released");
+        }
+        readLock.unlock();
+    }
+
+    public static void acquireWriteLock() {
+        if(log.isDebugEnabled()) {
+            log.debug("Write lock acquired");
+        }
+        writeLock.lock();
+    }
+
+    public static void releaseWriteLock() {
+        if(log.isDebugEnabled()) {
+            log.debug("Write lock released");
+        }
+        writeLock.unlock();
+    }
+
+    public static DomainMappingManager getInstance() {
+        if (instance == null) {
+            synchronized (DomainMappingManager.class){
+                if (instance == null) {
+                    instance = new DomainMappingManager();
+                    if(log.isDebugEnabled()) {
+                        log.debug("Domain mapping manager instance created");
+                    }
+                }
+            }
+        }
+        return instance;
+    }
+
+    private DomainMappingManager() {
+        clusterIdToDomainMappingsMap = new HashMap<String, List<DomainMapping>>();
+    }
+
+    /**
+     * Add domain mappings
+     * @param domainMappings
+     */
+    public void addDomainMappings(List<DomainMapping> domainMappings) {
+        for(DomainMapping domainMapping : domainMappings) {
+            addDomainMapping(domainMapping);
+        }
+    }
+
+    /**
+     * Add domain mapping.
+     * @param domainMapping
+     */
+    public void addDomainMapping(DomainMapping domainMapping) {
+        List<DomainMapping> domainMappings = getDomainMappings(domainMapping.getClusterId());
+        if(domainMappings == null) {
+            domainMappings = new ArrayList<DomainMapping>();
+            clusterIdToDomainMappingsMap.put(domainMapping.getClusterId(), domainMappings);
+        }
+        domainMappings.add(domainMapping);
+    }
+
+    /**
+     * Get domain mappings of cluster.
+     * @param clusterId
+     * @return
+     */
+    public List<DomainMapping> getDomainMappings(String clusterId) {
+        if(clusterIdToDomainMappingsMap.containsKey(clusterId)) {
+            return clusterIdToDomainMappingsMap.get(clusterId);
+        }
+        return null;
+    }
+
+    /**
+     * Get domain mapping of cluster by domain name.
+     * @param clusterId
+     * @param domainName
+     * @return
+     */
+    public DomainMapping getDomainMapping(String clusterId, String domainName) {
+        List<DomainMapping> domainMappings = getDomainMappings(clusterId);
+        if(domainMappings == null) {
+            log.warn(String.format("Domain mappings not found for cluster: [cluster-id] %s", clusterId));
+            return null;
+        }
+
+        Iterator<DomainMapping> iterator = domainMappings.iterator();
+        while(iterator.hasNext()) {
+            DomainMapping domainMapping = iterator.next();
+            if(domainMapping.getDomainName().equals(domainName)) {
+                return domainMapping;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Remove domain mapping of cluster by domain name.
+     * @param clusterId
+     * @param domainName
+     */
+    public void removeDomainMapping(String clusterId, String domainName) {
+        List<DomainMapping> domainMappings = getDomainMappings(clusterId);
+        if(domainMappings == null) {
+            throw new RuntimeException(String.format("Domain mappings not found for cluster: [cluster-id] %s", clusterId));
+        }
+
+        Iterator<DomainMapping> iterator = domainMappings.iterator();
+        while(iterator.hasNext()) {
+            DomainMapping domainMapping = iterator.next();
+            if(domainMapping.getDomainName().equals(domainName)) {
+                iterator.remove();
+                if(log.isInfoEnabled()) {
+                    log.info(String.format("Domain mapping removed: [cluster-id] %s [domain-name] %s",
+                            clusterId, domainName));
+                }
+                return;
+            }
+        }
+    }
+
+    public void setInitialized(boolean initialized) {
+        this.initialized = initialized;
+    }
+
+    public boolean isInitialized() {
+        return initialized;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantEventReceiver.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantEventReceiver.java
index 460e740..f7a792c 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantEventReceiver.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantEventReceiver.java
@@ -51,7 +51,6 @@ public class TenantEventReceiver{
         try {
             // Start topic subscriber thread
             topicSubscriber = new TopicSubscriber(Util.Topics.TENANT_TOPIC.getTopicName(), messageListener);
-//            subscriber.setMessageListener(messageListener);
             Thread subscriberThread = new Thread(topicSubscriber);
             subscriberThread.start();
             if (log.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventMessageDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventMessageDelegator.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventMessageDelegator.java
index a1da2a8..cd3424c 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventMessageDelegator.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventMessageDelegator.java
@@ -33,6 +33,7 @@ import org.apache.stratos.messaging.message.processor.topology.TopologyMessagePr
 class TopologyEventMessageDelegator implements Runnable {
 
     private static final Log log = LogFactory.getLog(TopologyEventMessageDelegator.class);
+
     private MessageProcessorChain processorChain;
     private TopologyEventMessageQueue messageQueue;
     private boolean terminated;

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventReceiver.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventReceiver.java
index 1d4a9b2..a2e2050 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventReceiver.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyEventReceiver.java
@@ -32,7 +32,9 @@ import java.util.concurrent.ExecutorService;
  * build topology in topology manager.
  */
 public class TopologyEventReceiver {
+
     private static final Log log = LogFactory.getLog(TopologyEventReceiver.class);
+
     private TopologyEventMessageDelegator messageDelegator;
     private TopologyEventMessageListener messageListener;
     private TopicSubscriber topicSubscriber;

http://git-wip-us.apache.org/repos/asf/stratos/blob/1b749533/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java
index d060231..eee8152 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java
@@ -65,7 +65,8 @@ public class Util {
 		INSTANCE_NOTIFIER_TOPIC("instance/notifier/#"),
 		APPLICATIONS_TOPIC("applications/#"),
 		CLUSTER_STATUS_TOPIC("cluster/status/#"),
-		TENANT_TOPIC("tenant/#");
+		TENANT_TOPIC("tenant/#"),
+		DOMAIN_MAPPING_TOPIC("domain/mappings/#");
 
 		private String topicName;