On Tue, Mar 10, 2009 at 7:35 AM, taha siddiqi <[email protected]> wrote:
> Hi, > > I was working with Hibernate-validator and thought of sharing the code. > Taha: I thought the ClassValidator will handle all the different cases and annotations for you, see line #89 http://code.google.com/p/perfbench/source/browse/trunk/perfbench/wicket-jpa/src/main/java/wicketjpa/wicket/EditBorder.java#89 Is there any advantage of mapping each type (e.g. Min, Max, CreditCardNumber) to Wicket built-in validators ? > > It is a listener as well as a behavior which can be used at > application level as well as with individual > components. > > It is heavily inspired from wicket-jpa and wicket-hibernate > projects... I just tried some changes... > > import java.util.Map; > import java.util.Arrays; > import java.util.List; > import java.util.Date; > import java.util.concurrent.ConcurrentHashMap; > import javax.persistence.Entity; > import javax.persistence.Embeddable; > import java.lang.reflect.Field; > import java.lang.reflect.Method; > import java.lang.annotation.Annotation; > import java.lang.reflect.AnnotatedElement; > > import org.hibernate.validator.NotNull; > import org.hibernate.validator.Length; > import org.hibernate.validator.NotEmpty; > import org.hibernate.validator.Min; > import org.hibernate.validator.Pattern; > import org.hibernate.validator.Max; > import org.hibernate.validator.Range; > import org.hibernate.validator.Past; > import org.hibernate.validator.Future; > import org.hibernate.validator.Email; > import org.hibernate.validator.CreditCardNumber; > > import org.apache.wicket.validation.validator.StringValidator; > import org.apache.wicket.validation.validator.PatternValidator; > import org.apache.wicket.validation.validator.NumberValidator; > import org.apache.wicket.validation.validator.EmailAddressValidator; > import org.apache.wicket.validation.validator.CreditCardValidator; > import org.apache.wicket.validation.validator.DateValidator; > > import org.hibernate.validator.ClassValidator; > import org.hibernate.validator.InvalidValue; > import org.apache.wicket.behavior.AbstractBehavior; > import org.apache.wicket.application.IComponentOnBeforeRenderListener; > import org.apache.wicket.application.IComponentInstantiationListener; > import org.apache.wicket.Component; > import org.apache.wicket.markup.ComponentTag; > import org.apache.wicket.feedback.FeedbackMessage; > import org.apache.wicket.validation.IValidator; > import org.apache.wicket.validation.IValidatable; > import org.apache.wicket.model.IModel; > import org.apache.wicket.model.CompoundPropertyModel; > import org.apache.wicket.markup.html.form.FormComponent; > import org.apache.wicket.validation.ValidationError; > import org.apache.wicket.validation.validator.StringValidator; > import org.apache.wicket.AttributeModifier; > import org.apache.wicket.model.Model; > import org.slf4j.Logger; > import org.slf4j.LoggerFactory; > > /** > * A validator to validate elements having > * hibernate validators annotated. > */ > public class HibernateValidator extends AbstractBehavior > implements IComponentOnBeforeRenderListener { > > private static Logger logger = LoggerFactory.getLogger( > HibernateValidator.class ); > > public final void onBeforeRender( Component c ){ > if( !c.hasBeenRendered() ){ > configure(c); > } > } > > @Override > public void beforeRender( Component c ){ > super.beforeRender( c ); > configure( c ); > } > > @SuppressWarnings( "unchecked" ) > private boolean configure( Component c ){ > if( !isApplicableFor( c ) ){ > return false; > } > > FormComponent fc = (FormComponent)c; > CompoundPropertyModel cpm = > (CompoundPropertyModel)fc.getInnermostModel(); > > Class clazz = cpm.getObject().getClass(); > if( clazz.isAnnotationPresent( Entity.class ) || > clazz.isAnnotationPresent( Embeddable.class ) ){ > > try { > AnnotatedElement element = (AnnotatedElement) > > org.apache.wicket.util.lang.PropertyResolver.getPropertyGetter( > fc.getId(), cpm.getObject() ); > > addValidator( fc, element ); > }catch( Exception ex ){ > } > } > > return true; > } > > protected void addValidator( FormComponent fc, AnnotatedElement element > ){ > //@NotNull > if( element.isAnnotationPresent( NotNull.class ) || > element.isAnnotationPresent( NotEmpty.class ) ){ > fc.setRequired( true ); > } > > //@Length( min, max ) > if( element.isAnnotationPresent( Length.class ) ){ > Length l = element.getAnnotation( Length.class ); > > if( l.min() == 0 && l.max() < Integer.MAX_VALUE ){ //TODO: > replace with max int > fc.add( StringValidator.maximumLength( l.max() ) ); > }else if( l.min() != 0 && l.max() < Integer.MAX_VALUE ){ > fc.add( StringValidator.lengthBetween( l.min(), l.max() ) ); > }else if( l.min() != 0 && l.max() >= Integer.MAX_VALUE ){ > fc.add( StringValidator.minimumLength( l.min() ) ); > } > } > > //@Max( value ) > if( element.isAnnotationPresent( Max.class ) ){ > Max max = element.getAnnotation( Max.class ); > fc.add( NumberValidator.maximum( max.value() ) ); > } > > //@Min( value ) > if( element.isAnnotationPresent( Min.class ) ){ > Min min = element.getAnnotation( Min.class ); > fc.add( NumberValidator.minimum( min.value() ) ); > } > > //@Range( min, max ) > if( element.isAnnotationPresent( Range.class ) ){ > Range range = element.getAnnotation( Range.class ); > fc.add( NumberValidator.range( range.min(), range.max() ) ); > } > > //@Pattern( regexp ) > if( element.isAnnotationPresent( Pattern.class ) ){ > Pattern pattern = element.getAnnotation( Pattern.class ); > fc.add( new PatternValidator( pattern.regex() ) ); > } > > //@Past > if( element.isAnnotationPresent( Past.class ) ){ > Past p = element.getAnnotation( Past.class ); > fc.add( DateValidator.maximum( new Date() ) ); > } > > //@Future > if( element.isAnnotationPresent( Future.class ) ){ > fc.add( DateValidator.minimum( new Date() ) ); > } > > //@Email > if( element.isAnnotationPresent( Email.class ) ){ > fc.add( EmailAddressValidator.getInstance() ); > } > > //@CreditCardNumber > if( element.isAnnotationPresent( CreditCardNumber.class ) ){ > fc.add( new CreditCardValidator() ); > } > } > > private boolean isApplicableFor( Component c ){ > if( ! (c instanceof FormComponent) ){ > return false; > } > > IModel model = c.getInnermostModel(); > if( model == null || model.getObject() == null || > !CompoundPropertyModel.class.isAssignableFrom( model.getClass() > ) ){ > return false; > } > > return true; > } > } > > regards > Taha > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
