This is an automated email from the ASF dual-hosted git repository.

adelbene pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/master by this push:
     new 1a3b18cf84 WICKET-7141 Add hook method 
afterUpdateFormComponentModels() in Form process (#1087)
1a3b18cf84 is described below

commit 1a3b18cf8418fb3360332facf07b67acd267efed
Author: Florian Lacreuse <[email protected]>
AuthorDate: Fri Sep 26 11:31:27 2025 +0200

    WICKET-7141 Add hook method afterUpdateFormComponentModels() in Form 
process (#1087)
    
    * WICKET-7141 Add hook methods before and after update form components 
models (post order).
    
    * Improve test method name
    
    * Improve test method name
    
    * Remove empty line
    
    * Fixed bracket indentation
    
    ---------
    
    Co-authored-by: Martin Grigorov <[email protected]>
    Co-authored-by: Andrea Del Bene <[email protected]>
---
 .../wicket/markup/html/form/FormVisitTest.java     | 82 ++++++++++++++++++++++
 .../org/apache/wicket/markup/html/form/Form.java   | 56 ++++++++++++++-
 2 files changed, 137 insertions(+), 1 deletion(-)

diff --git 
a/wicket-core-tests/src/test/java/org/apache/wicket/markup/html/form/FormVisitTest.java
 
b/wicket-core-tests/src/test/java/org/apache/wicket/markup/html/form/FormVisitTest.java
index 79600f8f92..40c565b47d 100644
--- 
a/wicket-core-tests/src/test/java/org/apache/wicket/markup/html/form/FormVisitTest.java
+++ 
b/wicket-core-tests/src/test/java/org/apache/wicket/markup/html/form/FormVisitTest.java
@@ -62,6 +62,8 @@ public class FormVisitTest extends WicketTestCase
                assertTrue(page.outerForm.onValidateCalled);
                assertTrue(page.outerForm.onSubmitCalled);
                assertTrue(page.outerForm.isSubmittedFlagged);
+               
assertTrue(page.outerForm.onBeforeUpdateFormComponentModelsCalled);
+               
assertTrue(page.outerForm.onAfterUpdateFormComponentModelsCalled);
                assertTrue(page.outerForm.onValidateModelObjectsCalled);
                assertTrue(page.outerField.onValidCalled);
                assertTrue(page.outerField.updateModelCalled);
@@ -69,6 +71,8 @@ public class FormVisitTest extends WicketTestCase
                assertTrue(page.innerForm.onValidateCalled);
                assertTrue(page.innerForm.onSubmitCalled);
                assertTrue(page.innerForm.isSubmittedFlagged);
+               
assertTrue(page.innerForm.onBeforeUpdateFormComponentModelsCalled);
+               
assertTrue(page.innerForm.onAfterUpdateFormComponentModelsCalled);
                assertTrue(page.innerForm.onValidateModelObjectsCalled);
                assertTrue(page.innerField.onValidCalled);
                assertTrue(page.innerField.updateModelCalled);
@@ -84,6 +88,8 @@ public class FormVisitTest extends WicketTestCase
                assertTrue(page.outerForm.onValidateCalled);
                assertTrue(page.outerForm.onSubmitCalled);
                assertTrue(page.outerForm.isSubmittedFlagged);
+               
assertTrue(page.outerForm.onBeforeUpdateFormComponentModelsCalled);
+               
assertTrue(page.outerForm.onAfterUpdateFormComponentModelsCalled);
                assertTrue(page.outerForm.onValidateModelObjectsCalled);
                assertTrue(page.outerField.onValidCalled);
                assertTrue(page.outerField.updateModelCalled);
@@ -91,6 +97,8 @@ public class FormVisitTest extends WicketTestCase
                assertFalse(page.innerForm.onValidateCalled);
                assertFalse(page.innerForm.onSubmitCalled);
                assertFalse(page.innerForm.isSubmittedFlagged);
+               
assertFalse(page.innerForm.onBeforeUpdateFormComponentModelsCalled);
+               
assertFalse(page.innerForm.onAfterUpdateFormComponentModelsCalled);
                assertFalse(page.innerForm.onValidateModelObjectsCalled);
                assertFalse(page.innerField.onValidCalled);
                assertFalse(page.innerField.updateModelCalled);
@@ -105,6 +113,8 @@ public class FormVisitTest extends WicketTestCase
                assertFalse(page.outerForm.onValidateCalled);
                assertFalse(page.outerForm.onSubmitCalled);
                assertFalse(page.outerForm.isSubmittedFlagged);
+               
assertFalse(page.outerForm.onBeforeUpdateFormComponentModelsCalled);
+               
assertFalse(page.outerForm.onAfterUpdateFormComponentModelsCalled);
                assertFalse(page.outerForm.onValidateModelObjectsCalled);
                assertFalse(page.outerField.onValidCalled);
                assertFalse(page.outerField.updateModelCalled);
@@ -112,6 +122,8 @@ public class FormVisitTest extends WicketTestCase
                assertTrue(page.innerForm.onValidateCalled);
                assertTrue(page.innerForm.onSubmitCalled);
                assertTrue(page.innerForm.isSubmittedFlagged);
+               
assertTrue(page.innerForm.onBeforeUpdateFormComponentModelsCalled);
+               
assertTrue(page.innerForm.onAfterUpdateFormComponentModelsCalled);
                assertTrue(page.innerForm.onValidateModelObjectsCalled);
                assertTrue(page.innerField.onValidCalled);
                assertTrue(page.innerField.updateModelCalled);
@@ -329,6 +341,32 @@ public class FormVisitTest extends WicketTestCase
 
                assertTrue(page.innerField.onValidCallOrder < 
page.outerField.onValidCallOrder);
        }
+       
+       @Test
+       public void callInnerFormOnBeforeUpdateFormComponentModels()
+       {
+               tester.newFormTester("outerForm").submit();
+
+               
assertTrue(page.innerForm.onBeforeUpdateFormComponentModelsCalled);
+       }
+
+       @Test
+       public void dontCallInnerFormOnBeforeUpdateFormComponentModels()
+       {
+               page.innerForm.wantSubmitOnParentFormSubmit = false;
+               tester.newFormTester("outerForm").submit();
+
+               
assertFalse(page.innerForm.onBeforeUpdateFormComponentModelsCalled);
+       }
+
+       @Test
+       public void callFormOnBeforeUpdateFormComponentModelsInPostOrder()
+       {
+               tester.newFormTester("outerForm").submit();
+
+               assertTrue(
+                       
page.innerForm.onBeforeUpdateFormComponentModelsCallOrder < 
page.outerForm.onBeforeUpdateFormComponentModelsCallOrder);
+       }
 
        @Test
        public void updateInnerFormComponentModel()
@@ -355,6 +393,32 @@ public class FormVisitTest extends WicketTestCase
                assertTrue(page.innerField.updateModelOrder < 
page.outerField.updateModelOrder);
        }
 
+       @Test
+       public void callInnerFormOnAfterUpdateFormComponentModels()
+       {
+               tester.newFormTester("outerForm").submit();
+
+               
assertTrue(page.innerForm.onAfterUpdateFormComponentModelsCalled);
+       }
+
+       @Test
+       public void dontCallInnerFormOnAfterUpdateFormComponentModels()
+       {
+               page.innerForm.wantSubmitOnParentFormSubmit = false;
+               tester.newFormTester("outerForm").submit();
+
+               
assertFalse(page.innerForm.onAfterUpdateFormComponentModelsCalled);
+       }
+
+       @Test
+       public void callFormOnAfterUpdateFormComponentModelsInPostOrder()
+       {
+               tester.newFormTester("outerForm").submit();
+
+               assertTrue(
+                       
page.innerForm.onAfterUpdateFormComponentModelsCallOrder < 
page.outerForm.onAfterUpdateFormComponentModelsCallOrder);
+       }
+
        @Test
        public void callInnerFormOnValidateModelObjects()
        {
@@ -445,6 +509,10 @@ public class FormVisitTest extends WicketTestCase
                boolean onErrorCalled;
                boolean onSubmitCalled;
                boolean isSubmittedFlagged;
+               boolean onBeforeUpdateFormComponentModelsCalled;
+               int onBeforeUpdateFormComponentModelsCallOrder;
+               boolean onAfterUpdateFormComponentModelsCalled;
+               int onAfterUpdateFormComponentModelsCallOrder;
                boolean onValidateModelObjectsCalled;
                int onValidateModelObjectsCallOrder;
                int numberOfOnErrorCalls;
@@ -479,6 +547,20 @@ public class FormVisitTest extends WicketTestCase
                        onValidateCalled = true;
                }
 
+               @Override
+               protected void onBeforeUpdateFormComponentModels()
+               {
+                       onBeforeUpdateFormComponentModelsCalled = true;
+                       onBeforeUpdateFormComponentModelsCallOrder = sequence++;
+               }
+
+               @Override
+               protected void onAfterUpdateFormComponentModels()
+               {
+                       onAfterUpdateFormComponentModelsCalled = true;
+                       onAfterUpdateFormComponentModelsCallOrder = sequence++;
+               }
+
                @Override
                protected void onValidateModelObjects()
                {
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java 
b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
index dfa53458ec..cf1ef5e1d4 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
@@ -1002,10 +1002,14 @@ public class Form<T> extends WebMarkupContainer
 
                        // before updating, call the interception method for 
clients
                        beforeUpdateFormComponentModels();
+                       internalOnBeforeUpdateFormComponentModels();
 
                        // Update model using form data
                        updateFormComponentModels();
 
+                       // after updating, call the interception method for 
clients
+                       internalOnAfterUpdateFormComponentModels();
+
                        // validate model objects after input values have been 
bound
                        internalOnValidateModelObjects();
                        if (hasError())
@@ -1292,11 +1296,61 @@ public class Form<T> extends WebMarkupContainer
         * Template method to allow clients to do any processing (like 
recording the current model so
         * that, in case onSubmit does further validation, the model can be 
rolled back) before the
         * actual updating of form component models is done.
-        */
+        * 
+        * @deprecated Use {@linkplain #onBeforeUpdateFormComponentModels} 
instead.
+       */
+       @Deprecated(since = "10.5.0", forRemoval = true)
        protected void beforeUpdateFormComponentModels()
        {
        }
 
+
+       /**
+        * Calls {@linkplain #onBeforeUpdateFormComponentModels()} on this form 
and all nested forms that are
+        * visible and enabled.
+        */
+       private void internalOnBeforeUpdateFormComponentModels()
+       {
+               visitFormsPostOrder(this, (form, visit) -> {
+                       if (form.isVisibleInHierarchy() && 
form.isEnabledInHierarchy())
+                       {
+                               form.onBeforeUpdateFormComponentModels();
+                       }
+               });
+       }
+
+       /**
+        * Hook method to allow clients to do any processing (like recording 
the current model so
+        * that, in case onSubmit does further validation, the model can be 
rolled back) before the
+        * actual updating of form component models is done.
+        */
+       protected void onBeforeUpdateFormComponentModels()
+       {
+       }
+
+       /**
+        * Calls {@linkplain #onAfterUpdateFormComponentModels()} on this form 
and all nested forms that are
+        * visible and enabled.
+        */
+       private void internalOnAfterUpdateFormComponentModels()
+       {
+               visitFormsPostOrder(this, (form, visit) -> {
+                       if (form.isVisibleInHierarchy() && 
form.isEnabledInHierarchy())
+                       {
+                               form.onAfterUpdateFormComponentModels();
+                       }
+               });
+       }
+
+       /**
+        * Hook method to allow clients to do any processing (like updating 
entities or DTO from the models
+        * to be used later on the next late-stage validation) after the actual 
updating of form component
+        * models is done.
+        */
+       protected void onAfterUpdateFormComponentModels()
+       {
+       }
+
        /**
         * Called (by the default implementation of 'process') when all fields 
validated, the form was
         * updated and it's data was allowed to be persisted. It is meant for 
delegating further

Reply via email to