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