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/29 22:55:30 UTC

bval git commit: refactor and permit unwrapping if a single maximally specific unwrapByDefault ValueExtractor is found when the constraint has DEFAULT valueUnwrapping

Repository: bval
Updated Branches:
  refs/heads/bv2 4dbe0936b -> 648bebe51


refactor and permit unwrapping if a single maximally specific unwrapByDefault ValueExtractor is found when the constraint has DEFAULT valueUnwrapping


Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/648bebe5
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/648bebe5
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/648bebe5

Branch: refs/heads/bv2
Commit: 648bebe5133b31396d723ef8fe10a63d25650a2e
Parents: 4dbe093
Author: Matt Benson <mb...@apache.org>
Authored: Thu Mar 29 17:55:23 2018 -0500
Committer: Matt Benson <mb...@apache.org>
Committed: Thu Mar 29 17:55:23 2018 -0500

----------------------------------------------------------------------
 .../jsr/valueextraction/ValueExtractors.java    | 74 +++++++++++---------
 1 file changed, 42 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/648bebe5/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java b/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java
index f635c92..430f267 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java
@@ -73,6 +73,43 @@ public class ValueExtractors {
             this.containerElementKey = containerElementKey;
             this.valueExtractor = valueExtractor;
         }
+        
+        UnwrappingInfo inTermsOf(Class<?> containerClass) {
+            final Class<?> keyContainer = containerElementKey.getContainerClass();
+            if (keyContainer.equals(containerClass)) {
+                return this;
+            }
+            Validate.validState(keyContainer.isAssignableFrom(containerClass), "Cannot render %s in terms of %s",
+                containerElementKey, containerClass);
+
+            final ContainerElementKey key;
+
+            if (containerElementKey.getTypeArgumentIndex() == null) {
+                key = new ContainerElementKey(containerClass, null);
+            } else {
+                Integer typeArgumentIndex = null;
+                final Map<TypeVariable<?>, Type> typeArguments =
+                    TypeUtils.getTypeArguments(containerClass, keyContainer);
+                Type t = typeArguments
+                    .get(keyContainer.getTypeParameters()[containerElementKey.getTypeArgumentIndex().intValue()]);
+                while (t instanceof TypeVariable<?>) {
+                    final TypeVariable<?> var = (TypeVariable<?>) t;
+                    if (containerClass.equals(var.getGenericDeclaration())) {
+                        typeArgumentIndex =
+                            Integer.valueOf(ObjectUtils.indexOf(containerClass.getTypeParameters(), var));
+                        break;
+                    }
+                    t = typeArguments.get(t);
+                }
+                key = new ContainerElementKey(containerClass, typeArgumentIndex);
+            }
+            return new UnwrappingInfo(key, valueExtractor);
+        }
+
+        @Override
+        public String toString() {
+            return String.format("%s:%s", containerElementKey, valueExtractor);
+        }
     }
 
     public static final ValueExtractors EMPTY =
@@ -279,45 +316,18 @@ public class ValueExtractors {
 
         final Set<UnwrappingInfo> unwrapping = allValueExtractors.entrySet().stream()
             .filter(e -> e.getKey().getContainerClass().isAssignableFrom(containerClass))
+            .filter(e -> valueUnwrapping == ValidateUnwrappedValue.UNWRAP || isUnwrapByDefault(e.getValue()))
             .map(e -> new UnwrappingInfo(e.getKey(), e.getValue())).collect(Collectors.toSet());
 
         final Optional<UnwrappingInfo> result =
-            maximallySpecific(unwrapping, u -> u.containerElementKey.getContainerClass());
+            maximallySpecific(unwrapping, u -> u.containerElementKey.getContainerClass())
+                .map(u -> u.inTermsOf(containerClass));
 
-        if (result.isPresent()) {
-            if (valueUnwrapping == ValidateUnwrappedValue.UNWRAP || isUnwrapByDefault(result.get().valueExtractor)) {
-                return result
-                    .map(u -> new UnwrappingInfo(translateTo(containerClass, u.containerElementKey), u.valueExtractor));
-            }
-        } else if (valueUnwrapping == ValidateUnwrappedValue.UNWRAP) {
+        if (!result.isPresent() && valueUnwrapping == ValidateUnwrappedValue.UNWRAP) {
             Exceptions.raise(ConstraintDeclarationException::new, "Could not determine %s for %s",
                 ValueExtractor.class.getSimpleName(), containerClass);
         }
-        return Optional.empty();
-    }
-
-    private static ContainerElementKey translateTo(Class<?> containerClass, ContainerElementKey key) {
-        final Class<?> keyContainer = key.getContainerClass();
-        if (keyContainer.equals(containerClass)) {
-            return key;
-        }
-        Validate.validState(keyContainer.isAssignableFrom(containerClass), "Cannot render %s in terms of %s", key,
-            containerClass);
-        if (key.getTypeArgumentIndex() == null) {
-            return new ContainerElementKey(containerClass, null);
-        }
-        Integer typeArgumentIndex = null;
-        final Map<TypeVariable<?>, Type> typeArguments = TypeUtils.getTypeArguments(containerClass, keyContainer);
-        Type t = typeArguments.get(keyContainer.getTypeParameters()[key.getTypeArgumentIndex().intValue()]);
-        while (t instanceof TypeVariable<?>) {
-            final TypeVariable<?> var = (TypeVariable<?>) t;
-            if (containerClass.equals(var.getGenericDeclaration())) {
-                typeArgumentIndex = Integer.valueOf(ObjectUtils.indexOf(containerClass.getTypeParameters(), var));
-                break;
-            }
-            t = typeArguments.get(t);
-        }
-        return new ContainerElementKey(containerClass, typeArgumentIndex);
+        return result;
     }
 
     private void populate(Supplier<Map<ContainerElementKey, ValueExtractor<?>>> target) {