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.core.request; 025 026import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; 027import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter; 028import microsoft.exchange.webservices.data.core.ExchangeService; 029import microsoft.exchange.webservices.data.core.XmlElementNames; 030import microsoft.exchange.webservices.data.core.response.AttendeeAvailability; 031import microsoft.exchange.webservices.data.core.response.ServiceResponseCollection; 032import microsoft.exchange.webservices.data.core.response.SuggestionsResponse; 033import microsoft.exchange.webservices.data.core.enumeration.availability.AvailabilityData; 034import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; 035import microsoft.exchange.webservices.data.core.enumeration.misc.error.ServiceError; 036import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; 037import microsoft.exchange.webservices.data.misc.availability.AttendeeInfo; 038import microsoft.exchange.webservices.data.misc.availability.AvailabilityOptions; 039import microsoft.exchange.webservices.data.misc.availability.GetUserAvailabilityResults; 040import microsoft.exchange.webservices.data.misc.availability.LegacyAvailabilityTimeZone; 041import microsoft.exchange.webservices.data.misc.availability.TimeWindow; 042 043/** 044 * Represents a GetUserAvailability request. 045 */ 046public final class GetUserAvailabilityRequest extends SimpleServiceRequestBase<GetUserAvailabilityResults> { 047 048 /** 049 * The attendees. 050 */ 051 private Iterable<AttendeeInfo> attendees; 052 053 /** 054 * The time window. 055 */ 056 private TimeWindow timeWindow; 057 058 /** 059 * The requested data. 060 */ 061 private AvailabilityData requestedData = 062 AvailabilityData.FreeBusyAndSuggestions; 063 064 /** 065 * The options. 066 */ 067 private AvailabilityOptions options; 068 069 /** 070 * Initializes a new instance of the "GetUserAvailabilityRequest" class. 071 * 072 * @param service the service 073 * @throws Exception 074 */ 075 public GetUserAvailabilityRequest(ExchangeService service) 076 throws Exception { 077 super(service); 078 } 079 080 /** 081 * Gets the name of the XML element. 082 * 083 * @return XML element name. 084 */ 085 @Override public String getXmlElementName() { 086 return XmlElementNames.GetUserAvailabilityRequest; 087 } 088 089 /** 090 * Gets a value indicating whether free/busy data is requested. 091 * 092 * @return true, if is free busy view requested 093 */ 094 public boolean isFreeBusyViewRequested() { 095 return this.requestedData == AvailabilityData.FreeBusy || 096 this.requestedData == AvailabilityData. 097 FreeBusyAndSuggestions; 098 } 099 100 /** 101 * Gets a value indicating whether suggestions are requested. 102 * 103 * @return true, if is suggestions view requested 104 */ 105 public boolean isSuggestionsViewRequested() { 106 return this.requestedData == AvailabilityData.Suggestions || 107 this.requestedData == AvailabilityData. 108 FreeBusyAndSuggestions; 109 } 110 111 /** 112 * Validate request. 113 * 114 * @throws Exception the exception 115 */ 116 @Override 117 protected void validate() throws Exception { 118 super.validate(); 119 120 this.options.validate(this.timeWindow.getDuration()); 121 } 122 123 /** 124 * Writes XML elements. 125 * 126 * @param writer the writer 127 * @throws Exception the exception 128 */ 129 @Override 130 protected void writeElementsToXml(EwsServiceXmlWriter writer) 131 throws Exception { 132 // Only serialize the TimeZone property against an Exchange 2007 SP1 133 // server. 134 // Against Exchange 2010, the time zone is emitted in the request's SOAP 135 // header. 136 //if (writer.getService().getRequestedServerVersion() == 137 //ExchangeVersion.Exchange2007_SP1) { 138 LegacyAvailabilityTimeZone legacyTimeZone = 139 new LegacyAvailabilityTimeZone(); 140 141 legacyTimeZone.writeToXml(writer, XmlElementNames.TimeZone); 142 143 144 writer.writeStartElement(XmlNamespace.Messages, 145 XmlElementNames.MailboxDataArray); 146 147 for (AttendeeInfo attendee : this.attendees) { 148 attendee.writeToXml(writer); 149 } 150 151 writer.writeEndElement(); // MailboxDataArray 152 153 this.options.writeToXml(writer, this); 154 } 155 156 /** 157 * Gets the name of the response XML element. 158 * 159 * @return XML element name 160 */ 161 @Override 162 protected String getResponseXmlElementName() { 163 return XmlElementNames.GetUserAvailabilityResponse; 164 } 165 166 /** 167 * {@inheritDoc} 168 */ 169 @Override 170 protected GetUserAvailabilityResults parseResponse(EwsServiceXmlReader reader) 171 throws Exception { 172 GetUserAvailabilityResults serviceResponse = 173 new GetUserAvailabilityResults(); 174 175 if (this.isFreeBusyViewRequested()) { 176 serviceResponse 177 .setAttendeesAvailability(new ServiceResponseCollection<AttendeeAvailability>()); 178 179 reader.readStartElement(XmlNamespace.Messages, 180 XmlElementNames.FreeBusyResponseArray); 181 182 do { 183 reader.read(); 184 185 if (reader.isStartElement(XmlNamespace.Messages, 186 XmlElementNames.FreeBusyResponse)) { 187 AttendeeAvailability freeBusyResponse = 188 new AttendeeAvailability(); 189 190 freeBusyResponse.loadFromXml(reader, 191 XmlElementNames.ResponseMessage); 192 193 if (freeBusyResponse.getErrorCode().equals( 194 ServiceError.NoError)) { 195 freeBusyResponse.loadFreeBusyViewFromXml(reader, 196 this.options.getRequestedFreeBusyView()); 197 } 198 199 serviceResponse.getAttendeesAvailability().add( 200 freeBusyResponse); 201 } 202 } while (!reader.isEndElement(XmlNamespace.Messages, 203 XmlElementNames.FreeBusyResponseArray)); 204 } 205 206 if (this.isSuggestionsViewRequested()) { 207 serviceResponse.setSuggestionsResponse(new SuggestionsResponse()); 208 209 reader.readStartElement(XmlNamespace.Messages, 210 XmlElementNames.SuggestionsResponse); 211 212 serviceResponse.getSuggestionsResponse().loadFromXml(reader, 213 XmlElementNames.ResponseMessage); 214 215 if (serviceResponse.getSuggestionsResponse().getErrorCode().equals( 216 ServiceError.NoError)) { 217 serviceResponse.getSuggestionsResponse() 218 .loadSuggestedDaysFromXml(reader); 219 } 220 221 reader.readEndElement(XmlNamespace.Messages, 222 XmlElementNames.SuggestionsResponse); 223 } 224 225 return serviceResponse; 226 } 227 228 /** 229 * Gets the request version. 230 * 231 * @return Earliest Exchange version in which this request is supported. 232 */ 233 @Override 234 protected ExchangeVersion getMinimumRequiredServerVersion() { 235 return ExchangeVersion.Exchange2007_SP1; 236 } 237 238 /** 239 * Executes this request. 240 * 241 * @return Service response. 242 * @throws Exception the exception 243 */ 244 public GetUserAvailabilityResults execute() throws Exception { 245 return internalExecute(); 246 } 247 248 /** 249 * Gets the attendees. 250 * 251 * @return the attendees 252 */ 253 public Iterable<AttendeeInfo> getAttendees() { 254 return attendees; 255 } 256 257 /** 258 * Sets the attendees. 259 * 260 * @param attendees the new attendees 261 */ 262 public void setAttendees(Iterable<AttendeeInfo> attendees) { 263 this.attendees = attendees; 264 } 265 266 /** 267 * Gets the time window in which to retrieve user availability 268 * information. 269 * 270 * @return the time window 271 */ 272 public TimeWindow getTimeWindow() { 273 return timeWindow; 274 } 275 276 /** 277 * Sets the time window. 278 * 279 * @param timeWindow the new time window 280 */ 281 public void setTimeWindow(TimeWindow timeWindow) { 282 this.timeWindow = timeWindow; 283 } 284 285 /** 286 * Gets a value indicating what data is requested (free/busy and/or 287 * suggestions). 288 * 289 * @return the requested data 290 */ 291 public AvailabilityData getRequestedData() { 292 return requestedData; 293 } 294 295 /** 296 * Sets the requested data. 297 * 298 * @param requestedData the new requested data 299 */ 300 public void setRequestedData(AvailabilityData requestedData) { 301 this.requestedData = requestedData; 302 } 303 304 /** 305 * Gets an object that allows you to specify options controlling the 306 * information returned by the GetUserAvailability request. 307 * 308 * @return the options 309 */ 310 public AvailabilityOptions getOptions() { 311 return options; 312 } 313 314 /** 315 * Sets the options. 316 * 317 * @param options the new options 318 */ 319 public void setOptions(AvailabilityOptions options) { 320 this.options = options; 321 } 322 323}