WICKET-6541 small improvements and extended tests - use covariant for DynamicWizardModel#getActiveStep - deprecated IDefaultButtonProvider, ButtonBar can take care of default button itself - stepIterator() should not return steps with failing condition - some lambda for conditions
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8068357f Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8068357f Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8068357f Branch: refs/heads/master Commit: 8068357f3d8bbf8b1b8946599a98924757ba29d0 Parents: f5b2ea2 Author: Sven Meier <svenme...@apache.org> Authored: Fri Mar 2 11:12:24 2018 +0100 Committer: Sven Meier <svenme...@apache.org> Committed: Tue Apr 10 22:00:54 2018 +0200 ---------------------------------------------------------------------- .../wizard/IDefaultButtonProvider.java | 1 + .../apache/wicket/extensions/wizard/Wizard.java | 13 ---- .../extensions/wizard/WizardButtonBar.java | 59 +++++++++------ .../wicket/extensions/wizard/WizardModel.java | 31 ++++---- .../wizard/dynamic/DynamicWizardModel.java | 2 +- .../extensions/wizard/WizardModelTest.java | 53 +++++++++++++ .../wizard/dynamic/DynamicWizardModelTest.java | 78 ++++++++++++++++++++ 7 files changed, 182 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/8068357f/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/IDefaultButtonProvider.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/IDefaultButtonProvider.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/IDefaultButtonProvider.java index fabe302..e4bcf89 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/IDefaultButtonProvider.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/IDefaultButtonProvider.java @@ -32,6 +32,7 @@ import org.apache.wicket.markup.html.form.IFormSubmittingComponent; * * @author eelcohillenius */ +@Deprecated public interface IDefaultButtonProvider { /** http://git-wip-us.apache.org/repos/asf/wicket/blob/8068357f/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/Wizard.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/Wizard.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/Wizard.java index 307c2e2..dc14214 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/Wizard.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/Wizard.java @@ -20,7 +20,6 @@ import org.apache.wicket.Component; import org.apache.wicket.feedback.ContainerFeedbackMessageFilter; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.IFormSubmittingComponent; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; @@ -257,18 +256,6 @@ public class Wizard extends Panel implements IWizardModelListener, IWizard return new Form<>(id); } - @Override - protected void onBeforeRender() - { - super.onBeforeRender(); - Component buttonBar = form.get(BUTTONS_ID); - if (buttonBar instanceof IDefaultButtonProvider) - { - IFormSubmittingComponent defaultButton = ((IDefaultButtonProvider)buttonBar).getDefaultButton(wizardModel); - form.setDefaultButton(defaultButton); - } - } - /** * Create a new overview bar. Clients can override this method to provide a custom bar. * http://git-wip-us.apache.org/repos/asf/wicket/blob/8068357f/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardButtonBar.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardButtonBar.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardButtonBar.java index b4362d4..4bd54ef 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardButtonBar.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardButtonBar.java @@ -16,7 +16,7 @@ */ package org.apache.wicket.extensions.wizard; -import org.apache.wicket.markup.html.form.IFormSubmittingComponent; +import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.panel.Panel; /** @@ -31,7 +31,7 @@ import org.apache.wicket.markup.html.panel.Panel; * * @author Eelco Hillenius */ -public class WizardButtonBar extends Panel implements IDefaultButtonProvider +public class WizardButtonBar extends Panel { private static final long serialVersionUID = 1L; @@ -64,83 +64,96 @@ public class WizardButtonBar extends Panel implements IDefaultButtonProvider add(newFinishButton("finish", wizard)); } + @Override + protected void onBeforeRender() + { + super.onBeforeRender(); + + WizardButton button = getDefaultButton(wizard.getWizardModel()); + if (button != null) { + Form<?> form = button.getForm(); + if (form != null) { + form.setDefaultButton(button); + } + } + } + /** * @see org.apache.wicket.extensions.wizard.IDefaultButtonProvider#getDefaultButton(org.apache.wicket.extensions.wizard.IWizardModel) */ - @Override - public IFormSubmittingComponent getDefaultButton(final IWizardModel model) + public WizardButton getDefaultButton(final IWizardModel model) { if (model.isNextAvailable()) { - return (IFormSubmittingComponent)get("next"); + return (WizardButton)get("next"); } else if (model.isLastAvailable()) { - return (IFormSubmittingComponent)get("last"); + return (WizardButton)get("last"); } else if (model.isLastStep(model.getActiveStep())) { - return (IFormSubmittingComponent)get("finish"); + return (WizardButton)get("finish"); } return null; } /** - * Creates a new {@link PreviousButton} + * Creates a new button for {@link IWizardModel#previous()}. * - * @param id the button's markup-id + * @param id the button's id * @param wizard the {@link IWizard} * @return a new {@code PreviousButton} */ - protected PreviousButton newPreviousButton(final String id, final IWizard wizard) + protected WizardButton newPreviousButton(final String id, final IWizard wizard) { return new PreviousButton(id, wizard); } /** - * Creates a new {@link NextButton} + * Creates a new button for {@link IWizardModel#next()}. * - * @param id the button's markup-id + * @param id the button's id * @param wizard the {@link IWizard} * @return a new {@code NextButton} */ - protected NextButton newNextButton(final String id, final IWizard wizard) + protected WizardButton newNextButton(final String id, final IWizard wizard) { return new NextButton(id, wizard); } /** - * Creates a new {@link LastButton} + * Creates a new button for {@link IWizardModel#last()}. * - * @param id the button's markup-id + * @param id the button's id * @param wizard the {@link IWizard} * @return a new {@code LastButton} */ - protected LastButton newLastButton(final String id, final IWizard wizard) + protected WizardButton newLastButton(final String id, final IWizard wizard) { return new LastButton(id, wizard); } /** - * Creates a new {@link CancelButton} + * Creates a new button for {@link IWizardModel#cancel()}. * - * @param id the button's markup-id + * @param id the button's id * @param wizard the {@link IWizard} * @return a new {@code CancelButton} */ - protected CancelButton newCancelButton(final String id, final IWizard wizard) + protected WizardButton newCancelButton(final String id, final IWizard wizard) { return new CancelButton(id, wizard); } /** - * Creates a new {@link FinishButton} + * Creates a new button for {@link IWizardModel#finish()}. * - * @param id the button's markup-id + * @param id the button's id * @param wizard the {@link IWizard} - * @return a new {@code FinishButton} + * @return a new button */ - protected FinishButton newFinishButton(final String id, final IWizard wizard) + protected WizardButton newFinishButton(final String id, final IWizard wizard) { return new FinishButton(id, wizard); } http://git-wip-us.apache.org/repos/asf/wicket/blob/8068357f/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardModel.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardModel.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardModel.java index fd88683..8b28dac 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardModel.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/WizardModel.java @@ -21,8 +21,8 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import org.apache.wicket.util.io.IClusterable; import org.apache.wicket.util.collections.ArrayListStack; +import org.apache.wicket.util.io.IClusterable; /** @@ -47,6 +47,7 @@ public class WizardModel extends AbstractWizardModel /** * Interface for conditional displaying of wizard steps. */ + @FunctionalInterface public interface ICondition extends IClusterable { /** @@ -61,21 +62,7 @@ public class WizardModel extends AbstractWizardModel /** * Condition that always evaluates true. */ - public static final ICondition TRUE = new ICondition() - { - private static final long serialVersionUID = 1L; - - /** - * Always returns true. - * - * @return True - */ - @Override - public boolean evaluate() - { - return true; - } - }; + public static final ICondition TRUE = (() -> true); private static final long serialVersionUID = 1L; @@ -258,9 +245,17 @@ public class WizardModel extends AbstractWizardModel * @see IWizardModel#stepIterator() */ @Override - public final Iterator<IWizardStep> stepIterator() + public Iterator<IWizardStep> stepIterator() { - return steps.iterator(); + List<IWizardStep> filtered = new ArrayList<>(); + + for (int s = 0; s < steps.size(); s++) { + if (conditions.get(s).evaluate()) { + filtered.add(steps.get(s)); + } + } + + return filtered.iterator(); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/8068357f/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModel.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModel.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModel.java index 25e9ad9..61a671f 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModel.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModel.java @@ -58,7 +58,7 @@ public class DynamicWizardModel extends AbstractWizardModel * @see org.apache.wicket.extensions.wizard.IWizardModel#getActiveStep() */ @Override - public IWizardStep getActiveStep() + public IDynamicWizardStep getActiveStep() { return activeStep; } http://git-wip-us.apache.org/repos/asf/wicket/blob/8068357f/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/WizardModelTest.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/WizardModelTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/WizardModelTest.java index 661078a..a350031 100644 --- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/WizardModelTest.java +++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/WizardModelTest.java @@ -18,6 +18,7 @@ package org.apache.wicket.extensions.wizard; import java.util.Iterator; +import org.apache.wicket.extensions.wizard.WizardModel.ICondition; import org.apache.wicket.util.tester.WicketTestCase; import org.junit.Test; @@ -48,4 +49,56 @@ public class WizardModelTest extends WicketTestCase assertEquals(model, step.getWizardModel()); } } + + @Test + public void testWizard() + { + WizardModel model = new WizardModel(); + + WizardStep step1 = new WizardStep(); + model.add(step1); + + WizardStep step2 = new WizardStep(); + model.add(step2, () -> false); + + class ConditionWizadStep extends WizardStep implements ICondition { + + @Override + public boolean evaluate() + { + return false; + } + + }; + WizardStep step3 = new ConditionWizadStep(); + model.add(step3); + + WizardStep step4 = new WizardStep(); + model.add(step4); + + model.reset(); + + Iterator<IWizardStep> iterator = model.stepIterator(); + assertTrue(iterator.hasNext()); + iterator.next(); + assertTrue(iterator.hasNext()); + iterator.next(); + assertFalse(iterator.hasNext()); + try { + iterator.next(); + fail(); + } catch (Exception expected) { + } + + assertSame(step1, model.getActiveStep()); + assertTrue(model.isNextAvailable()); + model.next(); + assertSame(step4, model.getActiveStep()); + assertFalse(model.isNextAvailable()); + try { + model.next(); + fail(); + } catch (Exception expected) { + } + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/8068357f/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModelTest.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModelTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModelTest.java new file mode 100644 index 0000000..c5c15b4 --- /dev/null +++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/wizard/dynamic/DynamicWizardModelTest.java @@ -0,0 +1,78 @@ +/* + * 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.extensions.wizard.dynamic; + +import org.apache.wicket.util.tester.WicketTestCase; +import org.junit.Test; + +/** + * Test for {@link DynamicWizardModel}. + */ +public class DynamicWizardModelTest extends WicketTestCase +{ + + private IDynamicWizardStep step4; + + @Test + public void testDynamicWizard() + { + DynamicWizardStep step1 = new DynamicWizardStep(null) + { + @Override + public boolean isLastStep() + { + return false; + } + + @Override + public IDynamicWizardStep next() + { + return step4; + } + }; + + step4 = new DynamicWizardStep(step1) + { + @Override + public boolean isLastStep() + { + return true; + } + + @Override + public IDynamicWizardStep next() + { + return null; + } + }; + + DynamicWizardModel model = new DynamicWizardModel(step1); + + model.reset(); + + assertSame(step1, model.getActiveStep()); + assertTrue(model.isNextAvailable()); + model.next(); + assertSame(step4, model.getActiveStep()); + assertFalse(model.isNextAvailable()); + try { + model.next(); + fail(); + } catch (Exception expected) { + } + } +}