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.property.complex;
025
026 import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027 import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
028 import microsoft.exchange.webservices.data.core.EwsUtilities;
029 import microsoft.exchange.webservices.data.core.XmlAttributeNames;
030 import microsoft.exchange.webservices.data.core.XmlElementNames;
031 import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
032 import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
033 import microsoft.exchange.webservices.data.misc.TimeSpan;
034 import microsoft.exchange.webservices.data.property.complex.time.TimeZoneDefinition;
035 import org.apache.commons.logging.Log;
036 import org.apache.commons.logging.LogFactory;
037
038 /**
039 * Represents a time zone in which a meeting is defined.
040 */
041 public final class MeetingTimeZone extends ComplexProperty {
042
043 private static final Log LOG = LogFactory.getLog(MeetingTimeZone.class);
044
045 /**
046 * The name.
047 */
048 private String name;
049
050 /**
051 * The base offset.
052 */
053 private TimeSpan baseOffset;
054
055 /**
056 * The standard.
057 */
058 private TimeChange standard;
059
060 /**
061 * The daylight.
062 */
063 private TimeChange daylight;
064
065 /**
066 * Initializes a new instance of the MeetingTimeZone class.
067 *
068 * @param timeZone The time zone used to initialize this instance.
069 */
070 public MeetingTimeZone(TimeZoneDefinition timeZone) {
071 // Unfortunately, MeetingTimeZone does not support all the time
072 // transition types
073 // supported by TimeZoneInfo. That leaves us unable to accurately
074 // convert TimeZoneInfo
075 // into MeetingTimeZone. So we don't... Instead, we emit the time zone's
076 // Id and
077 // hope the server will find a match (which it should).
078 this.name = timeZone.getId();
079 }
080
081 /**
082 * Initializes a new instance of the MeetingTimeZone class.
083 */
084 public MeetingTimeZone() {
085 super();
086 }
087
088 /**
089 * Initializes a new instance of the MeetingTimeZone class.
090 *
091 * @param name The name of the time zone.
092 */
093 public MeetingTimeZone(String name) {
094 this();
095 this.name = name;
096 }
097
098 /**
099 * Gets the minimum required server version.
100 *
101 * @param reader the reader
102 * @return Earliest Exchange version in which this service object type is
103 * supported.
104 * @throws Exception the exception
105 */
106 @Override
107 public boolean tryReadElementFromXml(EwsServiceXmlReader reader)
108 throws Exception {
109 if (reader.getLocalName().equals(XmlElementNames.BaseOffset)) {
110 this.baseOffset = EwsUtilities.getXSDurationToTimeSpan(reader.readElementValue());
111 return true;
112 } else if (reader.getLocalName().equals(XmlElementNames.Standard)) {
113 this.standard = new TimeChange();
114 this.standard.loadFromXml(reader, reader.getLocalName());
115 return true;
116 } else if (reader.getLocalName().equals(XmlElementNames.Daylight)) {
117 this.daylight = new TimeChange();
118 this.daylight.loadFromXml(reader, reader.getLocalName());
119 return true;
120 } else {
121 return false;
122 }
123 }
124
125 /**
126 * Reads the attribute from XML.
127 *
128 * @param reader the reader
129 * @throws Exception the exception
130 */
131 @Override
132 public void readAttributesFromXml(EwsServiceXmlReader reader)
133 throws Exception {
134 this.name = reader.readAttributeValue(XmlAttributeNames.TimeZoneName);
135 }
136
137 /**
138 * Writes the attribute to XML.
139 *
140 * @param writer the writer
141 * @throws ServiceXmlSerializationException the service xml serialization exception
142 */
143 @Override
144 public void writeAttributesToXml(EwsServiceXmlWriter writer)
145 throws ServiceXmlSerializationException {
146 writer.writeAttributeValue(XmlAttributeNames.TimeZoneName, this
147 .getName());
148 }
149
150 /**
151 * Writes the attribute to XML.
152 *
153 * @param writer the writer
154 * @throws Exception the exception
155 */
156 @Override
157 public void writeElementsToXml(EwsServiceXmlWriter writer)
158 throws Exception {
159 if (this.baseOffset != null) {
160 writer.writeElementValue(XmlNamespace.Types,
161 XmlElementNames.BaseOffset, EwsUtilities
162 .getTimeSpanToXSDuration(this.getBaseOffset()));
163 }
164
165 if (this.getStandard() != null) {
166 this.getStandard().writeToXml(writer, XmlElementNames.Standard);
167 }
168
169 if (this.getDaylight() != null) {
170 this.getDaylight().writeToXml(writer, XmlElementNames.Daylight);
171 }
172 }
173
174 /**
175 * Converts this meeting time zone into a TimeZoneInfo structure.
176 *
177 * @return the time zone
178 */
179 public TimeZoneDefinition toTimeZoneInfo() {
180 TimeZoneDefinition result = null;
181
182 try {
183 result = new TimeZoneDefinition();
184 //TimeZone.getTimeZone(this.getName());
185 result.setId(this.getName());
186 } catch (Exception e) {
187 // Could not find a time zone with that Id on the local system.
188 LOG.error(e);
189 }
190
191 // Again, we cannot accurately convert MeetingTimeZone into TimeZoneInfo
192 // because TimeZoneInfo doesn't support absolute date transitions. So if
193 // there is no system time zone that has a matching Id, we return null.
194 return result;
195 }
196
197 /**
198 * Gets the name of the time zone.
199 *
200 * @return the name
201 */
202 public String getName() {
203 return this.name;
204 }
205
206 /**
207 * Sets the name.
208 *
209 * @param value the new name
210 */
211 public void setName(String value) {
212 if (this.canSetFieldValue(this.name, value)) {
213 this.name = value;
214 this.changed();
215 }
216 }
217
218 /**
219 * Gets the base offset of the time zone from the UTC time zone.
220 *
221 * @return the base offset
222 */
223 public TimeSpan getBaseOffset() {
224 return this.baseOffset;
225 }
226
227 /**
228 * Sets the base offset.
229 *
230 * @param value the new base offset
231 */
232 public void setBaseOffset(TimeSpan value) {
233 if (this.canSetFieldValue(this.name, value)) {
234 this.baseOffset = value;
235 this.changed();
236 }
237 }
238
239 /**
240 * Gets a TimeChange defining when the time changes to Standard
241 * Time.
242 *
243 * @return the standard
244 */
245 public TimeChange getStandard() {
246 return this.standard;
247 }
248
249 /**
250 * Sets the standard.
251 *
252 * @param value the new standard
253 */
254 public void setStandard(TimeChange value) {
255 if (this.canSetFieldValue(this.standard, value)) {
256 this.standard = value;
257 this.changed();
258 }
259 }
260
261 /**
262 * Gets a TimeChange defining when the time changes to Daylight
263 * Saving Time.
264 *
265 * @return the daylight
266 */
267 public TimeChange getDaylight() {
268 return this.daylight;
269 }
270
271 /**
272 * Sets the daylight.
273 *
274 * @param value the new daylight
275 */
276 public void setDaylight(TimeChange value) {
277 if (this.canSetFieldValue(this.daylight, value)) {
278 this.daylight = value;
279 this.changed();
280 }
281 }
282
283 }