You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2026/06/03 17:54:27 UTC

(juneau) branch master updated: TODO-999: utility migration, FQCN cleanup, f()/fs() placeholder fix

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 7412139ef4 TODO-999: utility migration, FQCN cleanup, f()/fs() placeholder fix
7412139ef4 is described below

commit 7412139ef455bd2b7d3bbe245df7aa765048aa0b
Author: James Bognar <ja...@apache.org>
AuthorDate: Wed Jun 3 13:54:12 2026 -0400

    TODO-999: utility migration, FQCN cleanup, f()/fs() placeholder fix
    
    - Task 1: migrate null-or-isBlank/isEmpty -> StringUtils.isBlank/isEmpty (29 files),
      Objects.equals -> Utils.eq (2 files), ArrayList(Arrays.asList) -> CollectionUtils.list
      (3 files), String.format -> StringUtils.f (1 file), hint-comment fix (1 file)
    - Task 2: replace inline FQCNs with imports in MarkdownParserSession, RequestHttpPart,
      RestClient (19 substitutions; 1 FQCN retained due to name collision)
    - Task 7: fix f()/fs() calls using MessageFormat {N} placeholders -> %s/%d (8 files)
    
    Co-authored-by: Cursor <cu...@cursor.com>
---
 .../java/org/apache/juneau/junit/bct/BctUtils.java |  2 +-
 .../junit/bct/PropertyNotFoundException.java       |  4 +--
 .../apache/juneau/commons/bean/BeanMapEntry.java   |  4 ++-
 .../juneau/commons/reflect/ExecutableInfo.java     |  6 ++--
 .../org/apache/juneau/commons/runtime/Args.java    |  3 +-
 .../org/apache/juneau/commons/svl/VarResolver.java |  2 +-
 .../main/java/org/apache/juneau/UriResolver.java   |  2 +-
 .../org/apache/juneau/jsonschema/TypeCategory.java |  4 +--
 .../juneau/markdown/MarkdownParserSession.java     |  6 ++--
 .../org/apache/juneau/parser/ParserListener.java   |  4 +--
 .../juneau/serializer/SerializerListener.java      |  2 +-
 .../main/java/org/apache/juneau/sse/SseEvent.java  | 10 ++++---
 .../juneau/rest/client/classic/RestClient.java     | 32 +++++++++++-----------
 .../org/apache/juneau/rest/client/RestClient.java  |  5 ++--
 .../http/classic/response/BasicHttpException.java  |  4 +--
 .../juneau/http/response/BasicHttpException.java   |  4 +--
 .../juneau/rest/auth/jwt/JwtTokenValidator.java    |  5 ++--
 .../java/org/apache/juneau/rest/mcp/McpCursor.java |  4 ++-
 .../org/apache/juneau/rest/mcp/McpDispatcher.java  |  4 ++-
 .../micrometer/MicrometerMetricsRecorder.java      |  3 +-
 .../juneau/rest/auth/oidc/rp/OidcRelyingParty.java |  3 +-
 .../rest/auth/oidc/rp/OidcSessionAuthFilter.java   |  3 +-
 .../juneau/rest/tracing/otel/OtelTracerHook.java   |  3 +-
 .../tracing/otel/RestRequestTextMapGetter.java     |  4 ++-
 .../juneau/rest/auth/saml/SamlAuthFilter.java      |  3 +-
 .../rest/view/freemarker/FreemarkerDispatcher.java |  9 +++---
 .../rest/view/freemarker/FreemarkerView.java       |  9 +++---
 .../apache/juneau/rest/view/jsp/JspDispatcher.java |  3 +-
 .../org/apache/juneau/rest/view/jsp/JspView.java   |  9 +++---
 .../juneau/rest/view/jsp/JspViewRenderer.java      |  4 ++-
 .../rest/view/mustache/MustacheDispatcher.java     |  9 +++---
 .../juneau/rest/view/mustache/MustacheView.java    |  9 +++---
 .../rest/view/thymeleaf/ThymeleafDispatcher.java   |  5 ++--
 .../juneau/rest/view/thymeleaf/ThymeleafView.java  |  9 +++---
 .../java/org/apache/juneau/rest/RestContext.java   | 16 +++++------
 .../apache/juneau/rest/auth/AuthFilterChain.java   |  3 +-
 .../juneau/rest/convention/FaviconProvider.java    |  6 ++--
 .../juneau/rest/httppart/RequestHttpPart.java      |  2 +-
 .../org/apache/juneau/rest/ops/AdminProvider.java  |  4 ++-
 .../java/org/apache/juneau/rest/ops/EchoMixin.java |  4 ++-
 .../rest/processor/ProblemDetailsProcessor.java    |  4 ++-
 .../org/apache/juneau/rest/sse/SseBroadcaster.java |  3 +-
 .../apache/juneau/rest/sse/SseSubscription.java    |  3 +-
 .../tracing/TraceContextResponseProcessor.java     |  4 ++-
 .../org/apache/juneau/rest/util/RestUtils.java     |  2 +-
 45 files changed, 142 insertions(+), 101 deletions(-)

diff --git a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BctUtils.java b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BctUtils.java
index c83ed6137d..10b3b0666e 100644
--- a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BctUtils.java
+++ b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BctUtils.java
@@ -60,7 +60,7 @@ public class BctUtils {
 	 * @return A new {@link AssertionFailedError} with formatted message and values.
 	 */
 	public static AssertionFailedError assertEqualsFailed(Object expected, Object actual, Supplier<String> messageSupplier) {
-		return new AssertionFailedError(opt(messageSupplier).map(x -> x.get()).orElse("Equals assertion failed.") + f(" ==> expected: <{0}> but was: <{1}>", expected, actual), expected, actual);
+		return new AssertionFailedError(opt(messageSupplier).map(x -> x.get()).orElse("Equals assertion failed.") + f(" ==> expected: <%s> but was: <%s>", expected, actual), expected, actual);
 	}
 
 	/**
diff --git a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/PropertyNotFoundException.java b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/PropertyNotFoundException.java
index 2e80f945dd..d742c3c5fa 100644
--- a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/PropertyNotFoundException.java
+++ b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/PropertyNotFoundException.java
@@ -62,7 +62,7 @@ public class PropertyNotFoundException extends RuntimeException {
 	 * @param objectType The type of object on which the property was sought
 	 */
 	public PropertyNotFoundException(String propertyName, Class<?> objectType) {
-		super(f("Property ''{0}'' not found on object of type {1}", propertyName, cns(objectType)));
+		super(f("Property '%s' not found on object of type %s", propertyName, cns(objectType)));
 	}
 
 	/**
@@ -73,7 +73,7 @@ public class PropertyNotFoundException extends RuntimeException {
 	 * @param cause The underlying cause of the exception
 	 */
 	public PropertyNotFoundException(String propertyName, Class<?> objectType, Throwable cause) {
-		super(f("Property ''{0}'' not found on object of type {1}", propertyName, cns(objectType)), cause);
+		super(f("Property '%s' not found on object of type %s", propertyName, cns(objectType)), cause);
 	}
 
 	/**
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
index 4afe2c67d6..6a9831ed55 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.commons.bean;
 
+import static org.apache.juneau.commons.utils.Utils.*;
+
 import java.util.*;
 
 /**
@@ -141,7 +143,7 @@ public class BeanMapEntry implements Map.Entry<String,Object> {
 			return true;
 		if (!(obj instanceof Map.Entry<?,?> other))
 			return false;
-		return Objects.equals(getKey(), other.getKey()) && Objects.equals(getValue(), other.getValue());
+		return eq(getKey(), other.getKey()) && eq(getValue(), other.getValue());
 	}
 
 	/**
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ExecutableInfo.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ExecutableInfo.java
index 2cf0d1f1fe..4b9111863f 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ExecutableInfo.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ExecutableInfo.java
@@ -122,7 +122,7 @@ public abstract class ExecutableInfo extends AccessibleInfo {
 		this.parameterTypes = memoize(() -> getParameters().stream().map(ParameterInfo::getParameterType).toList());
 		this.exceptions = memoize(() -> stream(inner.getExceptionTypes()).map(ClassInfo::of).map(ClassInfo.class::cast).toList());
 		this.declaredAnnotations = memoize(() -> stream(inner.getDeclaredAnnotations()).flatMap(AnnotationUtils::streamRepeated).map(a -> ai((Annotatable)this, a)).toList());
-		this.nameShort = memoize(() -> f("{0}({1})", getNameSimple(), getParameters().stream().map(p -> p.getParameterType().getNameSimple()).collect(joining(","))));
+		this.nameShort = memoize(() -> f("%s(%s)", getNameSimple(), getParameters().stream().map(p -> p.getParameterType().getNameSimple()).collect(joining(","))));
 		this.nameFull = memoize(this::findNameFull);
 		this.toString = memoize(this::findToString);
 	}
@@ -966,9 +966,9 @@ public abstract class ExecutableInfo extends AccessibleInfo {
 	private void checkIndex(int index) {
 		int pc = getParameterCount();
 		if (pc == 0)
-			throw new IndexOutOfBoundsException(f("Invalid index ''{0}''.  No parameters.", index));
+			throw new IndexOutOfBoundsException(f("Invalid index '%d'.  No parameters.", index));
 		if (index < 0 || index >= pc)
-			throw new IndexOutOfBoundsException(f("Invalid index ''{0}''.  Parameter count: {1}", index, pc));
+			throw new IndexOutOfBoundsException(f("Invalid index '%d'.  Parameter count: %d", index, pc));
 	}
 
 	private String findNameFull() {
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/runtime/Args.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/runtime/Args.java
index 661d38d42d..50dd78c799 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/runtime/Args.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/runtime/Args.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.commons.runtime;
 
+import static org.apache.juneau.commons.utils.CollectionUtils.*;
 import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.Utils.*;
 
@@ -366,7 +367,7 @@ public class Args {
 		private List<String> resolvePrefixes() {
 			List<String> p;
 			if (customPrefix != null) {
-				p = new ArrayList<>(Arrays.asList(customPrefix));
+				p = list(customPrefix);
 			} else {
 				p = new ArrayList<>();
 				if (allowLongFlags)
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/VarResolver.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/VarResolver.java
index 5dcf65c14c..d21b445ffd 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/VarResolver.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/VarResolver.java
@@ -101,7 +101,7 @@ public class VarResolver {
 			this.beanStore = copyFrom.beanStore;
 			vars = VarList.of(copyFrom.vars);
 			userBeans = new LinkedHashMap<>();
-			functions = new ArrayList<>(Arrays.asList(copyFrom.functions));
+			functions = list(copyFrom.functions);
 		}
 
 		/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriResolver.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriResolver.java
index 65431cfb2f..3b24b5a043 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriResolver.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriResolver.java
@@ -84,7 +84,7 @@ public class UriResolver {
 	}
 
 	private static boolean isSpecialUri(String s) {
-		if (s == null || s.isEmpty())
+		if (isEmpty(s))
 			return false;
 		var c = s.charAt(0);
 		if (c != 's' && c != 'c' && c != 'r')
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
index a64b541355..5ace7b0b28 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
@@ -74,7 +74,7 @@ public enum TypeCategory {
 	 * @return A comma-delimited list of values into a set of {@link TypeCategory} values.
 	 */
 	public static Set<TypeCategory> parse(String s) {
-		if (s == null || s.isEmpty())
+		if (isEmpty(s))
 			return Collections.emptySet();
 		Set<TypeCategory> set = CollectionUtils.set();
 		split(s, x -> set.add(valueOf(x.toUpperCase())));
@@ -88,7 +88,7 @@ public enum TypeCategory {
 	 * @return A comma-delimited list of values into an array of {@link TypeCategory} values.
 	 */
 	public static TypeCategory[] parseArray(String s) {
-		if (s == null || s.isEmpty())
+		if (isEmpty(s))
 			return new TypeCategory[0];
 		List<TypeCategory> list = list();
 		split(s, x -> list.add(valueOf(x.toUpperCase())));
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParserSession.java
index 5143c71920..6751a34b1b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParserSession.java
@@ -28,6 +28,8 @@ import org.apache.juneau.commons.function.Memoizer;
 import org.apache.juneau.json.*;
 import org.apache.juneau.json5.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.swap.BuilderSwap;
+import org.apache.juneau.swap.ObjectSwap;
 
 /**
  * Session object for {@link MarkdownParser}.
@@ -141,8 +143,8 @@ public class MarkdownParserSession extends ReaderParserSession {
 		if (eType == null)
 			eType = (ClassMeta<T>) object();
 
-		var swap = (org.apache.juneau.swap.ObjectSwap<T,Object>) eType.getSwap(this);
-		var builder = (org.apache.juneau.swap.BuilderSwap<T,Object>) eType.getBuilderSwap(this);
+		var swap = (ObjectSwap<T,Object>) eType.getSwap(this);
+		var builder = (BuilderSwap<T,Object>) eType.getBuilderSwap(this);
 		ClassMeta<?> sType;
 		if (builder != null)
 			sType = builder.getBuilderClassMeta(this);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java
index 39e8abdb79..e967619a45 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java
@@ -44,7 +44,7 @@ public class ParserListener {
 	 * @param p The bean property we had an issue on.
 	 */
 	public void onBeanSetterException(ParserSession session, Throwable t, BeanPropertyMeta p) {
-		onError(session, t, f("Could not call setValue() on property ''{0}'' of class ''{1}'', exception = {2}", p.getName(), p.getBeanMeta().getBeanInfo(), lm(t)));
+		onError(session, t, f("Could not call setValue() on property '%s' of class '%s', exception = %s", p.getName(), p.getBeanMeta().getBeanInfo(), lm(t)));
 	}
 
 	/**
@@ -72,6 +72,6 @@ public class ParserListener {
 	 * @param bean The bean.
 	 */
 	public <T> void onUnknownBeanProperty(ParserSession session, String propertyName, Class<T> beanClass, T bean) {
-		onError(session, null, f("Unknown property ''{0}'' encountered while trying to parse into class ''{1}'' at location {2}", propertyName, beanClass, session.getPosition()));
+		onError(session, null, f("Unknown property '%s' encountered while trying to parse into class '%s' at location %s", propertyName, beanClass, session.getPosition()));
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerListener.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerListener.java
index 82d9e60f0d..a3aa4a0d73 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerListener.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerListener.java
@@ -44,7 +44,7 @@ public class SerializerListener {
 	 * @param p The bean property we had an issue on.
 	 */
 	public void onBeanGetterException(SerializerSession session, Throwable t, BeanPropertyMeta p) {
-		onError(session, t, f("Could not call getValue() on property ''{0}'' of class ''{1}'', exception = {2}", p.getName(), p.getBeanMeta().getBeanInfo(), lm(t)));
+		onError(session, t, f("Could not call getValue() on property '%s' of class '%s', exception = %s", p.getName(), p.getBeanMeta().getBeanInfo(), lm(t)));
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/sse/SseEvent.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/sse/SseEvent.java
index 2cb01c705a..103be3490a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/sse/SseEvent.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/sse/SseEvent.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.sse;
 
+import static org.apache.juneau.commons.utils.Utils.*;
+
 import java.util.*;
 
 import org.apache.juneau.commons.bean.*;
@@ -175,10 +177,10 @@ public class SseEvent {
 			return true;
 		if (!(o instanceof SseEvent o2))
 			return false;
-		return Objects.equals(event, o2.event)
-			&& Objects.equals(data, o2.data)
-			&& Objects.equals(id, o2.id)
-			&& Objects.equals(retry, o2.retry);
+		return eq(event, o2.event)
+			&& eq(data, o2.data)
+			&& eq(id, o2.id)
+			&& eq(retry, o2.retry);
 	}
 
 	@Override /* Overridden from Object */
diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestClient.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestClient.java
index 1dc1a495b8..ff4ae7c9a2 100644
--- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestClient.java
+++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestClient.java
@@ -1216,7 +1216,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF addBeanTypes() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::addBeanTypes);
+			serializers().forEach(Serializer.Builder::addBeanTypes);
 			return self();
 		}
 
@@ -1337,7 +1337,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF addRootType() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::addRootType);
+			serializers().forEach(Serializer.Builder::addRootType);
 			return self();
 		}
 
@@ -1608,7 +1608,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		@Override
 		public SELF debug() {
 			super.debug();
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::debug);
+			serializers().forEach(Serializer.Builder::debug);
 			return headers(Debug.TRUE);
 		}
 
@@ -1834,7 +1834,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF detectRecursions() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::detectRecursions);
+			serializers().forEach(Serializer.Builder::detectRecursions);
 			return self();
 		}
 
@@ -2692,7 +2692,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF ignoreRecursions() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::ignoreRecursions);
+			serializers().forEach(Serializer.Builder::ignoreRecursions);
 			return self();
 		}
 
@@ -3067,7 +3067,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF keepNullProperties() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::keepNullProperties);
+			serializers().forEach(Serializer.Builder::keepNullProperties);
 			return self();
 		}
 
@@ -3716,7 +3716,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF paramFormatPlain() {
-			serializers().forEach(UonSerializer.Builder.class, org.apache.juneau.uon.UonSerializer.Builder::paramFormatPlain);
+			serializers().forEach(UonSerializer.Builder.class, UonSerializer.Builder::paramFormatPlain);
 			return self();
 		}
 
@@ -5005,7 +5005,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF sortCollections() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::sortCollections);
+			serializers().forEach(Serializer.Builder::sortCollections);
 			return self();
 		}
 
@@ -5043,7 +5043,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF sortMaps() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::sortMaps);
+			serializers().forEach(Serializer.Builder::sortMaps);
 			return self();
 		}
 
@@ -5084,7 +5084,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF sq() {
-			serializers().forEachWS(org.apache.juneau.serializer.WriterSerializer.Builder::sq);
+			serializers().forEachWS(WriterSerializer.Builder::sq);
 			return self();
 		}
 
@@ -5195,7 +5195,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF trimEmptyCollections() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::trimEmptyCollections);
+			serializers().forEach(Serializer.Builder::trimEmptyCollections);
 			return self();
 		}
 
@@ -5239,7 +5239,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF trimEmptyMaps() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::trimEmptyMaps);
+			serializers().forEach(Serializer.Builder::trimEmptyMaps);
 			return self();
 		}
 
@@ -5276,7 +5276,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF trimStringsOnRead() {
-			parsers().forEach(org.apache.juneau.parser.Parser.Builder::trimStrings);
+			parsers().forEach(Parser.Builder::trimStrings);
 			return self();
 		}
 
@@ -5311,7 +5311,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF trimStringsOnWrite() {
-			serializers().forEach(org.apache.juneau.serializer.Serializer.Builder::trimStrings);
+			serializers().forEach(Serializer.Builder::trimStrings);
 			return self();
 		}
 
@@ -5686,7 +5686,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF useWhitespace() {
-			serializers().forEachWS(org.apache.juneau.serializer.WriterSerializer.Builder::useWhitespace);
+			serializers().forEachWS(WriterSerializer.Builder::useWhitespace);
 			return self();
 		}
 
@@ -5723,7 +5723,7 @@ public class RestClient extends MarshallingContextable implements HttpClient, Cl
 		 * @return This object.
 		 */
 		public SELF ws() {
-			serializers().forEachWS(org.apache.juneau.serializer.WriterSerializer.Builder::ws);
+			serializers().forEachWS(WriterSerializer.Builder::ws);
 			return self();
 		}
 
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 fbc0a0aa2c..b4713b8c47 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
@@ -16,7 +16,8 @@
  */
 package org.apache.juneau.rest.client;
 
-import static org.apache.juneau.commons.utils.AssertionUtils.assertArgNotNull;
+import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.CollectionUtils.*;
 
 import java.io.*;
 import java.util.*;
@@ -385,7 +386,7 @@ public final class RestClient implements Closeable {
 		 * @return This object.
 		 */
 		public Builder bodyConverters(BodyConverter<?>... value) {
-			bodyConverters = new ArrayList<>(Arrays.asList(value));
+			bodyConverters = list(value);
 			return this;
 		}
 
diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpException.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpException.java
index 68591c3f31..1611d10cec 100644
--- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpException.java
+++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpException.java
@@ -222,9 +222,9 @@ public class BasicHttpException extends BasicRuntimeException implements HttpRes
 				msg = msg.replace('<', ' ').replace('>', ' ').replace('&', ' ');
 			var cls = cns(e);
 			if (msg == null)
-				sb.append(f("\nCaused by ({0})", cls));
+				sb.append(f("\nCaused by (%s)", cls));
 			else
-				sb.append(f("\nCaused by ({0}): {1}", cls, msg));
+				sb.append(f("\nCaused by (%s): %s", cls, msg));
 			e = e.getCause();
 		}
 		return sb.toString();
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 87d9273f22..96a03fca74 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
@@ -432,9 +432,9 @@ public class BasicHttpException extends RuntimeException implements HttpResponse
 				msg = msg.replace('<', ' ').replace('>', ' ').replace('&', ' ');
 			var cls = cns(e);
 			if (msg == null)
-				sb.append(f("\nCaused by ({0})", cls));
+				sb.append(f("\nCaused by (%s)", cls));
 			else
-				sb.append(f("\nCaused by ({0}): {1}", cls, msg));
+				sb.append(f("\nCaused by (%s): %s", cls, msg));
 			e = e.getCause();
 		}
 		return sb.toString();
diff --git a/juneau-rest/juneau-rest-server-jwt/src/main/java/org/apache/juneau/rest/auth/jwt/JwtTokenValidator.java b/juneau-rest/juneau-rest-server-jwt/src/main/java/org/apache/juneau/rest/auth/jwt/JwtTokenValidator.java
index 53c66f5ae3..883e7fb1ce 100644
--- a/juneau-rest/juneau-rest-server-jwt/src/main/java/org/apache/juneau/rest/auth/jwt/JwtTokenValidator.java
+++ b/juneau-rest/juneau-rest-server-jwt/src/main/java/org/apache/juneau/rest/auth/jwt/JwtTokenValidator.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.auth.jwt;
 
 import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.net.*;
 import java.security.*;
@@ -462,7 +463,7 @@ public class JwtTokenValidator implements TokenValidator {
 		verifyClaims(claims);
 
 		var subject = claims.getSubject();
-		if (subject == null || subject.isBlank())
+		if (isBlank(subject))
 			subject = "<no-sub>";
 		return new ClaimsPrincipal(subject, claims.toJSONObject());
 	}
@@ -470,7 +471,7 @@ public class JwtTokenValidator implements TokenValidator {
 	private void verifyClaims(JWTClaimsSet claims) throws AuthenticationException {
 		// Required claims: iss, aud, exp, nbf are non-negotiable defaults.
 		var iss = claims.getIssuer();
-		if (iss == null || iss.isBlank())
+		if (isBlank(iss))
 			throw reject("\"iss\" claim is required");
 		if (! issuer.equals(iss))
 			throw reject("\"iss\" claim does not match expected issuer");
diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java
index c078e3b4df..70e9b87c87 100644
--- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java
+++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.mcp;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
+
 import java.util.*;
 
 import org.apache.juneau.commons.inject.BeanStore;
@@ -89,7 +91,7 @@ public interface McpCursor {
 	 * @return Parsed offset.
 	 */
 	static int parseOffset(String cursor) {
-		if (cursor == null || cursor.isEmpty())
+		if (isEmpty(cursor))
 			return 0;
 		try {
 			var v = Integer.parseInt(cursor);
diff --git a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java
index ac2d411e8d..7fd0d00681 100644
--- a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java
+++ b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.mcp;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
+
 import java.util.*;
 import java.util.stream.*;
 
@@ -74,7 +76,7 @@ public class McpDispatcher {
 		var id = req.getId();
 		var method = req.getMethod();
 
-		if (method == null || method.isEmpty())
+		if (isEmpty(method))
 			return notification(id) ? null : errorResponse(id, CODE_INVALID_REQUEST, "Missing method", null);
 
 		try {
diff --git a/juneau-rest/juneau-rest-server-micrometer/src/main/java/org/apache/juneau/rest/metrics/micrometer/MicrometerMetricsRecorder.java b/juneau-rest/juneau-rest-server-micrometer/src/main/java/org/apache/juneau/rest/metrics/micrometer/MicrometerMetricsRecorder.java
index f05e88e7da..71a73ba404 100644
--- a/juneau-rest/juneau-rest-server-micrometer/src/main/java/org/apache/juneau/rest/metrics/micrometer/MicrometerMetricsRecorder.java
+++ b/juneau-rest/juneau-rest-server-micrometer/src/main/java/org/apache/juneau/rest/metrics/micrometer/MicrometerMetricsRecorder.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.metrics.micrometer;
 
 import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.time.*;
 
@@ -171,6 +172,6 @@ public class MicrometerMetricsRecorder implements MetricsRecorder {
 	}
 
 	private static String defaultIfBlank(String value, String fallback) {
-		return (value == null || value.isEmpty()) ? fallback : value;
+		return isEmpty(value) ? fallback : value;
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-oidc-rp/src/main/java/org/apache/juneau/rest/auth/oidc/rp/OidcRelyingParty.java b/juneau-rest/juneau-rest-server-oidc-rp/src/main/java/org/apache/juneau/rest/auth/oidc/rp/OidcRelyingParty.java
index 8bf1c962f0..7d6f51e4df 100644
--- a/juneau-rest/juneau-rest-server-oidc-rp/src/main/java/org/apache/juneau/rest/auth/oidc/rp/OidcRelyingParty.java
+++ b/juneau-rest/juneau-rest-server-oidc-rp/src/main/java/org/apache/juneau/rest/auth/oidc/rp/OidcRelyingParty.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.auth.oidc.rp;
 
 import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.io.*;
 import java.net.*;
@@ -1010,7 +1011,7 @@ public class OidcRelyingParty {
 	 * {@code redirect} parameter).
 	 */
 	private static String safeRelativePath(String value) {
-		if (value == null || value.isBlank())
+		if (isBlank(value))
 			return null;
 		if (! value.startsWith("/"))
 			return null;
diff --git a/juneau-rest/juneau-rest-server-oidc-rp/src/main/java/org/apache/juneau/rest/auth/oidc/rp/OidcSessionAuthFilter.java b/juneau-rest/juneau-rest-server-oidc-rp/src/main/java/org/apache/juneau/rest/auth/oidc/rp/OidcSessionAuthFilter.java
index 38c8e7e1fd..1ac18b4b4b 100644
--- a/juneau-rest/juneau-rest-server-oidc-rp/src/main/java/org/apache/juneau/rest/auth/oidc/rp/OidcSessionAuthFilter.java
+++ b/juneau-rest/juneau-rest-server-oidc-rp/src/main/java/org/apache/juneau/rest/auth/oidc/rp/OidcSessionAuthFilter.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.auth.oidc.rp;
 
 import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.util.*;
 
@@ -76,7 +77,7 @@ public class OidcSessionAuthFilter extends AuthFilter {
 				break;
 			}
 		}
-		if (value == null || value.isBlank())
+		if (isBlank(value))
 			return Optional.empty();
 		var session = sessionStore.lookup(value);
 		if (session.isEmpty())
diff --git a/juneau-rest/juneau-rest-server-otel/src/main/java/org/apache/juneau/rest/tracing/otel/OtelTracerHook.java b/juneau-rest/juneau-rest-server-otel/src/main/java/org/apache/juneau/rest/tracing/otel/OtelTracerHook.java
index 2b78db1fcb..0435eeb2a4 100644
--- a/juneau-rest/juneau-rest-server-otel/src/main/java/org/apache/juneau/rest/tracing/otel/OtelTracerHook.java
+++ b/juneau-rest/juneau-rest-server-otel/src/main/java/org/apache/juneau/rest/tracing/otel/OtelTracerHook.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.tracing.otel;
 
 import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.Utils.*;
 
 import java.util.*;
@@ -231,7 +232,7 @@ public class OtelTracerHook implements TracerHook {
 	}
 
 	private static String defaultIfBlank(String value, String fallback) {
-		return (value == null || value.isEmpty()) ? fallback : value;
+		return isEmpty(value) ? fallback : value;
 	}
 
 	private static final class OtelScope implements Scope {
diff --git a/juneau-rest/juneau-rest-server-otel/src/main/java/org/apache/juneau/rest/tracing/otel/RestRequestTextMapGetter.java b/juneau-rest/juneau-rest-server-otel/src/main/java/org/apache/juneau/rest/tracing/otel/RestRequestTextMapGetter.java
index 65cd276a3c..5527fdd022 100644
--- a/juneau-rest/juneau-rest-server-otel/src/main/java/org/apache/juneau/rest/tracing/otel/RestRequestTextMapGetter.java
+++ b/juneau-rest/juneau-rest-server-otel/src/main/java/org/apache/juneau/rest/tracing/otel/RestRequestTextMapGetter.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.tracing.otel;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
+
 import java.util.*;
 
 import org.apache.juneau.rest.*;
@@ -58,6 +60,6 @@ public final class RestRequestTextMapGetter implements TextMapGetter<RestRequest
 		if (! header.isPresent())
 			return null;
 		var value = header.orElse(null);
-		return (value == null || value.isEmpty()) ? null : value;
+		return isEmpty(value) ? null : value;
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-saml/src/main/java/org/apache/juneau/rest/auth/saml/SamlAuthFilter.java b/juneau-rest/juneau-rest-server-saml/src/main/java/org/apache/juneau/rest/auth/saml/SamlAuthFilter.java
index e95cc3a897..498e9f60fc 100644
--- a/juneau-rest/juneau-rest-server-saml/src/main/java/org/apache/juneau/rest/auth/saml/SamlAuthFilter.java
+++ b/juneau-rest/juneau-rest-server-saml/src/main/java/org/apache/juneau/rest/auth/saml/SamlAuthFilter.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.auth.saml;
 
 import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
@@ -198,7 +199,7 @@ public class SamlAuthFilter extends AuthFilter {
 		if (!matchesPath(req))
 			return Optional.empty();
 		var raw = req.getParameter(SAML_RESPONSE_PARAM);
-		if (raw == null || raw.isEmpty())
+		if (isEmpty(raw))
 			return Optional.empty();
 		var xml = decodeSamlResponse(raw);
 		var principal = runValidator(xml);
diff --git a/juneau-rest/juneau-rest-server-view-freemarker/src/main/java/org/apache/juneau/rest/view/freemarker/FreemarkerDispatcher.java b/juneau-rest/juneau-rest-server-view-freemarker/src/main/java/org/apache/juneau/rest/view/freemarker/FreemarkerDispatcher.java
index adce7de8d7..0958fc33bc 100644
--- a/juneau-rest/juneau-rest-server-view-freemarker/src/main/java/org/apache/juneau/rest/view/freemarker/FreemarkerDispatcher.java
+++ b/juneau-rest/juneau-rest-server-view-freemarker/src/main/java/org/apache/juneau/rest/view/freemarker/FreemarkerDispatcher.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.view.freemarker;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.io.*;
@@ -125,7 +126,7 @@ public class FreemarkerDispatcher implements RawTemplateDispatcher {
 	 * @return The template name with the configured suffix appended (if applicable).
 	 */
 	public String applyTemplateSuffix(String name) {
-		if (templateSuffix == null || templateSuffix.isEmpty())
+		if (isEmpty(templateSuffix))
 			return name;
 		if (name.endsWith(templateSuffix))
 			return name;
@@ -212,7 +213,7 @@ public class FreemarkerDispatcher implements RawTemplateDispatcher {
 	 * 	{@code "/"}).
 	 */
 	static String toResourceRoot(String base) {
-		if (base == null || base.isBlank())
+		if (isBlank(base))
 			return "/";
 		var s = base;
 		while (s.endsWith("/") && s.length() > 1)
@@ -293,7 +294,7 @@ public class FreemarkerDispatcher implements RawTemplateDispatcher {
 	 * 	{@code "/templates/"} and resolved {@code "/templates/hello.ftlh"}).
 	 */
 	static String stripBasePath(String base, String resolved) {
-		var bp = (base == null || base.isEmpty()) ? "/" : base;
+		var bp = isEmpty(base) ? "/" : base;
 		if (! bp.endsWith("/"))
 			bp = bp + "/";
 		if (! bp.startsWith("/"))
@@ -323,7 +324,7 @@ public class FreemarkerDispatcher implements RawTemplateDispatcher {
 		 * @return This object.
 		 */
 		public Builder basePath(String value) {
-			basePath = (value == null || value.isBlank()) ? DEFAULT_BASE_PATH : value;
+			basePath = isBlank(value) ? DEFAULT_BASE_PATH : value;
 			return this;
 		}
 
diff --git a/juneau-rest/juneau-rest-server-view-freemarker/src/main/java/org/apache/juneau/rest/view/freemarker/FreemarkerView.java b/juneau-rest/juneau-rest-server-view-freemarker/src/main/java/org/apache/juneau/rest/view/freemarker/FreemarkerView.java
index 5b5dae0961..8f23603a1c 100644
--- a/juneau-rest/juneau-rest-server-view-freemarker/src/main/java/org/apache/juneau/rest/view/freemarker/FreemarkerView.java
+++ b/juneau-rest/juneau-rest-server-view-freemarker/src/main/java/org/apache/juneau/rest/view/freemarker/FreemarkerView.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.view.freemarker;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.util.*;
@@ -106,7 +107,7 @@ public final class FreemarkerView implements View {
 	 * @throws IllegalArgumentException If {@code templateName} is {@code null} or blank.
 	 */
 	public static FreemarkerView of(String templateName) {
-		if (templateName == null || templateName.isBlank())
+		if (isBlank(templateName))
 			throw illegalArg("templateName must not be null or blank");
 		return new FreemarkerView(templateName, Map.of(), Map.of());
 	}
@@ -137,7 +138,7 @@ public final class FreemarkerView implements View {
 	 * 	is {@code null}.
 	 */
 	public FreemarkerView attr(String key, Object value) {
-		if (key == null || key.isBlank())
+		if (isBlank(key))
 			throw illegalArg("attribute key must not be null or blank");
 		if (value == null)
 			throw illegalArg("attribute value must not be null (attribute ''{0}'')", key);
@@ -161,7 +162,7 @@ public final class FreemarkerView implements View {
 			return this;
 		var copy = new LinkedHashMap<>(attributes);
 		values.forEach((k, v) -> {
-			if (k == null || k.isBlank())
+			if (isBlank(k))
 				throw illegalArg("attribute key must not be null or blank");
 			if (v == null)
 				throw illegalArg("attribute value must not be null (attribute ''{0}'')", k);
@@ -186,7 +187,7 @@ public final class FreemarkerView implements View {
 	 * 	is {@code null}.
 	 */
 	public FreemarkerView header(String name, String value) {
-		if (name == null || name.isBlank())
+		if (isBlank(name))
 			throw illegalArg("header name must not be null or blank");
 		if (value == null)
 			throw illegalArg("header value must not be null (header ''{0}'')", name);
diff --git a/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspDispatcher.java b/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspDispatcher.java
index 8d76011827..648021035b 100644
--- a/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspDispatcher.java
+++ b/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspDispatcher.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.view.jsp;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.io.*;
@@ -134,7 +135,7 @@ public class JspDispatcher implements RawTemplateDispatcher {
 		 * @return This object.
 		 */
 		public Builder basePath(String value) {
-			basePath = (value == null || value.isBlank()) ? DEFAULT_BASE_PATH : value;
+			basePath = isBlank(value) ? DEFAULT_BASE_PATH : value;
 			return this;
 		}
 
diff --git a/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspView.java b/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspView.java
index a5118a77a7..6196b21f19 100644
--- a/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspView.java
+++ b/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspView.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.view.jsp;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.util.*;
@@ -75,7 +76,7 @@ public final class JspView implements View {
 	 * @throws IllegalArgumentException If {@code templateName} is {@code null} or blank.
 	 */
 	public static JspView of(String templateName) {
-		if (templateName == null || templateName.isBlank())
+		if (isBlank(templateName))
 			throw illegalArg("templateName must not be null or blank");
 		return new JspView(templateName, Map.of(), Map.of());
 	}
@@ -104,7 +105,7 @@ public final class JspView implements View {
 	 * 	is {@code null}.
 	 */
 	public JspView attr(String key, Object value) {
-		if (key == null || key.isBlank())
+		if (isBlank(key))
 			throw illegalArg("attribute key must not be null or blank");
 		if (value == null)
 			throw illegalArg("attribute value must not be null (attribute ''{0}'')", key);
@@ -126,7 +127,7 @@ public final class JspView implements View {
 			return this;
 		var copy = new LinkedHashMap<>(attributes);
 		values.forEach((k, v) -> {
-			if (k == null || k.isBlank())
+			if (isBlank(k))
 				throw illegalArg("attribute key must not be null or blank");
 			if (v == null)
 				throw illegalArg("attribute value must not be null (attribute ''{0}'')", k);
@@ -151,7 +152,7 @@ public final class JspView implements View {
 	 * 	is {@code null}.
 	 */
 	public JspView header(String name, String value) {
-		if (name == null || name.isBlank())
+		if (isBlank(name))
 			throw illegalArg("header name must not be null or blank");
 		if (value == null)
 			throw illegalArg("header value must not be null (header ''{0}'')", name);
diff --git a/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspViewRenderer.java b/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspViewRenderer.java
index ef0104f76c..255827b7da 100644
--- a/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspViewRenderer.java
+++ b/juneau-rest/juneau-rest-server-view-jsp/src/main/java/org/apache/juneau/rest/view/jsp/JspViewRenderer.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.view.jsp;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
+
 import java.io.*;
 
 import org.apache.juneau.commons.utils.*;
@@ -173,7 +175,7 @@ public class JspViewRenderer implements ViewRenderer {
 	 * 	{@code ..} segments.
 	 */
 	static String joinPath(String basePath, String template) {
-		var bp = (basePath == null || basePath.isEmpty()) ? "/" : basePath;
+		var bp = isEmpty(basePath) ? "/" : basePath;
 		return FileUtils.resolveVirtualPathSafely(bp, template);
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-view-mustache/src/main/java/org/apache/juneau/rest/view/mustache/MustacheDispatcher.java b/juneau-rest/juneau-rest-server-view-mustache/src/main/java/org/apache/juneau/rest/view/mustache/MustacheDispatcher.java
index a4f680e3f4..781e6b67b1 100644
--- a/juneau-rest/juneau-rest-server-view-mustache/src/main/java/org/apache/juneau/rest/view/mustache/MustacheDispatcher.java
+++ b/juneau-rest/juneau-rest-server-view-mustache/src/main/java/org/apache/juneau/rest/view/mustache/MustacheDispatcher.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.view.mustache;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.io.*;
@@ -110,7 +111,7 @@ public class MustacheDispatcher implements RawTemplateDispatcher {
 	 * @return The template name with the configured suffix appended (if applicable).
 	 */
 	public String applyTemplateSuffix(String name) {
-		if (templateSuffix == null || templateSuffix.isEmpty())
+		if (isEmpty(templateSuffix))
 			return name;
 		if (name.endsWith(templateSuffix))
 			return name;
@@ -181,7 +182,7 @@ public class MustacheDispatcher implements RawTemplateDispatcher {
 	 * @return The mustache.java resource root (never {@code null}).
 	 */
 	static String toResourceRoot(String base) {
-		if (base == null || base.isBlank())
+		if (isBlank(base))
 			return "";
 		var s = base;
 		while (s.startsWith("/"))
@@ -259,7 +260,7 @@ public class MustacheDispatcher implements RawTemplateDispatcher {
 	 * 	{@code "/templates/"} and resolved {@code "/templates/hello.mustache"}).
 	 */
 	static String stripBasePath(String base, String resolved) {
-		var bp = (base == null || base.isEmpty()) ? "/" : base;
+		var bp = isEmpty(base) ? "/" : base;
 		if (! bp.endsWith("/"))
 			bp = bp + "/";
 		if (! bp.startsWith("/"))
@@ -288,7 +289,7 @@ public class MustacheDispatcher implements RawTemplateDispatcher {
 		 * @return This object.
 		 */
 		public Builder basePath(String value) {
-			basePath = (value == null || value.isBlank()) ? DEFAULT_BASE_PATH : value;
+			basePath = isBlank(value) ? DEFAULT_BASE_PATH : value;
 			return this;
 		}
 
diff --git a/juneau-rest/juneau-rest-server-view-mustache/src/main/java/org/apache/juneau/rest/view/mustache/MustacheView.java b/juneau-rest/juneau-rest-server-view-mustache/src/main/java/org/apache/juneau/rest/view/mustache/MustacheView.java
index 350d007310..c7d568b2e6 100644
--- a/juneau-rest/juneau-rest-server-view-mustache/src/main/java/org/apache/juneau/rest/view/mustache/MustacheView.java
+++ b/juneau-rest/juneau-rest-server-view-mustache/src/main/java/org/apache/juneau/rest/view/mustache/MustacheView.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.view.mustache;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.util.*;
@@ -101,7 +102,7 @@ public final class MustacheView implements View {
 	 * @throws IllegalArgumentException If {@code templateName} is {@code null} or blank.
 	 */
 	public static MustacheView of(String templateName) {
-		if (templateName == null || templateName.isBlank())
+		if (isBlank(templateName))
 			throw illegalArg("templateName must not be null or blank");
 		return new MustacheView(templateName, Map.of(), Map.of());
 	}
@@ -131,7 +132,7 @@ public final class MustacheView implements View {
 	 * 	is {@code null}.
 	 */
 	public MustacheView attr(String key, Object value) {
-		if (key == null || key.isBlank())
+		if (isBlank(key))
 			throw illegalArg("attribute key must not be null or blank");
 		if (value == null)
 			throw illegalArg("attribute value must not be null (attribute ''{0}'')", key);
@@ -155,7 +156,7 @@ public final class MustacheView implements View {
 			return this;
 		var copy = new LinkedHashMap<>(attributes);
 		values.forEach((k, v) -> {
-			if (k == null || k.isBlank())
+			if (isBlank(k))
 				throw illegalArg("attribute key must not be null or blank");
 			if (v == null)
 				throw illegalArg("attribute value must not be null (attribute ''{0}'')", k);
@@ -180,7 +181,7 @@ public final class MustacheView implements View {
 	 * 	is {@code null}.
 	 */
 	public MustacheView header(String name, String value) {
-		if (name == null || name.isBlank())
+		if (isBlank(name))
 			throw illegalArg("header name must not be null or blank");
 		if (value == null)
 			throw illegalArg("header value must not be null (header ''{0}'')", name);
diff --git a/juneau-rest/juneau-rest-server-view-thymeleaf/src/main/java/org/apache/juneau/rest/view/thymeleaf/ThymeleafDispatcher.java b/juneau-rest/juneau-rest-server-view-thymeleaf/src/main/java/org/apache/juneau/rest/view/thymeleaf/ThymeleafDispatcher.java
index f050dda129..90ec1fef4a 100644
--- a/juneau-rest/juneau-rest-server-view-thymeleaf/src/main/java/org/apache/juneau/rest/view/thymeleaf/ThymeleafDispatcher.java
+++ b/juneau-rest/juneau-rest-server-view-thymeleaf/src/main/java/org/apache/juneau/rest/view/thymeleaf/ThymeleafDispatcher.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.view.thymeleaf;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.io.*;
@@ -243,7 +244,7 @@ public class ThymeleafDispatcher implements RawTemplateDispatcher {
 	 * 	{@code "/templates/"} and resolved {@code "/templates/hello"}).
 	 */
 	static String stripBasePath(String base, String resolved) {
-		var bp = (base == null || base.isEmpty()) ? "/" : base;
+		var bp = isEmpty(base) ? "/" : base;
 		if (! bp.endsWith("/"))
 			bp = bp + "/";
 		if (! bp.startsWith("/"))
@@ -273,7 +274,7 @@ public class ThymeleafDispatcher implements RawTemplateDispatcher {
 		 * @return This object.
 		 */
 		public Builder basePath(String value) {
-			basePath = (value == null || value.isBlank()) ? DEFAULT_BASE_PATH : value;
+			basePath = isBlank(value) ? DEFAULT_BASE_PATH : value;
 			return this;
 		}
 
diff --git a/juneau-rest/juneau-rest-server-view-thymeleaf/src/main/java/org/apache/juneau/rest/view/thymeleaf/ThymeleafView.java b/juneau-rest/juneau-rest-server-view-thymeleaf/src/main/java/org/apache/juneau/rest/view/thymeleaf/ThymeleafView.java
index 62855ddac2..fb0460cd35 100644
--- a/juneau-rest/juneau-rest-server-view-thymeleaf/src/main/java/org/apache/juneau/rest/view/thymeleaf/ThymeleafView.java
+++ b/juneau-rest/juneau-rest-server-view-thymeleaf/src/main/java/org/apache/juneau/rest/view/thymeleaf/ThymeleafView.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.view.thymeleaf;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.util.*;
@@ -87,7 +88,7 @@ public final class ThymeleafView implements View {
 	 * @throws IllegalArgumentException If {@code templateName} is {@code null} or blank.
 	 */
 	public static ThymeleafView of(String templateName) {
-		if (templateName == null || templateName.isBlank())
+		if (isBlank(templateName))
 			throw illegalArg("templateName must not be null or blank");
 		return new ThymeleafView(templateName, Map.of(), Map.of());
 	}
@@ -117,7 +118,7 @@ public final class ThymeleafView implements View {
 	 * 	is {@code null}.
 	 */
 	public ThymeleafView attr(String key, Object value) {
-		if (key == null || key.isBlank())
+		if (isBlank(key))
 			throw illegalArg("attribute key must not be null or blank");
 		if (value == null)
 			throw illegalArg("attribute value must not be null (attribute ''{0}'')", key);
@@ -141,7 +142,7 @@ public final class ThymeleafView implements View {
 			return this;
 		var copy = new LinkedHashMap<>(attributes);
 		values.forEach((k, v) -> {
-			if (k == null || k.isBlank())
+			if (isBlank(k))
 				throw illegalArg("attribute key must not be null or blank");
 			if (v == null)
 				throw illegalArg("attribute value must not be null (attribute ''{0}'')", k);
@@ -166,7 +167,7 @@ public final class ThymeleafView implements View {
 	 * 	is {@code null}.
 	 */
 	public ThymeleafView header(String name, String value) {
-		if (name == null || name.isBlank())
+		if (isBlank(name))
 			throw illegalArg("header name must not be null or blank");
 		if (value == null)
 			throw illegalArg("header value must not be null (header ''{0}'')", name);
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 b2f50fc8b6..c98b1592a8 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
@@ -944,10 +944,10 @@ public class RestContext extends Context {
 		var anns = AnnotationProvider.INSTANCE.find(Rest.class, info(resourceClass));
 		for (var i = 0; i < anns.size(); i++) {
 			var raw = anns.get(i).inner().config();
-			if (raw == null || raw.isEmpty())
+			if (isEmpty(raw))
 				continue;
 			var resolvedName = vr.resolve(raw);
-			if (resolvedName == null || resolvedName.isEmpty())
+			if (isEmpty(resolvedName))
 				continue;
 			if (! seen.add(resolvedName))
 				continue;
@@ -2697,7 +2697,7 @@ public class RestContext extends Context {
 	 */
 	private final Memoizer<Long> asyncTimeoutMillis = memoizer(() -> {
 		var s = mergeReplacedStringAttribute(PROPERTY_asyncTimeoutMillis, null);
-		if (s == null || s.isEmpty())
+		if (isEmpty(s))
 			return -1L;
 		try {
 			return Long.parseLong(s.trim());
@@ -2718,7 +2718,7 @@ public class RestContext extends Context {
 	private final Memoizer<Executor> asyncCompletionExecutor = memoizer(() -> {
 		// Programmatic override takes priority over the annotation chain.
 		var name = resolveAsyncCompletionExecutorName();
-		if (name == null || name.isBlank())
+		if (isBlank(name))
 			return null;
 		var resolved = beanStore().getBean(Executor.class, name);
 		// Try ExecutorService as well (a common supertype users supply that is-a Executor).
@@ -3099,7 +3099,7 @@ public class RestContext extends Context {
 			try {
 				x.invoke(beanStore, getResource());
 			} catch (Exception e) {
-				getLogger().log(Level.WARNING, unwrap(e), () -> f("Error occurred invoking servlet-destroy method ''{0}''.", x.getFullName()));
+				getLogger().log(Level.WARNING, unwrap(e), () -> f("Error occurred invoking servlet-destroy method '%s'.", x.getFullName()));
 			}
 		}
 		if (!isMixinContext) {
@@ -3107,7 +3107,7 @@ public class RestContext extends Context {
 				try {
 					mctx.destroy();
 				} catch (Exception e) {
-					getLogger().log(Level.WARNING, unwrap(e), () -> f("Error occurred destroying mixin sub-context ''{0}''.", mctx.getResourceClass().getName()));
+					getLogger().log(Level.WARNING, unwrap(e), () -> f("Error occurred destroying mixin sub-context '%s'.", mctx.getResourceClass().getName()));
 				}
 			}
 		}
@@ -4325,7 +4325,7 @@ public class RestContext extends Context {
 			try {
 				x.invoke(session.getBeanStore(), getResource());
 			} catch (Exception e) {
-				getLogger().log(Level.WARNING, unwrap(e), () -> f("Error occurred invoking finish-call method ''{0}''.", x.getFullName()));
+				getLogger().log(Level.WARNING, unwrap(e), () -> f("Error occurred invoking finish-call method '%s'.", x.getFullName()));
 			}
 		}
 	}
@@ -4605,7 +4605,7 @@ public class RestContext extends Context {
 		var pathInfo = session.getPathInfo();
 		var methodUC = session.getMethod();
 		var rc = session.getStatus();
-		var onPath = pathInfo == null ? " on no pathInfo" : String.format(" on path '%s'", pathInfo);
+		var onPath = pathInfo == null ? " on no pathInfo" : f(" on path '%s'", pathInfo);
 		if (rc == SC_NOT_FOUND)
 			throw new NotFound("Method ''{0}'' not found on resource with matching pattern{1}.", methodUC, onPath);
 		else if (rc == SC_PRECONDITION_FAILED)
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/auth/AuthFilterChain.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/auth/AuthFilterChain.java
index 4055df218b..482c0de846 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/auth/AuthFilterChain.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/auth/AuthFilterChain.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.auth;
 
 import static org.apache.juneau.commons.utils.CollectionUtils.*;
+import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.io.*;
 import java.security.*;
@@ -203,7 +204,7 @@ public class AuthFilterChain implements Filter {
 		var path = (contextPath != null && !contextPath.isEmpty() && uri.startsWith(contextPath))
 			? uri.substring(contextPath.length())
 			: uri;
-		if (path == null || path.isEmpty())
+		if (isEmpty(path))
 			path = "/";
 		var urlPath = UrlPath.of(path);
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/convention/FaviconProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/convention/FaviconProvider.java
index 73abf00fe3..69a03b5f91 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/convention/FaviconProvider.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/convention/FaviconProvider.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.convention;
 
+import static org.apache.juneau.commons.utils.CollectionUtils.*;
+
 import java.io.*;
 import java.util.*;
 
@@ -90,9 +92,7 @@ public class FaviconProvider {
 	 * 	configured {@code Cache-Control} header.
 	 */
 	public HttpResource serve() {
-		var hdrs = new ArrayList<HttpHeader>();  // TODO - Use Utils.list()
-		hdrs.add(ContentType.of("image/x-icon"));
-		hdrs.add(CacheControl.of(cacheControl));
+		List<HttpHeader> hdrs = list(ContentType.of("image/x-icon"), CacheControl.of(cacheControl));
 		return HttpResourceBean.of(ByteArrayBody.of(bytes, "image/x-icon"), hdrs);
 	}
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/httppart/RequestHttpPart.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/httppart/RequestHttpPart.java
index 32a4e53a6c..ddd6490d14 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/httppart/RequestHttpPart.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/httppart/RequestHttpPart.java
@@ -522,7 +522,7 @@ public class RequestHttpPart {
 	public boolean equals(Object o) {
 		if (o instanceof org.apache.juneau.http.HttpPart hp)
 			return eq(getName(), hp.getName()) && eq(getValue(), hp.getValue());
-		if (o instanceof org.apache.juneau.http.HttpHeader hh)
+		if (o instanceof HttpHeader hh)
 			return eq(getName(), hh.getName()) && eq(getValue(), hh.getValue());
 		return false;
 	}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ops/AdminProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ops/AdminProvider.java
index 0ae83ff520..30325ee022 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ops/AdminProvider.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ops/AdminProvider.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.ops;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
+
 import java.io.*;
 import java.lang.management.*;
 import java.util.*;
@@ -286,7 +288,7 @@ public class AdminProvider {
 		 * @return This object.
 		 */
 		public Builder cacheFlush(String name, Runnable hook) {
-			if (name == null || name.isBlank())
+			if (isBlank(name))
 				throw new IllegalArgumentException("Argument 'name' must not be null or blank");
 			if (hook == null)
 				throw new IllegalArgumentException("Argument 'hook' must not be null");
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ops/EchoMixin.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ops/EchoMixin.java
index 5a2fe6e628..e0f407271a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ops/EchoMixin.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ops/EchoMixin.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.ops;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
+
 import java.io.*;
 import java.nio.charset.*;
 import java.util.*;
@@ -371,7 +373,7 @@ public class EchoMixin {
 		 * @return This object.
 		 */
 		public Builder redactHeader(String value) {
-			if (value == null || value.isBlank())
+			if (isBlank(value))
 				throw new IllegalArgumentException("Argument 'value' must not be null or blank");
 			redactedHeaders.add(value);
 			return this;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processor/ProblemDetailsProcessor.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processor/ProblemDetailsProcessor.java
index cb33b311f1..e1d4e5d21b 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processor/ProblemDetailsProcessor.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processor/ProblemDetailsProcessor.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.processor;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -250,7 +252,7 @@ public class ProblemDetailsProcessor implements ResponseProcessor {
 	}
 
 	private static boolean acceptsProblemJson(String accept) {
-		if (accept == null || accept.isEmpty())
+		if (isEmpty(accept))
 			return true;
 		return accept.contains(PROBLEM_JSON) || accept.contains("*/*");
 	}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/sse/SseBroadcaster.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/sse/SseBroadcaster.java
index e4a6b50fc7..2c54c763dc 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/sse/SseBroadcaster.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/sse/SseBroadcaster.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.sse;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.util.concurrent.*;
@@ -65,7 +66,7 @@ public class SseBroadcaster {
 		"resource" // Returned subscription is caller-owned and closed by the caller/framework.
 	})
 	public SseSubscription subscribe(String id) {
-		if (id == null || id.isEmpty())
+		if (isEmpty(id))
 			throw illegalArg("id cannot be null or empty.");
 		var subscription = new SseSubscription(id, queueSize, this::removeSubscriber);
 		var previous = subscriptions.put(id, subscription);
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/sse/SseSubscription.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/sse/SseSubscription.java
index 5e6c28c65c..3155979386 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/sse/SseSubscription.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/sse/SseSubscription.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.sse;
 
 import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.StringUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.util.*;
@@ -37,7 +38,7 @@ public class SseSubscription implements AutoCloseable, Iterable<SseEvent> {
 	private final Consumer<String> closeCallback;
 
 	SseSubscription(String id, int queueSize, Consumer<String> closeCallback) {
-		if (id == null || id.isEmpty())
+		if (isEmpty(id))
 			throw illegalArg("id cannot be null or empty.");
 		this.id = id;
 		this.queue = new LinkedBlockingDeque<>(queueSize);
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/tracing/TraceContextResponseProcessor.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/tracing/TraceContextResponseProcessor.java
index 0945bd85c8..70b58e3f31 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/tracing/TraceContextResponseProcessor.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/tracing/TraceContextResponseProcessor.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.tracing;
 
+import static org.apache.juneau.commons.utils.StringUtils.*;
+
 import java.io.*;
 import java.util.logging.*;
 
@@ -99,7 +101,7 @@ public class TraceContextResponseProcessor implements ResponseProcessor {
 
 		// NoOp short-circuit: no active tracer stashed a trace context for this request.
 		var traceparent = req.getAttribute(ATTR_TRACEPARENT).as(String.class).orElse(null);
-		if (traceparent == null || traceparent.isEmpty())
+		if (isEmpty(traceparent))
 			return NEXT;
 
 		var res = opSession.getResponse();
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
index 8c25f1f1a1..cba6e2ddef 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
@@ -299,7 +299,7 @@ public class RestUtils {
 	 * @return The converted path.
 	 */
 	public static String toValidContextPath(String s) {
-		if (s == null || s.isEmpty())
+		if (isEmpty(s))
 			return "";
 		s = trimTrailingSlashes(s);
 		if (s.isEmpty())