Repository: tapestry-5 Updated Branches: refs/heads/master b20ed0fae -> 8230b6290
TAP5-1760: coerce the Radio value to the correct type if it doesn't match the RadioGroup's value's type Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/8230b629 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/8230b629 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/8230b629 Branch: refs/heads/master Commit: 8230b6290a0a7b40d58bbf96ad689f682ee0c4d3 Parents: b20ed0f Author: Jochen Kemnade <[email protected]> Authored: Mon Aug 10 12:05:12 2015 +0200 Committer: Jochen Kemnade <[email protected]> Committed: Mon Aug 10 12:05:12 2015 +0200 ---------------------------------------------------------------------- .../corelib/components/RadioGroup.java | 27 +++++++++++++++----- tapestry-core/src/test/app1/RadioDemo.tml | 13 ++++++++++ .../integration/app1/pages/RadioDemo.java | 5 ++++ 3 files changed, 38 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/8230b629/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RadioGroup.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RadioGroup.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RadioGroup.java index c7c2d06..cd594c1 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RadioGroup.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RadioGroup.java @@ -20,6 +20,7 @@ import org.apache.tapestry5.annotations.Events; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.internal.TapestryInternalUtils; import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.ioc.services.TypeCoercer; import org.apache.tapestry5.services.ComponentDefaultProvider; import org.apache.tapestry5.services.Environment; import org.apache.tapestry5.services.FormSupport; @@ -28,7 +29,7 @@ import org.apache.tapestry5.services.Request; /** * A wrapper component around some number of {@link Radio} components, used to organize the selection and define the * property to be edited. Examples of its use are in the {@link Radio} documentation. - * + * * @tapestrydoc */ @Events(EventConstants.VALIDATE) @@ -68,7 +69,7 @@ public class RadioGroup implements Field * selected Radio componnent's "value" parameter) into unique client-side * strings (typically IDs) and back. Note: this parameter may be OMITTED if * Tapestry is configured to provide a ValueEncoder automatically for the - * type of property bound to the "value" parameter. + * type of property bound to the "value" parameter. */ @Parameter(required = true, allowNull = false) private ValueEncoder encoder; @@ -96,6 +97,9 @@ public class RadioGroup implements Field @Inject private Request request; + @Inject + private TypeCoercer typeCoercer; + @Environmental private ValidationTracker tracker; @@ -195,6 +199,8 @@ public class RadioGroup implements Field final String selectedValue = submittedValue != null ? submittedValue : encoder.toClient(value); + final Class<?> boundType = resources.getBoundType("value"); + environment.push(RadioContainer.class, new RadioContainer() { public String getControlName() @@ -207,17 +213,24 @@ public class RadioGroup implements Field return disabled; } + private Object getObjectAsCorrectType(Object val) + { + if (val != null && boundType != null && !boundType.isAssignableFrom(val.getClass())) + { + return typeCoercer.coerce(val, boundType); + } + return val; + } + @SuppressWarnings("unchecked") public String toClient(Object value) { - // TODO: Ensure that value is of the expected type? - - return encoder.toClient(value); + return encoder.toClient(getObjectAsCorrectType(value)); } public boolean isSelected(Object value) { - return TapestryInternalUtils.isEqual(encoder.toClient(value), selectedValue); + return TapestryInternalUtils.isEqual(encoder.toClient(getObjectAsCorrectType(value)), selectedValue); } }); @@ -251,7 +264,7 @@ public class RadioGroup implements Field * Returns null; the radio group does not render as a tag and so doesn't have an id to share. RadioGroup implements * {@link org.apache.tapestry5.Field} only so it can interact with the * {@link org.apache.tapestry5.ValidationTracker}. - * + * * @return null */ public String getClientId() http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/8230b629/tapestry-core/src/test/app1/RadioDemo.tml ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/app1/RadioDemo.tml b/tapestry-core/src/test/app1/RadioDemo.tml index 5ffe75e..f0a936f 100644 --- a/tapestry-core/src/test/app1/RadioDemo.tml +++ b/tapestry-core/src/test/app1/RadioDemo.tml @@ -40,6 +40,19 @@ </div> </div> </t:radiogroup> + + <!-- see TAP5-1760 --> + <t:radiogroup t:id="department2" t:validate="required"> + <div class="well"> + <div class="radio"> + <label> + <t:radio t:id="radio3" value="literal:ACCOUNTING"/> + Accounting + </label> + </div> + </div> + + </t:radiogroup> <input class="btn btn-primary" type="submit" value="Update"/> <t:actionlink class="btn btn-default" t:id="reset">reset</t:actionlink> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/8230b629/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RadioDemo.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RadioDemo.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RadioDemo.java index ecdeffe..58bfa60 100644 --- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RadioDemo.java +++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RadioDemo.java @@ -16,6 +16,7 @@ package org.apache.tapestry5.integration.app1.pages; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.integration.app1.data.Department; import org.apache.tapestry5.internal.TapestryInternalUtils; import org.apache.tapestry5.ioc.Messages; @@ -25,6 +26,10 @@ public class RadioDemo { @Persist private Department department; + + @Persist + @Property + private Department department2; @Persist private String position;
