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 }