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}