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 2013/12/07 06:16:20 UTC

git commit: Implemented tenant event publishing functionality in stratos manager

Updated Branches:
  refs/heads/master c6829cdfb -> 4e0e95681


Implemented tenant event publishing functionality in stratos manager


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

Branch: refs/heads/master
Commit: 4e0e9568125cb3639d0fff86545541884fe66d72
Parents: c6829cd
Author: Imesh Gunaratne <im...@apache.org>
Authored: Sat Dec 7 10:45:52 2013 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Sat Dec 7 10:45:52 2013 +0530

----------------------------------------------------------------------
 components/org.apache.stratos.adc.mgt/pom.xml   |  17 ++-
 .../internal/ADCManagementServerComponent.java  |  61 ++++++++--
 .../mgt/internal/ServiceReferenceHolder.java    |  51 +++++++++
 .../adc/mgt/publisher/TenantEventPublisher.java | 114 +++++++++++++++++++
 .../TenantSynchronizerTaskScheduler.java        |  76 +++++++++++++
 .../mgt/publisher/TenantSynzhronizerTask.java   |  74 ++++++++++++
 .../common/listeners/TenantMgtListener.java     |   2 +
 .../keystore/mgt/KeystoreTenantMgtListener.java |   4 +
 .../internal/LoadBalancerServiceComponent.java  |  19 ++--
 .../event/tenant/CompleteTenantEvent.java       |  42 +++++++
 .../tenant/CompleteTenantMessageProcessor.java  |   8 +-
 .../message/receiver/tenant/TenantManager.java  |   7 ++
 .../sender/listener/EmailSenderListener.java    |  10 +-
 .../mgt/services/TenantMgtAdminService.java     |   9 ++
 .../stratos/tenant/mgt/util/TenantMgtUtil.java  |   9 +-
 .../theme/mgt/util/ThemeLoadingListener.java    |  20 ++--
 16 files changed, 481 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.adc.mgt/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/pom.xml b/components/org.apache.stratos.adc.mgt/pom.xml
index df8aa32..83fb1b9 100644
--- a/components/org.apache.stratos.adc.mgt/pom.xml
+++ b/components/org.apache.stratos.adc.mgt/pom.xml
@@ -100,12 +100,17 @@
 			<artifactId>junit</artifactId>
 			<scope>test</scope>
 		</dependency>
-	<dependency>
-		<groupId>org.apache.commons</groupId>
-		<artifactId>commons-lang3</artifactId>
-		<version>3.1</version>
-	</dependency>
-	</dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.stratos</groupId>
+            <artifactId>org.apache.stratos.common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
 
 	<build>
 		<plugins>

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ADCManagementServerComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ADCManagementServerComponent.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ADCManagementServerComponent.java
index 97b5e05..13d75fe 100644
--- a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ADCManagementServerComponent.java
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ADCManagementServerComponent.java
@@ -21,6 +21,8 @@ package org.apache.stratos.adc.mgt.internal;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.adc.mgt.listener.InstanceStatusListener;
+import org.apache.stratos.adc.mgt.publisher.TenantEventPublisher;
+import org.apache.stratos.adc.mgt.publisher.TenantSynchronizerTaskScheduler;
 import org.apache.stratos.adc.mgt.utils.CartridgeConfigFileReader;
 import org.apache.stratos.adc.mgt.utils.StratosDBUtils;
 import org.apache.stratos.adc.topology.mgt.service.TopologyManagementService;
@@ -28,13 +30,13 @@ import org.apache.stratos.messaging.broker.publish.EventPublisher;
 import org.apache.stratos.messaging.broker.subscribe.TopicSubscriber;
 import org.apache.stratos.messaging.util.Constants;
 import org.osgi.service.component.ComponentContext;
+import org.wso2.carbon.ntask.core.service.TaskService;
 import org.wso2.carbon.registry.core.service.RegistryService;
 import org.wso2.carbon.user.core.service.RealmService;
 import org.wso2.carbon.utils.ConfigurationContextService;
 
 /**
- * @scr.component name=
- *                "org.wso2.carbon.hosting.mgt.internal.ADCManagementServerComponent"
+ * @scr.component name="org.wso2.carbon.hosting.mgt.internal.ADCManagementServerComponent"
  *                immediate="true"
  * @scr.reference name="config.context.service"
  *                interface="org.wso2.carbon.utils.ConfigurationContextService"
@@ -56,29 +58,52 @@ import org.wso2.carbon.utils.ConfigurationContextService;
  *                cardinality="1..1" policy="dynamic"
  *                bind="setTopologyManagementService"
  *                unbind="unsetTopologyManagementService"
+ * @scr.reference name="ntask.component" interface="org.wso2.carbon.ntask.core.service.TaskService"
+ *                cardinality="1..1" policy="dynamic" bind="setTaskService"
+ *                unbind="unsetTaskService"
  */
 
 public class ADCManagementServerComponent {
     private static final Log log = LogFactory.getLog(ADCManagementServerComponent.class);
-    
-	protected void activate(ComponentContext componentContext) throws Exception {
-		if (log.isInfoEnabled()) {
-			log.info("ADC Management Server Component activated");
-		}
 
+    protected void activate(ComponentContext componentContext) throws Exception {
 		try {
 			CartridgeConfigFileReader.readProperties();
 			StratosDBUtils.initialize();
 			DataHolder.setEventPublisher(new EventPublisher(Constants.ARTIFACT_SYNCHRONIZATION_TOPIC));
-			
-            //initialting the subscriber
+
+            // Schedule complete tenant event synchronizer
+            if(log.isDebugEnabled()) {
+                log.debug("Scheduling tenant synchronizer task...");
+            }
+            TenantSynchronizerTaskScheduler.schedule(ServiceReferenceHolder.getInstance().getTaskService());
+
+            // Register tenant event publisher
+            if(log.isDebugEnabled()) {
+                log.debug("Starting tenant event publisher...");
+            }
+            TenantEventPublisher tenantEventPublisher = new TenantEventPublisher();
+            componentContext.getBundleContext().registerService(
+                    org.apache.stratos.common.listeners.TenantMgtListener.class.getName(),
+                    tenantEventPublisher, null);
+
+            // Start instance status topic subscriber
+            if(log.isDebugEnabled()) {
+                log.debug("Starting instance status topic subscriber...");
+            }
             TopicSubscriber subscriber = new TopicSubscriber(Constants.INSTANCE_STATUS_TOPIC);
             subscriber.setMessageListener(new InstanceStatusListener());
             Thread tsubscriber = new Thread(subscriber);
 			tsubscriber.start();
+
+            if (log.isInfoEnabled()) {
+                log.info("ADC management server component is activated");
+            }
 			
 		} catch (Exception e) {
-			log.fatal("Error while initializing the ADC Management Server Component", e);
+            if(log.isFatalEnabled()) {
+			    log.fatal("Could not activate ADC management server component", e);
+            }
 		}
 	}
 
@@ -105,7 +130,7 @@ public class ADCManagementServerComponent {
         try {
             DataHolder.setRegistry(registryService.getGovernanceSystemRegistry());
         } catch (Exception e) {
-            log.error("Cannot  retrieve governance Registry", e);
+            log.error("Cannot retrieve governance registry", e);
         }
     }
 
@@ -118,4 +143,18 @@ public class ADCManagementServerComponent {
 
     protected void unsetTopologyManagementService(TopologyManagementService topologyMgtService) {
     }
+
+    protected void setTaskService(TaskService taskService) {
+        if (log.isDebugEnabled()) {
+            log.debug("Setting the task service");
+        }
+        ServiceReferenceHolder.getInstance().setTaskService(taskService);
+    }
+
+    protected void unsetTaskService(TaskService taskService) {
+        if (log.isDebugEnabled()) {
+            log.debug("Un-setting the task service");
+        }
+        ServiceReferenceHolder.getInstance().setTaskService(null);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ServiceReferenceHolder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ServiceReferenceHolder.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ServiceReferenceHolder.java
new file mode 100644
index 0000000..bbf6999
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/internal/ServiceReferenceHolder.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.internal;
+
+import org.wso2.carbon.ntask.core.service.TaskService;
+
+/**
+ * Service reference holder.
+ */
+public class ServiceReferenceHolder {
+    private static volatile ServiceReferenceHolder instance = null;
+    private TaskService taskService;
+
+    private ServiceReferenceHolder() {       }
+
+    public static ServiceReferenceHolder getInstance() {
+        if (instance == null) {
+            synchronized (ServiceReferenceHolder .class){
+                if (instance == null) {
+                    instance = new ServiceReferenceHolder();
+                }
+            }
+        }
+        return instance;
+    }
+
+    public void setTaskService(TaskService taskService) {
+        this.taskService = taskService;
+    }
+
+    public TaskService getTaskService() {
+        return taskService;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantEventPublisher.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantEventPublisher.java
new file mode 100644
index 0000000..91c7bee
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantEventPublisher.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.publisher;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.common.beans.TenantInfoBean;
+import org.apache.stratos.common.exception.StratosException;
+import org.apache.stratos.common.listeners.TenantMgtListener;
+import org.apache.stratos.messaging.broker.publish.EventPublisher;
+import org.apache.stratos.messaging.domain.tenant.Tenant;
+import org.apache.stratos.messaging.event.tenant.TenantCreatedEvent;
+import org.apache.stratos.messaging.event.tenant.TenantRemovedEvent;
+import org.apache.stratos.messaging.event.tenant.TenantUpdatedEvent;
+import org.apache.stratos.messaging.util.Constants;
+
+/**
+ * Tenant event publisher to publish tenant events to the message broker by
+ * listening to the tenant manager.
+ */
+public class TenantEventPublisher implements TenantMgtListener {
+
+    private static final Log log = LogFactory.getLog(TenantEventPublisher.class);
+    private static final int EXEC_ORDER = 1;
+
+
+    @Override
+        public void onTenantCreate(TenantInfoBean tenantInfo) throws StratosException {
+            try {
+                if(log.isDebugEnabled()) {
+                    log.debug(String.format("Publishing tenant created event: [tenant-id] %d [tenant-domain] %s", tenantInfo.getTenantId(), tenantInfo.getTenantDomain()));
+                }
+                Tenant tenant = new Tenant(tenantInfo.getTenantId(), tenantInfo.getTenantDomain());
+                TenantCreatedEvent event = new TenantCreatedEvent(tenant);
+                EventPublisher eventPublisher = new EventPublisher(Constants.TENANT_TOPIC);
+                eventPublisher.publish(event);
+            }
+            catch (Exception e) {
+                log.error("Could not publish tenant created event", e);
+            }
+        }
+
+        @Override
+        public void onTenantUpdate(TenantInfoBean tenantInfo) throws StratosException {
+            try {
+                if(log.isInfoEnabled()) {
+                    log.info(String.format("Publishing tenant updated event: [tenant-id] %d [tenant-domain] %s", tenantInfo.getTenantId(), tenantInfo.getTenantDomain()));
+                }
+                TenantUpdatedEvent event = new TenantUpdatedEvent(tenantInfo.getTenantId(), tenantInfo.getTenantDomain());
+                EventPublisher eventPublisher = new EventPublisher(Constants.TENANT_TOPIC);
+                eventPublisher.publish(event);
+            }
+            catch (Exception e) {
+                log.error("Could not publish tenant updated event");
+            }
+        }
+
+        @Override
+        public void onTenantDelete(int tenantId) {
+            try {
+                if(log.isInfoEnabled()) {
+                    log.info(String.format("Publishing tenant removed event: [tenant-id] %d", tenantId));
+                }
+                TenantRemovedEvent event = new TenantRemovedEvent(tenantId);
+                EventPublisher eventPublisher = new EventPublisher(Constants.TENANT_TOPIC);
+                eventPublisher.publish(event);
+            }
+            catch (Exception e) {
+                log.error("Could not publish tenant removed event");
+            }
+        }
+
+        @Override
+        public void onTenantRename(int tenantId, String oldDomainName, String newDomainName) throws StratosException {
+        }
+
+        @Override
+        public void onTenantInitialActivation(int tenantId) throws StratosException {
+        }
+
+        @Override
+        public void onTenantActivation(int tenantId) throws StratosException {
+        }
+
+        @Override
+        public void onTenantDeactivation(int tenantId) throws StratosException {
+        }
+
+        @Override
+        public void onSubscriptionPlanChange(int tenantId, String oldPlan, String newPlan) throws StratosException {
+        }
+
+        @Override
+        public int getListenerOrder() {
+            return EXEC_ORDER;
+        }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantSynchronizerTaskScheduler.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantSynchronizerTaskScheduler.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantSynchronizerTaskScheduler.java
new file mode 100644
index 0000000..f8f8795
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantSynchronizerTaskScheduler.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.publisher;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.ntask.common.TaskException;
+import org.wso2.carbon.ntask.core.TaskInfo;
+import org.wso2.carbon.ntask.core.TaskManager;
+import org.wso2.carbon.ntask.core.service.TaskService;
+
+import java.util.HashMap;
+
+/**
+ * Tenant synchronizer task scheduler for scheduling the tenant synchronizer task
+ * using carbon task service.
+ */
+public class TenantSynchronizerTaskScheduler {
+
+    private static final Log log = LogFactory.getLog(TenantSynzhronizerTask.class);
+
+    private static final String TENANT_SYNC_TASK_TYPE = "TENANT_SYNC_TASK_TYPE";
+    private static final String TENANT_SYNC_TASK_NAME = "TENANT_SYNC_TASK";
+    private static final String DEFAULT_CRON = "1 * * * * ? *";
+
+    public static void schedule(TaskService taskService) {
+        TaskManager taskManager = null;
+        try {
+
+            if (!taskService.getRegisteredTaskTypes().contains(TENANT_SYNC_TASK_TYPE)) {
+                // Register task type
+                taskService.registerTaskType(TENANT_SYNC_TASK_TYPE);
+
+                // Register task
+                taskManager = taskService.getTaskManager(TENANT_SYNC_TASK_TYPE);
+                TaskInfo.TriggerInfo triggerInfo = new TaskInfo.TriggerInfo(DEFAULT_CRON);
+                TaskInfo taskInfo = new TaskInfo(TENANT_SYNC_TASK_NAME,
+                        TenantSynzhronizerTask.class.getName(),
+                        new HashMap<String, String>(), triggerInfo);
+                taskManager.registerTask(taskInfo);
+                if(log.isDebugEnabled()) {
+                    log.debug(String.format("Tenant synchronization task scheduled: %s", TENANT_SYNC_TASK_NAME));
+                }
+            }
+
+        } catch (Exception e) {
+            if (taskManager != null) {
+                try {
+                    taskManager.deleteTask(TENANT_SYNC_TASK_NAME);
+                } catch (TaskException te) {
+                    if (log.isErrorEnabled()) {
+                        log.error(te);
+                    }
+                }
+            }
+            throw new RuntimeException(String.format("Could not schedule tenant synchronization task: %s", TENANT_SYNC_TASK_NAME), e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantSynzhronizerTask.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantSynzhronizerTask.java b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantSynzhronizerTask.java
new file mode 100644
index 0000000..62c5103
--- /dev/null
+++ b/components/org.apache.stratos.adc.mgt/src/main/java/org/apache/stratos/adc/mgt/publisher/TenantSynzhronizerTask.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.adc.mgt.publisher;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.adc.mgt.internal.DataHolder;
+import org.apache.stratos.messaging.broker.publish.EventPublisher;
+import org.apache.stratos.messaging.domain.tenant.Tenant;
+import org.apache.stratos.messaging.event.tenant.CompleteTenantEvent;
+import org.apache.stratos.messaging.util.Constants;
+import org.wso2.carbon.ntask.core.Task;
+import org.wso2.carbon.user.core.tenant.TenantManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Tenant synchronizer task for publishing complete tenant event periodically
+ * to message broker.
+ */
+public class TenantSynzhronizerTask implements Task {
+
+    private static final Log log = LogFactory.getLog(TenantSynzhronizerTask.class);
+
+    @Override
+    public void init() {
+    }
+
+    @Override
+    public void execute() {
+        try {
+            if(log.isInfoEnabled()) {
+                log.info(String.format("Publishing complete tenant event"));
+            }
+            List<Tenant> tenants = new ArrayList<Tenant>();
+            TenantManager tenantManager = DataHolder.getRealmService().getTenantManager();
+            org.wso2.carbon.user.api.Tenant[] carbonTenants = tenantManager.getAllTenants();
+            for(org.wso2.carbon.user.api.Tenant carbonTenant : carbonTenants) {
+                tenants.add(new Tenant(carbonTenant.getId(), carbonTenant.getDomain()));
+            }
+            CompleteTenantEvent event = new CompleteTenantEvent(tenants);
+            EventPublisher eventPublisher = new EventPublisher(Constants.TENANT_TOPIC);
+            eventPublisher.publish(event);
+        }
+        catch (Exception e) {
+            if (log.isErrorEnabled()) {
+                log.error("Could not publish complete tenant event", e);
+            }
+        }
+    }
+
+    @Override
+    public void setProperties(Map<String, String> stringStringMap) {
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/listeners/TenantMgtListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/listeners/TenantMgtListener.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/listeners/TenantMgtListener.java
index 4a9a316..7e60ffc 100644
--- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/listeners/TenantMgtListener.java
+++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/listeners/TenantMgtListener.java
@@ -27,6 +27,8 @@ public interface TenantMgtListener {
 
     public void onTenantUpdate(TenantInfoBean tenantInfo) throws StratosException;
 
+    public void onTenantDelete(int tenantId);
+
     public void onTenantRename(int tenantId, String oldDomainName, 
                              String newDomainName)throws StratosException;
     

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.keystore.mgt/src/main/java/org/apache/stratos/keystore/mgt/KeystoreTenantMgtListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.keystore.mgt/src/main/java/org/apache/stratos/keystore/mgt/KeystoreTenantMgtListener.java b/components/org.apache.stratos.keystore.mgt/src/main/java/org/apache/stratos/keystore/mgt/KeystoreTenantMgtListener.java
index 38830fa..be91f38 100644
--- a/components/org.apache.stratos.keystore.mgt/src/main/java/org/apache/stratos/keystore/mgt/KeystoreTenantMgtListener.java
+++ b/components/org.apache.stratos.keystore.mgt/src/main/java/org/apache/stratos/keystore/mgt/KeystoreTenantMgtListener.java
@@ -52,6 +52,10 @@ public class KeystoreTenantMgtListener implements TenantMgtListener {
         // It is not required to implement this method for keystore mgt. 
     }
 
+    public void onTenantDelete(int tenantId) {
+        // It is not required to implement this method for keystore mgt.
+    }
+
     public void onTenantRename(int tenantId, String oldDomainName,
                              String newDomainName) throws StratosException {
         // It is not required to implement this method for keystore mgt.

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/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 a3e46e9..15f9600 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
@@ -108,6 +108,7 @@ public class LoadBalancerServiceComponent {
             // Configure synapse settings
             LoadBalancerConfiguration configuration = LoadBalancerConfiguration.getInstance();
             SynapseConfigurator.configure(configuration);
+
             // Configure cep settings
             CEPConfigurator.configure(configuration);
 
@@ -148,11 +149,13 @@ public class LoadBalancerServiceComponent {
             }
 
             activated = true;
-            if (log.isDebugEnabled()) {
-                log.debug("LoadBalancerServiceComponent is activated ");
+            if (log.isInfoEnabled()) {
+                log.info("Load balancer service component is activated ");
+            }
+        } catch (Exception e) {
+            if(log.isFatalEnabled()) {
+                log.fatal("Failed to activate load balancer service component", e);
             }
-        } catch (Throwable e) {
-            log.error("Failed to activate LoadBalancerServiceComponent", e);
         }
     }
 
@@ -166,7 +169,7 @@ public class LoadBalancerServiceComponent {
                         .getSynapseEnvironment());
             }
         } catch (Exception e) {
-            log.warn("Couldn't remove the EndpointDeployer");
+            log.warn("Couldn't remove the endpoint deployer");
         }
         // Terminate topology receiver
         topologyReceiver.terminate();
@@ -268,10 +271,10 @@ public class LoadBalancerServiceComponent {
                             .getConfigurationContext().getAxisConfiguration(),
                             synapseEnvironmentService.getSynapseEnvironment());
                     if (log.isDebugEnabled()) {
-                        log.debug("Endpoint Admin bundle is activated ");
+                        log.debug("Endpoint admin bundle is activated ");
                     }
                 } catch (Throwable e) {
-                    log.error("Failed to activate Endpoint Admin bundle ", e);
+                    log.error("Failed to activate endpoint admin bundle ", e);
                 }
             }
         }
@@ -349,7 +352,7 @@ public class LoadBalancerServiceComponent {
                 try {
                     unregisterDeployer(axisConfig, env);
                 } catch (Exception e) {
-                    log.warn("Couldn't remove the EndpointDeployer");
+                    log.warn("Couldn't remove the endpoint deployer");
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/CompleteTenantEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/CompleteTenantEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/CompleteTenantEvent.java
new file mode 100644
index 0000000..7e665b4
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/tenant/CompleteTenantEvent.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.messaging.event.tenant;
+
+import org.apache.stratos.messaging.domain.tenant.Tenant;
+
+import java.util.List;
+
+/**
+ *  This event is fired periodically with all the available tenants. It would be a
+ *  starting point for subscribers to initialize the list of tenants before receiving
+ *  other tenant events.
+ */
+public class CompleteTenantEvent {
+
+    private List<Tenant> tenants;
+
+    public CompleteTenantEvent(List<Tenant> tenants) {
+        this.tenants = tenants;
+    }
+
+    public List<Tenant> getTenants() {
+        return tenants;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/CompleteTenantMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/CompleteTenantMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/CompleteTenantMessageProcessor.java
index caf72f4..5090853 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/CompleteTenantMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/tenant/CompleteTenantMessageProcessor.java
@@ -21,7 +21,7 @@ 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.event.tenant.TenantCreatedEvent;
+import org.apache.stratos.messaging.event.tenant.CompleteTenantEvent;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
 import org.apache.stratos.messaging.message.receiver.tenant.TenantManager;
 import org.apache.stratos.messaging.util.Util;
@@ -44,18 +44,18 @@ public class CompleteTenantMessageProcessor extends MessageProcessor {
 
     @Override
     public boolean process(String type, String message, Object object) {
-        if (TenantCreatedEvent.class.getName().equals(type)) {
+        if (CompleteTenantEvent.class.getName().equals(type)) {
             // Return if tenant manager has already initialized
             if(TenantManager.getInstance().isInitialized()) {
                 return false;
             }
 
             // Parse complete message and build event
-            TenantCreatedEvent event = (TenantCreatedEvent) Util.jsonToObject(message, TenantCreatedEvent.class);
+            CompleteTenantEvent event = (CompleteTenantEvent) Util.jsonToObject(message, CompleteTenantEvent.class);
 
             try {
                 TenantManager.acquireWriteLock();
-                TenantManager.getInstance().addTenant(event.getTenant());
+                TenantManager.getInstance().addTenants(event.getTenants());
                 if(log.isInfoEnabled()) {
                     log.info("Tenant initialized");
                 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantManager.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantManager.java
index 230d0b3..c15b73c 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantManager.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/tenant/TenantManager.java
@@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.messaging.domain.tenant.Tenant;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
@@ -98,6 +99,12 @@ public class TenantManager {
         this.tenantDomainTenantMap.put(tenant.getTenantDomain(), tenant);
     }
 
+    public void addTenants(List<Tenant> tenants) {
+        for(Tenant tenant : tenants) {
+            addTenant(tenant);
+        }
+    }
+
     public Tenant getTenant(int tenantId) {
         return this.tenantIdTenantMap.get(tenantId);
     }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.tenant.mgt.email.sender/src/main/java/org/apache/stratos/tenant/mgt/email/sender/listener/EmailSenderListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.tenant.mgt.email.sender/src/main/java/org/apache/stratos/tenant/mgt/email/sender/listener/EmailSenderListener.java b/components/org.apache.stratos.tenant.mgt.email.sender/src/main/java/org/apache/stratos/tenant/mgt/email/sender/listener/EmailSenderListener.java
index 58688c3..6025202 100644
--- a/components/org.apache.stratos.tenant.mgt.email.sender/src/main/java/org/apache/stratos/tenant/mgt/email/sender/listener/EmailSenderListener.java
+++ b/components/org.apache.stratos.tenant.mgt.email.sender/src/main/java/org/apache/stratos/tenant/mgt/email/sender/listener/EmailSenderListener.java
@@ -67,22 +67,26 @@ public class EmailSenderListener implements TenantMgtListener {
         }
     }
 
+    public void onTenantDelete(int tenantId) {
+        // Do nothing
+    }
+
     public void onTenantInitialActivation(int tenantId) throws StratosException {
      // send the notification message to the tenant admin
         TenantMgtEmailSenderUtil.notifyTenantInitialActivation(tenantId);
     }
 
     public void onTenantActivation(int tenantId) throws StratosException {
-        // Do nothing. 
+        // Do nothing
     }
 
     public void onTenantDeactivation(int tenantId) throws StratosException {
-        // Do nothing. 
+        // Do nothing
     }
 
     public void onSubscriptionPlanChange(int tenentId, String oldPlan, 
                                          String newPlan) throws StratosException {
-        // Do nothing. 
+        // Do nothing
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/services/TenantMgtAdminService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/services/TenantMgtAdminService.java b/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/services/TenantMgtAdminService.java
index 487959a..4f159f5 100644
--- a/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/services/TenantMgtAdminService.java
+++ b/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/services/TenantMgtAdminService.java
@@ -495,5 +495,14 @@ public class TenantMgtAdminService extends AbstractAdmin {
             log.error(msg, e);
             throw new Exception(msg, e);
         }
+
+        //Notify tenant delete to all listeners
+        try {
+            TenantMgtUtil.triggerDeleteTenant(tenantId);
+        } catch (StratosException e) {
+            String msg = "Error in notifying tenant delete";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/util/TenantMgtUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/util/TenantMgtUtil.java b/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/util/TenantMgtUtil.java
index bd7d685..ec3edd0 100644
--- a/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/util/TenantMgtUtil.java
+++ b/components/org.apache.stratos.tenant.mgt/src/main/java/org/apache/stratos/tenant/mgt/util/TenantMgtUtil.java
@@ -102,7 +102,7 @@ public class TenantMgtUtil {
      * Triggers an update for the tenant for TenantMgtListener
      *
      * @param tenantInfoBean tenantInfoBean
-     * @throws org.wso2.carbon.stratos.common.exception.StratosException, if update failed
+     * @throws org.apache.stratos.common.exception.StratosException, if update failed
      */
     public static void triggerUpdateTenant(
             TenantInfoBean tenantInfoBean) throws StratosException {
@@ -111,6 +111,13 @@ public class TenantMgtUtil {
             tenantMgtListener.onTenantUpdate(tenantInfoBean);
         }
     }
+
+    public static void triggerDeleteTenant(int tenantId) throws StratosException {
+        for (TenantMgtListener tenantMgtListener :
+                TenantMgtServiceComponent.getTenantMgtListeners()) {
+            tenantMgtListener.onTenantDelete(tenantId);
+        }
+    }
     
     public static void triggerTenantInitialActivation(
                                   TenantInfoBean tenantInfoBean) throws StratosException {

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4e0e9568/components/org.apache.stratos.theme.mgt/src/main/java/org/apache/stratos/theme/mgt/util/ThemeLoadingListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.theme.mgt/src/main/java/org/apache/stratos/theme/mgt/util/ThemeLoadingListener.java b/components/org.apache.stratos.theme.mgt/src/main/java/org/apache/stratos/theme/mgt/util/ThemeLoadingListener.java
index c3bcd2f..6013a55 100644
--- a/components/org.apache.stratos.theme.mgt/src/main/java/org/apache/stratos/theme/mgt/util/ThemeLoadingListener.java
+++ b/components/org.apache.stratos.theme.mgt/src/main/java/org/apache/stratos/theme/mgt/util/ThemeLoadingListener.java
@@ -42,12 +42,16 @@ public class ThemeLoadingListener implements TenantMgtListener {
     }
     
     public void onTenantUpdate(TenantInfoBean tenantInfo) throws StratosException {
-        // doing nothing
+        // do nothing
     }
-    
+
+    public void onTenantDelete(int tenantId) {
+        // do nothing
+    }
+
     public void onTenantRename(int tenantId, String oldDomainName,
                              String newDomainName) throws StratosException {
-        // doing nothing
+        // do nothing
     }
 
     public int getListenerOrder() {
@@ -55,23 +59,21 @@ public class ThemeLoadingListener implements TenantMgtListener {
     }
 
     public void onTenantInitialActivation(int tenantId) throws StratosException {
-        // doing nothing
-        
+        // do nothing
     }
 
     public void onTenantActivation(int tenantId) throws StratosException {
-        // doing nothing
+        // do nothing
         
     }
 
     public void onTenantDeactivation(int tenantId) throws StratosException {
-        // doing nothing
+        // do nothing
         
     }
 
     public void onSubscriptionPlanChange(int tenentId, String oldPlan, 
                                          String newPlan) throws StratosException {
-        // doing nothing
-        
+        // do nothing
     }
 }