001 package ezvcard.property;
002
003 import java.util.Date;
004 import java.util.List;
005
006 import ezvcard.VCard;
007 import ezvcard.VCardVersion;
008 import ezvcard.Warning;
009 import ezvcard.parameter.Calscale;
010 import ezvcard.parameter.VCardParameters;
011 import ezvcard.util.PartialDate;
012
013 /*
014 Copyright (c) 2013, Michael Angstadt
015 All rights reserved.
016
017 Redistribution and use in source and binary forms, with or without
018 modification, are permitted provided that the following conditions are met:
019
020 1. Redistributions of source code must retain the above copyright notice, this
021 list of conditions and the following disclaimer.
022 2. Redistributions in binary form must reproduce the above copyright notice,
023 this list of conditions and the following disclaimer in the documentation
024 and/or other materials provided with the distribution.
025
026 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
027 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
028 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
029 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
030 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
031 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
032 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
033 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
034 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
035 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
036
037 The views and conclusions contained in the software and documentation are those
038 of the authors and should not be interpreted as representing official policies,
039 either expressed or implied, of the FreeBSD Project.
040 */
041
042 /**
043 * Represents a property whose value contains a date and/or a time (for example,
044 * {@link Birthday}).
045 * @author Michael Angstadt
046 */
047 public class DateOrTimeProperty extends VCardProperty implements HasAltId {
048 private String text;
049 private Date date;
050 private PartialDate partialDate;
051 private boolean dateHasTime;
052
053 /**
054 * Creates a date-and-or-time property.
055 * @param date the date value
056 */
057 public DateOrTimeProperty(Date date) {
058 this(date, false);
059 }
060
061 /**
062 * Creates a date-and-or-time property.
063 * @param date the date value
064 * @param hasTime true to include the date's time component, false if it's
065 * strictly a date
066 */
067 public DateOrTimeProperty(Date date, boolean hasTime) {
068 setDate(date, hasTime);
069 }
070
071 /**
072 * Creates a date-and-or-time property.
073 * @param partialDate the partial date value (vCard 4.0 only)
074 */
075 public DateOrTimeProperty(PartialDate partialDate) {
076 setPartialDate(partialDate);
077 }
078
079 /**
080 * Creates a date-and-or-time property.
081 * @param text the text value (vCard 4.0 only)
082 */
083 public DateOrTimeProperty(String text) {
084 setText(text);
085 }
086
087 /**
088 * Gets the date value.
089 * @return the date value or null if not set
090 */
091 public Date getDate() {
092 return date;
093 }
094
095 /**
096 * Sets the value of this property to a complete date.
097 * @param date the date
098 * @param hasTime true to include the date's time component, false if it's
099 * strictly a date
100 */
101 public void setDate(Date date, boolean hasTime) {
102 this.date = date;
103 this.dateHasTime = (date == null) ? false : hasTime;
104 text = null;
105 partialDate = null;
106 }
107
108 /**
109 * Gets the reduced accuracy or truncated date. This is only supported by
110 * vCard 4.0.
111 * @return the reduced accuracy or truncated date or null if not set
112 * @see "<a href="
113 * http://tools.ietf.org/html/rfc6350">RFC 6350</a> p.12-14 for examples"
114 */
115 public PartialDate getPartialDate() {
116 return partialDate;
117 }
118
119 /**
120 * <p>
121 * Sets the value of this property to a reduced accuracy or truncated date.
122 * This is only supported by vCard 4.0.
123 * </p>
124 *
125 * <pre class="brush:java">
126 * Birthday bday = new Birthday();
127 * bday.setPartialDate(PartialDate.date(null, 4, 20)); //April 20
128 * </pre>
129 * @param partialDate the reduced accuracy or truncated date
130 * @see "<a href="
131 * http://tools.ietf.org/html/rfc6350">RFC 6350</a> p.12-14 for examples"
132 */
133 public void setPartialDate(PartialDate partialDate) {
134 this.partialDate = partialDate;
135 dateHasTime = (partialDate == null) ? false : partialDate.hasTimeComponent();
136 text = null;
137 date = null;
138 }
139
140 /**
141 * Gets the text value of this type. This is only supported by vCard 4.0.
142 * @return the text value or null if not set
143 */
144 public String getText() {
145 return text;
146 }
147
148 /**
149 * Sets the value of this property to a text string. This is only supported
150 * by vCard 4.0.
151 * @param text the text value
152 */
153 public void setText(String text) {
154 this.text = text;
155 date = null;
156 partialDate = null;
157 dateHasTime = false;
158 }
159
160 /**
161 * Determines whether the "date" or "partialDate" fields have a time
162 * component.
163 * @return true if the date has a time component, false if it's strictly a
164 * date, and false if a text value is defined
165 */
166 public boolean hasTime() {
167 return dateHasTime;
168 }
169
170 /**
171 * <p>
172 * Gets the type of calendar that is used for a date or date-time property
173 * value.
174 * </p>
175 * <p>
176 * <b>Supported versions:</b> {@code 4.0}
177 * </p>
178 * @return the type of calendar or null if not found
179 * @see VCardParameters#getCalscale
180 */
181 public Calscale getCalscale() {
182 return parameters.getCalscale();
183 }
184
185 /**
186 * <p>
187 * Sets the type of calendar that is used for a date or date-time property
188 * value.
189 * </p>
190 * <p>
191 * <b>Supported versions:</b> {@code 4.0}
192 * </p>
193 * @param calscale the type of calendar or null to remove
194 * @see VCardParameters#setCalscale
195 */
196 public void setCalscale(Calscale calscale) {
197 parameters.setCalscale(calscale);
198 }
199
200 //@Override
201 public String getAltId() {
202 return parameters.getAltId();
203 }
204
205 //@Override
206 public void setAltId(String altId) {
207 parameters.setAltId(altId);
208 }
209
210 @Override
211 protected void _validate(List<Warning> warnings, VCardVersion version, VCard vcard) {
212 if (date == null && partialDate == null && text == null) {
213 warnings.add(new Warning(8));
214 }
215
216 if (version == VCardVersion.V2_1 || version == VCardVersion.V3_0) {
217 if (text != null) {
218 warnings.add(new Warning(11));
219 }
220 if (partialDate != null) {
221 warnings.add(new Warning(12));
222 }
223 }
224 }
225 }