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);

Reply via email to