You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by re...@apache.org on 2026/09/23 16:09:37 UTC

(wicket) 02/02: Validate the number in the editable label example

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

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

commit 6550afd842ff15dc807dce8f549f87dbeb4523b1
Author: reiern70 <re...@gmail.com>
AuthorDate: Wed Sep 16 14:36:49 2026 -0500

    Validate the number in the editable label example
    
    Integer.parseInt threw a NumberFormatException, which Wicket does not
    treat as a conversion error, so invalid input failed the request. The
    converter now throws a ConversionException, the field is required, and
    errors are shown in a feedback panel.
---
 .../examples/ajax/builtin/EditableLabelPage.html   |  1 +
 .../examples/ajax/builtin/EditableLabelPage.java   | 46 ++++++++++++--
 .../ajax/builtin/EditableLabelPageTest.java        | 71 ++++++++++++++++++++++
 3 files changed, 112 insertions(+), 6 deletions(-)

diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.html
index 86913e89c6..2c17aa79e2 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.html
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <wicket:extend xmlns:wicket="http://wicket.apache.org">
 <form wicket:id="form">
+<div wicket:id="feedback"></div>
 
 <p>
 Click on the area with a green outline to begin an inplace edit. Press enter or outside the area to save, pless esc to cancel.
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.java
index fbfaccb5b5..ed30543a90 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.java
@@ -20,13 +20,16 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableChoiceLabel;
 import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel;
 import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableMultiLineLabel;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
 
@@ -62,18 +65,34 @@ public class EditableLabelPage extends BasePage
 		form.add(new AjaxEditableMultiLineLabel("text3"));
 		form.add(new AjaxEditableChoiceLabel<>("site", SITES));
 		
-		form.add(new AjaxEditableLabel<Integer>("number") {
+		final FeedbackPanel feedback = new FeedbackPanel("feedback");
+		feedback.setOutputMarkupId(true);
+		form.add(feedback);
+
+		AjaxEditableLabel<Integer> numberLabel = new AjaxEditableLabel<Integer>("number")
+		{
 			@Override
 			protected IConverter<?> createConverter(Class<?> type)
 			{
-				return new IConverter<Integer>() {
+				return new IConverter<Integer>()
+				{
 					@Override
 					public Integer convertToObject(String value, Locale locale)
 						throws ConversionException
 					{
-						return Integer.parseInt(value);
+						try
+						{
+							return Integer.parseInt(value);
+						}
+						catch (NumberFormatException e)
+						{
+							throw new ConversionException(e).setSourceValue(value)
+								.setTargetType(Integer.class)
+								.setConverter(this)
+								.setLocale(locale);
+						}
 					}
-					
+
 					@Override
 					public String convertToString(Integer value, Locale locale)
 					{
@@ -81,8 +100,23 @@ public class EditableLabelPage extends BasePage
 					}
 				};
 			}
-		});
-		
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target)
+			{
+				super.onSubmit(target);
+				target.add(feedback);
+			}
+
+			@Override
+			protected void onError(AjaxRequestTarget target)
+			{
+				super.onError(target);
+				target.add(feedback);
+			}
+		};
+		form.add(numberLabel);
+		numberLabel.setType(Integer.class).setRequired(true).setLabel(Model.of("Number"));
 
 		form.add(new Label("refresh-counter", () -> "" + refreshCounter));
 
diff --git a/wicket-examples/src/test/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPageTest.java b/wicket-examples/src/test/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPageTest.java
new file mode 100644
index 0000000000..fd55e467f3
--- /dev/null
+++ b/wicket-examples/src/test/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPageTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.examples.ajax.builtin;
+
+import org.apache.wicket.behavior.AbstractAjaxBehavior;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests the number editor of {@link EditableLabelPage}.
+ */
+class EditableLabelPageTest extends WicketTestCase
+{
+	@Test
+	void rejectsANumberThatIsNotAnInteger()
+	{
+		saveNumber("abc");
+
+		tester.assertErrorMessages("The value of 'Number' is not a valid Integer.");
+		tester.assertVisible("form:number:editor");
+		tester.assertComponentOnAjaxResponse("form:feedback");
+	}
+
+	@Test
+	void rejectsAnEmptyNumber()
+	{
+		saveNumber("");
+
+		tester.assertErrorMessages("'Number' is required.");
+		tester.assertVisible("form:number:editor");
+	}
+
+	@Test
+	void acceptsAnInteger()
+	{
+		saveNumber("7");
+
+		tester.assertNoErrorMessage();
+		tester.assertInvisible("form:number:editor");
+		tester.assertLabel("form:number:label", "0000000007");
+	}
+
+	private void saveNumber(String value)
+	{
+		tester.startPage(EditableLabelPage.class);
+		tester.executeAjaxEvent("form:number:label", "click");
+
+		FormComponent<?> editor = (FormComponent<?>)tester
+			.getComponentFromLastRenderedPage("form:number:editor");
+		tester.getRequest().setParameter(editor.getInputName(), value);
+		tester.getRequest().setParameter("save", "true");
+		tester.getRequest().setMethod(Form.METHOD_GET);
+		tester.executeBehavior((AbstractAjaxBehavior)editor.getBehaviorById(0));
+	}
+}