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 <[email protected]> Authored: Wed Feb 28 10:37:36 2018 -0600 Committer: Matt Benson <[email protected]> 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() {
