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

commit f501bbdef6381d3e5c2a9018ad31ea7260b11f3e
Author: James Bognar <[email protected]>
AuthorDate: Fri Dec 12 18:54:56 2025 -0500

    Marshall module improvements
---
 .../java/org/apache/juneau/BeanPropertyMeta.java   | 339 ++++++++++-----------
 .../main/java/org/apache/juneau/BeanSession.java   |   2 +-
 2 files changed, 166 insertions(+), 175 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index f6d94bf103..ac6383b3fd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -379,7 +379,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        if (nn(setter)) {
                                var pt = setter.getParameterTypes();
                                if (isDyna) {
-                                       if (pt.size() == 2 && 
pt.get(0).inner().equals(String.class)) {
+                                       if (pt.size() == 2 && 
pt.get(0).is(String.class)) {
                                                // OK.
                                        } else {
                                                return false;
@@ -957,107 +957,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
         * @throws BeanRuntimeException If property could not be set.
         */
        public Object set(BeanMap<?> m, String pName, Object value) throws 
BeanRuntimeException {
-               return setInner(m, pName, m.meta.onWriteProperty(m.bean, pName, 
value));
-       }
-
-       @Override /* Overridden from Object */
-       public String toString() {
-               return name + ": " + cn(this.rawTypeMeta) + ", field=[" + field 
+ "], getter=[" + getter + "], setter=[" + setter + "]";
-       }
-
-       private Object applyChildPropertiesFilter(BeanSession session, 
ClassMeta cm, Object o) {
-               if (o == null)
-                       return null;
-               if (cm.isBean())
-                       return new BeanMap(session, o, new 
BeanMetaFiltered(cm.getBeanMeta(), properties));
-               if (cm.isMap()) {
-                       var propsArray = properties == null ? null : 
properties.toArray(new String[0]);
-                       return new FilteredMap(cm, (Map)o, propsArray);
-               }
-               if (cm.isObject()) {
-                       if (o instanceof Map o2) {
-                               var propsArray = properties == null ? null : 
properties.toArray(new String[0]);
-                               return new FilteredMap(cm, o2, propsArray);
-                       }
-                       var bm = bc.getBeanMeta(o.getClass());
-                       if (nn(bm))
-                               return new BeanMap(session, o, new 
BeanMetaFiltered(cm.getBeanMeta(), properties));
-               }
-               return o;
-       }
-
-       private Object getInner(BeanMap<?> m, String pName) {
-               try {
-
-                       if (writeOnly)
-                               return null;
-
-                       if (nn(overrideValue))
-                               return overrideValue;
-
-                       // Read-only beans have their properties stored in a 
cache until getBean() is called.
-                       var bean = m.bean;
-                       if (bean == null)
-                               return m.propertyCache.get(name);
-
-                       return toSerializedForm(m.getBeanSession(), getRaw(m, 
pName));
-
-               } catch (Throwable e) {
-                       if (bc.isIgnoreInvocationExceptionsOnGetters()) {
-                               if (rawTypeMeta.isPrimitive())
-                                       return 
rawTypeMeta.getPrimitiveDefault();
-                               return null;
-                       }
-                       throw bex(e, beanMeta.getClassMeta(), "Exception 
occurred while getting property ''{0}''", name);
-               }
-       }
-
-       private Object invokeGetter(Object bean, String pName) throws 
IllegalArgumentException {
-               if (isDyna) {
-                       var m = (Map)null;
-                       if (nn(getter)) {
-                               if (! isDynaGetterMap)
-                                       return getter.invoke(bean, pName);
-                               m = (Map)getter.invoke(bean);
-                       } else if (nn(field))
-                               m = (Map)field.get(bean);
-                       else
-                               throw bex(beanMeta.getClassMeta(), "Getter or 
public field not defined on property ''{0}''", name);
-                       return (m == null ? null : m.get(pName));
-               }
-               if (nn(getter))
-                       return getter.invoke(bean);
-               if (nn(field))
-                       return field.get(bean);
-               throw bex(beanMeta.getClassMeta(), "Getter or public field not 
defined on property ''{0}''", name);
-       }
-
-       private Object invokeSetter(Object bean, String pName, Object val) 
throws IllegalArgumentException {
-               if (isDyna) {
-                       if (nn(setter))
-                               return setter.invoke(bean, pName, val);
-                       var m = (Map)null;
-                       if (nn(field))
-                               m = (Map<String,Object>)field.get(bean);
-                       else if (nn(getter))
-                               m = (Map<String,Object>)getter.invoke(bean);
-                       else
-                               throw bex(beanMeta.getClassMeta(), "Cannot set 
property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter is 
defined on this property, and the existing property value is null",
-                                       name, getClassMeta().getName(), 
cn(val));
-                       return (m == null ? null : m.put(pName, val));
-               }
-               if (nn(setter))
-                       return setter.invoke(bean, val);
-               if (nn(field)) {
-                       field.set(bean, val);
-                       return null;
-               }
-               throw bex(beanMeta.getClassMeta(), "Cannot set property ''{0}'' 
of type ''{1}'' to object of type ''{2}'' because no setter is defined on this 
property, and the existing property value is null", name,
-                       getClassMeta().getName(), cn(val));
-       }
-
-       @SuppressWarnings("null")
-       private Object setInner(BeanMap<?> m, String pName, Object value) 
throws BeanRuntimeException {
+               Object value1 = m.meta.onWriteProperty(m.bean, pName, value);
                try {
 
                        if (readOnly)
@@ -1066,13 +966,13 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        var session = m.getBeanSession();
 
                        // Convert to raw form.
-                       value = unswap(session, value);
+                       value1 = unswap(session, value1);
 
                        if (m.bean == null) {
 
                                // Read-only beans get their properties stored 
in a cache.
                                if (nn(m.propertyCache))
-                                       return m.propertyCache.put(name, value);
+                                       return m.propertyCache.put(name, 
value1);
 
                                throw bex("Non-existent bean instance on 
bean.");
                        }
@@ -1081,7 +981,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        var isCollection = rawTypeMeta.isCollection();
 
                        if ((! isDyna) && field == null && setter == null && ! 
(isMap || isCollection)) {
-                               if ((value == null && 
bc.isIgnoreUnknownNullBeanProperties()) || bc.isIgnoreMissingSetters())
+                               if ((value1 == null && 
bc.isIgnoreUnknownNullBeanProperties()) || bc.isIgnoreMissingSetters())
                                        return null;
                                throw bex(beanMeta.getClassMeta(), "Setter or 
public field not defined on property ''{0}''", name);
                        }
@@ -1094,23 +994,23 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                var propertyClass = rawTypeMeta.inner();
                                var pcInfo = rawTypeMeta;
 
-                               if (value == null && (isMap || isCollection)) {
+                               if (value1 == null && (isMap || isCollection)) {
                                        invokeSetter(bean, pName, null);
                                        return r;
                                }
 
-                               var vc = value == null ? null : 
value.getClass();
+                               var vc = value1 == null ? null : 
value1.getClass();
 
                                if (isMap && (setter == null || ! 
pcInfo.isParentOf(vc))) {
 
-                                       if (! (value instanceof Map)) {
-                                               if (value instanceof 
CharSequence value2)
-                                                       value = 
JsonMap.ofJson(value2).session(session);
+                                       if (! (value1 instanceof Map)) {
+                                               if (value1 instanceof 
CharSequence value21)
+                                                       value1 = 
JsonMap.ofJson(value21).session(session);
                                                else
-                                                       throw 
bex(beanMeta.getClassMeta(), "Cannot set property ''{0}'' of type ''{1}'' to 
object of type ''{2}''", name, propertyClass.getName(), cn(value));
+                                                       throw 
bex(beanMeta.getClassMeta(), "Cannot set property ''{0}'' of type ''{1}'' to 
object of type ''{2}''", name, propertyClass.getName(), cn(value1));
                                        }
 
-                                       var valueMap = (Map)value;
+                                       var valueMap = (Map)value1;
                                        var propMap = (Map)r;
                                        var valueType = 
rawTypeMeta.getValueType();
 
@@ -1121,13 +1021,13 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                                        if (setter == null && 
field == null)
                                                                throw 
bex(beanMeta.getClassMeta(),
                                                                        "Cannot 
set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no 
setter or public field is defined, and the current value is null", name,
-                                                                       
propertyClass.getName(), cn(value));
+                                                                       
propertyClass.getName(), cn(value1));
 
                                                        if 
(propertyClass.isInstance(valueMap)) {
                                                                if (! 
valueType.isObject()) {
                                                                        var 
needsConversion = Flag.create();
-                                                                       
valueMap.forEach((k, v) -> {
-                                                                               
if (nn(v) && ! valueType.inner().isInstance(v)) {
+                                                                       
valueMap.forEach((k, v2) -> {
+                                                                               
if (nn(v2) && ! valueType.isInstance(v2)) {
                                                                                
        needsConversion.set();
                                                                                
}
                                                                        });
@@ -1139,7 +1039,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                                        }
                                                        throw 
bex(beanMeta.getClassMeta(),
                                                                "Cannot set 
property ''{0}'' of type ''{2}'' to object of type ''{2}'' because the assigned 
map cannot be converted to the specified type because the property type is 
abstract, and the property value is currently null",
-                                                               name, 
propertyClass.getName(), cn(value));
+                                                               name, 
propertyClass.getName(), cn(value1));
                                                }
                                        } else {
                                                if (propMap == null) {
@@ -1151,24 +1051,24 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
 
                                        // Set the values.
                                        var propMap2 = propMap;
-                                       valueMap.forEach((k, v) -> {
+                                       valueMap.forEach((k1, v1) -> {
                                                if (! valueType.isObject())
-                                                       v = 
session.convertToType(v, valueType);
-                                               propMap2.put(k, v);
+                                                       v1 = 
session.convertToType(v1, valueType);
+                                               propMap2.put(k1, v1);
                                        });
                                        if (nn(setter) || nn(field))
                                                invokeSetter(bean, pName, 
propMap);
 
                                } else if (isCollection && (setter == null || ! 
pcInfo.isParentOf(vc))) {
 
-                                       if (! (value instanceof Collection)) {
-                                               if (value instanceof 
CharSequence value2)
-                                                       value = new 
JsonList(value2).setBeanSession(session);
+                                       if (! (value1 instanceof Collection)) {
+                                               if (value1 instanceof 
CharSequence value2)
+                                                       value1 = new 
JsonList(value2).setBeanSession(session);
                                                else
-                                                       throw 
bex(beanMeta.getClassMeta(), "Cannot set property ''{0}'' of type ''{1}'' to 
object of type ''{2}''", name, propertyClass.getName(), cn(value));
+                                                       throw 
bex(beanMeta.getClassMeta(), "Cannot set property ''{0}'' of type ''{1}'' to 
object of type ''{2}''", name, propertyClass.getName(), cn(value1));
                                        }
 
-                                       var valueList = (Collection)value;
+                                       var valueList = (Collection)value1;
                                        var propList = (Collection)r;
                                        var elementType = 
rawTypeMeta.getElementType();
 
@@ -1179,14 +1079,14 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                                        if (setter == null && 
field == null)
                                                                throw 
bex(beanMeta.getClassMeta(),
                                                                        "Cannot 
set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no 
setter or public field is defined, and the current value is null", name,
-                                                                       
propertyClass.getName(), cn(value));
+                                                                       
propertyClass.getName(), cn(value1));
 
-                                                       if 
(propertyClass.isInstance(valueList) || (nn(setter) && 
setter.getParameterTypes().get(0).inner().equals(Collection.class))) {
+                                                       if 
(propertyClass.isInstance(valueList) || (nn(setter) && 
setter.getParameterTypes().get(0).is(Collection.class))) {
                                                                if (! 
elementType.isObject()) {
-                                                                       List l 
= new JsonList(valueList);
-                                                                       for 
(ListIterator<Object> i = l.listIterator(); i.hasNext();) {
-                                                                               
Object v = i.next();
-                                                                               
if (nn(v) && (! elementType.inner().isInstance(v))) {
+                                                                       var l = 
new JsonList(valueList);
+                                                                       for 
(var i = l.listIterator(); i.hasNext();) {
+                                                                               
var v = i.next();
+                                                                               
if (nn(v) && (! elementType.isInstance(v))) {
                                                                                
        i.set(session.convertToType(v, elementType));
                                                                                
}
                                                                        }
@@ -1197,7 +1097,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                                        }
                                                        throw 
bex(beanMeta.getClassMeta(),
                                                                "Cannot set 
property ''{0}'' of type ''{1}'' to object of type ''{2}'' because the assigned 
map cannot be converted to the specified type because the property type is 
abstract, and the property value is currently null",
-                                                               name, 
propertyClass.getName(), cn(value));
+                                                               name, 
propertyClass.getName(), cn(value1));
                                                }
                                                propList.clear();
                                        } else {
@@ -1218,32 +1118,156 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                        });
 
                                } else {
-                                       if (nn(swap) && nn(value) && 
swap.getSwapClass().isParentOf(value.getClass())) {
-                                               value = swap.unswap(session, 
value, rawTypeMeta);
+                                       if (nn(swap) && value1 != null && 
swap.getSwapClass().isParentOf(value1.getClass())) {
+                                               value1 = swap.unswap(session, 
value1, rawTypeMeta);
                                        } else {
-                                               value = 
session.convertToType(value, rawTypeMeta);
+                                               value1 = 
session.convertToType(value1, rawTypeMeta);
                                        }
-                                       invokeSetter(bean, pName, value);
+                                       invokeSetter(bean, pName, value1);
                                }
 
                                return r;
 
                        } catch (BeanRuntimeException e) {
                                throw e;
-                       } catch (Exception e) {
+                       } catch (Exception e1) {
                                if (bc.isIgnoreInvocationExceptionsOnSetters()) 
{
                                        if (rawTypeMeta.isPrimitive())
                                                return 
rawTypeMeta.getPrimitiveDefault();
                                        return null;
                                }
-                               throw bex(e, beanMeta.getClassMeta(), "Error 
occurred trying to set property ''{0}''", name);
+                               throw bex(e1, beanMeta.getClassMeta(), "Error 
occurred trying to set property ''{0}''", name);
                        }
-               } catch (ParseException e) {
-                       throw bex(e);
+               } catch (ParseException e2) {
+                       throw bex(e2);
+               }
+       }
+
+       @Override /* Overridden from Object */
+       public String toString() {
+               return name + ": " + cn(this.rawTypeMeta) + ", field=[" + field 
+ "], getter=[" + getter + "], setter=[" + setter + "]";
+       }
+
+       private Object applyChildPropertiesFilter(BeanSession session, 
ClassMeta cm, Object o) {
+               if (o == null)
+                       return null;
+               if (cm.isBean())
+                       return new BeanMap(session, o, new 
BeanMetaFiltered(cm.getBeanMeta(), properties));
+               if (cm.isMap()) {
+                       var propsArray = properties == null ? null : 
properties.toArray(new String[0]);
+                       return new FilteredMap(cm, (Map)o, propsArray);
+               }
+               if (cm.isObject()) {
+                       if (o instanceof Map o2) {
+                               var propsArray = properties == null ? null : 
properties.toArray(new String[0]);
+                               return new FilteredMap(cm, o2, propsArray);
+                       }
+                       var bm = bc.getBeanMeta(o.getClass());
+                       if (nn(bm))
+                               return new BeanMap(session, o, new 
BeanMetaFiltered(cm.getBeanMeta(), properties));
+               }
+               return o;
+       }
+
+       private Object getInner(BeanMap<?> m, String pName) {
+               try {
+
+                       if (writeOnly)
+                               return null;
+
+                       if (nn(overrideValue))
+                               return overrideValue;
+
+                       // Read-only beans have their properties stored in a 
cache until getBean() is called.
+                       var bean = m.bean;
+                       if (bean == null)
+                               return m.propertyCache.get(name);
+
+                       var session = m.getBeanSession();
+                       var o = getRaw(m, pName);
+
+                       try {
+                               o = swap(session, o);
+                               if (o == null)
+                                       return null;
+                               if (nn(properties)) {
+                                       if (rawTypeMeta.isArray()) {
+                                               var a = (Object[])o;
+                                               var l1 = new 
DelegateList(rawTypeMeta);
+                                               var childType1 = 
rawTypeMeta.getElementType();
+                                               for (var c1 : a)
+                                                       
l1.add(applyChildPropertiesFilter(session, childType1, c1));
+                                               return l1;
+                                       } else if (rawTypeMeta.isCollection()) {
+                                               var c = (Collection)o;
+                                               var l = listOfSize(c.size());
+                                               var childType = 
rawTypeMeta.getElementType();
+                                               c.forEach(x -> 
l.add(applyChildPropertiesFilter(session, childType, x)));
+                                               return l;
+                                       } else {
+                                               return 
applyChildPropertiesFilter(session, rawTypeMeta, o);
+                                       }
+                               }
+                               return o;
+                       } catch (SerializeException e) {
+                               throw bex(e);
+                       }
+
+               } catch (Throwable e) {
+                       if (bc.isIgnoreInvocationExceptionsOnGetters()) {
+                               if (rawTypeMeta.isPrimitive())
+                                       return 
rawTypeMeta.getPrimitiveDefault();
+                               return null;
+                       }
+                       throw bex(e, beanMeta.getClassMeta(), "Exception 
occurred while getting property ''{0}''", name);
+               }
+       }
+
+       private Object invokeGetter(Object bean, String pName) throws 
IllegalArgumentException {
+               if (isDyna) {
+                       var m = (Map)null;
+                       if (nn(getter)) {
+                               if (! isDynaGetterMap)
+                                       return getter.invoke(bean, pName);
+                               m = (Map)getter.invoke(bean);
+                       } else if (nn(field))
+                               m = (Map)field.get(bean);
+                       else
+                               throw bex(beanMeta.getClassMeta(), "Getter or 
public field not defined on property ''{0}''", name);
+                       return (m == null ? null : m.get(pName));
+               }
+               if (nn(getter))
+                       return getter.invoke(bean);
+               if (nn(field))
+                       return field.get(bean);
+               throw bex(beanMeta.getClassMeta(), "Getter or public field not 
defined on property ''{0}''", name);
+       }
+
+       private Object invokeSetter(Object bean, String pName, Object val) 
throws IllegalArgumentException {
+               if (isDyna) {
+                       if (nn(setter))
+                               return setter.invoke(bean, pName, val);
+                       var m = (Map)null;
+                       if (nn(field))
+                               m = (Map<String,Object>)field.get(bean);
+                       else if (nn(getter))
+                               m = (Map<String,Object>)getter.invoke(bean);
+                       else
+                               throw bex(beanMeta.getClassMeta(), "Cannot set 
property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter is 
defined on this property, and the existing property value is null",
+                                       name, getClassMeta().getName(), 
cn(val));
+                       return (m == null ? null : m.put(pName, val));
+               }
+               if (nn(setter))
+                       return setter.invoke(bean, val);
+               if (nn(field)) {
+                       field.set(bean, val);
+                       return null;
                }
+               throw bex(beanMeta.getClassMeta(), "Cannot set property ''{0}'' 
of type ''{1}'' to object of type ''{2}'' because no setter is defined on this 
property, and the existing property value is null", name,
+                       getClassMeta().getName(), cn(val));
        }
 
-       private Object transform(BeanSession session, Object o) throws 
SerializeException {
+       private Object swap(BeanSession session, Object o) throws 
SerializeException {
                try {
                        // First use swap defined via @Beanp.
                        if (nn(swap))
@@ -1306,40 +1330,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
         * @throws InvocationTargetException Thrown by method invocation.
         */
        protected void setArray(Object bean, List l) throws 
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
-               Object array = toArray(l, 
this.rawTypeMeta.getElementType().inner());
+               var array = toArray(l, 
this.rawTypeMeta.getElementType().inner());
                invokeSetter(bean, name, array);
        }
-
-       /**
-        * Converts a raw bean property value to serialized form.
-        * Applies transforms and child property filters.
-        */
-       Object toSerializedForm(BeanSession session, Object o) {
-               try {
-                       o = transform(session, o);
-                       if (o == null)
-                               return null;
-                       if (nn(properties)) {
-                               if (rawTypeMeta.isArray()) {
-                                       var a = (Object[])o;
-                                       var l = new DelegateList(rawTypeMeta);
-                                       var childType = 
rawTypeMeta.getElementType();
-                                       for (var c : a)
-                                               
l.add(applyChildPropertiesFilter(session, childType, c));
-                                       return l;
-                               } else if (rawTypeMeta.isCollection()) {
-                                       var c = (Collection)o;
-                                       var l = listOfSize(c.size());
-                                       var childType = 
rawTypeMeta.getElementType();
-                                       c.forEach(x -> 
l.add(applyChildPropertiesFilter(session, childType, x)));
-                                       return l;
-                               } else {
-                                       return 
applyChildPropertiesFilter(session, rawTypeMeta, o);
-                               }
-                       }
-                       return o;
-               } catch (SerializeException e) {
-                       throw bex(e);
-               }
-       }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
index bc41cf2997..436e8d206e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
@@ -1664,7 +1664,7 @@ public class BeanSession extends ContextSession {
                var i = IntegerValue.create();
                list.forEach(x -> {
                        var x2 = x;
-                       if (! type.inner().isInstance(x)) {
+                       if (! type.isInstance(x)) {
                                if (componentType.isArray() && x instanceof 
Collection<?> c)
                                        x2 = toArray(componentType, c);
                                else if (x == null && 
componentType.isPrimitive())

Reply via email to