Repository: tapestry-5 Updated Branches: refs/heads/master 18ea65471 -> b72b0e100
TAP5-2490: the context values are encoded using the encoder, so we also need to use it to decode them Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/b72b0e10 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/b72b0e10 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/b72b0e10 Branch: refs/heads/master Commit: b72b0e100e72c482294f418919f6f4aa7f57c6d3 Parents: 18ea654 Author: Jochen Kemnade <[email protected]> Authored: Thu Nov 5 16:06:47 2015 +0100 Committer: Jochen Kemnade <[email protected]> Committed: Thu Nov 5 16:06:47 2015 +0100 ---------------------------------------------------------------------- .../tapestry5/corelib/components/Select.java | 7 +- tapestry-core/src/test/app1/SelectDemo.tml | 17 +++- .../tapestry5/integration/app1/FormTests.java | 12 +++ .../integration/app1/pages/SelectDemo.java | 89 ++++++++++++++++++++ 4 files changed, 121 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b72b0e10/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java index 3f5a7f4..993c3a8 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java @@ -20,6 +20,7 @@ import org.apache.tapestry5.corelib.data.SecureOption; import org.apache.tapestry5.corelib.mixins.RenderDisabled; import org.apache.tapestry5.internal.InternalComponentResources; import org.apache.tapestry5.internal.TapestryInternalUtils; +import org.apache.tapestry5.internal.services.ArrayEventContext; import org.apache.tapestry5.internal.util.CaptureResultCallback; import org.apache.tapestry5.internal.util.SelectModelRenderer; import org.apache.tapestry5.ioc.Messages; @@ -263,7 +264,7 @@ public class Select extends AbstractField } } - Object onChange(final List<Object> context, + Object onChange(final EventContext context, @RequestParameter(value = "t:selectvalue", allowBlank = true) final String selectValue) throws ValidationException { @@ -271,11 +272,11 @@ public class Select extends AbstractField CaptureResultCallback<Object> callback = new CaptureResultCallback<Object>(); - Object[] newContext = new Object[context.size() + 1]; + Object[] newContext = new Object[context.getCount() + 1]; newContext[0] = newValue; for (int i = 1; i < newContext.length; i++) { - newContext[i] = context.get(i - 1); + newContext[i] = encoder.toValue(context.get(String.class, i - 1)); } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b72b0e10/tapestry-core/src/test/app1/SelectDemo.tml ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/app1/SelectDemo.tml b/tapestry-core/src/test/app1/SelectDemo.tml index 60a27d4..9e528a0 100644 --- a/tapestry-core/src/test/app1/SelectDemo.tml +++ b/tapestry-core/src/test/app1/SelectDemo.tml @@ -8,7 +8,6 @@ : <t:select t:id="color" validate="required" blankOption="always" model="literal:Red,Green,Blue" /> - </p> <p> <t:label for="month" /> @@ -24,5 +23,21 @@ <p> Selected color: ${color}</p> <p> Selected month: ${month}</p> + + <t:zone> + <t:form> + + <p> + <t:label for="number" /> + : + <t:select t:id="number" zone="^" + model="numbermodel" context="numbercontext" encoder="numberencoder" /> + </p> + + </t:form> + + <p> Selected number: ${number}</p> + <p> Selected number context: ${selectedNumberContext}</p> + </t:zone> </t:border> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b72b0e10/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java index 85a3690..553342d 100644 --- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java +++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java @@ -1264,4 +1264,16 @@ public class FormTests extends App1TestCase assertTextPresent("Selected month: August"); } + + @Test + // TAP5-2490 + public void select_with_url_encoded_context() throws Exception + { + openLinks("Select Demo"); + + select("number", "label=2"); + + assertTextPresent("Selected number: 2"); + assertTextPresent("Selected number context: 23"); + } } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b72b0e10/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java index 00c5219..dad93f0 100644 --- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java +++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java @@ -13,6 +13,8 @@ // limitations under the License. package org.apache.tapestry5.integration.app1.pages; +import java.util.List; + import org.apache.tapestry5.PersistenceConstants; import org.apache.tapestry5.SelectModel; import org.apache.tapestry5.annotations.Persist; @@ -20,6 +22,15 @@ import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.internal.OptionModelImpl; import org.apache.tapestry5.internal.SelectModelImpl; +import org.apache.tapestry5.EventConstants; +import org.apache.tapestry5.ValueEncoder; +import org.apache.tapestry5.annotations.InjectComponent; +import org.apache.tapestry5.annotations.OnEvent; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.corelib.components.Zone; +import org.apache.tapestry5.ioc.internal.util.CollectionFactory; + public class SelectDemo { @@ -30,6 +41,11 @@ public class SelectDemo @Property @Persist private String month; + + @Property + @Persist + private NumberContainer number; + @Property @Persist(PersistenceConstants.FLASH) @@ -53,4 +69,77 @@ public class SelectDemo ); } + + @Property + @Persist + private NumberContainer selectedNumberContext; + + @InjectComponent + private Zone zone; + + public List<NumberContainer> getNumberModel(){ + return CollectionFactory.newList(new NumberContainer(1), new NumberContainer(2)); + } + + public ValueEncoder<NumberContainer> getNumberEncoder(){ + return new ValueEncoder<NumberContainer>() { + + @Override + public String toClient(NumberContainer value) { + return Integer.toString(value.number); + } + + @Override + public NumberContainer toValue(String clientValue) { + return new NumberContainer(Integer.parseInt(clientValue)); + } + }; + } + + public NumberContainer getNumberContext(){ + return new NumberContainer(23); + } + + @OnEvent(value=EventConstants.VALUE_CHANGED, component="number") + Object onValueChangedFromNumber(NumberContainer number, NumberContainer context){ + selectedNumberContext = context; + return zone.getBody(); + } + + public static final class NumberContainer { + + public NumberContainer(int number) { + this.number = number; + } + + public final int number; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + number; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NumberContainer other = (NumberContainer) obj; + if (number != other.number) + return false; + return true; + } + + @Override + public String toString() { + return Integer.toString(number); + } + + } }
