1515package org .htmlunit .javascript .proxyautoconfig ;
1616
1717import 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 ;
2024import java .util .Locale ;
21- import java .util .TimeZone ;
2225
2326import org .apache .commons .lang3 .StringUtils ;
2427import org .htmlunit .javascript .HtmlUnitScriptable ;
4144public 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 );
0 commit comments