/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.calendar.util;
import com.google.ical.iter.RecurrenceIterator;
import com.google.ical.iter.RecurrenceIteratorFactory;
import com.google.ical.values.DateValue;
import com.google.ical.values.DateValueImpl;
import com.liferay.calendar.model.CalendarBooking;
import com.liferay.calendar.recurrence.Recurrence;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.TimeZoneUtil;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.TimeZone;
/**
* @author Adam Brandizzi
*/
public class CalendarBookingIterator implements Iterator<CalendarBooking> {
public CalendarBookingIterator(CalendarBooking calendarBooking)
throws ParseException {
_calendarBooking = calendarBooking;
_recurrenceIterator =
RecurrenceIteratorFactory.createRecurrenceIterator(
calendarBooking.getRecurrence(),
_toDateValue(calendarBooking.getStartTime()),
calendarBooking.getTimeZone());
}
@Override
public boolean hasNext() {
if (_recurrenceIterator.hasNext() && !_isExceededCount()) {
return true;
}
return false;
}
@Override
public CalendarBooking next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
CalendarBooking newCalendarBooking =
(CalendarBooking)_calendarBooking.clone();
_currentDateValue = _recurrenceIterator.next();
Calendar jCalendar = _getStartTimeJCalendar(_currentDateValue);
newCalendarBooking.setEndTime(
jCalendar.getTimeInMillis() + _calendarBooking.getDuration());
newCalendarBooking.setInstanceIndex(_instanceIndex);
newCalendarBooking.setStartTime(jCalendar.getTimeInMillis());
_instanceIndex++;
return newCalendarBooking;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
private Calendar _getStartTimeJCalendar(DateValue dateValue) {
Calendar jCalendar = JCalendarUtil.getJCalendar(
_calendarBooking.getStartTime(), _getTimeZone(_calendarBooking));
Calendar startTimeJCalendar = JCalendarUtil.getJCalendar(
dateValue.year(), dateValue.month() - 1, dateValue.day(),
jCalendar.get(Calendar.HOUR_OF_DAY), jCalendar.get(Calendar.MINUTE),
jCalendar.get(Calendar.SECOND), jCalendar.get(Calendar.MILLISECOND),
_getTimeZone(_calendarBooking));
TimeZone timeZone = _getTimeZone(_calendarBooking);
int shift = JCalendarUtil.getDSTShift(
jCalendar, startTimeJCalendar, timeZone);
startTimeJCalendar.add(Calendar.MILLISECOND, shift);
return startTimeJCalendar;
}
private TimeZone _getTimeZone(CalendarBooking calendarBooking) {
try {
if (calendarBooking.isAllDay()) {
return TimeZone.getTimeZone(StringPool.UTC);
}
return calendarBooking.getTimeZone();
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
}
return TimeZoneUtil.getDefault();
}
private boolean _isExceededCount() {
Recurrence recurrence = _calendarBooking.getRecurrenceObj();
if (recurrence == null) {
return false;
}
int count = recurrence.getCount();
if ((count != 0) && (_instanceIndex >= count)) {
return true;
}
return false;
}
private DateValue _toDateValue(long time) {
Calendar jCalendar = JCalendarUtil.getJCalendar(
time, _getTimeZone(_calendarBooking));
return new DateValueImpl(
jCalendar.get(Calendar.YEAR), jCalendar.get(Calendar.MONTH) + 1,
jCalendar.get(Calendar.DAY_OF_MONTH));
}
private static final Log _log = LogFactoryUtil.getLog(
CalendarBookingIterator.class);
private final CalendarBooking _calendarBooking;
private DateValue _currentDateValue;
private int _instanceIndex;
private final RecurrenceIterator _recurrenceIterator;
}