Repository: tapestry-5 Updated Branches: refs/heads/master d9a795f1a -> 7a2f98c8e
TAP5-1290: Add required flag to @ActivationRequestParameter annotation Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/7a2f98c8 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/7a2f98c8 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/7a2f98c8 Branch: refs/heads/master Commit: 7a2f98c8edb9c0ab90b664e38ab82d420e0f446c Parents: d9a795f Author: Howard M. Lewis Ship <hls...@apache.org> Authored: Mon Jun 30 14:08:51 2014 -0700 Committer: Howard M. Lewis Ship <hls...@apache.org> Committed: Mon Jun 30 14:09:03 2014 -0700 ---------------------------------------------------------------------- .../annotations/ActivationRequestParameter.java | 12 ++++++++---- .../transform/ActivationRequestParameterWorker.java | 16 ++++++++++++---- .../app1/ActivationRequestParameterTests.groovy | 11 +++++++++-- .../tapestry5/integration/app1/pages/Index.java | 2 ++ .../integration/app1/pages/MissingRequiredARP.java | 9 +++++++++ 5 files changed, 40 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7a2f98c8/tapestry-core/src/main/java/org/apache/tapestry5/annotations/ActivationRequestParameter.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/annotations/ActivationRequestParameter.java b/tapestry-core/src/main/java/org/apache/tapestry5/annotations/ActivationRequestParameter.java index d5f8086..f7e264d 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/annotations/ActivationRequestParameter.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/annotations/ActivationRequestParameter.java @@ -1,5 +1,3 @@ -// Copyright 2010, 2013 The Apache Software Foundation -// // Licensed 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 @@ -47,7 +45,7 @@ import org.apache.tapestry5.services.ValueEncoderSource; * Fields annotated with ActivationRequestParameter are <em>not</em> considered persistent (its a process parallel to the one * related to the {@link Persist} annotation). Invoking {@link ComponentResources#discardPersistentFieldChanges()} will * <em>not</em> affect annotated fields, only assigning them back to null will. - * + * * @see RequestParameter * @see ValueEncoder */ @@ -62,5 +60,11 @@ public @interface ActivationRequestParameter /** The name of the query parameter, which defaults to the name of the field. */ String value() default ""; - // TODO: Attributes to limit it to just render links, or just component event links? + /** + * If true then a null value is an error. If false, then a null value will result in no update to the field. Either way, + * a null field value will result in no query parameter added to a {@linkplain org.apache.tapestry5.Link generated link}. + * + * @since 5.4 + */ + boolean required() default false; } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7a2f98c8/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java index 29afeef..55dfee0 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java @@ -1,5 +1,3 @@ -// Copyright 2010, 2011 The Apache Software Foundation -// // Licensed 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 @@ -19,6 +17,7 @@ import org.apache.tapestry5.Link; import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.annotations.ActivationRequestParameter; import org.apache.tapestry5.internal.services.ComponentClassCache; +import org.apache.tapestry5.ioc.internal.util.TapestryException; import org.apache.tapestry5.ioc.util.IdAllocator; import org.apache.tapestry5.model.MutableComponentModel; import org.apache.tapestry5.plastic.FieldHandle; @@ -86,7 +85,7 @@ public class ActivationRequestParameterWorker implements ComponentClassTransform String fieldName = String.format("%s.%s", field.getPlasticClass().getClassName(), field.getName()); - setValueFromInitializeEventHandler(support, fieldName, handle, parameterName, encoder, urlEncoder); + setValueFromInitializeEventHandler(support, fieldName, annotation.required(), handle, parameterName, encoder, urlEncoder); decorateLinks(support, fieldName, handle, parameterName, encoder, urlEncoder); @@ -112,7 +111,7 @@ public class ActivationRequestParameterWorker implements ComponentClassTransform } @SuppressWarnings("all") - private void setValueFromInitializeEventHandler(TransformationSupport support, String fieldName, final FieldHandle handle, + private void setValueFromInitializeEventHandler(final TransformationSupport support, final String fieldName, final boolean required, final FieldHandle handle, final String parameterName, final ValueEncoder encoder, final URLEncoder urlEncoder) { ComponentEventHandler handler = new ComponentEventHandler() @@ -122,7 +121,16 @@ public class ActivationRequestParameterWorker implements ComponentClassTransform String clientValue = request.getParameter(parameterName); if (clientValue == null) + { + if (required) + { + throw new TapestryException(String.format("Activation request parameter field %s is marked as required, but query parameter '%s' is null.", + fieldName, + parameterName), null); + } + return; + } // TAP5-1768: unescape encoded value clientValue = urlEncoder.decode(clientValue); http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7a2f98c8/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ActivationRequestParameterTests.groovy ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ActivationRequestParameterTests.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ActivationRequestParameterTests.groovy index 7688426..416468a 100644 --- a/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ActivationRequestParameterTests.groovy +++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/ActivationRequestParameterTests.groovy @@ -1,5 +1,3 @@ -// Copyright 2010-2013 The Apache Software Foundation -// // Licensed 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 @@ -63,4 +61,13 @@ class ActivationRequestParameterTests extends App1TestCase assertText "click-count", "1" assertText "selected-click-count", "2" } + + @Test + public void required_arp_with_missing_parameter_is_error() { + + openLinks "Missing Query Parameter for @ActivationRequestParameter" + + assertTextPresent"Activation request parameter field org.apache.tapestry5.integration.app1.pages.MissingRequiredARP.missingARP is marked as required, but query parameter 'missingARP' is null." + + } } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7a2f98c8/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java index 85d0987..2d9876c 100644 --- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java +++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java @@ -57,6 +57,8 @@ public class Index private static final List<Item> ITEMS = CollectionFactory .newList( + new Item("MissingRequiredARP", "Missing Query Parameter for @ActivationRequestParameter", "Activating a page with a required @ActivationRequestParameter, but no matching query parameter, is an error."), + new Item ("DateFieldValidationDemo", "DateField Validation Demo", "Use of DateField component when client validation is disabled."), http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7a2f98c8/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MissingRequiredARP.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MissingRequiredARP.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MissingRequiredARP.java new file mode 100644 index 0000000..1d569d3 --- /dev/null +++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MissingRequiredARP.java @@ -0,0 +1,9 @@ +package org.apache.tapestry5.integration.app1.pages; + +import org.apache.tapestry5.annotations.ActivationRequestParameter; + +public class MissingRequiredARP +{ + @ActivationRequestParameter(required = true) + private String missingARP; +}