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.autodiscover.request; 025 026import microsoft.exchange.webservices.data.autodiscover.AutodiscoverService; 027import microsoft.exchange.webservices.data.autodiscover.enumeration.AutodiscoverErrorCode; 028import microsoft.exchange.webservices.data.autodiscover.response.AutodiscoverResponse; 029import microsoft.exchange.webservices.data.autodiscover.response.GetUserSettingsResponseCollection; 030import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter; 031import microsoft.exchange.webservices.data.core.EwsUtilities; 032import microsoft.exchange.webservices.data.core.EwsXmlReader; 033import microsoft.exchange.webservices.data.core.ExchangeServiceBase; 034import microsoft.exchange.webservices.data.core.XmlElementNames; 035import microsoft.exchange.webservices.data.autodiscover.enumeration.UserSettingName; 036import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; 037import microsoft.exchange.webservices.data.core.exception.service.local.ServiceValidationException; 038import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException; 039 040import javax.xml.stream.XMLStreamException; 041 042import java.net.URI; 043import java.util.List; 044 045/** 046 * Represents a GetUserSettings request. 047 */ 048public class GetUserSettingsRequest extends AutodiscoverRequest { 049 050 /** 051 * Action Uri of Autodiscover.GetUserSettings method. 052 */ 053 private static final String GetUserSettingsActionUri = EwsUtilities. 054 AutodiscoverSoapNamespace + 055 "/Autodiscover/GetUserSettings"; 056 057 private List<String> smtpAddresses; 058 private List<UserSettingName> settings; 059 060 061 // Expect this request to return the partner token. 062 063 private boolean expectPartnerToken = false; 064 private String partnerTokenReference; 065 private String partnerToken; 066 067 /** 068 * Initializes a new instance of the {@link GetUserSettingsRequest} class. 069 * 070 * @param service the service 071 * @param url the url 072 * @throws ServiceValidationException on validation error 073 */ 074 public GetUserSettingsRequest(AutodiscoverService service, URI url) throws ServiceValidationException { 075 this(service, url, false); 076 } 077 078 /** 079 * Initializes a new instance of the {@link GetUserSettingsRequest} class. 080 * 081 * @param service autodiscover service associated with this request 082 * @param url URL of Autodiscover service 083 * @param expectPartnerToken expect partner token or not 084 * @throws ServiceValidationException on validation error 085 */ 086 public GetUserSettingsRequest(AutodiscoverService service, URI url, boolean expectPartnerToken) 087 throws ServiceValidationException { 088 super(service, url); 089 this.expectPartnerToken = expectPartnerToken; 090 091 // make an explicit https check. 092 if (expectPartnerToken && !url.getScheme().equalsIgnoreCase("https")) { 093 throw new ServiceValidationException("Https is required."); 094 } 095 } 096 097 /** 098 * Validates the request. 099 * 100 * @throws Exception the exception 101 */ 102 @Override 103 protected void validate() throws Exception { 104 super.validate(); 105 106 EwsUtilities.validateParam(this.getSmtpAddresses(), "smtpAddresses"); 107 EwsUtilities.validateParam(this.getSettings(), "settings"); 108 109 if (this.getSettings().size() == 0) { 110 throw new ServiceValidationException("At least one setting must be requested."); 111 } 112 113 if (this.getSmtpAddresses().size() == 0) { 114 throw new ServiceValidationException("At least one SMTP address must be requested."); 115 } 116 117 for (String smtpAddress : this.getSmtpAddresses()) { 118 if (smtpAddress == null || smtpAddress.isEmpty()) { 119 throw new ServiceValidationException("A valid SMTP address must be specified."); 120 } 121 } 122 } 123 124 /** 125 * Executes this instance. 126 * 127 * @return the gets the user settings response collection 128 * @throws Exception the exception 129 */ 130 public GetUserSettingsResponseCollection execute() throws Exception { 131 GetUserSettingsResponseCollection responses = 132 (GetUserSettingsResponseCollection) this 133 .internalExecute(); 134 if (responses.getErrorCode() == AutodiscoverErrorCode.NoError) { 135 this.postProcessResponses(responses); 136 } 137 return responses; 138 } 139 140 /** 141 * Post-process response to GetUserSettings. 142 * 143 * @param responses The GetUserSettings response. 144 */ 145 private void postProcessResponses( 146 GetUserSettingsResponseCollection responses) { 147 // Note:The response collection may not include all of the requested 148 // users if the request has been throttled. 149 for (int index = 0; index < responses.getCount(); index++) { 150 responses.getResponses().get(index).setSmtpAddress( 151 this.getSmtpAddresses().get(index)); 152 } 153 } 154 155 /** 156 * Gets the name of the request XML element. 157 * 158 * @return Request XML element name. 159 */ 160 @Override 161 protected String getRequestXmlElementName() { 162 return XmlElementNames.GetUserSettingsRequestMessage; 163 } 164 165 /** 166 * Gets the name of the response XML element. 167 * 168 * @return Response XML element name. 169 */ 170 @Override 171 protected String getResponseXmlElementName() { 172 return XmlElementNames.GetUserSettingsResponseMessage; 173 } 174 175 /** 176 * Gets the WS-Addressing action name. 177 * 178 * @return WS-Addressing action name. 179 */ 180 @Override 181 protected String getWsAddressingActionName() { 182 return GetUserSettingsActionUri; 183 } 184 185 /** 186 * Creates the service response. 187 * 188 * @return AutodiscoverResponse 189 */ 190 @Override 191 protected AutodiscoverResponse createServiceResponse() { 192 return new GetUserSettingsResponseCollection(); 193 } 194 195 /** 196 * Writes the attribute to XML. 197 * 198 * @param writer The writer. 199 * @throws ServiceXmlSerializationException the service xml serialization exception 200 */ 201 @Override 202 protected void writeAttributesToXml(EwsServiceXmlWriter writer) 203 throws ServiceXmlSerializationException { 204 writer.writeAttributeValue("xmlns", 205 EwsUtilities.AutodiscoverSoapNamespacePrefix, 206 EwsUtilities.AutodiscoverSoapNamespace); 207 } 208 209 /** 210 * @param writer XML writer 211 * @throws XMLStreamException the XML stream exception 212 * @throws ServiceXmlSerializationException the service xml serialization exception 213 */ 214 @Override public void writeExtraCustomSoapHeadersToXml(EwsServiceXmlWriter writer) throws XMLStreamException, 215 ServiceXmlSerializationException { 216 if (this.expectPartnerToken) { 217 writer 218 .writeElementValue(XmlNamespace.Autodiscover, 219 XmlElementNames.BinarySecret, 220 new String(org.apache.commons.codec.binary.Base64. 221 encodeBase64(ExchangeServiceBase.getSessionKey()))); 222 } 223 } 224 225 /** 226 * Writes request to XML. 227 * 228 * @param writer the writer 229 * @throws XMLStreamException the XML stream exception 230 * @throws ServiceXmlSerializationException the service xml serialization exception 231 */ 232 @Override 233 protected void writeElementsToXml(EwsServiceXmlWriter writer) 234 throws XMLStreamException, ServiceXmlSerializationException { 235 writer.writeStartElement(XmlNamespace.Autodiscover, 236 XmlElementNames.Request); 237 238 writer.writeStartElement(XmlNamespace.Autodiscover, 239 XmlElementNames.Users); 240 241 for (String smtpAddress : this.getSmtpAddresses()) { 242 writer.writeStartElement(XmlNamespace.Autodiscover, 243 XmlElementNames.User); 244 245 if (!(smtpAddress == null || smtpAddress.isEmpty())) { 246 writer.writeElementValue(XmlNamespace.Autodiscover, 247 XmlElementNames.Mailbox, smtpAddress); 248 } 249 writer.writeEndElement(); // User 250 } 251 writer.writeEndElement(); // Users 252 253 writer.writeStartElement(XmlNamespace.Autodiscover, 254 XmlElementNames.RequestedSettings); 255 for (UserSettingName setting : this.getSettings()) { 256 writer.writeElementValue(XmlNamespace.Autodiscover, 257 XmlElementNames.Setting, setting); 258 } 259 260 writer.writeEndElement(); // RequestedSettings 261 262 writer.writeEndElement(); // Request 263 } 264 265 /** 266 * Read the partner token soap header. 267 * 268 * @param reader EWS XML reader 269 * @throws Exception on error 270 */ 271 @Override 272 protected void readSoapHeader(EwsXmlReader reader) throws Exception { 273 super.readSoapHeader(reader); 274 275 if (this.expectPartnerToken) { 276 if (reader.isStartElement(XmlNamespace.Autodiscover, 277 XmlElementNames.PartnerToken)) { 278 this.partnerToken = reader.readInnerXml(); 279 } 280 281 if (reader.isStartElement(XmlNamespace.Autodiscover, 282 XmlElementNames.PartnerTokenReference)) { 283 partnerTokenReference = reader.readInnerXml(); 284 } 285 } 286 } 287 288 /** 289 * Gets the SMTP addresses. 290 * @return the SMTP addresses 291 */ 292 protected List<String> getSmtpAddresses() { 293 return smtpAddresses; 294 } 295 296 /** 297 * Sets the smtp addresses. 298 * @param value the new smtp addresses 299 */ 300 public void setSmtpAddresses(List<String> value) { 301 this.smtpAddresses = value; 302 } 303 304 /** 305 * Gets the settings. 306 * @return the settings 307 */ 308 protected List<UserSettingName> getSettings() { 309 return settings; 310 } 311 312 /** 313 * Sets the settings. 314 * 315 * @param value the new settings 316 */ 317 public void setSettings(List<UserSettingName> value) { 318 this.settings = value; 319 320 } 321 322 /** 323 * Gets the partner token. 324 * @return partner token 325 */ 326 protected String getPartnerToken() { 327 return partnerToken; 328 } 329 330 private void setPartnerToken(String value) { 331 partnerToken = value; 332 } 333 334 /** 335 * Gets the partner token reference. 336 * @return partner token reference 337 */ 338 protected String getPartnerTokenReference() { 339 return partnerTokenReference; 340 341 } 342 343 private void setPartnerTokenReference(String tokenReference) { 344 partnerTokenReference = tokenReference; 345 } 346}