001 package biweekly.property.marshaller;
002
003 import java.util.Date;
004 import java.util.List;
005
006 import biweekly.ICalDataType;
007 import biweekly.Warning;
008 import biweekly.io.CannotParseException;
009 import biweekly.io.json.JCalValue;
010 import biweekly.io.xml.XCalElement;
011 import biweekly.parameter.ICalParameters;
012 import biweekly.property.Trigger;
013 import biweekly.util.Duration;
014
015 /*
016 Copyright (c) 2013, Michael Angstadt
017 All rights reserved.
018
019 Redistribution and use in source and binary forms, with or without
020 modification, are permitted provided that the following conditions are met:
021
022 1. Redistributions of source code must retain the above copyright notice, this
023 list of conditions and the following disclaimer.
024 2. Redistributions in binary form must reproduce the above copyright notice,
025 this list of conditions and the following disclaimer in the documentation
026 and/or other materials provided with the distribution.
027
028 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
029 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
030 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
031 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
032 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
033 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
034 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
035 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
036 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
037 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
038 */
039
040 /**
041 * Marshals {@link Trigger} properties.
042 * @author Michael Angstadt
043 */
044 public class TriggerMarshaller extends ICalPropertyMarshaller<Trigger> {
045 public TriggerMarshaller() {
046 super(Trigger.class, "TRIGGER", ICalDataType.DURATION);
047 }
048
049 @Override
050 protected ICalDataType _dataType(Trigger property) {
051 return (property.getDate() == null) ? ICalDataType.DURATION : ICalDataType.DATE_TIME;
052 }
053
054 @Override
055 protected String _writeText(Trigger property) {
056 Duration duration = property.getDuration();
057 if (duration != null) {
058 return duration.toString();
059 }
060
061 Date date = property.getDate();
062 if (date != null) {
063 return date(date).write();
064 }
065
066 return "";
067 }
068
069 @Override
070 protected Trigger _parseText(String value, ICalDataType dataType, ICalParameters parameters, List<Warning> warnings) {
071 value = unescape(value);
072
073 try {
074 Date date = date(value).tzid(parameters.getTimezoneId(), warnings).parse();
075 return new Trigger(date);
076 } catch (IllegalArgumentException e) {
077 //unable to parse value as date, must be a duration
078 }
079
080 try {
081 return new Trigger(Duration.parse(value), parameters.getRelated());
082 } catch (IllegalArgumentException e) {
083 //unable to parse duration
084 }
085
086 throw new CannotParseException(25);
087 }
088
089 @Override
090 protected void _writeXml(Trigger property, XCalElement element) {
091 Duration duration = property.getDuration();
092 if (duration != null) {
093 element.append(ICalDataType.DURATION, duration.toString());
094 return;
095 }
096
097 Date date = property.getDate();
098 if (date != null) {
099 element.append(ICalDataType.DATE_TIME, date(date).extended(true).write());
100 return;
101 }
102
103 element.append(defaultDataType, "");
104 }
105
106 @Override
107 protected Trigger _parseXml(XCalElement element, ICalParameters parameters, List<Warning> warnings) {
108 String value = element.first(ICalDataType.DURATION);
109 if (value != null) {
110 try {
111 return new Trigger(Duration.parse(value), parameters.getRelated());
112 } catch (IllegalArgumentException e) {
113 throw new CannotParseException(26, value);
114 }
115 }
116
117 value = element.first(ICalDataType.DATE_TIME);
118 if (value != null) {
119 try {
120 Date date = date(value).tzid(parameters.getTimezoneId(), warnings).parse();
121 return new Trigger(date);
122 } catch (IllegalArgumentException e) {
123 throw new CannotParseException(27, value);
124 }
125 }
126
127 throw missingXmlElements(ICalDataType.DURATION, ICalDataType.DATE_TIME);
128 }
129
130 @Override
131 protected JCalValue _writeJson(Trigger property) {
132 Duration duration = property.getDuration();
133 if (duration != null) {
134 return JCalValue.single(duration.toString());
135 }
136
137 Date date = property.getDate();
138 if (date != null) {
139 return JCalValue.single(date(date).extended(true).write());
140 }
141
142 return JCalValue.single("");
143 }
144
145 @Override
146 protected Trigger _parseJson(JCalValue value, ICalDataType dataType, ICalParameters parameters, List<Warning> warnings) {
147 String valueStr = value.asSingle();
148
149 try {
150 Date date = date(valueStr).tzid(parameters.getTimezoneId(), warnings).parse();
151 return new Trigger(date);
152 } catch (IllegalArgumentException e) {
153 //must be a duration
154 }
155
156 try {
157 return new Trigger(Duration.parse(valueStr), parameters.getRelated());
158 } catch (IllegalArgumentException e) {
159 throw new CannotParseException(25);
160 }
161 }
162 }