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}