org.kuali.rice.kcb.web.spring.UserPreferencesController.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.rice.kcb.web.spring.UserPreferencesController.java

Source

/*-
 * #%L
 * %%
 * Copyright (C) 2005 - 2019 Kuali, Inc. - All Rights Reserved
 * %%
 * You may use and modify this code under the terms of the Kuali, Inc.
 * Pre-Release License Agreement. You may not distribute it.
 * 
 * You should have received a copy of the Kuali, Inc. Pre-Release License
 * Agreement with this file. If not, please write to license@kuali.co.
 * #L%
 */

package org.kuali.rice.kcb.web.spring;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.kuali.rice.kcb.bo.RecipientDelivererConfig;
import org.kuali.rice.kcb.deliverer.MessageDeliverer;
import org.kuali.rice.kcb.exception.ErrorList;
import org.kuali.rice.kcb.service.KENIntegrationService;
import org.kuali.rice.kcb.service.MessageDelivererRegistryService;
import org.kuali.rice.kcb.service.RecipientPreferenceService;
import org.kuali.rice.kns.util.WebUtils;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * This class is the controller that handles management of various user preferences interfaces (deliver types, user subscriptions, etc).
 * @author Kuali Rice Team (rice.collab@kuali.org)
 */
public class UserPreferencesController extends MultiActionController {
    /** Logger for this class and subclasses */
    private static final Logger LOG = LogManager.getLogger(UserPreferencesController.class);

    private static final String VIEW = "DelivererPreferences";
    private static final String KEW_CHANNEL = "KEW";
    protected RecipientPreferenceService recipientPreferenceService;
    protected MessageDelivererRegistryService messageDelivererRegistryService;
    protected KENIntegrationService kenIntegrationService;

    /**
     * Set the RecipientPreferenceService
     * @param recipientPreferenceService
     */
    @Required
    public void setRecipientPreferenceService(RecipientPreferenceService userPreferenceService) {
        this.recipientPreferenceService = userPreferenceService;
    }

    /**
     * Set the MessageDelivererRegistryService
     * @param messageDelivererRegistryService
     */
    @Required
    public void setMessageDelivererRegistryService(
            MessageDelivererRegistryService messageDelivererRegistryService) {
        this.messageDelivererRegistryService = messageDelivererRegistryService;
    }

    /**
     * Sets the KENIntegrationService
     * @param kis the KENIntegrationService
     */
    @Required
    public void setKenIntegrationService(KENIntegrationService kis) {
        this.kenIntegrationService = kis;
    }

    /**
     * @return all channels for Rice, including the builtin KEW action list "channel"
     */
    protected Collection<String> getAllChannels() {
        // TODO: does not traverse bus yet
        Collection<String> allChannels = new ArrayList<String>();
        //allChannels.add(KEW_CHANNEL);
        allChannels.addAll(kenIntegrationService.getAllChannelNames());
        return allChannels;
    }

    /**
     * displayDelivererConfigurationForm - obtain information necessary
     * for displaying all possible Deliverer types and forward to the form
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public ModelAndView displayDelivererConfigurationForm(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String userid = request.getRemoteUser();
        LOG.debug("remoteUser: " + userid);

        // Get DeliveryType classes
        Collection<MessageDeliverer> deliveryTypes = this.messageDelivererRegistryService.getAllDeliverers();

        // get all channels       
        Collection<String> channels = getAllChannels();

        //     get all user preferences in a HashMap
        HashMap<String, String> preferences = this.recipientPreferenceService.getRecipientPreferences(userid);

        // get existing configured deliverers
        Collection<RecipientDelivererConfig> currentDeliverers = this.recipientPreferenceService
                .getDeliverersForRecipient(userid);
        // create a Map as an easy way for the JSP to determine whether a deliver is enabled for channels
        Map<String, Boolean> currentDeliverersMap = new HashMap<String, Boolean>();
        for (RecipientDelivererConfig udc : currentDeliverers) {
            String channelName = udc.getChannel();
            currentDeliverersMap.put(udc.getDelivererName() + "." + channelName, Boolean.TRUE);
        }

        Map<String, Object> model = new HashMap<String, Object>();
        model.put("channels", channels);
        model.put("deliveryTypes", deliveryTypes);
        model.put("preferences", preferences);
        model.put("currentDeliverersMap", currentDeliverersMap);
        putBackLocation(model, request.getParameter("backLocation"));

        return new ModelAndView(VIEW, model);
    }

    private void putBackLocation(Map<String, Object> model, String backLocation) {
        if (StringUtils.isNotBlank(backLocation)) {
            model.put("backLocation", WebUtils.sanitizeBackLocation(backLocation));
        }
    }

    /**
     * saveDelivererConfiguration - save deliverer configuration data
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public ModelAndView saveDelivererConfiguration(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String userid = request.getRemoteUser();
        LOG.debug("remoteUser: " + userid);
        boolean error = false;

        Map<String, Object> model = new HashMap<String, Object>();

        // create preferences map here so that we can pass them all back to the view
        HashMap<String, String> preferences = new HashMap<String, String>();

        // Get DeliveryType classes.  loop through each deliverer type to 
        // to obtain preferenceKeys.  Check to see if a matching request
        // parameter was provided, then save a record for the userID, channelID, and 
        // preferences setting
        Collection<MessageDeliverer> deliveryTypes = this.messageDelivererRegistryService.getAllDeliverers();

        // first remove all configured user delivers for this user
        this.recipientPreferenceService.removeRecipientDelivererConfigs(userid);

        for (MessageDeliverer dt : deliveryTypes) {
            String deliveryTypeName = dt.getName();
            HashMap<String, String> prefMap = dt.getPreferenceKeys();
            LOG.debug("deliveryName: " + deliveryTypeName);
            HashMap<String, String> userprefs = new HashMap<String, String>();
            for (String prefKey : prefMap.keySet()) {
                LOG.debug("   key: " + prefKey + ", value: "
                        + request.getParameter(deliveryTypeName + "." + prefKey));
                userprefs.put(deliveryTypeName + "." + prefKey,
                        request.getParameter(deliveryTypeName + "." + prefKey));
                preferences.put(deliveryTypeName + "." + prefKey,
                        request.getParameter(deliveryTypeName + "." + prefKey));
            }
            try {
                this.recipientPreferenceService.saveRecipientPreferences(userid, userprefs, dt);
            } catch (ErrorList errorlist) {
                error = true;
                model.put("errorList", errorlist.getErrors());
            }

            // get channelName.channels
            String[] channels = request.getParameterValues(deliveryTypeName + ".channels");
            if (channels != null && channels.length > 0) {
                for (int j = 0; j < channels.length; j++) {
                    LOG.debug(deliveryTypeName + ".channels[" + j + "] " + channels[j]);
                }
            }
            //    now save the userid, channel selection
            this.recipientPreferenceService.saveRecipientDelivererConfig(userid, deliveryTypeName, channels);
        }

        // get all channels       
        Collection<String> channels = getAllChannels();

        // get existing configured deliverers
        Collection<RecipientDelivererConfig> currentDeliverers = this.recipientPreferenceService
                .getDeliverersForRecipient(userid);
        Map<String, Object> currentDeliverersMap = new HashMap<String, Object>();
        for (RecipientDelivererConfig udc : currentDeliverers) {
            String channelId = udc.getChannel();
            currentDeliverersMap.put(udc.getDelivererName() + "." + channelId, Boolean.TRUE);
        }

        // use for debugging, uncomment for production
        //LOG.info("CurrentDeliverersMap");
        //Iterator iter = currentDeliverersMap.keySet().iterator();
        //while (iter.hasNext()) {
        //   Object o = iter.next();      
        //   LOG.info("key: "+o.toString()+", value: "+ currentDeliverersMap.get(o) );
        //}

        model.put("channels", channels);
        model.put("deliveryTypes", deliveryTypes);
        model.put("preferences", preferences);
        model.put("currentDeliverersMap", currentDeliverersMap);
        model.put("message", "Update Successful");
        putBackLocation(model, request.getParameter("backLocation"));

        return new ModelAndView(VIEW, model);
    }
}