This is an automated email from the ASF dual-hosted git repository.
yasserzamani pushed a commit to branch struts-2-5-x
in repository https://gitbox.apache.org/repos/asf/struts.git
The following commit(s) were added to refs/heads/struts-2-5-x by this push:
new db085db Updates and cleanup for some configuration-related items
(2.5.x). (#291)
db085db is described below
commit db085dbeef3da43e7cfb427994ccebaf91becc16
Author: JCgH4164838Gh792C124B5
<[email protected]>
AuthorDate: Thu Dec 20 06:55:34 2018 -0500
Updates and cleanup for some configuration-related items (2.5.x). (#291)
* Updates and cleanup for some configuration-related items.
- Made several attributes final.
- Added limiter logic to the setting of certain configuration elements, and
increased logging around them.
- Updated unit tests impacted by the limiter logic, including minor typo
fixes and locale consistency.
- Minor cleanup while making the changes.
* Update
core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
Whitespace cleanup
Co-Authored-By: JCgH4164838Gh792C124B5
<[email protected]>
* Updates and cleanup for some configuration-related items (1st revision).
- Reworked this PR, taking into account feedback and suggestions.
- Removed the if LOG.isxxxEnabled level checks that were added.
- Removed the limiter logic and instead reduced access level of most of the
injectable methods to protected.
- Updated the previous unit test changes following removal of limiter logic.
* Minor correction to two debug log statements (as requested by reviewer).
* Update debug messages for pattern checkers, as requested by reviewers.
Avoids confusing users when replacing an empty exclusion set (which
improves safety).
Still provides a (slightly milder) message when replacing an empty accepted
set (which can reduce safety).
---
.../providers/XWorkConfigurationProvider.java | 1 +
.../xwork2/ognl/ErrorMessageBuilder.java | 2 +-
.../xwork2/ognl/OgnlNullHandlerWrapper.java | 2 +-
.../xwork2/ognl/OgnlTypeConverterWrapper.java | 2 +-
.../com/opensymphony/xwork2/ognl/OgnlUtil.java | 48 +++---
.../opensymphony/xwork2/ognl/OgnlValueStack.java | 14 +-
.../xwork2/ognl/OgnlValueStackFactory.java | 18 ++-
.../xwork2/ognl/XWorkTypeConverterWrapper.java | 2 +-
.../xwork2/ognl/accessor/CompoundRootAccessor.java | 8 +-
.../accessor/XWorkCollectionPropertyAccessor.java | 2 +-
.../ognl/accessor/XWorkEnumerationAccessor.java | 2 +-
.../accessor/XWorkIteratorPropertyAccessor.java | 2 +-
.../security/DefaultAcceptedPatternsChecker.java | 15 +-
.../security/DefaultExcludedPatternsChecker.java | 28 +++-
core/src/main/resources/struts-default.xml | 1 +
.../com/opensymphony/xwork2/ognl/OgnlUtilTest.java | 171 ++++++++++++++++++++-
.../xwork2/ognl/OgnlValueStackTest.java | 41 ++++-
.../xwork-test-allowstatic-devmode-false.xml | 88 +++++++++++
.../xwork-test-allowstatic-devmode-true.xml | 88 +++++++++++
.../providers/xwork-test-allowstatic-true.xml | 88 +++++++++++
.../config/providers/xwork-test-devmode-true.xml | 88 +++++++++++
21 files changed, 657 insertions(+), 54 deletions(-)
diff --git
a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
index 94c766c..cd27ed3 100644
---
a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
+++
b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
@@ -226,6 +226,7 @@ public class XWorkConfigurationProvider implements
ConfigurationProvider {
props.setProperty(XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE,
Boolean.TRUE.toString());
props.setProperty(XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION,
Boolean.FALSE.toString());
props.setProperty(XWorkConstants.RELOAD_XML_CONFIGURATION,
Boolean.FALSE.toString());
+ props.setProperty(StrutsConstants.STRUTS_ALLOW_STATIC_METHOD_ACCESS,
Boolean.FALSE.toString());
}
}
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/ErrorMessageBuilder.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/ErrorMessageBuilder.java
index 561f2bc..b904f4b 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ognl/ErrorMessageBuilder.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ognl/ErrorMessageBuilder.java
@@ -23,7 +23,7 @@ package com.opensymphony.xwork2.ognl;
*/
public class ErrorMessageBuilder {
- private StringBuilder message = new StringBuilder();
+ private final StringBuilder message = new StringBuilder();
public static ErrorMessageBuilder create() {
return new ErrorMessageBuilder();
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlNullHandlerWrapper.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlNullHandlerWrapper.java
index 2f0a31d..9b24261 100644
---
a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlNullHandlerWrapper.java
+++
b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlNullHandlerWrapper.java
@@ -24,7 +24,7 @@ import java.util.Map;
public class OgnlNullHandlerWrapper implements ognl.NullHandler {
- private NullHandler wrapped;
+ private final NullHandler wrapped;
public OgnlNullHandlerWrapper(NullHandler target) {
this.wrapped = target;
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java
index fc87e11..c2783b9 100644
---
a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java
+++
b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java
@@ -28,7 +28,7 @@ import java.util.Map;
*/
public class OgnlTypeConverterWrapper implements ognl.TypeConverter {
- private TypeConverter typeConverter;
+ private final TypeConverter typeConverter;
public OgnlTypeConverterWrapper(TypeConverter converter) {
if (converter == null) {
diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
index 13691d5..08b2d86 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
@@ -58,7 +58,7 @@ public class OgnlUtil {
private final ConcurrentMap<Class, BeanInfo> beanInfoCache = new
ConcurrentHashMap<>();
private TypeConverter defaultConverter;
- private boolean devMode = false;
+ private boolean devMode;
private boolean enableExpressionCache = true;
private boolean enableEvalExpression;
@@ -77,31 +77,35 @@ public class OgnlUtil {
}
@Inject
- public void setXWorkConverter(XWorkConverter conv) {
+ protected void setXWorkConverter(XWorkConverter conv) {
this.defaultConverter = new OgnlTypeConverterWrapper(conv);
}
@Inject(XWorkConstants.DEV_MODE)
- public void setDevMode(String mode) {
+ protected void setDevMode(String mode) {
this.devMode = BooleanUtils.toBoolean(mode);
+ if (this.devMode) {
+ LOG.warn("Setting development mode [{}] affects the safety of your
application!",
+ this.devMode);
+ }
}
@Inject(XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE)
- public void setEnableExpressionCache(String cache) {
+ protected void setEnableExpressionCache(String cache) {
enableExpressionCache = BooleanUtils.toBoolean(cache);
}
@Inject(value = XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION, required =
false)
- public void setEnableEvalExpression(String evalExpression) {
- enableEvalExpression = "true".equals(evalExpression);
- if(enableEvalExpression){
+ protected void setEnableEvalExpression(String evalExpression) {
+ this.enableEvalExpression = BooleanUtils.toBoolean(evalExpression);
+ if (this.enableEvalExpression) {
LOG.warn("Enabling OGNL expression evaluation may introduce
security risks " +
"(see
http://struts.apache.org/release/2.3.x/docs/s2-013.html for further details)");
}
}
@Inject(value = XWorkConstants.OGNL_EXCLUDED_CLASSES, required = false)
- public void setExcludedClasses(String commaDelimitedClasses) {
+ protected void setExcludedClasses(String commaDelimitedClasses) {
Set<Class<?>> excludedClasses = new HashSet<>();
excludedClasses.addAll(this.excludedClasses);
excludedClasses.addAll(parseExcludedClasses(commaDelimitedClasses));
@@ -124,7 +128,7 @@ public class OgnlUtil {
}
@Inject(value = XWorkConstants.OGNL_EXCLUDED_PACKAGE_NAME_PATTERNS,
required = false)
- public void setExcludedPackageNamePatterns(String
commaDelimitedPackagePatterns) {
+ protected void setExcludedPackageNamePatterns(String
commaDelimitedPackagePatterns) {
Set<Pattern> excludedPackageNamePatterns = new HashSet<>();
excludedPackageNamePatterns.addAll(this.excludedPackageNamePatterns);
excludedPackageNamePatterns.addAll(parseExcludedPackageNamePatterns(commaDelimitedPackagePatterns));
@@ -143,7 +147,7 @@ public class OgnlUtil {
}
@Inject(value = XWorkConstants.OGNL_EXCLUDED_PACKAGE_NAMES, required =
false)
- public void setExcludedPackageNames(String commaDelimitedPackageNames) {
+ protected void setExcludedPackageNames(String commaDelimitedPackageNames) {
Set<String> excludedPackageNames = new HashSet<>();
excludedPackageNames.addAll(this.excludedPackageNames);
excludedPackageNames.addAll(parseExcludedPackageNames(commaDelimitedPackageNames));
@@ -167,18 +171,27 @@ public class OgnlUtil {
}
@Inject
- public void setContainer(Container container) {
+ protected void setContainer(Container container) {
this.container = container;
}
@Inject(value = XWorkConstants.ALLOW_STATIC_METHOD_ACCESS, required =
false)
- public void setAllowStaticMethodAccess(String allowStaticMethodAccess) {
- this.allowStaticMethodAccess =
Boolean.parseBoolean(allowStaticMethodAccess);
+ protected void setAllowStaticMethodAccess(String allowStaticMethodAccess) {
+ this.allowStaticMethodAccess =
BooleanUtils.toBoolean(allowStaticMethodAccess);
+ if (this.allowStaticMethodAccess) {
+ LOG.warn("Setting allow static method access [{}] affects the
safety of your application!",
+ this.allowStaticMethodAccess);
+ }
}
@Inject(value = StrutsConstants.STRUTS_DISALLOW_PROXY_MEMBER_ACCESS,
required = false)
- public void setDisallowProxyMemberAccess(String disallowProxyMemberAccess)
{
+ protected void setDisallowProxyMemberAccess(String
disallowProxyMemberAccess) {
+
this.disallowProxyMemberAccess =
Boolean.parseBoolean(disallowProxyMemberAccess);
+ if (this.disallowProxyMemberAccess == false) {
+ LOG.warn("Setting disallow proxy member access [{}] should only be
done intentionally!",
+ this.disallowProxyMemberAccess);
+ }
}
public boolean isDisallowProxyMemberAccess() {
@@ -431,7 +444,7 @@ public class OgnlUtil {
final T exec = task.execute(tree);
// if cache is enabled and it's a valid expression, puts it in
- if(enableExpressionCache) {
+ if (enableExpressionCache) {
expressions.putIfAbsent(expression, tree);
}
return exec;
@@ -452,7 +465,7 @@ public class OgnlUtil {
final T exec = task.execute(tree);
// if cache is enabled and it's a valid expression, puts it in
- if(enableExpressionCache) {
+ if (enableExpressionCache) {
expressions.putIfAbsent(expression, tree);
}
return exec;
@@ -668,8 +681,7 @@ public class OgnlUtil {
*/
public BeanInfo getBeanInfo(Class clazz) throws IntrospectionException {
synchronized (beanInfoCache) {
- BeanInfo beanInfo;
- beanInfo = beanInfoCache.get(clazz);
+ BeanInfo beanInfo = beanInfoCache.get(clazz);
if (beanInfo == null) {
beanInfo = Introspector.getBeanInfo(clazz, Object.class);
beanInfoCache.putIfAbsent(clazz, beanInfo);
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
index ab58069..01a98ba 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
@@ -82,7 +82,7 @@ public class OgnlValueStack implements Serializable,
ValueStack, ClearableValueS
}
@Inject
- public void setOgnlUtil(OgnlUtil ognlUtil) {
+ protected void setOgnlUtil(OgnlUtil ognlUtil) {
this.ognlUtil = ognlUtil;
securityMemberAccess.setExcludedClasses(ognlUtil.getExcludedClasses());
securityMemberAccess.setExcludedPackageNamePatterns(ognlUtil.getExcludedPackageNamePatterns());
@@ -102,12 +102,16 @@ public class OgnlValueStack implements Serializable,
ValueStack, ClearableValueS
}
@Inject(XWorkConstants.DEV_MODE)
- public void setDevMode(String mode) {
+ protected void setDevMode(String mode) {
this.devMode = BooleanUtils.toBoolean(mode);
+ if (this.devMode) {
+ LOG.warn("Setting development mode [{}] affects the safety of your
application!",
+ this.devMode);
+ }
}
@Inject(value = "logMissingProperties", required = false)
- public void setLogMissingProperties(String logMissingProperties) {
+ protected void setLogMissingProperties(String logMissingProperties) {
this.logMissingProperties =
BooleanUtils.toBoolean(logMissingProperties);
}
@@ -379,7 +383,7 @@ public class OgnlValueStack implements Serializable,
ValueStack, ClearableValueS
* @param e The thrown exception.
*/
private void logLookupFailure(String expr, Exception e) {
- if (devMode && LOG.isWarnEnabled()) {
+ if (devMode) {
LOG.warn("Caught an exception while evaluating expression '{}'
against value stack", expr, e);
LOG.warn("NOTE: Previous warning message was issued due to devMode
set to true.");
} else {
@@ -475,7 +479,7 @@ public class OgnlValueStack implements Serializable,
ValueStack, ClearableValueS
}
@Inject
- public void setXWorkConverter(final XWorkConverter converter) {
+ protected void setXWorkConverter(final XWorkConverter converter) {
this.converter = converter;
}
}
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
index 6b46635..36ca51d 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
@@ -32,6 +32,8 @@ import ognl.MethodAccessor;
import ognl.OgnlRuntime;
import ognl.PropertyAccessor;
import org.apache.commons.lang3.BooleanUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import java.util.Map;
import java.util.Set;
@@ -41,25 +43,31 @@ import java.util.Set;
*/
public class OgnlValueStackFactory implements ValueStackFactory {
+ private static final Logger LOG =
LogManager.getLogger(OgnlValueStackFactory.class);
+
protected XWorkConverter xworkConverter;
protected CompoundRootAccessor compoundRootAccessor;
protected TextProvider textProvider;
protected Container container;
- protected boolean allowStaticMethodAccess;
+ private boolean allowStaticMethodAccess;
@Inject
- public void setXWorkConverter(XWorkConverter converter) {
+ protected void setXWorkConverter(XWorkConverter converter) {
this.xworkConverter = converter;
}
@Inject("system")
- public void setTextProvider(TextProvider textProvider) {
+ protected void setTextProvider(TextProvider textProvider) {
this.textProvider = textProvider;
}
@Inject(value="allowStaticMethodAccess", required=false)
- public void setAllowStaticMethodAccess(String allowStaticMethodAccess) {
+ protected void setAllowStaticMethodAccess(String allowStaticMethodAccess) {
this.allowStaticMethodAccess =
BooleanUtils.toBoolean(allowStaticMethodAccess);
+ if (this.allowStaticMethodAccess) {
+ LOG.warn("Setting allow static method access [{}] affects the
safety of your application!",
+ this.allowStaticMethodAccess);
+ }
}
public ValueStack createValueStack() {
@@ -77,7 +85,7 @@ public class OgnlValueStackFactory implements
ValueStackFactory {
}
@Inject
- public void setContainer(Container container) throws
ClassNotFoundException {
+ protected void setContainer(Container container) throws
ClassNotFoundException {
Set<String> names = container.getInstanceNames(PropertyAccessor.class);
for (String name : names) {
Class cls = Class.forName(name);
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/XWorkTypeConverterWrapper.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/XWorkTypeConverterWrapper.java
index 0ea356a..18a2c8e 100644
---
a/core/src/main/java/com/opensymphony/xwork2/ognl/XWorkTypeConverterWrapper.java
+++
b/core/src/main/java/com/opensymphony/xwork2/ognl/XWorkTypeConverterWrapper.java
@@ -28,7 +28,7 @@ import java.util.Map;
*/
public class XWorkTypeConverterWrapper implements TypeConverter {
- private ognl.TypeConverter typeConverter;
+ private final ognl.TypeConverter typeConverter;
public XWorkTypeConverterWrapper(ognl.TypeConverter conv) {
this.typeConverter = conv;
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
index 0bccc60..be0ea8d 100644
---
a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
+++
b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
@@ -63,11 +63,15 @@ public class CompoundRootAccessor implements
PropertyAccessor, MethodAccessor, C
private final static Logger LOG =
LogManager.getLogger(CompoundRootAccessor.class);
private final static Class[] EMPTY_CLASS_ARRAY = new Class[0];
private static Map<MethodCall, Boolean> invalidMethods = new
ConcurrentHashMap<>();
- private boolean devMode = false;
+ private boolean devMode;
@Inject(XWorkConstants.DEV_MODE)
- public void setDevMode(String mode) {
+ protected void setDevMode(String mode) {
this.devMode = BooleanUtils.toBoolean(mode);
+ if (this.devMode) {
+ LOG.warn("Setting development mode [{}] affects the safety of your
application!",
+ this.devMode);
+ }
}
public void setProperty(Map context, Object target, Object name, Object
value) throws OgnlException {
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java
index be2d136..837558f 100644
---
a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java
+++
b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java
@@ -48,7 +48,7 @@ public class XWorkCollectionPropertyAccessor extends
SetPropertyAccessor {
//use a basic object Ognl property accessor here
//to access properties of the objects in the Set
//so that nothing is put in the context to screw things up
- private ObjectPropertyAccessor _accessor = new ObjectPropertyAccessor();
+ private final ObjectPropertyAccessor _accessor = new
ObjectPropertyAccessor();
private XWorkConverter xworkConverter;
private ObjectFactory objectFactory;
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkEnumerationAccessor.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkEnumerationAccessor.java
index 3e6f576..d0d713a 100644
---
a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkEnumerationAccessor.java
+++
b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkEnumerationAccessor.java
@@ -30,7 +30,7 @@ import java.util.Map;
*/
public class XWorkEnumerationAccessor extends EnumerationPropertyAccessor {
- ObjectPropertyAccessor opa = new ObjectPropertyAccessor();
+ private final ObjectPropertyAccessor opa = new ObjectPropertyAccessor();
@Override
public void setProperty(Map context, Object target, Object name, Object
value) throws OgnlException {
diff --git
a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkIteratorPropertyAccessor.java
b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkIteratorPropertyAccessor.java
index 73ad710..8979608 100644
---
a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkIteratorPropertyAccessor.java
+++
b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkIteratorPropertyAccessor.java
@@ -30,7 +30,7 @@ import java.util.Map;
*/
public class XWorkIteratorPropertyAccessor extends IteratorPropertyAccessor {
- ObjectPropertyAccessor opa = new ObjectPropertyAccessor();
+ private final ObjectPropertyAccessor opa = new ObjectPropertyAccessor();
@Override
public void setProperty(Map context, Object target, Object name, Object
value) throws OgnlException {
diff --git
a/core/src/main/java/com/opensymphony/xwork2/security/DefaultAcceptedPatternsChecker.java
b/core/src/main/java/com/opensymphony/xwork2/security/DefaultAcceptedPatternsChecker.java
index 8dfd6ef..ce7ba34 100644
---
a/core/src/main/java/com/opensymphony/xwork2/security/DefaultAcceptedPatternsChecker.java
+++
b/core/src/main/java/com/opensymphony/xwork2/security/DefaultAcceptedPatternsChecker.java
@@ -44,9 +44,9 @@ public class DefaultAcceptedPatternsChecker implements
AcceptedPatternsChecker {
}
@Inject(value = XWorkConstants.OVERRIDE_ACCEPTED_PATTERNS, required =
false)
- public void setOverrideAcceptedPatterns(String acceptablePatterns) {
+ protected void setOverrideAcceptedPatterns(String acceptablePatterns) {
LOG.warn("Overriding accepted patterns [{}] with [{}], be aware that
this affects all instances and safety of your application!",
- XWorkConstants.OVERRIDE_ACCEPTED_PATTERNS,
acceptablePatterns);
+ acceptedPatterns, acceptablePatterns);
acceptedPatterns = new HashSet<>();
for (String pattern :
TextParseUtil.commaDelimitedStringToSet(acceptablePatterns)) {
acceptedPatterns.add(Pattern.compile(pattern,
Pattern.CASE_INSENSITIVE));
@@ -54,7 +54,7 @@ public class DefaultAcceptedPatternsChecker implements
AcceptedPatternsChecker {
}
@Inject(value = XWorkConstants.ADDITIONAL_ACCEPTED_PATTERNS, required =
false)
- public void setAdditionalAcceptedPatterns(String acceptablePatterns) {
+ protected void setAdditionalAcceptedPatterns(String acceptablePatterns) {
LOG.warn("Adding additional global patterns [{}] to accepted
patterns!", acceptablePatterns);
for (String pattern :
TextParseUtil.commaDelimitedStringToSet(acceptablePatterns)) {
acceptedPatterns.add(Pattern.compile(pattern,
Pattern.CASE_INSENSITIVE));
@@ -70,7 +70,14 @@ public class DefaultAcceptedPatternsChecker implements
AcceptedPatternsChecker {
}
public void setAcceptedPatterns(Set<String> patterns) {
- LOG.trace("Sets accepted patterns [{}]", patterns);
+ if (acceptedPatterns == null) {
+ // Limit unwanted log entries (for 1st call, acceptedPatterns null)
+ LOG.debug("Sets accepted patterns to [{}], note this impacts the
safety of your application!", patterns);
+ }
+ else {
+ LOG.warn("Replacing accepted patterns [{}] with [{}], be aware
that this affects all instances and safety of your application!",
+ acceptedPatterns, patterns);
+ }
acceptedPatterns = new HashSet<>(patterns.size());
for (String pattern : patterns) {
acceptedPatterns.add(Pattern.compile(pattern,
Pattern.CASE_INSENSITIVE));
diff --git
a/core/src/main/java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java
b/core/src/main/java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java
index 0148a35..e93683a 100644
---
a/core/src/main/java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java
+++
b/core/src/main/java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java
@@ -47,9 +47,15 @@ public class DefaultExcludedPatternsChecker implements
ExcludedPatternsChecker {
}
@Inject(value = XWorkConstants.OVERRIDE_EXCLUDED_PATTERNS, required =
false)
- public void setOverrideExcludePatterns(String excludePatterns) {
- LOG.warn("Overriding excluded patterns [{}] with [{}], be aware that
this affects all instances and safety of your application!",
- XWorkConstants.OVERRIDE_EXCLUDED_PATTERNS,
excludePatterns);
+ protected void setOverrideExcludePatterns(String excludePatterns) {
+ if (excludedPatterns != null && excludedPatterns.size() > 0) {
+ LOG.warn("Overriding excluded patterns [{}] with [{}], be aware
that this affects all instances and safety of your application!",
+ excludedPatterns, excludePatterns);
+ }
+ else {
+ // Limit unwanted log entries (when excludedPatterns null/empty -
usually 1st call)
+ LOG.debug("Overriding excluded patterns with [{}]",
excludePatterns);
+ }
excludedPatterns = new HashSet<Pattern>();
for (String pattern :
TextParseUtil.commaDelimitedStringToSet(excludePatterns)) {
excludedPatterns.add(Pattern.compile(pattern,
Pattern.CASE_INSENSITIVE));
@@ -65,11 +71,14 @@ public class DefaultExcludedPatternsChecker implements
ExcludedPatternsChecker {
}
@Inject(StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION)
- public void setDynamicMethodInvocation(String dmiValue) {
- if (!BooleanUtils.toBoolean(dmiValue)) {
+ protected void setDynamicMethodInvocation(String dmiValue) {
+ if (BooleanUtils.toBoolean(dmiValue) == false) {
LOG.debug("DMI is disabled, adding DMI related excluded patterns");
setAdditionalExcludePatterns("^(action|method):.*");
}
+ else {
+ LOG.warn("DMI is enabled, *NOT* adding DMI related excluded
patterns");
+ }
}
public void setExcludedPatterns(String commaDelimitedPatterns) {
@@ -81,7 +90,14 @@ public class DefaultExcludedPatternsChecker implements
ExcludedPatternsChecker {
}
public void setExcludedPatterns(Set<String> patterns) {
- LOG.trace("Sets excluded patterns [{}]", patterns);
+ if (excludedPatterns != null && excludedPatterns.size() > 0) {
+ LOG.warn("Replacing excluded patterns [{}] with [{}], be aware
that this affects all instances and safety of your application!",
+ excludedPatterns, patterns);
+ }
+ else {
+ // Limit unwanted log entries (when excludedPatterns null/empty -
usually 1st call)
+ LOG.debug("Sets excluded patterns to [{}]", patterns);
+ }
excludedPatterns = new HashSet<>(patterns.size());
for (String pattern : patterns) {
excludedPatterns.add(Pattern.compile(pattern,
Pattern.CASE_INSENSITIVE));
diff --git a/core/src/main/resources/struts-default.xml
b/core/src/main/resources/struts-default.xml
index fda6cfb..e85bc6a 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -61,6 +61,7 @@
freemarker.ext.rhino.,
sun.reflect.,
javassist.,
+ org.objectweb.asm.,
com.opensymphony.xwork2.ognl.,
com.opensymphony.xwork2.security.,
com.opensymphony.xwork2.util." />
diff --git a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
index 28d0d59..225ca2f 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
@@ -19,9 +19,14 @@
package com.opensymphony.xwork2.ognl;
import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.ActionProxyFactory;
import com.opensymphony.xwork2.XWorkException;
import com.opensymphony.xwork2.XWorkTestCase;
+import com.opensymphony.xwork2.config.ConfigurationManager;
+import com.opensymphony.xwork2.config.ConfigurationProvider;
+import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
+import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.interceptor.ChainingInterceptor;
import com.opensymphony.xwork2.test.User;
import com.opensymphony.xwork2.util.*;
@@ -364,9 +369,10 @@ public class OgnlUtilTest extends XWorkTestCase {
Map props = new HashMap();
props.put("birthday", "02/12/1982");
// US style test
+ context.put(ActionContext.LOCALE, Locale.US);
ognlUtil.setProperties(props, foo, context);
- Calendar cal = Calendar.getInstance();
+ Calendar cal = Calendar.getInstance(Locale.US);
cal.clear();
cal.set(Calendar.MONTH, Calendar.FEBRUARY);
cal.set(Calendar.DAY_OF_MONTH, 12);
@@ -375,7 +381,7 @@ public class OgnlUtilTest extends XWorkTestCase {
assertEquals(cal.getTime(), foo.getBirthday());
//UK style test
- cal = Calendar.getInstance();
+ cal = Calendar.getInstance(Locale.UK);
cal.clear();
cal.set(Calendar.MONTH, Calendar.OCTOBER);
cal.set(Calendar.DAY_OF_MONTH, 18);
@@ -389,7 +395,7 @@ public class OgnlUtilTest extends XWorkTestCase {
.format(eventTime);
props.put("event", formatted);
- cal = Calendar.getInstance();
+ cal = Calendar.getInstance(Locale.UK);
cal.clear();
cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
cal.set(Calendar.DAY_OF_MONTH, 9);
@@ -412,9 +418,10 @@ public class OgnlUtilTest extends XWorkTestCase {
//test RFC 3339 date format for JSON
props.put("event", "1996-12-19T16:39:57Z");
+ context.put(ActionContext.LOCALE, Locale.US);
ognlUtil.setProperties(props, foo, context);
- cal = Calendar.getInstance();
+ cal = Calendar.getInstance(Locale.US);
cal.clear();
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 19);
@@ -427,6 +434,7 @@ public class OgnlUtilTest extends XWorkTestCase {
//test setting a calendar property
props.put("calendar", "1996-12-19T16:39:57Z");
+ context.put(ActionContext.LOCALE, Locale.US);
ognlUtil.setProperties(props, foo, context);
assertEquals(cal, foo.getCalendar());
}
@@ -645,7 +653,7 @@ public class OgnlUtilTest extends XWorkTestCase {
try {
stack.setValue("1234", foo);
- fail("non-valid expression: 1114778947765");
+ fail("non-valid expression: 1234");
}
catch(RuntimeException ex) {
;
@@ -657,6 +665,126 @@ public class OgnlUtilTest extends XWorkTestCase {
stack.setValue("1234", foo);
}
+ public void testStackValueDevModeChange() throws Exception {
+
+ try {
+ reloadTestContainerConfiguration(false, false); // Set dev mode
false
+ }
+ catch (Exception ex) {
+ fail("Unable to reload container configuration - exception: " +
ex);
+ }
+
+ ValueStack stack = ActionContext.getContext().getValueStack();
+ Map stackContext = stack.getContext();
+ stackContext.put(ReflectionContextState.CREATE_NULL_OBJECTS,
Boolean.FALSE);
+ stackContext.put(ReflectionContextState.DENY_METHOD_EXECUTION,
Boolean.TRUE);
+ stackContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS,
Boolean.TRUE);
+
+ String[] foo = new String[]{"asdf"};
+
+ // With dev mode false, the following set values should not cause
failures
+ stack.setValue("list.1114778947765", foo);
+ stack.setValue("1114778947765", foo);
+ stack.setValue("1234", foo);
+
+ try {
+ reloadTestContainerConfiguration(true, false); // Set dev mode
true
+ }
+ catch (Exception ex) {
+ fail("Unable to reload container configuration - exception: " +
ex);
+ }
+
+ // Repeat stack/context set after retrieving updated stack
+ stack = ActionContext.getContext().getValueStack();
+ stackContext = stack.getContext();
+ stackContext.put(ReflectionContextState.CREATE_NULL_OBJECTS,
Boolean.FALSE);
+ stackContext.put(ReflectionContextState.DENY_METHOD_EXECUTION,
Boolean.TRUE);
+ stackContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS,
Boolean.TRUE);
+
+ try {
+ stack.setValue("list.1114778947765", foo);
+ fail("non-valid expression: list.1114778947765");
+ }
+ catch(RuntimeException ex) {
+ // Expected with dev mode true
+ }
+ try {
+ stack.setValue("1114778947765", foo);
+ fail("non-valid expression: 1114778947765");
+ }
+ catch(RuntimeException ex) {
+ // Expected with dev mode true
+ }
+ try {
+ stack.setValue("1234", foo);
+ fail("non-valid expression: 1234");
+ }
+ catch(RuntimeException ex) {
+ // Expected with dev mode true
+ }
+
+ }
+
+ public void testDevModeChange() throws Exception {
+
+ try {
+ reloadTestContainerConfiguration(false, false); // Set dev mode
false
+ }
+ catch (Exception ex) {
+ fail("Unable to reload container configuration - exception: " +
ex);
+ }
+
+ ValueStack stack = ActionContext.getContext().getValueStack();
+ Map stackContext = stack.getContext();
+ stackContext.put(ReflectionContextState.CREATE_NULL_OBJECTS,
Boolean.FALSE);
+ stackContext.put(ReflectionContextState.DENY_METHOD_EXECUTION,
Boolean.TRUE);
+ stackContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS,
Boolean.TRUE);
+
+ String[] foo = new String[]{"asdf"};
+
+ // With dev mode false, the following set values should not cause
failures
+ stack.setValue("list.1114778947765", foo);
+ stack.setValue("1114778947765", foo);
+ stack.setValue("1234", foo);
+
+ try {
+ reloadTestContainerConfiguration(true, false); // Set dev mode
true
+ }
+ catch (Exception ex) {
+ fail("Unable to reload container configuration - exception: " +
ex);
+ }
+
+ // Repeat stack/context set after retrieving updated stack
+ stack = ActionContext.getContext().getValueStack();
+ stackContext = stack.getContext();
+ stackContext.put(ReflectionContextState.CREATE_NULL_OBJECTS,
Boolean.FALSE);
+ stackContext.put(ReflectionContextState.DENY_METHOD_EXECUTION,
Boolean.TRUE);
+ stackContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS,
Boolean.TRUE);
+
+ try {
+ stack.setValue("list.1114778947765", foo);
+ fail("non-valid expression: list.1114778947765");
+ }
+ catch(RuntimeException ex) {
+ // Expected with dev mode true
+ }
+ try {
+ stack.setValue("1114778947765", foo);
+ fail("non-valid expression: 1114778947765");
+ }
+ catch(RuntimeException ex) {
+ // Expected with dev mode true
+ }
+ try {
+ stack.setValue("1234", foo);
+ fail("non-valid expression: 1234");
+ }
+ catch(RuntimeException ex) {
+ // Expected with dev mode true
+ }
+
+ }
+
public void testAvoidCallingMethodsOnObjectClass() throws Exception {
Foo foo = new Foo();
@@ -812,6 +940,39 @@ public class OgnlUtilTest extends XWorkTestCase {
assertEquals(expected.getMessage(), "It isn't a simple method which
can be called!");
}
+ private void reloadTestContainerConfiguration(boolean devMode, boolean
allowStatic) throws Exception {
+ super.tearDown();
+
+ ConfigurationProvider configurationProvider;
+ if (devMode == true && allowStatic == true) {
+ configurationProvider = new
XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml",
true);
+ }
+ else if (devMode == true && allowStatic == false) {
+ configurationProvider = new
XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml",
true);
+ }
+ else if (devMode == false && allowStatic == true) {
+ configurationProvider = new
XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml",
true);
+ }
+ else { // devMode, allowStatic both false
+ configurationProvider = new
XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml",
true);
+ }
+
+ configurationManager = new
ConfigurationManager(Container.DEFAULT_NAME);
+ configurationManager.addContainerProvider(configurationProvider);
+ configuration = configurationManager.getConfiguration();
+ container = configuration.getContainer();
+ container.inject(configurationProvider);
+ configurationProvider.init(configuration);
+ actionProxyFactory = container.getInstance(ActionProxyFactory.class);
+
+ // Reset the value stack
+ ValueStack stack =
container.getInstance(ValueStackFactory.class).createValueStack();
+ stack.getContext().put(ActionContext.CONTAINER, container);
+ ActionContext.setContext(new ActionContext(stack.getContext()));
+
+ ognlUtil = container.getInstance(OgnlUtil.class);
+ }
+
public static class Email {
String address;
diff --git
a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java
b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java
index 0121220..e66fc24 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java
@@ -19,7 +19,11 @@
package com.opensymphony.xwork2.ognl;
import com.opensymphony.xwork2.*;
+import com.opensymphony.xwork2.config.ConfigurationManager;
+import com.opensymphony.xwork2.config.ConfigurationProvider;
+import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
+import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor;
import com.opensymphony.xwork2.test.TestBean2;
import com.opensymphony.xwork2.util.*;
@@ -594,7 +598,7 @@ public class OgnlValueStackTest extends XWorkTestCase {
assertEquals("bar:123", vs.findValue("foo.bar", String.class));
}
- public void testPrimitiveSettingWithInvalidValueAddsFieldErrorInDevMode() {
+ public void testPrimitiveSettingWithInvalidValueAddsFieldErrorInDevMode()
throws Exception {
SimpleAction action = new SimpleAction();
OgnlValueStack stack = createValueStack();
stack.getContext().put(XWorkConverter.REPORT_CONVERSION_ERRORS,
Boolean.TRUE);
@@ -613,7 +617,7 @@ public class OgnlValueStackTest extends XWorkTestCase {
assertTrue(conversionErrors.containsKey("bar"));
}
- public void
testPrimitiveSettingWithInvalidValueAddsFieldErrorInNonDevMode() {
+ public void
testPrimitiveSettingWithInvalidValueAddsFieldErrorInNonDevMode() throws
Exception {
SimpleAction action = new SimpleAction();
OgnlValueStack stack = createValueStack();
stack.getContext().put(XWorkConverter.REPORT_CONVERSION_ERRORS,
Boolean.TRUE);
@@ -968,6 +972,39 @@ public class OgnlValueStackTest extends XWorkTestCase {
assertEquals(null, stack.findValue("address.country.name",
String.class));
}
+ private void reloadTestContainerConfiguration(boolean devMode, boolean
allowStatic) throws Exception {
+ super.tearDown();
+
+ ConfigurationProvider configurationProvider;
+ if (devMode == true && allowStatic == true) {
+ configurationProvider = new
XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml",
true);
+ }
+ else if (devMode == true && allowStatic == false) {
+ configurationProvider = new
XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml",
true);
+ }
+ else if (devMode == false && allowStatic == true) {
+ configurationProvider = new
XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml",
true);
+ }
+ else { // devMode, allowStatic both false
+ configurationProvider = new
XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml",
true);
+ }
+
+ configurationManager = new
ConfigurationManager(Container.DEFAULT_NAME);
+ configurationManager.addContainerProvider(configurationProvider);
+ configuration = configurationManager.getConfiguration();
+ container = configuration.getContainer();
+ container.inject(configurationProvider);
+ configurationProvider.init(configuration);
+ actionProxyFactory = container.getInstance(ActionProxyFactory.class);
+
+ // Reset the value stack
+ ValueStack stack =
container.getInstance(ValueStackFactory.class).createValueStack();
+ stack.getContext().put(ActionContext.CONTAINER, container);
+ ActionContext.setContext(new ActionContext(stack.getContext()));
+
+ ognlUtil = container.getInstance(OgnlUtil.class);
+ }
+
class BadJavaBean {
private int count;
private int count2;
diff --git
a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml
new file mode 100644
index 0000000..132870d
--- /dev/null
+++
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+<!DOCTYPE xwork PUBLIC
+ "-//Apache Struts//XWork 2.5//EN"
+ "http://struts.apache.org/dtds/xwork-2.5.dtd"
+ >
+
+<xwork>
+
+ <constant name="struts.devMode" value="false" />
+ <constant name="devMode" value="false" />
+ <constant name="struts.i18n.reload" value="false" />
+ <constant name="logMissingProperties" value="false" />
+ <constant name="enableOGNLExpressionCache" value="true" />
+ <constant name="enableOGNLEvalExpression" value="false" />
+ <constant name="reloadXmlConfiguration" value="false" />
+ <constant name="struts.ognl.allowStaticMethodAccess" value="false" />
+ <constant name="struts.enable.DynamicMethodInvocation" value="false" />
+ <constant name="struts.dispatcher.errorHandler" value="struts" />
+
+ <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" />
+ <bean
class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" />
+ <bean class="org.apache.struts2.views.freemarker.FreemarkerManager"
name="default" />
+ <bean class="org.apache.struts2.views.velocity.VelocityManager"
name="default" optional="true" />
+ <bean class="org.apache.struts2.components.template.TemplateEngineManager"
/>
+ <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter"
/>
+ <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" />
+ <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" />
+
+ <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default"
class="org.apache.struts2.factory.StrutsActionProxyFactory"/>
+ <bean type="com.opensymphony.xwork2.FileManager" name="system"
class="com.opensymphony.xwork2.util.fs.DefaultFileManager" scope="singleton"/>
+ <bean type="com.opensymphony.xwork2.FileManagerFactory" name="default"
class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory"
scope="singleton"/>
+ <bean type="com.opensymphony.xwork2.LocalizedTextProvider"
name="global-only"
class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider"
scope="singleton" />
+ <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="default"
class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider"
scope="singleton" />
+ <bean type="com.opensymphony.xwork2.TextProvider" name="system"
class="com.opensymphony.xwork2.DefaultTextProvider" scope="singleton" />
+ <bean
type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor"
/>
+ <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor"
/>
+ <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>
+ <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator" />
+ <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder" />
+ <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter"
name="default" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
+
+ <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="default"
class="com.opensymphony.xwork2.factory.DefaultActionFactory" />
+ <bean type="com.opensymphony.xwork2.factory.ConverterFactory"
name="default" class="com.opensymphony.xwork2.factory.DefaultConverterFactory"
/>
+ <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="default"
class="org.apache.struts2.factory.StrutsResultFactory" />
+ <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory"
name="default"
class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" />
+ <bean type="com.opensymphony.xwork2.factory.ValidatorFactory"
name="default" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory"
/>
+ <bean type="com.opensymphony.xwork2.factory.InterceptorFactory"
name="default"
class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" />
+ <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="default"
class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
+ <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider"
name="default" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" />
+
+ <bean type="ognl.MethodAccessor" name="java.lang.Object"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" />
+ <bean type="ognl.MethodAccessor"
name="com.opensymphony.xwork2.util.CompoundRoot"
class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="com.opensymphony.xwork2.util.CompoundRoot"
class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="org.apache.struts2.dispatcher.HttpParameters"
class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="com.opensymphony.xwork2.ognl.ObjectProxy"
class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="org.apache.struts2.dispatcher.Parameter"
class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.ArrayList"
class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Collection"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Enumeration"
class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.HashMap"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.HashSet"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Iterator"
class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.List"
class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Map"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.lang.Object"
class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Set"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+
+</xwork>
\ No newline at end of file
diff --git
a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml
new file mode 100644
index 0000000..3065a1a
--- /dev/null
+++
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+<!DOCTYPE xwork PUBLIC
+ "-//Apache Struts//XWork 2.5//EN"
+ "http://struts.apache.org/dtds/xwork-2.5.dtd"
+ >
+
+<xwork>
+
+ <constant name="struts.devMode" value="true" />
+ <constant name="devMode" value="true" />
+ <constant name="struts.i18n.reload" value="false" />
+ <constant name="logMissingProperties" value="false" />
+ <constant name="enableOGNLExpressionCache" value="true" />
+ <constant name="enableOGNLEvalExpression" value="false" />
+ <constant name="reloadXmlConfiguration" value="false" />
+ <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
+ <constant name="struts.enable.DynamicMethodInvocation" value="false" />
+ <constant name="struts.dispatcher.errorHandler" value="struts" />
+
+ <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" />
+ <bean
class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" />
+ <bean class="org.apache.struts2.views.freemarker.FreemarkerManager"
name="default" />
+ <bean class="org.apache.struts2.views.velocity.VelocityManager"
name="default" optional="true" />
+ <bean class="org.apache.struts2.components.template.TemplateEngineManager"
/>
+ <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter"
/>
+ <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" />
+ <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" />
+
+ <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default"
class="org.apache.struts2.factory.StrutsActionProxyFactory"/>
+ <bean type="com.opensymphony.xwork2.FileManager" name="system"
class="com.opensymphony.xwork2.util.fs.DefaultFileManager" scope="singleton"/>
+ <bean type="com.opensymphony.xwork2.FileManagerFactory" name="default"
class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory"
scope="singleton"/>
+ <bean type="com.opensymphony.xwork2.LocalizedTextProvider"
name="global-only"
class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider"
scope="singleton" />
+ <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="default"
class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider"
scope="singleton" />
+ <bean type="com.opensymphony.xwork2.TextProvider" name="system"
class="com.opensymphony.xwork2.DefaultTextProvider" scope="singleton" />
+ <bean
type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor"
/>
+ <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor"
/>
+ <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>
+ <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator" />
+ <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder" />
+ <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter"
name="default" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
+
+ <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="default"
class="com.opensymphony.xwork2.factory.DefaultActionFactory" />
+ <bean type="com.opensymphony.xwork2.factory.ConverterFactory"
name="default" class="com.opensymphony.xwork2.factory.DefaultConverterFactory"
/>
+ <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="default"
class="org.apache.struts2.factory.StrutsResultFactory" />
+ <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory"
name="default"
class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" />
+ <bean type="com.opensymphony.xwork2.factory.ValidatorFactory"
name="default" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory"
/>
+ <bean type="com.opensymphony.xwork2.factory.InterceptorFactory"
name="default"
class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" />
+ <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="default"
class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
+ <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider"
name="default" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" />
+
+ <bean type="ognl.MethodAccessor" name="java.lang.Object"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" />
+ <bean type="ognl.MethodAccessor"
name="com.opensymphony.xwork2.util.CompoundRoot"
class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="com.opensymphony.xwork2.util.CompoundRoot"
class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="org.apache.struts2.dispatcher.HttpParameters"
class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="com.opensymphony.xwork2.ognl.ObjectProxy"
class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="org.apache.struts2.dispatcher.Parameter"
class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.ArrayList"
class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Collection"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Enumeration"
class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.HashMap"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.HashSet"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Iterator"
class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.List"
class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Map"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.lang.Object"
class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Set"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+
+</xwork>
\ No newline at end of file
diff --git
a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml
new file mode 100644
index 0000000..6dc36eb
--- /dev/null
+++
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+<!DOCTYPE xwork PUBLIC
+ "-//Apache Struts//XWork 2.5//EN"
+ "http://struts.apache.org/dtds/xwork-2.5.dtd"
+ >
+
+<xwork>
+
+ <constant name="struts.devMode" value="false" />
+ <constant name="devMode" value="false" />
+ <constant name="struts.i18n.reload" value="false" />
+ <constant name="logMissingProperties" value="false" />
+ <constant name="enableOGNLExpressionCache" value="true" />
+ <constant name="enableOGNLEvalExpression" value="false" />
+ <constant name="reloadXmlConfiguration" value="false" />
+ <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
+ <constant name="struts.enable.DynamicMethodInvocation" value="false" />
+ <constant name="struts.dispatcher.errorHandler" value="struts" />
+
+ <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" />
+ <bean
class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" />
+ <bean class="org.apache.struts2.views.freemarker.FreemarkerManager"
name="default" />
+ <bean class="org.apache.struts2.views.velocity.VelocityManager"
name="default" optional="true" />
+ <bean class="org.apache.struts2.components.template.TemplateEngineManager"
/>
+ <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter"
/>
+ <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" />
+ <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" />
+
+ <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default"
class="org.apache.struts2.factory.StrutsActionProxyFactory"/>
+ <bean type="com.opensymphony.xwork2.FileManager" name="system"
class="com.opensymphony.xwork2.util.fs.DefaultFileManager" scope="singleton"/>
+ <bean type="com.opensymphony.xwork2.FileManagerFactory" name="default"
class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory"
scope="singleton"/>
+ <bean type="com.opensymphony.xwork2.LocalizedTextProvider"
name="global-only"
class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider"
scope="singleton" />
+ <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="default"
class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider"
scope="singleton" />
+ <bean type="com.opensymphony.xwork2.TextProvider" name="system"
class="com.opensymphony.xwork2.DefaultTextProvider" scope="singleton" />
+ <bean
type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor"
/>
+ <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor"
/>
+ <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>
+ <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator" />
+ <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder" />
+ <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter"
name="default" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
+
+ <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="default"
class="com.opensymphony.xwork2.factory.DefaultActionFactory" />
+ <bean type="com.opensymphony.xwork2.factory.ConverterFactory"
name="default" class="com.opensymphony.xwork2.factory.DefaultConverterFactory"
/>
+ <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="default"
class="org.apache.struts2.factory.StrutsResultFactory" />
+ <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory"
name="default"
class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" />
+ <bean type="com.opensymphony.xwork2.factory.ValidatorFactory"
name="default" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory"
/>
+ <bean type="com.opensymphony.xwork2.factory.InterceptorFactory"
name="default"
class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" />
+ <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="default"
class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
+ <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider"
name="default" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" />
+
+ <bean type="ognl.MethodAccessor" name="java.lang.Object"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" />
+ <bean type="ognl.MethodAccessor"
name="com.opensymphony.xwork2.util.CompoundRoot"
class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="com.opensymphony.xwork2.util.CompoundRoot"
class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="org.apache.struts2.dispatcher.HttpParameters"
class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="com.opensymphony.xwork2.ognl.ObjectProxy"
class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="org.apache.struts2.dispatcher.Parameter"
class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.ArrayList"
class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Collection"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Enumeration"
class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.HashMap"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.HashSet"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Iterator"
class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.List"
class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Map"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.lang.Object"
class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Set"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+
+</xwork>
\ No newline at end of file
diff --git
a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml
new file mode 100644
index 0000000..787d8a6
--- /dev/null
+++
b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+<!DOCTYPE xwork PUBLIC
+ "-//Apache Struts//XWork 2.5//EN"
+ "http://struts.apache.org/dtds/xwork-2.5.dtd"
+ >
+
+<xwork>
+
+ <constant name="struts.devMode" value="true" />
+ <constant name="devMode" value="true" />
+ <constant name="struts.i18n.reload" value="false" />
+ <constant name="logMissingProperties" value="false" />
+ <constant name="enableOGNLExpressionCache" value="true" />
+ <constant name="enableOGNLEvalExpression" value="false" />
+ <constant name="reloadXmlConfiguration" value="false" />
+ <constant name="struts.ognl.allowStaticMethodAccess" value="false" />
+ <constant name="struts.enable.DynamicMethodInvocation" value="false" />
+ <constant name="struts.dispatcher.errorHandler" value="struts" />
+
+ <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" />
+ <bean
class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" />
+ <bean class="org.apache.struts2.views.freemarker.FreemarkerManager"
name="default" />
+ <bean class="org.apache.struts2.views.velocity.VelocityManager"
name="default" optional="true" />
+ <bean class="org.apache.struts2.components.template.TemplateEngineManager"
/>
+ <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter"
/>
+ <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" />
+ <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" />
+
+ <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default"
class="org.apache.struts2.factory.StrutsActionProxyFactory"/>
+ <bean type="com.opensymphony.xwork2.FileManager" name="system"
class="com.opensymphony.xwork2.util.fs.DefaultFileManager" scope="singleton"/>
+ <bean type="com.opensymphony.xwork2.FileManagerFactory" name="default"
class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory"
scope="singleton"/>
+ <bean type="com.opensymphony.xwork2.LocalizedTextProvider"
name="global-only"
class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider"
scope="singleton" />
+ <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="default"
class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider"
scope="singleton" />
+ <bean type="com.opensymphony.xwork2.TextProvider" name="system"
class="com.opensymphony.xwork2.DefaultTextProvider" scope="singleton" />
+ <bean
type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor"
/>
+ <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor"
/>
+ <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>
+ <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator" />
+ <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder"
name="default"
class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder" />
+ <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter"
name="default" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
+
+ <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="default"
class="com.opensymphony.xwork2.factory.DefaultActionFactory" />
+ <bean type="com.opensymphony.xwork2.factory.ConverterFactory"
name="default" class="com.opensymphony.xwork2.factory.DefaultConverterFactory"
/>
+ <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="default"
class="org.apache.struts2.factory.StrutsResultFactory" />
+ <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory"
name="default"
class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" />
+ <bean type="com.opensymphony.xwork2.factory.ValidatorFactory"
name="default" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory"
/>
+ <bean type="com.opensymphony.xwork2.factory.InterceptorFactory"
name="default"
class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" />
+ <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="default"
class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
+ <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider"
name="default" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" />
+
+ <bean type="ognl.MethodAccessor" name="java.lang.Object"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" />
+ <bean type="ognl.MethodAccessor"
name="com.opensymphony.xwork2.util.CompoundRoot"
class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="com.opensymphony.xwork2.util.CompoundRoot"
class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="org.apache.struts2.dispatcher.HttpParameters"
class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="com.opensymphony.xwork2.ognl.ObjectProxy"
class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor"
name="org.apache.struts2.dispatcher.Parameter"
class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.ArrayList"
class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Collection"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Enumeration"
class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.HashMap"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.HashSet"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Iterator"
class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.List"
class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Map"
class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.lang.Object"
class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" />
+ <bean type="ognl.PropertyAccessor" name="java.util.Set"
class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
+
+</xwork>
\ No newline at end of file