import java.util.ArrayList;
import java.util.Collection;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import com.aerohive.core.annotation.Email;
public class EmailValidator implements ConstraintValidator<Email, String>{
private String separator;
@Override
public void initialize(Email constraintAnnotation) {
switch (constraintAnnotation.separator()) {
case SEMICOLON:
default:
this.separator = ";";
break;
}
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(value == null) {
return true;
}
Collection<String> invalidEmails = new ArrayList<> ();
for (StringTokenizer token = new StringTokenizer(value.trim(), separator); token.hasMoreTokens();) {
String email = token.nextToken();
if(!isValidEmailAddress(email)) {
invalidEmails.add(email);
}
}
if(!invalidEmails.isEmpty()) {
context.buildConstraintViolationWithTemplate("Invalid emails: " + invalidEmails).addConstraintViolation();
return false;
}
return true;
}
private boolean isValidEmailAddress(String emailAddress) {
Pattern p = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
Matcher m = p.matcher(emailAddress);
return m.matches();
}
}
@Target({ ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {EmailValidator.class})
@Documented
public @interface Email {
String message() default "{invalid.email}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
EmailSeparator separator() default EmailSeparator.SEMICOLON;
}