001package biweekly.io.scribe.property;
002
003import java.util.Date;
004import java.util.List;
005
006import biweekly.ICalDataType;
007import biweekly.Warning;
008import biweekly.io.CannotParseException;
009import biweekly.io.json.JCalValue;
010import biweekly.io.xml.XCalElement;
011import biweekly.parameter.ICalParameters;
012import biweekly.property.Trigger;
013import 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 */
044public class TriggerScribe extends ICalPropertyScribe<Trigger> {
045        public TriggerScribe() {
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}