001 package ezvcard.types;
002
003 import java.util.List;
004 import java.util.Set;
005
006 import ezvcard.VCard;
007 import ezvcard.VCardSubTypes;
008 import ezvcard.VCardVersion;
009 import ezvcard.io.CompatibilityMode;
010 import ezvcard.io.EmbeddedVCardException;
011 import ezvcard.io.SkipMeException;
012 import ezvcard.parameters.ValueParameter;
013 import ezvcard.util.HCardElement;
014 import ezvcard.util.VCardStringUtils;
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 embedded vCard or URL containing the information of someone who represents
047 * the person.
048 *
049 * <pre>
050 * //URL
051 * VCard vcard = new VCard();
052 * AgentType agent = new AgentType("http://mi5.gov.uk/007");
053 * vcard.setAgent(agent);
054 *
055 * //vCard
056 * VCard vcard = new VCard();
057 * VCard agentVcard = new VCard();
058 * agentVcard.setFormattedName(new FormattedNameType("Agent 007"));
059 * AgentType agent = new AgentType(agentVcard);
060 * vcard.setAgent(agent);
061 * </pre>
062 *
063 * <p>
064 * vCard property name: AGENT
065 * </p>
066 * <p>
067 * vCard versions: 2.1, 3.0
068 * </p>
069 *
070 * @author Michael Angstadt
071 */
072 public class AgentType extends VCardType {
073 public static final String NAME = "AGENT";
074
075 private String url;
076 private VCard vcard;
077
078 public AgentType() {
079 super(NAME);
080 }
081
082 /**
083 * @param url a URL pointing to the agent's information
084 */
085 public AgentType(String url) {
086 super(NAME);
087 setUrl(url);
088 }
089
090 /**
091 * @param vcard a vCard containing the agent's information
092 */
093 public AgentType(VCard vcard) {
094 super(NAME);
095 setVCard(vcard);
096 }
097
098 /**
099 * Gets the URL to the agent's information.
100 * @return the URL or null if not set
101 */
102 public String getUrl() {
103 return url;
104 }
105
106 /**
107 * Sets the URL to the agent's information.
108 * @param url the URL
109 */
110 public void setUrl(String url) {
111 this.url = url;
112 vcard = null;
113 }
114
115 /**
116 * Gets an embedded vCard with the agent's information.
117 * @return the vCard or null if not set
118 */
119 public VCard getVCard() {
120 return vcard;
121 }
122
123 /**
124 * Sets an embedded vCard with the agent's information.
125 * @param vcard the vCard
126 */
127 public void setVCard(VCard vcard) {
128 this.vcard = vcard;
129 url = null;
130 }
131
132 @Override
133 public VCardVersion[] getSupportedVersions() {
134 return new VCardVersion[] { VCardVersion.V2_1, VCardVersion.V3_0 };
135 }
136
137 @Override
138 protected void doMarshalSubTypes(VCardSubTypes copy, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode, VCard vcard) {
139 if (url != null) {
140 ValueParameter vp = (version == VCardVersion.V2_1) ? ValueParameter.URL : ValueParameter.URI;
141 copy.setValue(vp);
142 } else {
143 copy.setValue(null);
144 }
145 }
146
147 @Override
148 protected void doMarshalText(StringBuilder sb, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode) {
149 if (url != null) {
150 sb.append(url);
151 } else if (vcard != null) {
152 throw new EmbeddedVCardException(vcard);
153 } else {
154 throw new SkipMeException("Property has neither a URL nor an embedded vCard.");
155 }
156 }
157
158 @Override
159 protected void doUnmarshalText(String value, VCardVersion version, List<String> warnings, CompatibilityMode compatibilityMode) {
160 if (subTypes.getValue() != null) {
161 setUrl(VCardStringUtils.unescape(value));
162 } else {
163 throw new EmbeddedVCardException(new Injector());
164 }
165 }
166
167 @Override
168 protected void doUnmarshalHtml(HCardElement element, List<String> warnings) {
169 Set<String> classes = element.classNames();
170 if (classes.contains("vcard")) {
171 throw new EmbeddedVCardException(new Injector());
172 } else {
173 String href = element.absUrl("href");
174 if (href.length() > 0) {
175 setUrl(element.value());
176 }
177 }
178 }
179
180 private class Injector implements EmbeddedVCardException.InjectionCallback {
181 public void injectVCard(VCard vcard) {
182 setVCard(vcard);
183 }
184 }
185 }