001 /*
002 * The MIT License
003 * Copyright (c) 2012 Microsoft Corporation
004 *
005 * Permission is hereby granted, free of charge, to any person obtaining a copy
006 * of this software and associated documentation files (the "Software"), to deal
007 * in the Software without restriction, including without limitation the rights
008 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
009 * copies of the Software, and to permit persons to whom the Software is
010 * furnished to do so, subject to the following conditions:
011 *
012 * The above copyright notice and this permission notice shall be included in
013 * all copies or substantial portions of the Software.
014 *
015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
020 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
021 * THE SOFTWARE.
022 */
023
024 package microsoft.exchange.webservices.data.property.complex;
025
026 import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027 import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
028 import microsoft.exchange.webservices.data.core.EwsUtilities;
029 import microsoft.exchange.webservices.data.core.XmlElementNames;
030 import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
031 import microsoft.exchange.webservices.data.core.exception.service.local.ServiceValidationException;
032 import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
033
034 import javax.xml.stream.XMLStreamException;
035
036 /**
037 * Represents a mailbox reference.
038 */
039 public class Mailbox extends ComplexProperty implements ISearchStringProvider {
040
041 // Routing type
042 /**
043 * The routing type.
044 */
045 private String routingType;
046
047 // Email address
048 /**
049 * The address.
050 */
051 private String address;
052
053 /**
054 * Initializes a new instance of the Mailbox class.
055 */
056 public Mailbox() {
057 super();
058 }
059
060 /**
061 * Initializes a new instance of the Mailbox class.
062 *
063 * @param smtpAddress the smtp address
064 */
065 public Mailbox(String smtpAddress) {
066 this();
067 this.setAddress(smtpAddress);
068 }
069
070 /**
071 * Initializes a new instance of the Mailbox class.
072 *
073 * @param address the address
074 * @param routingType the routing type
075 */
076 public Mailbox(String address, String routingType) {
077 this(address);
078 this.setRoutingType(routingType);
079 }
080
081 /**
082 * Gets the address.
083 *
084 * @return the address
085 */
086 public String getAddress() {
087 return address;
088 }
089
090 /**
091 * Sets the address.
092 *
093 * @param address the new address
094 */
095 public void setAddress(String address) {
096 this.address = address;
097 }
098
099 /**
100 * True if this instance is valid, false otherthise.
101 *
102 * @return true if this instance is valid; otherwise false
103 */
104 public boolean isValid() {
105 return !(this.getAddress() == null || this.getAddress().isEmpty());
106 }
107
108 /**
109 * Gets the routing type of the address used to refer to the user
110 * mailbox.
111 *
112 * @return the routing type
113 */
114 public String getRoutingType() {
115 return routingType;
116 }
117
118 /**
119 * Sets the routing type.
120 *
121 * @param routingType the new routing type
122 */
123 public void setRoutingType(String routingType) {
124 this.routingType = routingType;
125 }
126
127 /**
128 * Defines an implicit conversion between a string representing an SMTP
129 * address and Mailbox.
130 *
131 * @param smtpAddress the smtp address
132 * @return A Mailbox initialized with the specified SMTP address.
133 */
134 public static Mailbox getMailboxFromString(String smtpAddress) {
135 return new Mailbox(smtpAddress);
136 }
137
138 /**
139 * Tries to read element from XML.
140 *
141 * @param reader the reader
142 * @return True if element was read.
143 * @throws Exception the exception
144 */
145 public boolean tryReadElementFromXml(EwsServiceXmlReader reader)
146 throws Exception {
147 if (reader.getLocalName()
148 .equalsIgnoreCase(XmlElementNames.EmailAddress)) {
149 this.setAddress(reader.readElementValue());
150 return true;
151 } else if (reader.getLocalName().equalsIgnoreCase(
152 XmlElementNames.RoutingType)) {
153 this.setRoutingType(reader.readElementValue());
154 return true;
155 } else {
156 return false;
157 }
158 }
159
160 /**
161 * Writes elements to XML.
162 *
163 * @param writer the writer
164 * @throws XMLStreamException the XML stream exception
165 * @throws ServiceXmlSerializationException the service xml serialization exception
166 */
167 public void writeElementsToXml(EwsServiceXmlWriter writer)
168 throws XMLStreamException, ServiceXmlSerializationException {
169 writer.writeElementValue(XmlNamespace.Types,
170 XmlElementNames.EmailAddress, this.address);
171 writer.writeElementValue(XmlNamespace.Types,
172 XmlElementNames.RoutingType, this.routingType);
173 }
174
175 /**
176 * Get a string representation for using this instance in a search filter.
177 *
178 * @return String representation of instance.
179 */
180 public String getSearchString() {
181 return this.address;
182 }
183
184 /**
185 * Validates this instance.
186 *
187 * @throws Exception
188 * @throws ServiceValidationException
189 */
190 @Override
191 protected void internalValidate()
192 throws ServiceValidationException, Exception {
193 super.internalValidate();
194
195 EwsUtilities.validateNonBlankStringParamAllowNull(this.getAddress(), "address");
196 EwsUtilities.validateNonBlankStringParamAllowNull(
197 this.getRoutingType(), "routingType");
198 }
199
200
201 /**
202 * Determines whether the specified Object is equal to the current Object.
203 *
204 * @param obj the obj
205 * @return true if the specified Object is equal to the current Object
206 * otherwise, false.
207 */
208 @Override
209 public boolean equals(Object obj) {
210 if (super.equals(obj)) {
211 return true;
212 } else {
213 if (!(obj instanceof Mailbox)) {
214 return false;
215 } else {
216 Mailbox other = (Mailbox) obj;
217 if (((this.address == null) && (other.address == null))
218 || ((this.address != null) && this.address
219 .equalsIgnoreCase(other.address))) {
220 return ((this.routingType == null) &&
221 (other.routingType == null))
222 || ((this.routingType != null) && this.routingType
223 .equalsIgnoreCase(other.routingType));
224 } else {
225 return false;
226 }
227 }
228 }
229 }
230
231 /**
232 * Serves as a hash function for a particular type.
233 *
234 * @return A hash code for the current object
235 */
236 @Override
237 public int hashCode() {
238 if (!(null == this.getAddress() || this.getAddress().isEmpty())) {
239 int hashCode = this.address.hashCode();
240
241 if (!(null == this.getRoutingType() || this.getRoutingType()
242 .isEmpty())) {
243 hashCode ^= this.routingType.hashCode();
244 }
245 return hashCode;
246 } else {
247 return super.hashCode();
248 }
249 }
250
251 /**
252 * Returns a String that represents the current Object.
253 *
254 * @return A String that represents the current Object.
255 */
256 @Override
257 public String toString() {
258 if (!this.isValid()) {
259 return "";
260 } else if (!(this.routingType == null || this.routingType.isEmpty())) {
261 return this.routingType + ":" + this.address;
262 } else {
263 return this.address;
264 }
265 }
266 }