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/22 14:39:57 UTC

[2/2] git commit: WICKET-4575 before/after submit

WICKET-4575 before/after submit


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

Branch: refs/heads/wicket-1.5.x
Commit: e0286bada4ba7142e039f3176210e86bd9c78544
Parents: d274f68
Author: Carl-Eric Menzel <cm...@wicketbuch.de>
Authored: Fri Jun 22 14:31:03 2012 +0200
Committer: Carl-Eric Menzel <cm...@wicketbuch.de>
Committed: Fri Jun 22 14:31:03 2012 +0200

----------------------------------------------------------------------
 .../wicket/ajax/form/AjaxFormSubmitBehavior.java   |   44 ++++++++-
 .../wicket/ajax/markup/html/form/AjaxButton.java   |   51 ++++++++++-
 .../ajax/markup/html/form/AjaxFallbackButton.java  |   72 ++++++++++++++-
 .../ajax/markup/html/form/AjaxSubmitLink.java      |   60 +++++++++++-
 .../markup/html/form/AbstractSubmitLink.java       |    7 +-
 .../org/apache/wicket/markup/html/form/Button.java |   34 ++++++-
 .../org/apache/wicket/markup/html/form/Form.java   |   15 +++-
 .../html/form/IBeforeAndAfterFormSubmitter.java    |   38 ++++++++
 .../wicket/markup/html/form/IFormSubmitter.java    |    9 ++-
 .../apache/wicket/markup/html/form/SubmitLink.java |   21 ++++-
 .../html/form/FormSubmitOrderTest$TestPage.html    |    7 ++
 .../markup/html/form/FormSubmitOrderTest.java      |   67 ++++++++++++++
 .../markup/html/form/submitlink/HomePage.java      |   44 ++++++++-
 .../markup/html/form/submitlink/TestHomePage.java  |   13 +++
 14 files changed, 452 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/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 6532843..27d988e 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
@@ -21,7 +21,7 @@ import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 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.IBeforeAndAfterFormSubmitter;
 import org.apache.wicket.markup.html.form.IFormSubmittingComponent;
 import org.apache.wicket.util.string.AppendingStringBuffer;
 
@@ -155,7 +155,7 @@ public abstract class AjaxFormSubmitBehavior extends AjaxEventBehavior
 	@Override
 	protected void onEvent(final AjaxRequestTarget target)
 	{
-		getForm().getRootForm().onFormSubmitted(new IFormSubmitter()
+		getForm().getRootForm().onFormSubmitted(new IBeforeAndAfterFormSubmitter()
 		{
 			public Form<?> getForm()
 			{
@@ -176,23 +176,57 @@ public abstract class AjaxFormSubmitBehavior extends AjaxEventBehavior
 			{
 				AjaxFormSubmitBehavior.this.onError(target);
 			}
+
+			public void onSubmitBeforeForm()
+			{
+				AjaxFormSubmitBehavior.this.onSubmitBeforeForm(target);
+			}
+
+			public void onSubmitAfterForm()
+			{
+				AjaxFormSubmitBehavior.this.onSubmitAfterForm(target);
+			}
 		});
 	}
 
 	/**
+	 * Override this method to provide special submit handling in a multi-button form. This method
+	 * will be called <em>after</em> the form's onSubmit method.
+	 */
+	protected void onSubmitAfterForm(AjaxRequestTarget target)
+	{
+	}
+
+	/**
+	 * Override this method to provide special submit handling in a multi-button form. This method
+	 * will be called <em>before</em> the form's onSubmit method.
+	 */
+	protected void onSubmitBeforeForm(AjaxRequestTarget target)
+	{
+	}
+
+	/**
 	 * Listener method that is invoked after the form has been submitted and processed without
 	 * errors
 	 * 
 	 * @param target
+	 * @deprecated Will be removed in 6.0. Use {@link #onSubmitBeforeForm(AjaxRequestTarget)} and/or
+	 *             link #onSubmitAfterForm(AjaxRequestTarget)} instead.
 	 */
-	protected abstract void onSubmit(AjaxRequestTarget target);
+	@Deprecated
+	protected void onSubmit(AjaxRequestTarget target)
+	{
+	}
 
 	/**
-	 * Listener method invoked when the form has been processed and errors occurred
+	 * Listener method invoked when the form has been processed and errors occurred. This method is
+	 * called <em>before</em> {@link Form#onError()}.
 	 * 
 	 * @param target
 	 */
-	protected abstract void onError(AjaxRequestTarget target);
+	protected void onError(AjaxRequestTarget target)
+	{
+	}
 
 	/**
 	 * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#getPreconditionScript()

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxButton.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxButton.java b/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxButton.java
index c113db1..dcffebb 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxButton.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxButton.java
@@ -23,6 +23,7 @@ import org.apache.wicket.ajax.IAjaxCallDecorator;
 import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
 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.model.IModel;
 import org.apache.wicket.util.string.AppendingStringBuffer;
 import org.apache.wicket.util.string.Strings;
@@ -105,6 +106,26 @@ public abstract class AjaxButton extends Button
 
 			/**
 			 * 
+			 * @see org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget)
+			 */
+			@Override
+			protected void onSubmitBeforeForm(AjaxRequestTarget target)
+			{
+				AjaxButton.this.onSubmitBeforeForm(target, AjaxButton.this.getForm());
+			}
+
+			/**
+			 * 
+			 * @see org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget)
+			 */
+			@Override
+			protected void onSubmitAfterForm(AjaxRequestTarget target)
+			{
+				AjaxButton.this.onSubmitAfterForm(target, AjaxButton.this.getForm());
+			}
+
+			/**
+			 * 
 			 * @see org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onError(org.apache.wicket.ajax.AjaxRequestTarget)
 			 */
 			@Override
@@ -203,8 +224,32 @@ public abstract class AjaxButton extends Button
 	 * 
 	 * @param target
 	 * @param form
+	 * @deprecated see {@link IFormSubmitter#onSubmit()}
+	 */
+	@Deprecated
+	protected void onSubmit(AjaxRequestTarget target, Form<?> form)
+	{
+	}
+
+	/**
+	 * Listener method invoked on form submit with no errors
+	 * 
+	 * @param target
+	 * @param form
 	 */
-	protected abstract void onSubmit(AjaxRequestTarget target, Form<?> form);
+	protected void onSubmitBeforeForm(AjaxRequestTarget target, Form<?> form)
+	{
+	}
+
+	/**
+	 * Listener method invoked on form submit with no errors
+	 * 
+	 * @param target
+	 * @param form
+	 */
+	protected void onSubmitAfterForm(AjaxRequestTarget target, Form<?> form)
+	{
+	}
 
 	/**
 	 * Listener method invoked on form submit with errors
@@ -212,5 +257,7 @@ public abstract class AjaxButton extends Button
 	 * @param target
 	 * @param form
 	 */
-	protected abstract void onError(AjaxRequestTarget target, Form<?> form);
+	protected void onError(AjaxRequestTarget target, Form<?> form)
+	{
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxFallbackButton.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxFallbackButton.java b/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxFallbackButton.java
index 4a54fb8..e945f9a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxFallbackButton.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxFallbackButton.java
@@ -23,6 +23,7 @@ import org.apache.wicket.ajax.IAjaxCallDecorator;
 import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
 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.model.IModel;
 import org.apache.wicket.util.string.AppendingStringBuffer;
 
@@ -77,6 +78,19 @@ public abstract class AjaxFallbackButton extends Button
 			}
 
 			@Override
+			protected void onSubmitBeforeForm(AjaxRequestTarget target)
+			{
+				AjaxFallbackButton.this.onSubmitBeforeForm(target,
+					AjaxFallbackButton.this.getForm());
+			}
+
+			@Override
+			protected void onSubmitAfterForm(AjaxRequestTarget target)
+			{
+				AjaxFallbackButton.this.onSubmitAfterForm(target, AjaxFallbackButton.this.getForm());
+			}
+
+			@Override
 			protected void onError(AjaxRequestTarget target)
 			{
 				AjaxFallbackButton.this.onError(target, AjaxFallbackButton.this.getForm());
@@ -114,7 +128,9 @@ public abstract class AjaxFallbackButton extends Button
 	 * @param target
 	 * @param form
 	 */
-	protected abstract void onError(AjaxRequestTarget target, Form<?> form);
+	protected void onError(AjaxRequestTarget target, Form<?> form)
+	{
+	}
 
 	/**
 	 * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
@@ -129,6 +145,30 @@ public abstract class AjaxFallbackButton extends Button
 	}
 
 	/**
+	 * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
+	 */
+	@Override
+	public final void onSubmitBeforeForm()
+	{
+		if (AjaxRequestTarget.get() == null)
+		{
+			onSubmitBeforeForm(null, getForm());
+		}
+	}
+
+	/**
+	 * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
+	 */
+	@Override
+	public final void onSubmitAfterForm()
+	{
+		if (AjaxRequestTarget.get() == null)
+		{
+			onSubmitAfterForm(null, getForm());
+		}
+	}
+
+	/**
 	 * 
 	 * @see org.apache.wicket.markup.html.form.Button#getForm()
 	 */
@@ -145,8 +185,36 @@ public abstract class AjaxFallbackButton extends Button
 	 * @param target
 	 *            ajax target if this linked was invoked using ajax, null otherwise
 	 * @param form
+	 * @deprecated see {@link IFormSubmitter#onSubmit()}
+	 */
+	@Deprecated
+	protected void onSubmit(final AjaxRequestTarget target, final Form<?> form)
+	{
+	}
+
+	/**
+	 * Callback for the onClick event. If ajax failed and this event was generated via a normal
+	 * submission, the target argument will be null
+	 * 
+	 * @param target
+	 *            ajax target if this linked was invoked using ajax, null otherwise
+	 * @param form
 	 */
-	protected abstract void onSubmit(final AjaxRequestTarget target, final Form<?> form);
+	protected void onSubmitBeforeForm(final AjaxRequestTarget target, final Form<?> form)
+	{
+	}
+
+	/**
+	 * Callback for the onClick event. If ajax failed and this event was generated via a normal
+	 * submission, the target argument will be null
+	 * 
+	 * @param target
+	 *            ajax target if this linked was invoked using ajax, null otherwise
+	 * @param form
+	 */
+	protected void onSubmitAfterForm(final AjaxRequestTarget target, final Form<?> form)
+	{
+	}
 
 	/**
 	 * 

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxSubmitLink.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxSubmitLink.java b/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxSubmitLink.java
index 89993b1..2176b43 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxSubmitLink.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/markup/html/form/AjaxSubmitLink.java
@@ -22,6 +22,7 @@ import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.form.AbstractSubmitLink;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.IFormSubmitter;
 import org.apache.wicket.util.string.AppendingStringBuffer;
 
 /**
@@ -107,11 +108,39 @@ public abstract class AjaxSubmitLink extends AbstractSubmitLink
 			{
 				return AjaxSubmitLink.this.getDefaultFormProcessing();
 			}
+
+			@Override
+			protected void onSubmitAfterForm(AjaxRequestTarget target)
+			{
+				AjaxSubmitLink.this.onSubmitAfterForm(target, getForm());
+			}
+
+			@Override
+			protected void onSubmitBeforeForm(AjaxRequestTarget target)
+			{
+				AjaxSubmitLink.this.onSubmitBeforeForm(target, getForm());
+			}
 		});
 
 	}
 
 	/**
+	 * Override this method to provide special submit handling in a multi-button form. This method
+	 * will be called <em>before</em> the form's onSubmit method.
+	 */
+	protected void onSubmitBeforeForm(AjaxRequestTarget target, Form<?> form)
+	{
+	}
+
+	/**
+	 * Override this method to provide special submit handling in a multi-button form. This method
+	 * will be called <em>after</em> the form's onSubmit method.
+	 */
+	protected void onSubmitAfterForm(AjaxRequestTarget target, Form<?> form)
+	{
+	}
+
+	/**
 	 * Returns the {@link IAjaxCallDecorator} that will be used to modify the generated javascript.
 	 * This is the preferred way of changing the javascript in the onclick handler
 	 * 
@@ -162,19 +191,42 @@ public abstract class AjaxSubmitLink extends AbstractSubmitLink
 	}
 
 	/**
+	 * Use {@link #onSubmitAfterForm(AjaxRequestTarget, Form)} instead.
+	 */
+	public final void onSubmitAfterForm()
+	{
+	}
+
+	/**
+	 * Use {@link #onSubmitBeforeForm(AjaxRequestTarget, Form)} instead.
+	 */
+	public final void onSubmitBeforeForm()
+	{
+	}
+
+	/**
 	 * Listener method invoked on form submit
 	 * 
 	 * @param target
 	 * @param form
+	 * @deprecated This method will be removed in 6.0. Use
+	 *             {@link #onSubmitBeforeForm(AjaxRequestTarget, Form)} and/or
+	 *             {@link #onSubmitAfterForm(AjaxRequestTarget, Form)} instead. See
+	 *             {@link IFormSubmitter#onSubmit()}.
 	 */
-	protected abstract void onSubmit(AjaxRequestTarget target, Form<?> form);
+	@Deprecated
+	protected void onSubmit(AjaxRequestTarget target, Form<?> form)
+	{
+	}
 
 	/**
-	 * Listener method invoked on form submit with errors
+	 * Listener method invoked on form submit with errors. This method is called <em>before</em>
+	 * {@link Form#onError()}.
 	 * 
 	 * @param target
 	 * @param form
 	 */
-	protected abstract void onError(AjaxRequestTarget target, Form<?> form);
-
+	protected void onError(AjaxRequestTarget target, Form<?> form)
+	{
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/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 e13070c..c25c49f 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
@@ -25,10 +25,13 @@ import org.apache.wicket.model.IModel;
  * @author Matej Knopp
  * 
  */
-public abstract class AbstractSubmitLink extends AbstractLink implements IFormSubmittingComponent
+public abstract class AbstractSubmitLink extends AbstractLink
+	implements
+		IFormSubmittingComponent,
+		IBeforeAndAfterFormSubmitter
 {
 	/**
-	 * 
+	 *
 	 */
 	private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/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 7419563..0b01935 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
@@ -48,7 +48,11 @@ import org.apache.wicket.model.IModel;
  * @author Eelco Hillenius
  * 
  */
-public class Button extends FormComponent<String> implements IFormSubmittingComponent
+public class Button extends FormComponent<String>
+	implements
+		IFormSubmitter,
+		IFormSubmittingComponent,
+		IBeforeAndAfterFormSubmitter
 {
 	private static final long serialVersionUID = 1L;
 
@@ -104,7 +108,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
@@ -212,8 +216,13 @@ public class Button extends FormComponent<String> implements IFormSubmittingComp
 
 	/**
 	 * Override this method to provide special submit handling in a multi-button form. It is called
-	 * whenever the user clicks this particular button, except if validation fails.
+	 * whenever the user clicks this particular button, except if validation fails. This method will
+	 * be called <em>before</em> {@link Form#onSubmit()}.
+	 * 
+	 * @deprecated This method will be removed in 6.0. Use {@link #onSubmitBeforeForm()} and/or
+	 *             {@link #onSubmitAfterForm()} instead. See {@link IFormSubmitter#onSubmit()}.
 	 */
+	@Deprecated
 	public void onSubmit()
 	{
 	}
@@ -223,6 +232,23 @@ public class Button extends FormComponent<String> implements IFormSubmittingComp
 	 */
 	public void onError()
 	{
+	}
 
+	/**
+	 * Override this method to provide special submit handling in a multi-button form. It is called
+	 * whenever the user clicks this particular button, except if validation fails. This method will
+	 * be called <em>before</em> {@link Form#onSubmit()}.
+	 */
+	public void onSubmitBeforeForm()
+	{
+	}
+
+	/**
+	 * Override this method to provide special submit handling in a multi-button form. It is called
+	 * whenever the user clicks this particular button, except if validation fails. This method will
+	 * be called <em>after</em> {@link Form#onSubmit()}.
+	 */
+	public void onSubmitAfterForm()
+	{
 	}
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/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 8ad2571..c74fff7 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
@@ -1217,7 +1217,11 @@ public class Form<T> extends WebMarkupContainer implements IFormSubmitListener
 		if (submittingComponent != null)
 		{
 			// invoke submit on component
-			submittingComponent.onSubmit();
+			if (submittingComponent instanceof IBeforeAndAfterFormSubmitter)
+			{
+				((IBeforeAndAfterFormSubmitter)submittingComponent).onSubmitBeforeForm();
+			}
+			submittingComponent.onSubmit(); // remove this for 6.0
 		}
 
 		// invoke Form#onSubmit(..) going from innermost to outermost
@@ -1232,6 +1236,15 @@ public class Form<T> extends WebMarkupContainer implements IFormSubmitListener
 				}
 			}
 		}, new ClassVisitFilter(Form.class));
+
+
+		if (submittingComponent != null)
+		{
+			if (submittingComponent instanceof IBeforeAndAfterFormSubmitter)
+			{
+				((IBeforeAndAfterFormSubmitter)submittingComponent).onSubmitAfterForm();
+			}
+		}
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IBeforeAndAfterFormSubmitter.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IBeforeAndAfterFormSubmitter.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IBeforeAndAfterFormSubmitter.java
new file mode 100644
index 0000000..0c49c74
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IBeforeAndAfterFormSubmitter.java
@@ -0,0 +1,38 @@
+/*
+ * 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;
+
+/**
+ * Temporary interface to provide new methods for 1.5. Will be removed in 6.0, where these methods
+ * are in IFormSubmitter.
+ * 
+ * @author Carl-Eric Menzel
+ */
+public interface IBeforeAndAfterFormSubmitter extends IFormSubmitter
+{
+	/**
+	 * Override this method to provide special submit handling in a multi-button form. This method
+	 * will be called <em>before</em> the form's onSubmit method.
+	 */
+	void onSubmitBeforeForm();
+
+	/**
+	 * Override this method to provide special submit handling in a multi-button form. This method
+	 * will be called <em>after</em> the form's onSubmit method.
+	 */
+	void onSubmitAfterForm();
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/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..6460b01 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
@@ -43,13 +43,18 @@ public interface IFormSubmitter
 
 	/**
 	 * Override this method to provide special submit handling in a multi-button form. It is called
-	 * whenever the user clicks this particular button.
+	 * whenever the user clicks this particular button, <em>before</em> {@link Form#onSubmit()}.
+	 * 
+	 * @deprecated Use {@link IBeforeAndAfterFormSubmitter#onSubmitAfterForm()} and/or
+	 *             {@link IBeforeAndAfterFormSubmitter#onSubmitBeforeForm()} instead. This method
+	 *             will be removed in 6.0.
 	 */
+	@Deprecated
 	void onSubmit();
 
 	/**
 	 * Method that is invoked when form processing fails; for example, when there are validation
-	 * errors.
+	 * errors. This method will be called <em>before</em> {@link Form#onError()}.
 	 */
 	void onError();
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java
index 6be64fe..db69f28 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java
@@ -45,7 +45,7 @@ import org.apache.wicket.model.IModel;
  *                                 + mod.getValue1());
  *           };
  *      });
- *          
+ * 
  *      &lt;form wicket:id=&quot;linkForm&quot; &gt;
  *          &lt;input wicket:id=&quot;value1&quot; type=&quot;text&quot; size=&quot;30&quot;/&gt;
  *          &lt;a wicket:id=&quot;link1&quot;&gt;Press link1 to submit&lt;/a&gt;
@@ -225,8 +225,10 @@ public class SubmitLink extends AbstractSubmitLink
 	}
 
 	/**
+	 * @deprecated
 	 * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onSubmit()
 	 */
+	@Deprecated
 	public void onSubmit()
 	{
 	}
@@ -238,4 +240,19 @@ public class SubmitLink extends AbstractSubmitLink
 	{
 	}
 
-}
\ No newline at end of file
+	/**
+	 * Override this method to provide special submit handling in a multi-button form. This method
+	 * will be called <em>after</em> the form's onSubmit method.
+	 */
+	public void onSubmitAfterForm()
+	{
+	}
+
+	/**
+	 * Override this method to provide special submit handling in a multi-button form. This method
+	 * will be called <em>before</em> the form's onSubmit method.
+	 */
+	public void onSubmitBeforeForm()
+	{
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/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..518b266
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest$TestPage.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<form wicket:id="form">
+<input type="submit" wicket:id="button"/>
+</form>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/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..23fd812
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormSubmitOrderTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.junit.Test;
+
+public class FormSubmitOrderTest extends WicketTestCase
+{
+	public static class TestPage extends WebPage
+	{
+		String result = "";
+
+		public TestPage()
+		{
+			Form form = new Form("form")
+			{
+				@Override
+				protected void onSubmit()
+				{
+					super.onSubmit();
+					result += "form";
+				}
+			};
+			this.add(form);
+			form.add(new Button("button")
+			{
+				@Override
+				public void onSubmitBeforeForm()
+				{
+					super.onSubmit();
+					result += "before";
+				}
+
+				@Override
+				public void onSubmitAfterForm()
+				{
+					super.onSubmit();
+					result += "after";
+				}
+			});
+		}
+	}
+
+	@Test
+	public void submitOrder() throws Exception
+	{
+		TestPage page = tester.startPage(TestPage.class);
+		tester.newFormTester("form").submit("button");
+		assertEquals("beforeformafter", page.result);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/HomePage.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/HomePage.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/HomePage.java
index 406b3a9..9f8c4ed 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/HomePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/HomePage.java
@@ -16,6 +16,8 @@
  */
 package org.apache.wicket.markup.html.form.submitlink;
 
+import static junit.framework.Assert.*;
+
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.SubmitLink;
@@ -27,10 +29,12 @@ import org.apache.wicket.model.PropertyModel;
 public class HomePage extends WebPage
 {
 	boolean submitted = false;
-	boolean submittedViaLink = false;
+	boolean submittedViaLinkDeprecated = false;
+	boolean submittedViaLinkBefore = false;
+	boolean submittedViaLinkAfter = false;
 	String text;
 	/**
-	 * 
+	 *
 	 */
 	private static final long serialVersionUID = 1L;
 
@@ -43,7 +47,7 @@ public class HomePage extends WebPage
 		Form<Void> form = new Form<Void>("form")
 		{
 			/**
-			 * 
+			 *
 			 */
 			private static final long serialVersionUID = 1L;
 
@@ -58,14 +62,32 @@ public class HomePage extends WebPage
 		{
 
 			/**
-			 * 
+			 *
 			 */
 			private static final long serialVersionUID = 1L;
 
 			@Override
+			public void onSubmitBeforeForm()
+			{
+				submittedViaLinkBefore = true;
+				assertFalse("before must be the first!", submittedViaLinkAfter);
+				assertFalse("before must be the first!", submittedViaLinkDeprecated);
+			}
+
+			@Override
 			public void onSubmit()
 			{
-				submittedViaLink = true;
+				assertTrue("before must have been called!", submittedViaLinkBefore);
+				submittedViaLinkDeprecated = true;
+				assertFalse("after must not yet have been called", submittedViaLinkAfter);
+			}
+
+			@Override
+			public void onSubmitAfterForm()
+			{
+				assertTrue("before must have been called!", submittedViaLinkBefore);
+				assertTrue("onsubmit must have been called!", submittedViaLinkDeprecated);
+				submittedViaLinkAfter = true;
 			}
 
 		});
@@ -102,6 +124,16 @@ public class HomePage extends WebPage
 	 */
 	public boolean isSubmittedViaLink()
 	{
-		return submittedViaLink;
+		return submittedViaLinkDeprecated;
+	}
+
+	boolean isSubmittedViaLinkBefore()
+	{
+		return submittedViaLinkBefore;
+	}
+
+	boolean isSubmittedViaLinkAfter()
+	{
+		return submittedViaLinkAfter;
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/e0286bad/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/TestHomePage.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/TestHomePage.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/TestHomePage.java
index 9a2308c..c2b5639 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/TestHomePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/submitlink/TestHomePage.java
@@ -36,6 +36,11 @@ public class TestHomePage extends WicketTestCase
 		assertEquals("Hello", home.getText());
 		assertTrue("Form.onSubmit() has not been called!", home.isSubmitted());
 		assertTrue("SubmitLink.onSubmit() has not been called!", home.isSubmittedViaLink());
+		assertTrue("SubmitLink.onSubmitBeforeForm() has not been called!",
+			home.isSubmittedViaLinkBefore());
+		assertTrue("SubmitLink.onSubmitAfterForm() has not been called!",
+			home.isSubmittedViaLinkAfter());
+
 	}
 
 	/**
@@ -53,6 +58,10 @@ public class TestHomePage extends WicketTestCase
 		assertEquals("Hello", home.getText());
 		assertTrue("Form.onSubmit() has not been called!", home.isSubmitted());
 		assertTrue("SubmitLink.onSubmit() has not been called!", home.isSubmittedViaLink());
+		assertTrue("SubmitLink.onSubmitBeforeForm() has not been called!",
+			home.isSubmittedViaLinkBefore());
+		assertTrue("SubmitLink.onSubmitAfterForm() has not been called!",
+			home.isSubmittedViaLinkAfter());
 	}
 
 	/**
@@ -69,6 +78,10 @@ public class TestHomePage extends WicketTestCase
 		assertEquals("Hello", home.getText());
 		assertTrue("Form.onSubmit() has not been called!", home.isSubmitted());
 		assertTrue("SubmitLink.onSubmit() has not been called!", home.isSubmittedViaLink());
+		assertTrue("SubmitLink.onSubmitBeforeForm() has not been called!",
+			home.isSubmittedViaLinkBefore());
+		assertTrue("SubmitLink.onSubmitAfterForm() has not been called!",
+			home.isSubmittedViaLinkAfter());
 	}
 
 }