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.response;
025
026import microsoft.exchange.webservices.data.autodiscover.AlternateMailboxCollection;
027import microsoft.exchange.webservices.data.autodiscover.ProtocolConnectionCollection;
028import microsoft.exchange.webservices.data.autodiscover.WebClientUrlCollection;
029import microsoft.exchange.webservices.data.autodiscover.exception.error.UserSettingError;
030import microsoft.exchange.webservices.data.core.EwsUtilities;
031import microsoft.exchange.webservices.data.core.EwsXmlReader;
032import microsoft.exchange.webservices.data.core.XmlAttributeNames;
033import microsoft.exchange.webservices.data.core.XmlElementNames;
034import microsoft.exchange.webservices.data.autodiscover.enumeration.UserSettingName;
035import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
036import microsoft.exchange.webservices.data.misc.OutParam;
037import microsoft.exchange.webservices.data.security.XmlNodeType;
038
039import java.util.ArrayList;
040import java.util.Collection;
041import java.util.HashMap;
042import java.util.Map;
043
044/**
045 * Represents the response to a GetUsersSettings call for an individual user.
046 */
047public final class GetUserSettingsResponse extends AutodiscoverResponse {
048
049  /**
050   * The smtp address.
051   */
052  private String smtpAddress;
053
054  /**
055   * The redirect target.
056   */
057  private String redirectTarget;
058
059  /**
060   * The settings.
061   */
062  private Map<UserSettingName, Object> settings;
063
064  /**
065   * The user setting errors.
066   */
067  private Collection<UserSettingError> userSettingErrors;
068
069  /**
070   * Initializes a new instance of the {@link GetUserSettingsResponse} class.
071   */
072  public GetUserSettingsResponse() {
073    super();
074    this.setSmtpAddress(null);
075    this.setSettings(new HashMap<UserSettingName, Object>());
076    this.setUserSettingErrors(new ArrayList<UserSettingError>());
077  }
078
079  /**
080   * Tries the get the user setting value.
081   *
082   * @param cls     Type of user setting.
083   * @param setting The setting.
084   * @param value   The setting value.
085   * @return True if setting was available.
086   */
087  public <T> boolean tryGetSettingValue(Class<T> cls,
088      UserSettingName setting, OutParam<T> value) {
089    Object objValue;
090    if (this.getSettings().containsKey(setting)) {
091      objValue = this.getSettings().get(setting);
092      value.setParam((T) objValue);
093      return true;
094    } else {
095      value.setParam(null);
096      return false;
097    }
098  }
099
100  /**
101   * Gets the SMTP address this response applies to.
102   *
103   * @return the smtp address
104   */
105  public String getSmtpAddress() {
106    return this.smtpAddress;
107  }
108
109  /**
110   * Sets the smtp address.
111   *
112   * @param value the new smtp address
113   */
114  public void setSmtpAddress(String value) {
115    this.smtpAddress = value;
116  }
117
118  /**
119   * Gets the redirectionTarget (URL or email address).
120   *
121   * @return the redirect target
122   */
123  public String getRedirectTarget() {
124    return this.redirectTarget;
125  }
126
127  /**
128   * Sets the redirectionTarget (URL or email address).
129   * @param value redirect target value
130   */
131  public void setRedirectTarget(String value) {
132    this.redirectTarget = value;
133  }
134
135  /**
136   * Gets the requested settings for the user.
137   *
138   * @return the settings
139   */
140  public Map<UserSettingName, Object> getSettings() {
141    return this.settings;
142  }
143
144  /**
145   * Sets the requested settings for the user.
146   * @param settings settings map
147   */
148  public void setSettings(Map<UserSettingName, Object> settings) {
149    this.settings = settings;
150  }
151
152  /**
153   * Gets error information for settings that could not be returned.
154   *
155   * @return the user setting errors
156   */
157  public Collection<UserSettingError> getUserSettingErrors() {
158    return this.userSettingErrors;
159  }
160
161  /**
162   * Sets the requested settings for the user.
163   * @param value user setting errors
164   */
165  protected void setUserSettingErrors(Collection<UserSettingError> value) {
166    this.userSettingErrors = value;
167  }
168
169  /**
170   * Loads response from XML.
171   *
172   * @param reader         The reader.
173   * @param endElementName End element name.
174   * @throws Exception the exception
175   */
176  @Override public void loadFromXml(EwsXmlReader reader, String endElementName)
177      throws Exception {
178    do {
179      reader.read();
180
181      if (reader.getNodeType().getNodeType() == XmlNodeType.START_ELEMENT) {
182        if (reader.getLocalName()
183            .equals(XmlElementNames.RedirectTarget)) {
184
185          this.setRedirectTarget(reader.readElementValue());
186        } else if (reader.getLocalName().equals(
187            XmlElementNames.UserSettingErrors)) {
188          this.loadUserSettingErrorsFromXml(reader);
189        } else if (reader.getLocalName().equals(
190            XmlElementNames.UserSettings)) {
191          this.loadUserSettingsFromXml(reader);
192        } else {
193          super.loadFromXml(reader, endElementName);
194        }
195      }
196    } while (!reader
197        .isEndElement(XmlNamespace.Autodiscover, endElementName));
198  }
199
200  /**
201   * Loads from XML.
202   *
203   * @param reader The reader.
204   * @throws Exception the exception
205   */
206  protected void loadUserSettingsFromXml(EwsXmlReader reader)
207      throws Exception {
208    if (!reader.isEmptyElement()) {
209      do {
210        reader.read();
211
212        if ((reader.getNodeType().getNodeType() == XmlNodeType.START_ELEMENT) &&
213            (reader.getLocalName()
214                .equals(XmlElementNames.UserSetting))) {
215          String settingClass = reader.readAttributeValue(
216              XmlNamespace.XmlSchemaInstance,
217              XmlAttributeNames.Type);
218
219          if (settingClass.equals(XmlElementNames.StringSetting)) {
220            this.readSettingFromXml(reader);
221          } else if (settingClass.equals(XmlElementNames.WebClientUrlCollectionSetting)) {
222            this.readSettingFromXml(reader);
223          } else if (settingClass.equals(XmlElementNames.AlternateMailboxCollectionSetting)) {
224            this.readSettingFromXml(reader);
225          } else if (settingClass.equals(XmlElementNames.ProtocolConnectionCollectionSetting)) {
226            this.readSettingFromXml(reader);
227          } else {
228            EwsUtilities.ewsAssert(false, "GetUserSettingsResponse." + "LoadUserSettingsFromXml", String
229                .format("%s,%s", "Invalid setting class '%s' returned", settingClass));
230            break;
231          }
232        }
233      } while (!reader.isEndElement(XmlNamespace.Autodiscover,
234          XmlElementNames.UserSettings));
235    } else {
236      reader.read();
237    }
238  }
239
240  /**
241   * Reads user setting from XML.
242   *
243   * @param reader The reader.
244   * @throws Exception the exception
245   */
246  private void readSettingFromXml(EwsXmlReader reader) throws Exception {
247    UserSettingName name = null;
248    Object value = null;
249
250    do {
251      reader.read();
252
253      if (reader.getNodeType().getNodeType() == XmlNodeType.START_ELEMENT) {
254        if (reader.getLocalName().equals(XmlElementNames.Name)) {
255          name = reader.readElementValue(UserSettingName.class);
256        } else if (reader.getLocalName().equals(XmlElementNames.Value)) {
257          value = reader.readElementValue();
258        } else if (reader.getLocalName().equals(
259            XmlElementNames.WebClientUrls)) {
260
261          value = WebClientUrlCollection.loadFromXml(reader);
262        } else if (reader.getLocalName().equals(
263            XmlElementNames.ProtocolConnections)) {
264          value = ProtocolConnectionCollection.loadFromXml(reader);
265        } else if (reader.getLocalName().equals(
266            XmlElementNames.AlternateMailboxes)) {
267          value = AlternateMailboxCollection.loadFromXml(reader);
268        }
269      }
270    } while (!reader.isEndElement(XmlNamespace.Autodiscover,
271        XmlElementNames.UserSetting));
272
273    EwsUtilities.ewsAssert(name != null, "GetUserSettingsResponse.ReadSettingFromXml",
274                           "Missing name element in user setting");
275
276    this.getSettings().put(name, value);
277  }
278
279  /**
280   * Loads the user setting errors.
281   *
282   * @param reader The reader.
283   * @throws Exception the exception
284   */
285  private void loadUserSettingErrorsFromXml(EwsXmlReader reader)
286      throws Exception {
287    if (!reader.isEmptyElement()) {
288      do {
289        reader.read();
290
291        if ((reader.getNodeType().getNodeType() == XmlNodeType.START_ELEMENT) &&
292            (reader.getLocalName()
293                .equals(XmlElementNames.UserSettingError))) {
294          UserSettingError error = new UserSettingError();
295          error.loadFromXml(reader);
296          this.getUserSettingErrors().add(error);
297        }
298      } while (!reader.isEndElement(XmlNamespace.Autodiscover,
299          XmlElementNames.UserSettingErrors));
300    } else {
301      reader.read();
302    }
303  }
304}