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.response;
025
026import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027import microsoft.exchange.webservices.data.core.XmlElementNames;
028import microsoft.exchange.webservices.data.core.enumeration.availability.FreeBusyViewType;
029import microsoft.exchange.webservices.data.core.enumeration.property.LegacyFreeBusyStatus;
030import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
031import microsoft.exchange.webservices.data.property.complex.availability.CalendarEvent;
032import microsoft.exchange.webservices.data.property.complex.availability.WorkingHours;
033
034import java.util.ArrayList;
035import java.util.Collection;
036
037/**
038 * Represents the availability of an individual attendee.
039 */
040public final class AttendeeAvailability extends ServiceResponse {
041
042  /**
043   * The calendar events.
044   */
045  private Collection<CalendarEvent> calendarEvents =
046      new ArrayList<CalendarEvent>();
047
048  /**
049   * The merged free busy status.
050   */
051  private Collection<LegacyFreeBusyStatus> mergedFreeBusyStatus =
052      new ArrayList<LegacyFreeBusyStatus>();
053
054  /**
055   * The view type.
056   */
057  private FreeBusyViewType viewType;
058
059  /**
060   * The working hours.
061   */
062  private WorkingHours workingHours;
063
064  /**
065   * Initializes a new instance of the AttendeeAvailability class.
066   */
067  public AttendeeAvailability() {
068    super();
069  }
070
071  /**
072   * Loads the free busy view from XML.
073   *
074   * @param reader   the reader
075   * @param viewType the view type
076   * @throws Exception the exception
077   */
078  public void loadFreeBusyViewFromXml(EwsServiceXmlReader reader, FreeBusyViewType viewType) throws Exception {
079    reader.readStartElement(XmlNamespace.Messages,
080        XmlElementNames.FreeBusyView);
081
082    String viewTypeString = reader.readElementValue(XmlNamespace.Types,
083        XmlElementNames.FreeBusyViewType);
084
085    for (Object o : FreeBusyViewType.class.getEnumConstants()) {
086      if (o.toString().equals(viewTypeString)) {
087        this.viewType = (FreeBusyViewType) o;
088        break;
089      }
090    }
091    do {
092      reader.read();
093
094      if (reader.isStartElement()) {
095        if (reader.getLocalName()
096            .equals(XmlElementNames.MergedFreeBusy)) {
097          String mergedFreeBusy = reader.readElementValue();
098
099          for (int i = 0; i < mergedFreeBusy.length(); i++) {
100
101            Byte b = Byte.parseByte(mergedFreeBusy.charAt(i) + "");
102            for (LegacyFreeBusyStatus legacyStatus : LegacyFreeBusyStatus.values()) {
103              if (b == legacyStatus.getBusyStatus()) {
104                this.mergedFreeBusyStatus.add(legacyStatus);
105                break;
106              }
107            }
108
109          }
110
111        } else if (reader.getLocalName().equals(
112            XmlElementNames.CalendarEventArray)) {
113          do {
114            reader.read();
115
116            if (reader.isStartElement(XmlNamespace.Types,
117                XmlElementNames.CalendarEvent)) {
118              CalendarEvent calendarEvent = new CalendarEvent();
119
120              calendarEvent.loadFromXml(reader,
121                  XmlElementNames.CalendarEvent);
122
123              this.calendarEvents.add(calendarEvent);
124            }
125          } while (!reader.isEndElement(XmlNamespace.Types,
126              XmlElementNames.CalendarEventArray));
127
128        } else if (reader.getLocalName().equals(
129            XmlElementNames.WorkingHours)) {
130          this.workingHours = new WorkingHours();
131          this.workingHours
132              .loadFromXml(reader, reader.getLocalName());
133
134          break;
135        }
136      }
137    } while (!reader.isEndElement(XmlNamespace.Messages,
138        XmlElementNames.FreeBusyView));
139  }
140
141  /**
142   * Gets a collection of calendar events for the attendee.
143   *
144   * @return the calendar events
145   */
146  public Collection<CalendarEvent> getCalendarEvents() {
147    return this.calendarEvents;
148  }
149
150  /**
151   * Gets a collection of merged free/busy status for the attendee.
152   *
153   * @return the merged free busy status
154   */
155  public Collection<LegacyFreeBusyStatus> getMergedFreeBusyStatus() {
156    return mergedFreeBusyStatus;
157  }
158
159  /**
160   * Gets the free/busy view type that wes retrieved for the attendee.
161   *
162   * @return the view type
163   */
164  public FreeBusyViewType getViewType() {
165    return viewType;
166  }
167
168  /**
169   * Gets the working hours of the attendee.
170   *
171   * @return the working hours
172   */
173  public WorkingHours getWorkingHours() {
174    return workingHours;
175  }
176
177}