You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by dr...@apache.org on 2010/01/07 08:13:51 UTC

svn commit: r896767 - in /tapestry/tapestry5/trunk: tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ tapestry-beanvalidator/src/main/resources/ ta...

Author: drobiazko
Date: Thu Jan  7 07:13:49 2010
New Revision: 896767

URL: http://svn.apache.org/viewvc?rev=896767&view=rev
Log:
TAP5-895: Tracking issue for Tapestry/JSR-303 integration

Added:
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptor.java   (with props)
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptorSource.java   (with props)
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java   (with props)
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ClientConstraintDescriptorImpl.java   (with props)
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/beanvalidator/
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js   (with props)
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ClientValidationDemo.java   (with props)
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/ClientValidationDemo.tml
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/BeanValidationContextImpl.java   (with props)
Modified:
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/BeanValidatorModule.java
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidatorDefaultSource.java
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java
    tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/Index.tml
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/BeanValidationContext.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/BeanEditorTest.java

Modified: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/BeanValidatorModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/BeanValidatorModule.java?rev=896767&r1=896766&r2=896767&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/BeanValidatorModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/BeanValidatorModule.java Thu Jan  7 07:13:49 2010
@@ -1,4 +1,4 @@
-// Copyright 2009 The Apache Software Foundation
+// Copyright 2009, 2010 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.
@@ -13,16 +13,19 @@
 // limitations under the License.
 package org.apache.tapestry5.beanvalidator;
 
-import java.util.Locale;
-
 import javax.validation.MessageInterpolator;
 import javax.validation.Validator;
 import javax.validation.ValidatorFactory;
+import javax.validation.constraints.NotNull;
 import javax.validation.groups.Default;
 
+import org.apache.tapestry5.Asset;
+import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.RenderSupport;
 import org.apache.tapestry5.internal.beanvalidator.BeanFieldValidatorDefaultSource;
 import org.apache.tapestry5.internal.beanvalidator.BeanValidationGroupSourceImpl;
 import org.apache.tapestry5.internal.beanvalidator.BeanValidatorSourceImpl;
+import org.apache.tapestry5.internal.beanvalidator.ClientConstraintDescriptorImpl;
 import org.apache.tapestry5.internal.beanvalidator.MessageInterpolatorImpl;
 import org.apache.tapestry5.ioc.Configuration;
 import org.apache.tapestry5.ioc.MappedConfiguration;
@@ -31,7 +34,11 @@
 import org.apache.tapestry5.ioc.annotations.Local;
 import org.apache.tapestry5.ioc.services.PropertyShadowBuilder;
 import org.apache.tapestry5.ioc.services.ThreadLocale;
+import org.apache.tapestry5.services.AssetSource;
+import org.apache.tapestry5.services.Environment;
 import org.apache.tapestry5.services.FieldValidatorDefaultSource;
+import org.apache.tapestry5.services.MarkupRenderer;
+import org.apache.tapestry5.services.MarkupRendererFilter;
 
 /**
  * Module for JSR-303 services.
@@ -46,6 +53,7 @@
 					.withId("BeanFieldValidatorDefaultSource");
 		binder.bind(BeanValidatorGroupSource.class, BeanValidationGroupSourceImpl.class);
 		binder.bind(BeanValidatorSource.class, BeanValidatorSourceImpl.class);
+		binder.bind(ClientConstraintDescriptorSource.class, ClientConstraintDescriptorImpl.class);
 	}
 
 	public static void contributeServiceOverride(
@@ -85,5 +93,39 @@
 			}
 		});
 	}
+	
+	public static void contributeClientConstraintDescriptorSource(
+			final Configuration<ClientConstraintDescriptor> configuration) 
+	{
+		configuration.add(new ClientConstraintDescriptor(NotNull.class, "notnull"));
+	}
+	
+	public void contributeMarkupRenderer(
+			OrderedConfiguration<MarkupRendererFilter> configuration, 
+			
+			final AssetSource assetSource,
+			
+			final ThreadLocale threadLocale,
+			
+			final Environment environment)
+	{
+        MarkupRendererFilter injectBeanValidatorScript = new MarkupRendererFilter()
+        {
+            public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer)
+            {
+                RenderSupport renderSupport = environment.peek(RenderSupport.class);
+                
+                Asset validators = assetSource.getAsset(null, "org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js",
+                        threadLocale.getLocale());
+
+                renderSupport.addScriptLink(validators);
+
+                renderer.renderMarkup(writer);
+            }
+        };
+        
+        
+        configuration.add("BeanValidatorScript", injectBeanValidatorScript, "after:*");
+	}
 
 }

Added: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptor.java?rev=896767&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptor.java (added)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptor.java Thu Jan  7 07:13:49 2010
@@ -0,0 +1,64 @@
+// Copyright 2009 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.beanvalidator;
+
+import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newSet;
+
+import java.util.Set;
+
+import org.apache.tapestry5.json.JSONObject;
+
+/**
+ * Describes a single client-side constraint.
+ *
+ */
+public final class ClientConstraintDescriptor
+{
+   private final Class annotationClass;
+   private final String validatorName;
+   private final Set<String> attributes;
+
+   public ClientConstraintDescriptor(final Class annotationClass,
+         final String validatorName, final String... attributes) 
+   {
+     this.annotationClass = annotationClass;
+     this.validatorName = validatorName;
+     this.attributes = newSet(attributes);
+   }
+   
+   /**
+    * Returns the annotation describing the constraint declaration.
+    */
+   public Class getAnnotationClass() 
+   {
+     return this.annotationClass;
+   }
+
+   /**
+    * Returns the name of the client-side validator.
+    */
+   public String getValidatorName() 
+   {
+     return this.validatorName;
+   }
+
+   /**
+    * Returns a map containing the annotation attribute names as keys and the annotation attribute values as value.
+    * This map is passed to the client-side validator as a {@link JSONObject}.
+    */
+   public Set<String> getAttributes() 
+   {
+     return this.attributes;
+   }
+}
\ No newline at end of file

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptorSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptorSource.java?rev=896767&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptorSource.java (added)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptorSource.java Thu Jan  7 07:13:49 2010
@@ -0,0 +1,31 @@
+// Copyright 2010 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.beanvalidator;
+
+import org.apache.tapestry5.ioc.annotations.UsesConfiguration;
+
+/**
+ * Source for {@link ClientConstraintDescriptor}.
+ *
+ */
+@UsesConfiguration(ClientConstraintDescriptor.class)
+public interface ClientConstraintDescriptorSource 
+{
+	/**
+	 * Return a {@link ClientConstraintDescriptor} for a constraint annotation or null.
+	 * 
+	 * @param annotationClass type of the constraint annotation
+	 */
+	ClientConstraintDescriptor getConstraintDescriptor(Class annotationClass);
+}

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptorSource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptorSource.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java?rev=896767&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java (added)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java Thu Jan  7 07:13:49 2010
@@ -0,0 +1,177 @@
+// Copyright 2010 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.beanvalidator;
+
+import static java.lang.String.format;
+
+import java.lang.annotation.Annotation;
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.MessageInterpolator;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import javax.validation.MessageInterpolator.Context;
+import javax.validation.metadata.BeanDescriptor;
+import javax.validation.metadata.ConstraintDescriptor;
+import javax.validation.metadata.PropertyDescriptor;
+
+import org.apache.tapestry5.Field;
+import org.apache.tapestry5.FieldValidator;
+import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.ValidationException;
+import org.apache.tapestry5.beanvalidator.BeanValidatorGroupSource;
+import org.apache.tapestry5.beanvalidator.ClientConstraintDescriptor;
+import org.apache.tapestry5.beanvalidator.ClientConstraintDescriptorSource;
+import org.apache.tapestry5.json.JSONObject;
+import org.apache.tapestry5.services.BeanValidationContext;
+import org.apache.tapestry5.services.Environment;
+import org.apache.tapestry5.services.FormSupport;
+
+
+public class BeanFieldValidator implements FieldValidator
+{
+	private final Field field;
+	private final String propertyName;
+	private final ValidatorFactory validatorFactory;
+	private final BeanValidatorGroupSource beanValidationGroupSource;
+	private final ClientConstraintDescriptorSource clientValidatorSource;
+	private final FormSupport formSupport;
+	private final Environment environment;
+	
+	public BeanFieldValidator(Field field, String propertyName,
+			ValidatorFactory validatorFactory,
+			BeanValidatorGroupSource beanValidationGroupSource,
+			ClientConstraintDescriptorSource clientValidatorSource,
+			FormSupport formSupport,
+			Environment environment) 
+	{
+		this.field = field;
+		this.propertyName = propertyName;
+		this.validatorFactory = validatorFactory;
+		this.beanValidationGroupSource = beanValidationGroupSource;
+		this.clientValidatorSource = clientValidatorSource;
+		this.formSupport = formSupport;
+		this.environment = environment;
+	}
+	
+	public boolean isRequired() 
+	{
+		return false;
+	}
+
+	public void render(final MarkupWriter writer) 
+	{
+		final BeanValidationContext beanValidationContext = environment.peek(BeanValidationContext.class);
+
+		if (beanValidationContext == null) 
+		{
+			return;
+		}
+		
+		final Validator validator = validatorFactory.getValidator();
+		
+		BeanDescriptor beanDescriptor = validator.getConstraintsForClass(beanValidationContext.getBeanType());
+		
+		PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty(propertyName);
+		
+		for (final ConstraintDescriptor<?> descriptor :propertyDescriptor.getConstraintDescriptors()) 
+		{
+			Class<? extends Annotation> annotationType = descriptor.getAnnotation().annotationType();
+			
+			ClientConstraintDescriptor clientConstraintDescriptor = clientValidatorSource.getConstraintDescriptor(annotationType);
+			
+			if(clientConstraintDescriptor != null)
+			{	
+				String message = interpolateMessage(descriptor);
+				
+				JSONObject specs = new JSONObject();
+				
+                for (String attribute : clientConstraintDescriptor.getAttributes()) 
+                {
+                    Object object = descriptor.getAttributes().get(attribute);
+                    
+                    if (object == null) 
+                    {
+                      throw new RuntimeException("Expected attribute is null");
+                    }
+                    specs.put(attribute, object);
+                }
+                
+				formSupport.addValidation(field, clientConstraintDescriptor.getValidatorName(), message, specs);
+			}
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	public void validate(final Object value) throws ValidationException 
+	{
+
+		final BeanValidationContext beanValidationContext = environment.peek(BeanValidationContext.class);
+
+		if (beanValidationContext == null) 
+		{
+			return;
+		}
+		
+		final Validator validator = validatorFactory.getValidator();
+		
+		final Set<ConstraintViolation<Object>> violations = validator.validateValue(
+						(Class<Object>) beanValidationContext.getBeanType(), propertyName, 
+						value, beanValidationGroupSource.get());
+		
+		if (violations.isEmpty()) 
+		{
+			return;
+		}
+		
+		final StringBuilder builder = new StringBuilder();
+		
+		for (Iterator iterator = violations.iterator(); iterator.hasNext();) 
+		{
+			ConstraintViolation<?> violation = (ConstraintViolation<Object>) iterator.next();
+			
+			builder.append(format("%s %s", field.getLabel(), violation.getMessage()));
+			
+			if(iterator.hasNext())
+				builder.append(", ");
+	
+		}
+		
+		throw new ValidationException(builder.toString());
+
+	}
+	
+	private String interpolateMessage(final ConstraintDescriptor<?> descriptor)
+	{
+		String messageTemplate = (String) descriptor.getAttributes().get("message");
+		
+		MessageInterpolator messageInterpolator = validatorFactory.getMessageInterpolator();
+		
+		return messageInterpolator.interpolate(messageTemplate, new Context() 
+		{
+
+            public ConstraintDescriptor<?> getConstraintDescriptor() 
+            {
+              return descriptor;
+            }
+
+            public Object getValidatedValue() 
+            {
+              return null;
+            }
+        });
+	}
+}

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidatorDefaultSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidatorDefaultSource.java?rev=896767&r1=896766&r2=896767&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidatorDefaultSource.java (original)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidatorDefaultSource.java Thu Jan  7 07:13:49 2010
@@ -1,4 +1,4 @@
-// Copyright 2009 The Apache Software Foundation
+// Copyright 2009, 2010 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.
@@ -13,47 +13,46 @@
 // limitations under the License.
 package org.apache.tapestry5.internal.beanvalidator;
 
-import static java.lang.String.format;
-
 import java.util.Arrays;
-import java.util.Iterator;
 import java.util.Locale;
-import java.util.Set;
 
-import javax.validation.ConstraintViolation;
-import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
 
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.Field;
 import org.apache.tapestry5.FieldValidator;
-import org.apache.tapestry5.MarkupWriter;
-import org.apache.tapestry5.ValidationException;
 import org.apache.tapestry5.beanvalidator.BeanValidatorGroupSource;
-import org.apache.tapestry5.beanvalidator.BeanValidatorSource;
+import org.apache.tapestry5.beanvalidator.ClientConstraintDescriptorSource;
 import org.apache.tapestry5.internal.services.CompositeFieldValidator;
 import org.apache.tapestry5.ioc.AnnotationProvider;
 import org.apache.tapestry5.ioc.Messages;
-import org.apache.tapestry5.services.BeanValidationContext;
 import org.apache.tapestry5.services.Core;
 import org.apache.tapestry5.services.Environment;
 import org.apache.tapestry5.services.FieldValidatorDefaultSource;
+import org.apache.tapestry5.services.FormSupport;
 
 public class BeanFieldValidatorDefaultSource implements FieldValidatorDefaultSource 
 {
 	private final FieldValidatorDefaultSource fieldValidatorDefaultSource;
-	private final BeanValidatorSource beanValidatorSource;
+	private final ValidatorFactory validatorFactory;
 	private final BeanValidatorGroupSource beanValidationGroupSource;
+	private final ClientConstraintDescriptorSource clientValidatorSource;
+	private final FormSupport formSupport;
 	private final Environment environment;
 
 	public BeanFieldValidatorDefaultSource(
 			@Core FieldValidatorDefaultSource fieldValidatorDefaultSource,
-			final BeanValidatorSource beanValidatorSource,
+			final ValidatorFactory validatorFactory,
 			final BeanValidatorGroupSource beanValidationGroupSource,
+			final ClientConstraintDescriptorSource clientValidatorSource,
+			final FormSupport formSupport,
 			final Environment environment) 
 	{
 		this.fieldValidatorDefaultSource = fieldValidatorDefaultSource;
-		this.beanValidatorSource = beanValidatorSource;
+		this.validatorFactory = validatorFactory;
 		this.beanValidationGroupSource = beanValidationGroupSource;
+		this.clientValidatorSource = clientValidatorSource;
+		this.formSupport = formSupport;
 		this.environment = environment;
 	}
 
@@ -66,57 +65,10 @@
 		FieldValidator validator = fieldValidatorDefaultSource.createDefaultValidator(
 				field, overrideId, overrideMessages, locale, propertyType, propertyAnnotations);
 
-		FieldValidator beanValidator = new FieldValidator() {
-			
-			public boolean isRequired() 
-			{
-				return false;
-			}
-
-			public void render(final MarkupWriter writer) 
-			{
-			}
-
-			public void validate(final Object value) throws ValidationException 
-			{
-
-				final BeanValidationContext beanValidationContext = BeanFieldValidatorDefaultSource.this.environment
-						.peek(BeanValidationContext.class);
-
-				if (beanValidationContext == null) 
-				{
-					return;
-				}
-				
-				final Validator validator = BeanFieldValidatorDefaultSource.this.beanValidatorSource.create();
-				
-				final Set<ConstraintViolation<Object>> violations = validator.validateValue(
-								(Class<Object>) beanValidationContext.getObject().getClass(), overrideId, 
-								value, beanValidationGroupSource.get());
-				
-				if (violations.isEmpty()) 
-				{
-					return;
-				}
-				
-				final StringBuilder builder = new StringBuilder();
-				
-				for (Iterator iterator = violations.iterator(); iterator.hasNext();) 
-				{
-					ConstraintViolation<?> violation = (ConstraintViolation<Object>) iterator.next();
-					
-					builder.append(format("%s %s", field.getLabel(), violation.getMessage()));
-					
-					if(iterator.hasNext())
-						builder.append(", ");
-			
-				}
-				
-				throw new ValidationException(builder.toString());
-
-			}
-
-		};
+		
+		FieldValidator beanValidator 
+			= new BeanFieldValidator(field, overrideId, validatorFactory, beanValidationGroupSource, 
+					clientValidatorSource, formSupport, environment);
 		
 		return new CompositeFieldValidator(Arrays.asList(validator, beanValidator));
 	}

Added: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ClientConstraintDescriptorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ClientConstraintDescriptorImpl.java?rev=896767&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ClientConstraintDescriptorImpl.java (added)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ClientConstraintDescriptorImpl.java Thu Jan  7 07:13:49 2010
@@ -0,0 +1,47 @@
+// Copyright 2010 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.beanvalidator;
+
+import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newList;
+
+import java.util.Collection;
+
+import org.apache.tapestry5.beanvalidator.ClientConstraintDescriptorSource;
+import org.apache.tapestry5.beanvalidator.ClientConstraintDescriptor;
+
+public class ClientConstraintDescriptorImpl implements ClientConstraintDescriptorSource 
+{
+
+   private Collection<ClientConstraintDescriptor> descriptors = newList();
+
+   public ClientConstraintDescriptorImpl(
+         final Collection<ClientConstraintDescriptor> configuration) 
+   {
+     super();
+     this.descriptors = configuration;
+   }
+
+   public ClientConstraintDescriptor getConstraintDescriptor(final Class annotationClass) 
+   {
+     for (final ClientConstraintDescriptor desc : this.descriptors) 
+     {
+         if (desc.getAnnotationClass().equals(annotationClass)) 
+         {
+           return desc;
+         }
+     }
+     return null;
+   }
+
+}
\ No newline at end of file

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ClientConstraintDescriptorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ClientConstraintDescriptorImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js?rev=896767&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js (added)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js Thu Jan  7 07:13:49 2010
@@ -0,0 +1,18 @@
+// Copyright 2010 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.
+
+Tapestry.Validator.notnull = function(field, message, spec)
+{
+	Tapestry.Validator.required(field, message);
+};
\ No newline at end of file

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/main/resources/org/apache/tapestry5/beanvalidator/tapestry-beanvalidator.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java?rev=896767&r1=896766&r2=896767&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java (original)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java Thu Jan  7 07:13:49 2010
@@ -1,4 +1,4 @@
-// Copyright 2009 The Apache Software Foundation
+// Copyright 2009, 2010 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.
@@ -70,4 +70,35 @@
 
     	assertTextPresent("User Name may not be null");
     }
+    
+    public void client_validaton() throws Exception
+    {
+    	start("Client Validation Demo");
+    	
+    	click(SUBMIT);
+
+    	assertBubbleMessage("userName", "may not be null");
+    	
+    	type("userName", "igor");
+    	
+    	click(SUBMIT);
+
+    	assertBubbleMessage("password", "may not be null");
+    }
+    
+    protected final void assertBubbleMessage(String fieldId, String expected)
+    {
+        String popupId = fieldId + ":errorpopup";
+
+        waitForElementToAppear(popupId);
+
+        assertText(String.format("//div[@id='%s']/span", popupId), expected);
+    }
+    
+    protected final void waitForElementToAppear(String elementId)
+    {
+        String condition = String.format("window.$(\"%s\")", elementId);
+
+        waitForCondition(condition, PAGE_LOAD_TIMEOUT);
+    }
 }
\ No newline at end of file

Added: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ClientValidationDemo.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ClientValidationDemo.java?rev=896767&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ClientValidationDemo.java (added)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ClientValidationDemo.java Thu Jan  7 07:13:49 2010
@@ -0,0 +1,26 @@
+// Copyright 2010 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.example.testapp.pages;
+
+import org.apache.tapestry5.annotations.Persist;
+import org.apache.tapestry5.annotations.Property;
+import org.example.testapp.entities.User;
+
+public class ClientValidationDemo 
+{
+	@Property
+	@Persist
+	private User user;
+	
+}

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ClientValidationDemo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ClientValidationDemo.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/ClientValidationDemo.tml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/ClientValidationDemo.tml?rev=896767&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/ClientValidationDemo.tml (added)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/ClientValidationDemo.tml Thu Jan  7 07:13:49 2010
@@ -0,0 +1,5 @@
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
+    <body>
+        <t:beaneditform object="user"/>
+    </body>
+</html>
\ No newline at end of file

Modified: tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/Index.tml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/Index.tml?rev=896767&r1=896766&r2=896767&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/Index.tml (original)
+++ tapestry/tapestry5/trunk/tapestry-beanvalidator/src/test/webapp/Index.tml Thu Jan  7 07:13:49 2010
@@ -15,6 +15,9 @@
             <li>
                 <t:pagelink page="InjectValidatorDemo">Inject Validator Demo</t:pagelink>
             </li>
+            <li>
+                <t:pagelink page="ClientValidationDemo">Client Validation Demo</t:pagelink>
+            </li>
         </ul>
     </body>
 </html>

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java?rev=896767&r1=896766&r2=896767&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java Thu Jan  7 07:13:49 2010
@@ -24,11 +24,13 @@
 import org.apache.tapestry5.annotations.SupportsInformalParameters;
 import org.apache.tapestry5.beaneditor.BeanModel;
 import org.apache.tapestry5.corelib.internal.InternalMessages;
+import org.apache.tapestry5.internal.BeanValidationContextImpl;
 import org.apache.tapestry5.internal.beaneditor.BeanModelUtils;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.ioc.internal.util.TapestryException;
 import org.apache.tapestry5.services.BeanEditContext;
 import org.apache.tapestry5.services.BeanModelSource;
+import org.apache.tapestry5.services.BeanValidationContext;
 import org.apache.tapestry5.services.Environment;
 import org.apache.tapestry5.services.FormSupport;
 
@@ -202,6 +204,11 @@
                                                                              ex);
                 throw new TapestryException(message, resources.getLocation(), ex);
             }
+            
+            
+            //If 'object' parameter is bound to a null-value BeanValidationContext is empty. 
+            //This prevents JSR-303 javascript validators to be rendered properly .
+            refreshBeanValidationContext();
         }
 
         BeanEditContext context = new BeanEditContext()
@@ -227,6 +234,16 @@
     {
         environment.pop(BeanEditContext.class);
     }
+    
+    private void refreshBeanValidationContext()
+    {
+        if(environment.peek(BeanValidationContext.class) != null)
+        {
+            environment.pop(BeanValidationContext.class);
+            
+            environment.push(BeanValidationContext.class, new BeanValidationContextImpl(object));
+        }
+    }
 
     // For testing
     void inject(ComponentResources resources, PropertyOverrides overrides, BeanModelSource source,

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java?rev=896767&r1=896766&r2=896767&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java Thu Jan  7 07:13:49 2010
@@ -21,6 +21,7 @@
 import org.apache.tapestry5.corelib.internal.InternalFormSupport;
 import org.apache.tapestry5.corelib.mixins.RenderInformals;
 import org.apache.tapestry5.dom.Element;
+import org.apache.tapestry5.internal.BeanValidationContextImpl;
 import org.apache.tapestry5.internal.services.ComponentResultProcessorWrapper;
 import org.apache.tapestry5.internal.services.HeartbeatImpl;
 import org.apache.tapestry5.internal.util.AutofocusValidationDecorator;
@@ -310,6 +311,8 @@
 
         environment.push(FormSupport.class, formSupport);
         environment.push(ValidationTracker.class, tracker);
+        environment.push(BeanValidationContext.class, new BeanValidationContextImpl(validate));
+
 
         if (autofocus)
         {
@@ -347,7 +350,7 @@
         }
 
         writer.end(); // div
-
+        
         environment.peek(Heartbeat.class).begin();
     }
 
@@ -402,6 +405,8 @@
         formSupport = null;
 
         environment.pop(ValidationTracker.class);
+        
+        environment.pop(BeanValidationContext.class);
     }
 
     @SuppressWarnings(
@@ -415,14 +420,7 @@
 
         environment.push(ValidationTracker.class, tracker);
         environment.push(FormSupport.class, formSupport);
-        environment.push(BeanValidationContext.class, new BeanValidationContext()
-        {
-
-            public Object getObject()
-            {
-                return validate;
-            }
-        });
+        environment.push(BeanValidationContext.class, new BeanValidationContextImpl(validate));
 
         Heartbeat heartbeat = new HeartbeatImpl();
 

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/BeanValidationContextImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/BeanValidationContextImpl.java?rev=896767&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/BeanValidationContextImpl.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/BeanValidationContextImpl.java Thu Jan  7 07:13:49 2010
@@ -0,0 +1,37 @@
+// Copyright 2010 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;
+
+import org.apache.tapestry5.services.BeanValidationContext;
+
+public class BeanValidationContextImpl implements BeanValidationContext
+{
+    private Object bean;
+
+    public BeanValidationContextImpl(Object bean)
+    {
+        this.bean = bean;
+    }
+
+    public Class getBeanType()
+    {
+        return bean==null?null:bean.getClass();
+    }
+
+    public Object getBeanInstance()
+    {
+        return bean;
+    }
+
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/BeanValidationContextImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/BeanValidationContextImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/BeanValidationContext.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/BeanValidationContext.java?rev=896767&r1=896766&r2=896767&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/BeanValidationContext.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/BeanValidationContext.java Thu Jan  7 07:13:49 2010
@@ -1,4 +1,4 @@
-// Copyright 2009 The Apache Software Foundation
+// Copyright 2009, 2010 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.
@@ -21,7 +21,12 @@
 public interface BeanValidationContext
 {
     /**
+     * Returns the type of the object to validate. This method is needed for client side validation.
+     */
+    Class getBeanType();
+    
+    /**
      * Return the object to validate.
      */
-    Object getObject();
+    Object getBeanInstance();
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/BeanEditorTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/BeanEditorTest.java?rev=896767&r1=896766&r2=896767&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/BeanEditorTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/BeanEditorTest.java Thu Jan  7 07:13:49 2010
@@ -14,6 +14,10 @@
 
 package org.apache.tapestry5.corelib.components;
 
+import static org.easymock.EasyMock.isA;
+
+import static org.easymock.EasyMock.eq;
+
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.PropertyOverrides;
 import org.apache.tapestry5.beaneditor.BeanModel;
@@ -23,6 +27,7 @@
 import org.apache.tapestry5.ioc.internal.util.TapestryException;
 import org.apache.tapestry5.services.BeanEditContext;
 import org.apache.tapestry5.services.BeanModelSource;
+import org.apache.tapestry5.services.BeanValidationContext;
 import org.apache.tapestry5.services.Environment;
 import org.apache.tapestry5.test.TapestryTestCase;
 import org.easymock.EasyMock;
@@ -154,6 +159,62 @@
         train_getOverrideMessages(overrides, messages);
 
         expect(model.newInstance()).andReturn(data);
+        
+        expect(env.peek(eq(BeanValidationContext.class))).andReturn(null);
+        
+        expect(model.getBeanType()).andReturn(RegistrationData.class);
+
+        BeanEditContext ctxt = new BeanEditContext()
+        {
+            public Class<?> getBeanClass()
+            {
+                return RegistrationData.class;
+            }
+
+            public <T extends Annotation> T getAnnotation(Class<T> type)
+            {
+                return null;
+            }
+        };
+
+        expect(env.push(eq(BeanEditContext.class), contextEq())).andReturn(ctxt);
+        replay();
+
+        BeanEditor component = new BeanEditor();
+
+        component.inject(resources, overrides, source, env);
+
+        component.doPrepare();
+
+        verify();
+    }
+    
+    @Test
+    public void refresh_bean_validation_context()
+    {
+        ComponentResources resources = mockComponentResources();
+        BeanModelSource source = mockBeanModelSource();
+        BeanModel model = mockBeanModel();
+        Environment env = mockEnvironment();
+        RegistrationData data = new RegistrationData();
+        Messages messages = mockMessages();
+        PropertyOverrides overrides = mockPropertyOverrides();
+        BeanValidationContext beanValidationContext = newMock(BeanValidationContext.class);
+
+        train_getBoundType(resources, "object", RegistrationData.class);
+
+        train_createEditModel(source, RegistrationData.class, messages, model);
+
+        train_getOverrideMessages(overrides, messages);
+
+        expect(model.newInstance()).andReturn(data);
+        
+        expect(env.peek(eq(BeanValidationContext.class))).andReturn(beanValidationContext);
+        
+        expect(env.pop(eq(BeanValidationContext.class))).andReturn(beanValidationContext);
+        
+        expect(env.push(eq(BeanValidationContext.class), isA(BeanValidationContext.class))).andReturn(beanValidationContext);
+        
         expect(model.getBeanType()).andReturn(RegistrationData.class);
 
         BeanEditContext ctxt = new BeanEditContext()
@@ -169,7 +230,7 @@
             }
         };
 
-        expect(env.push(EasyMock.eq(BeanEditContext.class), contextEq())).andReturn(ctxt);
+        expect(env.push(eq(BeanEditContext.class), contextEq())).andReturn(ctxt);
         replay();
 
         BeanEditor component = new BeanEditor();



Re: svn commit: r896767 - in /tapestry/tapestry5/trunk: tapestry-beanvalidator/src/main/java/org/apache/tapestry5/beanvalidator/ tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/ tapestry-beanvalidator/src/main/resources/ ta...

Posted by "Thiago H. de Paula Figueiredo" <th...@gmail.com>.
Hi, Igor!

Aren't you recreating ValidationConstraintGenerator here? If you associate  
the @NotNull with the required validation through a contributed  
ValidationConstraintGenerator, for example, it will automatically add this  
validation at the client side. What do you think?

-- 
Thiago H. de Paula Figueiredo
Independent Java, Apache Tapestry 5 and Hibernate consultant, developer,  
and instructor
Owner, software architect and developer, Ars Machina Tecnologia da  
Informação Ltda.
http://www.arsmachina.com.br

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org