This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch WW-5675-share-parsed-ognl-security-config
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 75b162f9613abc55b6d8db8c250fefc80e9f5e18
Author: Lukasz Lenart <[email protected]>
AuthorDate: Fri Aug 14 14:07:39 2026 +0200

    WW-5675 perf(config): hoist the whitespace pattern in validatePackageNames
    
    Co-Authored-By: Claude Opus 5 <[email protected]>
---
 .../org/apache/struts2/util/ConfigParseUtil.java   |  4 ++-
 .../apache/struts2/util/ConfigParseUtilTest.java   | 30 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/struts2/util/ConfigParseUtil.java 
b/core/src/main/java/org/apache/struts2/util/ConfigParseUtil.java
index 116ca637d..06dc1a43c 100644
--- a/core/src/main/java/org/apache/struts2/util/ConfigParseUtil.java
+++ b/core/src/main/java/org/apache/struts2/util/ConfigParseUtil.java
@@ -47,6 +47,8 @@ public class ConfigParseUtil {
             .maximumSize(MAX_CLASSLOADER_CACHE_SIZE)
             .build();
 
+    private static final Pattern WHITESPACE = Pattern.compile("\\s");
+
     private ConfigParseUtil() {
     }
 
@@ -140,7 +142,7 @@ public class ConfigParseUtil {
     }
 
     public static void validatePackageNames(Collection<String> packageNames) {
-        if (packageNames.stream().anyMatch(s -> 
Pattern.compile("\\s").matcher(s).find())) {
+        if (packageNames.stream().anyMatch(s -> WHITESPACE.matcher(s).find())) 
{
             throw new ConfigurationException("Excluded package names could not 
be parsed due to erroneous whitespace characters: " + packageNames);
         }
     }
diff --git 
a/core/src/test/java/org/apache/struts2/util/ConfigParseUtilTest.java 
b/core/src/test/java/org/apache/struts2/util/ConfigParseUtilTest.java
index 84cf9a0a3..6e9c79727 100644
--- a/core/src/test/java/org/apache/struts2/util/ConfigParseUtilTest.java
+++ b/core/src/test/java/org/apache/struts2/util/ConfigParseUtilTest.java
@@ -29,9 +29,11 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -187,6 +189,34 @@ public class ConfigParseUtilTest {
                 innerCache.estimatedSize() <= limit);
     }
 
+    @Test
+    public void validatePackageNamesAcceptsNamesWithoutWhitespace() {
+        ConfigParseUtil.validatePackageNames(Set.of("java.lang", 
"org.apache.struts2", ""));
+    }
+
+    @Test
+    public void validatePackageNamesRejectsSpace() {
+        assertThrows(ConfigurationException.class,
+                () -> ConfigParseUtil.validatePackageNames(Set.of("java.lang", 
"org.apache struts2")));
+    }
+
+    @Test
+    public void validatePackageNamesRejectsTab() {
+        assertThrows(ConfigurationException.class,
+                () -> 
ConfigParseUtil.validatePackageNames(Set.of("java\tlang")));
+    }
+
+    @Test
+    public void validatePackageNamesRejectsNewline() {
+        assertThrows(ConfigurationException.class,
+                () -> 
ConfigParseUtil.validatePackageNames(Set.of("java\nlang")));
+    }
+
+    @Test
+    public void validatePackageNamesAcceptsEmptyCollection() {
+        ConfigParseUtil.validatePackageNames(List.of());
+    }
+
     @SuppressWarnings("unchecked")
     private static Cache<Object, Object> validatedClassCache() {
         try {

Reply via email to