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