src/net/fortuna/ical4j/model/property/RDate.java

Tue, 10 Feb 2015 18:12:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 10 Feb 2015 18:12:00 +0100
changeset 0
fb9019fb1bf7
permissions
-rw-r--r--

Import initial revisions of existing project AndroidCaldavSyncAdapater,
forked from upstream repository at 27e8a0f8495c92e0780d450bdf0c7cec77a03a55.

     1 /**
     2  * Copyright (c) 2012, Ben Fortuna
     3  * All rights reserved.
     4  *
     5  * Redistribution and use in source and binary forms, with or without
     6  * modification, are permitted provided that the following conditions
     7  * are met:
     8  *
     9  *  o Redistributions of source code must retain the above copyright
    10  * notice, this list of conditions and the following disclaimer.
    11  *
    12  *  o Redistributions in binary form must reproduce the above copyright
    13  * notice, this list of conditions and the following disclaimer in the
    14  * documentation and/or other materials provided with the distribution.
    15  *
    16  *  o Neither the name of Ben Fortuna nor the names of any other contributors
    17  * may be used to endorse or promote products derived from this software
    18  * without specific prior written permission.
    19  *
    20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
    24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    31  */
    32 package net.fortuna.ical4j.model.property;
    34 import java.text.ParseException;
    36 import net.fortuna.ical4j.model.DateList;
    37 import net.fortuna.ical4j.model.Parameter;
    38 import net.fortuna.ical4j.model.ParameterList;
    39 import net.fortuna.ical4j.model.PeriodList;
    40 import net.fortuna.ical4j.model.PropertyFactoryImpl;
    41 import net.fortuna.ical4j.model.TimeZone;
    42 import net.fortuna.ical4j.model.ValidationException;
    43 import net.fortuna.ical4j.model.parameter.Value;
    44 import net.fortuna.ical4j.util.ParameterValidator;
    45 import net.fortuna.ical4j.util.Strings;
    47 /**
    48  * $Id$
    49  * 
    50  * Created: [Apr 6, 2004]
    51  *
    52  * Defines an RDATE iCalendar component property.
    53  * 
    54  * <pre>
    55  *     4.8.5.3 Recurrence Date/Times
    56  *     
    57  *        Property Name: RDATE
    58  *     
    59  *        Purpose: This property defines the list of date/times for a
    60  *        recurrence set.
    61  *     
    62  *        Value Type: The default value type for this property is DATE-TIME.
    63  *        The value type can be set to DATE or PERIOD.
    64  *     
    65  *        Property Parameters: Non-standard, value data type and time zone
    66  *        identifier property parameters can be specified on this property.
    67  *     
    68  *        Conformance: The property can be specified in &quot;VEVENT&quot;, &quot;VTODO&quot;,
    69  *        &quot;VJOURNAL&quot; or &quot;VTIMEZONE&quot; calendar components.
    70  *     
    71  *        Description: This property can appear along with the &quot;RRULE&quot; property
    72  *        to define an aggregate set of repeating occurrences. When they both
    73  *        appear in an iCalendar object, the recurring events are defined by
    74  *        the union of occurrences defined by both the &quot;RDATE&quot; and &quot;RRULE&quot;.
    75  *     
    76  *        The recurrence dates, if specified, are used in computing the
    77  *        recurrence set. The recurrence set is the complete set of recurrence
    78  *        instances for a calendar component. The recurrence set is generated
    79  *        by considering the initial &quot;DTSTART&quot; property along with the &quot;RRULE&quot;,
    80  *        &quot;RDATE&quot;, &quot;EXDATE&quot; and &quot;EXRULE&quot; properties contained within the
    81  *        iCalendar object. The &quot;DTSTART&quot; property defines the first instance
    82  *        in the recurrence set. Multiple instances of the &quot;RRULE&quot; and &quot;EXRULE&quot;
    83  *        properties can also be specified to define more sophisticated
    84  *        recurrence sets. The final recurrence set is generated by gathering
    85  *        all of the start date/times generated by any of the specified &quot;RRULE&quot;
    86  *        and &quot;RDATE&quot; properties, and excluding any start date/times which fall
    87  *        within the union of start date/times generated by any specified
    88  *        &quot;EXRULE&quot; and &quot;EXDATE&quot; properties. This implies that start date/times
    89  *        within exclusion related properties (i.e., &quot;EXDATE&quot; and &quot;EXRULE&quot;)
    90  *        take precedence over those specified by inclusion properties (i.e.,
    91  *        &quot;RDATE&quot; and &quot;RRULE&quot;). Where duplicate instances are generated by the
    92  *        &quot;RRULE&quot; and &quot;RDATE&quot; properties, only one recurrence is considered.
    93  *        Duplicate instances are ignored.
    94  *     
    95  *        Format Definition: The property is defined by the following notation:
    96  *     
    97  *          rdate      = &quot;RDATE&quot; rdtparam &quot;:&quot; rdtval *(&quot;,&quot; rdtval) CRLF
    98  *     
    99  *          rdtparam   = *(
   100  *     
   101  *                     ; the following are optional,
   102  *                     ; but MUST NOT occur more than once
   103  *     
   104  *                     (&quot;;&quot; &quot;VALUE&quot; &quot;=&quot; (&quot;DATE-TIME&quot;
   105  *                      / &quot;DATE&quot; / &quot;PERIOD&quot;)) /
   106  *                     (&quot;;&quot; tzidparam) /
   107  *     
   108  *                     ; the following is optional,
   109  *                     ; and MAY occur more than once
   110  *     
   111  *                     (&quot;;&quot; xparam)
   112  *     
   113  *                     )
   114  *     
   115  *          rdtval     = date-time / date / period
   116  *          ;Value MUST match value type
   117  *     
   118  *        Example: The following are examples of this property:
   119  *     
   120  *          RDATE:19970714T123000Z
   121  *     
   122  *          RDATE;TZID=US-EASTERN:19970714T083000
   123  *     
   124  *          RDATE;VALUE=PERIOD:19960403T020000Z/19960403T040000Z,
   125  *           19960404T010000Z/PT3H
   126  *     
   127  *          RDATE;VALUE=DATE:19970101,19970120,19970217,19970421
   128  *           19970526,19970704,19970901,19971014,19971128,19971129,19971225
   129  * </pre>
   130  * 
   131  * @author Ben Fortuna
   132  */
   133 public class RDate extends DateListProperty {
   135     private static final long serialVersionUID = -3320381650013860193L;
   137     private PeriodList periods;
   139     /**
   140      * Default constructor.
   141      */
   142     public RDate() {
   143         super(RDATE, PropertyFactoryImpl.getInstance());
   144         periods = new PeriodList(false, true);
   145     }
   147     /**
   148      * @param aList a list of parameters for this component
   149      * @param aValue a value string for this component
   150      * @throws ParseException where the specified value string is not a valid date-time/date representation
   151      */
   152     public RDate(final ParameterList aList, final String aValue)
   153             throws ParseException {
   154         super(RDATE, aList, PropertyFactoryImpl.getInstance());
   155         periods = new PeriodList(false, true);
   156         setValue(aValue);
   157     }
   159     /**
   160      * Constructor. Date or Date-Time format is determined based on the presence of a VALUE parameter.
   161      * @param dates a list of dates
   162      */
   163     public RDate(final DateList dates) {
   164         super(RDATE, dates, PropertyFactoryImpl.getInstance());
   165         periods = new PeriodList(false, true);
   166     }
   168     /**
   169      * Constructor. Date or Date-Time format is determined based on the presence of a VALUE parameter.
   170      * @param aList a list of parameters for this component
   171      * @param dates a list of dates
   172      */
   173     public RDate(final ParameterList aList, final DateList dates) {
   174         super(RDATE, aList, dates, PropertyFactoryImpl.getInstance());
   175         periods = new PeriodList(false, true);
   176     }
   178     /**
   179      * Constructor.
   180      * @param periods a list of periods
   181      */
   182     public RDate(final PeriodList periods) {
   183         super(RDATE, new DateList(true), PropertyFactoryImpl.getInstance());
   184         this.periods = periods;
   185     }
   187     /**
   188      * Constructor.
   189      * @param aList a list of parameters for this component
   190      * @param periods a list of periods
   191      */
   192     public RDate(final ParameterList aList, final PeriodList periods) {
   193         super(RDATE, aList, new DateList(true), PropertyFactoryImpl.getInstance());
   194         this.periods = periods;
   195     }
   197     /**
   198      * {@inheritDoc}
   199      */
   200     public final void validate() throws ValidationException {
   202         /*
   203          * ; the following are optional, ; but MUST NOT occur more than once (";" "VALUE" "=" ("DATE-TIME" / "DATE" /
   204          * "PERIOD")) / (";" tzidparam) /
   205          */
   206         ParameterValidator.getInstance().assertOneOrLess(Parameter.VALUE,
   207                 getParameters());
   209         final Parameter valueParam = getParameter(Parameter.VALUE);
   211         if (valueParam != null && !Value.DATE_TIME.equals(valueParam)
   212                 && !Value.DATE.equals(valueParam)
   213                 && !Value.PERIOD.equals(valueParam)) {
   214             throw new ValidationException("Parameter [" + Parameter.VALUE
   215                     + "] is invalid");
   216         }
   218         ParameterValidator.getInstance().assertOneOrLess(Parameter.TZID,
   219                 getParameters());
   221         /*
   222          * ; the following is optional, ; and MAY occur more than once (";" xparam)
   223          */
   224     }
   226     /**
   227      * @return Returns the period list.
   228      */
   229     public final PeriodList getPeriods() {
   230         return periods;
   231     }
   233     /**
   234      * {@inheritDoc}
   235      */
   236     public final void setValue(final String aValue) throws ParseException {
   237         if (Value.PERIOD.equals(getParameter(Parameter.VALUE))) {
   238             periods = new PeriodList(aValue);
   239         }
   240         else {
   241             super.setValue(aValue);
   242         }
   243     }
   245     /**
   246      * {@inheritDoc}
   247      */
   248     public final String getValue() {
   249         if (periods != null && !(periods.isEmpty() && periods.isUnmodifiable())) {
   250             return Strings.valueOf(getPeriods());
   251         }
   252         return super.getValue();
   253     }
   255     /**
   256      * {@inheritDoc}
   257      */
   258     public final void setTimeZone(TimeZone timezone) {
   259         if (periods != null && !(periods.isEmpty() && periods.isUnmodifiable())) {
   260             periods.setTimeZone(timezone);
   261         }
   262         else {
   263             super.setTimeZone(timezone);
   264         }
   265     }
   266 }

mercurial