001package biweekly.property;
002
003import java.util.List;
004
005import biweekly.ICalVersion;
006import biweekly.Warning;
007import biweekly.component.ICalComponent;
008
009/*
010 Copyright (c) 2013-2015, Michael Angstadt
011 All rights reserved.
012
013 Redistribution and use in source and binary forms, with or without
014 modification, are permitted provided that the following conditions are met: 
015
016 1. Redistributions of source code must retain the above copyright notice, this
017 list of conditions and the following disclaimer. 
018 2. Redistributions in binary form must reproduce the above copyright notice,
019 this list of conditions and the following disclaimer in the documentation
020 and/or other materials provided with the distribution. 
021
022 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
023 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
024 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
025 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
026 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
027 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
028 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
029 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
030 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
031 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
032 */
033
034/**
035 * <p>
036 * Defines a set of geographical coordinates.
037 * </p>
038 * <p>
039 * <b>Code sample:</b>
040 * 
041 * <pre class="brush:java">
042 * VEvent event = new VEvent();
043 * 
044 * Geo geo = new Geo(40.714623, -74.006605);
045 * event.setGeo(geo);
046 * </pre>
047 * 
048 * </p>
049 * @author Michael Angstadt
050 * @see <a href="http://tools.ietf.org/html/rfc5545#page-85">RFC 5545 p.85-7</a>
051 * @see <a href="http://tools.ietf.org/html/rfc2445#page-82">RFC 2445 p.82-3</a>
052 * @see <a href="http://www.imc.org/pdi/vcal-10.doc">vCal 1.0 p.23</a>
053 */
054public class Geo extends ICalProperty {
055        private Double latitude;
056        private Double longitude;
057
058        /**
059         * Creates a new geo property.
060         * @param latitude the latitude
061         * @param longitude the longitude
062         */
063        public Geo(Double latitude, Double longitude) {
064                this.latitude = latitude;
065                this.longitude = longitude;
066        }
067
068        /**
069         * Gets the latitude.
070         * @return the latitude
071         */
072        public Double getLatitude() {
073                return latitude;
074        }
075
076        /**
077         * Sets the latitude.
078         * @param latitude the latitude
079         */
080        public void setLatitude(Double latitude) {
081                this.latitude = latitude;
082        }
083
084        /**
085         * Gets the longitude.
086         * @return the longitude
087         */
088        public Double getLongitude() {
089                return longitude;
090        }
091
092        /**
093         * Sets the longitude.
094         * @param longitude the longitude
095         */
096        public void setLongitude(Double longitude) {
097                this.longitude = longitude;
098        }
099
100        /**
101         * Converts a coordinate in the degrees-minutes-seconds format into its
102         * decimal equivalent.
103         * @param degrees the degrees
104         * @param minutes the minutes
105         * @param seconds the seconds
106         * @return the decimal value
107         */
108        public static double toDecimal(int degrees, int minutes, int seconds) {
109                return degrees + (minutes / 60.0) + (seconds / 3600.0);
110        }
111
112        @Override
113        protected void validate(List<ICalComponent> components, ICalVersion version, List<Warning> warnings) {
114                if (latitude == null) {
115                        warnings.add(Warning.validate(41));
116                }
117                if (longitude == null) {
118                        warnings.add(Warning.validate(42));
119                }
120        }
121}