001 package ezvcard.property;
002
003 import java.util.EnumSet;
004 import java.util.HashSet;
005 import java.util.List;
006 import java.util.Set;
007
008 import ezvcard.VCard;
009 import ezvcard.VCardVersion;
010 import ezvcard.Warning;
011 import ezvcard.parameter.RelatedType;
012
013 /*
014 Copyright (c) 2013, Michael Angstadt
015 All rights reserved.
016
017 Redistribution and use in source and binary forms, with or without
018 modification, are permitted provided that the following conditions are met:
019
020 1. Redistributions of source code must retain the above copyright notice, this
021 list of conditions and the following disclaimer.
022 2. Redistributions in binary form must reproduce the above copyright notice,
023 this list of conditions and the following disclaimer in the documentation
024 and/or other materials provided with the distribution.
025
026 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
027 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
028 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
029 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
030 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
031 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
032 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
033 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
034 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
035 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
036
037 The views and conclusions contained in the software and documentation are those
038 of the authors and should not be interpreted as representing official policies,
039 either expressed or implied, of the FreeBSD Project.
040 */
041
042 /**
043 * Someone that the person is related to. It can contain either a URI or a plain
044 * text value.
045 *
046 * <p>
047 * <b>Code sample</b>
048 * </p>
049 *
050 * <pre class="brush:java">
051 * VCard vcard = new VCard();
052 *
053 * Related related = new Related();
054 * related.addType(RelatedType.FRIEND);
055 * related.setUri("urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af");
056 * vcard.addRelated(related);
057 *
058 * related = new Related();
059 * related.addType(RelatedType.CO_WORKER);
060 * related.addType(RelatedType.FRIEND);
061 * related.setUri("http://joesmoe.name/vcard.vcf");
062 * vcard.addRelated(related);
063 *
064 * related = new Related();
065 * related.addType(RelatedType.SPOUSE);
066 * related.setText("Edna Smith");
067 * vcard.addRelated(related);
068 * </pre>
069 *
070 * <p>
071 * <b>Property name:</b> {@code RELATED}
072 * </p>
073 * <p>
074 * <b>Supported versions:</b> {@code 4.0}
075 * </p>
076 * @author Michael Angstadt
077 */
078 public class Related extends VCardProperty implements HasAltId {
079 private String uri;
080 private String text;
081
082 @Override
083 public Set<VCardVersion> _supportedVersions() {
084 return EnumSet.of(VCardVersion.V4_0);
085 }
086
087 /**
088 * Gets the URI value.
089 * @return the URI value or null if no URI value is set
090 */
091 public String getUri() {
092 return uri;
093 }
094
095 /**
096 * Sets the URI to an email address.
097 * @param email the email address
098 */
099 public void setUriEmail(String email) {
100 setUri("mailto:" + email);
101 }
102
103 /**
104 * Sets the URI to an instant messaging handle.
105 * @param protocol the IM protocol (e.g. "aim")
106 * @param handle the handle
107 */
108 public void setUriIM(String protocol, String handle) {
109 setUri(protocol + ":" + handle);
110 }
111
112 /**
113 * Sets the URI to a telephone number.
114 * @param telephone the telephone number
115 */
116 public void setUriTelephone(String telephone) {
117 setUri("tel:" + telephone);
118 }
119
120 /**
121 * Sets the URI.
122 * @param uri the URI
123 */
124 public void setUri(String uri) {
125 this.uri = uri;
126 text = null;
127 }
128
129 /**
130 * Gets the text value.
131 * @return the text value or null if no text value is set
132 */
133 public String getText() {
134 return text;
135 }
136
137 /**
138 * Sets the value to free-form text instead of a URI.
139 * @param text the text
140 */
141 public void setText(String text) {
142 this.text = text;
143 uri = null;
144 }
145
146 /**
147 * Gets all the TYPE parameters.
148 * @return the TYPE parameters or empty set if there are none
149 */
150 public Set<RelatedType> getTypes() {
151 Set<String> values = parameters.getTypes();
152 Set<RelatedType> types = new HashSet<RelatedType>(values.size());
153 for (String value : values) {
154 types.add(RelatedType.get(value));
155 }
156 return types;
157 }
158
159 /**
160 * Adds a TYPE parameter.
161 * @param type the TYPE parameter to add
162 */
163 public void addType(RelatedType type) {
164 parameters.addType(type.getValue());
165 }
166
167 /**
168 * Removes a TYPE parameter.
169 * @param type the TYPE parameter to remove
170 */
171 public void removeType(RelatedType type) {
172 parameters.removeType(type.getValue());
173 }
174
175 @Override
176 public List<Integer[]> getPids() {
177 return super.getPids();
178 }
179
180 @Override
181 public void addPid(int localId, int clientPidMapRef) {
182 super.addPid(localId, clientPidMapRef);
183 }
184
185 @Override
186 public void removePids() {
187 super.removePids();
188 }
189
190 @Override
191 public Integer getPref() {
192 return super.getPref();
193 }
194
195 @Override
196 public void setPref(Integer pref) {
197 super.setPref(pref);
198 }
199
200 //@Override
201 public String getAltId() {
202 return parameters.getAltId();
203 }
204
205 //@Override
206 public void setAltId(String altId) {
207 parameters.setAltId(altId);
208 }
209
210 @Override
211 protected void _validate(List<Warning> warnings, VCardVersion version, VCard vcard) {
212 if (uri == null && text == null) {
213 warnings.add(new Warning(8));
214 }
215 }
216 }