de.ingrid.portal.portlets.mdek.MdekPortalAdminPortlet.java Source code

Java tutorial

Introduction

Here is the source code for de.ingrid.portal.portlets.mdek.MdekPortalAdminPortlet.java

Source

/*
 * **************************************************-
 * Ingrid Portal Mdek
 * ==================================================
 * Copyright (C) 2014 - 2015 wemove digital solutions GmbH
 * ==================================================
 * Licensed under the EUPL, Version 1.1 or  as soon they will be
 * approved by the European Commission - subsequent versions of the
 * EUPL (the "Licence");
 * 
 * You may not use this work except in compliance with the Licence.
 * You may obtain a copy of the Licence at:
 * 
 * http://ec.europa.eu/idabc/eupl5
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the Licence is distributed on an "AS IS" basis,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the Licence for the specific language governing permissions and
 * limitations under the Licence.
 * **************************************************#
 */
/*
 * Copyright (c) 2006 wemove digital solutions. All rights reserved.
 */
package de.ingrid.portal.portlets.mdek;

import java.io.IOException;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletException;
import javax.portlet.PortletPreferences;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.CommonPortletServices;
import org.apache.jetspeed.security.RoleManager;
import org.apache.jetspeed.security.SecurityException;
import org.apache.jetspeed.security.UserManager;
import org.apache.portals.bridges.velocity.GenericVelocityPortlet;
import org.apache.velocity.context.Context;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import de.ingrid.mdek.MdekKeys;
import de.ingrid.mdek.beans.CatalogBean;
import de.ingrid.mdek.caller.IMdekCallerCatalog;
import de.ingrid.mdek.caller.IMdekCallerSecurity;
import de.ingrid.mdek.caller.IMdekClientCaller;
import de.ingrid.mdek.caller.MdekCallerCatalog;
import de.ingrid.mdek.caller.MdekCallerSecurity;
import de.ingrid.mdek.caller.MdekClientCaller;
import de.ingrid.mdek.persistence.db.model.UserData;
import de.ingrid.mdek.util.MdekCatalogUtils;
import de.ingrid.mdek.util.MdekUtils;
import de.ingrid.portal.hibernate.HibernateUtil;
import de.ingrid.utils.IngridDocument;

/**
 * This portlet handles the administration processes for the portal admin
 *
 * @author michael.benz@wemove.com
 */
public class MdekPortalAdminPortlet extends GenericVelocityPortlet {

    private final static Log log = LogFactory.getLog(MdekPortalAdminPortlet.class);

    // VIEW TEMPLATES
    private final static String TEMPLATE_START = "/WEB-INF/templates/mdek/mdek_portal_admin.vm";
    private final static String TEMPLATE_NEW = "/WEB-INF/templates/mdek/mdek_portal_admin_create_catalog.vm";

    // Portlet State
    private enum STATE {
        START, NEW
    };

    private STATE state;

    // Possible Actions
    private final static String PARAMV_ACTION_DO_DELETE = "doDelete";
    private final static String PARAMV_ACTION_DO_NEW = "doNew";
    private final static String PARAMV_ACTION_DO_RELOAD = "doReload";
    private final static String PARAMV_ACTION_DO_CREATE_CATALOG = "doCreateCatalog";
    private final static String PARAMV_ACTION_DO_CANCEL = "doCancel";

    private enum ACTION {
        DELETE, NEW, RELOAD, CREATE_CATALOG, CANCEL
    };

    // Parameters set on init
    private UserManager userManager;
    private RoleManager roleManager;
    private IMdekClientCaller mdekClientCaller;

    public void init(PortletConfig config) throws PortletException {
        super.init(config);

        this.state = STATE.START;

        this.mdekClientCaller = MdekClientCaller.getInstance();

        userManager = (UserManager) getPortletContext()
                .getAttribute(CommonPortletServices.CPS_USER_MANAGER_COMPONENT);
        if (null == userManager) {
            throw new PortletException("Failed to find the User Manager on portlet initialization");
        }
        roleManager = (RoleManager) getPortletContext()
                .getAttribute(CommonPortletServices.CPS_ROLE_MANAGER_COMPONENT);
        if (null == roleManager) {
            throw new PortletException("Failed to find the Role Manager on portlet initialization");
        }

        // Add the user and role manager to the context
        // This has to be done so we can access the jetspeed managers in the mdek app
        getPortletContext().setAttribute(CommonPortletServices.CPS_USER_MANAGER_COMPONENT, userManager);
        getPortletContext().setAttribute(CommonPortletServices.CPS_ROLE_MANAGER_COMPONENT, roleManager);

        try {
            if (!roleManager.roleExists("mdek")) {
                roleManager.addRole("mdek");
            }
        } catch (SecurityException e) {
            throw new PortletException(e);
        }
    }

    public void doViewStart(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response)
            throws PortletException, IOException {
        setDefaultViewPage(TEMPLATE_START);

        Context context = getContext(request);
        context.put("catalogList", buildConnectedCatalogList());

        ResourceBundle resourceBundle = getPortletConfig().getResourceBundle(request.getLocale());
        context.put("MESSAGES", resourceBundle);

        PortletPreferences prefs = request.getPreferences();
        String myTitleKey = prefs.getValue("titleKey", "mdek.title.portaladmin");
        response.setTitle(resourceBundle.getString(myTitleKey));

    }

    public void doViewNew(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response)
            throws PortletException, IOException {
        setDefaultViewPage(TEMPLATE_NEW);

        Context context = getContext(request);
        List<String> plugIdList = getUnconnectedPlugIdList(request);
        List<String> userNameList = getUnconnectedUserList();
        Collections.sort(plugIdList);
        Collections.sort(userNameList, Collator.getInstance(Locale.GERMAN));

        ResourceBundle resourceBundle = getPortletConfig().getResourceBundle(request.getLocale());
        context.put("MESSAGES", resourceBundle);

        PortletPreferences prefs = request.getPreferences();
        String myTitleKey = prefs.getValue("titleKey", "mdek.title.portaladmin");
        response.setTitle(resourceBundle.getString(myTitleKey));

        context.put("plugIdList", plugIdList);
        context.put("userNameList", userNameList);
    }

    public void doView(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response)
            throws PortletException, IOException {

        if (this.state == STATE.START) {
            doViewStart(request, response);
        } else {
            doViewNew(request, response);
        }

        super.doView(request, response);
    }

    public void processAction(ActionRequest request, ActionResponse actionResponse)
            throws PortletException, IOException {

        switch (getAction(request)) {
        case NEW:
            processActionNew(request, actionResponse);
            break;

        case DELETE:
            processActionDelete(request, actionResponse);
            break;

        case RELOAD:
            processActionReload(request, actionResponse);
            break;

        case CREATE_CATALOG:
            processActionCreateCatalog(request, actionResponse);
            break;

        case CANCEL:
            // Redirect to reload
            processActionReload(request, actionResponse);
            break;

        default:
            // Redirect to reload
            processActionReload(request, actionResponse);
            break;
        }
    }

    public void processActionNew(ActionRequest request, ActionResponse actionResponse)
            throws PortletException, IOException {
        this.state = STATE.NEW;
    }

    public void processActionDelete(ActionRequest request, ActionResponse actionResponse)
            throws PortletException, IOException {
        String[] plugIdList = request.getParameterValues("id");

        if (plugIdList == null) {
            return;
        }

        // Remove all connections from the given list
        for (String plugId : plugIdList) {
            removeConnectedIPlug(plugId);
        }
    }

    public void processActionReload(ActionRequest request, ActionResponse actionResponse)
            throws PortletException, IOException {
        this.state = STATE.START;
    }

    public void processActionCreateCatalog(ActionRequest request, ActionResponse actionResponse)
            throws PortletException, IOException {
        String plugId = request.getParameter("plugId");
        String userName = request.getParameter("userName");

        if (plugId == null || userName == null) {
            return;
        }

        // Create a new UserData object
        IMdekCallerSecurity mdekCallerSecurity = MdekCallerSecurity.getInstance();
        IngridDocument catAdminDoc = mdekCallerSecurity.getCatalogAdmin(plugId, userName);
        IngridDocument catAdmin = MdekUtils.getResultFromResponse(catAdminDoc);

        UserData user = new UserData();
        user.setAddressUuid((String) catAdmin.get(MdekKeys.UUID));
        user.setPlugId(plugId);
        user.setPortalLogin(userName);

        // Try to add the role 'mdek' to the user 'userName'
        try {
            roleManager.addRoleToUser(userName, "mdek");

        } catch (SecurityException e) {
            log.error("Could not add role 'mdek' to user with name '" + userName + "'");
            throw new PortletException("Could not add role 'mdek' to user with name '" + userName + "'", e);
        }

        // Role was successfully added, store the user in the mdek db
        Session s = HibernateUtil.currentSession();

        try {
            s.beginTransaction();
            s.persist(user);
            s.getTransaction().commit();

        } catch (HibernateException e) {
            // Hibernate Exception. Rollback the role change and the transaction
            if (s.getTransaction() != null && s.getTransaction().wasCommitted()) {
                s.getTransaction().rollback();
            }

            try {
                roleManager.removeRoleFromUser(userName, "mdek");

            } catch (SecurityException se) {
                log.error("Error while connectiong a new catalog. The user '" + userName
                        + "' could not be created in the 'mdek' database. "
                        + "Additionaly the user received the role 'mdek' which could not be removed.", se);
            }

            throw new PortletException("Error while connectiong a new catalog. The user '" + userName
                    + "' could not be created in the 'mdek' database. "
                    + "Additionaly the user received the role 'mdek' which could not be removed.", e);

        } finally {
            HibernateUtil.closeSession();
            this.state = STATE.START;
        }
    }

    private void removeConnectedIPlug(String plugId) throws PortletException {
        Session s = HibernateUtil.currentSession();
        s.beginTransaction();
        try {
            @SuppressWarnings("unchecked")
            List<UserData> userDataList = (List<UserData>) s.createCriteria(UserData.class)
                    .add(Restrictions.eq("plugId", plugId)).list();
            if (userDataList != null && userDataList.size() != 0) {
                // TODO Delete all idc users in the catalog?
                for (UserData userData : userDataList) {
                    s.delete(userData);
                    try {
                        roleManager.removeRoleFromUser(userData.getPortalLogin(), "mdek");
                    } catch (SecurityException e) {
                        // ignore if a user already has been deleted in the portal (REDMINE-144)
                        if (e.getMessage().contains("does not exist")) {
                            log.warn(
                                    "The role 'mdek' could not be removed. The user does not seem to exist anymore: "
                                            + userData.getPortalLogin());
                        } else {
                            if (s.getTransaction() != null) {
                                s.getTransaction().rollback();
                            }
                            throw new PortletException(e);
                        }
                    }
                }
                s.getTransaction().commit();
            }

        } finally {
            HibernateUtil.closeSession();
        }
    }

    private static ACTION getAction(ActionRequest request) {
        if (request.getParameter(PARAMV_ACTION_DO_NEW) != null)
            return ACTION.NEW;
        else if (request.getParameter(PARAMV_ACTION_DO_DELETE) != null)
            return ACTION.DELETE;
        else if (request.getParameter(PARAMV_ACTION_DO_RELOAD) != null)
            return ACTION.RELOAD;
        else if (request.getParameter(PARAMV_ACTION_DO_CREATE_CATALOG) != null)
            return ACTION.CREATE_CATALOG;
        else if (request.getParameter(PARAMV_ACTION_DO_CANCEL) != null)
            return ACTION.CANCEL;
        else
            return ACTION.RELOAD;
    }

    private List<String> getUnconnectedUserList() throws PortletException {
        try {
            List<String> users = userManager.getUserNames("");
            List<String> userNameList = new ArrayList<String>();

            for (String user : users) {
                if (canBecomeCatalogAdmin(user)) {
                    log.debug("User '" + user + "' can become catAdmin.");
                    userNameList.add(user);
                } else {
                    log.debug("User '" + user + "' can't become catAdmin.");
                }
            }
            return userNameList;

        } catch (SecurityException se) {
            throw new PortletException(se);
        }
    }

    private List<String> getUnconnectedPlugIdList(javax.portlet.RenderRequest request) throws PortletException {
        List<String> plugIdList = new ArrayList<String>();

        for (String plugId : this.mdekClientCaller.getRegisteredIPlugs()) {
            if (!hasCatalogAdmin(request, plugId)) {
                log.debug("Catalog '" + plugId + "' does not have a catAdmin.");
                plugIdList.add(plugId);

            } else {
                log.debug("Catalog '" + plugId + "' has a catAdmin.");
            }
        }
        return plugIdList;
    }

    private List<Map<String, String>> buildConnectedCatalogList() {
        List<Map<String, String>> catalogList = new ArrayList<Map<String, String>>();
        Session s = HibernateUtil.currentSession();
        s.beginTransaction();

        for (String plugId : this.mdekClientCaller.getRegisteredIPlugs()) {
            @SuppressWarnings("unchecked")
            List<UserData> userDataList = (List<UserData>) s.createCriteria(UserData.class)
                    .add(Restrictions.eq("plugId", plugId)).list();
            if (userDataList != null && userDataList.size() != 0) {
                HashMap<String, String> catalogData = new HashMap<String, String>();
                UserData userData = userDataList.get(0);

                IMdekCallerCatalog mdekCallerCatalog = MdekCallerCatalog.getInstance();
                IMdekCallerSecurity mdekCallerSecurity = MdekCallerSecurity.getInstance();

                IngridDocument cat = mdekCallerCatalog.fetchCatalog(plugId, userData.getAddressUuid());
                IngridDocument adm = mdekCallerSecurity.getCatalogAdmin(plugId, userData.getAddressUuid());
                String catAdminUuid = extractCatalogAdminUuid(adm);

                String catName = "";
                String catPartnerName = "";
                String catProviderName = "";
                try {
                    CatalogBean catBean = MdekCatalogUtils.extractCatalogFromResponse(cat);
                    catName = catBean.getCatalogName();
                    catPartnerName = catBean.getPartnerName();
                    catProviderName = catBean.getProviderName();
                } catch (Exception e) {
                    log.error("Problems extracting catalog data for iPlug " + plugId, e);
                    catName = "ERROR, see log !";
                }

                UserData catAdminUserData = (UserData) s.createCriteria(UserData.class)
                        .add(Restrictions.eq("plugId", plugId)).add(Restrictions.eq("addressUuid", catAdminUuid))
                        .uniqueResult();

                if (catAdminUserData == null) {
                    // The catalog admin was not found in the user table. This should never be the case!
                    // Possibly the addressUuid has changed. Display the catalog, but also display an error
                    catalogData.put("plugId", plugId);
                    catalogData.put("catName", catName);
                    catalogData.put("catAdmin", extractCatalogAdminName(adm));
                    catalogData.put("portalLogin", "ERROR: portalLogin not found!");
                    catalogData.put("partner", catPartnerName);
                    catalogData.put("provider", catProviderName);
                    catalogList.add(catalogData);

                } else {
                    // Display the catalogData
                    catalogData.put("plugId", plugId);
                    catalogData.put("catName", catName);
                    catalogData.put("catAdmin", extractCatalogAdminName(adm));
                    catalogData.put("portalLogin", catAdminUserData.getPortalLogin());
                    catalogData.put("partner", catPartnerName);
                    catalogData.put("provider", catProviderName);
                    catalogList.add(catalogData);
                }
            }
        }

        s.getTransaction().commit();
        HibernateUtil.closeSession();
        return catalogList;
    }

    private static String extractCatalogAdminUuid(IngridDocument catAdmin) {
        IngridDocument result = MdekUtils.getResultFromResponse(catAdmin);
        return result == null ? "" : (String) result.get(MdekKeys.UUID);
    }

    private static String extractCatalogAdminName(IngridDocument catAdmin) {
        IngridDocument result = MdekUtils.getResultFromResponse(catAdmin);
        String title = "";
        String organisation = (String) result.get(MdekKeys.ORGANISATION);
        String name = (String) result.get(MdekKeys.NAME);
        String givenName = (String) result.get(MdekKeys.GIVEN_NAME);

        switch ((Integer) result.get(MdekKeys.CLASS)) {
        case 0:
            // Fall through
        case 1:
            title = organisation;
            break;
        case 2:
            if (name != null)
                title += name;
            if (givenName != null)
                title += ", " + givenName;
            break;
        case 3:
            if (name != null)
                title += name;
            if (givenName != null)
                title += ", " + givenName;
            if (organisation != null)
                title += " (" + organisation + ")";
            break;
        }
        return title;
    }

    private boolean hasCatalogAdmin(javax.portlet.RenderRequest request, String plugId) throws PortletException {
        IMdekCallerSecurity mdekCallerSecurity = MdekCallerSecurity.getInstance();
        IngridDocument response = mdekCallerSecurity.getCatalogAdmin(plugId, request.getUserPrincipal().getName());
        IngridDocument catAdmin = MdekUtils.getResultFromResponse(response);
        if (catAdmin == null) {
            return true;
        }

        String addressUuid = (String) catAdmin.get(MdekKeys.UUID);

        Session s = HibernateUtil.currentSession();
        s.beginTransaction();
        @SuppressWarnings("unchecked")
        List<UserData> userDataList = (List<UserData>) s.createCriteria(UserData.class)
                .add(Restrictions.eq("plugId", plugId)).add(Restrictions.eq("addressUuid", addressUuid)).list();

        s.getTransaction().commit();
        HibernateUtil.closeSession();

        if (userDataList != null && userDataList.size() != 0) {
            return true;
        }

        return false;
    }

    private boolean canBecomeCatalogAdmin(String userName) throws SecurityException {
        return (!userName.equals("admin") && !userName.equals("guest") && !userName.equals("devmgr")
                && !roleManager.isUserInRole(userName, "admin")
                && !roleManager.isUserInRole(userName, "admin-portal")
                && !roleManager.isUserInRole(userName, "mdek"));
    }
}