001 package ezvcard.types;
002
003 import java.util.List;
004 import java.util.regex.Matcher;
005 import java.util.regex.Pattern;
006
007 import ezvcard.VCard;
008 import ezvcard.VCardSubTypes;
009 import ezvcard.VCardVersion;
010 import ezvcard.io.CompatibilityMode;
011 import ezvcard.parameters.EmailTypeParameter;
012 import ezvcard.util.HCardElement;
013 import ezvcard.util.VCardStringUtils;
014 import ezvcard.util.XCardElement;
015
016 /*
017 Copyright (c) 2012, Michael Angstadt
018 All rights reserved.
019
020 Redistribution and use in source and binary forms, with or without
021 modification, are permitted provided that the following conditions are met:
022
023 1. Redistributions of source code must retain the above copyright notice, this
024 list of conditions and the following disclaimer.
025 2. Redistributions in binary form must reproduce the above copyright notice,
026 this list of conditions and the following disclaimer in the documentation
027 and/or other materials provided with the distribution.
028
029 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
030 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
031 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
032 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
033 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
034 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
035 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
036 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
037 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
038 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
039
040 The views and conclusions contained in the software and documentation are those
041 of the authors and should not be interpreted as representing official policies,
042 either expressed or implied, of the FreeBSD Project.
043 */
044
045 /**
046 * An email address associated with a person.
047 *
048 * <pre>
049 * VCard vcard = new VCard();
050 *
051 * EmailType email = new EmailType("superdude55@hotmail.com");
052 * email.addType(EmailTypeParameter.HOME);
053 * vcard.addEmail(email);
054 *
055 * email = new EmailType("doe.john@company.com");
056 * email.addType(EmailTypeParameter.WORK);
057 * email.setPref(1); //the most preferred email
058 * vcard.addEmail(email);
059 * </pre>
060 *
061 * <p>
062 * vCard property name: EMAIL
063 * </p>
064 * <p>
065 * vCard versions: 2.1, 3.0, 4.0
066 * </p>
067 * @author Michael Angstadt
068 */
069 public class EmailType extends MultiValuedTypeParameterType<EmailTypeParameter> {
070 public static final String NAME = "EMAIL";
071
072 private String value;
073
074 public EmailType() {
075 this(null);
076 }
077
078 /**
079 * @param email the email
080 */
081 public EmailType(String email) {
082 super(NAME);
083 setValue(email);
084 }
085
086 @Override
087 protected EmailTypeParameter buildTypeObj(String type) {
088 EmailTypeParameter param = EmailTypeParameter.valueOf(type);
089 if (param == null) {
090 param = new EmailTypeParameter(type);
091 }
092 return param;
093 }
094
095 /**
096 * Gets the email address.
097 * @return the email address
098 */
099 public String getValue() {
100 return value;
101 }
102
103 /**
104 * Sets the email address
105 * @param email the email address
106 */
107 public void setValue(String email) {
108 this.value = email;
109 }
110
111 /**
112 * Gets all PID parameter values.
113 * <p>
114 * vCard versions: 4.0
115 * </p>
116 * @return the PID values or empty set if there are none
117 * @see VCardSubTypes#getPids
118 */
119 public List<Integer[]> getPids() {
120 return subTypes.getPids();
121 }
122
123 /**
124 * Adds a PID value.
125 * <p>
126 * vCard versions: 4.0
127 * </p>
128 * @param localId the local ID
129 * @param clientPidMapRef the ID used to reference the property's globally
130 * unique identifier in the CLIENTPIDMAP property.
131 * @see VCardSubTypes#addPid(int, int)
132 */
133 public void addPid(int localId, int clientPidMapRef) {
134 subTypes.addPid(localId, clientPidMapRef);
135 }
136
137 /**
138 * Removes all PID values.
139 * <p>
140 * vCard versions: 4.0
141 * </p>
142 * @see VCardSubTypes#removePids
143 */
144 public void removePids() {
145 subTypes.removePids();
146 }
147
148 /**
149 * Gets the preference value.
150 * <p>
151 * vCard versions: 4.0
152 * </p>
153 * @return the preference value or null if it doesn't exist
154 * @see VCardSubTypes#getPref
155 */
156 public Integer getPref() {
157 return subTypes.getPref();
158 }
159
160 /**
161 * Sets the preference value.
162 * <p>
163 * vCard versions: 4.0
164 * </p>
165 * @param pref the preference value or null to remove
166 * @see VCardSubTypes#setPref
167 */
168 public void setPref(Integer pref) {
169 subTypes.setPref(pref);
170 }
171
172 /**
173 * Gets the ALTID.
174 * <p>
175 * vCard versions: 4.0
176 * </p>
177 * @return the ALTID or null if it doesn't exist
178 * @see VCardSubTypes#getAltId
179 */
180 public String getAltId() {
181 return subTypes.getAltId();
182 }
183
184 /**
185 * Sets the ALTID.
186 * <p>
187 * vCard versions: 4.0
188 * </p>
189 * @param altId the ALTID or null to remove
190 * @see VCardSubTypes#setAltId
191 */
192 public void setAltId(String altId) {
193 subTypes.setAltId(altId);
194 }
195
196 @Override
197 protected void doMarshalSubTypes(VCardSubTypes copy, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode, VCard vcard) {
198 //replace "TYPE=pref" with "PREF=1"
199 if (version == VCardVersion.V4_0) {
200 if (getTypes().contains(EmailTypeParameter.PREF)) {
201 copy.removeType(EmailTypeParameter.PREF.getValue());
202 copy.setPref(1);
203 }
204 } else {
205 copy.setPref(null);
206
207 //find the EMAIL with the lowest PREF value in the vCard
208 EmailType mostPreferred = null;
209 for (EmailType email : vcard.getEmails()) {
210 Integer pref = email.getPref();
211 if (pref != null) {
212 if (mostPreferred == null || pref < mostPreferred.getPref()) {
213 mostPreferred = email;
214 }
215 }
216 }
217 if (this == mostPreferred) {
218 copy.addType(EmailTypeParameter.PREF.getValue());
219 }
220 }
221 }
222
223 @Override
224 protected void doMarshalText(StringBuilder sb, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode) {
225 sb.append(VCardStringUtils.escape(value));
226 }
227
228 @Override
229 protected void doUnmarshalText(String value, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode) {
230 this.value = VCardStringUtils.unescape(value);
231 }
232
233 @Override
234 protected void doMarshalXml(XCardElement parent, List<String> warnings, CompatibilityMode compatibilityMode) {
235 parent.text(getValue());
236 }
237
238 @Override
239 protected void doUnmarshalXml(XCardElement element, List<String> warnings, CompatibilityMode compatibilityMode) {
240 setValue(element.text());
241 }
242
243 @Override
244 protected void doUnmarshalHtml(HCardElement element, List<String> warnings) {
245 List<String> types = element.types();
246 for (String type : types) {
247 subTypes.addType(type);
248 }
249
250 //check to see if the email address is within in "mailto:" link
251 String email = null;
252 String href = element.attr("href");
253 if (href.length() > 0) {
254 Pattern p = Pattern.compile("^mailto:(.*)$", Pattern.CASE_INSENSITIVE);
255 Matcher m = p.matcher(href);
256 if (m.find()) {
257 email = m.group(1);
258 }
259 }
260 if (email == null) {
261 email = element.value();
262 }
263 setValue(email);
264 }
265 }