Author: robertdzeigler Date: Mon Jun 22 12:42:56 2009 New Revision: 787224 URL: http://svn.apache.org/viewvc?rev=787224&view=rev Log: TAP5-692: T5 should pick up validators to be applied to a field from the containing component's .properties file
Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/EnvironmentMessages.java tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/MessagesConstraintGenerator.java tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MessageConstraintGeneratorDemo.tml tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/Pet.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/PetType.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/beaneditor/MessagesAnnotationConstraintGeneratorTest.java tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.properties Modified: tapestry/tapestry5/trunk/src/site/apt/guide/beaneditform.apt tapestry/tapestry5/trunk/src/site/apt/guide/validation.apt tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/ValidateAnnotationConstraintGenerator.java tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/FieldValidatorDefaultSourceImpl.java tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java Modified: tapestry/tapestry5/trunk/src/site/apt/guide/beaneditform.apt URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/src/site/apt/guide/beaneditform.apt?rev=787224&r1=787223&r2=787224&view=diff ============================================================================== --- tapestry/tapestry5/trunk/src/site/apt/guide/beaneditform.apt (original) +++ tapestry/tapestry5/trunk/src/site/apt/guide/beaneditform.apt Mon Jun 22 12:42:56 2009 @@ -73,7 +73,9 @@ Default validation for fields is primary determined by property type. If desired, additional validation may be specified using the - {{{../apidocs/org/apache/tapestry5/beaneditor/Validate.html}Validate}} annotation. + {{{../apidocs/org/apache/tapestry5/beaneditor/Validate.html}Validate}} annotation. + + * As of 5.2, validation may also be specified via the containing component's property file, using a key in the form of propertyId-validate (eg: name-validate=required). * Property ordering Modified: tapestry/tapestry5/trunk/src/site/apt/guide/validation.apt URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/src/site/apt/guide/validation.apt?rev=787224&r1=787223&r2=787224&view=diff ============================================================================== --- tapestry/tapestry5/trunk/src/site/apt/guide/validation.apt (original) +++ tapestry/tapestry5/trunk/src/site/apt/guide/validation.apt Mon Jun 22 12:42:56 2009 @@ -239,7 +239,7 @@ This is nice and seamless; the same look and feel and behavior for both the built-in validators, and for errors generated based on application logic. -Centralizing Validation with @Validate +Centralizing Validation with @Validate and Property Files The {{{../apidocs/org/apache/tapestry5/beaneditor/Validate.html}Validate}} annotation can take the place of the validate parameter of TextField, PasswordField, TextArea and other components. When the validate parameter @@ -247,6 +247,9 @@ The annotation may be placed on the getter or setter method, or on the field itself. + Validation constraints can also be specified in the properties file of the containing page or component. + The key takes the form <propertyId>-validate. For example: username-validate=required,minlength=6. + Customizing Validation Messages Each validator (such as "required" or "minlength") has a default message used (on the client side and the server side) Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/EnvironmentMessages.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/EnvironmentMessages.java?rev=787224&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/EnvironmentMessages.java (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/EnvironmentMessages.java Mon Jun 22 12:42:56 2009 @@ -0,0 +1,47 @@ + +// Copyright 2007 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 +// +// 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.tapestry5.internal.beaneditor; + +import org.apache.tapestry5.ioc.Messages; + +/** + * Holds the current (overrides) Messages object and override id for placemnt into the environment + * by FieldValidatorDefaultSourceImpl so ValidationConstraintGenerator implementations have access + * to the catalog if necessary. + */ +public class EnvironmentMessages +{ + + private final Messages messages; + private final String overrideId; + + public EnvironmentMessages(Messages messages, String overrideId) + { + this.messages = messages; + this.overrideId = overrideId; + } + + public Messages getMessages() + { + return messages; + } + + public String getOverrideId() + { + return overrideId; + } + +} Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/MessagesConstraintGenerator.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/MessagesConstraintGenerator.java?rev=787224&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/MessagesConstraintGenerator.java (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/MessagesConstraintGenerator.java Mon Jun 22 12:42:56 2009 @@ -0,0 +1,66 @@ +// Copyright 2007 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 +// +// 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.tapestry5.internal.beaneditor; + +import org.apache.tapestry5.services.ValidationConstraintGenerator; +import org.apache.tapestry5.services.Environment; +import org.apache.tapestry5.services.PropertyEditContext; +import org.apache.tapestry5.ioc.AnnotationProvider; +import org.apache.tapestry5.ioc.Messages; +import org.apache.tapestry5.ioc.internal.util.InternalUtils; + +import java.util.List; +import java.util.Arrays; +import java.util.regex.Pattern; + +/** + * Generates constraints from the containing component's property file. + * Looks for a key in the form: propertyId-validate. + * + */ +public class MessagesConstraintGenerator implements ValidationConstraintGenerator +{ + + private final Environment environment; + private final String format="%s-validate"; + private final Pattern splitPattern; + + public MessagesConstraintGenerator(final Environment environment) { + this.environment = environment; + splitPattern = Pattern.compile(ValidateAnnotationConstraintGenerator.VALIDATOR_PATTERN); + } + + public List<String> buildConstraints(Class propertyType, AnnotationProvider annotationProvider) + { + EnvironmentMessages environmentMessages = environment.peek(EnvironmentMessages.class); + if (environmentMessages == null) { + return null; + } + + String key = String.format(format,environmentMessages.getOverrideId()); + Messages m = environmentMessages.getMessages(); + if (!m.contains(key)) + { + return null; + } + + String result = m.get(key); + if (InternalUtils.isBlank(result)) + { + return null; + } + return Arrays.asList(splitPattern.split(result)); + } +} Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/ValidateAnnotationConstraintGenerator.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/ValidateAnnotationConstraintGenerator.java?rev=787224&r1=787223&r2=787224&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/ValidateAnnotationConstraintGenerator.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/beaneditor/ValidateAnnotationConstraintGenerator.java Mon Jun 22 12:42:56 2009 @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.List; +import java.util.regex.Pattern; /** * Checks for the {...@link Validate} annotation, and extracts its value to form the result. @@ -27,6 +28,15 @@ public class ValidateAnnotationConstraintGenerator implements ValidationConstraintGenerator { + static final String VALIDATOR_PATTERN="(?<!\\\\),(?!([0-9]*\\}))"; + + private final Pattern validatorPattern; + + public ValidateAnnotationConstraintGenerator() + { + validatorPattern = Pattern.compile(VALIDATOR_PATTERN); + } + public List<String> buildConstraints(Class propertyType, AnnotationProvider annotationProvider) { Validate annotation = annotationProvider.getAnnotation(Validate.class); @@ -38,7 +48,7 @@ //We use Negative Lookahead to avoid matching the case a\,b . //We use Positive Lookahead to avoid matching cases {n,m} and {n,}. //http://www.regular-expressions.info/lookaround.html - return Arrays.asList(annotation.value().split("(?<!\\\\),(?!([0-9]*\\}))")); + return Arrays.asList(validatorPattern.split(annotation.value())); } } Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/FieldValidatorDefaultSourceImpl.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/FieldValidatorDefaultSourceImpl.java?rev=787224&r1=787223&r2=787224&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/FieldValidatorDefaultSourceImpl.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/FieldValidatorDefaultSourceImpl.java Mon Jun 22 12:42:56 2009 @@ -17,12 +17,14 @@ import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.Field; import org.apache.tapestry5.FieldValidator; +import org.apache.tapestry5.internal.beaneditor.EnvironmentMessages; import org.apache.tapestry5.ioc.AnnotationProvider; import org.apache.tapestry5.ioc.Messages; import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newList; import org.apache.tapestry5.services.FieldValidatorDefaultSource; import org.apache.tapestry5.services.FieldValidatorSource; import org.apache.tapestry5.services.ValidationConstraintGenerator; +import org.apache.tapestry5.services.Environment; import java.util.List; import java.util.Locale; @@ -66,7 +68,6 @@ validators.add(validator); } - return validators.size() == 1 ? validators.get(0) : new CompositeFieldValidator(validators); } Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=787224&r1=787223&r2=787224&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Mon Jun 22 12:42:56 2009 @@ -26,6 +26,8 @@ import org.apache.tapestry5.internal.*; import org.apache.tapestry5.internal.beaneditor.PrimitiveFieldConstraintGenerator; import org.apache.tapestry5.internal.beaneditor.ValidateAnnotationConstraintGenerator; +import org.apache.tapestry5.internal.beaneditor.MessagesConstraintGenerator; +import org.apache.tapestry5.internal.beaneditor.EnvironmentMessages; import org.apache.tapestry5.internal.bindings.*; import org.apache.tapestry5.internal.grid.CollectionGridDataSource; import org.apache.tapestry5.internal.grid.NullDataSource; @@ -1001,6 +1003,7 @@ { configuration.add("PrimitiveField", new PrimitiveFieldConstraintGenerator()); configuration.add("ValidateAnnotation", new ValidateAnnotationConstraintGenerator()); + configuration.addInstance("Messages", MessagesConstraintGenerator.class); } private static <S, T> void add(Configuration<CoercionTuple> configuration, Class<S> sourceType, Class<T> targetType, @@ -1396,7 +1399,7 @@ * Supports an ordered configuration of {...@link org.apache.tapestry5.services.PartialMarkupRendererFilter}s. * * @see #contributePartialMarkupRenderer(org.apache.tapestry5.ioc.OrderedConfiguration, org.apache.tapestry5.Asset, - * org.apache.tapestry5.ioc.services.SymbolSource, AssetSource, ValidationMessagesSource) + * org.apache.tapestry5.ioc.services.SymbolSource, AssetSource) */ public PartialMarkupRenderer buildPartialMarkupRenderer(Logger logger, List<PartialMarkupRendererFilter> configuration, @@ -2405,4 +2408,50 @@ } + /** + * Decorate FieldValidatorDefaultSource to setup the EnvironmentMessages object and place it in the environment. + * Although this could have been implemented directly in the default implementation of the service, doing it + * as service decoration ensures that the environment will be properly setup even if a user overrides the default + * service implementation. + * @param defaultSource The serivce to decorate + * @param environment + * @return + */ + public static FieldValidatorDefaultSource decorateFieldValidatorDefaultSource( + final FieldValidatorDefaultSource defaultSource, final Environment environment) + { + return new FieldValidatorDefaultSource() + { + + public FieldValidator createDefaultValidator( + Field field, + String overrideId, + Messages overrideMessages, + Locale locale, + Class propertyType, + AnnotationProvider propertyAnnotations) + { + environment.push(EnvironmentMessages.class,new EnvironmentMessages(overrideMessages,overrideId)); + FieldValidator fieldValidator = defaultSource.createDefaultValidator(field, + overrideId, + overrideMessages, + locale, + propertyType, + propertyAnnotations); + environment.pop(EnvironmentMessages.class); + return fieldValidator; + } + + public FieldValidator createDefaultValidator(ComponentResources resources, String parameterName) + { + + EnvironmentMessages em = new EnvironmentMessages(resources.getContainerMessages(),resources.getId()); + environment.push(EnvironmentMessages.class,em); + FieldValidator fieldValidator = defaultSource.createDefaultValidator(resources, parameterName); + environment.pop(EnvironmentMessages.class); + return fieldValidator; + } + }; + } + } Added: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MessageConstraintGeneratorDemo.tml URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MessageConstraintGeneratorDemo.tml?rev=787224&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MessageConstraintGeneratorDemo.tml (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/app1/MessageConstraintGeneratorDemo.tml Mon Jun 22 12:42:56 2009 @@ -0,0 +1,12 @@ +<t:border xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" + xmlns:p="tapestry:parameter"> + + <h1>Validators specified in message catalog</h1> + + <t:beaneditform t:id="form" object="pet"> + <p:age> + <t:label for="age"/> <t:textfield t:id="age" value="pet.age"/> + </p:age> + </t:beaneditform> + +</t:border> Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java?rev=787224&r1=787223&r2=787224&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java Mon Jun 22 12:42:56 2009 @@ -2930,4 +2930,31 @@ assertText("prop.middle.bottom", "bound value"); assertText("literal.middle.bottom", "some text"); } + + @Test + public void validation_constraints_from_messages() throws InterruptedException + { + start("Validation Constraints From Messages"); + + click(SUBMIT); + + assertBubbleMessage("name","You must provide a value for Name."); + assertBubbleMessage("age","You must provide a value for Age."); + + type("name","behemoth"); + type("age","0"); + select("type","label=Snake"); + + click(SUBMIT); + assertBubbleMessage("age","Age requires a value of at least 1."); + + type("age","121"); + click(SUBMIT); + assertBubbleMessage("age","Age requires a value no larger than 120."); + + type("age","5"); + clickAndWait(SUBMIT); + + + } } \ No newline at end of file Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/Pet.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/Pet.java?rev=787224&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/Pet.java (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/Pet.java Mon Jun 22 12:42:56 2009 @@ -0,0 +1,54 @@ +// Copyright 2007 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 +// +// 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.tapestry5.integration.app1.data; + +public class Pet +{ + + private String name; + private Integer age; + private PetType type; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public Integer getAge() + { + return age; + } + + public void setAge(Integer age) + { + this.age = age; + } + + public PetType getType() + { + return type; + } + + public void setType(PetType type) + { + this.type = type; + } + +} Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/PetType.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/PetType.java?rev=787224&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/PetType.java (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/PetType.java Mon Jun 22 12:42:56 2009 @@ -0,0 +1,20 @@ +// Copyright 2007 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 +// +// 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.tapestry5.integration.app1.data; + +public enum PetType +{ + DOG,CAT,FISH,SNAKE,TARANTULA; +} Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=787224&r1=787223&r2=787224&view=diff ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java (original) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java Mon Jun 22 12:42:56 2009 @@ -347,7 +347,11 @@ "Nice exception message for common problem of form fields outside forms"), new Item("SubmitWithContext", "Submit With Context", - "Providing a context for Submit component") + "Providing a context for Submit component"), + + new Item("MessageConstraintGeneratorDemo", + "Validation Constraints From Messages", + "Providing validators to apply from a properties file") ); static Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.java?rev=787224&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.java (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.java Mon Jun 22 12:42:56 2009 @@ -0,0 +1,26 @@ +// Copyright 2007 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 +// +// 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.tapestry5.integration.app1.pages; + +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.integration.app1.data.Pet; + +public class MessageConstraintGeneratorDemo +{ + + @Property + private Pet pet; + +} Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/beaneditor/MessagesAnnotationConstraintGeneratorTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/beaneditor/MessagesAnnotationConstraintGeneratorTest.java?rev=787224&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/beaneditor/MessagesAnnotationConstraintGeneratorTest.java (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/beaneditor/MessagesAnnotationConstraintGeneratorTest.java Mon Jun 22 12:42:56 2009 @@ -0,0 +1,107 @@ +// Copyright 2007 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 +// +// 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.tapestry5.internal.beaneditor; + +import org.apache.tapestry5.internal.test.InternalBaseTestCase; +import org.apache.tapestry5.services.Environment; +import org.apache.tapestry5.services.PropertyEditContext; +import org.apache.tapestry5.ioc.Messages; +import org.testng.annotations.Test; + +import java.util.Arrays; + +public class MessagesAnnotationConstraintGeneratorTest extends InternalBaseTestCase +{ + + @Test + public void no_environment() + { + Environment e = getService(Environment.class); + MessagesConstraintGenerator gen = new MessagesConstraintGenerator(e); + assertNull(gen.buildConstraints(null,null)); + } + + @Test + public void no_property() + { + Environment e = getService(Environment.class); + + pushAndTrainEnvironmentalObjects(e,false,null); + + MessagesConstraintGenerator gen = new MessagesConstraintGenerator(e); + assertNull(gen.buildConstraints(null,null)); + + pop(e); + verify(); + } + + @Test + public void empty_message() + { + Environment e = getService(Environment.class); + + pushAndTrainEnvironmentalObjects(e,true,""); + + MessagesConstraintGenerator gen = new MessagesConstraintGenerator(e); + assertNull(gen.buildConstraints(null,null)); + + pop(e); + verify(); + } + + @Test + public void single_constraint() + { + Environment e = getService(Environment.class); + + pushAndTrainEnvironmentalObjects(e,true,"required"); + + MessagesConstraintGenerator gen = new MessagesConstraintGenerator(e); + + assertEquals(gen.buildConstraints(null,null), Arrays.asList("required")); + } + + @Test + public void multiple_constraints() + { + Environment e = getService(Environment.class); + + pushAndTrainEnvironmentalObjects(e,true,"required,minlength=3,regexp=^([a-zA-Z0-9]{2,4})+@(\\p{Lower})*$"); + + MessagesConstraintGenerator gen = new MessagesConstraintGenerator(e); + + assertEquals(gen.buildConstraints(null,null), + Arrays.asList("required","minlength=3","regexp=^([a-zA-Z0-9]{2,4})+@(\\p{Lower})*$")); + + } + + private void pushAndTrainEnvironmentalObjects(Environment e, boolean hasProperty, String propertyValue) { + Messages messages = mockMessages(); + train_contains(messages,"testProperty-validate",hasProperty); + + if (hasProperty) { + train_get(messages,"testProperty-validate",propertyValue); + } + + EnvironmentMessages em = new EnvironmentMessages(messages,"testProperty"); + e.push(EnvironmentMessages.class,em); + replay(); + } + + private void pop(Environment e) { + e.pop(EnvironmentMessages.class); + } + +} Added: tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.properties URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.properties?rev=787224&view=auto ============================================================================== --- tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.properties (added) +++ tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/MessageConstraintGeneratorDemo.properties Mon Jun 22 12:42:56 2009 @@ -0,0 +1,17 @@ +# Copyright 2007 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 +# +# 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. + +name-validate=required +age-validate=required,min=1,max=120 +