This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new b20be91 ClassInfo refactoring.
b20be91 is described below
commit b20be910d81a41a8f458dc733780fb5deb01c7af
Author: JamesBognar <[email protected]>
AuthorDate: Sun Jan 23 17:00:49 2022 -0500
ClassInfo refactoring.
---
.../src/main/java/org/apache/juneau/ClassMeta.java | 26 ++++++-------
.../src/main/java/org/apache/juneau/Context.java | 43 +++++++++++++---------
.../main/java/org/apache/juneau/MetaProvider.java | 31 ++++++++++++----
.../java/org/apache/juneau/swap/BuilderSwap.java | 22 +++++------
.../java/org/apache/juneau/xml/XmlBeanMeta.java | 18 ++++-----
5 files changed, 81 insertions(+), 59 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 3aeb4b1..f1da906 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -622,20 +622,21 @@ public final class ClassMeta<T> implements Type {
invocationHandler = new
BeanProxyInvocationHandler<T>(beanMeta);
if (bc != null) {
- for (Bean b : bc.getAnnotations(Bean.class, c))
{
- if (b.dictionary().length != 0)
- beanRegistry = new
BeanRegistry(bc, null, b.dictionary());
-
+ bc.getAnnotations(Bean.class, c, x -> {
+ if (x.dictionary().length != 0)
+ beanRegistry = new
BeanRegistry(bc, null, x.dictionary());
// This could be a non-bean POJO with a
type name.
- if (dictionaryName == null && !
b.typeName().isEmpty())
- dictionaryName = b.typeName();
- }
+ if (dictionaryName == null && !
x.typeName().isEmpty())
+ dictionaryName = x.typeName();
+ });
}
- if (example == null && bc != null)
- for (Example e :
bc.getAnnotations(Example.class, c))
- if (! e.value().isEmpty())
- example = e.value();
+ if (example == null && bc != null) {
+ bc.getAnnotations(Example.class, c, x -> {
+ if (! x.value().isEmpty())
+ example = x.value();
+ });
+ }
if (example == null) {
switch(cc) {
@@ -715,8 +716,7 @@ public final class ClassMeta<T> implements Type {
private void findSwaps(List<ObjectSwap> l, BeanContext bc) {
if (bc != null)
- for (Swap swap : bc.getAnnotations(Swap.class,
innerClass))
- l.add(createSwap(swap));
+ bc.getAnnotations(Swap.class, innerClass, x->
l.add(createSwap(x)));
ObjectSwap defaultSwap = DefaultSwaps.find(ci);
if (defaultSwap == null)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
index 82e563c..b39c96f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
@@ -928,34 +928,41 @@ public abstract class Context implements MetaProvider {
private static final boolean DISABLE_ANNOTATION_CACHING = !
Boolean.getBoolean("juneau.disableAnnotationCaching");
- private TwoKeyConcurrentCache<Class<?>,Class<? extends
Annotation>,List<Annotation>> classAnnotationCache = new
TwoKeyConcurrentCache<>(DISABLE_ANNOTATION_CACHING);
+ private TwoKeyConcurrentCache<Class<?>,Class<? extends
Annotation>,Annotation[]> classAnnotationCache = new
TwoKeyConcurrentCache<>(DISABLE_ANNOTATION_CACHING);
private TwoKeyConcurrentCache<Class<?>,Class<? extends
Annotation>,Annotation[]> declaredClassAnnotationCache = new
TwoKeyConcurrentCache<>(DISABLE_ANNOTATION_CACHING);
private TwoKeyConcurrentCache<Method,Class<? extends
Annotation>,List<Annotation>> methodAnnotationCache = new
TwoKeyConcurrentCache<>(DISABLE_ANNOTATION_CACHING);
private TwoKeyConcurrentCache<Field,Class<? extends
Annotation>,List<Annotation>> fieldAnnotationCache = new
TwoKeyConcurrentCache<>(DISABLE_ANNOTATION_CACHING);
private TwoKeyConcurrentCache<Constructor<?>,Class<? extends
Annotation>,List<Annotation>> constructorAnnotationCache = new
TwoKeyConcurrentCache<>(DISABLE_ANNOTATION_CACHING);
- /**
- * Finds the specified annotations on the specified class.
- *
- * @param <A> The annotation type to find.
- * @param a The annotation type to find.
- * @param c The class to search on.
- * @return The annotations in an unmodifiable list, or an empty list if
not found.
- */
- @SuppressWarnings("unchecked")
@Override /* MetaProvider */
- public <A extends Annotation> List<A> getAnnotations(Class<A> a,
Class<?> c) {
- if (a == null || c == null)
- return emptyList();
- List<Annotation> aa = classAnnotationCache.get(c, a);
+ public <A extends Annotation> void getAnnotations(Class<A> a, Class<?>
c, Consumer<A> consumer) {
+ if (a != null && c != null)
+ for (A aa : annotations(a, c))
+ consumer.accept(aa);
+ }
+
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Class<?> c,
Predicate<A> predicate) {
+ if (a != null && c != null)
+ for (A aa : annotations(a, c))
+ if (predicate.test(aa))
+ return aa;
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ private <A extends Annotation> A[] annotations(Class<A> a, Class<?> c) {
+ A[] aa = (A[])classAnnotationCache.get(c, a);
if (aa == null) {
A[] x = c.getAnnotationsByType(a);
AList<Annotation> l = new AList<>(Arrays.asList(x));
annotationMap.appendAll(c, a, l);
- aa = l.unmodifiable();
+ aa = (A[]) Array.newInstance(a, l.size());
+ for (int i = 0; i < l.size(); i++)
+ Array.set(aa, i, l.get(i));
classAnnotationCache.put(c, a, aa);
}
- return (List<A>)aa;
+ return aa;
}
@Override /* MetaProvider */
@@ -1129,7 +1136,7 @@ public abstract class Context implements MetaProvider {
* @return <jk>true</jk> if the annotation exists on the specified
class.
*/
public <A extends Annotation> boolean hasAnnotation(Class<A> a,
Class<?> c) {
- return getAnnotations(a, c).size() > 0;
+ return annotations(a, c).length > 0;
}
/**
@@ -1140,7 +1147,7 @@ public abstract class Context implements MetaProvider {
* @return <jk>true</jk> if the annotation exists on the specified
class.
*/
public <A extends Annotation> boolean hasAnnotation(Class<A> a,
ClassInfo c) {
- return getAnnotations(a, c == null ? null : c.inner()).size() >
0;
+ return annotations(a, c == null ? null : c.inner()).length > 0;
}
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
index dedfdb4..0b413d0 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
@@ -34,11 +34,19 @@ public interface MetaProvider {
public static MetaProvider DEFAULT = new MetaProvider() {
@Override /* MetaProvider */
- public <A extends Annotation> List<A> getAnnotations(Class<A>
a, Class<?> c) {
- if (a == null || c == null)
- return emptyList();
- A[] aa = c.getAnnotationsByType(a);
- return Arrays.asList(aa);
+ public <A extends Annotation> void getAnnotations(Class<A> a,
Class<?> c, Consumer<A> consumer) {
+ if (a != null && c != null)
+ for (A aa : c.getAnnotationsByType(a))
+ consumer.accept(aa);
+ }
+
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a,
Class<?> c, Predicate<A> predicate) {
+ if (a != null && c != null)
+ for (A aa : c.getAnnotationsByType(a))
+ if (predicate.test(aa))
+ return aa;
+ return null;
}
@Override /* MetaProvider */
@@ -85,12 +93,21 @@ public interface MetaProvider {
/**
* Finds the specified annotations on the specified class.
*
- * @param <A> The annotation type to find.
* @param a The annotation type to find.
* @param c The class to search on.
+ * @param consumer The consumer of the annotations.
+ */
+ <A extends Annotation> void getAnnotations(Class<A> a, Class<?> c,
Consumer<A> consumer);
+
+ /**
+ * Finds the first annotation on the specified class matching the
specified predicate.
+ *
+ * @param a The annotation type to find.
+ * @param c The class to search on.
+ * @param predicate The predicate to test against.
* @return The annotations in an unmodifiable list, or an empty list if
not found.
*/
- <A extends Annotation> List<A> getAnnotations(Class<A> a, Class<?> c);
+ <A extends Annotation> A getAnnotation(Class<A> a, Class<?> c,
Predicate<A> predicate);
/**
* Finds the specified declared annotations on the specified class.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
index 052851f..e6dfbbf 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
@@ -184,23 +184,21 @@ public class BuilderSwap<T,B> {
*/
@SuppressWarnings("rawtypes")
public static BuilderSwap<?,?> findSwapFromObjectClass(BeanContext bc,
Class<?> objectClass, Visibility cVis, Visibility mVis) {
- Class<?> builderClass = null;
+ Value<Class<?>> builderClass = Value.empty();
MethodInfo objectCreateMethod, builderCreateMethod;
ConstructorInfo objectConstructor = null;
ConstructorInfo builderConstructor;
- for (org.apache.juneau.annotation.Builder b :
bc.getAnnotations(org.apache.juneau.annotation.Builder.class, objectClass))
- if (b.value() != Null.class)
- builderClass = b.value();
+ bc.getAnnotations(org.apache.juneau.annotation.Builder.class,
objectClass, x -> builderClass.setIf(x.value(), y -> y != Null.class));
ClassInfo pci = ClassInfo.of(objectClass);
builderCreateMethod = getBuilderCreateMethod(pci);
- if (builderClass == null && builderCreateMethod != null)
- builderClass =
builderCreateMethod.getReturnType().inner();
+ if (builderClass.isEmpty() && builderCreateMethod != null)
+
builderClass.set(builderCreateMethod.getReturnType().inner());
- if (builderClass == null) {
+ if (builderClass.isEmpty()) {
ConstructorInfo cc = pci.getPublicConstructor(
x -> x.isVisible(cVis)
&& x.hasNumParams(1)
@@ -208,27 +206,27 @@ public class BuilderSwap<T,B> {
);
if (cc != null) {
objectConstructor = cc;
- builderClass = cc.getParamType(0).inner();
+ builderClass.set(cc.getParamType(0).inner());
}
}
- if (builderClass == null)
+ if (builderClass.isEmpty())
return null;
- ClassInfo bci = ClassInfo.of(builderClass);
+ ClassInfo bci = ClassInfo.of(builderClass.get());
builderConstructor = bci.getNoArgConstructor(cVis);
if (builderConstructor == null && builderCreateMethod == null)
return null;
objectCreateMethod = getBuilderBuildMethod(bci);
- Class<?> builderClass2 = builderClass;
+ Class<?> builderClass2 = builderClass.get();
if (objectConstructor == null)
objectConstructor = pci.getConstructor(x ->
x.isVisible(cVis) && x.hasParamTypes(builderClass2));
if (objectConstructor == null && objectCreateMethod == null)
return null;
- return new BuilderSwap(objectClass, builderClass,
objectConstructor == null ? null : objectConstructor.inner(),
builderConstructor == null ? null : builderConstructor.inner(),
builderCreateMethod, objectCreateMethod);
+ return new BuilderSwap(objectClass, builderClass.get(),
objectConstructor == null ? null : objectConstructor.inner(),
builderConstructor == null ? null : builderConstructor.inner(),
builderCreateMethod, objectCreateMethod);
}
private static MethodInfo getBuilderCreateMethod(ClassInfo c) {
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
index 173e14b..5658b79 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
@@ -84,21 +84,21 @@ public class XmlBeanMeta extends ExtendedBeanMeta {
XmlBeanMetaBuilder(BeanMeta<?> beanMeta, XmlMetaProvider mp) {
Class<?> c = beanMeta.getClassMeta().getInnerClass();
- XmlFormat defaultFormat = null;
+ Value<XmlFormat> defaultFormat = Value.empty();
- for (Xml xml : mp.getAnnotations(Xml.class, c)) {
- XmlFormat xf = xml.format();
+ mp.getAnnotations(Xml.class, c, x -> {
+ XmlFormat xf = x.format();
if (xf == ATTRS)
- defaultFormat = XmlFormat.ATTR;
+ defaultFormat.set(XmlFormat.ATTR);
else if (xf.isOneOf(ELEMENTS, DEFAULT))
- defaultFormat = ELEMENT;
+ defaultFormat.set(ELEMENT);
else if (xf == VOID) {
contentFormat = VOID;
- defaultFormat = VOID;
+ defaultFormat.set(VOID);
}
else
- throw new BeanRuntimeException(c,
"Invalid format specified in @Xml annotation on bean: {0}. Must be one of the
following: DEFAULT,ATTRS,ELEMENTS,VOID", xml.format());
- }
+ throw new BeanRuntimeException(c,
"Invalid format specified in @Xml annotation on bean: {0}. Must be one of the
following: DEFAULT,ATTRS,ELEMENTS,VOID", x.format());
+ });
for (BeanPropertyMeta p : beanMeta.getPropertyMetas()) {
XmlFormat xf =
mp.getXmlBeanPropertyMeta(p).getXmlFormat();
@@ -110,7 +110,7 @@ public class XmlBeanMeta extends ExtendedBeanMeta {
} else if (xf == COLLAPSED) {
collapsedProperties.put(p.getName(), p);
} else if (xf == DEFAULT) {
- if (defaultFormat == ATTR)
+ if (defaultFormat.get() == ATTR)
attrs.put(p.getName(), p);
else
elements.put(p.getName(), p);