001 package ezvcard.property; 002 003 import java.util.List; 004 005 import ezvcard.VCard; 006 import ezvcard.VCardVersion; 007 import ezvcard.Warning; 008 import ezvcard.util.GeoUri; 009 010 /* 011 Copyright (c) 2013, Michael Angstadt 012 All rights reserved. 013 014 Redistribution and use in source and binary forms, with or without 015 modification, are permitted provided that the following conditions are met: 016 017 1. Redistributions of source code must retain the above copyright notice, this 018 list of conditions and the following disclaimer. 019 2. Redistributions in binary form must reproduce the above copyright notice, 020 this list of conditions and the following disclaimer in the documentation 021 and/or other materials provided with the distribution. 022 023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 024 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 025 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 026 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 027 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 028 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 029 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 030 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 031 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 032 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 033 034 The views and conclusions contained in the software and documentation are those 035 of the authors and should not be interpreted as representing official policies, 036 either expressed or implied, of the FreeBSD Project. 037 */ 038 039 /** 040 * <p> 041 * A set of latitude/longitude coordinates. There is no rule for what these 042 * coordinates must represent, but the meaning could vary depending on the value 043 * of {@link Kind}: 044 * </p> 045 * 046 * <table border="1"> 047 * <tr> 048 * <th>KIND value</th> 049 * <th>GEO meaning</th> 050 * </tr> 051 * <tr> 052 * <td>"individual"</td> 053 * <td>the location of the person's home or workplace.</td> 054 * </tr> 055 * <tr> 056 * <td>"group"</td> 057 * <td>the location of the group's meeting place.</td> 058 * </tr> 059 * <tr> 060 * <td>"org"</td> 061 * <td>the coordinates of the organization's headquarters.</td> 062 * </tr> 063 * <tr> 064 * <td>"location"</td> 065 * <td>the coordinates of the location itself.</td> 066 * </tr> 067 * </table> 068 * 069 * <p> 070 * <b>Code sample</b> 071 * </p> 072 * 073 * <pre class="brush:java"> 074 * VCard vcard = new VCard(); 075 * Geo geo = new Geo(-123.456, 12.54); 076 * vcard.setGeo(geo); 077 * </pre> 078 * 079 * <p> 080 * <b>Property name:</b> {@code GEO} 081 * </p> 082 * <p> 083 * <b>Supported versions:</b> {@code 2.1, 3.0, 4.0} 084 * </p> 085 * @author Michael Angstadt 086 */ 087 public class Geo extends VCardProperty implements HasAltId { 088 private GeoUri uri; 089 090 /** 091 * Creates a geo property. 092 * @param latitude the latitude 093 * @param longitude the longitude 094 */ 095 public Geo(Double latitude, Double longitude) { 096 this(new GeoUri.Builder(latitude, longitude).build()); 097 } 098 099 /** 100 * Creates a geo property. 101 * @param uri the geo URI 102 */ 103 public Geo(GeoUri uri) { 104 this.uri = uri; 105 } 106 107 /** 108 * Gets the latitude. 109 * @return the latitude 110 */ 111 public Double getLatitude() { 112 return (uri == null) ? null : uri.getCoordA(); 113 } 114 115 /** 116 * Sets the latitude. 117 * @param latitude the latitude 118 */ 119 public void setLatitude(Double latitude) { 120 if (uri == null) { 121 uri = new GeoUri.Builder(latitude, null).build(); 122 } else { 123 uri = new GeoUri.Builder(uri).coordA(latitude).build(); 124 } 125 } 126 127 /** 128 * Gets the longitude. 129 * @return the longitude 130 */ 131 public Double getLongitude() { 132 return (uri == null) ? null : uri.getCoordB(); 133 } 134 135 /** 136 * Sets the longitude. 137 * @param longitude the longitude 138 */ 139 public void setLongitude(Double longitude) { 140 if (uri == null) { 141 uri = new GeoUri.Builder(null, longitude).build(); 142 } else { 143 uri = new GeoUri.Builder(uri).coordB(longitude).build(); 144 } 145 } 146 147 /** 148 * Gets the raw object used for storing the GEO information. This can be 149 * used to supplement the GEO value with additional information (such as 150 * altitude or level of accuracy). Geo URIs are only supported by vCard 151 * version 4.0. Only latitude and longitude values are used when marshalling 152 * to earlier vCard versions. 153 * @return the geo URI object or null if not set 154 * @see <a href="http://tools.ietf.org/html/rfc5870">RFC 5870</a> 155 */ 156 public GeoUri getGeoUri() { 157 return uri; 158 } 159 160 /** 161 * Sets the raw object used for storing the GEO information. This can be 162 * used to supplement the GEO value with additional information (such as 163 * altitude or level of accuracy). Geo URIs are only supported by vCard 164 * version 4.0. Only latitude and longitude values are used when marshalling 165 * to earlier vCard versions. 166 * @param uri the geo URI object 167 * @see <a href="http://tools.ietf.org/html/rfc5870">RFC 5870</a> 168 */ 169 public void setGeoUri(GeoUri uri) { 170 this.uri = uri; 171 } 172 173 /** 174 * Gets the TYPE parameter. 175 * <p> 176 * <b>Supported versions:</b> {@code 4.0} 177 * </p> 178 * @return the TYPE value (typically, this will be either "work" or "home") 179 * or null if it doesn't exist 180 */ 181 public String getType() { 182 return parameters.getType(); 183 } 184 185 /** 186 * Sets the TYPE parameter. 187 * <p> 188 * <b>Supported versions:</b> {@code 4.0} 189 * </p> 190 * @param type the TYPE value (this should be either "work" or "home") or 191 * null to remove 192 */ 193 public void setType(String type) { 194 parameters.setType(type); 195 } 196 197 /** 198 * Gets the MEDIATYPE parameter. 199 * <p> 200 * <b>Supported versions:</b> {@code 4.0} 201 * </p> 202 * @return the media type or null if not set 203 */ 204 public String getMediaType() { 205 return parameters.getMediaType(); 206 } 207 208 /** 209 * Sets the MEDIATYPE parameter. 210 * <p> 211 * <b>Supported versions:</b> {@code 4.0} 212 * </p> 213 * @param mediaType the media type or null to remove 214 */ 215 public void setMediaType(String mediaType) { 216 parameters.setMediaType(mediaType); 217 } 218 219 @Override 220 public List<Integer[]> getPids() { 221 return super.getPids(); 222 } 223 224 @Override 225 public void addPid(int localId, int clientPidMapRef) { 226 super.addPid(localId, clientPidMapRef); 227 } 228 229 @Override 230 public void removePids() { 231 super.removePids(); 232 } 233 234 @Override 235 public Integer getPref() { 236 return super.getPref(); 237 } 238 239 @Override 240 public void setPref(Integer pref) { 241 super.setPref(pref); 242 } 243 244 //@Override 245 public String getAltId() { 246 return parameters.getAltId(); 247 } 248 249 //@Override 250 public void setAltId(String altId) { 251 parameters.setAltId(altId); 252 } 253 254 @Override 255 protected void _validate(List<Warning> warnings, VCardVersion version, VCard vcard) { 256 if (getLatitude() == null) { 257 warnings.add(new Warning(13)); 258 } 259 if (getLongitude() == null) { 260 warnings.add(new Warning(14)); 261 } 262 } 263 }