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.ken.web.spring;
017    
018    import java.io.IOException;
019    import java.util.Collection;
020    import java.util.HashMap;
021    import java.util.Iterator;
022    import java.util.Map;
023    
024    import javax.servlet.ServletException;
025    import javax.servlet.http.HttpServletRequest;
026    import javax.servlet.http.HttpServletResponse;
027    
028    import org.apache.log4j.Logger;
029    import org.kuali.rice.ken.bo.NotificationChannelBo;
030    import org.kuali.rice.ken.bo.UserChannelSubscriptionBo;
031    import org.kuali.rice.ken.service.NotificationChannelService;
032    import org.kuali.rice.ken.service.UserPreferenceService;
033    import org.springframework.web.servlet.ModelAndView;
034    import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
035    
036    /**
037     * This class is the controller that handles management of various user preferences interfaces (deliver types, user subscriptions, etc).
038     * @author Kuali Rice Team (rice.collab@kuali.org)
039     */
040    public class UserPreferencesController extends MultiActionController {
041        
042       private static String view = "";
043       
044       /** Logger for this class and subclasses */
045       private static final Logger LOG = Logger.getLogger(UserPreferencesController.class);
046       
047       protected NotificationChannelService notificationChannelService;
048       protected UserPreferenceService userPreferenceService;
049       protected Object notificationMessageDelivererRegistryService;
050    
051       
052       /**
053        * Set the NotificationChannelService
054        * @param notificationChannelService
055        */   
056       public void setNotificationChannelService(NotificationChannelService notificationChannelService) {
057          this.notificationChannelService = notificationChannelService;
058       }
059       
060       /**
061        * Set the UserPreferenceService
062        * @param userPreferenceService
063        */   
064       public void setUserPreferenceService(UserPreferenceService userPreferenceService) {
065          this.userPreferenceService = userPreferenceService;
066       }
067       
068       /**
069        * Set the NotificationMessageDelivererRegistryService
070        * @param notificationMessageDelivererRegistryService
071        */   
072       public void setNotificationMessageDelivererRegistryService(Object notificationMessageDelivererRegistryService) {
073          this.notificationMessageDelivererRegistryService = notificationMessageDelivererRegistryService;
074       }
075       
076       /**
077        * This method displays the actionList preferences screen.
078        * @param request
079        * @param response
080        * @return
081        * @throws ServletException
082        * @throws IOException
083        */
084       public ModelAndView displayActionListPreferences(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
085           view = "ActionListPreferences";
086           LOG.debug("remoteUser: "+request.getRemoteUser());
087           Map<String, Object> model = new HashMap<String, Object>(); 
088           return new ModelAndView(view, model);
089       }
090        
091       /**
092        * This method handles displaying the user preferences UI.
093        * @param request
094        * @param response
095        * @return
096        * @throws ServletException
097        * @throws IOException
098        */
099       public ModelAndView displayUserPreferences(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
100    
101          view = "UserPreferencesForm";
102          String userid = request.getRemoteUser();
103          LOG.debug("remoteUser: "+userid);
104          // get subscribable channels
105          Collection<NotificationChannelBo> channels = this.notificationChannelService.getSubscribableChannels();
106          // get current subscriptions for this user
107          Collection<UserChannelSubscriptionBo> subscriptions = this.userPreferenceService.getCurrentSubscriptions(userid);
108          Map<String, Object> currentsubs = new HashMap<String, Object>();
109          Iterator<UserChannelSubscriptionBo> i = subscriptions.iterator();
110          while (i.hasNext()) {
111              UserChannelSubscriptionBo sub = i.next();
112              String subid = Long.toString(sub.getChannel().getId());
113              currentsubs.put(subid, subid);
114              LOG.debug("currently subscribed to: "+sub.getChannel().getId());
115          }
116          Map<String, Object> model = new HashMap<String, Object>();
117          model.put("channels", channels);
118          model.put("currentsubs", currentsubs);
119          
120          return new ModelAndView(view, model);
121       }
122    
123       /**
124        * Subscribe To a Channel
125        * @param request
126        * @param response
127        * @return
128        * @throws ServletException
129        * @throws IOException
130       */
131       public ModelAndView subscribeToChannel(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
132    
133           view = "UserPreferencesForm";
134           String userid = request.getRemoteUser();
135           LOG.debug("remoteUser: "+userid);
136           String channelid = request.getParameter("channelid");
137           NotificationChannelBo newChannel = this.notificationChannelService.getNotificationChannel(channelid);
138           LOG.debug("newChannel name:"+newChannel.getName());
139           UserChannelSubscriptionBo newSub = new UserChannelSubscriptionBo();
140           newSub.setUserId(userid);
141           newSub.setChannel(newChannel);
142           LOG.debug("Calling service to subscribe to channel: "+newChannel.getName());
143           this.userPreferenceService.subscribeToChannel(newSub);
144           
145           // get current subscription channel ids
146           Collection<UserChannelSubscriptionBo> subscriptions = this.userPreferenceService.getCurrentSubscriptions(userid);
147           Map<String, Object> currentsubs = new HashMap<String, Object>();;
148           Iterator<UserChannelSubscriptionBo> i = subscriptions.iterator();
149           while (i.hasNext()) {
150              UserChannelSubscriptionBo sub = i.next();
151              String subid = Long.toString(sub.getChannel().getId());
152              currentsubs.put(subid, subid);
153              LOG.debug("currently subscribed to: "+sub.getChannel().getId());
154           }
155           
156           // get all subscribable channels       
157           Collection<NotificationChannelBo> channels = this.notificationChannelService.getSubscribableChannels();
158           
159           Map<String, Object> model = new HashMap<String, Object>();
160           model.put("channels", channels);
161           model.put("currentsubs", currentsubs);
162           return new ModelAndView(view, model);       
163       }
164       
165       /**
166        * Unsubscribe from Channel
167        * @param request
168        * @param response
169        * @return
170        * @throws ServletException
171        * @throws IOException
172        */
173       public ModelAndView unsubscribeFromChannel(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
174           view = "UserPreferencesForm";
175           String userid = request.getRemoteUser();
176           LOG.debug("remoteUser: "+userid);
177           String channelid = request.getParameter("channelid");
178           
179           NotificationChannelBo newChannel = this.notificationChannelService.getNotificationChannel(channelid);
180           LOG.debug("getting channel (id, user): "+channelid+","+userid); 
181           UserChannelSubscriptionBo oldsub = this.userPreferenceService.getSubscription(channelid, userid);
182           oldsub.setChannel(newChannel);
183           
184           LOG.debug("Calling service to unsubscribe: "+newChannel.getName());
185           this.userPreferenceService.unsubscribeFromChannel(oldsub);
186           LOG.debug("Finished unsubscribe service: "+newChannel.getName());
187           
188           // get current subscription channel ids
189           Collection<UserChannelSubscriptionBo> subscriptions = this.userPreferenceService.getCurrentSubscriptions(userid);
190           Map<String, Object> currentsubs = new HashMap<String, Object>();
191           Iterator<UserChannelSubscriptionBo> i = subscriptions.iterator();
192           while (i.hasNext()) {
193              UserChannelSubscriptionBo sub = i.next();
194              String subid = Long.toString(sub.getChannel().getId());
195              currentsubs.put(subid, subid);
196              LOG.debug("currently subscribed to: "+sub.getChannel().getId());
197           }
198           
199           // get all subscribable channels       
200           Collection<NotificationChannelBo> channels = this.notificationChannelService.getSubscribableChannels();
201           
202           Map<String, Object> model = new HashMap<String, Object>();
203           model.put("channels", channels);
204           model.put("currentsubs", currentsubs);
205           return new ModelAndView(view, model);    
206            
207       }
208    }