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 103fe96dc3 SonarQube bug fixes
103fe96dc3 is described below
commit 103fe96dc32b70bbe4e77a8b2d46464de464adaa
Author: James Bognar <[email protected]>
AuthorDate: Wed Feb 18 13:04:44 2026 -0500
SonarQube bug fixes
---
.../apache/juneau/commons/collections/Cache.java | 2 +-
.../juneau/commons/collections/MultiList.java | 180 +++++++++++----------
.../juneau/commons/collections/MultiMap.java | 127 ++++++++-------
.../apache/juneau/commons/logging/LogRecord.java | 5 +-
.../org/apache/juneau/commons/logging/Logger.java | 2 +-
.../apache/juneau/commons/reflect/ClassInfo.java | 4 +-
.../apache/juneau/commons/utils/StringUtils.java | 7 +-
.../org/apache/juneau/commons/utils/Utils.java | 2 +-
.../src/main/java/org/apache/juneau/BeanMeta.java | 1 +
.../apache/juneau/msgpack/MsgPackInputStream.java | 3 +-
.../java/org/apache/juneau/parser/ParserPipe.java | 6 +-
.../org/apache/juneau/examples/rest/TestUtils.java | 2 +-
.../org/apache/juneau/rest/client/RestClient.java | 4 +-
.../juneau/http/response/BasicHttpException.java | 14 ++
.../apache/juneau/rest/converter/Queryable.java | 84 +++++-----
.../resources/htdocs/scripts/MenuItemWidget.js | 2 +-
.../src/test/java/DefaultPackageTestClass.java | 2 +-
.../commons/reflect/ExecutableInfo_Test.java | 4 +-
.../juneau/rest/client/RestCallException_Test.java | 19 +--
19 files changed, 243 insertions(+), 227 deletions(-)
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/Cache.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/Cache.java
index 2f87edfa04..f7dd900611 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/Cache.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/Cache.java
@@ -488,7 +488,7 @@ public class Cache<K,V> {
protected Cache(Builder<K,V> builder) {
this.maxSize = builder.maxSize;
this.disableCaching = builder.cacheMode == NONE;
- this.supplier = builder.supplier != null ? builder.supplier :
(key) -> null;
+ this.supplier = builder.supplier != null ? builder.supplier :
key -> null;
this.isThreadLocal = builder.threadLocal;
if (isThreadLocal) {
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MultiList.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MultiList.java
index 01b230d88c..79f443f800 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MultiList.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MultiList.java
@@ -332,112 +332,116 @@ public class MultiList<E> extends AbstractList<E> {
public ListIterator<E> listIterator(int index) {
if (index < 0 || index > size())
throw new IndexOutOfBoundsException("Index: " + index +
", Size: " + size());
- return new ListIterator<>() {
- int currentIndex = index;
- int listIndex = 0;
- int offset = 0;
- ListIterator<E> currentIterator = null;
+ return new MultiListIterator(index);
+ }
- {
- // Initialize to the correct position
- for (var i = 0; i < l.length; i++) {
- var size = l[i].size();
- if (index < offset + size) {
- listIndex = i;
- currentIterator =
l[i].listIterator(index - offset);
- break;
- }
- offset += size;
- }
- if (currentIterator == null && l.length > 0) {
- // Index is at the end, position at the
last list
- listIndex = l.length - 1;
- currentIterator =
l[listIndex].listIterator(l[listIndex].size());
+ private final class MultiListIterator implements ListIterator<E> {
+ int currentIndex;
+ int listIndex;
+ int offset;
+ ListIterator<E> currentIterator;
+
+ MultiListIterator(int index) {
+ currentIndex = index;
+ listIndex = 0;
+ offset = 0;
+ currentIterator = null;
+ for (var i = 0; i < l.length; i++) {
+ var size = l[i].size();
+ if (index < offset + size) {
+ listIndex = i;
+ currentIterator =
l[i].listIterator(index - offset);
+ break;
}
+ offset += size;
}
+ if (currentIterator == null && l.length > 0) {
+ listIndex = l.length - 1;
+ currentIterator =
l[listIndex].listIterator(l[listIndex].size());
+ }
+ }
- @Override
- public boolean hasNext() {
- if (currentIterator == null)
- return false;
- if (currentIterator.hasNext())
- return true;
- for (var j = listIndex + 1; j < l.length; j++)
- if (l[j].size() > 0)
- return true;
+ @Override
+ public boolean hasNext() {
+ if (currentIterator == null)
return false;
- }
+ if (currentIterator.hasNext())
+ return true;
+ for (var j = listIndex + 1; j < l.length; j++)
+ if (l[j].size() > 0)
+ return true;
+ return false;
+ }
- @Override
- public E next() {
- if (currentIterator == null)
+ @Override
+ public E next() {
+ if (currentIterator == null)
+ throw new NoSuchElementException();
+ while (! currentIterator.hasNext()) {
+ if (listIndex + 1 >= l.length)
throw new NoSuchElementException();
- while (! currentIterator.hasNext()) {
- if (listIndex + 1 >= l.length)
- throw new
NoSuchElementException();
- listIndex++;
- currentIterator =
l[listIndex].listIterator();
- }
- currentIndex++;
- return currentIterator.next();
+ listIndex++;
+ currentIterator = l[listIndex].listIterator();
}
+ currentIndex++;
+ return currentIterator.next();
+ }
- @Override
- public boolean hasPrevious() {
- if (currentIterator == null)
- return false;
- if (currentIterator.hasPrevious())
- return true;
- for (var j = listIndex - 1; j >= 0; j--)
- if (l[j].size() > 0)
- return true;
+ @Override
+ public boolean hasPrevious() {
+ if (currentIterator == null)
return false;
- }
+ if (currentIterator.hasPrevious())
+ return true;
+ for (var j = listIndex - 1; j >= 0; j--)
+ if (l[j].size() > 0)
+ return true;
+ return false;
+ }
- @Override
- public E previous() {
- if (currentIterator == null)
+ @Override
+ public E previous() {
+ if (currentIterator == null)
+ throw new NoSuchElementException();
+ while (! currentIterator.hasPrevious()) {
+ if (listIndex == 0)
throw new NoSuchElementException();
- while (! currentIterator.hasPrevious()) {
- if (listIndex == 0)
- throw new
NoSuchElementException();
- listIndex--;
- currentIterator =
l[listIndex].listIterator(l[listIndex].size());
- }
- currentIndex--;
- return currentIterator.previous();
+ listIndex--;
+ currentIterator =
l[listIndex].listIterator(l[listIndex].size());
}
+ currentIndex--;
+ return currentIterator.previous();
+ }
- @Override
- public int nextIndex() {
- return currentIndex;
- }
+ @Override
+ public int nextIndex() {
+ return currentIndex;
+ }
- @Override
- public int previousIndex() {
- return currentIndex - 1;
- }
+ @Override
+ public int previousIndex() {
+ return currentIndex - 1;
+ }
- @Override
- public void remove() {
- if (currentIterator == null)
- throw new IllegalStateException();
- currentIterator.remove();
- currentIndex--;
- }
+ @Override
+ public void remove() {
+ if (currentIterator == null)
+ throw new IllegalStateException();
+ currentIterator.remove();
+ currentIndex--;
+ }
- @Override
- public void set(E e) {
- if (currentIterator == null)
- throw new IllegalStateException();
- currentIterator.set(e);
- }
+ @Override
+ public void set(E e) {
+ if (currentIterator == null)
+ throw new IllegalStateException();
+ currentIterator.set(e);
+ }
- @Override
- public void add(E e) {
- throw new
UnsupportedOperationException("MultiList does not support add operations");
- }
- };
+ @Override
+ public void add(E e) {
+ throw new UnsupportedOperationException("MultiList does
not support add operations");
+ }
}
/**
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MultiMap.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MultiMap.java
index a2cc71a78f..a466feb7a3 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MultiMap.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MultiMap.java
@@ -210,67 +210,7 @@ public class MultiMap<K,V> extends AbstractMap<K,V> {
return new AbstractSet<>() {
@Override
public Iterator<Entry<K,V>> iterator() {
- return new Iterator<>() {
- int mapIndex = 0;
- Iterator<Entry<K,V>> currentIterator;
- Set<K> seenKeys = new HashSet<>();
- Entry<K,V> nextEntry;
- Iterator<Entry<K,V>> lastIterator; //
Iterator that produced the last entry
- boolean canRemove = false; // Whether
remove() can be called
-
- {
- // Initialize to first map's
iterator
- if (m.length > 0) {
- currentIterator =
m[0].entrySet().iterator();
- advance();
- }
- }
-
- private void advance() {
- nextEntry = null;
- while (currentIterator != null)
{
- while
(currentIterator.hasNext()) {
- var entry =
currentIterator.next();
- if
(!seenKeys.contains(entry.getKey())) {
-
seenKeys.add(entry.getKey());
-
nextEntry = entry;
- return;
- }
- }
- // Move to next map
- mapIndex++;
- if (mapIndex <
m.length) {
- currentIterator
= m[mapIndex].entrySet().iterator();
- } else {
- currentIterator
= null;
- }
- }
- }
-
- @Override
- public boolean hasNext() {
- return nextEntry != null;
- }
-
- @Override
- public Entry<K,V> next() {
- if (nextEntry == null)
- throw new
NoSuchElementException();
- var result = nextEntry;
- lastIterator = currentIterator;
// Store the iterator that produced this entry
- canRemove = true;
- advance();
- return result;
- }
-
- @Override
- public void remove() {
- if (!canRemove || lastIterator
== null)
- throw new
IllegalStateException();
- lastIterator.remove();
- canRemove = false;
- }
- };
+ return new EntryIterator();
}
@Override
@@ -280,6 +220,71 @@ public class MultiMap<K,V> extends AbstractMap<K,V> {
};
}
+ private final class EntryIterator implements Iterator<Entry<K,V>> {
+ int mapIndex;
+ Iterator<Entry<K,V>> currentIterator;
+ final Set<K> seenKeys = new HashSet<>();
+ Entry<K,V> nextEntry;
+ Iterator<Entry<K,V>> lastIterator;
+ boolean canRemove;
+
+ EntryIterator() {
+ mapIndex = 0;
+ currentIterator = null;
+ nextEntry = null;
+ lastIterator = null;
+ canRemove = false;
+ if (m.length > 0) {
+ currentIterator = m[0].entrySet().iterator();
+ advance();
+ }
+ }
+
+ private void advance() {
+ nextEntry = null;
+ while (currentIterator != null) {
+ while (currentIterator.hasNext()) {
+ var entry = currentIterator.next();
+ if (!seenKeys.contains(entry.getKey()))
{
+ seenKeys.add(entry.getKey());
+ nextEntry = entry;
+ return;
+ }
+ }
+ mapIndex++;
+ if (mapIndex < m.length) {
+ currentIterator =
m[mapIndex].entrySet().iterator();
+ } else {
+ currentIterator = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ return nextEntry != null;
+ }
+
+ @Override
+ public Entry<K,V> next() {
+ if (nextEntry == null)
+ throw new NoSuchElementException();
+ var result = nextEntry;
+ lastIterator = currentIterator;
+ canRemove = true;
+ advance();
+ return result;
+ }
+
+ @Override
+ public void remove() {
+ if (!canRemove || lastIterator == null)
+ throw new IllegalStateException();
+ lastIterator.remove();
+ canRemove = false;
+ }
+ }
+
/**
* Returns the number of unique key-value mappings in this map.
*
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/logging/LogRecord.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/logging/LogRecord.java
index ed91be17be..e778a08514 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/logging/LogRecord.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/logging/LogRecord.java
@@ -49,8 +49,9 @@ import org.apache.juneau.commons.utils.*;
* </ul>
*/
@SuppressWarnings({
- "java:S115", // Constants use UPPER_snakeCase convention
- "java:S100" // Class name intentionally matches
java.util.logging.LogRecord
+ "java:S115", // Constants use UPPER_snakeCase convention
+ "java:S100", // Class name intentionally matches
java.util.logging.LogRecord
+ "java:S1192" // Rename not desired; extends java.util.logging.LogRecord
for compatibility
})
public class LogRecord extends java.util.logging.LogRecord {
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/logging/Logger.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/logging/Logger.java
index 8dbb12ee1b..a54e7694b7 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/logging/Logger.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/logging/Logger.java
@@ -75,7 +75,7 @@ import org.apache.juneau.commons.collections.Cache;
* <li class='jc'>{@link java.util.logging.Logger}
* </ul>
*/
-@SuppressWarnings("java:S100") // Class name intentionally matches
java.util.logging.Logger
+@SuppressWarnings({ "java:S100", "java:S1192" }) // Class name intentionally
matches java.util.logging.Logger for compatibility
public class Logger extends java.util.logging.Logger {
/**
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
index f2a2a04a20..714ce4e7dc 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
@@ -76,7 +76,7 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
private static final String ARG_type = "type";
private static final String ARG_pt = "pt";
- private static final Cache<Class,ClassInfoTyped> CACHE =
Cache.of(Class.class, ClassInfoTyped.class).build();
+ private static final Cache<Class,ClassInfo> CACHE =
Cache.of(Class.class, ClassInfo.class).build();
/** Reusable cached ClassInfo instance for Object.class. */
public static final ClassInfo OBJECT = ClassInfo.of(Object.class);
@@ -149,7 +149,7 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
* @return The constructed class info.
*/
public static <T> ClassInfoTyped<T> of(Class<T> inner) {
- return CACHE.get(inner, () -> new ClassInfoTyped<>(inner));
+ return (ClassInfoTyped<T>) CACHE.get(inner, () -> new
ClassInfoTyped<>(inner));
}
/**
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 6693fc74ca..26f1ff1a66 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
@@ -363,7 +363,7 @@ public class StringUtils {
var b0 = BASE64M2[i0];
var b1 = BASE64M2[i1];
var b2 = BASE64M2[i2];
- var b3 = BASE64M2[i3];
+ var b3 = BASE64M2[i3 & 0xff];
var o0 = (b0 << 2) | (b1 >>> 4);
var o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);
var o2 = ((b2 & 3) << 6) | b3;
@@ -1848,7 +1848,7 @@ public class StringUtils {
var result = new ArrayList<String>();
// Basic URL pattern: protocol://domain/path
- var pattern =
Pattern.compile("(?:https?|ftp)://[\\w\\-._~:/?#\\[\\]@!$&'()*+,;=%]+",
Pattern.CASE_INSENSITIVE);
+ var pattern =
Pattern.compile("(?:https?|ftp)://[\\w\\-.~:/?#\\[\\]@!$&'()*+,;=%]+",
Pattern.CASE_INSENSITIVE);
var matcher = pattern.matcher(str);
while (matcher.find()) {
result.add(matcher.group());
@@ -2668,8 +2668,9 @@ public class StringUtils {
if (end > lines.length)
end = lines.length;
var sb = new StringBuilder();
+ var format = String.format("%%0%dd", digits);
for (var l : l(lines).subList(start - 1, end))
- sb.append(String.format("%0" + digits + "d",
start++)).append(": ").append(l).append("\n");
+ sb.append(String.format(format, start++)).append(":
").append(l).append("\n");
return sb.toString();
}
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/Utils.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/Utils.java
index e74bd57037..6ce172a46e 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/Utils.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/Utils.java
@@ -1696,7 +1696,7 @@ public class Utils {
public static final void printLines(String[] lines) {
Logger log = Logger.getLogger(Utils.class);
for (var i = 0; i < lines.length; i++)
- log.info(String.format("%4s:" + lines[i], i + 1));
+ log.info(String.format("%4s:%s", i + 1, lines[i]));
}
/**
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 fa16d57ac3..11cec3d986 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
@@ -585,6 +585,7 @@ public class BeanMeta<T> {
beanProxyInvocationHandler =
mem(()->beanContext.isUseInterfaceProxies() && c.isInterface() ? new
BeanProxyInvocationHandler<>(this) : null);
}
+ @SuppressWarnings("java:S107") // 8 parameters needed for property
validation context
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)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackInputStream.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackInputStream.java
index 5524460b11..de83b2f303 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackInputStream.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackInputStream.java
@@ -60,7 +60,6 @@ public class MsgPackInputStream extends ParserInputStream {
/*0xF?*/
INT,INT,INT,INT,INT,INT,INT,INT,INT,INT,INT,INT,INT,INT,INT,INT
};
// @formatter:on
- private DataType currentDataType;
private long length;
private int lastByte;
private int extType;
@@ -140,7 +139,7 @@ public class MsgPackInputStream extends ParserInputStream {
int i = read();
if (i == -1)
throw ioex("Unexpected end of file found at position
{0}", pos2);
- currentDataType = TYPES[i];
+ DataType currentDataType = TYPES[i];
switch (currentDataType) {
case NULL, FLOAT: {
length = 4;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserPipe.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserPipe.java
index cb72a2f7fb..d2b512b7fb 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserPipe.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserPipe.java
@@ -72,7 +72,6 @@ public class ParserPipe implements Closeable {
private String inputString;
private InputStream inputStream;
private Reader reader;
- private ParserReader parserReader;
private boolean doClose;
private BinaryFormat binaryFormat;
private Positionable positionable;
@@ -255,10 +254,7 @@ public class ParserPipe implements Closeable {
public ParserReader getParserReader() throws IOException {
if (input == null)
return null;
- if (input instanceof ParserReader input2)
- parserReader = input2;
- else
- parserReader = new ParserReader(this);
+ ParserReader parserReader = input instanceof ParserReader
input2 ? input2 : new ParserReader(this);
return parserReader;
}
diff --git
a/juneau-examples/juneau-examples-rest-jetty-ftest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
b/juneau-examples/juneau-examples-rest-jetty-ftest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
index 85f6ec8ac7..63857c276d 100644
---
a/juneau-examples/juneau-examples-rest-jetty-ftest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
+++
b/juneau-examples/juneau-examples-rest-jetty-ftest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
@@ -147,7 +147,7 @@ public class TestUtils {
private static void printLines(String[] lines) {
for (var i = 0; i < lines.length; i++)
- System.err.println(String.format("%4s:" + lines[i], i +
1)); // NOT DEBUG
+ System.err.println(String.format("%4s:%s", i + 1,
lines[i])); // NOT DEBUG
}
public static void validateXml(Object o) throws Exception {
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 26a16684e7..ebd2238d36 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
@@ -6345,7 +6345,8 @@ public class RestClient extends BeanContextable
implements HttpClient, Closeable
mark = i;
// State machine requires state
transition to S5, SonarLint reports false positive
@SuppressWarnings({
- "java:S1854" // State machine
requires state transition to S5, SonarLint reports false positive
+ "java:S1854", // State machine
requires state transition to S5
+ "java:S1481" // unused
variable intentional; assignment is for side effect (state = S5)
})
var unused = (state = S5);
}
@@ -7781,6 +7782,7 @@ public class RestClient extends BeanContextable
implements HttpClient, Closeable
*/
@Override
@Deprecated(since = "9", forRemoval = true) // Object.finalize() is
deprecated
+ @SuppressWarnings("java:S1113") // Kept for detectLeaks; logs warning
when RestClient is GC'd without close
protected void finalize() throws Throwable {
if (detectLeaks && ! isClosed.get() && ! keepHttpClientOpen) {
var sb = new StringBuilder("WARNING: RestClient
garbage collected before it was finalized."); // NOT DEBUG
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
index 3947660529..f23bb1bd5d 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
@@ -290,6 +290,20 @@ public class BasicHttpException extends
BasicRuntimeException implements HttpRes
@Override /* Overridden from HttpMessage */
public StatusLine getStatusLine() { return statusLine; }
+ @Override /* Overridden from Object */
+ public boolean equals(Object o) {
+ return this == o || (o instanceof BasicHttpException other &&
eq(this, other, (x, y) -> {
+ Throwable t1 = x, t2 = y;
+ while (nn(t1) && nn(t2)) {
+ if (!Arrays.equals(t1.getStackTrace(),
t2.getStackTrace()))
+ return false;
+ t1 = t1.getCause();
+ t2 = t2.getCause();
+ }
+ return t1 == null && t2 == null;
+ }));
+ }
+
@Override /* Overridden from Object */
public int hashCode() {
int i = 0;
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converter/Queryable.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converter/Queryable.java
index b668592f2d..33e91a74d4 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converter/Queryable.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converter/Queryable.java
@@ -84,52 +84,52 @@ public class Queryable implements RestConverter {
* Swagger parameters for this converter.
*/
public static final String SWAGGER_PARAMS = """
- {
- in:'query',
- name:'s',
- description:'Search.
+\t\t{
+\t\t\tin:'query',
+\t\t\tname:'s',
+\t\t\tdescription:'Search.
\t\t\t\tKey/value pairs representing column names and search tokens.
\t\t\t\t\\'*\\' and \\'?\\' can be used as meta-characters in string fields.
\t\t\t\t\\'>\\', \\'>=\\', \\'<\\', and \\'<=\\' can be used as limits on
numeric and date fields.
\t\t\t\tDate fields can be matched with partial dates (e.g. \\'2018\\' to
match any date in the year 2018).',
- type:'array',
- collectionFormat:'csv',
- examples:{example:'?s=Bill*,birthDate>2000'}
- },{
- in:'query',
- name:'v',
- description:'View.
- Column names to display.',
- type:'array',
- collectionFormat:'csv',
- examples:{example:'?v=name,birthDate'}
- },{
- in:'query',
- name:'o',
- description:'Order by.
- Columns to sort by.
- Column names can be suffixed with \\'+\\' or
\\'-\\' to indicate ascending or descending order.
- The default is ascending order.',
- type:'array',
- collectionFormat:'csv',
- examples:{example:'?o=name,birthDate-'}
- },{
- in:'query',
- name:'p',
- description:'Position.
- Only return rows starting at the specified
index position (zero-indexed).
- Default is 0',
- type:'integer',
- examples:{example:'?p=100'}
- },{
- in:'query',
- name:'l',
- description:'Limit.
- Only return the specified number of rows.
- Default is 0 (meaning return all rows).',
- type:'integer',
- examples:{example:'?l=100'}
- }""";
+\t\t\ttype:'array',
+\t\t\tcollectionFormat:'csv',
+\t\t\texamples:{example:'?s=Bill*,birthDate>2000'}
+\t\t},{
+\t\t\tin:'query',
+\t\t\tname:'v',
+\t\t\tdescription:'View.
+\t\t\t\tColumn names to display.',
+\t\t\ttype:'array',
+\t\t\tcollectionFormat:'csv',
+\t\t\texamples:{example:'?v=name,birthDate'}
+\t\t},{
+\t\t\tin:'query',
+\t\t\tname:'o',
+\t\t\tdescription:'Order by.
+\t\t\t\tColumns to sort by.
+\t\t\t\tColumn names can be suffixed with \\'+\\' or \\'-\\' to indicate
ascending or descending order.
+\t\t\t\tThe default is ascending order.',
+\t\t\ttype:'array',
+\t\t\tcollectionFormat:'csv',
+\t\t\texamples:{example:'?o=name,birthDate-'}
+\t\t},{
+\t\t\tin:'query',
+\t\t\tname:'p',
+\t\t\tdescription:'Position.
+\t\t\t\tOnly return rows starting at the specified index position
(zero-indexed).
+\t\t\t\tDefault is 0',
+\t\t\ttype:'integer',
+\t\t\texamples:{example:'?p=100'}
+\t\t},{
+\t\t\tin:'query',
+\t\t\tname:'l',
+\t\t\tdescription:'Limit.
+\t\t\t\tOnly return the specified number of rows.
+\t\t\t\tDefault is 0 (meaning return all rows).',
+\t\t\ttype:'integer',
+\t\t\texamples:{example:'?l=100'}
+\t\t}""";
@Override /* Overridden from RestConverter */
public Object convert(RestRequest req, Object o) {
diff --git
a/juneau-rest/juneau-rest-server/src/main/resources/htdocs/scripts/MenuItemWidget.js
b/juneau-rest/juneau-rest-server/src/main/resources/htdocs/scripts/MenuItemWidget.js
index b06c194ce4..6856959bbe 100644
---
a/juneau-rest/juneau-rest-server/src/main/resources/htdocs/scripts/MenuItemWidget.js
+++
b/juneau-rest/juneau-rest-server/src/main/resources/htdocs/scripts/MenuItemWidget.js
@@ -25,7 +25,7 @@ function menuClick(item) {
popupItem = item;
}
-window.onclick = function(event) {
+globalThis.onclick = function(event) {
if (popupItem != null && popupItem != event.target && !
popupItem.nextElementSibling.contains(event.target)) {
closePopup();
}
diff --git a/juneau-utest/src/test/java/DefaultPackageTestClass.java
b/juneau-utest/src/test/java/DefaultPackageTestClass.java
index d14972216b..f3a1a0d2b5 100644
--- a/juneau-utest/src/test/java/DefaultPackageTestClass.java
+++ b/juneau-utest/src/test/java/DefaultPackageTestClass.java
@@ -18,7 +18,7 @@
// This class is intentionally in the default package to test line 588 false
branch
// where a class has $ (is an inner class) but has no package
-@SuppressWarnings("java:S1220")
+@SuppressWarnings({ "java:S1220", "java:S1228" }) // Intentionally in default
package for test
public class DefaultPackageTestClass {
public int testField; // Field for testing FieldInfo.getFullName()
with null package
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ExecutableInfo_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ExecutableInfo_Test.java
index ec2eaa3785..354891c609 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ExecutableInfo_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ExecutableInfo_Test.java
@@ -896,7 +896,7 @@ class ExecutableInfo_Test extends TestBase {
protected void protectedMethod() {}
static void staticMethod() {}
final void finalMethod() {}
- public void methodWithThrows() throws java.io.IOException,
java.lang.Exception {}
+ public void methodWithThrows() throws java.lang.Exception {}
public <T> void genericMethod(T t) {}
public <T extends Comparable<T>> void genericMethodWithBounds(T
t) {}
}
@@ -936,7 +936,7 @@ class ExecutableInfo_Test extends TestBase {
// Method with throws
var methodWithThrows = ci.getPublicMethod(x ->
x.hasName("methodWithThrows")).get();
- assertEquals("public void
org.apache.juneau.commons.reflect.ExecutableInfo_Test$ToStringTestClass.methodWithThrows()
throws java.io.IOException, java.lang.Exception", methodWithThrows.toString());
+ assertEquals("public void
org.apache.juneau.commons.reflect.ExecutableInfo_Test$ToStringTestClass.methodWithThrows()
throws java.lang.Exception", methodWithThrows.toString());
// Generic method
var genericMethod = ci.getPublicMethod(x ->
x.hasName("genericMethod")).get();
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestCallException_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestCallException_Test.java
index 238b243388..1ded2d22e8 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestCallException_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestCallException_Test.java
@@ -54,20 +54,13 @@ class RestCallException_Test extends TestBase {
}
@Test void a01_basic() throws Exception {
- try {
- client().build().get().run();
- fail();
- } catch (RestCallException e) {
- assertEquals(404, e.getResponseCode());
- assertNull(e.getCause());
- }
+ RestCallException ex1 = assertThrows(RestCallException.class,
() -> client().build().get().run());
+ assertEquals(404, ex1.getResponseCode());
+ assertNull(ex1.getCause());
- try {
- client().build().post("/echo",new
StringEntity("{f:")).run().getContent().as(ABean.class);
- fail();
- } catch (RestCallException e) {
- assertThrowable(Exception.class, "Could not find '}'",
e.getCause(ParseException.class));
- }
+ RestCallException ex2 = assertThrows(RestCallException.class,
() ->
+ client().build().post("/echo", new
StringEntity("{f:")).run().getContent().as(ABean.class));
+ assertThrowable(Exception.class, "Could not find '}'",
ex2.getCause(ParseException.class));
var e = new RestCallException(null, null, null);
assertNotNull(e.getThrown());