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/04/22 10:31:48 UTC

[2/2] stratos git commit: Moving non-API methods to StratosApiV41Utils class from StratosApiV41 class

Moving non-API methods to StratosApiV41Utils class from StratosApiV41 class


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

Branch: refs/heads/master
Commit: 972fa25f7e64759ce19aabff8eba4fc88e03badc
Parents: dda2bbe
Author: anuruddhal <an...@gmail.com>
Authored: Wed Apr 22 11:50:50 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Wed Apr 22 14:01:43 2015 +0530

----------------------------------------------------------------------
 .../rest/endpoint/api/StratosApiV41.java        | 436 +--------------
 .../rest/endpoint/api/StratosApiV41Utils.java   | 528 ++++++++++++++++++-
 2 files changed, 537 insertions(+), 427 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/972fa25f/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 4df702f..1d50a23 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
@@ -38,31 +38,12 @@ import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean;
 import org.apache.stratos.common.beans.policy.deployment.DeploymentPolicyBean;
 import org.apache.stratos.common.beans.topology.ApplicationInfoBean;
 import org.apache.stratos.common.beans.topology.ClusterBean;
-import org.apache.stratos.common.util.ClaimsMgtUtil;
-import org.apache.stratos.common.util.CommonUtil;
-import org.apache.stratos.manager.user.management.StratosUserManager;
-import org.apache.stratos.manager.user.management.exception.UserManagerException;
-import org.apache.stratos.rest.endpoint.ServiceHolder;
 import org.apache.stratos.rest.endpoint.Utils;
 import org.apache.stratos.rest.endpoint.annotation.AuthorizationAction;
 import org.apache.stratos.rest.endpoint.annotation.SuperTenantService;
 import org.apache.stratos.rest.endpoint.exception.RestAPIException;
 import org.apache.stratos.rest.endpoint.exception.TenantNotFoundException;
-import org.apache.stratos.rest.endpoint.util.converter.ObjectConverter;
-import org.wso2.carbon.context.CarbonContext;
 import org.wso2.carbon.context.PrivilegedCarbonContext;
-import org.wso2.carbon.context.RegistryType;
-import org.wso2.carbon.registry.core.exceptions.RegistryException;
-import org.wso2.carbon.registry.core.session.UserRegistry;
-import org.wso2.carbon.stratos.common.exception.StratosException;
-import org.wso2.carbon.tenant.mgt.core.TenantPersistor;
-import org.wso2.carbon.tenant.mgt.util.TenantMgtUtil;
-import org.wso2.carbon.user.api.UserRealm;
-import org.wso2.carbon.user.api.UserStoreException;
-import org.wso2.carbon.user.api.UserStoreManager;
-import org.wso2.carbon.user.core.tenant.Tenant;
-import org.wso2.carbon.user.core.tenant.TenantManager;
-import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
@@ -1259,91 +1240,12 @@ public class StratosApiV41 extends AbstractApi {
     @SuperTenantService(true)
     public Response addTenant(
             org.apache.stratos.common.beans.TenantInfoBean tenantInfoBean) throws RestAPIException {
-        try {
-            CommonUtil.validateEmail(tenantInfoBean.getEmail());
-        } catch (Exception e) {
-            String msg = "Invalid email is provided";
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
-
-        String tenantDomain = tenantInfoBean.getTenantDomain();
-        try {
-            TenantMgtUtil.validateDomain(tenantDomain);
-        } catch (Exception e) {
-            String msg = "Tenant domain validation error for tenant " + tenantDomain;
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
-
-        UserRegistry userRegistry = (UserRegistry) PrivilegedCarbonContext.getThreadLocalCarbonContext().
-                getRegistry(RegistryType.USER_GOVERNANCE);
-        if (userRegistry == null) {
-            log.error("Security alert! User registry is null. A user is trying create a tenant "
-                    + " without an authenticated session.");
-            throw new RestAPIException("Security alert! User registry is null. A user is trying create a tenant "
-                    + " without an authenticated session.");
-        }
-
-        if (userRegistry.getTenantId() != MultitenantConstants.SUPER_TENANT_ID) {
-            log.error("Security alert! None super tenant trying to create a tenant.");
-            throw new RestAPIException("Security alert! None super tenant trying to create a tenant.");
-        }
-
-        Tenant tenant = TenantMgtUtil
-                .initializeTenant(ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean));
-        TenantPersistor persistor = ServiceHolder.getTenantPersistor();
-        // not validating the domain ownership, since created by super tenant
-        int tenantId; //TODO verify whether this is the correct approach (isSkeleton)
-        try {
-            tenantId = persistor
-                    .persistTenant(tenant, false, tenantInfoBean.getSuccessKey(), tenantInfoBean.getOriginatedService(),
-                            false);
-        } catch (Exception e) {
-            String msg = "Could not add tenant: " + e.getMessage();
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
-        tenantInfoBean.setTenantId(tenantId);
-
-        try {
-            TenantMgtUtil.addClaimsToUserStoreManager(tenant);
-        } catch (Exception e) {
-            String msg = "Error in granting permissions for tenant " + tenantDomain;
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
-
-        //Notify tenant addition
-        try {
-            TenantMgtUtil.triggerAddTenant(ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean));
-        } catch (StratosException e) {
-            String msg = "Error in notifying tenant addition.";
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
-        // For the super tenant tenant creation, tenants are always activated as they are created.
-        try {
-            TenantMgtUtil.activateTenantInitially(
-                    ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean), tenantId);
-        } catch (Exception e) {
-            String msg = "Error in initial activation of tenant " + tenantDomain;
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
-
-        try {
-            TenantMgtUtil.prepareStringToShowThemeMgtPage(tenant.getId());
-        } catch (RegistryException e) {
-            String msg = "Error in preparing theme mgt page for tenant " + tenantDomain;
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
 
-        URI url = uriInfo.getAbsolutePathBuilder().path(tenant.getDomain()).build();
+        StratosApiV41Utils.addTenant(tenantInfoBean);
+        URI url = uriInfo.getAbsolutePathBuilder().path(tenantInfoBean.getTenantDomain()).build();
         return Response.created(url).entity(
                 new SuccessResponseBean(Response.Status.CREATED.getStatusCode(),
-                        String.format("Tenant added successfully: [tenant] %s", tenantDomain))).build();
+                        String.format("Tenant added successfully: [tenant] %s", tenantInfoBean.getTenantDomain()))).build();
     }
 
     /**
@@ -1362,7 +1264,7 @@ public class StratosApiV41 extends AbstractApi {
             org.apache.stratos.common.beans.TenantInfoBean tenantInfoBean) throws RestAPIException {
 
         try {
-            updateExistingTenant(tenantInfoBean);
+            StratosApiV41Utils.updateExistingTenant(tenantInfoBean);
         } catch (TenantNotFoundException ex) {
             Response.status(Response.Status.NOT_FOUND).build();
         } catch (Exception e) {
@@ -1376,122 +1278,7 @@ public class StratosApiV41 extends AbstractApi {
                 .build();
     }
 
-    private void updateExistingTenant(org.apache.stratos.common.beans.TenantInfoBean tenantInfoBean) throws Exception {
 
-        TenantManager tenantManager = ServiceHolder.getTenantManager();
-        UserStoreManager userStoreManager;
-
-        // filling the non-set admin and admin password first
-        UserRegistry configSystemRegistry = ServiceHolder.getRegistryService()
-                .getConfigSystemRegistry(tenantInfoBean.getTenantId());
-
-        String tenantDomain = tenantInfoBean.getTenantDomain();
-
-        int tenantId;
-        try {
-            tenantId = tenantManager.getTenantId(tenantDomain);
-        } catch (UserStoreException e) {
-            String msg = "Error in retrieving the tenant id for the tenant domain: " + tenantDomain + ".";
-            log.error(msg, e);
-            throw new Exception(msg, e);
-        }
-
-        Tenant tenant;
-        try {
-            tenant = (Tenant) tenantManager.getTenant(tenantId);
-        } catch (UserStoreException e) {
-            String msg = "Error in retrieving the tenant id for the tenant domain: " +
-                    tenantDomain + ".";
-            log.error(msg, e);
-            throw new TenantNotFoundException(msg, e);
-        }
-
-        // filling the first and last name values
-        if (tenantInfoBean.getFirstname() != null && !tenantInfoBean.getFirstname().trim().equals("")) {
-            try {
-                CommonUtil.validateName(tenantInfoBean.getFirstname(), "First Name");
-            } catch (Exception e) {
-                String msg = "Invalid first name is provided.";
-                log.error(msg, e);
-                throw new Exception(msg, e);
-            }
-        }
-        if (tenantInfoBean.getLastname() != null && !tenantInfoBean.getLastname().trim().equals("")) {
-            try {
-                CommonUtil.validateName(tenantInfoBean.getLastname(), "Last Name");
-            } catch (Exception e) {
-                String msg = "Invalid last name is provided.";
-                log.error(msg, e);
-                throw new Exception(msg, e);
-            }
-        }
-
-        tenant.setAdminFirstName(tenantInfoBean.getFirstname());
-        tenant.setAdminLastName(tenantInfoBean.getLastname());
-        TenantMgtUtil.addClaimsToUserStoreManager(tenant);
-
-        // filling the email value
-        if (tenantInfoBean.getEmail() != null && !tenantInfoBean.getEmail().equals("")) {
-            // validate the email
-            try {
-                CommonUtil.validateEmail(tenantInfoBean.getEmail());
-            } catch (Exception e) {
-                String msg = "Invalid email is provided.";
-                log.error(msg, e);
-                throw new Exception(msg, e);
-            }
-            tenant.setEmail(tenantInfoBean.getEmail());
-        }
-
-        UserRealm userRealm = configSystemRegistry.getUserRealm();
-        try {
-            userStoreManager = userRealm.getUserStoreManager();
-        } catch (UserStoreException e) {
-            String msg = "Error in getting the user store manager for tenant, tenant domain: " +
-                    tenantDomain + ".";
-            log.error(msg, e);
-            throw new Exception(msg, e);
-        }
-
-        boolean updatePassword = false;
-        if (tenantInfoBean.getAdminPassword() != null && !tenantInfoBean.getAdminPassword().equals("")) {
-            updatePassword = true;
-        }
-        if (!userStoreManager.isReadOnly() && updatePassword) {
-            // now we will update the tenant admin with the admin given
-            // password.
-            try {
-                userStoreManager.updateCredentialByAdmin(tenantInfoBean.getAdmin(), tenantInfoBean.getAdminPassword());
-            } catch (UserStoreException e) {
-                String msg = "Error in changing the tenant admin password, tenant domain: " +
-                        tenantInfoBean.getTenantDomain() + ". " + e.getMessage() + " for: " +
-                        tenantInfoBean.getAdmin();
-                log.error(msg, e);
-                throw new Exception(msg, e);
-            }
-        } else {
-            //Password should be empty since no password update done
-            tenantInfoBean.setAdminPassword("");
-        }
-
-        try {
-            tenantManager.updateTenant(tenant);
-        } catch (UserStoreException e) {
-            String msg = "Error in updating the tenant for tenant domain: " + tenantDomain + ".";
-            log.error(msg, e);
-            throw new Exception(msg, e);
-        }
-
-        //Notify tenant update to all listeners
-        try {
-            TenantMgtUtil
-                    .triggerUpdateTenant(ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean));
-        } catch (StratosException e) {
-            String msg = "Error in notifying tenant update.";
-            log.error(msg, e);
-            throw new Exception(msg, e);
-        }
-    }
 
     /**
      * Gets the tenant by domain.
@@ -1510,7 +1297,7 @@ public class StratosApiV41 extends AbstractApi {
             @PathParam("tenantDomain") String tenantDomain) throws RestAPIException {
 
         try {
-            TenantInfoBean tenantInfo = getTenantByDomain(tenantDomain);
+            TenantInfoBean tenantInfo = StratosApiV41Utils.getTenantByDomain(tenantDomain);
             if (tenantInfo == null){
                 return Response.status(Response.Status.NOT_FOUND).build();
             }
@@ -1521,53 +1308,6 @@ public class StratosApiV41 extends AbstractApi {
         }
     }
 
-    private org.apache.stratos.common.beans.TenantInfoBean getTenantByDomain(String tenantDomain) throws Exception {
-
-        TenantManager tenantManager = ServiceHolder.getTenantManager();
-
-        int tenantId;
-        try {
-            tenantId = tenantManager.getTenantId(tenantDomain);
-        } catch (UserStoreException e) {
-            String msg = "Error in retrieving the tenant id for the tenant domain: " +
-                    tenantDomain + ".";
-            log.error(msg);
-            throw new Exception(msg, e);
-        }
-        Tenant tenant;
-        try {
-            tenant = (Tenant) tenantManager.getTenant(tenantId);
-        } catch (UserStoreException e) {
-            String msg = "Error in retrieving the tenant from the tenant manager.";
-            log.error(msg);
-            throw new Exception(msg, e);
-        }
-
-        TenantInfoBean bean;
-        try {
-            bean = ObjectConverter
-                    .convertCarbonTenantInfoBeanToTenantInfoBean(TenantMgtUtil.initializeTenantInfoBean(tenantId, tenant));
-        } catch (NullPointerException e) {
-            log.error(String.format("Couldn't find tenant for provided tenant domain. [Tenant Domain] %s", tenantDomain));
-            return null;
-        }
-
-        // retrieve first and last names from the UserStoreManager
-        bean.setFirstname(ClaimsMgtUtil.getFirstNamefromUserStoreManager(ServiceHolder.getRealmService(), tenantId));
-        bean.setLastname(ClaimsMgtUtil.getLastNamefromUserStoreManager(ServiceHolder.getRealmService(), tenantId));
-
-        //getting the subscription plan
-        String activePlan = "";
-        //TODO: usage plan using billing service
-
-        if (activePlan != null && activePlan.trim().length() > 0) {
-            bean.setUsagePlan(activePlan);
-        } else {
-            bean.setUsagePlan("");
-        }
-
-        return bean;
-    }
 
     /**
      * Delete tenant.
@@ -1605,7 +1345,7 @@ public class StratosApiV41 extends AbstractApi {
     public Response getTenants()
             throws RestAPIException {
         try {
-            List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = getAllTenants();
+            List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = StratosApiV41Utils.getAllTenants();
             if (tenantList == null || tenantList.isEmpty()){
                 return Response.status(Response.Status.NOT_FOUND).build();
             }
@@ -1619,26 +1359,6 @@ public class StratosApiV41 extends AbstractApi {
         }
     }
 
-    private List<org.apache.stratos.common.beans.TenantInfoBean> getAllTenants() throws RestAPIException {
-        TenantManager tenantManager = ServiceHolder.getTenantManager();
-        Tenant[] tenants;
-        try {
-            tenants = (Tenant[]) tenantManager.getAllTenants();
-        } catch (Exception e) {
-            String msg = "Error in retrieving the tenant information";
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
-
-        List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = new ArrayList<org.apache.stratos.common.beans.TenantInfoBean>();
-        for (Tenant tenant : tenants) {
-            org.apache.stratos.common.beans.TenantInfoBean bean = ObjectConverter
-                    .convertCarbonTenantInfoBeanToTenantInfoBean(
-                            TenantMgtUtil.getTenantInfoBeanfromTenant(tenant.getId(), tenant));
-            tenantList.add(bean);
-        }
-        return tenantList;
-    }
 
     /**
      * Gets the partial search tenants.
@@ -1657,7 +1377,7 @@ public class StratosApiV41 extends AbstractApi {
             @PathParam("tenantDomain") String tenantDomain) throws RestAPIException {
 
         try {
-            List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = searchPartialTenantsDomains(tenantDomain);
+            List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = StratosApiV41Utils.searchPartialTenantsDomains(tenantDomain);
             if (tenantList == null || tenantList.isEmpty()){
                 return Response.status(Response.Status.NOT_FOUND).build();
             }
@@ -1670,28 +1390,7 @@ public class StratosApiV41 extends AbstractApi {
         }
     }
 
-    private List<org.apache.stratos.common.beans.TenantInfoBean> searchPartialTenantsDomains(String domain)
-            throws RestAPIException {
-        TenantManager tenantManager = ServiceHolder.getTenantManager();
-        Tenant[] tenants;
-        try {
-            domain = domain.trim();
-            tenants = (Tenant[]) tenantManager.getAllTenantsForTenantDomainStr(domain);
-        } catch (Exception e) {
-            String msg = "Error in retrieving the tenant information.";
-            log.error(msg, e);
-            throw new RestAPIException(msg);
-        }
 
-        List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = new ArrayList<org.apache.stratos.common.beans.TenantInfoBean>();
-        for (Tenant tenant : tenants) {
-            org.apache.stratos.common.beans.TenantInfoBean bean = ObjectConverter
-                    .convertCarbonTenantInfoBeanToTenantInfoBean(
-                            TenantMgtUtil.getTenantInfoBeanfromTenant(tenant.getId(), tenant));
-            tenantList.add(bean);
-        }
-        return tenantList;
-    }
 
     /**
      * Activate tenant.
@@ -1708,33 +1407,8 @@ public class StratosApiV41 extends AbstractApi {
     @SuperTenantService(true)
     public Response activateTenant(
             @PathParam("tenantDomain") String tenantDomain) throws RestAPIException {
-        TenantManager tenantManager = ServiceHolder.getTenantManager();
-        int tenantId;
-        try {
-            tenantId = tenantManager.getTenantId(tenantDomain);
-
-        } catch (UserStoreException e) {
-            String msg = "Error in retrieving the tenant id for the tenant domain: " + tenantDomain + ".";
-            log.error(msg, e);
-            throw new RestAPIException(msg, e);
-        }
-
-        try {
-            TenantMgtUtil.activateTenant(tenantDomain, tenantManager, tenantId);
-
-        } catch (Exception e) {
-            throw new RestAPIException(e);
-        }
-
-        //Notify tenant activation all listeners
-        try {
-            TenantMgtUtil.triggerTenantActivation(tenantId);
-        } catch (StratosException e) {
-            String msg = "Error in notifying tenant activate.";
-            log.error(msg, e);
-            throw new RestAPIException(msg, e);
-        }
 
+        StratosApiV41Utils.activateTenant(tenantDomain);
         return Response.ok().entity(new SuccessResponseBean(Response.Status.OK.getStatusCode(),
                 String.format("Tenant activated successfully: [tenant] %s", tenantDomain))).build();
     }
@@ -1755,34 +1429,7 @@ public class StratosApiV41 extends AbstractApi {
     public Response deactivateTenant(
             @PathParam("tenantDomain") String tenantDomain) throws RestAPIException {
 
-        TenantManager tenantManager = ServiceHolder.getTenantManager();
-        int tenantId;
-        try {
-            tenantId = tenantManager.getTenantId(tenantDomain);
-
-        } catch (UserStoreException e) {
-            String msg = "Error in retrieving the tenant id for the tenant domain: " +
-                    tenantDomain + ".";
-            log.error(msg, e);
-            throw new RestAPIException(msg, e);
-
-        }
-
-        try {
-            TenantMgtUtil.deactivateTenant(tenantDomain, tenantManager, tenantId);
-        } catch (Exception e) {
-            throw new RestAPIException(e);
-        }
-
-        //Notify tenant deactivation all listeners
-        try {
-            TenantMgtUtil.triggerTenantDeactivation(tenantId);
-        } catch (StratosException e) {
-            String msg = "Error in notifying tenant deactivate.";
-            log.error(msg, e);
-            throw new RestAPIException(msg, e);
-        }
-
+        StratosApiV41Utils.deactivateTenant(tenantDomain);
         return Response.ok().entity(new SuccessResponseBean(Response.Status.OK.getStatusCode(),
                 String.format("Tenant deactivated successfully: [tenant] %s", tenantDomain))).build();
     }
@@ -1827,14 +1474,7 @@ public class StratosApiV41 extends AbstractApi {
     public Response addUser(
             UserInfoBean userInfoBean) throws RestAPIException {
 
-        StratosUserManager stratosUserManager = new StratosUserManager();
-
-        try {
-            stratosUserManager.addUser(getTenantUserStoreManager(), userInfoBean);
-
-        } catch (UserManagerException e) {
-            throw new RestAPIException(e.getMessage());
-        }
+        StratosApiV41Utils.addUser(userInfoBean);
         log.info("Successfully added an user with Username " + userInfoBean.getUserName());
         URI url = uriInfo.getAbsolutePathBuilder().path(userInfoBean.getUserName()).build();
         return Response.created(url).entity(new SuccessResponseBean(Response.Status.CREATED.getStatusCode(),
@@ -1856,13 +1496,7 @@ public class StratosApiV41 extends AbstractApi {
     public Response removeUser(
             @PathParam("userName") String userName) throws RestAPIException {
 
-        StratosUserManager stratosUserManager = new StratosUserManager();
-
-        try {
-            stratosUserManager.removeUser(getTenantUserStoreManager(), userName);
-        } catch (UserManagerException e) {
-            throw new RestAPIException(e.getMessage());
-        }
+        StratosApiV41Utils.removeUser(userName);
         log.info("Successfully removed user: [username] " + userName);
         return Response.ok().entity(new SuccessResponseBean(Response.Status.OK.getStatusCode(),
                 String.format("User deleted successfully: [user] %s", userName))).build();
@@ -1883,15 +1517,7 @@ public class StratosApiV41 extends AbstractApi {
     public Response updateUser(
             UserInfoBean userInfoBean) throws RestAPIException {
 
-        StratosUserManager stratosUserManager = new StratosUserManager();
-
-        try {
-            stratosUserManager.updateUser(getTenantUserStoreManager(), userInfoBean);
-
-        } catch (UserManagerException e) {
-            throw new RestAPIException(e.getMessage());
-        }
-
+        StratosApiV41Utils.updateUser(userInfoBean);
         log.info("Successfully updated an user with Username " + userInfoBean.getUserName());
         return Response.ok().entity(new SuccessResponseBean(Response.Status.OK.getStatusCode(),
                 String.format("User updated successfully: [user] %s", userInfoBean.getUserName()))).build();
@@ -1910,44 +1536,12 @@ public class StratosApiV41 extends AbstractApi {
     public Response getUsers()
             throws RestAPIException {
 
-        StratosUserManager stratosUserManager = new StratosUserManager();
-
-        try {
-            List<UserInfoBean> userList = stratosUserManager.getAllUsers(getTenantUserStoreManager());
-            if (userList == null || userList.isEmpty()){
-                return Response.status(Response.Status.NOT_FOUND).build();
-            }
+        List<UserInfoBean> userList = StratosApiV41Utils.getUsers();
+        return Response.ok().entity(userList.toArray(new UserInfoBean[userList.size()])).build();
 
-            return Response.ok().entity(userList.toArray(new UserInfoBean[userList.size()])).build();
-        } catch (UserManagerException e) {
-            throw new RestAPIException(e.getMessage());
-        }
     }
 
-    /**
-     * Get Tenant UserStoreManager
-     *
-     * @return UserStoreManager
-     * @throws UserManagerException
-     */
-    private static UserStoreManager getTenantUserStoreManager() throws UserManagerException {
-
-        CarbonContext carbonContext = CarbonContext.getThreadLocalCarbonContext();
-        UserRealm userRealm;
-        UserStoreManager userStoreManager;
-
-        try {
-            userRealm = carbonContext.getUserRealm();
-            userStoreManager = userRealm.getUserStoreManager();
-
-        } catch (UserStoreException e) {
-            String msg = "Error in retrieving UserStore Manager";
-            log.error(msg, e);
-            throw new UserManagerException(msg, e);
-        }
 
-        return userStoreManager;
-    }
 
     // API methods for Kubernetes clusters
 
@@ -1989,7 +1583,7 @@ public class StratosApiV41 extends AbstractApi {
      * @return 201 if the kubernetes host is successfully added
      * @throws RestAPIException the rest api exception
      */
-    @PUT
+    @POST
     @Path("/kubernetesClusters/{kubernetesClusterId}/minion")
     @Produces("application/json")
     @Consumes("application/json")

http://git-wip-us.apache.org/repos/asf/stratos/blob/972fa25f/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 03bb67d..99f8754 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
@@ -32,6 +32,8 @@ import org.apache.stratos.cloud.controller.stub.domain.Cartridge;
 import org.apache.stratos.cloud.controller.stub.domain.Persistence;
 import org.apache.stratos.cloud.controller.stub.domain.Volume;
 import org.apache.stratos.common.beans.PropertyBean;
+import org.apache.stratos.common.beans.TenantInfoBean;
+import org.apache.stratos.common.beans.UserInfoBean;
 import org.apache.stratos.common.beans.application.*;
 import org.apache.stratos.common.beans.application.domain.mapping.ApplicationDomainMappingsBean;
 import org.apache.stratos.common.beans.application.domain.mapping.DomainMappingBean;
@@ -55,10 +57,13 @@ import org.apache.stratos.common.beans.topology.GroupInstanceBean;
 import org.apache.stratos.common.client.AutoscalerServiceClient;
 import org.apache.stratos.common.client.CloudControllerServiceClient;
 import org.apache.stratos.common.client.StratosManagerServiceClient;
+import org.apache.stratos.common.util.ClaimsMgtUtil;
 import org.apache.stratos.common.util.CommonUtil;
 import org.apache.stratos.manager.service.stub.domain.application.signup.ApplicationSignUp;
 import org.apache.stratos.manager.service.stub.domain.application.signup.ArtifactRepository;
 import org.apache.stratos.manager.service.stub.domain.application.signup.DomainMapping;
+import org.apache.stratos.manager.user.management.StratosUserManager;
+import org.apache.stratos.manager.user.management.exception.UserManagerException;
 import org.apache.stratos.manager.utils.ApplicationManagementUtil;
 import org.apache.stratos.manager.utils.CartridgeConstants;
 import org.apache.stratos.messaging.domain.application.Application;
@@ -67,9 +72,24 @@ import org.apache.stratos.messaging.domain.application.Group;
 import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.messaging.message.receiver.application.ApplicationManager;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.rest.endpoint.ServiceHolder;
 import org.apache.stratos.rest.endpoint.exception.RestAPIException;
+import org.apache.stratos.rest.endpoint.exception.TenantNotFoundException;
 import org.apache.stratos.rest.endpoint.util.converter.ObjectConverter;
 import org.wso2.carbon.context.CarbonContext;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+import org.wso2.carbon.context.RegistryType;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.wso2.carbon.registry.core.session.UserRegistry;
+import org.wso2.carbon.stratos.common.exception.StratosException;
+import org.wso2.carbon.tenant.mgt.core.TenantPersistor;
+import org.wso2.carbon.tenant.mgt.util.TenantMgtUtil;
+import org.wso2.carbon.user.api.UserRealm;
+import org.wso2.carbon.user.api.UserStoreException;
+import org.wso2.carbon.user.api.UserStoreManager;
+import org.wso2.carbon.user.core.tenant.Tenant;
+import org.wso2.carbon.user.core.tenant.TenantManager;
+import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
 
 import java.rmi.RemoteException;
 import java.util.*;
@@ -126,7 +146,7 @@ public class StratosApiV41Utils {
             log.error(msg, e);
             throw new RestAPIException(msg);
         } catch (Exception e) {
-            String msg = "Could not update cartridge";
+            String msg = "Could not update cartridge "+e.getLocalizedMessage();
             log.error(msg, e);
             throw new RestAPIException(msg);
         }
@@ -173,7 +193,7 @@ public class StratosApiV41Utils {
                 log.info(String.format("Successfully removed cartridge: [cartridge-type] %s ", cartridgeType));
             }
         } catch (Exception e) {
-            String msg = "Could not remove cartridge";
+            String msg = "Could not remove cartridge "+e.getLocalizedMessage();
             log.error(msg, e);
             throw new RestAPIException(e.getMessage(), e);
         }
@@ -688,7 +708,7 @@ public class StratosApiV41Utils {
             log.error(msg, e);
             throw new RestAPIException(msg);
         } catch (AutoscalerServiceInvalidPolicyExceptionException e) {
-            String msg = "Could not update application policy. " + e.getLocalizedMessage();
+            String msg = "Could not remove application policy. " + e.getLocalizedMessage();
             log.error(msg, e);
             throw new RestAPIException(msg);
         }
@@ -703,7 +723,6 @@ public class StratosApiV41Utils {
 
             org.apache.stratos.autoscaler.stub.autoscale.policy.AutoscalePolicy autoscalePolicy = ObjectConverter.
                     convertToCCAutoscalerPojo(autoscalePolicyBean);
-
             try {
                 autoscalerServiceClient.updateAutoscalingPolicy(autoscalePolicy);
             } catch (RemoteException e) {
@@ -2203,7 +2222,7 @@ public class StratosApiV41Utils {
             log.error(msg, e);
             throw new RestAPIException(msg);
         } catch (Exception e) {
-            String msg = "Could not update deployment policy";
+            String msg = "Could not update deployment policy "+e.getLocalizedMessage();
             log.error(msg, e);
             throw new RestAPIException(msg);
         }
@@ -2220,7 +2239,7 @@ public class StratosApiV41Utils {
         try {
             AutoscalerServiceClient.getInstance().removeDeploymentPolicy(deploymentPolicyID);
         } catch (Exception e) {
-            String msg = "Could not remove deployment policy";
+            String msg = "Could not remove deployment policy "+e.getLocalizedMessage();
             log.error(msg, e);
             throw new RestAPIException(msg);
         }
@@ -2239,4 +2258,501 @@ public class StratosApiV41Utils {
 
         return ObjectConverter.convertClusterToClusterBean(cluster, clusterId);
     }
+
+    //util methods for Tenants
+
+    /**
+     * Add Tenant
+     *
+     * @param tenantInfoBean
+     * @throws RestAPIException
+     */
+    public static void addTenant(org.apache.stratos.common.beans.TenantInfoBean tenantInfoBean) throws RestAPIException {
+
+        try {
+            CommonUtil.validateEmail(tenantInfoBean.getEmail());
+        } catch (Exception e) {
+            String msg = "Invalid email is provided";
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+
+        String tenantDomain = tenantInfoBean.getTenantDomain();
+        try {
+            TenantMgtUtil.validateDomain(tenantDomain);
+        } catch (Exception e) {
+            String msg = "Tenant domain validation error for tenant " + tenantDomain;
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+
+        UserRegistry userRegistry = (UserRegistry) PrivilegedCarbonContext.getThreadLocalCarbonContext().
+                getRegistry(RegistryType.USER_GOVERNANCE);
+        if (userRegistry == null) {
+            log.error("Security alert! User registry is null. A user is trying create a tenant "
+                    + " without an authenticated session.");
+            throw new RestAPIException("Security alert! User registry is null. A user is trying create a tenant "
+                    + " without an authenticated session.");
+        }
+
+        if (userRegistry.getTenantId() != MultitenantConstants.SUPER_TENANT_ID) {
+            log.error("Security alert! None super tenant trying to create a tenant.");
+            throw new RestAPIException("Security alert! None super tenant trying to create a tenant.");
+        }
+
+        Tenant tenant = TenantMgtUtil
+                .initializeTenant(ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean));
+        TenantPersistor persistor = ServiceHolder.getTenantPersistor();
+        // not validating the domain ownership, since created by super tenant
+        int tenantId; //TODO verify whether this is the correct approach (isSkeleton)
+        try {
+            tenantId = persistor
+                    .persistTenant(tenant, false, tenantInfoBean.getSuccessKey(), tenantInfoBean.getOriginatedService(),
+                            false);
+        } catch (Exception e) {
+            String msg = "Could not add tenant: " + e.getMessage();
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+        tenantInfoBean.setTenantId(tenantId);
+
+        try {
+            TenantMgtUtil.addClaimsToUserStoreManager(tenant);
+        } catch (Exception e) {
+            String msg = "Error in granting permissions for tenant " + tenantDomain;
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+
+        //Notify tenant addition
+        try {
+            TenantMgtUtil.triggerAddTenant(ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean));
+        } catch (StratosException e) {
+            String msg = "Error in notifying tenant addition.";
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+        // For the super tenant tenant creation, tenants are always activated as they are created.
+        try {
+            TenantMgtUtil.activateTenantInitially(
+                    ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean), tenantId);
+        } catch (Exception e) {
+            String msg = "Error in initial activation of tenant " + tenantDomain;
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+
+        try {
+            TenantMgtUtil.prepareStringToShowThemeMgtPage(tenant.getId());
+        } catch (RegistryException e) {
+            String msg = "Error in preparing theme mgt page for tenant " + tenantDomain;
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+    }
+
+    /**
+     * Update Existing Tenant
+     *
+     * @param tenantInfoBean
+     * @throws Exception
+     */
+    public static void updateExistingTenant(org.apache.stratos.common.beans.TenantInfoBean tenantInfoBean) throws Exception {
+
+        TenantManager tenantManager = ServiceHolder.getTenantManager();
+        UserStoreManager userStoreManager;
+
+        // filling the non-set admin and admin password first
+        UserRegistry configSystemRegistry = ServiceHolder.getRegistryService()
+                .getConfigSystemRegistry(tenantInfoBean.getTenantId());
+
+        String tenantDomain = tenantInfoBean.getTenantDomain();
+        int tenantId;
+        try {
+            tenantId = tenantManager.getTenantId(tenantDomain);
+        } catch (UserStoreException e) {
+            String msg = "Error in retrieving the tenant id for the tenant domain: " + tenantDomain + ".";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
+
+        Tenant tenant;
+        try {
+            tenant = (Tenant) tenantManager.getTenant(tenantId);
+        } catch (UserStoreException e) {
+            String msg = "Error in retrieving the tenant id for the tenant domain: " +
+                    tenantDomain + ".";
+            log.error(msg, e);
+            throw new TenantNotFoundException(msg, e);
+        }
+
+        // filling the first and last name values
+        if (tenantInfoBean.getFirstname() != null && !tenantInfoBean.getFirstname().trim().equals("")) {
+            try {
+                CommonUtil.validateName(tenantInfoBean.getFirstname(), "First Name");
+            } catch (Exception e) {
+                String msg = "Invalid first name is provided.";
+                log.error(msg, e);
+                throw new Exception(msg, e);
+            }
+        }
+        if (tenantInfoBean.getLastname() != null && !tenantInfoBean.getLastname().trim().equals("")) {
+            try {
+                CommonUtil.validateName(tenantInfoBean.getLastname(), "Last Name");
+            } catch (Exception e) {
+                String msg = "Invalid last name is provided.";
+                log.error(msg, e);
+                throw new Exception(msg, e);
+            }
+        }
+
+        tenant.setAdminFirstName(tenantInfoBean.getFirstname());
+        tenant.setAdminLastName(tenantInfoBean.getLastname());
+        TenantMgtUtil.addClaimsToUserStoreManager(tenant);
+
+        // filling the email value
+        if (tenantInfoBean.getEmail() != null && !tenantInfoBean.getEmail().equals("")) {
+            // validate the email
+            try {
+                CommonUtil.validateEmail(tenantInfoBean.getEmail());
+            } catch (Exception e) {
+                String msg = "Invalid email is provided.";
+                log.error(msg, e);
+                throw new Exception(msg, e);
+            }
+            tenant.setEmail(tenantInfoBean.getEmail());
+        }
+
+        UserRealm userRealm = configSystemRegistry.getUserRealm();
+        try {
+            userStoreManager = userRealm.getUserStoreManager();
+        } catch (UserStoreException e) {
+            String msg = "Error in getting the user store manager for tenant, tenant domain: " +
+                    tenantDomain + ".";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
+
+        boolean updatePassword = false;
+        if (tenantInfoBean.getAdminPassword() != null && !tenantInfoBean.getAdminPassword().equals("")) {
+            updatePassword = true;
+        }
+        if (!userStoreManager.isReadOnly() && updatePassword) {
+            // now we will update the tenant admin with the admin given
+            // password.
+            try {
+                userStoreManager.updateCredentialByAdmin(tenantInfoBean.getAdmin(), tenantInfoBean.getAdminPassword());
+            } catch (UserStoreException e) {
+                String msg = "Error in changing the tenant admin password, tenant domain: " +
+                        tenantInfoBean.getTenantDomain() + ". " + e.getMessage() + " for: " +
+                        tenantInfoBean.getAdmin();
+                log.error(msg, e);
+                throw new Exception(msg, e);
+            }
+        } else {
+            //Password should be empty since no password update done
+            tenantInfoBean.setAdminPassword("");
+        }
+
+        try {
+            tenantManager.updateTenant(tenant);
+        } catch (UserStoreException e) {
+            String msg = "Error in updating the tenant for tenant domain: " + tenantDomain + ".";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
+
+        //Notify tenant update to all listeners
+        try {
+            TenantMgtUtil
+                    .triggerUpdateTenant(ObjectConverter.convertTenantInfoBeanToCarbonTenantInfoBean(tenantInfoBean));
+        } catch (StratosException e) {
+            String msg = "Error in notifying tenant update.";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
+    }
+
+    /**
+     * Get a Tenant by Domain
+     *
+     * @param tenantDomain
+     * @return
+     * @throws Exception
+     */
+    public static org.apache.stratos.common.beans.TenantInfoBean getTenantByDomain(String tenantDomain) throws Exception {
+
+        TenantManager tenantManager = ServiceHolder.getTenantManager();
+
+        int tenantId;
+        try {
+            tenantId = tenantManager.getTenantId(tenantDomain);
+        } catch (UserStoreException e) {
+            String msg = "Error in retrieving the tenant id for the tenant domain: " +
+                    tenantDomain + ".";
+            log.error(msg);
+            throw new Exception(msg, e);
+        }
+        Tenant tenant;
+        try {
+            tenant = (Tenant) tenantManager.getTenant(tenantId);
+        } catch (UserStoreException e) {
+            String msg = "Error in retrieving the tenant from the tenant manager.";
+            log.error(msg);
+            throw new Exception(msg, e);
+        }
+
+        TenantInfoBean bean;
+        try {
+            bean = ObjectConverter
+                    .convertCarbonTenantInfoBeanToTenantInfoBean(TenantMgtUtil.initializeTenantInfoBean(tenantId, tenant));
+        } catch (NullPointerException e) {
+            log.error(String.format("Couldn't find tenant for provided tenant domain. [Tenant Domain] %s", tenantDomain));
+            return null;
+        }
+
+        // retrieve first and last names from the UserStoreManager
+        bean.setFirstname(ClaimsMgtUtil.getFirstNamefromUserStoreManager(ServiceHolder.getRealmService(), tenantId));
+        bean.setLastname(ClaimsMgtUtil.getLastNamefromUserStoreManager(ServiceHolder.getRealmService(), tenantId));
+
+        //getting the subscription plan
+        String activePlan = "";
+        //TODO: usage plan using billing service
+
+        if (activePlan != null && activePlan.trim().length() > 0) {
+            bean.setUsagePlan(activePlan);
+        } else {
+            bean.setUsagePlan("");
+        }
+
+        return bean;
+    }
+
+    /**
+     * Get a list of available Tenants
+     *
+     * @return
+     * @throws RestAPIException
+     */
+    public static List<org.apache.stratos.common.beans.TenantInfoBean> getAllTenants() throws RestAPIException {
+        TenantManager tenantManager = ServiceHolder.getTenantManager();
+        Tenant[] tenants;
+        try {
+            tenants = (Tenant[]) tenantManager.getAllTenants();
+        } catch (Exception e) {
+            String msg = "Error in retrieving the tenant information";
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+
+        List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = new ArrayList<org.apache.stratos.common.beans.TenantInfoBean>();
+        for (Tenant tenant : tenants) {
+            org.apache.stratos.common.beans.TenantInfoBean bean = ObjectConverter
+                    .convertCarbonTenantInfoBeanToTenantInfoBean(
+                            TenantMgtUtil.getTenantInfoBeanfromTenant(tenant.getId(), tenant));
+            tenantList.add(bean);
+        }
+        return tenantList;
+    }
+
+    /**
+     * Get List of Partial Tenant Domains
+     *
+     * @param domain
+     * @return
+     * @throws RestAPIException
+     */
+    public static List<org.apache.stratos.common.beans.TenantInfoBean> searchPartialTenantsDomains(String domain)
+            throws RestAPIException {
+        TenantManager tenantManager = ServiceHolder.getTenantManager();
+        Tenant[] tenants;
+        try {
+            domain = domain.trim();
+            tenants = (Tenant[]) tenantManager.getAllTenantsForTenantDomainStr(domain);
+        } catch (Exception e) {
+            String msg = "Error in retrieving the tenant information.";
+            log.error(msg, e);
+            throw new RestAPIException(msg);
+        }
+
+        List<org.apache.stratos.common.beans.TenantInfoBean> tenantList = new ArrayList<org.apache.stratos.common.beans.TenantInfoBean>();
+        for (Tenant tenant : tenants) {
+            org.apache.stratos.common.beans.TenantInfoBean bean = ObjectConverter
+                    .convertCarbonTenantInfoBeanToTenantInfoBean(
+                            TenantMgtUtil.getTenantInfoBeanfromTenant(tenant.getId(), tenant));
+            tenantList.add(bean);
+        }
+        return tenantList;
+    }
+
+
+    /**
+     * Activate a Tenant
+     *
+     * @param tenantDomain
+     * @throws RestAPIException
+     */
+    public static void activateTenant(String tenantDomain) throws RestAPIException {
+        TenantManager tenantManager = ServiceHolder.getTenantManager();
+        int tenantId;
+        try {
+            tenantId = tenantManager.getTenantId(tenantDomain);
+
+        } catch (UserStoreException e) {
+            String msg = "Error in retrieving the tenant id for the tenant domain: " + tenantDomain + ".";
+            log.error(msg, e);
+            throw new RestAPIException(msg, e);
+        }
+
+        try {
+            TenantMgtUtil.activateTenant(tenantDomain, tenantManager, tenantId);
+
+        } catch (Exception e) {
+            throw new RestAPIException(e);
+        }
+
+        //Notify tenant activation all listeners
+        try {
+            TenantMgtUtil.triggerTenantActivation(tenantId);
+        } catch (StratosException e) {
+            String msg = "Error in notifying tenant activate.";
+            log.error(msg, e);
+            throw new RestAPIException(msg, e);
+        }
+    }
+
+    /**
+     * Deactivate Tenant
+     *
+     * @param tenantDomain
+     * @throws RestAPIException
+     */
+    public static void deactivateTenant(String tenantDomain) throws RestAPIException {
+        TenantManager tenantManager = ServiceHolder.getTenantManager();
+        int tenantId;
+        try {
+            tenantId = tenantManager.getTenantId(tenantDomain);
+
+        } catch (UserStoreException e) {
+            String msg = "Error in retrieving the tenant id for the tenant domain: " +
+                    tenantDomain + ".";
+            log.error(msg, e);
+            throw new RestAPIException(msg, e);
+
+        }
+
+        try {
+            TenantMgtUtil.deactivateTenant(tenantDomain, tenantManager, tenantId);
+        } catch (Exception e) {
+            throw new RestAPIException(e);
+        }
+
+        //Notify tenant deactivation all listeners
+        try {
+            TenantMgtUtil.triggerTenantDeactivation(tenantId);
+        } catch (StratosException e) {
+            String msg = "Error in notifying tenant deactivate.";
+            log.error(msg, e);
+            throw new RestAPIException(msg, e);
+        }
+
+    }
+
+    //Util methods for Users
+
+    /**
+     * Adds an User
+     *
+     * @param userInfoBean
+     * @throws RestAPIException
+     */
+    public static void addUser(UserInfoBean userInfoBean) throws RestAPIException {
+        StratosUserManager stratosUserManager = new StratosUserManager();
+
+        try {
+            stratosUserManager.addUser(getTenantUserStoreManager(), userInfoBean);
+
+        } catch (UserManagerException e) {
+            throw new RestAPIException(e.getMessage());
+        }
+
+    }
+
+
+    /**
+     * Get Tenant UserStoreManager
+     *
+     * @return UserStoreManager
+     * @throws UserManagerException
+     */
+    private static UserStoreManager getTenantUserStoreManager() throws UserManagerException {
+
+        CarbonContext carbonContext = CarbonContext.getThreadLocalCarbonContext();
+        UserRealm userRealm;
+        UserStoreManager userStoreManager;
+
+        try {
+            userRealm = carbonContext.getUserRealm();
+            userStoreManager = userRealm.getUserStoreManager();
+
+        } catch (UserStoreException e) {
+            String msg = "Error in retrieving UserStore Manager";
+            log.error(msg, e);
+            throw new UserManagerException(msg, e);
+        }
+
+        return userStoreManager;
+    }
+
+    /**
+     * Delete an user
+     *
+     * @param userName
+     * @throws RestAPIException
+     */
+    public static void removeUser(String userName) throws RestAPIException{
+        StratosUserManager stratosUserManager = new StratosUserManager();
+
+        try {
+            stratosUserManager.removeUser(getTenantUserStoreManager(), userName);
+        } catch (UserManagerException e) {
+            throw new RestAPIException(e.getMessage());
+        }
+    }
+
+    /**
+     * Update User
+     *
+     * @param userInfoBean
+     * @throws RestAPIException
+     */
+    public static void updateUser(UserInfoBean userInfoBean) throws RestAPIException {
+        StratosUserManager stratosUserManager = new StratosUserManager();
+
+        try {
+            stratosUserManager.updateUser(getTenantUserStoreManager(), userInfoBean);
+
+        } catch (UserManagerException e) {
+            throw new RestAPIException(e.getMessage());
+        }
+
+    }
+
+    /**
+     * Get List of Users
+     *
+     * @return
+     * @throws RestAPIException
+     */
+    public static List<UserInfoBean> getUsers() throws RestAPIException {
+        StratosUserManager stratosUserManager = new StratosUserManager();
+        List<UserInfoBean> userList;
+        try {
+           userList  = stratosUserManager.getAllUsers(getTenantUserStoreManager());
+        }catch (UserManagerException e){
+            throw new RestAPIException(e.getMessage());
+        }
+        return userList;
+    }
+
 }