001package biweekly.io.scribe.property;
002
003import java.util.List;
004
005import biweekly.ICalDataType;
006import biweekly.Warning;
007import biweekly.io.CannotParseException;
008import biweekly.io.json.JCalValue;
009import biweekly.io.xml.XCalElement;
010import biweekly.parameter.ICalParameters;
011import biweekly.property.IntegerProperty;
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
038/**
039 * Marshals properties that have integer values.
040 * @param <T> the property class
041 * @author Michael Angstadt
042 */
043public abstract class IntegerPropertyScribe<T extends IntegerProperty> extends ICalPropertyScribe<T> {
044        public IntegerPropertyScribe(Class<T> clazz, String propertyName) {
045                super(clazz, propertyName, ICalDataType.INTEGER);
046        }
047
048        @Override
049        protected String _writeText(T property) {
050                Integer value = property.getValue();
051                if (value != null) {
052                        return value.toString();
053                }
054
055                return "";
056        }
057
058        @Override
059        protected T _parseText(String value, ICalDataType dataType, ICalParameters parameters, List<Warning> warnings) {
060                value = unescape(value);
061                return parse(value);
062        }
063
064        @Override
065        protected void _writeXml(T property, XCalElement element) {
066                String valueStr = null;
067
068                Integer value = property.getValue();
069                if (value != null) {
070                        valueStr = value.toString();
071                }
072
073                element.append(dataType(property), valueStr);
074        }
075
076        @Override
077        protected T _parseXml(XCalElement element, ICalParameters parameters, List<Warning> warnings) {
078                String value = element.first(defaultDataType);
079                if (value != null) {
080                        return parse(value);
081                }
082
083                throw missingXmlElements(defaultDataType);
084        }
085
086        @Override
087        protected JCalValue _writeJson(T property) {
088                return JCalValue.single(property.getValue());
089        }
090
091        @Override
092        protected T _parseJson(JCalValue value, ICalDataType dataType, ICalParameters parameters, List<Warning> warnings) {
093                return parse(value.asSingle());
094        }
095
096        private T parse(String value) {
097                if (value == null || value.length() == 0) {
098                        return newInstance(null);
099                }
100
101                try {
102                        Integer intValue = Integer.valueOf(value);
103                        return newInstance(intValue);
104                } catch (NumberFormatException e) {
105                        throw new CannotParseException(24);
106                }
107        }
108
109        protected abstract T newInstance(Integer value);
110}