reject collision of getter/method in custom metadata
Project: http://git-wip-us.apache.org/repos/asf/bval/repo Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/32e4b4c0 Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/32e4b4c0 Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/32e4b4c0 Branch: refs/heads/bv2 Commit: 32e4b4c03e7d8dda0a1cf3f78406590d88b0ca82 Parents: 237fb50 Author: Matt Benson <[email protected]> Authored: Tue Mar 27 11:48:31 2018 -0500 Committer: Matt Benson <[email protected]> Committed: Tue Mar 27 11:48:31 2018 -0500 ---------------------------------------------------------------------- .../apache/bval/jsr/metadata/MetadataBuilders.java | 15 +++++++++++++++ .../main/java/org/apache/bval/jsr/util/Methods.java | 14 ++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bval/blob/32e4b4c0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataBuilders.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataBuilders.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataBuilders.java index 9b8a33b..82de16d 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataBuilders.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataBuilders.java @@ -23,6 +23,10 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import javax.validation.ValidationException; + +import org.apache.bval.jsr.util.Methods; +import org.apache.bval.util.Exceptions; import org.apache.bval.util.Validate; public class MetadataBuilders { @@ -32,6 +36,7 @@ public class MetadataBuilders { public <T> void registerCustomBuilder(Class<T> bean, MetadataBuilder.ForBean<T> builder) { Validate.notNull(bean, "bean"); Validate.notNull(builder, "builder"); + validateCustomBuilder(bean, builder); beanBuilders.computeIfAbsent(bean, c -> new ArrayList<>()).add(builder); } @@ -44,4 +49,14 @@ public class MetadataBuilders { public Set<Class<?>> getCustomizedTypes() { return beanBuilders.keySet(); } + + private <T> void validateCustomBuilder(Class<T> bean, MetadataBuilder.ForBean<T> builder) { + final Meta<Class<T>> meta = new Meta.ForClass<>(bean); + final Set<String> propertyNames = builder.getGetters(meta).keySet(); + builder.getMethods(meta).keySet().stream().map(Signature::getName).filter(Methods::isGetter) + .map(Methods::propertyName).forEach(pn -> { + Exceptions.raiseIf(propertyNames.contains(pn), ValidationException::new, + "%s user metadata cannot specify both method and getter elements for %s", f -> f.args(bean, pn)); + }); + } } http://git-wip-us.apache.org/repos/asf/bval/blob/32e4b4c0/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java ---------------------------------------------------------------------- diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java b/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java index ce83c73..d0d5bdb 100644 --- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java +++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/Methods.java @@ -39,10 +39,20 @@ public final class Methods { return !Void.TYPE.equals(m.getReturnType()) && m.getName().startsWith("get"); } + public static boolean isGetter(String methodName) { + Validate.notNull(methodName); + final int len = methodName.length(); + return len > 2 && methodName.startsWith("is") || len > 3 && methodName.startsWith("get"); + } + public static String propertyName(Method getter) { Validate.isTrue(isGetter(getter), "%s is not a getter", getter); - final String name = getter.getName(); - final String suffix = name.startsWith("is") ? name.substring(2) : name.substring(3); + return propertyName(getter.getName()); + } + + public static String propertyName(String methodName) { + Validate.isTrue(isGetter(methodName), "%s does not represent a property getter"); + final String suffix = methodName.startsWith("is") ? methodName.substring(2) : methodName.substring(3); return Introspector.decapitalize(suffix); }
