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.notification;
025    
026    import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027    import microsoft.exchange.webservices.data.core.XmlElementNames;
028    import microsoft.exchange.webservices.data.core.enumeration.notification.EventType;
029    import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
030    
031    import java.util.ArrayList;
032    import java.util.Collection;
033    import java.util.Date;
034    
035    /**
036     * Represents a collection of notification events.
037     */
038    public final class GetStreamingEventsResults {
039    
040      /**
041       * Structure to track a subscription and its associated notification events.
042       */
043      protected static class NotificationGroup {
044        /**
045         * Subscription Id
046         */
047        protected String subscriptionId;
048    
049        /**
050         * Events in the response associated with the subscription id.
051         */
052        protected Collection<NotificationEvent> events;
053      }
054    
055    
056      /**
057       * Collection of notification events.
058       */
059      private Collection<NotificationGroup> events =
060          new ArrayList<NotificationGroup>();
061    
062      /**
063       * Initializes a new instance of the <see cref=
064       * "GetStreamingEventsResults"/> class.
065       */
066      public GetStreamingEventsResults() {
067      }
068    
069      /**
070       * Loads from XML.
071       *
072       * @param reader The reader.
073       * @throws Exception
074       */
075      public void loadFromXml(EwsServiceXmlReader reader) throws Exception {
076        reader.readStartElement(XmlNamespace.Messages,
077            XmlElementNames.Notification);
078    
079        do {
080          NotificationGroup notifications = new NotificationGroup();
081          notifications.subscriptionId = reader.readElementValue(
082              XmlNamespace.Types,
083              XmlElementNames.SubscriptionId);
084          notifications.events = new ArrayList<NotificationEvent>();
085    
086          synchronized (this) {
087            this.events.add(notifications);
088          }
089    
090          do {
091            reader.read();
092    
093            if (reader.isStartElement()) {
094              String eventElementName = reader.getLocalName();
095              EventType eventType;
096              if (GetEventsResults.getXmlElementNameToEventTypeMap().containsKey(eventElementName)) {
097                eventType = GetEventsResults.getXmlElementNameToEventTypeMap().
098                    get(eventElementName);
099                if (eventType == EventType.Status) {
100                  // We don't need to return status events
101                  reader.readEndElementIfNecessary(XmlNamespace.Types,
102                      eventElementName);
103                } else {
104                  this.loadNotificationEventFromXml(
105                      reader,
106                      eventElementName,
107                      eventType,
108                      notifications);
109                }
110              } else {
111                reader.skipCurrentElement();
112              }
113            }
114          }
115          while (!reader.isEndElement(XmlNamespace.Messages,
116              XmlElementNames.Notification));
117    
118          reader.read();
119        }
120        while (!reader.isEndElement(XmlNamespace.Messages,
121            XmlElementNames.Notifications));
122      }
123    
124      /**
125       * Loads a notification event from XML.
126       *
127       * @param reader           The reader.
128       * @param eventElementName Name of the event XML element.
129       * @param eventType        Type of the event.
130       * @param notifications    Collection of notification
131       * @throws Exception
132       */
133      private void loadNotificationEventFromXml(
134          EwsServiceXmlReader reader,
135          String eventElementName,
136          EventType eventType,
137          NotificationGroup notifications) throws Exception {
138        Date timestamp = reader.readElementValue(Date.class, XmlNamespace.Types,
139            XmlElementNames.TimeStamp);
140    
141        NotificationEvent notificationEvent;
142    
143        reader.read();
144    
145        if (reader.getLocalName().equals(XmlElementNames.FolderId)) {
146          notificationEvent = new FolderEvent(eventType, timestamp);
147        } else {
148          notificationEvent = new ItemEvent(eventType, timestamp);
149        }
150    
151        notificationEvent.loadFromXml(reader, eventElementName);
152        notifications.events.add(notificationEvent);
153      }
154    
155      /**
156       * Gets the notification collection.
157       *
158       * @value The notification collection.
159       */
160      protected Collection<NotificationGroup> getNotifications() {
161        return this.events;
162      }
163    }
164