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; 025 026import microsoft.exchange.webservices.data.core.response.IGetObjectInstanceDelegate; 027import microsoft.exchange.webservices.data.core.service.ServiceObject; 028import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; 029import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; 030import microsoft.exchange.webservices.data.util.DateTimeUtils; 031 032import java.io.InputStream; 033import java.text.DateFormat; 034import java.text.SimpleDateFormat; 035import java.util.ArrayList; 036import java.util.Date; 037import java.util.List; 038import java.util.TimeZone; 039 040/** 041 * XML reader. 042 */ 043public class EwsServiceXmlReader extends EwsXmlReader { 044 045 /** 046 * The service. 047 */ 048 private ExchangeService service; 049 050 /** 051 * Initializes a new instance of the EwsXmlReader class. 052 * 053 * @param stream the stream 054 * @param service the service 055 * @throws Exception on error 056 */ 057 public EwsServiceXmlReader(InputStream stream, ExchangeService service) 058 throws Exception { 059 super(stream); 060 this.service = service; 061 } 062 063 /** 064 * Reads the element value as date time. 065 * 066 * @return Element value 067 * @throws Exception the exception 068 */ 069 public Date readElementValueAsDateTime() throws Exception { 070 return DateTimeUtils.convertDateTimeStringToDate(readElementValue()); 071 } 072 073 /** 074 * Reads the element value as unspecified date. 075 * 076 * @return element value 077 * @throws Exception on error 078 */ 079 public Date readElementValueAsUnspecifiedDate() throws Exception { 080 return DateTimeUtils.convertDateStringToDate(readElementValue()); 081 } 082 083 /** 084 * Reads the element value as date time, assuming it is unbiased (e.g. 085 * 2009/01/01T08:00) and scoped to service's time zone. 086 * 087 * @return Date 088 * @throws Exception the exception 089 */ 090 public Date readElementValueAsUnbiasedDateTimeScopedToServiceTimeZone() 091 throws Exception { 092 // Convert the element's value to a DateTime with no adjustment. 093 String date = this.readElementValue(); 094 095 try { 096 DateFormat formatter = 097 new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 098 formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 099 return formatter.parse(date); 100 } catch (Exception e) { 101 DateFormat formatter = new SimpleDateFormat( 102 "yyyy-MM-dd'T'HH:mm:ss.SSS"); 103 formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 104 return formatter.parse(date); 105 } 106 } 107 108 /** 109 * Reads the element value as date time. 110 * 111 * @param xmlNamespace the xml namespace 112 * @param localName the local name 113 * @return the date 114 * @throws Exception the exception 115 */ 116 public Date readElementValueAsDateTime(XmlNamespace xmlNamespace, String localName) throws Exception { 117 return DateTimeUtils.convertDateTimeStringToDate(readElementValue(xmlNamespace, localName)); 118 } 119 120 /** 121 * Reads the service objects collection from XML. 122 * 123 * @param <TServiceObject> the generic type 124 * @param collectionXmlElementName the collection xml element name 125 * @param getObjectInstanceDelegate the get object instance delegate 126 * @param clearPropertyBag the clear property bag 127 * @param requestedPropertySet the requested property set 128 * @param summaryPropertiesOnly the summary property only 129 * @return the list 130 * @throws Exception the exception 131 */ 132 public <TServiceObject extends ServiceObject> List<TServiceObject> 133 readServiceObjectsCollectionFromXml( 134 String collectionXmlElementName, 135 IGetObjectInstanceDelegate<ServiceObject> 136 getObjectInstanceDelegate, 137 boolean clearPropertyBag, PropertySet requestedPropertySet, 138 boolean summaryPropertiesOnly) throws Exception { 139 140 List<TServiceObject> serviceObjects = new ArrayList<TServiceObject>(); 141 TServiceObject serviceObject; 142 143 this.readStartElement(XmlNamespace.Messages, collectionXmlElementName); 144 145 if (!this.isEmptyElement()) { 146 do { 147 this.read(); 148 149 if (this.isStartElement()) { 150 serviceObject = (TServiceObject) getObjectInstanceDelegate 151 .getObjectInstanceDelegate(this.getService(), this 152 .getLocalName()); 153 if (serviceObject == null) { 154 this.skipCurrentElement(); 155 } else { 156 if (!(this.getLocalName()).equals(serviceObject 157 .getXmlElementName())) { 158 159 throw new ServiceLocalException(String 160 .format( 161 "The type of the " + "object in " + 162 "the store (%s)" + 163 " does not match that" + 164 " of the " + 165 "local object (%s).", 166 this.getLocalName(), serviceObject 167 .getXmlElementName())); 168 } 169 serviceObject.loadFromXml(this, clearPropertyBag, 170 requestedPropertySet, summaryPropertiesOnly); 171 172 serviceObjects.add(serviceObject); 173 } 174 } 175 } while (!this.isEndElement(XmlNamespace.Messages, 176 collectionXmlElementName)); 177 } else { 178 // For empty elements read End Element tag 179 // i.e. position cursor on End Element 180 this.read(); 181 } 182 183 return serviceObjects; 184 185 } 186 187 /** 188 * Gets the service. 189 * 190 * @return the service 191 */ 192 public ExchangeService getService() { 193 return service; 194 } 195 196 /** 197 * Sets the service. 198 * 199 * @param service the new service 200 */ 201 public void setService(ExchangeService service) { 202 this.service = service; 203 } 204 205}