/******************************************************************************* * Copyright (c) 2010 Denis Solonenko. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Denis Solonenko - initial API and implementation ******************************************************************************/ package ru.orangesoftware.financisto2.recur; import com.google.ical.util.TimeUtils; import com.google.ical.values.*; import ru.orangesoftware.financisto2.datetime.DateUtils; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; public class RecurrencePeriod { public final RecurrenceUntil until; public final String params; public RecurrencePeriod(RecurrenceUntil until, String params) { this.until = until; this.params = params; } public static RecurrencePeriod noEndDate() { return new RecurrencePeriod(RecurrenceUntil.INDEFINETELY, null); } public static RecurrencePeriod empty(RecurrenceUntil until) { return new RecurrencePeriod(until, null); } public static RecurrencePeriod parse(String string) { String[] a = string.split(":"); return new RecurrencePeriod(RecurrenceUntil.valueOf(a[0]), a[1]); } public String stateToString() { return until.name()+":"+params; } public void updateRRule(RRule r, Calendar startDate) { HashMap<String, String> state = RecurrenceViewFactory.parseState(params); switch (until) { case EXACTLY_TIMES: int count = Integer.parseInt(state.get(RecurrenceViewFactory.P_COUNT)); r.setCount(count); break; case STOPS_ON_DATE: Calendar c = Calendar.getInstance(); String stopsOnDate = state.get(RecurrenceViewFactory.P_DATE); try { c.setTime(DateUtils.FORMAT_DATE_RFC_2445.parse(stopsOnDate)); c.set(Calendar.HOUR_OF_DAY, startDate.get(Calendar.HOUR_OF_DAY)); c.set(Calendar.MINUTE, startDate.get(Calendar.MINUTE)); c.set(Calendar.SECOND, startDate.get(Calendar.SECOND)); c.set(Calendar.MILLISECOND, 0); } catch (ParseException e) { throw new IllegalArgumentException(params); } r.setUntil(dateToDateValue(c.getTime())); break; } } static Date dateValueToDate(DateValue dvUtc) { GregorianCalendar c = new GregorianCalendar(TimeUtils.utcTimezone()); c.clear(); if (dvUtc instanceof TimeValue) { TimeValue tvUtc = (TimeValue) dvUtc; c.set(dvUtc.year(), dvUtc.month() - 1, // java.util's dates are zero-indexed dvUtc.day(), tvUtc.hour(), tvUtc.minute(), tvUtc.second()); } else { c.set(dvUtc.year(), dvUtc.month() - 1, // java.util's dates are zero-indexed dvUtc.day(), 0, 0, 0); } return c.getTime(); } static DateValue dateToDateValue(Date date) { GregorianCalendar c = new GregorianCalendar(TimeUtils.utcTimezone()); c.setTime(date); int h = c.get(Calendar.HOUR_OF_DAY), m = c.get(Calendar.MINUTE), s = c.get(Calendar.SECOND); if (0 == (h | m | s)) { return new DateValueImpl(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH)); } else { return new DateTimeValueImpl(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH), h, m, s); } } }