diff -r 5ae3e5665a0b -r cc93757aeca3 src/net/fortuna/ical4j/model/component/VTimeZone.java --- a/src/net/fortuna/ical4j/model/component/VTimeZone.java Thu Feb 12 18:02:00 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,378 +0,0 @@ -/** - * Copyright (c) 2012, Ben Fortuna - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * o Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * o Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * o Neither the name of Ben Fortuna nor the names of any other contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.fortuna.ical4j.model.component; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.text.ParseException; -import java.util.Iterator; - -import net.fortuna.ical4j.model.Component; -import net.fortuna.ical4j.model.ComponentList; -import net.fortuna.ical4j.model.Date; -import net.fortuna.ical4j.model.Property; -import net.fortuna.ical4j.model.PropertyList; -import net.fortuna.ical4j.model.ValidationException; -import net.fortuna.ical4j.model.Validator; -import net.fortuna.ical4j.model.property.LastModified; -import net.fortuna.ical4j.model.property.Method; -import net.fortuna.ical4j.model.property.TzId; -import net.fortuna.ical4j.model.property.TzUrl; -import net.fortuna.ical4j.util.PropertyValidator; -import net.fortuna.ical4j.util.Strings; - -import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -/** - * $Id$ [Apr 5, 2004] - * - * Defines an iCalendar VTIMEZONE component. - * - *
- * 4.6.5 Time Zone Component - * - * Component Name: VTIMEZONE - * - * Purpose: Provide a grouping of component properties that defines a - * time zone. - * - * Formal Definition: A "VTIMEZONE" calendar component is defined by the - * following notation: - * - * timezonec = "BEGIN" ":" "VTIMEZONE" CRLF - * - * 2*( - * - * ; 'tzid' is required, but MUST NOT occur more - * ; than once - * - * tzid / - * - * ; 'last-mod' and 'tzurl' are optional, - * but MUST NOT occur more than once - * - * last-mod / tzurl / - * - * ; one of 'standardc' or 'daylightc' MUST occur - * ..; and each MAY occur more than once. - * - * standardc / daylightc / - * - * ; the following is optional, - * ; and MAY occur more than once - * - * x-prop - * - * ) - * - * "END" ":" "VTIMEZONE" CRLF - * - * standardc = "BEGIN" ":" "STANDARD" CRLF - * - * tzprop - * - * "END" ":" "STANDARD" CRLF - * - * daylightc = "BEGIN" ":" "DAYLIGHT" CRLF - * - * tzprop - * - * "END" ":" "DAYLIGHT" CRLF - * - * tzprop = 3*( - * - * ; the following are each REQUIRED, - * ; but MUST NOT occur more than once - * - * dtstart / tzoffsetto / tzoffsetfrom / - * - * ; the following are optional, - * ; and MAY occur more than once - * - * comment / rdate / rrule / tzname / x-prop - * - * ) - *- * - * @author Ben Fortuna - */ -public class VTimeZone extends CalendarComponent { - - private static final long serialVersionUID = 5629679741050917815L; - - private final Validator itipValidator = new ITIPValidator(); - - private ComponentList observances; - - /** - * Default constructor. - */ - public VTimeZone() { - super(VTIMEZONE); - this.observances = new ComponentList(); - } - - /** - * Constructs a new instance containing the specified properties. - * @param properties a list of properties - */ - public VTimeZone(final PropertyList properties) { - super(VTIMEZONE, properties); - this.observances = new ComponentList(); - } - - /** - * Constructs a new vtimezone component with no properties and the specified list of type components. - * @param observances a list of type components - */ - public VTimeZone(final ComponentList observances) { - super(VTIMEZONE); - this.observances = observances; - } - - /** - * Constructor. - * @param properties a list of properties - * @param observances a list of timezone types - */ - public VTimeZone(final PropertyList properties, - final ComponentList observances) { - super(VTIMEZONE, properties); - this.observances = observances; - } - - /** - * {@inheritDoc} - */ - public final String toString() { - final StringBuffer b = new StringBuffer(); - b.append(BEGIN); - b.append(':'); - b.append(getName()); - b.append(Strings.LINE_SEPARATOR); - b.append(getProperties()); - b.append(observances); - b.append(END); - b.append(':'); - b.append(getName()); - b.append(Strings.LINE_SEPARATOR); - return b.toString(); - } - - /** - * {@inheritDoc} - */ - public final void validate(final boolean recurse) - throws ValidationException { - - /* - * ; 'tzid' is required, but MUST NOT occur more ; than once tzid / - */ - PropertyValidator.getInstance().assertOne(Property.TZID, - getProperties()); - - /* - * ; 'last-mod' and 'tzurl' are optional, but MUST NOT occur more than once last-mod / tzurl / - */ - PropertyValidator.getInstance().assertOneOrLess(Property.LAST_MODIFIED, - getProperties()); - PropertyValidator.getInstance().assertOneOrLess(Property.TZURL, - getProperties()); - - /* - * ; one of 'standardc' or 'daylightc' MUST occur ..; and each MAY occur more than once. standardc / daylightc / - */ - if (getObservances().getComponent(Observance.STANDARD) == null - && getObservances().getComponent(Observance.DAYLIGHT) == null) { - throw new ValidationException("Sub-components [" - + Observance.STANDARD + "," + Observance.DAYLIGHT - + "] must be specified at least once"); - } - - for (final Iterator i = getObservances().iterator(); i.hasNext();) { - ((Component) i.next()).validate(recurse); - } - - /* - * ; the following is optional, ; and MAY occur more than once x-prop - */ - - if (recurse) { - validateProperties(); - } - } - - /** - * {@inheritDoc} - */ - protected Validator getValidator(Method method) { - return itipValidator; - } - - /** - * Common validation for all iTIP methods. - * - *
- * Component/Property Presence - * ------------------- ---------------------------------------------- - * VTIMEZONE 0+ MUST be present if any date/time refers - * to timezone - * DAYLIGHT 0+ MUST be one or more of either STANDARD or - * DAYLIGHT - * COMMENT 0 or 1 - * DTSTART 1 MUST be local time format - * RDATE 0+ if present RRULE MUST NOT be present - * RRULE 0+ if present RDATE MUST NOT be present - * TZNAME 0 or 1 - * TZOFFSET 1 - * TZOFFSETFROM 1 - * TZOFFSETTO 1 - * X-PROPERTY 0+ - * LAST-MODIFIED 0 or 1 - * STANDARD 0+ MUST be one or more of either STANDARD or - * DAYLIGHT - * COMMENT 0 or 1 - * DTSTART 1 MUST be local time format - * RDATE 0+ if present RRULE MUST NOT be present - * RRULE 0+ if present RDATE MUST NOT be present - * TZNAME 0 or 1 - * TZOFFSETFROM 1 - * TZOFFSETTO 1 - * X-PROPERTY 0+ - * TZID 1 - * TZURL 0 or 1 - * X-PROPERTY 0+ - *- */ - private class ITIPValidator implements Validator { - - private static final long serialVersionUID = 1L; - - /** - * {@inheritDoc} - */ - public void validate() throws ValidationException { - for (final Iterator i = getObservances().iterator(); i.hasNext();) { - final Observance observance = (Observance) i.next(); - PropertyValidator.getInstance().assertOne(Property.DTSTART, observance.getProperties()); - PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, observance.getProperties()); - PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, observance.getProperties()); - - PropertyValidator.getInstance().assertOneOrLess(Property.TZNAME, observance.getProperties()); - } - } - } - - /** - * @return Returns the types. - */ - public final ComponentList getObservances() { - return observances; - } - - /** - * Returns the latest applicable timezone observance for the specified date. - * @param date the latest possible date for a timezone observance onset - * @return the latest applicable timezone observance for the specified date or null if there are no applicable - * observances - */ - public final Observance getApplicableObservance(final Date date) { - Observance latestObservance = null; - Date latestOnset = null; - for (final Iterator i = getObservances().iterator(); i.hasNext();) { - final Observance observance = (Observance) i.next(); - final Date onset = observance.getLatestOnset(date); - if (latestOnset == null - || (onset != null && onset.after(latestOnset))) { - latestOnset = onset; - latestObservance = observance; - } - } - return latestObservance; - } - - /** - * @return the mandatory timezone identifier property - */ - public final TzId getTimeZoneId() { - return (TzId) getProperty(Property.TZID); - } - - /** - * @return the optional last-modified property - */ - public final LastModified getLastModified() { - return (LastModified) getProperty(Property.LAST_MODIFIED); - } - - /** - * @return the optional timezone url property - */ - public final TzUrl getTimeZoneUrl() { - return (TzUrl) getProperty(Property.TZURL); - } - - /** - * {@inheritDoc} - */ - public boolean equals(final Object arg0) { - if (arg0 instanceof VTimeZone) { - return super.equals(arg0) - && ObjectUtils.equals(observances, ((VTimeZone) arg0) - .getObservances()); - } - return super.equals(arg0); - } - - /** - * {@inheritDoc} - */ - public int hashCode() { - return new HashCodeBuilder().append(getName()).append(getProperties()) - .append(getObservances()).toHashCode(); - } - - /** - * Overrides default copy method to add support for copying observance sub-components. - * @return a copy of the instance - * @throws ParseException where an error occurs parsing data - * @throws IOException where an error occurs reading data - * @throws URISyntaxException where an invalid URI is encountered - * @see net.fortuna.ical4j.model.Component#copy() - */ - public Component copy() throws ParseException, IOException, URISyntaxException { - final VTimeZone copy = (VTimeZone) super.copy(); - copy.observances = new ComponentList(observances); - return copy; - } -}