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