001 package ezvcard.types; 002 003 import java.util.List; 004 005 import ezvcard.VCard; 006 import ezvcard.VCardSubTypes; 007 import ezvcard.VCardVersion; 008 import ezvcard.io.CompatibilityMode; 009 import ezvcard.io.SkipMeException; 010 import ezvcard.parameters.ValueParameter; 011 import ezvcard.util.VCardStringUtils; 012 import ezvcard.util.XCardElement; 013 014 /* 015 Copyright (c) 2012, Michael Angstadt 016 All rights reserved. 017 018 Redistribution and use in source and binary forms, with or without 019 modification, are permitted provided that the following conditions are met: 020 021 1. Redistributions of source code must retain the above copyright notice, this 022 list of conditions and the following disclaimer. 023 2. Redistributions in binary form must reproduce the above copyright notice, 024 this list of conditions and the following disclaimer in the documentation 025 and/or other materials provided with the distribution. 026 027 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 028 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 029 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 030 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 031 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 032 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 033 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 034 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 035 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 036 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 037 038 The views and conclusions contained in the software and documentation are those 039 of the authors and should not be interpreted as representing official policies, 040 either expressed or implied, of the FreeBSD Project. 041 */ 042 043 /** 044 * Defines the location of the person's death. 045 * 046 * <pre> 047 * VCard vcard = new VCard(); 048 * 049 * //URI (geo) 050 * DeathplaceType deathplace = new DeathplaceType(); 051 * deathplace.setUri("geo:46.176502,-122.191658"); 052 * vcard.setDeathplace(deathplace); 053 * 054 * //text 055 * deathplace = new DeathplaceType(); 056 * deathplace.setText("Mount St. Helens"); 057 * vcard.setDeathplace(deathplace); 058 * </pre> 059 * 060 * <p> 061 * vCard property name: DEATHPLACE 062 * </p> 063 * <p> 064 * vCard versions: 4.0 065 * </p> 066 * @author Michael Angstadt 067 * @see <a href="http://tools.ietf.org/html/rfc6474">RFC 6474</a> 068 */ 069 public class DeathplaceType extends VCardType { 070 public static final String NAME = "DEATHPLACE"; 071 072 private String uri; 073 private String text; 074 075 public DeathplaceType() { 076 super(NAME); 077 } 078 079 /** 080 * Gets the URI value. 081 * @return the URI value or null if no URI value is set 082 */ 083 public String getUri() { 084 return uri; 085 } 086 087 /** 088 * Sets the value to a URI. 089 * @param uri the URI 090 */ 091 public void setUri(String uri) { 092 this.uri = uri; 093 text = null; 094 } 095 096 /** 097 * Gets the text value. 098 * @return the text value or null if no text value is set 099 */ 100 public String getText() { 101 return text; 102 } 103 104 /** 105 * Sets the value to free-form text. 106 * @param text the text 107 */ 108 public void setText(String text) { 109 this.text = text; 110 uri = null; 111 } 112 113 /** 114 * Gets the ALTID. 115 * <p> 116 * vCard versions: 4.0 117 * </p> 118 * @return the ALTID or null if it doesn't exist 119 * @see VCardSubTypes#getAltId 120 */ 121 public String getAltId() { 122 return subTypes.getAltId(); 123 } 124 125 /** 126 * Sets the ALTID. 127 * <p> 128 * vCard versions: 4.0 129 * </p> 130 * @param altId the ALTID or null to remove 131 * @see VCardSubTypes#setAltId 132 */ 133 public void setAltId(String altId) { 134 subTypes.setAltId(altId); 135 } 136 137 /** 138 * Gets the LANGUAGE parameter. 139 * @return the language or null if not set 140 * @see VCardSubTypes#getLanguage 141 */ 142 public String getLanguage() { 143 return subTypes.getLanguage(); 144 } 145 146 /** 147 * Sets the LANGUAGE parameter. 148 * @param language the language or null to remove 149 * @see VCardSubTypes#setLanguage 150 */ 151 public void setLanguage(String language) { 152 subTypes.setLanguage(language); 153 } 154 155 @Override 156 public VCardVersion[] getSupportedVersions() { 157 return new VCardVersion[] { VCardVersion.V4_0 }; 158 } 159 160 @Override 161 protected void doMarshalSubTypes(VCardSubTypes copy, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode, VCard vcard) { 162 if (uri != null) { 163 copy.setValue(ValueParameter.URI); 164 } else if (text != null) { 165 copy.setValue(ValueParameter.TEXT); 166 } 167 } 168 169 @Override 170 protected void doMarshalText(StringBuilder sb, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode) { 171 if (uri != null) { 172 sb.append(VCardStringUtils.escape(uri)); 173 } else if (text != null) { 174 sb.append(VCardStringUtils.escape(text)); 175 } else { 176 throw new SkipMeException("Property has neither a URI nor a text value associated with it."); 177 } 178 } 179 180 @Override 181 protected void doUnmarshalText(String value, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode) { 182 value = VCardStringUtils.unescape(value); 183 if (subTypes.getValue() == ValueParameter.URI) { 184 setUri(value); 185 } else if (subTypes.getValue() == ValueParameter.TEXT) { 186 setText(value); 187 } else { 188 warnings.add("No valid VALUE parameter specified for " + NAME + " type. Assuming it's text."); 189 setText(value); 190 } 191 } 192 193 @Override 194 protected void doMarshalXml(XCardElement parent, List<String> warnings, CompatibilityMode compatibilityMode) { 195 if (uri != null) { 196 parent.uri(uri); 197 } else if (text != null) { 198 parent.text(text); 199 } else { 200 throw new SkipMeException("Property has neither a URI nor a text value associated with it."); 201 } 202 } 203 204 @Override 205 protected void doUnmarshalXml(XCardElement element, List<String> warnings, CompatibilityMode compatibilityMode) { 206 String value = element.uri(); 207 if (value != null) { 208 setUri(value); 209 } else { 210 setText(element.text()); 211 } 212 } 213 }