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 }