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]
>
>

Reply via email to