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 547e783793 TODO-238: Apply juneau-marshall quality-registry pilot 
fixes (BUG-02/07/09/15, IDIOM-02)
547e783793 is described below

commit 547e783793c3033047665195b2a99593f1f2a0b7
Author: James Bognar <[email protected]>
AuthorDate: Thu Jul 16 18:01:36 2026 -0400

    TODO-238: Apply juneau-marshall quality-registry pilot fixes 
(BUG-02/07/09/15, IDIOM-02)
    
    Shortlist from the codebase-quality-registry pilot across juneau-commons and
    juneau-marshall:
    
    - BUG-02: copy MsgPack serializer settings in Builder copy-constructors so
      configuration isn't lost on copy.
    - BUG-07: parse/match casing folded through Locale.ROOT 
(boolean/float/duration/
      enum/prototext/toml token parsing) to avoid locale-sensitive parsing.
    - BUG-09: getters return defensive/unmodifiable copies (MarshalledFilter 
property
      sets, SearchArgs.getSearch, HoconConcat.getParts, CBOR/MsgPack getBinary 
clone).
    - BUG-15: null-argument guards via assertArgNotNull (PojoWalker.walk, 
EnumFormat.parse).
    - IDIOM-02: throw via Shorts exception factories (ioex/iaex) instead of 
direct
      constructors with string concatenation.
    
    Co-authored-by: Cursor <[email protected]>
---
 .../src/main/java/org/apache/juneau/commons/io/LocalFile.java  |  2 +-
 .../apache/juneau/commons/svl/functions/BooleanFunctions.java  |  4 +++-
 .../java/org/apache/juneau/commons/svl/functions/MiniJson.java |  6 ++++--
 .../main/java/org/apache/juneau/marshall/BooleanFormat.java    |  4 +++-
 .../main/java/org/apache/juneau/marshall/DurationFormat.java   |  3 ++-
 .../src/main/java/org/apache/juneau/marshall/Enablement.java   |  2 +-
 .../src/main/java/org/apache/juneau/marshall/EnumFormat.java   |  4 ++++
 .../src/main/java/org/apache/juneau/marshall/FloatFormat.java  |  6 ++++--
 .../main/java/org/apache/juneau/marshall/MarshalledFilter.java | 10 +++++-----
 .../java/org/apache/juneau/marshall/MarshallingSession.java    |  3 +++
 .../java/org/apache/juneau/marshall/cbor/CborTokenReader.java  |  2 +-
 .../org/apache/juneau/marshall/collections/JsonPointer.java    |  6 ++++++
 .../java/org/apache/juneau/marshall/hjson/HjsonTokenizer.java  |  3 ++-
 .../java/org/apache/juneau/marshall/hocon/HoconTokenizer.java  |  3 ++-
 .../main/java/org/apache/juneau/marshall/hocon/HoconValue.java |  4 +++-
 .../java/org/apache/juneau/marshall/ini/IniParserSession.java  |  2 +-
 .../org/apache/juneau/marshall/jsonschema/TypeCategory.java    |  4 ++--
 .../apache/juneau/marshall/msgpack/MsgPackOutputStream.java    |  4 ++++
 .../org/apache/juneau/marshall/msgpack/MsgPackSerializer.java  |  2 ++
 .../org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java |  2 +-
 .../org/apache/juneau/marshall/objecttools/SearchArgs.java     |  2 +-
 .../juneau/marshall/prototext/PrototextParserSession.java      |  2 +-
 .../apache/juneau/marshall/prototext/PrototextTokenizer.java   |  6 +++---
 .../java/org/apache/juneau/marshall/stream/PojoWalker.java     |  7 +++++++
 .../org/apache/juneau/marshall/toml/TomlParserSession.java     |  2 +-
 .../java/org/apache/juneau/marshall/toml/TomlTokenizer.java    |  2 +-
 26 files changed, 68 insertions(+), 29 deletions(-)

diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/io/LocalFile.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/io/LocalFile.java
index daeed0b97a..598f69f512 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/io/LocalFile.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/io/LocalFile.java
@@ -256,7 +256,7 @@ public class LocalFile {
                if (nn(clazz)) {
                        var is = clazz.getResourceAsStream(clazzPath);
                        if (is == null)
-                               throw new IOException("Classpath resource not 
found: " + clazzPath + " (relative to " + cn(clazz) + ")");
+                               throw ioex("Classpath resource not found: %s 
(relative to %s)", clazzPath, cn(clazz));
                        return is;
                }
                return Files.newInputStream(path);
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/functions/BooleanFunctions.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/functions/BooleanFunctions.java
index ad9dbb6144..149db48bc9 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/functions/BooleanFunctions.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/functions/BooleanFunctions.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.commons.svl.functions;
 
+import static org.apache.juneau.commons.utils.Shorts.*;
+
 import org.apache.juneau.commons.svl.*;
 
 /**
@@ -117,6 +119,6 @@ public final class BooleanFunctions {
                        return true;
                if (t.isEmpty() || t.equalsIgnoreCase("false") || t.equals("0") 
|| t.equalsIgnoreCase("no") || t.equalsIgnoreCase("off"))
                        return false;
-               throw new IllegalArgumentException("cannot coerce '" + s + "' 
to boolean (accepted: true/1/yes/on, false/0/no/off, empty)");
+               throw iaex("cannot coerce '%s' to boolean (accepted: 
true/1/yes/on, false/0/no/off, empty)", s);
        }
 }
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/functions/MiniJson.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/functions/MiniJson.java
index 8cc8af33d2..ad4180cc4c 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/functions/MiniJson.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/svl/functions/MiniJson.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.commons.svl.functions;
 
+import static org.apache.juneau.commons.utils.Shorts.*;
+
 import java.util.*;
 
 /**
@@ -52,7 +54,7 @@ final class MiniJson {
                var result = p.parseValue();
                p.skipWs();
                if (p.pos < p.src.length())
-                       throw new IllegalArgumentException("Trailing characters 
at offset " + p.pos);
+                       throw iaex("Trailing characters at offset %s", p.pos);
                return result;
        }
 
@@ -194,7 +196,7 @@ final class MiniJson {
        }
 
        private IllegalArgumentException err(String msg) {
-               return new IllegalArgumentException(msg + " at offset " + pos);
+               return iaex("%s at offset %s", msg, pos);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/BooleanFormat.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/BooleanFormat.java
index 3c3a987744..3a56c1d673 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/BooleanFormat.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/BooleanFormat.java
@@ -18,6 +18,8 @@ package org.apache.juneau.marshall;
 
 import static org.apache.juneau.commons.utils.Shorts.*;
 
+import java.util.Locale;
+
 /**
  * Supported wire formats for {@link Boolean} / <code><jk>boolean</jk></code> 
values.
  *
@@ -183,7 +185,7 @@ public enum BooleanFormat {
                var s = value.trim();
                if (s.isEmpty())
                        throw iaex("Cannot parse a blank value as Boolean");
-               return switch (s.toLowerCase()) {
+               return switch (s.toLowerCase(Locale.ROOT)) {
                        case "true", "1", "yes", "y", "on" -> true;
                        case "false", "0", "no", "n", "off" -> false;
                        default -> throw iaex("Invalid boolean value '%s' for 
format %s", value, format);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/DurationFormat.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/DurationFormat.java
index 00b105239a..1cc9b30a23 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/DurationFormat.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/DurationFormat.java
@@ -18,6 +18,7 @@ package org.apache.juneau.marshall;
 
 import java.math.*;
 import java.time.*;
+import java.util.Locale;
 
 /**
  * Supported wire formats for {@link Duration} values.
@@ -172,7 +173,7 @@ public enum DurationFormat {
                BigDecimal nanos = null;
                if (valid) {
                        var value = new BigDecimal(s.substring(0, i));
-                       nanos = switch (s.substring(i).toLowerCase()) {
+                       nanos = switch 
(s.substring(i).toLowerCase(Locale.ROOT)) {
                                case "d" -> 
value.multiply(BigDecimal.valueOf(86_400_000_000_000L));
                                case "h" -> 
value.multiply(BigDecimal.valueOf(3_600_000_000_000L));
                                case "m" -> 
value.multiply(BigDecimal.valueOf(60_000_000_000L));
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Enablement.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Enablement.java
index 892a0f8888..7946a85620 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Enablement.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Enablement.java
@@ -58,7 +58,7 @@ public enum Enablement {
         * @return The resolved value, or <jk>null</jk> if no match found.
         */
        public static Enablement fromString(String s) {
-               return MAP.get(emptyIfNull(s).toUpperCase());
+               return MAP.get(emptyIfNull(s).toUpperCase(Locale.ROOT));
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/EnumFormat.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/EnumFormat.java
index 2d20199288..5e7fb5b316 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/EnumFormat.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/EnumFormat.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.marshall;
 
+import static org.apache.juneau.commons.utils.AssertionUtils.*;
 import static org.apache.juneau.commons.utils.Shorts.*;
 
 import java.util.*;
@@ -74,6 +75,8 @@ public enum EnumFormat {
        /** {@link Enum#ordinal()} as a numeric value. */
        ORDINAL;
 
+       private static final String ARG_enumClass = "enumClass";
+
        /**
         * Formats the specified enum value using this format.
         *
@@ -117,6 +120,7 @@ public enum EnumFormat {
                "java:S3776" // Cognitive complexity acceptable for enum format 
parsing dispatch
        })
        public static <E extends Enum<E>> E parse(String value, Class<E> 
enumClass) {
+               assertArgNotNull(ARG_enumClass, enumClass);
                if (value == null)
                        return null;
                var s = value.trim();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/FloatFormat.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/FloatFormat.java
index f6ffc2df82..8bac268cb5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/FloatFormat.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/FloatFormat.java
@@ -18,6 +18,8 @@ package org.apache.juneau.marshall;
 
 import static org.apache.juneau.commons.utils.Shorts.*;
 
+import java.util.Locale;
+
 /**
  * Supported wire formats for non-finite {@link Float} / {@link Double} values
  * ({@link Double#NaN NaN}, {@link Double#POSITIVE_INFINITY +Infinity}, {@link 
Double#NEGATIVE_INFINITY -Infinity}).
@@ -234,7 +236,7 @@ public enum FloatFormat {
        }
 
        private static double parseDouble(String s) {
-               var lower = s.toLowerCase();
+               var lower = s.toLowerCase(Locale.ROOT);
                return switch (lower) {
                        case "nan" -> Double.NaN;
                        case "infinity", "+infinity", "inf", "+inf" -> 
Double.POSITIVE_INFINITY;
@@ -244,7 +246,7 @@ public enum FloatFormat {
        }
 
        private static float parseFloat(String s) {
-               var lower = s.toLowerCase();
+               var lower = s.toLowerCase(Locale.ROOT);
                return switch (lower) {
                        case "nan" -> Float.NaN;
                        case "infinity", "+infinity", "inf", "+inf" -> 
Float.POSITIVE_INFINITY;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MarshalledFilter.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MarshalledFilter.java
index bb9408f937..be33e7a7da 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MarshalledFilter.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MarshalledFilter.java
@@ -603,10 +603,10 @@ public class MarshalledFilter implements BeanFilter {
        protected MarshalledFilter(Builder builder) {
                this.beanClass = builder.beanClass;
                this.typeName = builder.typeName;
-               this.properties = copyOf(builder.properties);
-               this.excludeProperties = copyOf(builder.excludeProperties);
-               this.readOnlyProperties = copyOf(builder.readOnlyProperties);
-               this.writeOnlyProperties = copyOf(builder.writeOnlyProperties);
+               this.properties = u(copyOf(builder.properties));
+               this.excludeProperties = u(copyOf(builder.excludeProperties));
+               this.readOnlyProperties = u(copyOf(builder.readOnlyProperties));
+               this.writeOnlyProperties = 
u(copyOf(builder.writeOnlyProperties));
                this.example = builder.example;
                this.implClass = builder.implClass;
                this.interfaceClass = builder.interfaceClass;
@@ -614,7 +614,7 @@ public class MarshalledFilter implements BeanFilter {
                this.unsortedProperties = builder.unsortedProperties;
                this.fluentSetters = builder.fluentSetters;
                this.propertyNamer = 
builder.propertyNamer.asOptional().orElse(null);
-               this.beanDictionary = builder.dictionary == null ? list() : 
u(copyOf(builder.dictionary));
+               this.beanDictionary = builder.dictionary == null ? u(list()) : 
u(copyOf(builder.dictionary));
                this.interceptor = 
builder.interceptor.asOptional().orElse(BeanInterceptor.DEFAULT);
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MarshallingSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MarshallingSession.java
index ce0258cfbe..89a38e91bb 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MarshallingSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MarshallingSession.java
@@ -70,6 +70,7 @@ public class MarshallingSession extends ContextSession 
implements ConverterSessi
        private static final String ARG_o = "o";
        private static final String ARG_c = "c";
        private static final String ARG_classes = "classes";
+       private static final String ARG_value = "value";
 
        /**
         * Builder class.
@@ -1160,6 +1161,7 @@ public class MarshallingSession extends ContextSession 
implements ConverterSessi
         */
        @Override
        public final <T> BeanMap<T> toBeanMap(T o) {
+               assertArgNotNull(ARG_o, o);
                if (o instanceof BeanMap o2)
                        return o2;
                return this.toBeanMap(o, (Class<T>)o.getClass());
@@ -1472,6 +1474,7 @@ public class MarshallingSession extends ContextSession 
implements ConverterSessi
         */
        @Override /* BeanSession */
        public final Collection<?> parseToList(CharSequence value) {
+               assertArgNotNull(ARG_value, value);
                return new Json5List(value).setBeanSession(this);
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/cbor/CborTokenReader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/cbor/CborTokenReader.java
index 0a58636dbd..914d69cc41 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/cbor/CborTokenReader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/cbor/CborTokenReader.java
@@ -417,7 +417,7 @@ public class CborTokenReader implements TokenReader {
        public byte[] getBinary() {
                if (currentToken != TokenType.VALUE_BINARY)
                        throw new IllegalStateException("Current token is not 
VALUE_BINARY (was " + currentToken + ")");
-               return currentBinary;
+               return currentBinary == null ? null : currentBinary.clone();
        }
 
        @Override /* TokenReader */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/collections/JsonPointer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/collections/JsonPointer.java
index ebb9b52e6f..8a2783c4d8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/collections/JsonPointer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/collections/JsonPointer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.marshall.collections;
 
+import static org.apache.juneau.commons.utils.AssertionUtils.*;
 import static org.apache.juneau.commons.utils.Shorts.*;
 
 import java.util.*;
@@ -56,6 +57,9 @@ public class JsonPointer {
        /** Sentinel distinguishing an absent value from a present 
<jk>null</jk> value during traversal. */
        private static final Object MISSING = new Object();
 
+       private static final String ARG_rawMemberName = "rawMemberName";
+       private static final String ARG_token = "token";
+
        /**
         * Parses and validates the specified RFC 6901 JSON Pointer string.
         *
@@ -74,6 +78,7 @@ public class JsonPointer {
         * @return The encoded reference token.
         */
        public static String encodeToken(String rawMemberName) {
+               assertArgNotNull(ARG_rawMemberName, rawMemberName);
                return rawMemberName.replace("~", "~0").replace("/", "~1");
        }
 
@@ -84,6 +89,7 @@ public class JsonPointer {
         * @return The decoded member name.
         */
        public static String decodeToken(String token) {
+               assertArgNotNull(ARG_token, token);
                return token.replace("~1", "/").replace("~0", "~");
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hjson/HjsonTokenizer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hjson/HjsonTokenizer.java
index 8cf206f77a..477ba9daed 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hjson/HjsonTokenizer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hjson/HjsonTokenizer.java
@@ -19,6 +19,7 @@ package org.apache.juneau.marshall.hjson;
 import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.io.*;
+import java.util.Locale;
 
 /**
  * Tokenizer for Hjson format.
@@ -317,7 +318,7 @@ public class HjsonTokenizer {
                if (matchNumberPrefix(raw, false) == raw.length()) {
                        var numStr = raw;
                        try {
-                               if (numStr.contains(".") || 
numStr.toLowerCase().contains("e"))
+                               if (numStr.contains(".") || 
numStr.toLowerCase(Locale.ROOT).contains("e"))
                                        return 
Token.number(Double.parseDouble(numStr));
                                return parseIntegerOrLongToken(numStr);
                        } catch (@SuppressWarnings("unused") 
NumberFormatException e) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hocon/HoconTokenizer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hocon/HoconTokenizer.java
index 9ae4c19d88..fae8893335 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hocon/HoconTokenizer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hocon/HoconTokenizer.java
@@ -19,6 +19,7 @@ package org.apache.juneau.marshall.hocon;
 import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.io.*;
+import java.util.Locale;
 
 /**
  * Tokenizer for HOCON (Human-Optimized Config Object Notation) format.
@@ -440,7 +441,7 @@ public class HoconTokenizer {
                if (matchNumberPrefix(raw, false) == raw.length()) {
                        var numStr = raw;
                        try {
-                               if (numStr.contains(".") || 
numStr.toLowerCase().contains("e"))
+                               if (numStr.contains(".") || 
numStr.toLowerCase(Locale.ROOT).contains("e"))
                                        return 
Token.number(Double.parseDouble(numStr));
                                return parseIntegerOrLongToken(numStr);
                        } catch (@SuppressWarnings("unused") 
NumberFormatException e) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hocon/HoconValue.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hocon/HoconValue.java
index a1da5f5714..a728cb12fd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hocon/HoconValue.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/hocon/HoconValue.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.marshall.hocon;
 
+import static org.apache.juneau.commons.utils.CollectionUtils.*;
+import static org.apache.juneau.commons.utils.Shorts.*;
 import static org.apache.juneau.commons.utils.StringUtils.*;
 
 import java.util.*;
@@ -335,7 +337,7 @@ public abstract sealed class HoconValue permits 
HoconValue.HoconObject, HoconVal
                 * @return The parts list.
                 */
                public List<HoconValue> getParts() {
-                       return parts;
+                       return u(copyOf(parts));
                }
 
                /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/ini/IniParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/ini/IniParserSession.java
index c4061cd90d..ed1163a470 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/ini/IniParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/ini/IniParserSession.java
@@ -275,7 +275,7 @@ public class IniParserSession extends ReaderParserSession 
implements RecordReada
                        return getJson5Parser().parse(trimmed, targetType);
                if (targetType.isNumber()) {
                        try {
-                               if (trimmed.contains(".") || 
trimmed.toLowerCase().contains("e"))
+                               if (trimmed.contains(".") || 
trimmed.toLowerCase(Locale.ROOT).contains("e"))
                                        return Double.parseDouble(trimmed);
                                return Long.parseLong(trimmed);
                        } catch (@SuppressWarnings("unused") 
NumberFormatException e) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/jsonschema/TypeCategory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/jsonschema/TypeCategory.java
index d8a007b29f..3a8370f2e9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/jsonschema/TypeCategory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/jsonschema/TypeCategory.java
@@ -78,7 +78,7 @@ public enum TypeCategory {
                if (isEmpty(s))
                        return Collections.emptySet();
                Set<TypeCategory> set = CollectionUtils.set();
-               split(s, x -> set.add(valueOf(x.toUpperCase())));
+               split(s, x -> set.add(valueOf(x.toUpperCase(Locale.ROOT))));
                return set;
        }
 
@@ -92,7 +92,7 @@ public enum TypeCategory {
                if (isEmpty(s))
                        return new TypeCategory[0];
                List<TypeCategory> list = list();
-               split(s, x -> list.add(valueOf(x.toUpperCase())));
+               split(s, x -> list.add(valueOf(x.toUpperCase(Locale.ROOT))));
                return list.toArray(new TypeCategory[list.size()]);
        }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackOutputStream.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackOutputStream.java
index 85483ef054..804f75982d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackOutputStream.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackOutputStream.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.marshall.msgpack;
 
+import static org.apache.juneau.commons.utils.AssertionUtils.*;
 import static org.apache.juneau.commons.utils.IoUtils.*;
 import static org.apache.juneau.marshall.msgpack.DataType.*;
 
@@ -48,6 +49,8 @@ public class MsgPackOutputStream extends OutputStream {
 
        private static final long L2X31 = ((long)(1 << 30)) * 2;
 
+       private static final String ARG_value = "value";
+
        /**
         * Constructor.
         *
@@ -394,6 +397,7 @@ public class MsgPackOutputStream extends OutputStream {
         * @return This stream.
         */
        MsgPackOutputStream appendBigInteger(BigInteger value) {
+               assertArgNotNull(ARG_value, value);
                if (value.bitLength() < 64)
                        return appendLong(value.longValue());
                if (value.signum() > 0 && value.bitLength() == 64)
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackSerializer.java
index 5b2e9b2c52..95b00469ed 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackSerializer.java
@@ -123,6 +123,7 @@ public class MsgPackSerializer extends 
OutputStreamSerializer implements MsgPack
                 */
                protected Builder(Builder copyFrom) {
                        super(assertArgNotNull(ARG_copyFrom, copyFrom));
+                       addBeanTypesMsgPack = copyFrom.addBeanTypesMsgPack;
                }
 
                /**
@@ -133,6 +134,7 @@ public class MsgPackSerializer extends 
OutputStreamSerializer implements MsgPack
                 */
                protected Builder(MsgPackSerializer copyFrom) {
                        super(assertArgNotNull(ARG_copyFrom, copyFrom));
+                       addBeanTypesMsgPack = copyFrom.addBeanTypesMsgPack;
                }
 
                /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java
index 2186be5fa3..912e0c07db 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java
@@ -336,7 +336,7 @@ public class MsgPackTokenReader implements TokenReader {
        public byte[] getBinary() {
                if (currentToken != TokenType.VALUE_BINARY)
                        throw new IllegalStateException("Current token is not 
VALUE_BINARY (was " + currentToken + ")");
-               return currentBinary;
+               return currentBinary == null ? null : currentBinary.clone();
        }
 
        @Override /* TokenReader */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/objecttools/SearchArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/objecttools/SearchArgs.java
index 007a35d302..ea5f0d7651 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/objecttools/SearchArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/objecttools/SearchArgs.java
@@ -105,5 +105,5 @@ public class SearchArgs {
         *
         * @return An unmodifiable map of query search terms.
         */
-       public Map<String,String> getSearch() { return search; }
+       public Map<String,String> getSearch() { return u(search); }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/prototext/PrototextParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/prototext/PrototextParserSession.java
index fcbcc6ba7f..8f480c07a9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/prototext/PrototextParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/prototext/PrototextParserSession.java
@@ -257,7 +257,7 @@ public class PrototextParserSession extends 
ReaderParserSession implements Recor
                        case IDENT -> {
                                var s = tok.stringValue();
                                if (s == null) yield null;
-                               var lower = s.toLowerCase();
+                               var lower = s.toLowerCase(Locale.ROOT);
                                if (lower.equals("true") || lower.equals("t") 
|| lower.equals("1"))
                                        yield Boolean.TRUE;
                                if (lower.equals("false") || lower.equals("f") 
|| lower.equals("0"))
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/prototext/PrototextTokenizer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/prototext/PrototextTokenizer.java
index 551cde5d94..74573636cd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/prototext/PrototextTokenizer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/prototext/PrototextTokenizer.java
@@ -197,7 +197,7 @@ class PrototextTokenizer {
                var isTerminator = term < 0
                        || term == ' ' || term == '\t' || term == '\n' || term 
== '\r' || term == 0x0B || term == 0x0C
                        || term == ',' || term == ';' || term == ']' || term == 
'}';
-               var tok = buf.toString().toLowerCase();
+               var tok = buf.toString().toLowerCase(Locale.ROOT);
                var isSpecial = isTerminator && (tok.equals("nan") || 
tok.equals("inf") || tok.equals("infinity"));
                // Restore consumed chars in reverse order (pushback is a LIFO 
stack — to make the next read
                // return buf[0], buf[0] must be on top, so we push buf[N-1] 
... buf[0]).
@@ -343,7 +343,7 @@ class PrototextTokenizer {
                while (isLetterOrUnderscore(peekChar()) || 
Character.isDigit(peekChar()))
                        sb.append((char) readChar());
                var s = sb.toString();
-               var lower = s.toLowerCase();
+               var lower = s.toLowerCase(Locale.ROOT);
                if (lower.equals("inf") || lower.equals("infinity"))
                        return new 
PrototextToken(PrototextToken.TokenType.FLOAT, neg ? Double.NEGATIVE_INFINITY : 
Double.POSITIVE_INFINITY);
                if (lower.equals("nan"))
@@ -522,7 +522,7 @@ class PrototextTokenizer {
        boolean readBoolean() throws IOException, ParseException {
                var t = read();
                if (t.type() == PrototextToken.TokenType.IDENT) {
-                       var s = t.stringValue().toLowerCase();
+                       var s = t.stringValue().toLowerCase(Locale.ROOT);
                        if (s.equals("true") || s.equals("t") || s.equals("1"))
                                return true;
                        if (s.equals("false") || s.equals("f") || s.equals("0"))
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/stream/PojoWalker.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/stream/PojoWalker.java
index 69b3f832f6..c3063ad2fa 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/stream/PojoWalker.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/stream/PojoWalker.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.marshall.stream;
 
+import static org.apache.juneau.commons.utils.AssertionUtils.*;
+
 import java.io.*;
 import java.lang.reflect.*;
 import java.math.*;
@@ -55,6 +57,9 @@ import org.apache.juneau.marshall.*;
 })
 public final class PojoWalker {
 
+       private static final String ARG_w = "w";
+       private static final String ARG_options = "options";
+
        /**
         * Databind-level settings honored by {@link PojoWalker}.
         *
@@ -128,6 +133,8 @@ public final class PojoWalker {
         * @throws IOException If the writer's underlying stream fails.
         */
        public static void walk(TokenWriter w, Object value, Options options) 
throws IOException {
+               assertArgNotNull(ARG_w, w);
+               assertArgNotNull(ARG_options, options);
                // Identity-based ancestor set: tracks the objects on the 
current walk path so a
                // self-referencing graph throws instead of overflowing the 
stack.  Shared-but-acyclic
                // references are fine because each node is removed from the 
set once its subtree completes.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/toml/TomlParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/toml/TomlParserSession.java
index cdcb9fb1b4..00f74d35c3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/toml/TomlParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/toml/TomlParserSession.java
@@ -273,7 +273,7 @@ public class TomlParserSession extends ReaderParserSession 
implements RecordRead
                        // Date-like patterns kept as string for convertValue 
to parse as LocalDate, YearMonth, Year
                        if (isDateLikeString(noUnderscore))
                                return s;
-                       if (s.contains(".") || s.toLowerCase().contains("e"))
+                       if (s.contains(".") || 
s.toLowerCase(Locale.ROOT).contains("e"))
                                return Double.parseDouble(noUnderscore);
                        try {
                                return Long.parseLong(noUnderscore);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/toml/TomlTokenizer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/toml/TomlTokenizer.java
index 83c9ff6ec2..6774be5ff4 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/toml/TomlTokenizer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/toml/TomlTokenizer.java
@@ -508,7 +508,7 @@ class TomlTokenizer {
                while (peek() >= 0 && Character.isLetter(peek())) {
                        sb.append((char) read());
                }
-               String s = sb.toString().toLowerCase();
+               String s = sb.toString().toLowerCase(Locale.ROOT);
                if (s.equals("inf"))
                        return Double.POSITIVE_INFINITY;
                if (s.equals("-inf"))

Reply via email to