@RequestMapping(value = "/listEvents", method = RequestMethod.GET)
  public String listEvents(
      HttpServletRequest request,
      Model uiModel,
      @RequestParam(required = true) String date,
      @RequestParam(required = true) String beginDate,
      @RequestParam(required = true) String endDate) {
    User user = (User) request.getSession().getAttribute(Constants.KME_USER_KEY);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    Calendar selectedDate = Calendar.getInstance();
    Calendar beginCalendar = Calendar.getInstance();
    Calendar endCalendar = Calendar.getInstance();
    try {
      if (date != null) {
        selectedDate.setTime(sdf.parse(date));
      }
      if (beginDate != null) {
        beginCalendar.setTime(sdf.parse(beginDate));
      }
      if (endDate != null) {
        endCalendar.setTime(sdf.parse(endDate));
      }
    } catch (ParseException e) {
      return list(request, uiModel, date);
    }
    try {
      Filter filter = (Filter) request.getSession().getAttribute("calendar.event.filterId");
      ListViewEvents listViewEvents =
          calendarEventOAuthService.retrieveViewEventsList(
              user.getUserId(),
              selectedDate.getTime(),
              beginCalendar.getTime(),
              endCalendar.getTime(),
              filter != null ? filter.getFilterId() : null);

      Calendar currentEndDate = (Calendar) endCalendar.clone();
      Calendar previousDate = (Calendar) beginCalendar.clone();
      previousDate.add(Calendar.DATE, -listViewEvents.getAppData().getListViewFutureDaysLimit());
      endCalendar.add(Calendar.DATE, listViewEvents.getAppData().getListViewFutureDaysLimit());

      SimpleDateFormat my = new SimpleDateFormat("yyyyMM");
      uiModel.addAttribute("selectedDate", sdf.format(selectedDate.getTime()));
      uiModel.addAttribute("monthSelectedDate", my.format(selectedDate.getTime()));
      uiModel.addAttribute("beginDate", sdf.format(beginCalendar.getTime()));
      uiModel.addAttribute("endDate", sdf.format(endCalendar.getTime()));
      uiModel.addAttribute("currentEndDate", sdf.format(currentEndDate.getTime()));
      uiModel.addAttribute("previousDate", sdf.format(previousDate.getTime()));
      uiModel.addAttribute("days", listViewEvents.getAppData().getListViewFutureDaysLimit());
      uiModel.addAttribute("viewData", listViewEvents.getViewData());
      uiModel.addAttribute("appData", listViewEvents.getAppData());
      uiModel.addAttribute("events", listViewEvents.getEvents());
      uiModel.addAttribute("filter", filter);
    } catch (PageLevelException pageLevelException) {
      uiModel.addAttribute("message", pageLevelException.getMessage());
      return "calendar/message";
    }
    return "calendar/list";
  }
 @RequestMapping(value = "/selectFilter", method = RequestMethod.POST)
 public String selectFilter(
     HttpServletRequest request, Model uiModel, @ModelAttribute("filter") Filter filter) {
   User user = (User) request.getSession().getAttribute(Constants.KME_USER_KEY);
   try {
     if (filter.getFilterId() != null && !"".equals(filter.getFilterId().trim())) {
       Filter filterFound =
           calendarEventOAuthService.retrieveFilter(user.getUserId(), filter.getFilterId());
       request.getSession().setAttribute("calendar.event.filterId", filterFound);
     }
   } catch (PageLevelException pageLevelException) {
     uiModel.addAttribute("message", pageLevelException.getMessage());
     return "calendar/message";
   }
   return "redirect:/calendar/options";
 }
  @RequestMapping(value = "/month", method = RequestMethod.GET)
  public String month(
      HttpServletRequest request, Model uiModel, @RequestParam(required = false) String date) {
    User user = (User) request.getSession().getAttribute(Constants.KME_USER_KEY);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    SimpleDateFormat my = new SimpleDateFormat("yyyyMM");
    Calendar selectedDate = Calendar.getInstance();
    try {
      if (date != null) {
        selectedDate.setTime(my.parse(date));
      }
    } catch (ParseException e) {

    }
    try {
      Filter filter = (Filter) request.getSession().getAttribute("calendar.event.filterId");
      MonthViewEvents monthEvents =
          calendarEventOAuthService.retrieveMonthEvents(
              user.getUserId(),
              selectedDate.getTime(),
              filter != null ? filter.getFilterId() : null);
      uiModel.addAttribute("viewData", monthEvents.getViewData());
      uiModel.addAttribute("appData", monthEvents.getAppData());

      int days = selectedDate.getActualMaximum(Calendar.DATE);

      Calendar startDate = (Calendar) selectedDate.clone();
      startDate.set(Calendar.DATE, selectedDate.getActualMinimum(Calendar.DATE));
      days += startDate.get(Calendar.DAY_OF_WEEK) - 1;

      Calendar endDate = (Calendar) selectedDate.clone();
      endDate.set(Calendar.DATE, selectedDate.getActualMaximum(Calendar.DATE));
      days += 7 - endDate.get(Calendar.DAY_OF_WEEK);

      startDate.set(Calendar.DAY_OF_WEEK, 1);
      Map<String, MobileDayOfMonth> daysInMonth = new LinkedHashMap<String, MobileDayOfMonth>();

      uiModel.addAttribute("selectedDate", sdf.format(selectedDate.getTime()));
      for (int i = 0; i < days; i++) {
        MobileDayOfMonth mobileDayOfMonth = new MobileDayOfMonth(startDate.get(Calendar.DATE));
        mobileDayOfMonth.setCurrentMonth(
            startDate.get(Calendar.MONTH) == selectedDate.get(Calendar.MONTH));
        if (!mobileDayOfMonth.isCurrentMonth()) {
          mobileDayOfMonth.setBeforeCurrentMonth(
              startDate.get(Calendar.MONTH) < selectedDate.get(Calendar.MONTH));
        }
        mobileDayOfMonth.setMonthYear(my.format(startDate.getTime()));
        mobileDayOfMonth.setDayOfWeek(startDate.get(Calendar.DAY_OF_WEEK));
        daysInMonth.put(sdf.format(startDate.getTime()), mobileDayOfMonth);
        startDate.add(Calendar.DATE, 1);
      }

      for (Iterator iterator = monthEvents.getEvents().entrySet().iterator();
          iterator.hasNext(); ) {
        Map.Entry<String, List<CalendarViewEvent>> entry =
            (Map.Entry<String, List<CalendarViewEvent>>) iterator.next();
        MobileDayOfMonth dayInMonth = daysInMonth.get(entry.getKey());
        dayInMonth.setHasEvents(true);
        dayInMonth.setEvents(entry.getValue());
      }
      uiModel.addAttribute("events", daysInMonth);

      Calendar previousCalendar = (Calendar) selectedDate.clone();
      previousCalendar.set(Calendar.DATE, 1);
      previousCalendar.getTime();
      previousCalendar.add(Calendar.MONTH, -1);

      Calendar nextCalendar = (Calendar) selectedDate.clone();
      nextCalendar.set(Calendar.DATE, 1);
      nextCalendar.getTime();
      nextCalendar.add(Calendar.MONTH, 1);

      uiModel.addAttribute("previousMonth", my.format(previousCalendar.getTime()));
      uiModel.addAttribute("nextMonth", my.format(nextCalendar.getTime()));
      uiModel.addAttribute("monthYear", my.format(selectedDate.getTime()));
      uiModel.addAttribute("today", sdf.format(new Date()));
      uiModel.addAttribute("filter", filter);
    } catch (PageLevelException pageLevelException) {
      uiModel.addAttribute("message", pageLevelException.getMessage());
      return "calendar/message";
    }
    return "calendar/month";
  }