/** * 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: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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.calendar.mvc; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.TreeSet; import javax.portlet.PortletRequest; import javax.portlet.PortletSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jasig.portlet.calendar.CalendarConfiguration; import org.jasig.portlet.calendar.CalendarConfigurationByNameComparator; import org.jasig.portlet.calendar.CalendarSet; import org.jasig.portlet.calendar.adapter.CalendarEventsDao; import org.jasig.portlet.calendar.adapter.ICalendarAdapter; import org.jasig.portlet.calendar.adapter.UserFeedbackCalendarException; import org.jasig.portlet.calendar.dao.ICalendarSetDao; import org.joda.time.DateTimeZone; import org.joda.time.Interval; import org.springframework.beans.BeansException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** @author Chris Waymire (chris@waymire.net) */ @Component public class CalendarHelper implements ApplicationContextAware { protected static final Log log = LogFactory.getLog(CalendarHelper.class); @Autowired(required = true) private CalendarEventsDao calendarEventsDao; @Autowired(required = true) private ICalendarSetDao calendarSetDao; private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public Set<CalendarDisplayEvent> getEventList( final List<String> errors, final Interval interval, final PortletRequest request) { final PortletSession session = request.getPortletSession(); /* * Retrieve the calendar configurations defined for this user request * and sort them by display name. This sorting operation ensures that * the CSS color indices assigned to calendar events will be consistent * with the colors assigned in the main controller. */ // retrieve the calendars defined for this portlet instance CalendarSet<?> set = calendarSetDao.getCalendarSet(request); List<CalendarConfiguration> calendars = new ArrayList<CalendarConfiguration>(); calendars.addAll(set.getConfigurations()); // sort the calendars Collections.sort(calendars, new CalendarConfigurationByNameComparator()); // get the list of hidden calendars @SuppressWarnings("unchecked") HashMap<Long, String> hiddenCalendars = (HashMap<Long, String>) session.getAttribute("hiddenCalendars"); /* * For each unhidden calendar, get the list of associated events for * the requested time period. */ // get the user's configured time zone String timezone = (String) session.getAttribute("timezone"); DateTimeZone tz = DateTimeZone.forID(timezone); Set<CalendarDisplayEvent> events = new TreeSet<CalendarDisplayEvent>(); for (CalendarConfiguration callisting : calendars) { // don't bother to fetch hidden calendars if (hiddenCalendars.get(callisting.getId()) == null) { try { // get an instance of the adapter for this calendar ICalendarAdapter adapter = (ICalendarAdapter) applicationContext.getBean(callisting.getCalendarDefinition().getClassName()); events.addAll(calendarEventsDao.getEvents(adapter, callisting, interval, request, tz)); } catch (NoSuchBeanDefinitionException ex) { log.error("Calendar class instance could not be found: " + ex.getMessage()); } catch (UserFeedbackCalendarException sce) { // This CalendarException subclass carries a payload for the UI... StringBuilder msg = new StringBuilder(); msg.append(callisting.getCalendarDefinition().getName()) .append(": ") .append(sce.getUserFeedback()); errors.add(msg.toString()); } catch (Exception ex) { log.warn("Unknown Error", ex); errors.add( "The calendar \"" + callisting.getCalendarDefinition().getName() + "\" is currently unavailable."); } } } return events; } }