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.XmlAttributeNames;
030 import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
031 import org.apache.commons.lang3.StringUtils;
032
033 /**
034 * Represents the Id of an Exchange object.
035 */
036 public abstract class ServiceId extends ComplexProperty {
037
038 /**
039 * The change key.
040 */
041 private String changeKey;
042
043 /**
044 * The unique id.
045 */
046 private String uniqueId;
047
048 /**
049 * Initializes a new instance.
050 */
051 public ServiceId() {
052 super();
053 }
054
055 /**
056 * Initializes a new instance.
057 *
058 * @param uniqueId The unique id.
059 * @throws Exception the exception
060 */
061 public ServiceId(String uniqueId) throws Exception {
062 this();
063 EwsUtilities.validateParam(uniqueId, "uniqueId");
064 this.uniqueId = uniqueId;
065 }
066
067 /**
068 * Read attribute from XML.
069 *
070 * @param reader The reader.
071 * @throws Exception the exception
072 */
073 @Override
074 public void readAttributesFromXml(EwsServiceXmlReader reader)
075 throws Exception {
076 this.uniqueId = reader.readAttributeValue(XmlAttributeNames.Id);
077 this.changeKey = reader.readAttributeValue(XmlAttributeNames.ChangeKey);
078
079 }
080
081 /**
082 * Writes attribute to XML.
083 *
084 * @param writer The writer.
085 * @throws ServiceXmlSerializationException the service xml serialization exception
086 */
087 @Override
088 public void writeAttributesToXml(EwsServiceXmlWriter writer)
089 throws ServiceXmlSerializationException {
090 writer.writeAttributeValue(XmlAttributeNames.Id, this.getUniqueId());
091 writer.writeAttributeValue(XmlAttributeNames.ChangeKey, this
092 .getChangeKey());
093 }
094
095 /**
096 * Gets the name of the XML element.
097 *
098 * @return XML element name.
099 */
100 public abstract String getXmlElementName();
101
102 /**
103 * Writes to XML.
104 *
105 * @param writer The writer.
106 * @throws Exception the exception
107 */
108 public void writeToXml(EwsServiceXmlWriter writer) throws Exception {
109 this.writeToXml(writer, this.getXmlElementName());
110 }
111
112 /**
113 * Assigns from existing id.
114 *
115 * @param source The source.
116 */
117 public void assign(ServiceId source) {
118 this.uniqueId = source.getUniqueId();
119 this.changeKey = source.getChangeKey();
120 }
121
122 /**
123 * True if this instance is valid, false otherthise.
124 *
125 * @return true if this instance is valid; otherwise,false
126 */
127 public boolean isValid() {
128 return (null != this.uniqueId && !this.uniqueId.isEmpty());
129 }
130
131 /**
132 * Gets the unique Id of the Exchange object.
133 *
134 * @return unique Id of the Exchange object.
135 */
136 public String getUniqueId() {
137 return uniqueId;
138 }
139
140 /**
141 * Sets the unique Id of the Exchange object.
142 *
143 * @param uniqueId unique Id of the Exchange object.
144 */
145 public void setUniqueId(String uniqueId) {
146 this.uniqueId = uniqueId;
147 }
148
149 /**
150 * Gets the change key associated with the Exchange object. The change key
151 * represents the version of the associated item or folder.
152 *
153 * @return change key associated with the Exchange object.
154 */
155 public String getChangeKey() {
156 return changeKey;
157 }
158
159 /**
160 * Sets the change key associated with the Exchange object. The change key
161 * represents the version of the associated item or folder.
162 *
163 * @param changeKey change key associated with the Exchange object.
164 */
165 public void setChangeKey(String changeKey) {
166 this.changeKey = changeKey;
167 }
168
169 /**
170 * Determines whether two ServiceId instances are equal (including
171 * ChangeKeys).
172 *
173 * @param other The ServiceId to compare with the current ServiceId.
174 * @return true if equal otherwise false.
175 */
176 public boolean sameIdAndChangeKey(final ServiceId other) {
177 return this.equals(other) && StringUtils.equals(this.getChangeKey(), other.getChangeKey());
178 }
179
180 /**
181 * Determines whether the specified instance is equal to the current
182 * instance. We do not consider the ChangeKey for ServiceId.Equals.
183 *
184 * @param obj The object to compare with the current instance
185 * @return true if the specified object is equal to the current instance,
186 * otherwise, false.
187 */
188 @Override
189 public boolean equals(Object obj) {
190 if (super.equals(obj)) {
191 return true;
192 } else {
193 if (!(obj instanceof ServiceId)) {
194 return false;
195 } else {
196 ServiceId other = (ServiceId) obj;
197 if (!(this.isValid() && other.isValid())) {
198 return false;
199 } else {
200 return this.getUniqueId().equals(other.getUniqueId());
201 }
202 }
203 }
204 }
205
206 /**
207 * Serves as a hash function for a particular type. We do not consider the
208 * change key in the hash code computation.
209 *
210 * @return A hash code for the current
211 */
212 @Override
213 public int hashCode() {
214 return this.isValid() ? this.getUniqueId().hashCode() : super
215 .hashCode();
216 }
217
218 /**
219 * Returns a string that represents the current instance.
220 *
221 * @return A string that represents the current instance.
222 */
223 @Override
224 public String toString() {
225 return (this.uniqueId == null) ? "" : this.uniqueId;
226 }
227 }