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

commit f6cf6bc595c2c687c79ab2c8a29481b64f7bd158
Author: Lukasz Lenart <[email protected]>
AuthorDate: Sun Oct 25 16:05:53 2026 +0100

    WW-5811 test(html5): render min/max from java.util.Date XML bounds end to 
end
    
    A date validator with XML bounds on a java.util.Date property renders the
    configured dates under a non-UTC default zone; converting the bound in
    UTC instead renders 2025-12-31.
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
---
 .../struts2/components/ConstraintAction.java       |  9 +++++++++
 .../views/jsp/ui/Html5ConstraintRenderingTest.java | 22 ++++++++++++++++++++++
 .../components/ConstraintAction-validation.xml     |  7 +++++++
 3 files changed, 38 insertions(+)

diff --git 
a/core/src/test/java/org/apache/struts2/components/ConstraintAction.java 
b/core/src/test/java/org/apache/struts2/components/ConstraintAction.java
index 307554bea..d80f82aef 100644
--- a/core/src/test/java/org/apache/struts2/components/ConstraintAction.java
+++ b/core/src/test/java/org/apache/struts2/components/ConstraintAction.java
@@ -43,6 +43,15 @@ public class ConstraintAction extends ActionSupport {
     private LocalDateTime meetingAt;
     private LocalDate startDate;
     private String dateText;
+    private Date hiredOn;
+
+    public Date getHiredOn() {
+        return hiredOn;
+    }
+
+    public void setHiredOn(Date hiredOn) {
+        this.hiredOn = hiredOn;
+    }
 
     public LocalDate getStartDate() {
         return startDate;
diff --git 
a/core/src/test/java/org/apache/struts2/views/jsp/ui/Html5ConstraintRenderingTest.java
 
b/core/src/test/java/org/apache/struts2/views/jsp/ui/Html5ConstraintRenderingTest.java
index d6f795124..dabcb02d4 100644
--- 
a/core/src/test/java/org/apache/struts2/views/jsp/ui/Html5ConstraintRenderingTest.java
+++ 
b/core/src/test/java/org/apache/struts2/views/jsp/ui/Html5ConstraintRenderingTest.java
@@ -29,6 +29,7 @@ import org.apache.struts2.views.jsp.AbstractUITagTest;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TimeZone;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
@@ -183,6 +184,27 @@ public class Html5ConstraintRenderingTest extends 
AbstractUITagTest {
             && output.contains("max=\"2026-12-31\""));
     }
 
+    /**
+     * The XML bounds are parsed into server-zone midnights and written back 
in the same zone, so a
+     * non-UTC default zone must still render the configured dates.
+     */
+    public void testRendersTheIsoRangeOfAJavaUtilDateBoundOnADateTextField() 
throws Exception {
+        TimeZone defaultZone = TimeZone.getDefault();
+        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));
+        try {
+            String output = renderTag("true", () -> {
+                DateTextFieldTag date = new DateTextFieldTag();
+                date.setName("hiredOn");
+                return date;
+            });
+
+            assertTrue("expected min and max in: " + output, 
output.contains("type=\"date\" name=\"hiredOn\"")
+                && output.contains("min=\"2026-01-01\"") && 
output.contains("max=\"2026-12-31\""));
+        } finally {
+            TimeZone.setDefault(defaultZone);
+        }
+    }
+
     /**
      * A String property keeps the "" an empty date input submits, which 
{@code required} accepts.
      */
diff --git 
a/core/src/test/resources/org/apache/struts2/components/ConstraintAction-validation.xml
 
b/core/src/test/resources/org/apache/struts2/components/ConstraintAction-validation.xml
index 23754c8ad..7b78b0e6c 100644
--- 
a/core/src/test/resources/org/apache/struts2/components/ConstraintAction-validation.xml
+++ 
b/core/src/test/resources/org/apache/struts2/components/ConstraintAction-validation.xml
@@ -73,6 +73,13 @@
             <message>start within 2026</message>
         </field-validator>
     </field>
+    <field name="hiredOn">
+        <field-validator type="date">
+            <param name="min">2026-01-01</param>
+            <param name="max">2026-12-31</param>
+            <message>hired within 2026</message>
+        </field-validator>
+    </field>
     <field name="dateText">
         <field-validator type="required">
             <message>type a date</message>

Reply via email to