Hi,
I was working with Hibernate-validator and thought of sharing the code.
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]