001package biweekly.property;
002
003import java.util.List;
004
005import biweekly.Warning;
006import biweekly.component.ICalComponent;
007
008/*
009 Copyright (c) 2013, Michael Angstadt
010 All rights reserved.
011
012 Redistribution and use in source and binary forms, with or without
013 modification, are permitted provided that the following conditions are met: 
014
015 1. Redistributions of source code must retain the above copyright notice, this
016 list of conditions and the following disclaimer. 
017 2. Redistributions in binary form must reproduce the above copyright notice,
018 this list of conditions and the following disclaimer in the documentation
019 and/or other materials provided with the distribution. 
020
021 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
022 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
023 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
024 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
025 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
026 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
027 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
028 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
029 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
030 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
031 */
032
033/**
034 * <p>
035 * Defines the min/max iCalendar versions a consumer must support in order to
036 * successfully parse the iCalendar object.
037 * </p>
038 * <p>
039 * <b>Code sample:</b>
040 * 
041 * <pre class="brush:java">
042 * ICalendar ical = new ICalendar();
043 * 
044 * //all ICalendar objects are given a VERSION property on creation
045 * ical.getVersion(); //&quot;2.0&quot;
046 * 
047 * //get the default iCal version
048 * Version version = Version.v2_0();
049 * ical.setVersion(version);
050 * </pre>
051 * 
052 * </p>
053 * @author Michael Angstadt
054 * @see <a href="http://tools.ietf.org/html/rfc5545#page-79">RFC 5545 p.79-80</a>
055 */
056public class Version extends ICalProperty {
057        private static final String DEFAULT = "2.0";
058
059        private String minVersion, maxVersion;
060
061        /**
062         * Creates a new version property.
063         * @param version the version that a consumer must support in order to
064         * successfully parse the iCalendar object
065         */
066        public Version(String version) {
067                this(null, version);
068        }
069
070        /**
071         * Creates a new version property.
072         * @param minVersion the minimum version that a consumer must support in
073         * order to successfully parse the iCalendar object
074         * @param maxVersion the maximum version that a consumer must support in
075         * order to successfully parse the iCalendar object
076         */
077        public Version(String minVersion, String maxVersion) {
078                this.minVersion = minVersion;
079                this.maxVersion = maxVersion;
080        }
081
082        /**
083         * Creates a version property that is set to the default iCalendar version
084         * (2.0).
085         * @return the property instance
086         */
087        public static Version v2_0() {
088                return new Version(DEFAULT);
089        }
090
091        /**
092         * Determines if this version is the default iCalendar version.
093         * @return true if the version is "2.0", false if not
094         */
095        public boolean isV2_0() {
096                return DEFAULT.equalsIgnoreCase(maxVersion);
097        }
098
099        /**
100         * Gets the minimum version that a consumer must support in order to
101         * successfully parse the iCalendar object.
102         * @return the minimum version or null if not set
103         */
104        public String getMinVersion() {
105                return minVersion;
106        }
107
108        /**
109         * Sets the minimum version that a consumer must support in order to
110         * successfully parse the iCalendar object.
111         * @param minVersion the minimum version or null to remove
112         */
113        public void setMinVersion(String minVersion) {
114                this.minVersion = minVersion;
115        }
116
117        /**
118         * Gets the maximum version that a consumer must support in order to
119         * successfully parse the iCalendar object.
120         * @return the maximum version or null if not set
121         */
122        public String getMaxVersion() {
123                return maxVersion;
124        }
125
126        /**
127         * Sets the maximum version that a consumer must support in order to
128         * successfully parse the iCalendar object.
129         * @param maxVersion the maximum version (this field is <b>required</b>)
130         */
131        public void setMaxVersion(String maxVersion) {
132                this.maxVersion = maxVersion;
133        }
134
135        @Override
136        protected void validate(List<ICalComponent> components, List<Warning> warnings) {
137                if (maxVersion == null) {
138                        warnings.add(Warning.validate(35));
139                }
140        }
141}