From 4626da547febfead0a0a230aaddfac75cc42312f Mon Sep 17 00:00:00 2001 From: Sven Haag Date: Mon, 29 Jul 2024 15:47:21 +0200 Subject: [PATCH] CUI-1532 remove side effects on provided object varargs of MoreStrings#lenientFormat(String template, Object... args). --- .../de/cuioss/tools/string/MoreStrings.java | 35 ++++++++++--------- .../cuioss/tools/string/MoreStringsTest.java | 1 + 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/cuioss/tools/string/MoreStrings.java b/src/main/java/de/cuioss/tools/string/MoreStrings.java index 06179c4..458a3c0 100644 --- a/src/main/java/de/cuioss/tools/string/MoreStrings.java +++ b/src/main/java/de/cuioss/tools/string/MoreStrings.java @@ -17,6 +17,8 @@ import static de.cuioss.tools.base.Preconditions.checkArgument; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -863,39 +865,40 @@ public static String trimOrNull(final String string) { public static String lenientFormat(String template, Object... args) { template = String.valueOf(template); // null -> "null" + final List lenientArgs; + if (args == null) { - args = new Object[] { "(Object[])null" }; + lenientArgs= new ArrayList<>(1); + lenientArgs.add("(Object[])null"); } else { - for (var i = 0; i < args.length; i++) { - args[i] = lenientToString(args[i]); + lenientArgs = new ArrayList<>(args.length); + for (Object arg : args) { + lenientArgs.add(lenientToString(arg)); } } // start substituting the arguments into the '%s' placeholders - var builder = new StringBuilder(template.length() + 16 * args.length); - var templateStart = 0; - var i = 0; - while (i < args.length) { - var placeholderStart = template.indexOf("%s", templateStart); + StringBuilder builder = new StringBuilder(template.length() + 16 * lenientArgs.size()); + int templateStart = 0; + int i = 0; + while (i < lenientArgs.size()) { + int placeholderStart = template.indexOf("%s", templateStart); if (placeholderStart == -1) { break; } builder.append(template, templateStart, placeholderStart); - builder.append(args[i]); - i++; + builder.append(lenientArgs.get(i++)); templateStart = placeholderStart + 2; } builder.append(template, templateStart, template.length()); // if we run out of placeholders, append the extra args in square braces - if (i < args.length) { + if (i < lenientArgs.size()) { builder.append(" ["); - builder.append(args[i]); - i++; - while (i < args.length) { + builder.append(lenientArgs.get(i++)); + while (i < lenientArgs.size()) { builder.append(", "); - builder.append(args[i]); - i++; + builder.append(lenientArgs.get(i++)); } builder.append(']'); } diff --git a/src/test/java/de/cuioss/tools/string/MoreStringsTest.java b/src/test/java/de/cuioss/tools/string/MoreStringsTest.java index 1e5a789..f091784 100644 --- a/src/test/java/de/cuioss/tools/string/MoreStringsTest.java +++ b/src/test/java/de/cuioss/tools/string/MoreStringsTest.java @@ -363,6 +363,7 @@ void testLenientFormat() { assertEquals("null [5, 6]", MoreStrings.lenientFormat(null, 5, 6)); assertEquals("null", MoreStrings.lenientFormat("%s", (Object) null)); assertEquals("(Object[])null", MoreStrings.lenientFormat("%s", (Object[]) null)); + assertEquals("missing param 1%s", MoreStrings.lenientFormat("missing param %s%s", "1")); } @Test