diff --git a/core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java b/core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java index 107f35e51..1f0dbfc52 100644 --- a/core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java +++ b/core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java @@ -18,6 +18,10 @@ */ package org.apache.struts2.config.entities; +import org.apache.commons.lang3.StringUtils; +import org.apache.struts2.StrutsConstants; +import org.apache.struts2.dispatcher.StaticContentLoader; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -27,10 +31,6 @@ import java.util.Objects; import java.util.Set; import java.util.regex.Pattern; -import org.apache.commons.lang3.StringUtils; -import org.apache.struts2.StrutsConstants; -import org.apache.struts2.dispatcher.StaticContentLoader; - public class ConstantConfig { private Boolean devMode; private Boolean i18nReload; @@ -127,9 +127,11 @@ public class ConstantConfig { private Set> excludedClasses; private List excludedPackageNamePatterns; private Set excludedPackageNames; + private Set> excludedPackageExemptClasses; private Set> devModeExcludedClasses; private List devModeExcludedPackageNamePatterns; private Set devModeExcludedPackageNames; + private Set> devModeExcludedPackageExemptClasses; private BeanConfig excludedPatternsChecker; private BeanConfig acceptedPatternsChecker; private BeanConfig notExcludedAcceptedPatternsChecker; @@ -258,9 +260,11 @@ public class ConstantConfig { map.put(StrutsConstants.STRUTS_EXCLUDED_CLASSES, classesToString(excludedClasses)); map.put(StrutsConstants.STRUTS_EXCLUDED_PACKAGE_NAME_PATTERNS, StringUtils.join(excludedPackageNamePatterns, ',')); map.put(StrutsConstants.STRUTS_EXCLUDED_PACKAGE_NAMES, StringUtils.join(excludedPackageNames, ',')); + map.put(StrutsConstants.STRUTS_EXCLUDED_PACKAGE_EXEMPT_CLASSES, classesToString(excludedPackageExemptClasses)); map.put(StrutsConstants.STRUTS_DEV_MODE_EXCLUDED_CLASSES, classesToString(devModeExcludedClasses)); map.put(StrutsConstants.STRUTS_DEV_MODE_EXCLUDED_PACKAGE_NAME_PATTERNS, StringUtils.join(devModeExcludedPackageNamePatterns, ',')); map.put(StrutsConstants.STRUTS_DEV_MODE_EXCLUDED_PACKAGE_NAMES, StringUtils.join(devModeExcludedPackageNames, ',')); + map.put(StrutsConstants.STRUTS_DEV_MODE_EXCLUDED_PACKAGE_EXEMPT_CLASSES, classesToString(devModeExcludedPackageExemptClasses)); map.put(StrutsConstants.STRUTS_EXCLUDED_PATTERNS_CHECKER, beanConfToString(excludedPatternsChecker)); map.put(StrutsConstants.STRUTS_ACCEPTED_PATTERNS_CHECKER, beanConfToString(acceptedPatternsChecker)); map.put(StrutsConstants.STRUTS_NOT_EXCLUDED_ACCEPTED_PATTERNS_CHECKER, beanConfToString(notExcludedAcceptedPatternsChecker)); @@ -1185,6 +1189,14 @@ public class ConstantConfig { this.excludedPackageNames = excludedPackageNames; } + public Set> getExcludedPackageExemptClasses() { + return excludedPackageExemptClasses; + } + + public void setExcludedPackageExemptClasses(Set> excludedPackageExemptClasses) { + this.excludedPackageExemptClasses = excludedPackageExemptClasses; + } + public Set> getDevModeExcludedClasses() { return devModeExcludedClasses; } @@ -1209,6 +1221,14 @@ public class ConstantConfig { this.devModeExcludedPackageNames = devModeExcludedPackageNames; } + public Set> getDevModeExcludedPackageExemptClasses() { + return devModeExcludedPackageExemptClasses; + } + + public void setDevModeExcludedPackageExemptClasses(Set> devModeExcludedPackageExemptClasses) { + this.devModeExcludedPackageExemptClasses = devModeExcludedPackageExemptClasses; + } + public BeanConfig getExcludedPatternsChecker() { return excludedPatternsChecker; } diff --git a/core/src/test/java/org/apache/struts2/config/entities/ConstantConfigTest.java b/core/src/test/java/org/apache/struts2/config/entities/ConstantConfigTest.java index a9efe5920..f7e726d56 100644 --- a/core/src/test/java/org/apache/struts2/config/entities/ConstantConfigTest.java +++ b/core/src/test/java/org/apache/struts2/config/entities/ConstantConfigTest.java @@ -18,21 +18,14 @@ */ package org.apache.struts2.config.entities; -import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.TestBean; import com.opensymphony.xwork2.inject.Container; -import com.opensymphony.xwork2.util.ValueStack; import org.apache.struts2.StrutsConstants; -import org.apache.struts2.components.TextField; import org.apache.struts2.dispatcher.StaticContentLoader; import org.junit.Assert; import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Locale; import java.util.Map; @@ -83,9 +76,11 @@ public class ConstantConfigTest { constantConfig.setExcludedClasses(null); constantConfig.setExcludedPackageNamePatterns(null); constantConfig.setExcludedPackageNames(null); + constantConfig.setExcludedPackageExemptClasses(null); constantConfig.setDevModeExcludedClasses(null); constantConfig.setDevModeExcludedPackageNamePatterns(null); constantConfig.setDevModeExcludedPackageNames(null); + constantConfig.setDevModeExcludedPackageExemptClasses(null); Map map = constantConfig.getAllAsStringsMap(); Assert.assertNull(map.get(StrutsConstants.STRUTS_EXCLUDED_CLASSES)); @@ -115,6 +110,25 @@ public class ConstantConfigTest { map.get(StrutsConstants.STRUTS_DEV_MODE_EXCLUDED_CLASSES)); } + @Test + public void testExemptClassesToString() { + ConstantConfig constantConfig = new ConstantConfig(); + + Set> exemptClasses = new LinkedHashSet<>(); + exemptClasses.add(Object.class); + exemptClasses.add(Runtime.class); + exemptClasses.add(System.class); + + constantConfig.setExcludedPackageExemptClasses(exemptClasses); + constantConfig.setDevModeExcludedPackageExemptClasses(exemptClasses); + + Map map = constantConfig.getAllAsStringsMap(); + Assert.assertEquals("java.lang.Object,java.lang.Runtime,java.lang.System", + map.get(StrutsConstants.STRUTS_EXCLUDED_PACKAGE_EXEMPT_CLASSES)); + Assert.assertEquals("java.lang.Object,java.lang.Runtime,java.lang.System", + map.get(StrutsConstants.STRUTS_DEV_MODE_EXCLUDED_PACKAGE_EXEMPT_CLASSES)); + } + @Test public void testSettingStaticContentPath() { // given