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