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