You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by mb...@apache.org on 2018/03/27 16:49:05 UTC
[5/5] bval git commit: reject collision of getter/method in custom
metadata
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 <mb...@apache.org>
Authored: Tue Mar 27 11:48:31 2018 -0500
Committer: Matt Benson <mb...@apache.org>
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);
}