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 429ce6ddf7 Marshall module improvements
429ce6ddf7 is described below

commit 429ce6ddf7f15ae0f6ebd4fd4f9a582aa07916b2
Author: James Bognar <[email protected]>
AuthorDate: Mon Dec 8 13:51:58 2025 -0500

    Marshall module improvements
---
 .../src/main/java/org/apache/juneau/ClassMeta.java | 43 +++++++++++-----------
 1 file changed, 22 insertions(+), 21 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 ec3da2c2d3..c98d043005 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
@@ -154,7 +154,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        private final Map<Class<?>,Mutater<?,T>> fromMutaters = new 
ConcurrentHashMap<>();
        private final OptionalSupplier<MethodInfo> fromStringMethod;            
   // Static fromString(String) or equivalent method
        private final OptionalSupplier<ClassInfoTyped<? extends T>> implClass;  
   // The implementation class to use if this is an interface.
-       private final Supplier<Tuple2<ClassMeta<?>,ClassMeta<?>>> 
keyValueTypes;   // Key and value types for MAP types.
+       private final Supplier<KeyValueTypes> keyValueTypes;                    
    // Key and value types for MAP types.
        private final SimpleReadWriteLock lock = new SimpleReadWriteLock(false);
        private final OptionalSupplier<MarshalledFilter> marshalledFilter;
        private final Supplier<Property<T,Object>> nameProperty;                
   // The method to set the name on an object (if it has one).
@@ -165,16 +165,16 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        private final OptionalSupplier<ConstructorInfo> stringConstructor;      
   // The X(String) constructor (if it has one).
        private final Supplier<List<ObjectSwap<T,?>>> swaps;                    
   // The object POJO swaps associated with this bean (if it has any).
        private final Map<Class<?>,Mutater<T,?>> toMutaters = new 
ConcurrentHashMap<>();
-       private final OptionalSupplier<Tuple2<BeanMeta<T>,String>> beanMeta;
+       private final OptionalSupplier<BeanMetaValue<T>> beanMeta;
 
        record KeyValueTypes(ClassMeta<?> keyType, ClassMeta<?> valueType) {
                Optional<ClassMeta<?>> optKeyType() { return opt(keyType()); }
-               Optional<ClassMeta<?>> optValueType() { return 
Optional.of(valueType()); }
+               Optional<ClassMeta<?>> optValueType() { return 
opt(valueType()); }
        }
 
        record BeanMetaValue<T>(BeanMeta<T> beanMeta, String notABeanReason) {
-               public Optional<BeanMeta<T>> optBeanMeta() { return 
opt(beanMeta()); }
-               public Optional<String> optNotABeanReason() { return 
opt(notABeanReason()); }
+               Optional<BeanMeta<T>> optBeanMeta() { return opt(beanMeta()); }
+               Optional<String> optNotABeanReason() { return 
opt(notABeanReason()); }
        }
 
        /**
@@ -331,7 +331,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                this.fromStringMethod = mainType.fromStringMethod;
                this.beanContext = mainType.beanContext;
                this.elementType = elementType != null ? 
memoize(()->elementType) : mainType.elementType;
-               this.keyValueTypes = (keyType != null || valueType != null) ? 
memoize(()->Tuple2.of(keyType, valueType)) : mainType.keyValueTypes;
+               this.keyValueTypes = (keyType != null || valueType != null) ? 
memoize(()->new KeyValueTypes(keyType, valueType)) : mainType.keyValueTypes;
                this.beanMeta = mainType.beanMeta;
                this.swaps = mainType.swaps;
                this.exampleMethod = mainType.exampleMethod;
@@ -475,7 +475,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         *      this class.
         */
        public BeanMeta<T> getBeanMeta() {
-               return beanMeta.get().getA();
+               return beanMeta.get().beanMeta();
        }
 
        /**
@@ -625,7 +625,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @return The key class type, or <jk>null</jk> if this class is not a 
Map.
         */
        public ClassMeta<?> getKeyType() {
-               return keyValueTypes.get().getA();
+               return keyValueTypes.get().keyType();
        }
 
        /**
@@ -643,7 +643,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @return The reason why this class is not a bean, or <jk>null</jk> if 
it is a bean.
         */
        public synchronized String getNotABeanReason() {
-               return beanMeta.get().getB();
+               return beanMeta.get().notABeanReason();
        }
 
        /**
@@ -812,7 +812,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @return The value class type, or <jk>null</jk> if this class is not 
a Map.
         */
        public ClassMeta<?> getValueType() {
-               return keyValueTypes.get().getB();
+               return keyValueTypes.get().valueType();
        }
 
        /**
@@ -1334,22 +1334,23 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                return 
BeanFilter.create(inner()).applyAnnotations(reverse(l.stream().map(AnnotationInfo::inner).toList())).build();
        }
 
-       private Tuple2<BeanMeta<T>,String> findBeanMeta() {
+       private BeanMetaValue<T> findBeanMeta() {
                if (! cat.isUnknown())
-                       return Tuple2.of(null, "Known non-bean type");
-               return BeanMeta.create(this, beanFilter.get(), null, 
implClass.map(x -> x.getPublicConstructor(x2 -> 
x2.hasNumParameters(0)).orElse(null)).orElse(null));
+                       return new BeanMetaValue<>(null, "Known non-bean type");
+               var result = BeanMeta.create(this, beanFilter.get(), null, 
implClass.map(x -> x.getPublicConstructor(x2 -> 
x2.hasNumParameters(0)).orElse(null)).orElse(null));
+               return new BeanMetaValue<>(result.getA(), result.getB());
        }
 
-       private Tuple2<ClassMeta<?>,ClassMeta<?>> findKeyValueTypes() {
+       private KeyValueTypes findKeyValueTypes() {
                if (cat.is(MAP) && ! cat.is(BEANMAP)) {
                        // If this is a MAP, see if it's parameterized (e.g. 
AddressBook extends HashMap<String,Person>)
                        var parameters = beanContext.findParameters(inner(), 
inner());
                        if (nn(parameters) && parameters.length == 2) {
-                               return Tuple2.of(parameters[0], parameters[1]);
+                               return new KeyValueTypes(parameters[0], 
parameters[1]);
                        }
-                       return 
Tuple2.of(beanContext.getClassMeta(Object.class), 
beanContext.getClassMeta(Object.class));
+                       return new 
KeyValueTypes(beanContext.getClassMeta(Object.class), 
beanContext.getClassMeta(Object.class));
                }
-               return Tuple2.of(null,null);
+               return new KeyValueTypes(null, null);
        }
 
        private ClassMeta<?> findElementType() {
@@ -1774,11 +1775,11 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                        return 
sb.append(cn(BeanMap.class)).append('<').append(n).append('>');
                if (cat.is(MAP)) {
                        var kvTypes = keyValueTypes.get();
-                       var kt = kvTypes.getA();
-                       var vt = kvTypes.getB();
-                       if (kt != null && vt != null && kt.isObject() && 
vt.isObject())
+                       var kt = kvTypes.optKeyType();
+                       var vt = kvTypes.optValueType();
+                       if (kt.isPresent() && vt.isPresent() && 
kt.get().isObject() && vt.get().isObject())
                                return sb.append(n);
-                       return sb.append(n).append('<').append(kt == null ? "?" 
: kt.toString(simple)).append(',').append(vt == null ? "?" : 
vt.toString(simple)).append('>');
+                       return sb.append(n).append('<').append(kt.map(x -> 
x.toString(simple)).orElse("?")).append(',').append(vt.map(x -> 
x.toString(simple)).orElse("?")).append('>');
                }
                if (cat.is(COLLECTION) || is(Optional.class)) {
                        var et = elementType.get();

Reply via email to