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() {