Repository: wicket
Updated Branches:
  refs/heads/master 130cfb640 -> ece7575f5


WICKET-6041 Nested forms / parent FormComponents do not reflect updated
model when nested form submitted


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ece7575f
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ece7575f
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ece7575f

Branch: refs/heads/master
Commit: ece7575f5ea74ec27f88618fd287e4348aa9cc35
Parents: 130cfb6
Author: Andrea Del Bene <[email protected]>
Authored: Fri Aug 19 15:53:50 2016 +0200
Committer: Andrea Del Bene <[email protected]>
Committed: Fri Aug 19 16:17:09 2016 +0200

----------------------------------------------------------------------
 .../apache/wicket/markup/html/form/Form.java    | 91 +++++++++++---------
 .../markup/html/form/NestedFormsTest.java       | 79 +++++++++++++++++
 2 files changed, 128 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/ece7575f/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
----------------------------------------------------------------------
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 e8b61e7..88882c6 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
@@ -24,8 +24,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
-import javax.servlet.http.HttpServletRequest;
-
 import org.apache.commons.fileupload.FileUploadBase;
 import org.apache.commons.fileupload.FileUploadException;
 import org.apache.wicket.Component;
@@ -72,6 +70,8 @@ import org.apache.wicket.util.visit.Visits;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.http.HttpServletRequest;
+
 
 /**
  * Container for {@link FormComponent}s (such as {@link CheckBox}es, {@link 
ListChoice}s or
@@ -739,14 +739,19 @@ public class Form<T> extends WebMarkupContainer
         * 
         * @see Form#validate()
         */
-       public final void onFormSubmitted(IFormSubmitter submitter)
+       public final void onFormSubmitted(final IFormSubmitter submitter)
        {
-               markFormsSubmitted();
-
+               final IFormSubmitter actualSubmitter =  submitter != null ? 
submitter :
+                       findActualSubmitter();
+               //find the actual form to process
+               final Form<?> formToProcess = 
findFormToProcess(actualSubmitter);
+               
+               formToProcess.markFormsSubmitted();
+               
                if (handleMultiPart())
                {
                        // Tells FormComponents that a new user input has come
-                       inputChanged();
+                       formToProcess.inputChanged();
 
                        String url = getRequest().getRequestParameters()
                                .getParameterValue(getHiddenFieldId())
@@ -757,49 +762,19 @@ public class Form<T> extends WebMarkupContainer
                        }
                        else
                        {
-                               // First, see if the processing was triggered 
by a Wicket IFormSubmittingComponent
-                               if (submitter == null)
-                               {
-                                       submitter = findSubmittingButton();
-
-                                       if (submitter instanceof 
IFormSubmittingComponent)
-                                       {
-                                               IFormSubmittingComponent 
submittingComponent = (IFormSubmittingComponent)submitter;
-                                               Component component = 
(Component)submitter;
-
-                                               if 
(!component.isVisibleInHierarchy())
-                                               {
-                                                       throw new 
WicketRuntimeException("Submit Button " +
-                                                               
submittingComponent.getInputName() + " (path=" +
-                                                               
component.getPageRelativePath() + ") is not visible");
-                                               }
-
-                                               if 
(!component.isEnabledInHierarchy())
-                                               {
-                                                       throw new 
WicketRuntimeException("Submit Button " +
-                                                               
submittingComponent.getInputName() + " (path=" +
-                                                               
component.getPageRelativePath() + ") is not enabled");
-                                               }
-                                       }
-                               }
-
                                // When processing was triggered by a Wicket 
IFormSubmittingComponent and that
                                // component indicates it wants to be called 
immediately
                                // (without processing), call the 
IFormSubmittingComponent.onSubmit* methods right
                                // away.
-                               if (submitter != null && 
!submitter.getDefaultFormProcessing())
+                               if (actualSubmitter != null && 
!actualSubmitter.getDefaultFormProcessing())
                                {
-                                       submitter.onSubmit();
-                                       submitter.onAfterSubmit();
+                                       actualSubmitter.onSubmit();
+                                       actualSubmitter.onAfterSubmit();
                                }
                                else
                                {
-                                       // the submit request might be for one 
of the nested forms, so let's
-                                       // find the right one:
-                                       final Form<?> formToProcess = 
findFormToProcess(submitter);
-
                                        // process the form for this request
-                                       formToProcess.process(submitter);
+                                       formToProcess.process(actualSubmitter);
                                }
                        }
                }
@@ -807,7 +782,7 @@ public class Form<T> extends WebMarkupContainer
                // onError
                else if (hasError())
                {
-                       callOnError(submitter);
+                       callOnError(actualSubmitter);
                }
 
                // update auto labels if we are inside an ajax request
@@ -822,6 +797,39 @@ public class Form<T> extends WebMarkupContainer
                        });
                });
        }
+       
+       /**
+        * Find the actual submitter for this form. If such component
+        * is found but it's not enabled or visible, an exception is thrown.
+        * 
+        * @return the actual submitter
+        */
+       private IFormSubmitter findActualSubmitter() 
+       {
+               IFormSubmitter actualSubmitter = findSubmittingButton();
+
+               if (actualSubmitter instanceof IFormSubmittingComponent)
+               {
+                       IFormSubmittingComponent submittingComponent = 
(IFormSubmittingComponent)actualSubmitter;
+                       Component component = (Component)actualSubmitter;
+
+                       if (!component.isVisibleInHierarchy())
+                       {
+                               throw new WicketRuntimeException("Submit Button 
" +
+                                       submittingComponent.getInputName() + " 
(path=" +
+                                       component.getPageRelativePath() + ") is 
not visible");
+                       }
+
+                       if (!component.isEnabledInHierarchy())
+                       {
+                               throw new WicketRuntimeException("Submit Button 
" +
+                                       submittingComponent.getInputName() + " 
(path=" +
+                                       component.getPageRelativePath() + ") is 
not enabled");
+                       }
+               }
+               
+               return actualSubmitter;
+       }
 
        /**
         * This method finds the correct form that should be processed based on 
the submitting component
@@ -900,7 +908,6 @@ public class Form<T> extends WebMarkupContainer
         * 
         * @return Whether this form wants to be submitted too if a nested form 
is submitted.
         */
-       // TODO wicket-7 migration guide: changed from public to protected
        protected boolean wantSubmitOnNestedFormSubmit()
        {
                return false;

http://git-wip-us.apache.org/repos/asf/wicket/blob/ece7575f/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java
index 6b5b8c4..5090e24 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.IMarkupResourceStreamProvider;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.util.resource.IResourceStream;
@@ -64,7 +65,85 @@ public class NestedFormsTest extends WicketTestCase
                assertEquals(0, 
testPage.submitSequence.indexOf(testPage.innerSubmit));
                assertEquals(1, 
testPage.submitSequence.indexOf(testPage.innerForm));
        }
+       
+       @SuppressWarnings("unchecked")
+       @Test
+       public void subitInnerFormWithAjaxBehavior()
+       {
+               tester.startPage(TestAjaxPage.class);
 
+               FormTester formTester = tester.newFormTester("formA");          
+               formTester.submit("formB:submit");
+               
+               TestAjaxPage testPage = 
(TestAjaxPage)tester.getLastRenderedPage();
+               
+               assertFalse(testPage.isFormAsubmitted());
+               assertTrue(testPage.isFormBsubmitted());
+       }
+
+       public static class TestAjaxPage extends WebPage implements 
IMarkupResourceStreamProvider
+       {
+               /**
+                * 
+                */
+               private static final long serialVersionUID = 1L;
+               private boolean formAsubmitted;
+               private boolean formBsubmitted;
+               
+               public TestAjaxPage() 
+               {
+                       final Form<Void> formA = new Form<Void>("formA")
+                       {
+                               @Override
+                               public void onDetach() 
+                               {
+                                       formAsubmitted = isSubmitted();
+                                       super.onDetach();
+                               }
+                       };
+                       final Form<Void> formB = new Form<Void>("formB")
+                       {
+                               @Override
+                               protected void onDetach() 
+                               {
+                                       formBsubmitted = isSubmitted();
+                                       super.onDetach();
+                               }
+                       };
+                       
+                       formB.add(new AjaxButton("submit") 
+                       {
+                               private static final long serialVersionUID = 1L;
+                       });
+                       
+                       formA.add(formB);
+                       add(formA);
+               }
+               
+               @Override
+               public IResourceStream getMarkupResourceStream(MarkupContainer 
container,
+                       Class<?> containerClass)
+               {
+                       return new StringResourceStream(
+                               "<head></head>" +
+                               "<form wicket:id=\"formA\">\r\n" + 
+                               "                               Form A\r\n" + 
+                               "                               <form 
wicket:id=\"formB\">\r\n" + 
+                               "                                       Form 
B\r\n" + 
+                               "                                       <button 
wicket:id=\"submit\">submit</button>\r\n" + 
+                               "                               </form>\r\n" + 
+                               "                       </form>");
+               }
+
+               public boolean isFormAsubmitted() {
+                       return formAsubmitted;
+               }
+
+               public boolean isFormBsubmitted() {
+                       return formBsubmitted;
+               }
+       }
+       
        /** */
        public static class TestPage extends WebPage implements 
IMarkupResourceStreamProvider
        {

Reply via email to