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.autodiscover.response;
025    
026    import microsoft.exchange.webservices.data.autodiscover.exception.error.DomainSettingError;
027    import microsoft.exchange.webservices.data.core.EwsUtilities;
028    import microsoft.exchange.webservices.data.core.EwsXmlReader;
029    import microsoft.exchange.webservices.data.core.XmlAttributeNames;
030    import microsoft.exchange.webservices.data.core.XmlElementNames;
031    import microsoft.exchange.webservices.data.autodiscover.enumeration.DomainSettingName;
032    import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
033    import microsoft.exchange.webservices.data.security.XmlNodeType;
034    import org.apache.commons.logging.Log;
035    import org.apache.commons.logging.LogFactory;
036    
037    import java.util.ArrayList;
038    import java.util.Collection;
039    import java.util.HashMap;
040    import java.util.Map;
041    
042    /**
043     * Represents the response to a GetDomainSettings call for an individual domain.
044     */
045    public final class GetDomainSettingsResponse extends AutodiscoverResponse {
046    
047      private static final Log LOG = LogFactory.getLog(GetDomainSettingsResponse.class);
048    
049      /**
050       * The domain.
051       */
052      private String domain;
053    
054      /**
055       * The redirect target.
056       */
057      private String redirectTarget;
058    
059      /**
060       * The settings.
061       */
062      private Map<DomainSettingName, Object> settings;
063    
064      /**
065       * The domain setting errors.
066       */
067      private Collection<DomainSettingError> domainSettingErrors;
068    
069      /**
070       * Initializes a new instance of the {@link GetDomainSettingsResponse} class.
071       */
072      public GetDomainSettingsResponse() {
073        super();
074        this.domain = "";
075        this.settings = new HashMap<DomainSettingName, Object>();
076        this.domainSettingErrors = new ArrayList<DomainSettingError>();
077      }
078    
079      /**
080       * Gets the domain this response applies to.
081       *
082       * @return the domain
083       */
084      public String getDomain() {
085        return this.domain;
086      }
087    
088      /**
089       * Sets the domain.
090       *
091       * @param value the new domain
092       */
093      public void setDomain(String value) {
094        this.domain = value;
095      }
096    
097      /**
098       * Gets the redirectionTarget (URL or email address).
099       *
100       * @return the redirect target
101       */
102      public String getRedirectTarget() {
103        return this.redirectTarget;
104      }
105    
106      /**
107       * Gets the requested settings for the domain.
108       *
109       * @return the settings
110       */
111      public Map<DomainSettingName, Object> getSettings() {
112        return this.settings;
113      }
114    
115      /**
116       * Gets error information for settings that could not be returned.
117       *
118       * @return the domain setting errors
119       */
120      public Collection<DomainSettingError> getDomainSettingErrors() {
121        return this.domainSettingErrors;
122      }
123    
124      /**
125       * Loads response from XML.
126       *
127       * @param reader         The reader.
128       * @param endElementName End element name.
129       * @throws Exception the exception
130       */
131      @Override public void loadFromXml(EwsXmlReader reader, String endElementName)
132          throws Exception {
133        do {
134          reader.read();
135    
136          if (reader.getNodeType().nodeType == XmlNodeType.START_ELEMENT) {
137            if (reader.getLocalName()
138                .equals(XmlElementNames.RedirectTarget)) {
139              this.redirectTarget = reader.readElementValue();
140            } else if (reader.getLocalName().equals(
141                XmlElementNames.DomainSettingErrors)) {
142              this.loadDomainSettingErrorsFromXml(reader);
143            } else if (reader.getLocalName().equals(
144                XmlElementNames.DomainSettings)) {
145              try {
146                this.loadDomainSettingsFromXml(reader);
147              } catch (Exception e) {
148                LOG.error(e);
149              }
150            } else {
151              super.loadFromXml(reader, endElementName);
152              break;
153            }
154          }
155        } while (!reader
156            .isEndElement(XmlNamespace.Autodiscover, endElementName));
157      }
158    
159      /**
160       * Loads from XML.
161       *
162       * @param reader The reader.
163       * @throws Exception the exception
164       */
165      protected void loadDomainSettingsFromXml(EwsXmlReader reader)
166          throws Exception {
167        if (!reader.isEmptyElement()) {
168          do {
169            reader.read();
170    
171            if ((reader.getNodeType().nodeType == XmlNodeType.START_ELEMENT) &&
172                (reader.getLocalName()
173                    .equals(XmlElementNames.DomainSetting))) {
174              String settingClass = reader.readAttributeValue(
175                  XmlNamespace.XmlSchemaInstance,
176                  XmlAttributeNames.Type);
177    
178              if (settingClass
179                  .equals(XmlElementNames.DomainStringSetting)) {
180    
181                this.readSettingFromXml(reader);
182              } else {
183                EwsUtilities
184                    .ewsAssert(false, "GetDomainSettingsResponse." + "LoadDomainSettingsFromXml",
185                               String.format("%s,%s", "Invalid setting " + "class '%s' returned", settingClass));
186                break;
187              }
188            }
189          } while (!reader.isEndElement(XmlNamespace.Autodiscover,
190              XmlElementNames.DomainSettings));
191        } else {
192          reader.read();
193        }
194      }
195    
196      /**
197       * Reads domain setting from XML.
198       *
199       * @param reader The reader.
200       * @throws Exception the exception
201       */
202      private void readSettingFromXml(EwsXmlReader reader) throws Exception {
203        DomainSettingName name = null;
204        Object value = null;
205    
206        do {
207          reader.read();
208    
209          if (reader.getNodeType().nodeType == XmlNodeType.START_ELEMENT) {
210            if (reader.getLocalName().equals(
211                XmlElementNames.DomainStringSetting)) {
212              name = reader.readElementValue(DomainSettingName.class);
213            } else if (reader.getLocalName().equals(XmlElementNames.Value)) {
214              value = reader.readElementValue();
215            }
216          }
217        } while (!reader.isEndElement(XmlNamespace.Autodiscover,
218            XmlElementNames.DomainSetting));
219    
220        EwsUtilities.ewsAssert(name != null, "GetDomainSettingsResponse.ReadSettingFromXml",
221                               "Missing name element in domain setting");
222    
223        this.settings.put(name, value);
224      }
225    
226      /**
227       * Loads the domain setting errors.
228       *
229       * @param reader The reader.
230       * @throws Exception the exception
231       */
232      private void loadDomainSettingErrorsFromXml(EwsXmlReader reader)
233          throws Exception {
234        if (!reader.isEmptyElement()) {
235          do {
236            reader.read();
237    
238            if ((reader.getNodeType().nodeType == XmlNodeType.START_ELEMENT) &&
239                (reader.getLocalName()
240                    .equals(XmlElementNames.DomainSettingError))) {
241              DomainSettingError error = new DomainSettingError();
242              error.loadFromXml(reader);
243              domainSettingErrors.add(error);
244            }
245          } while (!reader.isEndElement(XmlNamespace.Autodiscover,
246              XmlElementNames.DomainSettingErrors));
247        } else {
248          reader.read();
249        }
250      }
251    }