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.core.response;
025
026 import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027 import microsoft.exchange.webservices.data.core.XmlElementNames;
028 import microsoft.exchange.webservices.data.core.request.HangingServiceRequestBase;
029 import microsoft.exchange.webservices.data.core.enumeration.misc.HangingRequestDisconnectReason;
030 import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
031 import microsoft.exchange.webservices.data.notification.GetStreamingEventsResults;
032 import microsoft.exchange.webservices.data.security.XmlNodeType;
033
034 import java.util.ArrayList;
035 import java.util.List;
036
037 /**
038 * Represents the response to a subscription event retrieval operation.
039 */
040 public final class GetStreamingEventsResponse extends ServiceResponse {
041
042 private GetStreamingEventsResults results = new GetStreamingEventsResults();
043 private HangingServiceRequestBase request;
044
045
046 /**
047 * Enumeration of ConnectionStatus that can be returned by the server.
048 */
049 private enum ConnectionStatus {
050 /**
051 * Simple heartbeat
052 */
053 OK,
054
055 /**
056 * Server is closing the connection.
057 */
058 Closed
059 }
060
061 /**
062 * Initializes a new instance of the GetStreamingEventsResponse class.
063 *
064 * @param request The request
065 * Request to disconnect when we get a close message.
066 */
067 public GetStreamingEventsResponse(HangingServiceRequestBase request) {
068 super();
069 List<String> string = new ArrayList<String>();
070 this.setErrorSubscriptionIds(string);
071 this.request = request;
072 }
073
074 /**
075 * Reads response elements from XML.
076 *
077 * @throws Exception
078 */
079 @Override
080 protected void readElementsFromXml(EwsServiceXmlReader reader)
081 throws Exception {
082 super.readElementsFromXml(reader);
083
084 reader.read();
085
086 if (reader.getLocalName().equals(XmlElementNames.Notifications)) {
087 this.results.loadFromXml(reader);
088 } else if (reader.getLocalName().equals(XmlElementNames.ConnectionStatus)) {
089 String connectionStatus = reader.readElementValue(XmlNamespace.
090 Messages, XmlElementNames.ConnectionStatus);
091
092 if (connectionStatus.equals(ConnectionStatus.Closed.toString())) {
093 this.request.disconnect(
094 HangingRequestDisconnectReason.Clean, null);
095 }
096 }
097 }
098
099 /**
100 * Loads extra error details from XML
101 *
102 * @throws Exception
103 */
104 @Override
105 protected boolean loadExtraErrorDetailsFromXml(EwsServiceXmlReader reader,
106 String xmlElementName) throws Exception {
107 boolean baseReturnVal = super.
108 loadExtraErrorDetailsFromXml(reader, xmlElementName);
109
110 if (reader.isStartElement(XmlNamespace.Messages, XmlElementNames.ErrorSubscriptionIds)) {
111 do {
112 reader.read();
113
114 if (reader.getNodeType().getNodeType() == XmlNodeType.START_ELEMENT &&
115 reader.getLocalName().equals(XmlElementNames.SubscriptionId)) {
116 this.getErrorSubscriptionIds().add(
117 reader.readElementValue(XmlNamespace.Messages,
118 XmlElementNames.SubscriptionId));
119 }
120 }
121 while (!reader.isEndElement(XmlNamespace.Messages,
122 XmlElementNames.ErrorSubscriptionIds));
123
124 return true;
125 } else {
126 return baseReturnVal;
127 }
128 }
129
130 /**
131 * Gets event results from subscription.
132 */
133 public GetStreamingEventsResults getResults() {
134 return this.results;
135 }
136
137 private List<String> errorSubscriptionIds;
138
139 /**
140 * Gets the error subscription ids.
141 */
142 public List<String> getErrorSubscriptionIds() {
143 return this.errorSubscriptionIds;
144 }
145
146 /**
147 * Sets the error subscription ids.
148 */
149 private void setErrorSubscriptionIds(List<String> value) {
150 this.errorSubscriptionIds = value;
151 }
152
153
154 }