|
| 1 | +package org.javawebstack.validator.rule; |
| 2 | + |
| 3 | +import org.javawebstack.abstractdata.AbstractElement; |
| 4 | +import org.javawebstack.validator.ValidationContext; |
| 5 | + |
| 6 | +import java.lang.annotation.ElementType; |
| 7 | +import java.lang.annotation.Retention; |
| 8 | +import java.lang.annotation.RetentionPolicy; |
| 9 | +import java.lang.annotation.Target; |
| 10 | +import java.lang.reflect.Field; |
| 11 | +import java.util.Locale; |
| 12 | + |
| 13 | +@Target(ElementType.FIELD) |
| 14 | +@Retention(RetentionPolicy.RUNTIME) |
| 15 | +public @interface CharsetRule { |
| 16 | + |
| 17 | + String value() default ""; |
| 18 | + boolean upper() default false; |
| 19 | + boolean lower() default false; |
| 20 | + boolean numeric() default false; |
| 21 | + boolean accents() default false; |
| 22 | + |
| 23 | + class Validator implements ValidationRule { |
| 24 | + |
| 25 | + private static final String ALPHA = "abcdefghijklmnopqrstuvwxyz"; |
| 26 | + private static final String ACCENTS = "äëïöüéàèùâêîôûç"; |
| 27 | + |
| 28 | + private final String charset; |
| 29 | + |
| 30 | + public Validator(CharsetRule rule) { |
| 31 | + this(makeCharset(rule)); |
| 32 | + } |
| 33 | + |
| 34 | + public Validator(String charset) { |
| 35 | + this.charset = charset; |
| 36 | + } |
| 37 | + |
| 38 | + public Validator(String[] params) { |
| 39 | + this(params.length > 0 ? params[0] : ""); |
| 40 | + } |
| 41 | + |
| 42 | + public String validate(ValidationContext context, Field field, AbstractElement value) { |
| 43 | + if (value == null || value.isNull()) |
| 44 | + return null; |
| 45 | + if (!value.isPrimitive()) |
| 46 | + return "Not a string value"; |
| 47 | + char[] chars = value.string().toCharArray(); |
| 48 | + for(int i=0; i<chars.length; i++) { |
| 49 | + char c = chars[i]; |
| 50 | + if(!charset.contains(String.valueOf(c))) { |
| 51 | + return String.format("Forbidden character '%c' at position %d", c, i); |
| 52 | + } |
| 53 | + } |
| 54 | + return null; |
| 55 | + } |
| 56 | + |
| 57 | + private static String makeCharset(CharsetRule rule) { |
| 58 | + StringBuilder sb = new StringBuilder(rule.value()); |
| 59 | + if(rule.lower()) { |
| 60 | + sb.append(ALPHA); |
| 61 | + if(rule.accents()) |
| 62 | + sb.append(ACCENTS); |
| 63 | + } |
| 64 | + if(rule.upper()) { |
| 65 | + sb.append(ALPHA.toUpperCase(Locale.ROOT)); |
| 66 | + if(rule.accents()) |
| 67 | + sb.append(ACCENTS.toUpperCase(Locale.ROOT)); |
| 68 | + } |
| 69 | + if(rule.numeric()) { |
| 70 | + sb.append("1234567890"); |
| 71 | + } |
| 72 | + return sb.toString(); |
| 73 | + } |
| 74 | + |
| 75 | + } |
| 76 | + |
| 77 | +} |
0 commit comments