001    /**
002     * Copyright 2005-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kcb.web.spring;
017    
018    import org.apache.log4j.Logger;
019    import org.kuali.rice.kcb.bo.RecipientDelivererConfig;
020    import org.kuali.rice.kcb.deliverer.MessageDeliverer;
021    import org.kuali.rice.kcb.exception.ErrorList;
022    import org.kuali.rice.kcb.service.KENIntegrationService;
023    import org.kuali.rice.kcb.service.MessageDelivererRegistryService;
024    import org.kuali.rice.kcb.service.RecipientPreferenceService;
025    import org.springframework.beans.factory.annotation.Required;
026    import org.springframework.web.servlet.ModelAndView;
027    import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
028    
029    import javax.servlet.ServletException;
030    import javax.servlet.http.HttpServletRequest;
031    import javax.servlet.http.HttpServletResponse;
032    import java.io.IOException;
033    import java.util.ArrayList;
034    import java.util.Collection;
035    import java.util.HashMap;
036    import java.util.Map;
037    
038    /**
039     * This class is the controller that handles management of various user preferences interfaces (deliver types, user subscriptions, etc).
040     * @author Kuali Rice Team (rice.collab@kuali.org)
041     */
042    public class UserPreferencesController extends MultiActionController {
043        /** Logger for this class and subclasses */
044        private static final Logger LOG = Logger.getLogger(UserPreferencesController.class);
045    
046        private static final String VIEW = "DelivererPreferences";
047        private static final String KEW_CHANNEL = "KEW"; 
048        protected RecipientPreferenceService recipientPreferenceService;
049        protected MessageDelivererRegistryService messageDelivererRegistryService;
050        protected KENIntegrationService kenIntegrationService;
051    
052        /**
053         * Set the RecipientPreferenceService
054         * @param recipientPreferenceService
055         */
056        @Required
057        public void setRecipientPreferenceService(RecipientPreferenceService userPreferenceService) {
058            this.recipientPreferenceService = userPreferenceService;
059        }
060    
061        /**
062         * Set the MessageDelivererRegistryService
063         * @param messageDelivererRegistryService
064         */
065        @Required
066        public void setMessageDelivererRegistryService(MessageDelivererRegistryService messageDelivererRegistryService) {
067            this.messageDelivererRegistryService = messageDelivererRegistryService;
068        }
069    
070        /**
071         * Sets the KENIntegrationService
072         * @param kis the KENIntegrationService
073         */
074        @Required
075        public void setKenIntegrationService(KENIntegrationService kis) {
076            this.kenIntegrationService = kis;
077        }
078    
079        /**
080         * @return all channels for Rice, including the builtin KEW action list "channel"
081         */
082        protected Collection<String> getAllChannels() {
083            // TODO: does not traverse bus yet
084            Collection<String> allChannels = new ArrayList<String>();
085            //allChannels.add(KEW_CHANNEL);
086            allChannels.addAll(kenIntegrationService.getAllChannelNames());
087            return allChannels;
088        }
089    
090        /**
091         * displayDelivererConfigurationForm - obtain information necessary
092         * for displaying all possible Deliverer types and forward to the form
093         * @param request
094         * @param response
095         * @return
096         * @throws ServletException
097         * @throws IOException
098         */
099        public ModelAndView displayDelivererConfigurationForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
100            String userid = request.getRemoteUser();
101            LOG.debug("remoteUser: "+userid); 
102    
103            // Get DeliveryType classes
104            Collection<MessageDeliverer> deliveryTypes = this.messageDelivererRegistryService.getAllDeliverers();
105    
106            // get all channels       
107            Collection<String> channels = getAllChannels();
108    
109            //     get all user preferences in a HashMap
110            HashMap<String, String> preferences  = this.recipientPreferenceService.getRecipientPreferences(userid);
111    
112            // get existing configured deliverers
113            Collection<RecipientDelivererConfig> currentDeliverers = this.recipientPreferenceService.getDeliverersForRecipient(userid);
114            // create a Map as an easy way for the JSP to determine whether a deliver is enabled for channels
115            Map<String, Boolean> currentDeliverersMap = new HashMap<String, Boolean>();
116            for (RecipientDelivererConfig udc: currentDeliverers) {
117                String channelName = udc.getChannel();
118                currentDeliverersMap.put(udc.getDelivererName() + "." + channelName, Boolean.TRUE);
119            }
120    
121            Map<String, Object> model = new HashMap<String, Object>();
122            model.put("channels", channels);
123            model.put("deliveryTypes", deliveryTypes);
124            model.put("preferences", preferences);
125            model.put("currentDeliverersMap", currentDeliverersMap);
126            return new ModelAndView(VIEW, model);
127        }
128    
129        /**
130         * saveDelivererConfiguration - save deliverer configuration data
131         * @param request
132         * @param response
133         * @return
134         * @throws ServletException
135         * @throws IOException
136         */
137        public ModelAndView saveDelivererConfiguration(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
138            String userid = request.getRemoteUser();
139            LOG.debug("remoteUser: "+userid);
140            boolean error = false;
141    
142            Map<String, Object> model = new HashMap<String, Object>();
143    
144            // create preferences map here so that we can pass them all back to the view
145            HashMap<String, String> preferences  = new HashMap<String, String>();
146    
147            // Get DeliveryType classes.  loop through each deliverer type to 
148            // to obtain preferenceKeys.  Check to see if a matching request
149            // parameter was provided, then save a record for the userID, channelID, and 
150            // preferences setting
151            Collection<MessageDeliverer> deliveryTypes = this.messageDelivererRegistryService.getAllDeliverers();
152    
153            // first remove all configured user delivers for this user
154            this.recipientPreferenceService.removeRecipientDelivererConfigs(userid);        
155    
156            for (MessageDeliverer dt: deliveryTypes) {
157                String deliveryTypeName = dt.getName();
158                HashMap<String,String> prefMap = dt.getPreferenceKeys();
159                LOG.debug("deliveryName: "+deliveryTypeName);
160                HashMap<String, String> userprefs = new HashMap<String, String>();
161                for (String prefKey:prefMap.keySet()) {
162                    LOG.debug("   key: "+prefKey+", value: "+request.getParameter(deliveryTypeName+"."+prefKey));
163                    userprefs.put(deliveryTypeName+"."+prefKey, request.getParameter(deliveryTypeName+"."+prefKey ));
164                    preferences.put(deliveryTypeName+"."+prefKey, request.getParameter(deliveryTypeName+"."+prefKey ));
165                }
166                try {
167                    this.recipientPreferenceService.saveRecipientPreferences(userid, userprefs, dt);
168                } catch (ErrorList errorlist) {
169                    error = true;
170                    model.put("errorList", errorlist.getErrors()) ;
171                }
172    
173                // get channelName.channels
174                String[] channels = request.getParameterValues(deliveryTypeName+".channels");
175                if (channels != null && channels.length > 0) {
176                    for (int j=0; j < channels.length; j++) {
177                        LOG.debug(deliveryTypeName+".channels["+j+"] "+channels[j]);   
178                    }
179                }
180                //   now save the userid, channel selection
181                this.recipientPreferenceService.saveRecipientDelivererConfig(userid, deliveryTypeName, channels);
182            }
183    
184            // get all channels       
185            Collection<String> channels = getAllChannels();
186    
187            // get existing configured deliverers
188            Collection<RecipientDelivererConfig> currentDeliverers = this.recipientPreferenceService.getDeliverersForRecipient(userid);
189            Map<String, Object> currentDeliverersMap = new HashMap<String, Object>();
190            for (RecipientDelivererConfig udc: currentDeliverers) {
191                String channelId = udc.getChannel();
192                currentDeliverersMap.put(udc.getDelivererName()+"."+channelId, Boolean.TRUE);
193            }
194    
195            // use for debugging, uncomment for production
196            //LOG.info("CurrentDeliverersMap");
197            //Iterator iter = currentDeliverersMap.keySet().iterator();
198            //while (iter.hasNext()) {
199            //   Object o = iter.next();       
200            //   LOG.info("key: "+o.toString()+", value: "+ currentDeliverersMap.get(o) );
201            //}
202    
203            model.put("channels", channels);
204            model.put("deliveryTypes", deliveryTypes);
205            model.put("preferences", preferences);
206            model.put("currentDeliverersMap", currentDeliverersMap);
207            model.put("message", "Update Successful");
208    
209            return new ModelAndView(VIEW, model);
210        }
211    }