I've created a custom validator to validate dateTimefield. My problem is that I can't add it to the datetimefield variable
The method add(
IValidator<? super Date>
) in the typeFormComponent<Date>
is not applicable for the arguments (DateTimeFieldValidator)
This is the error I'm getting.
Is there any standard way to validate DateTimeField?
package validators;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import org.apache.wicket.extensions.yui.calendar.DateTimeField;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
public class DateTimeFieldValidator implements IValidator<DateTimeField> {
/**
*
*/
private static final long serialVersionUID = 2342344609244L;
public DateTimeFieldValidator() {
}
private void error(IValidatable<DateTimeField> validatable, String errorKey) {
ValidationError error = new ValidationError();
error.addMessageKey(getClass().getSimpleName() + "." + errorKey);
validatable.error(error);
}
public void validate(IValidatable<DateTimeField> validatable) {
DateTimeField dateTime = (DateTimeField) validatable.getValue();
if ( dateTime== null){
error(validatable, "invalid.datetime");
}
else{
if( dateTime.getHours()!=null){
if( dateTime.getHours()>12 || dateTime.getHours()<0){
error(validatable, "invalid.hour");
}
}
else{
error(validatable, "invalid.hour");
}
if(dateTime.getMinutes()!=null){
if( dateTime.getMinutes() > 60 ){
error(validatable, "invalid.hour");
}
}else {
error(validatable, "invalid.minutes");
}
if( dateTime.getDate() == null ){
error(validatable, "invalid.date");
}
}
}
boolean isLegalDate(String s) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setLenient(false);
return sdf.parse(s, new ParsePosition(0)) != null;
}
}
This is how I'm adding the validator.
startDateTimeField.add(new DateTimeFieldValidator());
Your DateTimeFieldValidator must implement IValidator<Date>
instead of IValidator<DateTimeField>
I end up validating the datetimefield following way .. And find out the datetimefield( yui ) have built in validation - which actually take care of the all the basic validations. All you have to do is put a XXX.properties file in the folder -
you can also add your own error key and message - like I used startDate.after.enddate
IFormValidator validator = new AbstractFormValidator() {
/**
*
*/
private static final long serialVersionUID = -3252346839511722L;
public FormComponent<?>[] getDependentFormComponents() {
return new FormComponent[] { startField, endField };
}
ValidationError error = new ValidationError();
public void validate(Form<?> form) {
Date startDate = (Date) startField.getConvertedInput();
if(endField.isEnabled()){
Date endDate = (Date) endField.getConvertedInput();
if (endDate.before(startDate)){
error.addMessageKey(getClass().getSimpleName() + "startDate.after.enddate");
startField.error(error);
}
}
}
};
logForm.add(validator );