Skip to content

Commit f494b83

Browse files
committed
Merge pull request OfficeDev#367 from itbw/getServerTimeZones
several TimeZone fixes
2 parents 9df3119 + e9f8ef4 commit f494b83

6 files changed

Lines changed: 186 additions & 55 deletions

File tree

src/main/java/microsoft/exchange/webservices/data/core/EwsUtilities.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ public ServiceObjectInfo createInstance() {
235235
private static final Pattern PATTERN_DAY = Pattern.compile("(\\d+)D");
236236
private static final Pattern PATTERN_HOUR = Pattern.compile("(\\d+)H");
237237
private static final Pattern PATTERN_MINUTES = Pattern.compile("(\\d+)M");
238-
private static final Pattern PATTERN_SECONDS = Pattern.compile("(\\d+).");
238+
private static final Pattern PATTERN_SECONDS = Pattern.compile("(\\d+)\\."); // Need to escape dot, otherwise it matches any char
239239
private static final Pattern PATTERN_MILLISECONDS = Pattern.compile("(\\d+)S");
240240

241241

@@ -871,15 +871,12 @@ public static TimeSpan getXSDurationToTimeSpan(String xsDuration) {
871871
// TODO: Need to check whether this should be the equivalent or not
872872
Matcher m = PATTERN_TIME_SPAN.matcher(xsDuration);
873873
boolean negative = false;
874-
LOG.debug(m.find());
875874
if (m.find()) {
876875
negative = true;
877876
}
878-
LOG.debug(m.group());
879877

880878
// Year
881879
m = PATTERN_YEAR.matcher(xsDuration);
882-
LOG.debug(m.find());
883880
int year = 0;
884881
if (m.find()) {
885882
year = Integer.parseInt(m.group().substring(0,
@@ -888,7 +885,6 @@ public static TimeSpan getXSDurationToTimeSpan(String xsDuration) {
888885

889886
// Month
890887
m = PATTERN_MONTH.matcher(xsDuration);
891-
LOG.debug(m.find());
892888
int month = 0;
893889
if (m.find()) {
894890
month = Integer.parseInt(m.group().substring(0,
@@ -897,7 +893,6 @@ public static TimeSpan getXSDurationToTimeSpan(String xsDuration) {
897893

898894
// Day
899895
m = PATTERN_DAY.matcher(xsDuration);
900-
LOG.debug(m.find());
901896
int day = 0;
902897
if (m.find()) {
903898
day = Integer.parseInt(m.group().substring(0,
@@ -906,7 +901,6 @@ public static TimeSpan getXSDurationToTimeSpan(String xsDuration) {
906901

907902
// Hour
908903
m = PATTERN_HOUR.matcher(xsDuration);
909-
LOG.debug(m.find());
910904
int hour = 0;
911905
if (m.find()) {
912906
hour = Integer.parseInt(m.group().substring(0,
@@ -915,7 +909,6 @@ public static TimeSpan getXSDurationToTimeSpan(String xsDuration) {
915909

916910
// Minute
917911
m = PATTERN_MINUTES.matcher(xsDuration);
918-
LOG.debug(m.find());
919912
int minute = 0;
920913
if (m.find()) {
921914
minute = Integer.parseInt(m.group().substring(0,
@@ -924,7 +917,6 @@ public static TimeSpan getXSDurationToTimeSpan(String xsDuration) {
924917

925918
// Seconds
926919
m = PATTERN_SECONDS.matcher(xsDuration);
927-
LOG.debug(m.find());
928920
int seconds = 0;
929921
if (m.find()) {
930922
seconds = Integer.parseInt(m.group().substring(0,
@@ -933,7 +925,6 @@ public static TimeSpan getXSDurationToTimeSpan(String xsDuration) {
933925

934926
int milliseconds = 0;
935927
m = PATTERN_MILLISECONDS.matcher(xsDuration);
936-
LOG.debug(m.find());
937928
if (m.find()) {
938929
// Only allowed 4 digits of precision
939930
if (m.group().length() > 5) {

src/main/java/microsoft/exchange/webservices/data/core/ExchangeService.java

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@
3030
import java.util.Collection;
3131
import java.util.Date;
3232
import java.util.EnumSet;
33+
import java.util.Enumeration;
3334
import java.util.HashMap;
3435
import java.util.Iterator;
3536
import java.util.List;
3637
import java.util.Locale;
38+
import java.util.Map;
3739
import java.util.TimeZone;
3840

3941
import microsoft.exchange.webservices.data.autodiscover.AutodiscoverService;
@@ -99,6 +101,7 @@
99101
import microsoft.exchange.webservices.data.core.request.GetPasswordExpirationDateRequest;
100102
import microsoft.exchange.webservices.data.core.request.GetRoomListsRequest;
101103
import microsoft.exchange.webservices.data.core.request.GetRoomsRequest;
104+
import microsoft.exchange.webservices.data.core.request.GetServerTimeZonesRequest;
102105
import microsoft.exchange.webservices.data.core.request.GetUserAvailabilityRequest;
103106
import microsoft.exchange.webservices.data.core.request.GetUserConfigurationRequest;
104107
import microsoft.exchange.webservices.data.core.request.GetUserOofSettingsRequest;
@@ -132,6 +135,7 @@
132135
import microsoft.exchange.webservices.data.core.response.GetDelegateResponse;
133136
import microsoft.exchange.webservices.data.core.response.GetFolderResponse;
134137
import microsoft.exchange.webservices.data.core.response.GetItemResponse;
138+
import microsoft.exchange.webservices.data.core.response.GetServerTimeZonesResponse;
135139
import microsoft.exchange.webservices.data.core.response.MoveCopyFolderResponse;
136140
import microsoft.exchange.webservices.data.core.response.MoveCopyItemResponse;
137141
import microsoft.exchange.webservices.data.core.response.ServiceResponse;
@@ -3928,58 +3932,51 @@ public boolean getExchange2007CompatibilityMode() {
39283932
public void setExchange2007CompatibilityMode(boolean value) {
39293933
this.exchange2007CompatibilityMode = value;
39303934
}
3931-
3935+
39323936
/**
39333937
* Retrieves the definitions of the specified server-side time zones.
39343938
*
39353939
* @param timeZoneIds the time zone ids
39363940
* @return A Collection containing the definitions of the specified time
39373941
* zones.
3942+
* @throws Exception
39383943
*/
39393944
public Collection<TimeZoneDefinition> getServerTimeZones(
3940-
Iterable<String> timeZoneIds) {
3941-
Date today = new Date();
3945+
Iterable<String> timeZoneIds) throws Exception {
3946+
Map<String, TimeZoneDefinition> timeZoneMap = new HashMap<String, TimeZoneDefinition>();
3947+
3948+
GetServerTimeZonesRequest request = new GetServerTimeZonesRequest(this);
3949+
ServiceResponseCollection<GetServerTimeZonesResponse> responses = request.execute();
3950+
for (GetServerTimeZonesResponse response : responses) {
3951+
for (TimeZoneDefinition tzd : response.getTimeZones()) {
3952+
timeZoneMap.put(tzd.getId(), tzd);
3953+
}
3954+
}
3955+
39423956
Collection<TimeZoneDefinition> timeZoneList = new ArrayList<TimeZoneDefinition>();
3957+
39433958
for (String timeZoneId : timeZoneIds) {
3944-
TimeZoneDefinition timeZoneDefinition = new TimeZoneDefinition();
3945-
timeZoneList.add(timeZoneDefinition);
3946-
TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);
3947-
timeZoneDefinition.id = timeZone.getID();
3948-
timeZoneDefinition.name = timeZone.getDisplayName(timeZone
3949-
.inDaylightTime(today), TimeZone.LONG);
3950-
/*
3951-
* String shortName =
3952-
* timeZone.getDisplayName(timeZone.inDaylightTime(today),
3953-
* TimeZone.SHORT); String longName =
3954-
* timeZone.getDisplayName(timeZone.inDaylightTime(today),
3955-
* TimeZone.LONG); int rawOffset = timeZone.getRawOffset(); int hour
3956-
* = rawOffset / (60*60*1000); int min = Math.abs(rawOffset /
3957-
* (60*1000)) % 60; boolean hasDST = timeZone.useDaylightTime();
3958-
* boolean inDST = timeZone.inDaylightTime(today);
3959-
*/
3959+
timeZoneList.add(timeZoneMap.get(timeZoneId));
39603960
}
39613961

39623962
return timeZoneList;
39633963
}
3964-
3964+
39653965
/**
39663966
* Retrieves the definitions of all server-side time zones.
39673967
*
39683968
* @return A Collection containing the definitions of the specified time
39693969
* zones.
3970-
*/
3971-
public Collection<TimeZoneDefinition> getServerTimeZones() {
3972-
Date today = new Date();
3973-
Collection<TimeZoneDefinition> timeZoneList = new ArrayList<TimeZoneDefinition>();
3974-
for (String timeZoneId : TimeZone.getAvailableIDs()) {
3975-
TimeZoneDefinition timeZoneDefinition = new TimeZoneDefinition();
3976-
timeZoneList.add(timeZoneDefinition);
3977-
TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);
3978-
timeZoneDefinition.id = timeZone.getID();
3979-
timeZoneDefinition.name = timeZone.getDisplayName(timeZone
3980-
.inDaylightTime(today), TimeZone.LONG);
3981-
}
3982-
3970+
* @throws Exception
3971+
*/
3972+
public Collection<TimeZoneDefinition> getServerTimeZones() throws Exception {
3973+
GetServerTimeZonesRequest request = new GetServerTimeZonesRequest(this);
3974+
Collection<TimeZoneDefinition> timeZoneList = new ArrayList<TimeZoneDefinition>();
3975+
ServiceResponseCollection<GetServerTimeZonesResponse> responses = request.execute();
3976+
for (GetServerTimeZonesResponse response : responses) {
3977+
timeZoneList.addAll(response.getTimeZones());
3978+
}
3979+
39833980
return timeZoneList;
39843981
}
39853982

src/main/java/microsoft/exchange/webservices/data/core/request/GetServerTimeZonesRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
/**
3939
* Represents a GetServerTimeZones request.
4040
*/
41-
class GetServerTimeZonesRequest extends
41+
public final class GetServerTimeZonesRequest extends
4242
MultiResponseServiceRequest<GetServerTimeZonesResponse> {
4343

4444
/**
@@ -65,7 +65,7 @@ protected void validate() throws Exception {
6565
* @param service the service
6666
* @throws Exception
6767
*/
68-
protected GetServerTimeZonesRequest(ExchangeService service)
68+
public GetServerTimeZonesRequest(ExchangeService service)
6969
throws Exception {
7070
super(service, ServiceErrorHandling.ThrowOnError);
7171
}

src/main/java/microsoft/exchange/webservices/data/property/complex/time/TimeZoneDefinition.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import microsoft.exchange.webservices.data.core.XmlElementNames;
3030
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
3131
import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
32+
import microsoft.exchange.webservices.data.core.enumeration.property.time.DayOfTheWeek;
3233
import microsoft.exchange.webservices.data.core.exception.service.local.InvalidOrUnsupportedTimeZoneDefinitionException;
3334
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
3435
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
@@ -114,13 +115,18 @@ public int compare(final TimeZoneTransition x, final TimeZoneTransition y) {
114115
if (x == y) {
115116
return 0;
116117
} else if (x != null && y != null) {
117-
final AbsoluteDateTransition firstTransition = (AbsoluteDateTransition) x;
118-
final AbsoluteDateTransition secondTransition = (AbsoluteDateTransition) y;
118+
if (x instanceof AbsoluteDateTransition && y instanceof AbsoluteDateTransition) {
119+
final AbsoluteDateTransition firstTransition = (AbsoluteDateTransition) x;
120+
final AbsoluteDateTransition secondTransition = (AbsoluteDateTransition) y;
119121

120-
final Date firstDateTime = firstTransition.getDateTime();
121-
final Date secondDateTime = secondTransition.getDateTime();
122+
final Date firstDateTime = firstTransition.getDateTime();
123+
final Date secondDateTime = secondTransition.getDateTime();
122124

123-
return firstDateTime.compareTo(secondDateTime);
125+
return firstDateTime.compareTo(secondDateTime);
126+
127+
} else if (y instanceof TimeZoneTransition) {
128+
return 1;
129+
}
124130
} else if (y == null) {
125131
return 1;
126132
}

src/main/java/microsoft/exchange/webservices/data/property/complex/time/TimeZoneTransition.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,22 @@ public boolean tryReadElementFromXml(EwsServiceXmlReader reader)
121121
String targetId = reader.readElementValue();
122122
if (targetKind.equals(PeriodTarget)) {
123123
if (!this.timeZoneDefinition.getPeriods().containsKey(targetId)) {
124-
this.targetPeriod = this.timeZoneDefinition.getPeriods()
125-
.get(targetId);
124+
126125
throw new ServiceLocalException(String.format(
127126
"Invalid transition. A period with the specified Id couldn't be found: %s", targetId));
127+
} else {
128+
this.targetPeriod = this.timeZoneDefinition.getPeriods()
129+
.get(targetId);
128130
}
129131
} else if (targetKind.equals(GroupTarget)) {
130132
if (!this.timeZoneDefinition.getTransitionGroups().containsKey(
131133
targetId)) {
132-
this.targetGroup = this.timeZoneDefinition
133-
.getTransitionGroups().get(targetId);
134+
134135
throw new ServiceLocalException(String.format(
135136
"Invalid transition. A transition group with the specified ID couldn't be found: %s", targetId));
137+
} else {
138+
this.targetGroup = this.timeZoneDefinition
139+
.getTransitionGroups().get(targetId);
136140
}
137141
} else {
138142
throw new ServiceLocalException("The time zone transition target isn't supported.");
@@ -159,7 +163,7 @@ public void writeElementsToXml(EwsServiceXmlWriter writer)
159163
if (this.targetPeriod != null) {
160164
writer.writeAttributeValue(XmlAttributeNames.Kind, PeriodTarget);
161165
writer.writeValue(this.targetPeriod.getId(), XmlElementNames.To);
162-
} else {
166+
} else if (this.targetGroup != null) {
163167
writer.writeAttributeValue(XmlAttributeNames.Kind, GroupTarget);
164168
writer.writeValue(this.targetGroup.getId(), XmlElementNames.To);
165169
}

0 commit comments

Comments
 (0)