You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by cm...@apache.org on 2012/06/15 16:16:18 UTC

git commit: WICKET-4575 allow form submitters to choose whether to run before or after form#onsubmit

Updated Branches:
  refs/heads/master ec1bc9ca3 -> b8082ca3a


WICKET-4575 allow form submitters to choose whether to run before or after form#onsubmit


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

Branch: refs/heads/master
Commit: b8082ca3a0261e8b34f83543fa737fcff067e55f
Parents: ec1bc9c
Author: Carl-Eric Menzel <cm...@wicketbuch.de>
Authored: Fri Jun 15 16:13:36 2012 +0200
Committer: Carl-Eric Menzel <cm...@wicketbuch.de>
Committed: Fri Jun 15 16:13:36 2012 +0200

----------------------------------------------------------------------
 .../wicket/ajax/form/AjaxFormSubmitBehavior.java   |   20 +++
 .../markup/html/form/AbstractSubmitLink.java       |   14 ++-
 .../org/apache/wicket/markup/html/form/Button.java |   16 +++-
 .../org/apache/wicket/markup/html/form/Form.java   |   32 ++++-
 .../wicket/markup/html/form/IFormSubmitter.java    |   18 +++
 .../html/form/FormSubmitOrderTest$TestPage.html    |    8 ++
 .../markup/html/form/FormSubmitOrderTest.java      |   92 +++++++++++++++
 7 files changed, 191 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b8082ca3/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehavior.java b/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehavior.java
index 8e926a5..52b067c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehavior.java
@@ -24,6 +24,7 @@ import org.apache.wicket.ajax.attributes.AjaxRequestAttributes.Method;
 import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.IFormSubmitter;
+import org.apache.wicket.markup.html.form.IFormSubmitter.SubmitOrder;
 import org.apache.wicket.markup.html.form.IFormSubmittingComponent;
 
 /**
@@ -171,10 +172,29 @@ public abstract class AjaxFormSubmitBehavior extends AjaxEventBehavior
 			{
 				AjaxFormSubmitBehavior.this.onError(target);
 			}
+
+			@Override
+			public SubmitOrder getSubmitOrder()
+			{
+				return AjaxFormSubmitBehavior.this.getSubmitOrder();
+			}
 		});
 	}
 
 	/**
+	 * Defaults to running before {@link Form#onSubmit()}. Override if you want to run afterwards
+	 * instead.
+	 * 
+	 * @return submit order
+	 * 
+	 * @see org.apache.wicket.markup.html.form.IFormSubmitter#getSubmitOrder()
+	 */
+	public IFormSubmitter.SubmitOrder getSubmitOrder()
+	{
+		return SubmitOrder.BEFORE_FORM;
+	}
+
+	/**
 	 * Listener method that is invoked after the form has been submitted and processed without
 	 * errors
 	 * 

http://git-wip-us.apache.org/repos/asf/wicket/blob/b8082ca3/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java
index 7be50b9..e2c7665 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java
@@ -28,7 +28,7 @@ import org.apache.wicket.model.IModel;
 public abstract class AbstractSubmitLink extends AbstractLink implements IFormSubmittingComponent
 {
 	/**
-	 * 
+	 *
 	 */
 	private static final long serialVersionUID = 1L;
 
@@ -146,4 +146,16 @@ public abstract class AbstractSubmitLink extends AbstractLink implements IFormSu
 	{
 		return Form.getRootFormRelativeId(this);
 	}
+
+	/**
+	 * Defaults to running before {@link Form#onSubmit()}. Override if you want to run afterwards
+	 * instead.
+	 * 
+	 * @see org.apache.wicket.markup.html.form.IFormSubmitter#getSubmitOrder()
+	 */
+	@Override
+	public SubmitOrder getSubmitOrder()
+	{
+		return SubmitOrder.BEFORE_FORM;
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b8082ca3/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Button.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Button.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Button.java
index 8a4b555..166f88f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Button.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Button.java
@@ -104,7 +104,7 @@ public class Button extends FormComponent<String> implements IFormSubmittingComp
 
 	/**
 	 * Override to not throw exception if there is no parent form.
-	 *
+	 * 
 	 * @return the parent form or {@code null}
 	 */
 	@Override
@@ -229,4 +229,16 @@ public class Button extends FormComponent<String> implements IFormSubmittingComp
 	{
 
 	}
-}
\ No newline at end of file
+
+	/**
+	 * Defaults to running before {@link Form#onSubmit()}. Override if you want to run afterwards
+	 * instead.
+	 * 
+	 * @see org.apache.wicket.markup.html.form.IFormSubmitter#getSubmitOrder()
+	 */
+	@Override
+	public SubmitOrder getSubmitOrder()
+	{
+		return SubmitOrder.BEFORE_FORM;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/b8082ca3/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 afc2600..6fe4177 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
@@ -35,6 +35,7 @@ import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.IFormSubmitter.SubmitOrder;
 import org.apache.wicket.markup.html.form.upload.FileUploadField;
 import org.apache.wicket.markup.html.form.validation.FormValidatorAdapter;
 import org.apache.wicket.markup.html.form.validation.IFormValidator;
@@ -1223,15 +1224,34 @@ public class Form<T> extends WebMarkupContainer implements IFormSubmitListener
 	{
 		final Form<?> processingForm = findFormToProcess(submittingComponent);
 
-
-		// process submitting component (if specified)
-		if (submittingComponent != null)
+		if (submittingComponent == null)
 		{
-			// invoke submit on component
-			submittingComponent.onSubmit();
+			// no submitter => just process the forms
+			submitFormsIncludingNested(processingForm);
+		}
+		else
+		{
+			// submitter button was clicked => check order
+			final SubmitOrder submitOrder = submittingComponent.getSubmitOrder();
+			switch (submitOrder)
+			{
+				case BEFORE_FORM :
+					submittingComponent.onSubmit();
+					submitFormsIncludingNested(processingForm);
+					break;
+				case AFTER_FORM :
+					submitFormsIncludingNested(processingForm);
+					submittingComponent.onSubmit();
+					break;
+				default :
+					throw new IllegalStateException("unknown submitorder: " + submitOrder);
+			}
 		}
+	}
 
-		// invoke Form#onSubmit(..) going from innermost to outermost
+	// invoke Form#onSubmit(..) going from innermost to outermost
+	private void submitFormsIncludingNested(final Form<?> processingForm)
+	{
 		Visits.visitPostOrder(processingForm, new IVisitor<Form<?>, Void>()
 		{
 			@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/b8082ca3/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitter.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitter.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitter.java
index aad0487..68e45a7 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitter.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitter.java
@@ -52,4 +52,22 @@ public interface IFormSubmitter
 	 * errors.
 	 */
 	void onError();
+
+	/**
+	 * Returns whether this component's {@link #onSubmit()} method should be called before or after
+	 * {@link Form#onSubmit()}.
+	 * 
+	 * @return submit order
+	 */
+	SubmitOrder getSubmitOrder();
+
+	/**
+	 * Indicates whether this component's {@link #onSubmit()} method should be called before or
+	 * after {@link Form#onSubmit()}.
+	 * 
+	 * @author Carl-Eric Menzel (cmenzel)
+	 */
+	static enum SubmitOrder {
+		BEFORE_FORM, AFTER_FORM
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b8082ca3/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest$TestPage.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest$TestPage.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest$TestPage.html
new file mode 100644
index 0000000..834e0a3
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest$TestPage.html
@@ -0,0 +1,8 @@
+<html>
+<body>
+<form wicket:id="form">
+<input type="submit" wicket:id="custom"/>
+<input type="submit" wicket:id="default"/>
+</form>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/b8082ca3/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest.java
new file mode 100644
index 0000000..649ce4e
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.IFormSubmitter.SubmitOrder;
+import org.junit.Test;
+
+public class FormSubmitOrderTest extends WicketTestCase
+{
+	public static class TestPage extends WebPage
+	{
+		String result = "";
+
+		public TestPage(final SubmitOrder order)
+		{
+			Form form = new Form("form")
+			{
+				@Override
+				protected void onSubmit()
+				{
+					super.onSubmit();
+					result += "form";
+				}
+			};
+			this.add(form);
+			form.add(new Button("custom")
+			{
+				@Override
+				public SubmitOrder getSubmitOrder()
+				{
+					return order;
+				}
+
+				@Override
+				public void onSubmit()
+				{
+					super.onSubmit();
+					result += "custom";
+				}
+			});
+			form.add(new Button("default")
+			{
+				@Override
+				public void onSubmit()
+				{
+					super.onSubmit();
+					result += "default";
+				}
+			});
+		}
+	}
+
+	@Test
+	public void defaultOrder() throws Exception
+	{
+		TestPage page = tester.startPage(new TestPage(null));
+		tester.newFormTester("form").submit("default");
+		assertEquals("defaultform", page.result);
+	}
+
+	@Test
+	public void customOrderBefore() throws Exception
+	{
+		TestPage page = tester.startPage(new TestPage(SubmitOrder.BEFORE_FORM));
+		tester.newFormTester("form").submit("custom");
+		assertEquals("customform", page.result);
+	}
+
+	@Test
+	public void customOrderAfter() throws Exception
+	{
+		TestPage page = tester.startPage(new TestPage(SubmitOrder.AFTER_FORM));
+		tester.newFormTester("form").submit("custom");
+		assertEquals("formcustom", page.result);
+	}
+}