org.jasig.portlet.calendar.mvc.CalendarHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.jasig.portlet.calendar.mvc.CalendarHelper.java

Source

/**
 * 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.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;
    }
}