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/02/28 16:37:43 UTC

bval git commit: abstract Meta#getParent()

Repository: bval
Updated Branches:
  refs/heads/bv2 3a5c61609 -> b9db3f598


abstract Meta#getParent()


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

Branch: refs/heads/bv2
Commit: b9db3f598350ac22e72d9113ccc30136fff320c6
Parents: 3a5c616
Author: Matt Benson <mb...@apache.org>
Authored: Wed Feb 28 10:37:36 2018 -0600
Committer: Matt Benson <mb...@apache.org>
Committed: Wed Feb 28 10:37:36 2018 -0600

----------------------------------------------------------------------
 .../org/apache/bval/jsr/metadata/Liskov.java    |  2 +-
 .../java/org/apache/bval/jsr/metadata/Meta.java | 56 +++++++++++++++++---
 2 files changed, 51 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/b9db3f59/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
index 3506873..1a71c18 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
@@ -138,7 +138,7 @@ class Liskov {
     private static ElementKind getContainer(Meta<?> meta) {
         Meta<?> m = meta;
         while (m.getElementType() == ElementType.TYPE_USE) {
-            m = ((Meta.ForContainerElement) m).getParent();
+            m = m.getParent();
         }
         switch (m.getElementType()) {
         case METHOD:

http://git-wip-us.apache.org/repos/asf/bval/blob/b9db3f59/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Meta.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Meta.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Meta.java
index ece48b0..7d4082b 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Meta.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Meta.java
@@ -18,9 +18,6 @@
  */
 package org.apache.bval.jsr.metadata;
 
-import static java.util.Arrays.asList;
-import static java.util.Collections.singleton;
-
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.lang.reflect.AnnotatedElement;
@@ -32,11 +29,14 @@ import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Parameter;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Objects;
 
 import javax.validation.constraintvalidation.ValidationTarget;
 
+import org.apache.bval.util.Lazy;
 import org.apache.bval.util.Validate;
 
 /**
@@ -92,9 +92,15 @@ public abstract class Meta<E extends AnnotatedElement> {
         public String getName() {
             return getHost().getName();
         }
+
+        @Override
+        public Meta<?> getParent() {
+            return null;
+        }
     }
 
     public static abstract class ForMember<M extends Member & AnnotatedElement> extends Meta<M> {
+        private final Lazy<Meta<Class<?>>> parent = new Lazy<>(() -> new Meta.ForClass(getDeclaringClass()));
 
         protected ForMember(M host, ElementType elementType) {
             super(host, elementType);
@@ -104,6 +110,11 @@ public abstract class Meta<E extends AnnotatedElement> {
         public Class<?> getDeclaringClass() {
             return getHost().getDeclaringClass();
         }
+
+        @Override
+        public Meta<Class<?>> getParent() {
+            return parent.get();
+        }
     }
 
     public static class ForField extends ForMember<Field> {
@@ -174,10 +185,13 @@ public abstract class Meta<E extends AnnotatedElement> {
         }
     }
 
-    public static class ForCrossParameter<E extends Executable> extends Meta.ForExecutable<E> {
+    public static class ForCrossParameter<E extends Executable> extends Meta<E> {
+
+        private final Meta<E> parent;
 
         public ForCrossParameter(Meta<E> parent) {
             super(parent.getHost(), parent.getElementType());
+            this.parent = parent;
         }
 
         @Override
@@ -199,11 +213,27 @@ public abstract class Meta<E extends AnnotatedElement> {
         public String describeHost() {
             return String.format("%s of %s", getName(), getHost());
         }
+
+        @Override
+        public Meta<E> getParent() {
+            return parent;
+        }
+
+        @Override
+        public Class<?> getDeclaringClass() {
+            return getHost().getDeclaringClass();
+        }
+
+        @Override
+        public AnnotatedType getAnnotatedType() {
+            return getHost().getAnnotatedReturnType();
+        }
     }
 
     public static class ForParameter extends Meta<Parameter> {
 
         private final String name;
+        private final Lazy<Meta<? extends Executable>> parent = new Lazy<>(this::computeParent);
 
         public ForParameter(Parameter host, String name) {
             super(host, ElementType.PARAMETER);
@@ -212,7 +242,7 @@ public abstract class Meta<E extends AnnotatedElement> {
 
         @Override
         public Collection<ValidationTarget> getValidationTargets() {
-            return asList(ValidationTarget.values());
+            return Arrays.asList(ValidationTarget.values());
         }
 
         @Override
@@ -238,6 +268,17 @@ public abstract class Meta<E extends AnnotatedElement> {
         public String describeHost() {
             return String.format("%s of %s", getName(), getHost().getDeclaringExecutable());
         }
+
+        @Override
+        public Meta<? extends Executable> getParent() {
+            return parent.get();
+        }
+
+        private Meta<? extends Executable> computeParent() {
+            final Executable exe = getHost().getDeclaringExecutable();
+            return exe instanceof Method ? new Meta.ForMethod((Method) exe)
+                : new Meta.ForConstructor((Constructor<?>) exe);
+        }
     }
 
     public static class ForContainerElement extends Meta<AnnotatedType> {
@@ -280,6 +321,7 @@ public abstract class Meta<E extends AnnotatedElement> {
             return String.format("%s of %s", key, parent);
         }
 
+        @Override
         public Meta<?> getParent() {
             return parent;
         }
@@ -309,10 +351,12 @@ public abstract class Meta<E extends AnnotatedElement> {
     public abstract AnnotatedType getAnnotatedType();
 
     public abstract String getName();
+    
+    public abstract Meta<?> getParent();
 
     public Collection<ValidationTarget> getValidationTargets() {
         // todo: cache for perf?
-        return singleton(getValidationTarget());
+        return Collections.singleton(getValidationTarget());
     }
 
     public ValidationTarget getValidationTarget() {