/** * Licensed to Apereo under one or more contributor license * agreements. See the NOTICE file distributed with this work * for additional information regarding copyright ownership. * Apereo licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a * copy of the License at the following location: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jasig.portlet.blackboardvcportlet.mvc.sessionmngr; import com.google.common.collect.Ordering; import static ch.lambdaj.Lambda.*; import net.sf.ehcache.search.expression.GreaterThan; import org.apache.commons.collections.ListUtils; import org.apache.commons.collections.SetUtils; import org.hamcrest.*; import org.jasig.portlet.blackboardvcportlet.dao.ConferenceUserDao; import org.jasig.portlet.blackboardvcportlet.dao.SessionDao; import org.jasig.portlet.blackboardvcportlet.data.ConferenceUser; import org.jasig.portlet.blackboardvcportlet.data.Session; import org.jasig.portlet.blackboardvcportlet.data.SessionRecording; import org.jasig.portlet.blackboardvcportlet.security.ConferenceUserService; import org.jasig.portlet.blackboardvcportlet.service.SessionService; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.portlet.bind.annotation.RenderMapping; import javax.portlet.PortletRequest; import javax.portlet.WindowState; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Controller for handling Portlet view mode * * @author Richard Good */ @Controller @RequestMapping("VIEW") public class ViewSessionListController { protected final Logger logger = LoggerFactory.getLogger(getClass()); private ConferenceUserService conferenceUserService; private SessionDao sessionDao; private SessionService sessionService; private ConferenceUserDao conferenceUserDao; @Autowired public void setConferenceUserService(ConferenceUserService conferenceUserService) { this.conferenceUserService = conferenceUserService; } @Autowired public void setSessionService(SessionService service) { this.sessionService = service; } @Autowired public void setSessionDao(SessionDao sessionDao) { this.sessionDao = sessionDao; } @Autowired public void setConferenceUserDao(ConferenceUserDao conferenceUserDao) { this.conferenceUserDao = conferenceUserDao; } @RenderMapping public String view(PortletRequest request, ModelMap model, @RequestParam(required = false) String deleteSessionError, @RequestParam(required = false) String deleteRecordingError) { final ConferenceUser conferenceUser = this.conferenceUserService.getCurrentConferenceUser(); //Get all the sessions for the user final Set<Session> sessions = new HashSet<Session>(); final Set<Session> ownedSessionsForUser = this.conferenceUserDao.getOwnedSessionsForUser(conferenceUser); sessions.addAll(ownedSessionsForUser); final Set<Session> chairedSessionsForUser = this.conferenceUserDao.getChairedSessionsForUser(conferenceUser); sessions.addAll(chairedSessionsForUser); final Set<Session> nonChairedSessionsForUser = this.conferenceUserDao.getNonChairedSessionsForUser(conferenceUser); sessions.addAll(nonChairedSessionsForUser); Matcher<DateTime> afterNow = new BaseMatcher<DateTime>() { @Override public void describeTo(Description arg0) { //don't care } @Override public boolean matches(Object arg0) { DateTime now = DateTime.now(); DateTime arg = (DateTime)arg0; return arg.isAfter(now); } }; Matcher<DateTime> beforeOrIsNow = new BaseMatcher<DateTime>() { @Override public void describeTo(Description arg0) { //don't care } @Override public boolean matches(Object arg0) { DateTime now = DateTime.now(); DateTime arg = (DateTime)arg0; return arg.isBefore(now) || arg.isEqualNow(); } }; //this.is.awesome! List<Session> upcomingSessions = filter(having(on(Session.class).getEndTime(),afterNow),sessions); List<Session> completedSessions = filter(having(on(Session.class).getEndTime(),beforeOrIsNow),sessions); model.addAttribute("completedSessions", Ordering.from(SessionDisplayComparator.INSTANCE).sortedCopy(completedSessions)); model.addAttribute("upcomingSessions", Ordering.from(SessionDisplayComparator.INSTANCE).sortedCopy(upcomingSessions)); if (deleteSessionError != null) { model.addAttribute("deleteSessionError", deleteSessionError); } if (deleteRecordingError != null) { model.addAttribute("deleteRecordingError", deleteRecordingError); } final Set<SessionRecording> recordings = new HashSet<SessionRecording>(); for (final Session session : sessions) { //Get information for all sessions final Set<SessionRecording> sessionRecordings = this.sessionDao.getSessionRecordings(session); recordings.addAll(sessionRecordings); //get launch URL sessionService.populateLaunchUrl(conferenceUser, session); } model.addAttribute("recordings", Ordering.from(SessionRecordingDisplayComparator.INSTANCE).sortedCopy(recordings)); if(WindowState.MAXIMIZED.equals(request.getWindowState())) { return "viewSessionsMax"; } else { return "viewSessionsNormal"; } } }