Skip to content

Commit e91515c

Browse files
committed
migrate to java.time
1 parent b70b320 commit e91515c

File tree

2 files changed

+105
-78
lines changed

2 files changed

+105
-78
lines changed

src/main/java/org/htmlunit/javascript/proxyautoconfig/ProxyAutoConfig.java

Lines changed: 74 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
package org.htmlunit.javascript.proxyautoconfig;
1616

1717
import java.net.InetAddress;
18-
import java.text.SimpleDateFormat;
19-
import java.util.Calendar;
18+
import java.time.LocalDate;
19+
import java.time.LocalTime;
20+
import java.time.ZoneId;
21+
import java.time.ZonedDateTime;
22+
import java.time.format.DateTimeFormatter;
23+
import java.time.format.DateTimeParseException;
2024
import java.util.Locale;
21-
import java.util.TimeZone;
2225

2326
import org.apache.commons.lang3.StringUtils;
2427
import org.htmlunit.javascript.HtmlUnitScriptable;
@@ -41,6 +44,9 @@
4144
public final class ProxyAutoConfig extends HtmlUnitScriptable {
4245

4346
private static final String TIMEZONE_GMT = "GMT";
47+
private static final ZoneId GMT_ZONE = ZoneId.of(TIMEZONE_GMT);
48+
private static final DateTimeFormatter WEEKDAY_FORMATTER = DateTimeFormatter.ofPattern("EEE", Locale.ROOT);
49+
private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("MMM", Locale.ROOT);
4450

4551
private ProxyAutoConfig() {
4652
super();
@@ -176,25 +182,25 @@ public static boolean shExpMatch(final String str, final String shexp) {
176182
*/
177183
@JsxFunction
178184
public static boolean weekdayRange(final String wd1, Object wd2, final Object gmt) {
179-
TimeZone timezone = TimeZone.getDefault();
185+
ZoneId zoneId = ZoneId.systemDefault();
180186
if (TIMEZONE_GMT.equals(JavaScriptEngine.toString(gmt))
181187
|| TIMEZONE_GMT.equals(JavaScriptEngine.toString(wd2))) {
182-
timezone = TimeZone.getTimeZone(TIMEZONE_GMT);
188+
zoneId = GMT_ZONE;
183189
}
184190
if (JavaScriptEngine.isUndefined(wd2) || TIMEZONE_GMT.equals(JavaScriptEngine.toString(wd2))) {
185191
wd2 = wd1;
186192
}
187-
final Calendar calendar = Calendar.getInstance(timezone);
193+
194+
LocalDate today = LocalDate.now(zoneId);
188195
for (int i = 0; i < 7; i++) {
189-
final String day = new SimpleDateFormat("EEE", Locale.ROOT)
190-
.format(calendar.getTime()).toUpperCase(Locale.ROOT);
196+
final String day = today.format(WEEKDAY_FORMATTER).toUpperCase(Locale.ROOT);
191197
if (day.equals(wd2)) {
192198
return true;
193199
}
194200
if (day.equals(wd1)) {
195201
return i == 0;
196202
}
197-
calendar.add(Calendar.DAY_OF_WEEK, 1);
203+
today = today.plusDays(1);
198204
}
199205
return false;
200206
}
@@ -214,13 +220,13 @@ public static boolean weekdayRange(final String wd1, Object wd2, final Object gm
214220
public static boolean dateRange(final String value1, final Object value2, final Object value3,
215221
final Object value4, final Object value5, final Object value6, final Object value7) {
216222
final Object[] values = {value1, value2, value3, value4, value5, value6, value7};
217-
TimeZone timezone = TimeZone.getDefault();
223+
ZoneId zoneId = ZoneId.systemDefault();
218224

219-
//actual values length
225+
// actual values length
220226
int length;
221227
for (length = values.length - 1; length >= 0; length--) {
222228
if (TIMEZONE_GMT.equals(JavaScriptEngine.toString(values[length]))) {
223-
timezone = TimeZone.getTimeZone(TIMEZONE_GMT);
229+
zoneId = GMT_ZONE;
224230
break;
225231
}
226232
else if (!JavaScriptEngine.isUndefined(values[length])) {
@@ -235,81 +241,78 @@ else if (!JavaScriptEngine.isUndefined(values[length])) {
235241
final int month2;
236242
final int year1;
237243
final int year2;
238-
final Calendar cal1;
239-
final Calendar cal2;
244+
final ZonedDateTime dateTime1;
245+
final ZonedDateTime dateTime2;
246+
240247
switch (length) {
241248
case 1:
242249
final int day = getSmallInt(value1);
243250
final int month = dateRange_getMonth(value1);
244251
final int year = dateRange_getYear(value1);
245-
cal1 = dateRange_createCalendar(timezone, day, month, year);
246-
cal2 = (Calendar) cal1.clone();
252+
dateTime1 = dateRange_createDateTime(zoneId, day, month, year);
253+
dateTime2 = dateTime1;
247254
break;
248-
249255
case 2:
250256
day1 = getSmallInt(value1);
251257
month1 = dateRange_getMonth(value1);
252258
year1 = dateRange_getYear(value1);
253-
cal1 = dateRange_createCalendar(timezone, day1, month1, year1);
259+
dateTime1 = dateRange_createDateTime(zoneId, day1, month1, year1);
254260
day2 = getSmallInt(value2);
255261
month2 = dateRange_getMonth(value2);
256262
year2 = dateRange_getYear(value2);
257-
cal2 = dateRange_createCalendar(timezone, day2, month2, year2);
263+
dateTime2 = dateRange_createDateTime(zoneId, day2, month2, year2);
258264
break;
259-
260265
case 4:
261266
day1 = getSmallInt(value1);
262267
if (day1 != -1) {
263268
month1 = dateRange_getMonth(value2);
264269
day2 = getSmallInt(value3);
265270
month2 = dateRange_getMonth(value4);
266-
cal1 = dateRange_createCalendar(timezone, day1, month1, -1);
267-
cal2 = dateRange_createCalendar(timezone, day2, month2, -1);
271+
dateTime1 = dateRange_createDateTime(zoneId, day1, month1, -1);
272+
dateTime2 = dateRange_createDateTime(zoneId, day2, month2, -1);
268273
}
269274
else {
270275
month1 = dateRange_getMonth(value1);
271-
year1 = dateRange_getMonth(value2);
272-
month2 = getSmallInt(value3);
273-
year2 = dateRange_getMonth(value4);
274-
cal1 = dateRange_createCalendar(timezone, -1, month1, year1);
275-
cal2 = dateRange_createCalendar(timezone, -1, month2, year2);
276+
year1 = getSmallInt(value2);
277+
month2 = dateRange_getMonth(value3);
278+
year2 = getSmallInt(value4);
279+
dateTime1 = dateRange_createDateTime(zoneId, -1, month1, year1);
280+
dateTime2 = dateRange_createDateTime(zoneId, -1, month2, year2);
276281
}
277282
break;
278-
279283
default:
280284
day1 = getSmallInt(value1);
281285
month1 = dateRange_getMonth(value2);
282286
year1 = dateRange_getYear(value3);
283287
day2 = getSmallInt(value4);
284288
month2 = dateRange_getMonth(value5);
285289
year2 = dateRange_getYear(value6);
286-
cal1 = dateRange_createCalendar(timezone, day1, month1, year1);
287-
cal2 = dateRange_createCalendar(timezone, day2, month2, year2);
290+
dateTime1 = dateRange_createDateTime(zoneId, day1, month1, year1);
291+
dateTime2 = dateRange_createDateTime(zoneId, day2, month2, year2);
288292
}
289293

290-
final Calendar today = Calendar.getInstance(timezone);
291-
today.set(Calendar.MILLISECOND, 0);
292-
today.set(Calendar.SECOND, 0);
293-
cal1.set(Calendar.MILLISECOND, 0);
294-
cal1.set(Calendar.SECOND, 0);
295-
cal2.set(Calendar.MILLISECOND, 0);
296-
cal2.set(Calendar.SECOND, 0);
297-
return today.equals(cal1) || (today.after(cal1) && today.before(cal2)) || today.equals(cal2);
294+
final ZonedDateTime now = ZonedDateTime.now(zoneId)
295+
.withSecond(0)
296+
.withNano(0);
297+
final ZonedDateTime dt1 = dateTime1.withSecond(0).withNano(0);
298+
final ZonedDateTime dt2 = dateTime2.withSecond(0).withNano(0);
299+
300+
return now.isEqual(dt1) || (now.isAfter(dt1) && now.isBefore(dt2)) || now.isEqual(dt2);
298301
}
299302

300-
private static Calendar dateRange_createCalendar(final TimeZone timezone,
303+
private static ZonedDateTime dateRange_createDateTime(final ZoneId zoneId,
301304
final int day, final int month, final int year) {
302-
final Calendar calendar = Calendar.getInstance(timezone);
305+
ZonedDateTime dateTime = ZonedDateTime.now(zoneId);
303306
if (day != -1) {
304-
calendar.set(Calendar.DAY_OF_MONTH, day);
307+
dateTime = dateTime.withDayOfMonth(day);
305308
}
306309
if (month != -1) {
307-
calendar.set(Calendar.MONTH, month);
310+
dateTime = dateTime.withMonth(month + 1); // Calendar months are 0-based, java.time is 1-based
308311
}
309312
if (year != -1) {
310-
calendar.set(Calendar.YEAR, year);
313+
dateTime = dateTime.withYear(year);
311314
}
312-
return calendar;
315+
return dateTime;
313316
}
314317

315318
private static int getSmallInt(final Object object) {
@@ -327,12 +330,11 @@ private static int dateRange_getMonth(final Object object) {
327330
final String s = JavaScriptEngine.toString(object);
328331
if (Character.isLetter(s.charAt(0))) {
329332
try {
330-
final Calendar cal = Calendar.getInstance(Locale.ROOT);
331-
cal.clear();
332-
cal.setTime(new SimpleDateFormat("MMM", Locale.ROOT).parse(s));
333-
return cal.get(Calendar.MONTH);
333+
final LocalDate date = LocalDate.parse(s + " 1",
334+
DateTimeFormatter.ofPattern("MMM d", Locale.ROOT));
335+
return date.getMonthValue() - 1; // Return 0-based month for compatibility
334336
}
335-
catch (final Exception ignored) {
337+
catch (final DateTimeParseException ignored) {
336338
// empty
337339
}
338340
}
@@ -365,13 +367,13 @@ private static int dateRange_getYear(final Object object) {
365367
public static boolean timeRange(final String value1, final Object value2, final Object value3,
366368
final Object value4, final Object value5, final Object value6, final Object value7) {
367369
final Object[] values = {value1, value2, value3, value4, value5, value6, value7};
368-
TimeZone timezone = TimeZone.getDefault();
370+
ZoneId zoneId = ZoneId.systemDefault();
369371

370-
//actual values length
372+
// actual values length
371373
int length;
372374
for (length = values.length - 1; length >= 0; length--) {
373375
if (TIMEZONE_GMT.equals(JavaScriptEngine.toString(values[length]))) {
374-
timezone = TimeZone.getTimeZone(TIMEZONE_GMT);
376+
zoneId = GMT_ZONE;
375377
break;
376378
}
377379
else if (!JavaScriptEngine.isUndefined(values[length])) {
@@ -386,60 +388,56 @@ else if (!JavaScriptEngine.isUndefined(values[length])) {
386388
final int min2;
387389
final int second1;
388390
final int second2;
389-
final Calendar cal1;
390-
final Calendar cal2;
391+
final LocalTime time1;
392+
final LocalTime time2;
393+
391394
switch (length) {
392395
case 1:
393396
hour1 = getSmallInt(value1);
394-
cal1 = timeRange_createCalendar(timezone, hour1, -1, -1);
395-
cal2 = (Calendar) cal1.clone();
396-
cal2.add(Calendar.HOUR_OF_DAY, 1);
397+
time1 = timeRange_createTime(hour1, -1, -1);
398+
time2 = time1.plusHours(1);
397399
break;
398-
399400
case 2:
400401
hour1 = getSmallInt(value1);
401-
cal1 = timeRange_createCalendar(timezone, hour1, -1, -1);
402+
time1 = timeRange_createTime(hour1, -1, -1);
402403
hour2 = getSmallInt(value2);
403-
cal2 = timeRange_createCalendar(timezone, hour2, -1, -1);
404+
time2 = timeRange_createTime(hour2, -1, -1);
404405
break;
405-
406406
case 4:
407407
hour1 = getSmallInt(value1);
408408
min1 = getSmallInt(value2);
409409
hour2 = getSmallInt(value3);
410410
min2 = getSmallInt(value4);
411-
cal1 = dateRange_createCalendar(timezone, hour1, min1, -1);
412-
cal2 = dateRange_createCalendar(timezone, hour2, min2, -1);
411+
time1 = timeRange_createTime(hour1, min1, -1);
412+
time2 = timeRange_createTime(hour2, min2, -1);
413413
break;
414-
415414
default:
416415
hour1 = getSmallInt(value1);
417416
min1 = getSmallInt(value2);
418417
second1 = getSmallInt(value3);
419418
hour2 = getSmallInt(value4);
420419
min2 = getSmallInt(value5);
421420
second2 = getSmallInt(value6);
422-
cal1 = dateRange_createCalendar(timezone, hour1, min1, second1);
423-
cal2 = dateRange_createCalendar(timezone, hour2, min2, second2);
421+
time1 = timeRange_createTime(hour1, min1, second1);
422+
time2 = timeRange_createTime(hour2, min2, second2);
424423
}
425424

426-
final Calendar now = Calendar.getInstance(timezone);
427-
return now.equals(cal1) || now.after(cal1) && now.before(cal2) || now.equals(cal2);
425+
final LocalTime now = LocalTime.now(zoneId);
426+
return now.equals(time1) || (now.isAfter(time1) && now.isBefore(time2)) || now.equals(time2);
428427
}
429428

430-
private static Calendar timeRange_createCalendar(final TimeZone timezone,
431-
final int hour, final int minute, final int second) {
432-
final Calendar calendar = Calendar.getInstance(timezone);
429+
private static LocalTime timeRange_createTime(final int hour, final int minute, final int second) {
430+
LocalTime time = LocalTime.now();
433431
if (hour != -1) {
434-
calendar.set(Calendar.HOUR_OF_DAY, hour);
432+
time = time.withHour(hour);
435433
}
436434
if (minute != -1) {
437-
calendar.set(Calendar.MINUTE, minute);
435+
time = time.withMinute(minute);
438436
}
439437
if (second != -1) {
440-
calendar.set(Calendar.SECOND, second);
438+
time = time.withSecond(second);
441439
}
442-
return calendar;
440+
return time;
443441
}
444442

445443
/**
@@ -450,9 +448,7 @@ private static Calendar timeRange_createCalendar(final TimeZone timezone,
450448
@JsxFunction(functionName = "convert_addr")
451449
public static long convertAddr(final String ip) {
452450
final String[] parts = StringUtils.split(ip, '.');
453-
454-
return
455-
((Integer.parseInt(parts[0]) & 0xff) << 24)
451+
return ((Integer.parseInt(parts[0]) & 0xff) << 24)
456452
| ((Integer.parseInt(parts[1]) & 0xff) << 16)
457453
| ((Integer.parseInt(parts[2]) & 0xff) << 8)
458454
| (Integer.parseInt(parts[3]) & 0xff);

src/test/java/org/htmlunit/javascript/proxyautoconfig/ProxyAutoConfigTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,29 @@ public void shExpMatch() {
4444
assertFalse(ProxyAutoConfig.shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*"));
4545
}
4646

47+
/**
48+
* Test case.
49+
*/
50+
@Test
51+
public void dnsLevelDomains() {
52+
assertEquals(0, ProxyAutoConfig.dnsDomainLevels("localhost"));
53+
assertEquals(1, ProxyAutoConfig.dnsDomainLevels("example.com"));
54+
assertEquals(2, ProxyAutoConfig.dnsDomainLevels("www.example.com"));
55+
assertEquals(3, ProxyAutoConfig.dnsDomainLevels("api.sub.example.com"));
56+
assertEquals(4, ProxyAutoConfig.dnsDomainLevels("deep.api.sub.example.com"));
57+
58+
assertEquals(2, ProxyAutoConfig.dnsDomainLevels(".example.com"));
59+
assertEquals(2, ProxyAutoConfig.dnsDomainLevels("example.com."));
60+
assertEquals(2, ProxyAutoConfig.dnsDomainLevels("example..com"));
61+
assertEquals(3, ProxyAutoConfig.dnsDomainLevels("example...com"));
62+
63+
assertEquals(0, ProxyAutoConfig.dnsDomainLevels(""));
64+
assertEquals(1, ProxyAutoConfig.dnsDomainLevels("."));
65+
assertEquals(3, ProxyAutoConfig.dnsDomainLevels("..."));
66+
67+
assertEquals(3, ProxyAutoConfig.dnsDomainLevels("192.168.1.1"));
68+
}
69+
4770
/**
4871
* Test case.
4972
*/
@@ -56,11 +79,18 @@ public void weekdayRange() {
5679
final String tomorrow = dateFormat.format(calendar.getTime()).toUpperCase(Locale.ROOT);
5780
calendar.add(Calendar.DAY_OF_MONTH, -2);
5881
final String yesterday = dateFormat.format(calendar.getTime()).toUpperCase(Locale.ROOT);
82+
5983
assertTrue(ProxyAutoConfig.weekdayRange(today, Undefined.instance, Undefined.instance));
6084
assertTrue(ProxyAutoConfig.weekdayRange(today, tomorrow, Undefined.instance));
6185
assertTrue(ProxyAutoConfig.weekdayRange(yesterday, today, Undefined.instance));
6286
assertTrue(ProxyAutoConfig.weekdayRange(yesterday, tomorrow, Undefined.instance));
6387
assertFalse(ProxyAutoConfig.weekdayRange(tomorrow, yesterday, Undefined.instance));
88+
89+
assertTrue(ProxyAutoConfig.weekdayRange(today, Undefined.instance, "GMT"));
90+
assertTrue(ProxyAutoConfig.weekdayRange(today, tomorrow, "GMT"));
91+
assertTrue(ProxyAutoConfig.weekdayRange(yesterday, today, "GMT"));
92+
assertTrue(ProxyAutoConfig.weekdayRange(yesterday, tomorrow, "GMT"));
93+
assertFalse(ProxyAutoConfig.weekdayRange(tomorrow, yesterday, "GMT"));
6494
}
6595

6696
/**
@@ -75,6 +105,7 @@ public void dateRange() {
75105
final int tomorrow = calendar.get(Calendar.DAY_OF_MONTH);
76106
calendar.add(Calendar.DAY_OF_MONTH, -2);
77107
final int yesterday = calendar.get(Calendar.DAY_OF_MONTH);
108+
78109
assertTrue(ProxyAutoConfig.dateRange(String.valueOf(today),
79110
undefined, undefined, undefined, undefined, undefined, undefined));
80111
assertFalse(ProxyAutoConfig.dateRange(String.valueOf(yesterday),

0 commit comments

Comments
 (0)