This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/struts.git
The following commit(s) were added to refs/heads/main by this push: new 9861b834a add conversion handling for OffsetDateTime (#1241) 9861b834a is described below commit 9861b834abab25f1a0c914fd381f15a3691383d3 Author: bill-humblcloud <bill@humbl.cloud> AuthorDate: Thu Mar 6 00:48:52 2025 -0500 add conversion handling for OffsetDateTime (#1241) --- .../java/org/apache/struts2/conversion/impl/DateConverter.java | 9 +++++++++ .../org/apache/struts2/conversion/impl/XWorkBasicConverter.java | 3 +++ .../org/apache/struts2/conversion/impl/XWorkConverterTest.java | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/core/src/main/java/org/apache/struts2/conversion/impl/DateConverter.java b/core/src/main/java/org/apache/struts2/conversion/impl/DateConverter.java index 753e72766..037ca032f 100644 --- a/core/src/main/java/org/apache/struts2/conversion/impl/DateConverter.java +++ b/core/src/main/java/org/apache/struts2/conversion/impl/DateConverter.java @@ -33,6 +33,7 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.temporal.TemporalAccessor; @@ -116,6 +117,14 @@ public class DateConverter extends DefaultTypeConverter { throw new TypeConversionException("Could not parse date", e); } + } else if (OffsetDateTime.class == toType) { + DateTimeFormatter dtf = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + + try { + return OffsetDateTime.parse(sa, dtf); + } catch (DateTimeParseException e) { + throw new TypeConversionException("Could not parse OffsetDateTime", e); + } } // final fallback for dates without time diff --git a/core/src/main/java/org/apache/struts2/conversion/impl/XWorkBasicConverter.java b/core/src/main/java/org/apache/struts2/conversion/impl/XWorkBasicConverter.java index 281e36380..a19ae2068 100644 --- a/core/src/main/java/org/apache/struts2/conversion/impl/XWorkBasicConverter.java +++ b/core/src/main/java/org/apache/struts2/conversion/impl/XWorkBasicConverter.java @@ -28,6 +28,7 @@ import java.lang.reflect.Member; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.util.Calendar; import java.util.Collection; import java.util.Date; @@ -108,6 +109,8 @@ public class XWorkBasicConverter extends DefaultTypeConverter { result = doConvertToDate(context, value, toType); } else if (LocalTime.class.isAssignableFrom(toType)) { result = doConvertToDate(context, value, toType); + } else if (OffsetDateTime.class.isAssignableFrom(toType)) { + result = doConvertToDate(context, value, toType); } else if (Calendar.class.isAssignableFrom(toType)) { result = doConvertToCalendar(context, value); } else if (Collection.class.isAssignableFrom(toType)) { diff --git a/core/src/test/java/org/apache/struts2/conversion/impl/XWorkConverterTest.java b/core/src/test/java/org/apache/struts2/conversion/impl/XWorkConverterTest.java index 256d9b231..39fe8e2cf 100644 --- a/core/src/test/java/org/apache/struts2/conversion/impl/XWorkConverterTest.java +++ b/core/src/test/java/org/apache/struts2/conversion/impl/XWorkConverterTest.java @@ -54,6 +54,7 @@ import java.time.format.DateTimeFormatter; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.util.Date; import java.util.Set; @@ -115,9 +116,13 @@ public class XWorkConverterTest extends XWorkTestCase { DateTimeFormatter formatterTime = DateTimeFormatter.ofPattern("HH:mm:ss"); LocalTime localTime = LocalTime.parse("10:11:12", formatterTime); + DateTimeFormatter formatterOffsetDateTime = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + OffsetDateTime offsetDateTime = OffsetDateTime.parse("2001-01-10T10:11:12+05:00", formatterOffsetDateTime); + String localDateStr = (String) converter.convertValue(context, null, null, null, localDate, String.class); String localDateTimeStr = (String) converter.convertValue(context, null, null, null, localDateTime, String.class); String localTimeStr = (String) converter.convertValue(context, null, null, null, localTime, String.class); + String offsetDateTimeStr = (String) converter.convertValue(context, null, null, null, offsetDateTime, String.class); LocalDate localDate2 = (LocalDate) converter.convertValue(context, null, null, null, localDateStr, LocalDate.class); assertEquals(localDate, localDate2); @@ -127,6 +132,9 @@ public class XWorkConverterTest extends XWorkTestCase { LocalTime localTime2 = (LocalTime) converter.convertValue(context, null, null, null, localTimeStr, LocalTime.class); assertEquals(localTime, localTime2); + + OffsetDateTime offsetDateTime2 = (OffsetDateTime) converter.convertValue(context, null, null, null, offsetDateTimeStr, OffsetDateTime.class); + assertEquals(offsetDateTime, offsetDateTime2); } public void testDateConversionWithDefault() throws ParseException {