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);
     }