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 92c2044e1c SonarQube bug fixes
92c2044e1c is described below

commit 92c2044e1c5c6539f293aa7d61a9952b30519a19
Author: James Bognar <[email protected]>
AuthorDate: Thu Feb 5 09:24:30 2026 -0500

    SonarQube bug fixes
---
 .../apache/juneau/bean/openapi3/ui/OpenApiUI.java  |   9 +-
 .../juneau/commons/utils/CollectionUtils.java      |   3 +-
 .../apache/juneau/commons/utils/StringUtils.java   |   5 +-
 .../main/java/org/apache/juneau/BeanContext.java   |  13 +-
 .../src/main/java/org/apache/juneau/BeanMeta.java  |  42 +--
 .../java/org/apache/juneau/BeanPropertyMeta.java   | 328 +++++++++++----------
 .../main/java/org/apache/juneau/BeanSession.java   | 134 +++++----
 .../org/apache/juneau/BeanTraverseSession.java     |   9 +-
 .../apache/juneau/annotation/SchemaAnnotation.java |  31 +-
 .../org/apache/juneau/html/HtmlParserSession.java  |  18 +-
 .../org/apache/juneau/httppart/HttpPartFormat.java |   3 +-
 .../apache/juneau/serializer/WriterSerializer.java |   8 +-
 .../org/apache/juneau/uon/UonParserSession.java    |   3 +-
 .../java/org/apache/juneau/uon/UonSerializer.java  |   8 +-
 .../urlencoding/UrlEncodingParserSession.java      |  18 +-
 .../org/apache/juneau/xml/XmlParserSession.java    |   9 +-
 .../apache/juneau/xml/XmlSerializerSession.java    |  11 +-
 .../org/apache/juneau/rest/client/RestClient.java  |  32 +-
 .../apache/juneau/rest/client/RestResponse.java    |  36 ++-
 .../rest/client/remote/RemoteOperationMeta.java    |  10 +-
 .../juneau/rest/mock/MockServletRequest.java       |   3 +-
 .../java/org/apache/juneau/rest/RestContext.java   |  37 ++-
 .../org/apache/juneau/rest/arg/FormDataArg.java    |   9 +-
 .../java/org/apache/juneau/rest/arg/HeaderArg.java |   9 +-
 .../java/org/apache/juneau/rest/arg/QueryArg.java  |   9 +-
 .../apache/juneau/rest/arg/ResponseBeanArg.java    |   9 +-
 .../apache/juneau/rest/arg/ResponseCodeArg.java    |   9 +-
 .../apache/juneau/rest/arg/ResponseHeaderArg.java  |   9 +-
 .../rest/swagger/BasicSwaggerProviderSession.java  |   4 +-
 .../apache/juneau/rest/util/UrlPathMatcher.java    |   8 +-
 30 files changed, 522 insertions(+), 314 deletions(-)

diff --git 
a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ui/OpenApiUI.java
 
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ui/OpenApiUI.java
index 3dac549c96..ef9c3fa64b 100644
--- 
a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ui/OpenApiUI.java
+++ 
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ui/OpenApiUI.java
@@ -324,7 +324,14 @@ public class OpenApiUI extends ObjectSwap<OpenApi,Div> {
        private static HtmlElement tagBlockSummary(Tag t) {
                var ed = t.getExternalDocs();
 
-               var content = nn(ed) && nn(ed.getDescription()) ? 
ed.getDescription() : (nn(ed) ? ed.getUrl() : null);
+               String content;
+               if (nn(ed) && nn(ed.getDescription())) {
+                       content = ed.getDescription();
+               } else if (nn(ed)) {
+                       content = ed.getUrl().toString();
+               } else {
+                       content = null;
+               }
                return 
div()._class("tag-block-summary").onclick("toggleTagBlock(this)").children(span(t.getName())._class("name"),
 span(toBRL(t.getDescription()))._class("description"),
                        nn(ed) && nn(ed.getUrl()) ? span(a(ed.getUrl(), 
content))._class("extdocs") : null);
        }
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/CollectionUtils.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/CollectionUtils.java
index 3b77a84fa1..28cb9b1cc5 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/CollectionUtils.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/CollectionUtils.java
@@ -1406,8 +1406,7 @@ public class CollectionUtils {
         * @return A new modifiable map.
         */
        public static <K,V> LinkedHashMap<K,V> map() {
-               var m = new LinkedHashMap<K,V>();
-               return m;
+               return new LinkedHashMap<>();
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
index cde217c064..05d30a1e89 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
@@ -7669,7 +7669,10 @@ public class StringUtils {
                                                        }
                                                }
                                                i++;
-                                       } while (i < s.length() && ! 
URL_ENCODE_PATHINFO_VALIDCHARS.contains((c = s.charAt(i))));
+                                               if (i < s.length()) {
+                                                       c = s.charAt(i);
+                                               }
+                                       } while (i < s.length() && ! 
URL_ENCODE_PATHINFO_VALIDCHARS.contains(c));
 
                                        caw.flush();
                                        var s2 = new String(caw.toCharArray());
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index c4edf840d7..dadbfc1a88 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -4363,8 +4363,17 @@ public class BeanContext extends Context {
 
                        if (cm2.isCollection() || cm2.isOptional()) {
                                var pParams = (beanp.params().length == 0 ? 
a(Object.class) : beanp.params());
-                               if (pParams.length != 1)
-                                       throw rex("Invalid number of parameters 
specified for {1} (must be 1): {0}", pParams.length, (cm2.isCollection() ? 
"Collection" : cm2.isOptional() ? "Optional" : "Array"));
+                               if (pParams.length != 1) {
+                                       String typeName;
+                                       if (cm2.isCollection()) {
+                                               typeName = "Collection";
+                                       } else if (cm2.isOptional()) {
+                                               typeName = "Optional";
+                                       } else {
+                                               typeName = "Array";
+                                       }
+                                       throw rex("Invalid number of parameters 
specified for {1} (must be 1): {0}", pParams.length, typeName);
+                               }
                                var elementType = resolveType(pParams[0], 
cm2.getElementType(), cm.getElementType());
                                if (elementType.isObject())
                                        return cm2;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index a0a226623d..3920110771 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -497,24 +497,7 @@ public class BeanMeta<T> {
                        var writeOnlyProps = bfo.map(x -> 
x.getWriteOnlyProperties()).orElse(sete());
                        for (var i = normalProps.values().iterator(); 
i.hasNext();) {
                                var p = i.next();
-                               try {
-                                       if (p.field == null)
-                                               
findInnerBeanField(p.name).ifPresent(p::setInnerField);
-
-                                       if (p.validate(beanContext, 
beanRegistry.get(), typeVarImpls, readOnlyProps, writeOnlyProps)) {
-
-                                               if (nn(p.getter))
-                                                       
_getterProps.put(p.getter.inner(), p.name);
-
-                                               if (nn(p.setter))
-                                                       
_setterProps.put(p.setter.inner(), p.name);
-
-                                       } else {
-                                               i.remove();
-                                       }
-                               } catch (ClassNotFoundException e) {
-                                       throw bex(c, lm(e));
-                               }
+                               validateAndRegisterProperty(p, c, typeVarImpls, 
readOnlyProps, writeOnlyProps, i, _getterProps, _setterProps);
                        }
 
                        // Check for missing properties.
@@ -593,6 +576,29 @@ public class BeanMeta<T> {
                beanProxyInvocationHandler = 
mem(()->beanContext.isUseInterfaceProxies() && c.isInterface() ? new 
BeanProxyInvocationHandler<>(this) : null);
        }
 
+       private void validateAndRegisterProperty(BeanPropertyMeta.Builder p, 
Class<?> c, TypeVariables typeVarImpls, Set<String> readOnlyProps, Set<String> 
writeOnlyProps, Iterator<BeanPropertyMeta.Builder> i, Map<Method,String> 
getterProps, Map<Method,String> setterProps) {
+               try {
+                       if (p.field == null)
+                               
findInnerBeanField(p.name).ifPresent(p::setInnerField);
+
+                       if (p.validate(beanContext, beanRegistry.get(), 
typeVarImpls, readOnlyProps, writeOnlyProps)) {
+
+                               if (nn(p.getter))
+                                       getterProps.put(p.getter.inner(), 
p.name);
+
+                               if (nn(p.setter))
+                                       setterProps.put(p.setter.inner(), 
p.name);
+
+                       } else {
+                               i.remove();
+                       }
+               } catch (ClassNotFoundException e) {
+                       throw bex(c, lm(e));
+               } catch (Exception e) {
+                       throw bex(c, lm(e));
+               }
+       }
+
        @Override /* Overridden from Object */
        public boolean equals(Object o) {
                return (o instanceof BeanMeta<?> o2) && eq(this, o2, (x, y) -> 
eq(x.classMeta, y.classMeta));
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 e2de7703dc..890c09cbb4 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
@@ -418,8 +418,15 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        if (rawTypeMeta == null)
                                return false;
 
-                       if (typeMeta == null)
-                               typeMeta = (nn(swap) ? 
bc.getClassMeta(swap.getSwapClass()) : rawTypeMeta == null ? bc.object() : 
rawTypeMeta);
+                       if (typeMeta == null) {
+                               if (nn(swap)) {
+                                       typeMeta = 
bc.getClassMeta(swap.getSwapClass());
+                               } else if (rawTypeMeta == null) {
+                                       typeMeta = bc.object();
+                               } else {
+                                       typeMeta = rawTypeMeta;
+                               }
+                       }
                        if (typeMeta == null)
                                typeMeta = rawTypeMeta;
 
@@ -1002,158 +1009,161 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
 
                        var bean = m.getBean(true);  // Don't use getBean() 
because it triggers array creation!
 
-                       try {
+                       return setPropertyValue(m, pName, value1, bean, isMap, 
isCollection, session);
+               } catch (ParseException e2) {
+                       throw bex(e2);
+               }
+       }
+
+       private Object setPropertyValue(BeanMap<?> m, String pName, Object 
value1, Object bean, boolean isMap, boolean isCollection, BeanSession session) 
throws ParseException {
+               try {
+                       var r = (bc.isBeanMapPutReturnsOldValue() || isMap || 
isCollection) && (nn(getter) || nn(field)) ? get(m, pName) : null;
+                       var propertyClass = rawTypeMeta.inner();
+                       var pcInfo = rawTypeMeta;
 
-                               var r = (bc.isBeanMapPutReturnsOldValue() || 
isMap || isCollection) && (nn(getter) || nn(field)) ? get(m, pName) : null;
-                               var propertyClass = rawTypeMeta.inner();
-                               var pcInfo = rawTypeMeta;
+                       if (value1 == null && (isMap || isCollection)) {
+                               invokeSetter(bean, pName, null);
+                               return r;
+                       }
 
-                               if (value1 == null && (isMap || isCollection)) {
-                                       invokeSetter(bean, pName, null);
-                                       return r;
-                               }
+                       var vc = value1 == null ? null : value1.getClass();
 
-                               var vc = value1 == null ? null : 
value1.getClass();
+                       if (isMap && (setter == null || ! 
pcInfo.isAssignableFrom(vc))) {
 
-                               if (isMap && (setter == null || ! 
pcInfo.isAssignableFrom(vc))) {
+                               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(value1));
+                               }
 
-                                       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(value1));
-                                       }
+                               var valueMap = (Map)value1;
+                               var propMap = (Map)r;
+                               var valueType = rawTypeMeta.getValueType();
 
-                                       var valueMap = (Map)value1;
-                                       var propMap = (Map)r;
-                                       var valueType = 
rawTypeMeta.getValueType();
-
-                                       // If the property type is abstract, 
then we either need to reuse the existing
-                                       // map (if it's not null), or try to 
assign the value directly.
-                                       if (! 
rawTypeMeta.canCreateNewInstance()) {
-                                               if (propMap == null) {
-                                                       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(value1));
-
-                                                       if 
(propertyClass.isInstance(valueMap)) {
-                                                               if (! 
valueType.isObject()) {
-                                                                       var 
needsConversion = Flag.create();
-                                                                       
valueMap.forEach((k, v2) -> {
-                                                                               
if (nn(v2) && ! valueType.isInstance(v2)) {
-                                                                               
        needsConversion.set();
-                                                                               
}
-                                                                       });
-                                                                       if 
(needsConversion.isSet())
-                                                                               
valueMap = (Map)session.convertToType(valueMap, rawTypeMeta);
-                                                               }
-                                                               
invokeSetter(bean, pName, valueMap);
-                                                               return r;
-                                                       }
+                               // If the property type is abstract, then we 
either need to reuse the existing
+                               // map (if it's not null), or try to assign the 
value directly.
+                               if (! rawTypeMeta.canCreateNewInstance()) {
+                                       if (propMap == null) {
+                                               if (setter == null && field == 
null)
                                                        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(value1));
+                                                               "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(value1));
+
+                                               if 
(propertyClass.isInstance(valueMap)) {
+                                                       if (! 
valueType.isObject()) {
+                                                               var 
needsConversion = Flag.create();
+                                                               
valueMap.forEach((k, v2) -> {
+                                                                       if 
(nn(v2) && ! valueType.isInstance(v2)) {
+                                                                               
needsConversion.set();
+                                                                       }
+                                                               });
+                                                               if 
(needsConversion.isSet())
+                                                                       
valueMap = (Map)session.convertToType(valueMap, rawTypeMeta);
+                                                       }
+                                                       invokeSetter(bean, 
pName, valueMap);
+                                                       return r;
                                                }
+                                               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(value1));
+                                       }
+                               } else {
+                                       if (propMap == null) {
+                                               propMap = 
BeanCreator.of(Map.class).type(rawTypeMeta).run();
                                        } else {
-                                               if (propMap == null) {
-                                                       propMap = 
BeanCreator.of(Map.class).type(rawTypeMeta).run();
-                                               } else {
-                                                       propMap.clear();
-                                               }
+                                               propMap.clear();
                                        }
+                               }
 
-                                       // Set the values.
-                                       var propMap2 = propMap;
-                                       valueMap.forEach((k1, v1) -> {
-                                               if (! valueType.isObject())
-                                                       v1 = 
session.convertToType(v1, valueType);
-                                               propMap2.put(k1, v1);
-                                       });
-                                       if (nn(setter) || nn(field))
-                                               invokeSetter(bean, pName, 
propMap);
-
-                               } else if (isCollection && (setter == null || ! 
pcInfo.isAssignableFrom(vc))) {
-
-                                       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(value1));
-                                       }
+                               // Set the values.
+                               var propMap2 = propMap;
+                               valueMap.forEach((k1, v1) -> {
+                                       if (! valueType.isObject())
+                                               v1 = session.convertToType(v1, 
valueType);
+                                       propMap2.put(k1, v1);
+                               });
+                               if (nn(setter) || nn(field))
+                                       invokeSetter(bean, pName, propMap);
 
-                                       var valueList = (Collection)value1;
-                                       var propList = (Collection)r;
-                                       var elementType = 
rawTypeMeta.getElementType();
-
-                                       // If the property type is abstract, 
then we either need to reuse the existing
-                                       // collection (if it's not null), or 
try to assign the value directly.
-                                       if (! 
rawTypeMeta.canCreateNewInstance()) {
-                                               if (propList == null) {
-                                                       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(value1));
-
-                                                       if 
(propertyClass.isInstance(valueList) || (nn(setter) && 
setter.getParameterTypes().get(0).is(Collection.class))) {
-                                                               if (! 
elementType.isObject()) {
-                                                                       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));
-                                                                               
}
+                       } else if (isCollection && (setter == null || ! 
pcInfo.isAssignableFrom(vc))) {
+
+                               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(value1));
+                               }
+
+                               var valueList = (Collection)value1;
+                               var propList = (Collection)r;
+                               var elementType = rawTypeMeta.getElementType();
+
+                               // If the property type is abstract, then we 
either need to reuse the existing
+                               // collection (if it's not null), or try to 
assign the value directly.
+                               if (! rawTypeMeta.canCreateNewInstance()) {
+                                       if (propList == null) {
+                                               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(value1));
+
+                                               if 
(propertyClass.isInstance(valueList) || (nn(setter) && 
setter.getParameterTypes().get(0).is(Collection.class))) {
+                                                       if (! 
elementType.isObject()) {
+                                                               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));
                                                                        }
-                                                                       
valueList = l;
                                                                }
-                                                               
invokeSetter(bean, pName, valueList);
-                                                               return r;
+                                                               valueList = l;
                                                        }
-                                                       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(value1));
-                                               }
-                                               propList.clear();
-                                       } else {
-                                               if (propList == null) {
-                                                       propList = 
BeanCreator.of(Collection.class).type(rawTypeMeta).run();
-                                                       invokeSetter(bean, 
pName, propList);
-                                               } else {
-                                                       propList.clear();
+                                                       invokeSetter(bean, 
pName, valueList);
+                                                       return r;
                                                }
+                                               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(value1));
                                        }
-
-                                       // Set the values.
-                                       var propList2 = propList;
-                                       valueList.forEach(x -> {
-                                               if (! elementType.isObject())
-                                                       x = 
session.convertToType(x, elementType);
-                                               propList2.add(x);
-                                       });
-
+                                       propList.clear();
                                } else {
-                                       if (nn(swap) && value1 != null && 
swap.getSwapClass().isAssignableFrom(value1.getClass())) {
-                                               value1 = swap.unswap(session, 
value1, rawTypeMeta);
+                                       if (propList == null) {
+                                               propList = 
BeanCreator.of(Collection.class).type(rawTypeMeta).run();
+                                               invokeSetter(bean, pName, 
propList);
                                        } else {
-                                               value1 = 
session.convertToType(value1, rawTypeMeta);
+                                               propList.clear();
                                        }
-                                       invokeSetter(bean, pName, value1);
                                }
 
-                               return r;
+                               // Set the values.
+                               var propList2 = propList;
+                               valueList.forEach(x -> {
+                                       if (! elementType.isObject())
+                                               x = session.convertToType(x, 
elementType);
+                                       propList2.add(x);
+                               });
 
-                       } catch (BeanRuntimeException e) {
-                               throw e;
-                       } catch (Exception e1) {
-                               if (bc.isIgnoreInvocationExceptionsOnSetters()) 
{
-                                       if (rawTypeMeta.isPrimitive())
-                                               return 
rawTypeMeta.getPrimitiveDefault();
-                                       return null;
+                       } else {
+                               if (nn(swap) && value1 != null && 
swap.getSwapClass().isAssignableFrom(value1.getClass())) {
+                                       value1 = swap.unswap(session, value1, 
rawTypeMeta);
+                               } else {
+                                       value1 = session.convertToType(value1, 
rawTypeMeta);
                                }
-                               throw bex(e1, beanMeta.getClassMeta(), "Error 
occurred trying to set property ''{0}''", name);
+                               invokeSetter(bean, pName, value1);
                        }
-               } catch (ParseException e2) {
-                       throw bex(e2);
+
+                       return r;
+
+               } catch (BeanRuntimeException e) {
+                       throw e;
+               } catch (Exception e1) {
+                       if (bc.isIgnoreInvocationExceptionsOnSetters()) {
+                               if (rawTypeMeta.isPrimitive())
+                                       return 
rawTypeMeta.getPrimitiveDefault();
+                               return null;
+                       }
+                       throw bex(e1, beanMeta.getClassMeta(), "Error occurred 
trying to set property ''{0}''", name);
                }
        }
 
@@ -1209,35 +1219,10 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        if (bean == null)
                                return m.propertyCache.get(name);
 
-                       var session = m.getBeanSession();
-                       var o = getRaw(m, pName);
+               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);
-                       }
+               return swapAndFilterProperty(session, o);
 
                } catch (Throwable e) {
                        if (bc.isIgnoreInvocationExceptionsOnGetters()) {
@@ -1249,6 +1234,35 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                }
        }
 
+       private Object swapAndFilterProperty(BeanSession session, Object o) {
+               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);
+               }
+       }
+
        private Object invokeGetter(Object bean, String pName) throws 
IllegalArgumentException {
                if (isDyna) {
                        Map m = null;
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 4f675aa131..708d5213c0 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
@@ -1387,69 +1387,12 @@ public class BeanSession extends ContextSession {
 
                        // Target type is some sort of Map that needs to be 
converted.
                        if (to.isMap()) {
-                               try {
-                                       if (from.isMap()) {
-                                               var m = 
to.canCreateNewInstance(outer) ? (Map)to.newInstance(outer) : newGenericMap(to);
-                                               var keyType = to.getKeyType();
-                                               var valueType = 
to.getValueType();
-                                               ((Map<?,?>)value).forEach((k, 
v) -> {
-                                                       var k2 = k;
-                                                       if (! 
keyType.isObject()) {
-                                                               if 
(keyType.isString() && k.getClass() != Class.class)
-                                                                       k2 = 
k.toString();
-                                                               else
-                                                                       k2 = 
convertToMemberType(m, k, keyType);
-                                                       }
-                                                       var v2 = v;
-                                                       if (! 
valueType.isObject())
-                                                               v2 = 
convertToMemberType(m, v, valueType);
-                                                       m.put(k2, v2);
-                                               });
-                                               return (T)m;
-                                       } else if (! 
to.canCreateNewInstanceFromString(outer)) {
-                                               var m = 
JsonMap.ofJson(value.toString());
-                                               m.setBeanSession(this);
-                                               return 
convertToMemberType(outer, m, to);
-                                       }
-                               } catch (Exception e) {
-                                       throw new 
InvalidDataConversionException(value.getClass(), to, e);
-                               }
+                               return convertToMapType(outer, value, from, to);
                        }
 
                        // Target type is some sort of Collection
                        if (to.isCollection()) {
-                               try {
-                                       var l = to.canCreateNewInstance(outer) 
? (Collection)to.newInstance(outer) : to.isSet() ? set() : new JsonList(this);
-                                       var elementType = to.getElementType();
-
-                                       if (from.isArray()) {
-                                               for (var i = 0; i < 
Array.getLength(value); i++) {
-                                                       var o = 
Array.get(value, i);
-                                                       
l.add(elementType.isObject() ? o : convertToMemberType(l, o, elementType));
-                                               }
-                                       } else if (from.isCollection())
-                                               ((Collection)value).forEach(x 
-> l.add(elementType.isObject() ? x : convertToMemberType(l, x, elementType)));
-                                       else if (from.isMap())
-                                               l.add(elementType.isObject() ? 
value : convertToMemberType(l, value, elementType));
-                                       else if (isNullOrEmpty(value))
-                                               return null;
-                                       else if (from.isString()) {
-                                               var s = value.toString();
-                                               if (isProbablyJsonArray(s, 
false)) {
-                                                       var l2 = 
JsonList.ofJson(s);
-                                                       l2.setBeanSession(this);
-                                                       l2.forEach(x -> 
l.add(elementType.isObject() ? x : convertToMemberType(l, x, elementType)));
-                                               } else {
-                                                       throw new 
InvalidDataConversionException(value.getClass(), to, null);
-                                               }
-                                       } else
-                                               throw new 
InvalidDataConversionException(value.getClass(), to, null);
-                                       return (T)l;
-                               } catch (InvalidDataConversionException e) {
-                                       throw e;
-                               } catch (Exception e) {
-                                       throw new 
InvalidDataConversionException(value.getClass(), to, e);
-                               }
+                               return convertToCollectionType(outer, value, 
from, to);
                        }
 
                        if (to.isEnum()) {
@@ -1658,4 +1601,77 @@ public class BeanSession extends ContextSession {
                });
                return array;
        }
+
+       private <T> T convertToMapType(Object outer, Object value, ClassMeta<?> 
from, ClassMeta<T> to) {
+               try {
+                       if (from.isMap()) {
+                               var m = to.canCreateNewInstance(outer) ? 
(Map)to.newInstance(outer) : newGenericMap(to);
+                               var keyType = to.getKeyType();
+                               var valueType = to.getValueType();
+                               ((Map<?,?>)value).forEach((k, v) -> {
+                                       var k2 = k;
+                                       if (! keyType.isObject()) {
+                                               if (keyType.isString() && 
k.getClass() != Class.class)
+                                                       k2 = k.toString();
+                                               else
+                                                       k2 = 
convertToMemberType(m, k, keyType);
+                                       }
+                                       var v2 = v;
+                                       if (! valueType.isObject())
+                                               v2 = convertToMemberType(m, v, 
valueType);
+                                       m.put(k2, v2);
+                               });
+                               return (T)m;
+                       } else if (! to.canCreateNewInstanceFromString(outer)) {
+                               var m = JsonMap.ofJson(value.toString());
+                               m.setBeanSession(this);
+                               return convertToMemberType(outer, m, to);
+                       }
+                       return null;
+               } catch (Exception e) {
+                       throw new 
InvalidDataConversionException(value.getClass(), to, e);
+               }
+       }
+
+       private <T> T convertToCollectionType(Object outer, Object value, 
ClassMeta<?> from, ClassMeta<T> to) {
+               try {
+                       Collection l;
+                       if (to.canCreateNewInstance(outer)) {
+                               l = (Collection)to.newInstance(outer);
+                       } else if (to.isSet()) {
+                               l = set();
+                       } else {
+                               l = new JsonList(this);
+                       }
+                       var elementType = to.getElementType();
+       
+                       if (from.isArray()) {
+                               for (var i = 0; i < Array.getLength(value); 
i++) {
+                                       var o = Array.get(value, i);
+                                       l.add(elementType.isObject() ? o : 
convertToMemberType(l, o, elementType));
+                               }
+                       } else if (from.isCollection())
+                               ((Collection)value).forEach(x -> 
l.add(elementType.isObject() ? x : convertToMemberType(l, x, elementType)));
+                       else if (from.isMap())
+                               l.add(elementType.isObject() ? value : 
convertToMemberType(l, value, elementType));
+                       else if (isNullOrEmpty(value))
+                               return null;
+                       else if (from.isString()) {
+                               var s = value.toString();
+                               if (isProbablyJsonArray(s, false)) {
+                                       var l2 = JsonList.ofJson(s);
+                                       l2.setBeanSession(this);
+                                       l2.forEach(x -> 
l.add(elementType.isObject() ? x : convertToMemberType(l, x, elementType)));
+                               } else {
+                                       throw new 
InvalidDataConversionException(value.getClass(), to, null);
+                               }
+                       } else
+                               throw new 
InvalidDataConversionException(value.getClass(), to, null);
+                       return (T)l;
+               } catch (InvalidDataConversionException e) {
+                       throw e;
+               } catch (Exception e) {
+                       throw new 
InvalidDataConversionException(value.getClass(), to, e);
+               }
+       }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
index 999dd7bc2b..372367b124 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
@@ -360,7 +360,14 @@ public class BeanTraverseSession extends BeanSession {
                if (o == null)
                        return null;
                var c = o.getClass();
-               var cm = (nn(eType) && c == eType.inner()) ? eType : ((o 
instanceof ClassMeta) ? (ClassMeta<?>)o : getClassMeta(c));
+               ClassMeta<?> cm;
+               if (nn(eType) && c == eType.inner()) {
+                       cm = eType;
+               } else if (o instanceof ClassMeta) {
+                       cm = (ClassMeta<?>)o;
+               } else {
+                       cm = getClassMeta(c);
+               }
                if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
                        return cm;
                if (depth > getMaxDepth())
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/SchemaAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/SchemaAnnotation.java
index 2665c70325..8cc5e45566 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/SchemaAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/SchemaAnnotation.java
@@ -1613,6 +1613,27 @@ public class SchemaAnnotation {
                Predicate<Map<?,?>> nem = Utils::ne;
                Predicate<Boolean> nf = Utils::isTrue;
                Predicate<Long> nm1 = Utils::nm1;
+
+               // Handle exclusiveMaximum with Draft 2020-12 fallback
+               String exclusiveMaximumValue;
+               if (ne.test(a.exclusiveMaximumValue())) {
+                       exclusiveMaximumValue = a.exclusiveMaximumValue();
+               } else if (a.exclusiveMaximum() || a.emax()) {
+                       exclusiveMaximumValue = "true";
+               } else {
+                       exclusiveMaximumValue = null;
+               }
+
+               // Handle exclusiveMinimum with Draft 2020-12 fallback
+               String exclusiveMinimumValue;
+               if (ne.test(a.exclusiveMinimumValue())) {
+                       exclusiveMinimumValue = a.exclusiveMinimumValue();
+               } else if (a.exclusiveMinimum() || a.emin()) {
+                       exclusiveMinimumValue = "true";
+               } else {
+                       exclusiveMinimumValue = null;
+               }
+
                // @formatter:off
                return m
                        .appendIf(nem, "additionalProperties", 
parseMap(a.additionalProperties()))
@@ -1622,14 +1643,8 @@ public class SchemaAnnotation {
                        .appendIf(ne, "discriminator", a.discriminator())
                        .appendIf(ne, "description", joinnl(a.description(), 
a.d()))
                        .appendFirst(nec, "enum", parseSet(a.enum_()), 
parseSet(a.e()))
-                       // Handle exclusiveMaximum with Draft 2020-12 fallback
-                       .appendIf(ne, "exclusiveMaximum",
-                               ne.test(a.exclusiveMaximumValue()) ? 
a.exclusiveMaximumValue() :
-                               (a.exclusiveMaximum() || a.emax()) ? "true" : 
null)
-                       // Handle exclusiveMinimum with Draft 2020-12 fallback
-                       .appendIf(ne, "exclusiveMinimum",
-                               ne.test(a.exclusiveMinimumValue()) ? 
a.exclusiveMinimumValue() :
-                               (a.exclusiveMinimum() || a.emin()) ? "true" : 
null)
+                       .appendIf(ne, "exclusiveMaximum", exclusiveMaximumValue)
+                       .appendIf(ne, "exclusiveMinimum", exclusiveMinimumValue)
                        .appendIf(nem, "externalDocs", 
ExternalDocsAnnotation.merge(m.getMap("externalDocs"), a.externalDocs()))
                        .appendFirst(ne, "format", a.format(), a.f())
                        .appendIf(ne, "ignore", a.ignore() ? "true" : null)
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index 1e98b3c371..f9e4dd3b9f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -628,15 +628,15 @@ public class HtmlParserSession extends XmlParserSession {
                                                bpm.set(m, key, value);
                                        }
                                }
-                               // @formatter:off
-                               l.add(
-                                       m == null
-                                       ? null
-                                       : nn(builder)
-                                               ? builder.build(this, 
m.getBean(), elementType)
-                                               : (E)m.getBean()
-                               );
-                               // @formatter:on
+                               E element;
+                               if (m == null) {
+                                       element = null;
+                               } else if (nn(builder)) {
+                                       element = builder.build(this, 
m.getBean(), elementType);
+                               } else {
+                                       element = (E)m.getBean();
+                               }
+                               l.add(element);
                        } else {
                                String c = 
getAttributes(r).get(getBeanTypePropertyName(type.getElementType()));
                                var m = (Map)(elementType.isMap() && 
elementType.canCreateNewInstance(l) ? elementType.newInstance(l) : 
newGenericMap(elementType));
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartFormat.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartFormat.java
index ad70db2721..7e5ed00d11 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartFormat.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartFormat.java
@@ -237,7 +237,6 @@ public enum HttpPartFormat {
 
        @Override /* Overridden from Object */
        public String toString() {
-               String s = name().toLowerCase().replace('_', '-');
-               return s;
+               return name().toLowerCase().replace('_', '-');
        }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
index a1e91dfada..689fac799d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
@@ -1005,7 +1005,13 @@ public class WriterSerializer extends Serializer {
                streamCharset = builder.streamCharset;
                useWhitespace = builder.useWhitespace;
 
-               quoteCharValue = nn(quoteCharOverride) ? quoteCharOverride : 
nn(quoteChar) ? quoteChar : '"';
+               if (nn(quoteCharOverride)) {
+                       quoteCharValue = quoteCharOverride;
+               } else if (nn(quoteChar)) {
+                       quoteCharValue = quoteChar;
+               } else {
+                       quoteCharValue = '"';
+               }
        }
 
        @Override /* Overridden from Context */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
index 290a0f3590..81e3e5c0fa 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
@@ -858,8 +858,7 @@ public class UonParserSession extends ReaderParserSession 
implements HttpPartPar
         * @throws ParseException Attribute was malformed.
         */
        protected final Object parseAttr(UonReader r, boolean encoded) throws 
IOException, ParseException {
-               var attr = parseAttrName(r, encoded);
-               return attr;
+               return parseAttrName(r, encoded);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
index bf95c1737c..96084d739c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
@@ -1102,7 +1102,13 @@ public class UonSerializer extends WriterSerializer 
implements HttpPartSerialize
                quoteCharUon = builder.quoteCharUon;
 
                addBeanTypes2 = addBeanTypesUon || super.isAddBeanTypes();
-               quoteChar2 = nn(quoteCharUon) ? quoteCharUon : 
nn(super.quoteChar()) ? super.quoteChar() : '\'';
+               if (nn(quoteCharUon)) {
+                       quoteChar2 = quoteCharUon;
+               } else if (nn(super.quoteChar())) {
+                       quoteChar2 = super.quoteChar();
+               } else {
+                       quoteChar2 = '\'';
+               }
        }
 
        @Override /* Overridden from Context */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
index 8afa710b7a..1dfb4ad8c8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
@@ -459,7 +459,14 @@ public class UrlEncodingParserSession extends 
UonParserSession {
                                        }
                                } else if (state == S3) {
                                        if (c == -1 || c == '\u0001') {
-                                               var valueType = 
(ClassMeta<V>)(type.isArgs() ? type.getArg(argIndex++) : 
type.isCollectionOrArray() ? type.getElementType() : type.getValueType());
+                                               ClassMeta<V> valueType;
+                                               if (type.isArgs()) {
+                                                       valueType = 
(ClassMeta<V>)type.getArg(argIndex++);
+                                               } else if 
(type.isCollectionOrArray()) {
+                                                       valueType = 
(ClassMeta<V>)type.getElementType();
+                                               } else {
+                                                       valueType = 
(ClassMeta<V>)type.getValueType();
+                                               }
                                                V value = convertAttrToType(m, 
"", valueType);
                                                m.put(currAttr, value);
                                                if (c == -1)
@@ -467,7 +474,14 @@ public class UrlEncodingParserSession extends 
UonParserSession {
                                                state = S1;
                                        } else {
                                                // For performance, we bypass 
parseAnything for string values.
-                                               var valueType = 
(ClassMeta<V>)(type.isArgs() ? type.getArg(argIndex++) : 
type.isCollectionOrArray() ? type.getElementType() : type.getValueType());
+                                               ClassMeta<V> valueType;
+                                               if (type.isArgs()) {
+                                                       valueType = 
(ClassMeta<V>)type.getArg(argIndex++);
+                                               } else if 
(type.isCollectionOrArray()) {
+                                                       valueType = 
(ClassMeta<V>)type.getElementType();
+                                               } else {
+                                                       valueType = 
(ClassMeta<V>)type.getValueType();
+                                               }
                                                V value = 
(V)(valueType.isString() ? super.parseString(r.unread(), true) : 
super.parseAnything(valueType, r.unread(), outer, true, null));
 
                                                // If we already encountered 
this parameter, turn it into a list.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
index b31c30d062..9bc61aec01 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
@@ -538,7 +538,14 @@ public class XmlParserSession extends ReaderParserSession {
                        var event = r.nextTag();
                        if (event == START_ELEMENT) {
                                depth++;
-                               var elementType = type == null ? object() : 
type.isArgs() ? type.getArg(argIndex++) : type.getElementType();
+                               ClassMeta<?> elementType;
+                               if (type == null) {
+                                       elementType = object();
+                               } else if (type.isArgs()) {
+                                       elementType = type.getArg(argIndex++);
+                               } else {
+                                       elementType = type.getElementType();
+                               }
                                E value = (E)parseAnything(elementType, null, 
r, l, false, pMeta);
                                l.add(value);
                        } else if (event == END_ELEMENT) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index c8ee313b94..5c80cbe7d7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -467,8 +467,15 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
                                }
                        }
                }
-               if (contentProperty == null && ! hasContent)
-                       return (hasChildren ? CR_ELEMENTS : isVoidElement ? 
CR_VOID : CR_EMPTY);
+               if (contentProperty == null && ! hasContent) {
+                       if (hasChildren) {
+                               return CR_ELEMENTS;
+                       } else if (isVoidElement) {
+                               return CR_VOID;
+                       } else {
+                               return CR_EMPTY;
+                       }
+               }
 
                // Serialize XML content.
                if (nn(content)) {
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index 237f6100fa..257ef46db8 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -6223,8 +6223,16 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
                interceptors = nn(builder.interceptors) ? 
builder.interceptors.toArray(EMPTY_REST_CALL_INTERCEPTORS) : 
EMPTY_REST_CALL_INTERCEPTORS;
                keepHttpClientOpen = builder.keepHttpClientOpen;
                logger = nn(builder.logger) ? builder.logger : 
Logger.getLogger(cn(RestClient.class));
-               logRequests = nn(builder.logRequests) ? builder.logRequests : 
isDebug() ? DetailLevel.FULL : DetailLevel.NONE;
-               logRequestsLevel = nn(builder.logRequestsLevel) ? 
builder.logRequestsLevel : isDebug() ? Level.WARNING : Level.OFF;
+               if (nn(builder.logRequests)) {
+                       logRequests = builder.logRequests;
+               } else {
+                       logRequests = isDebug() ? DetailLevel.FULL : 
DetailLevel.NONE;
+               }
+               if (nn(builder.logRequestsLevel)) {
+                       logRequestsLevel = builder.logRequestsLevel;
+               } else {
+                       logRequestsLevel = isDebug() ? Level.WARNING : 
Level.OFF;
+               }
                logRequestsPredicate = nn(builder.logRequestsPredicate) ? 
builder.logRequestsPredicate : LOG_REQUESTS_PREDICATE_DEFAULT;
                logToConsole = builder.logToConsole || isDebug();
                parsers = builder.parsers().build();
@@ -7807,9 +7815,14 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
         * @param args The arguments.
         */
        protected void log(Level level, String msg, Object...args) {
-               logger.log(level, f(msg, args));
-               if (logToConsole)
+               if (logger.isLoggable(level)) {
+                       String formattedMsg = f(msg, args);
+                       logger.log(level, formattedMsg);
+                       if (logToConsole)
+                               console.println(formattedMsg);
+               } else if (logToConsole) {
                        console.println(f(msg, args));
+               }
        }
 
        /**
@@ -7822,8 +7835,15 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
         * @param args Optional message arguments.
         */
        protected void log(Level level, Throwable t, String msg, Object...args) 
{
-               logger.log(level, t, fs(msg, args));
-               if (logToConsole) {
+               if (logger.isLoggable(level)) {
+                       String formattedMsg = f(msg, args);
+                       logger.log(level, formattedMsg, t);
+                       if (logToConsole) {
+                               console.println(f(msg, args));
+                               if (nn(t))
+                                       t.printStackTrace(console);
+                       }
+               } else if (logToConsole) {
                        console.println(f(msg, args));
                        if (nn(t))
                                t.printStackTrace(console);
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
index c39128d190..b8ac16fb52 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
@@ -415,11 +415,7 @@ public class RestResponse implements HttpResponse, 
AutoCloseable {
                                                if (nn(e.getContentType()))
                                                        
sb.append("\n\t").append(e.getContentType());
                                                if (e.isRepeatable()) {
-                                                       try {
-                                                               
sb.append("\n---request content---\n").append(EntityUtils.toString(e));
-                                                       } catch (Exception ex) {
-                                                               
sb.append("\n---request content exception---\n").append(ex.getMessage());
-                                                       }
+                                                       
appendRequestContent(sb, e);
                                                }
                                        }
                                        sb.append("\n=== RESPONSE 
===\n").append(getStatusLine());
@@ -433,15 +429,7 @@ public class RestResponse implements HttpResponse, 
AutoCloseable {
                        }
 
                        for (var r : request.interceptors) {
-                               try {
-                                       r.onClose(request, this);
-                               } catch (RuntimeException | Error e) {
-                                       // Let unchecked exceptions propagate - 
these indicate programming errors that should be visible
-                                       throw e;
-                               } catch (Exception e) {
-                                       // Wrap checked exceptions from 
interceptors (including RestCallException)
-                                       throw new RestCallException(this, e, 
"Interceptor throw exception on close");
-                               }
+                               invokeInterceptorOnClose(r, request);
                        }
                        client.onCallClose(request, this);
                } catch (RuntimeException | Error e) {
@@ -469,6 +457,26 @@ public class RestResponse implements HttpResponse, 
AutoCloseable {
                return this;
        }
 
+       private void appendRequestContent(StringBuilder sb, HttpEntity e) {
+               try {
+                       sb.append("\n---request 
content---\n").append(EntityUtils.toString(e));
+               } catch (Exception ex) {
+                       sb.append("\n---request content 
exception---\n").append(ex.getMessage());
+               }
+       }
+
+       private void invokeInterceptorOnClose(RestCallInterceptor r, 
RestRequest request) throws RestCallException {
+               try {
+                       r.onClose(request, this);
+               } catch (RuntimeException | Error e) {
+                       // Let unchecked exceptions propagate - these indicate 
programming errors that should be visible
+                       throw e;
+               } catch (Exception e) {
+                       // Wrap checked exceptions from interceptors (including 
RestCallException)
+                       throw new RestCallException(this, e, "Interceptor throw 
exception on close");
+               }
+       }
+
        /**
         * Checks if a certain header is present in this message.
         *
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
index 3db67b7645..1a5cc6aaa6 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
@@ -117,7 +117,15 @@ public class RemoteOperationMeta {
 
                        methodReturn = new RemoteOperationReturn(mi);
 
-                       fullPath = path.indexOf("://") != -1 ? path : 
(parentPath.isEmpty() ? urlEncodePath(path) : (trimSlashes(parentPath) + '/' + 
urlEncodePath(path)));
+                       String fullPathValue;
+                       if (path.indexOf("://") != -1) {
+                               fullPathValue = path;
+                       } else if (parentPath.isEmpty()) {
+                               fullPathValue = urlEncodePath(path);
+                       } else {
+                               fullPathValue = trimSlashes(parentPath) + '/' + 
urlEncodePath(path);
+                       }
+                       fullPath = fullPathValue;
 
                        mi.getParameters().forEach(x -> {
                                var rma = RemoteOperationArg.create(x);
diff --git 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
index d60cdd2774..9c7f6012a6 100644
--- 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
+++ 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
@@ -56,8 +56,7 @@ public class MockServletRequest implements HttpServletRequest 
{
         * @return A new request.
         */
        public static MockServletRequest create() {
-               var r = new MockServletRequest();
-               return r;
+               return new MockServletRequest();
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index e42f801138..fab743a4ee 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -1742,7 +1742,13 @@ public class RestContext extends Context {
 
                @Override /* Overridden from ServletConfig */
                public ServletContext getServletContext() {
-                       return nn(inner) ? inner.getServletContext() : 
nn(parentContext) ? parentContext.getBuilder().getServletContext() : null;
+                       if (nn(inner)) {
+                               return inner.getServletContext();
+                       } else if (nn(parentContext)) {
+                               return 
parentContext.getBuilder().getServletContext();
+                       } else {
+                               return null;
+                       }
                }
 
                @Override /* Overridden from ServletConfig */
@@ -4650,11 +4656,7 @@ public class RestContext extends Context {
                                                                throw 
servletException("Could not call @RestInit method {0}.{1}.  Could not find 
prerequisites: {2}.", cns(m.getDeclaringClass()), m.getSignature(),
                                                                        
beanStore.getMissingParams(m, resource.get()));
                                                        }
-                                                       try {
-                                                               
m.invoke(resource.get(), beanStore.getParams(m, resource.get()));
-                                                       } catch (Exception e) {
-                                                               throw 
servletException(e, "Exception thrown from @RestInit method {0}.{1}.", 
cns(m.getDeclaringClass()), m.getSignature());
-                                                       }
+                                                       
restContext.invokeRestInitMethod(m, resource, beanStore);
                                                }
 
                                                var roc = rocb.build();
@@ -6067,12 +6069,7 @@ public class RestContext extends Context {
                        var statusCode = e2.getStatusLine().getStatusCode();
                        res.setStatus(statusCode);
 
-                       PrintWriter w = null;
-                       try {
-                               w = res.getWriter();
-                       } catch (@SuppressWarnings("unused") 
IllegalStateException x) {
-                               w = new PrintWriter(new 
OutputStreamWriter(res.getOutputStream(), UTF8));
-                       }
+                       PrintWriter w = getResponseWriter(res);
 
                        try (PrintWriter w2 = w) {
                                var httpMessage = 
RestUtils.getHttpResponseText(statusCode);
@@ -6099,6 +6096,22 @@ public class RestContext extends Context {
         * @param session The HTTP call.
         * @throws Exception Any exception can be thrown.
         */
+       void invokeRestInitMethod(MethodInfo m, Supplier<?> resource, 
BasicBeanStore beanStore) throws ServletException {
+               try {
+                       m.invoke(resource.get(), beanStore.getParams(m, 
resource.get()));
+               } catch (Exception e) {
+                       throw servletException(e, "Exception thrown from 
@RestInit method {0}.{1}.", cns(m.getDeclaringClass()), m.getSignature());
+               }
+       }
+
+       private PrintWriter getResponseWriter(HttpServletResponse res) throws 
IOException {
+               try {
+                       return res.getWriter();
+               } catch (@SuppressWarnings("unused") IllegalStateException x) {
+                       return new PrintWriter(new 
OutputStreamWriter(res.getOutputStream(), UTF8));
+               }
+       }
+
        protected void handleNotFound(RestSession session) throws Exception {
                var pathInfo = session.getPathInfo();
                var methodUC = session.getMethod();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
index b221ac53d1..135178e460 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
@@ -192,7 +192,14 @@ public class FormDataArg implements RestOpArg {
                var cm = bs.getClassMeta(type.innerType());
 
                if (multi) {
-                       Collection c = cm.isArray() ? list() : 
(Collection)(cm.canCreateNewInstance() ? cm.newInstance() : new JsonList());
+                       Collection c;
+                       if (cm.isArray()) {
+                               c = list();
+                       } else if (cm.canCreateNewInstance()) {
+                               c = (Collection)cm.newInstance();
+                       } else {
+                               c = new JsonList();
+                       }
                        rh.getAll(name).stream().map(x -> 
x.parser(ps).schema(schema).as(cm.getElementType()).orElse(null)).forEach(c::add);
                        return cm.isArray() ? toArray(c, 
cm.getElementType().inner()) : c;
                }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
index acc6b2032d..32bb770d94 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
@@ -238,7 +238,14 @@ public class HeaderArg implements RestOpArg {
                var cm = bs.getClassMeta(type.innerType());
 
                if (multi) {
-                       var c = cm.isArray() ? list() : 
(Collection)(cm.canCreateNewInstance() ? cm.newInstance() : new JsonList());
+                       Collection c;
+                       if (cm.isArray()) {
+                               c = list();
+                       } else if (cm.canCreateNewInstance()) {
+                               c = (Collection)cm.newInstance();
+                       } else {
+                               c = new JsonList();
+                       }
                        rh.stream(name).map(x -> 
x.parser(ps).schema(schema).as(cm.getElementType()).orElse(null)).forEach(c::add);
                        return cm.isArray() ? toArray(c, 
cm.getElementType().inner()) : c;
                }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
index 356f351199..de63bebcb4 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
@@ -193,7 +193,14 @@ public class QueryArg implements RestOpArg {
                var cm = bs.getClassMeta(type.innerType());
 
                if (multi) {
-                       var c = cm.isArray() ? list() : 
(Collection)(cm.canCreateNewInstance() ? cm.newInstance() : new JsonList());
+                       Collection c;
+                       if (cm.isArray()) {
+                               c = list();
+                       } else if (cm.canCreateNewInstance()) {
+                               c = (Collection)cm.newInstance();
+                       } else {
+                               c = new JsonList();
+                       }
                        rh.getAll(name).stream().map(x -> 
x.parser(ps).schema(schema).as(cm.getElementType()).orElse(null)).forEach(c::add);
                        return cm.isArray() ? toArray(c, 
cm.getElementType().inner()) : c;
                }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseBeanArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseBeanArg.java
index 550b19659a..03b342947c 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseBeanArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseBeanArg.java
@@ -71,7 +71,14 @@ public class ResponseBeanArg implements RestOpArg {
        protected ResponseBeanArg(ParameterInfo paramInfo, AnnotationWorkList 
annotations) {
                this.type = paramInfo.getParameterType().innerType();
                this.meta = ResponseBeanMeta.create(paramInfo, annotations);
-               var c = type instanceof Class ? (Class<?>)type : type 
instanceof ParameterizedType ? (Class<?>)((ParameterizedType)type).getRawType() 
: null;
+               Class<?> c;
+               if (type instanceof Class) {
+                       c = (Class<?>)type;
+               } else if (type instanceof ParameterizedType) {
+                       c = (Class<?>)((ParameterizedType)type).getRawType();
+               } else {
+                       c = null;
+               }
                if (c != Value.class)
                        throw new ArgException(paramInfo, "Type must be 
Value<?> on parameter annotated with @Response annotation");
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseCodeArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseCodeArg.java
index e0ab0f956a..58209d0184 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseCodeArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseCodeArg.java
@@ -56,7 +56,14 @@ public class ResponseCodeArg implements RestOpArg {
         */
        protected ResponseCodeArg(ParameterInfo paramInfo) {
                this.type = paramInfo.getParameterType().innerType();
-               var c = type instanceof Class ? (Class<?>)type : type 
instanceof ParameterizedType ? (Class<?>)((ParameterizedType)type).getRawType() 
: null;
+               Class<?> c;
+               if (type instanceof Class) {
+                       c = (Class<?>)type;
+               } else if (type instanceof ParameterizedType) {
+                       c = (Class<?>)((ParameterizedType)type).getRawType();
+               } else {
+                       c = null;
+               }
                if (c != Value.class || Value.getParameterType(type) != 
Integer.class)
                        throw new ArgException(paramInfo, "Type must be 
Value<Integer> on parameter annotated with @StatusCode annotation");
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseHeaderArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseHeaderArg.java
index f063d7c9a4..9543633617 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseHeaderArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/ResponseHeaderArg.java
@@ -83,7 +83,14 @@ public class ResponseHeaderArg implements RestOpArg {
                var ps = schema.getSerializer();
                this.meta = new ResponsePartMeta(HttpPartType.HEADER, schema, 
nn(ps) ? HttpPartSerializer.creator().type(ps).apply(annotations).create() : 
null);
 
-               var c = type instanceof Class ? (Class<?>)type : type 
instanceof ParameterizedType ? (Class<?>)((ParameterizedType)type).getRawType() 
: null;
+               Class<?> c;
+               if (type instanceof Class) {
+                       c = (Class<?>)type;
+               } else if (type instanceof ParameterizedType) {
+                       c = (Class<?>)((ParameterizedType)type).getRawType();
+               } else {
+                       c = null;
+               }
                if (c != Value.class)
                        throw new ArgException(pi, "Type must be Value<?> on 
parameter annotated with @Header annotation");
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
index 531591563f..a9f37daddb 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
@@ -803,9 +803,7 @@ public class BasicSwaggerProviderSession {
                if (schema.containsKey(SWAGGER_type) || 
schema.containsKey(SWAGGER_$ref))
                        return schema;
 
-               var om = fixSwaggerExtensions(schema.append(js.getSchema(cm)));
-
-               return om;
+               return fixSwaggerExtensions(schema.append(js.getSchema(cm)));
        }
 
        private static boolean isMulti(Header h) {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/UrlPathMatcher.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/UrlPathMatcher.java
index e89cfef38d..4756efcc3e 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/UrlPathMatcher.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/UrlPathMatcher.java
@@ -83,7 +83,13 @@ public abstract class UrlPathMatcher implements 
Comparable<UrlPathMatcher> {
 
                PathMatcher(String patternString) {
                        super(patternString);
-                       this.pattern = e(patternString) ? "/" : 
patternString.charAt(0) != '/' ? '/' + patternString : patternString;
+                       if (e(patternString)) {
+                               this.pattern = "/";
+                       } else if (patternString.charAt(0) != '/') {
+                               this.pattern = '/' + patternString;
+                       } else {
+                               this.pattern = patternString;
+                       }
 
                        var c = patternString.replaceAll("\\{[^\\}]+\\}", 
".").replaceAll("\\w+", "X").replaceAll("\\.", "W");
                        if (c.isEmpty())

Reply via email to