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 024package microsoft.exchange.webservices.data.property.complex; 025 026import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; 027import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter; 028import microsoft.exchange.webservices.data.core.ILazyMember; 029import microsoft.exchange.webservices.data.core.LazyMember; 030import microsoft.exchange.webservices.data.core.SimplePropertyBag; 031import microsoft.exchange.webservices.data.core.XmlAttributeNames; 032import microsoft.exchange.webservices.data.core.XmlElementNames; 033import microsoft.exchange.webservices.data.core.service.ServiceObject; 034import microsoft.exchange.webservices.data.core.enumeration.property.PhysicalAddressKey; 035import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; 036import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException; 037 038import javax.xml.stream.XMLStreamException; 039 040import java.util.ArrayList; 041import java.util.List; 042 043/** 044 * Represents an entry of an PhysicalAddressDictionary. 045 */ 046public final class PhysicalAddressEntry extends DictionaryEntryProperty<PhysicalAddressKey> implements 047 IPropertyBagChangedDelegate<String> { 048 049 /** 050 * The property bag. 051 */ 052 private SimplePropertyBag<String> propertyBag; 053 054 /** 055 * Initializes a new instance of PhysicalAddressEntry. 056 */ 057 public PhysicalAddressEntry() { 058 super(PhysicalAddressKey.class); 059 this.propertyBag = new SimplePropertyBag<String>(); 060 this.propertyBag.addOnChangeEvent(this); 061 } 062 063 /** 064 * Property was changed. 065 * 066 * @param simplePropertyBag the simple property bag 067 */ 068 public void propertyBagChanged(SimplePropertyBag<String> simplePropertyBag) { 069 this.changed(); 070 } 071 072 /** 073 * Gets the street. 074 * 075 * @return the street 076 * @throws Exception the exception 077 */ 078 public String getStreet() throws Exception { 079 return (String) this.propertyBag 080 .getSimplePropertyBag(PhysicalAddressSchema.Street); 081 } 082 083 /** 084 * Sets the street. 085 * 086 * @param value the new street 087 * @throws Exception the exception 088 */ 089 public void setStreet(String value) throws Exception { 090 this.propertyBag.setSimplePropertyBag(PhysicalAddressSchema.Street, 091 value); 092 093 } 094 095 /** 096 * Gets the city. 097 * 098 * @return the city 099 * @throws Exception the exception 100 */ 101 public String getCity() throws Exception { 102 return (String) this.propertyBag 103 .getSimplePropertyBag(PhysicalAddressSchema.City); 104 } 105 106 /** 107 * Sets the city. 108 * 109 * @param value the new city 110 */ 111 public void setCity(String value) { 112 this.propertyBag 113 .setSimplePropertyBag(PhysicalAddressSchema.City, value); 114 } 115 116 /** 117 * Gets the state. 118 * 119 * @return the state 120 * @throws Exception the exception 121 */ 122 public String getState() throws Exception { 123 return (String) this.propertyBag 124 .getSimplePropertyBag(PhysicalAddressSchema.State); 125 } 126 127 /** 128 * Sets the state. 129 * 130 * @param value the new state 131 */ 132 public void setState(String value) { 133 this.propertyBag.setSimplePropertyBag(PhysicalAddressSchema.State, 134 value); 135 } 136 137 /** 138 * Gets the country or region. 139 * 140 * @return the country or region 141 * @throws Exception the exception 142 */ 143 public String getCountryOrRegion() throws Exception { 144 return (String) this.propertyBag 145 .getSimplePropertyBag(PhysicalAddressSchema.CountryOrRegion); 146 } 147 148 /** 149 * Sets the country or region. 150 * 151 * @param value the new country or region 152 */ 153 public void setCountryOrRegion(String value) { 154 this.propertyBag.setSimplePropertyBag( 155 PhysicalAddressSchema.CountryOrRegion, value); 156 } 157 158 /** 159 * Gets the postal code. 160 * 161 * @return the postal code 162 */ 163 public String getPostalCode() { 164 return (String) this.propertyBag 165 .getSimplePropertyBag(PhysicalAddressSchema.PostalCode); 166 } 167 168 /** 169 * Sets the postal code. 170 * 171 * @param value the new postal code 172 */ 173 public void setPostalCode(String value) { 174 this.propertyBag.setSimplePropertyBag(PhysicalAddressSchema.PostalCode, 175 value); 176 } 177 178 /** 179 * Clears the change log. 180 */ 181 @Override public void clearChangeLog() { 182 this.propertyBag.clearChangeLog(); 183 } 184 185 /** 186 * Writes elements to XML. 187 * 188 * @param reader the reader 189 * @return true, if successful 190 * @throws Exception the exception 191 */ 192 @Override 193 public boolean tryReadElementFromXml(EwsServiceXmlReader reader) 194 throws Exception { 195 if (PhysicalAddressSchema.getXmlElementNames().contains( 196 reader.getLocalName())) { 197 this.propertyBag.setSimplePropertyBag(reader.getLocalName(), reader 198 .readElementValue()); 199 return true; 200 } else { 201 return false; 202 } 203 } 204 205 /** 206 * Writes elements to XML. 207 * 208 * @param writer the writer 209 * @throws XMLStreamException the XML stream exception 210 * @throws ServiceXmlSerializationException the service xml serialization exception 211 */ 212 @Override 213 public void writeElementsToXml(EwsServiceXmlWriter writer) 214 throws XMLStreamException, ServiceXmlSerializationException { 215 for (String xmlElementName : PhysicalAddressSchema.getXmlElementNames()) { 216 writer.writeElementValue(XmlNamespace.Types, xmlElementName, 217 this.propertyBag.getSimplePropertyBag(xmlElementName)); 218 219 } 220 } 221 222 /** 223 * Writes the update to XML. 224 * 225 * @param writer the writer 226 * @param ewsObject the ews object 227 * @param ownerDictionaryXmlElementName the owner dictionary xml element name 228 * @return true if update XML was written 229 * @throws XMLStreamException the XML stream exception 230 * @throws ServiceXmlSerializationException the service xml serialization exception 231 */ 232 @Override 233 protected boolean writeSetUpdateToXml(EwsServiceXmlWriter writer, 234 ServiceObject ewsObject, String ownerDictionaryXmlElementName) 235 throws XMLStreamException, ServiceXmlSerializationException { 236 List<String> fieldsToSet = new ArrayList<String>(); 237 238 for (String xmlElementName : this.propertyBag.getAddedItems()) { 239 fieldsToSet.add(xmlElementName); 240 } 241 242 for (String xmlElementName : this.propertyBag.getModifiedItems()) { 243 fieldsToSet.add(xmlElementName); 244 } 245 246 for (String xmlElementName : fieldsToSet) { 247 writer.writeStartElement(XmlNamespace.Types, ewsObject 248 .getSetFieldXmlElementName()); 249 250 writer.writeStartElement(XmlNamespace.Types, 251 XmlElementNames.IndexedFieldURI); 252 writer.writeAttributeValue(XmlAttributeNames.FieldURI, 253 getFieldUri(xmlElementName)); 254 writer.writeAttributeValue(XmlAttributeNames.FieldIndex, this 255 .getKey().toString()); 256 writer.writeEndElement(); // IndexedFieldURI 257 258 writer.writeStartElement(XmlNamespace.Types, ewsObject 259 .getXmlElementName()); 260 writer.writeStartElement(XmlNamespace.Types, 261 ownerDictionaryXmlElementName); 262 writer.writeStartElement(XmlNamespace.Types, XmlElementNames.Entry); 263 this.writeAttributesToXml(writer); 264 writer.writeElementValue(XmlNamespace.Types, xmlElementName, 265 this.propertyBag.getSimplePropertyBag(xmlElementName)); 266 writer.writeEndElement(); // Entry 267 writer.writeEndElement(); // ownerDictionaryXmlElementName 268 writer.writeEndElement(); // ewsObject.GetXmlElementName() 269 270 writer.writeEndElement(); // ewsObject.GetSetFieldXmlElementName() 271 } 272 273 for (String xmlElementName : this.propertyBag.getRemovedItems()) { 274 this.internalWriteDeleteFieldToXml(writer, ewsObject, 275 xmlElementName); 276 } 277 278 return true; 279 } 280 281 /** 282 * Writes the delete update to XML. 283 * 284 * @param writer the writer 285 * @param ewsObject the ews object 286 * @return true if update XML was written 287 * @throws XMLStreamException the XML stream exception 288 * @throws ServiceXmlSerializationException the service xml serialization exception 289 */ 290 @Override 291 protected boolean writeDeleteUpdateToXml(EwsServiceXmlWriter writer, 292 ServiceObject ewsObject) throws XMLStreamException, 293 ServiceXmlSerializationException { 294 for (String xmlElementName : PhysicalAddressSchema.getXmlElementNames()) { 295 this.internalWriteDeleteFieldToXml(writer, ewsObject, 296 xmlElementName); 297 } 298 return true; 299 } 300 301 /** 302 * Gets the field URI. 303 * 304 * @param xmlElementName the xml element name 305 * @return Field URI. 306 */ 307 private static String getFieldUri(String xmlElementName) { 308 return "contacts:PhysicalAddress:" + xmlElementName; 309 } 310 311 /** 312 * Write field deletion to XML. 313 * 314 * @param writer the writer 315 * @param ewsObject the ews object 316 * @param fieldXmlElementName the field xml element name 317 * @throws XMLStreamException the XML stream exception 318 * @throws ServiceXmlSerializationException the service xml serialization exception 319 */ 320 private void internalWriteDeleteFieldToXml(EwsServiceXmlWriter writer, 321 ServiceObject ewsObject, String fieldXmlElementName) 322 throws XMLStreamException, ServiceXmlSerializationException { 323 writer.writeStartElement(XmlNamespace.Types, ewsObject 324 .getDeleteFieldXmlElementName()); 325 writer.writeStartElement(XmlNamespace.Types, 326 XmlElementNames.IndexedFieldURI); 327 writer.writeAttributeValue(XmlAttributeNames.FieldURI, 328 getFieldUri(fieldXmlElementName)); 329 writer.writeAttributeValue(XmlAttributeNames.FieldIndex, this.getKey() 330 .toString()); 331 writer.writeEndElement(); // IndexedFieldURI 332 writer.writeEndElement(); // ewsObject.GetDeleteFieldXmlElementName() 333 } 334 335 /** 336 * Schema definition for PhysicalAddress. 337 */ 338 private static class PhysicalAddressSchema { 339 340 /** 341 * The Constant Street. 342 */ 343 public static final String Street = "Street"; 344 345 /** 346 * The Constant City. 347 */ 348 public static final String City = "City"; 349 350 /** 351 * The Constant State. 352 */ 353 public static final String State = "State"; 354 355 /** 356 * The Constant CountryOrRegion. 357 */ 358 public static final String CountryOrRegion = "CountryOrRegion"; 359 360 /** 361 * The Constant PostalCode. 362 */ 363 public static final String PostalCode = "PostalCode"; 364 365 /** 366 * List of XML element names. 367 */ 368 private static LazyMember<List<String>> xmlElementNames = 369 new LazyMember<List<String>>( 370 371 new ILazyMember<List<String>>() { 372 @Override 373 public List<String> createInstance() { 374 List<String> result = new ArrayList<String>(); 375 result.add(Street); 376 result.add(City); 377 result.add(State); 378 result.add(CountryOrRegion); 379 result.add(PostalCode); 380 return result; 381 } 382 }); 383 384 /** 385 * Gets the XML element names. 386 * 387 * @return The XML element names. 388 */ 389 public static List<String> getXmlElementNames() { 390 return xmlElementNames.getMember(); 391 } 392 } 393 394}