package com.akjava.lib.common.tag; import com.google.common.base.CharMatcher; import com.google.common.base.Predicate; import com.google.common.base.Strings; import com.google.common.collect.MapConstraint; public class ValidAttributeMapConstraint implements MapConstraint<String,String>{ private ValidAttributeMapConstraint(){} private static ValidAttributeMapConstraint validAttributeMapConstraint; public static ValidAttributeMapConstraint getValidAttributeMapConstraint(){ if(validAttributeMapConstraint==null){ validAttributeMapConstraint=new ValidAttributeMapConstraint(); } return validAttributeMapConstraint; } public final static CharMatcher AZ=CharMatcher.inRange('A', 'Z').or(CharMatcher.inRange('a', 'z')); public final static CharMatcher IDENTIFIER_CHAR = CharMatcher.is('_') .or(AZ) .or(CharMatcher.inRange('0', '9')) .precomputed(); @Override public void checkKeyValue(String key, String value) { if(!getValidAttributePredicate().apply(key)){ throw new IllegalArgumentException("invalid key:"+key); } } public ValidAttributePredicate getValidAttributePredicate(){ return ValidAttributePredicate.INSTANCE; } public enum ValidAttributePredicate implements Predicate<String>{ INSTANCE; @Override public boolean apply(String input) { if(Strings.isNullOrEmpty(input)){ return false; } if(!AZ.matches(input.charAt(0))){ return false; } return IDENTIFIER_CHAR.matchesAllOf(input); } } }