mirror of
https://github.com/apache/struts.git
synced 2026-08-07 23:57:03 +00:00
Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 96c38b27e4 | |||
| e9108f0feb | |||
| 3653f6e9e1 | |||
| 5a2323a19f | |||
| ea09a8828b | |||
| 17fe42c0f7 | |||
| 87fa5bddf2 | |||
| 45161e88f9 | |||
| 4456620b51 | |||
| f4a8f42ca4 | |||
| a6f8895c90 | |||
| 46dbdbe018 | |||
| 6f176cc5a7 | |||
| db085dbeef | |||
| c3205888b4 | |||
| ce9789c4c9 | |||
| b431755332 | |||
| c694c6fdfb | |||
| 1d49a06272 | |||
| 264e03b7ed | |||
| 2f99110189 | |||
| d33930f3bd | |||
| 360927931c | |||
| bff033e6a3 | |||
| 536d2db4b8 | |||
| 32c8f6f811 | |||
| 06e5dfc2ab | |||
| fe630db5f2 | |||
| b75c0ba5e1 | |||
| 8ab102209f | |||
| d7a7c909ea | |||
| 24e151143e | |||
| c5272d2a0d | |||
| 11de8810e4 | |||
| 75dc4c00d2 | |||
| 415ce3e165 | |||
| fe6257b995 | |||
| 3b81a9edaa | |||
| 478a9b8f1c | |||
| 12c3d23bdf | |||
| 8293add6aa | |||
| ecb7beef38 | |||
| bac0f2953c | |||
| 7bca98205d | |||
| 567fae9dfc | |||
| f4d7dbe88e |
@@ -62,3 +62,4 @@ bundles/target
|
||||
plugins/target
|
||||
target
|
||||
plugins/testng/test-output
|
||||
test-output
|
||||
|
||||
+8
-1
@@ -4,12 +4,19 @@ sudo: false
|
||||
jdk:
|
||||
- openjdk7
|
||||
- oraclejdk8
|
||||
- oraclejdk9
|
||||
- oraclejdk11
|
||||
|
||||
install: true
|
||||
script: mvn test -DskipAssembly
|
||||
|
||||
after_success:
|
||||
- mvn clean cobertura:cobertura org.eluder.coveralls:coveralls-maven-plugin:report com.updateimpact:updateimpact-maven-plugin:submit -Ptravis-coveralls,update-impact -DskipAssembly
|
||||
# TODO delete following if statement after fix of https://github.com/cobertura/cobertura/issues/271
|
||||
- if [ "$TRAVIS_JDK_VERSION" == "openjdk8" ] || [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ]; then
|
||||
mvn cobertura:cobertura org.eluder.coveralls:coveralls-maven-plugin:report com.updateimpact:updateimpact-maven-plugin:submit -Ptravis-coveralls,update-impact -DskipAssembly;
|
||||
else
|
||||
echo "Not reporting coverage for $TRAVIS_JDK_VERSION due to incompatibility or to save performance";
|
||||
fi;
|
||||
|
||||
env:
|
||||
global:
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-parent</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
<artifactId>struts2-apps</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
@@ -24,12 +24,12 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-apps</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-rest-showcase</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
<name>Struts 2 Rest Showcase Webapp</name>
|
||||
<description>Struts 2 Rest Showcase Example</description>
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-apps</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-showcase</artifactId>
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-parent</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-assembly</artifactId>
|
||||
|
||||
+3
-3
@@ -30,7 +30,7 @@
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-bom</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>Struts 2 Bill of Materials</name>
|
||||
@@ -45,7 +45,7 @@
|
||||
</licenses>
|
||||
|
||||
<properties>
|
||||
<struts-version.version>2.5.18</struts-version.version>
|
||||
<struts-version.version>2.5.20</struts-version.version>
|
||||
<maven.site.skip>true</maven.site.skip>
|
||||
<maven.site.deploy.skip>true</maven.site.deploy.skip>
|
||||
</properties>
|
||||
@@ -181,6 +181,6 @@
|
||||
</dependencyManagement>
|
||||
|
||||
<scm>
|
||||
<tag>STRUTS_2_5_18</tag>
|
||||
<tag>STRUTS_2_5_20</tag>
|
||||
</scm>
|
||||
</project>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-osgi-bundles</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-osgi-admin-bundle</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-osgi-bundles</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-osgi-demo-bundle</artifactId>
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-parent</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-osgi-bundles</artifactId>
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-parent</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
<artifactId>struts2-core</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
+1
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,31 @@ 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);
|
||||
}
|
||||
|
||||
@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 +124,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 +143,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,17 +167,17 @@ 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);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
@@ -431,7 +431,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 +452,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 +668,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);
|
||||
|
||||
@@ -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,12 @@ 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);
|
||||
}
|
||||
|
||||
@Inject(value = "logMissingProperties", required = false)
|
||||
public void setLogMissingProperties(String logMissingProperties) {
|
||||
protected void setLogMissingProperties(String logMissingProperties) {
|
||||
this.logMissingProperties = BooleanUtils.toBoolean(logMissingProperties);
|
||||
}
|
||||
|
||||
@@ -157,8 +157,6 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
|
||||
setValue(expr, value, devMode);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* @see com.opensymphony.xwork2.util.ValueStack#setValue(java.lang.String, java.lang.Object)
|
||||
*/
|
||||
@@ -379,7 +377,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 +473,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
|
||||
}
|
||||
|
||||
@Inject
|
||||
public void setXWorkConverter(final XWorkConverter converter) {
|
||||
protected void setXWorkConverter(final XWorkConverter converter) {
|
||||
this.converter = converter;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,24 +43,26 @@ 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);
|
||||
}
|
||||
|
||||
@@ -77,7 +81,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);
|
||||
|
||||
@@ -46,9 +46,16 @@ public class SecurityMemberAccess extends DefaultMemberAccess {
|
||||
private Set<String> excludedPackageNames = Collections.emptySet();
|
||||
private boolean disallowProxyMemberAccess;
|
||||
|
||||
public SecurityMemberAccess(boolean method) {
|
||||
/**
|
||||
* SecurityMemberAccess
|
||||
* - access decisions based on whether member is static (or not)
|
||||
* - block or allow access to properties (configureable-after-construction)
|
||||
*
|
||||
* @param allowStaticMethodAccess
|
||||
*/
|
||||
public SecurityMemberAccess(boolean allowStaticMethodAccess) {
|
||||
super(false);
|
||||
allowStaticMethodAccess = method;
|
||||
this.allowStaticMethodAccess = allowStaticMethodAccess;
|
||||
}
|
||||
|
||||
public boolean getAllowStaticMethodAccess() {
|
||||
@@ -58,10 +65,10 @@ public class SecurityMemberAccess extends DefaultMemberAccess {
|
||||
@Override
|
||||
public boolean isAccessible(Map context, Object target, Member member, String propertyName) {
|
||||
LOG.debug("Checking access for [target: {}, member: {}, property: {}]", target, member, propertyName);
|
||||
|
||||
Class targetClass = target.getClass();
|
||||
Class memberClass = member.getDeclaringClass();
|
||||
|
||||
|
||||
final Class memberClass = member.getDeclaringClass();
|
||||
Class targetClass = (target != null ? target.getClass() : memberClass); // Note: target,propertyName may be null (static field checks OGNL 3.1.19+)
|
||||
|
||||
if (checkEnumAccess(target, member)) {
|
||||
LOG.trace("Allowing access to enum: target class [{}] of target [{}], member [{}]", targetClass, target, member);
|
||||
return true;
|
||||
@@ -70,8 +77,8 @@ public class SecurityMemberAccess extends DefaultMemberAccess {
|
||||
if (Modifier.isStatic(member.getModifiers()) && allowStaticMethodAccess) {
|
||||
LOG.debug("Support for accessing static methods [target: {}, targetClass: {}, member: {}, property: {}] is deprecated!",
|
||||
target, targetClass, member, propertyName);
|
||||
if (!isClassExcluded(member.getDeclaringClass())) {
|
||||
targetClass = member.getDeclaringClass();
|
||||
if (!isClassExcluded(memberClass)) {
|
||||
targetClass = memberClass;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -63,10 +63,10 @@ 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);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+10
-4
@@ -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,13 @@ 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));
|
||||
|
||||
+17
-6
@@ -47,9 +47,14 @@ 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,8 +70,8 @@ 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):.*");
|
||||
}
|
||||
@@ -81,7 +86,13 @@ 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));
|
||||
|
||||
@@ -27,6 +27,7 @@ import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Vector;
|
||||
import java.util.zip.ZipEntry;
|
||||
@@ -77,11 +78,7 @@ public class ClassPathFinder {
|
||||
*/
|
||||
public Vector<String> findMatches() {
|
||||
Vector<String> matches = new Vector<>();
|
||||
URLClassLoader cl = getURLClassLoader();
|
||||
if (cl == null ) {
|
||||
throw new XWorkException("unable to attain an URLClassLoader") ;
|
||||
}
|
||||
URL[] parentUrls = cl.getURLs();
|
||||
URL[] parentUrls = getClassLoaderURLs();
|
||||
compiledPattern = patternMatcher.compilePattern(pattern);
|
||||
for (URL url : parentUrls) {
|
||||
if (!"file".equals(url.getProtocol())) {
|
||||
@@ -173,20 +170,24 @@ public class ClassPathFinder {
|
||||
this.patternMatcher = patternMatcher;
|
||||
}
|
||||
|
||||
private URLClassLoader getURLClassLoader() {
|
||||
URLClassLoader ucl = null;
|
||||
private URL[] getClassLoaderURLs() {
|
||||
URL[] urls;
|
||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||
|
||||
if(! (loader instanceof URLClassLoader)) {
|
||||
|
||||
if (!(loader instanceof URLClassLoader)) {
|
||||
loader = ClassPathFinder.class.getClassLoader();
|
||||
if (loader instanceof URLClassLoader) {
|
||||
ucl = (URLClassLoader) loader ;
|
||||
}
|
||||
|
||||
if (loader instanceof URLClassLoader) {
|
||||
urls = ((URLClassLoader) loader).getURLs();
|
||||
} else { //jdk9 or later
|
||||
try {
|
||||
urls = Collections.list(loader.getResources("")).toArray(new URL[0]);
|
||||
} catch (IOException e) {
|
||||
throw new XWorkException("unable to get ClassLoader URLs", e);
|
||||
}
|
||||
}
|
||||
else {
|
||||
ucl = (URLClassLoader) loader;
|
||||
}
|
||||
|
||||
return ucl ;
|
||||
|
||||
return urls;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,8 @@ public class DefaultFileManager implements FileManager {
|
||||
private static final Pattern JAR_PATTERN = Pattern.compile("^(jar:|wsjar:|zip:|vfsfile:|code-source:)?(file:)?(.*?)(\\!/|\\.jar/)(.*)");
|
||||
private static final int JAR_FILE_PATH = 3;
|
||||
|
||||
protected static Map<String, Revision> files = Collections.synchronizedMap(new HashMap<String, Revision>());
|
||||
protected static final Map<String, Revision> files = Collections.synchronizedMap(new HashMap<String, Revision>());
|
||||
private static final List<URL> lazyMonitoredFilesCache = Collections.synchronizedList(new ArrayList<URL>());
|
||||
|
||||
protected boolean reloadingConfigs = false;
|
||||
|
||||
@@ -48,6 +49,16 @@ public class DefaultFileManager implements FileManager {
|
||||
}
|
||||
|
||||
public void setReloadingConfigs(boolean reloadingConfigs) {
|
||||
if (reloadingConfigs && !this.reloadingConfigs) {
|
||||
//starting monitoring cached not-monitored files (lazy monitoring on demand because of performance)
|
||||
this.reloadingConfigs = true;
|
||||
synchronized (lazyMonitoredFilesCache) {
|
||||
for (URL fileUrl : lazyMonitoredFilesCache) {
|
||||
monitorFile(fileUrl);
|
||||
}
|
||||
lazyMonitoredFilesCache.clear();
|
||||
}
|
||||
}
|
||||
this.reloadingConfigs = reloadingConfigs;
|
||||
}
|
||||
|
||||
@@ -70,9 +81,7 @@ public class DefaultFileManager implements FileManager {
|
||||
return null;
|
||||
}
|
||||
InputStream is = openFile(fileUrl);
|
||||
if (reloadingConfigs) {
|
||||
monitorFile(fileUrl);
|
||||
}
|
||||
monitorFile(fileUrl);
|
||||
return is;
|
||||
}
|
||||
|
||||
@@ -90,6 +99,12 @@ public class DefaultFileManager implements FileManager {
|
||||
|
||||
public void monitorFile(URL fileUrl) {
|
||||
String fileName = fileUrl.toString();
|
||||
if (!reloadingConfigs) {
|
||||
//reserve file for monitoring on demand because of performance
|
||||
files.remove(fileName);
|
||||
lazyMonitoredFilesCache.add(fileUrl);
|
||||
return;
|
||||
}
|
||||
Revision revision;
|
||||
LOG.debug("Creating revision for URL: {}", fileName);
|
||||
if (isJarURL(fileUrl)) {
|
||||
|
||||
@@ -41,12 +41,15 @@ public final class StrutsConstants {
|
||||
/** The URL extension to use to determine if the request is meant for a Struts action */
|
||||
public static final String STRUTS_ACTION_EXTENSION = "struts.action.extension";
|
||||
|
||||
/** Comma separated list of patterns (java.util.regex.Pattern) to be excluded from Struts2-processing */
|
||||
public static final String STRUTS_ACTION_EXCLUDE_PATTERN = "struts.action.excludePattern";
|
||||
/** Comma separated list of patterns (java.util.regex.Pattern) to be excluded from Struts2-processing */
|
||||
public static final String STRUTS_ACTION_EXCLUDE_PATTERN = "struts.action.excludePattern";
|
||||
|
||||
/** Whether to use the alterative syntax for the tags or not */
|
||||
/** Whether to use the alternative syntax for the tags or not */
|
||||
public static final String STRUTS_TAG_ALTSYNTAX = "struts.tag.altSyntax";
|
||||
|
||||
/** Whether to use the response encoding (JSP page encoding) for s:include tag processing (false - use STRUTS_I18N_ENCODING - by default) */
|
||||
public static final String STRUTS_TAG_INCLUDETAG_USERESPONSEENCODING = "struts.tag.includetag.useResponseEncoding";
|
||||
|
||||
/** The HTTP port used by Struts URLs */
|
||||
public static final String STRUTS_URL_HTTP_PORT = "struts.url.http.port";
|
||||
|
||||
@@ -56,7 +59,7 @@ public final class StrutsConstants {
|
||||
/** The default includeParams method to generate Struts URLs */
|
||||
public static final String STRUTS_URL_INCLUDEPARAMS = "struts.url.includeParams";
|
||||
|
||||
public static final String STRUTS_URL_RENDERER = "struts.urlRenderer";
|
||||
public static final String STRUTS_URL_RENDERER = "struts.urlRenderer";
|
||||
|
||||
/** The com.opensymphony.xwork2.ObjectFactory implementation class */
|
||||
public static final String STRUTS_OBJECTFACTORY = "struts.objectFactory";
|
||||
@@ -91,7 +94,7 @@ public final class StrutsConstants {
|
||||
/** The org.apache.struts2.views.freemarker.FreemarkerManager implementation class */
|
||||
public static final String STRUTS_FREEMARKER_MANAGER_CLASSNAME = "struts.freemarker.manager.classname";
|
||||
|
||||
/** Update freemarker templates cache in seconds*/
|
||||
/** Update freemarker templates cache in seconds */
|
||||
public static final String STRUTS_FREEMARKER_TEMPLATES_CACHE_UPDATE_DELAY = "struts.freemarker.templatesCache.updateDelay";
|
||||
|
||||
/** Cache model instances at BeanWrapper level */
|
||||
@@ -220,12 +223,12 @@ public final class StrutsConstants {
|
||||
public static final String STRUTS_LOCALE_PROVIDER_FACTORY = "struts.localeProviderFactory";
|
||||
|
||||
/** The name of the parameter to create when mapping an id (used by some action mappers) */
|
||||
public static final String STRUTS_ID_PARAMETER_NAME = "struts.mapper.idParameterName";
|
||||
|
||||
/** The name of the parameter to determine whether static method access will be allowed in OGNL expressions or not */
|
||||
public static final String STRUTS_ALLOW_STATIC_METHOD_ACCESS = "struts.ognl.allowStaticMethodAccess";
|
||||
public static final String STRUTS_ID_PARAMETER_NAME = "struts.mapper.idParameterName";
|
||||
|
||||
/** The com.opensymphony.xwork2.validator.ActionValidatorManager implementation class */
|
||||
/** The name of the parameter to determine whether static method access will be allowed in OGNL expressions or not */
|
||||
public static final String STRUTS_ALLOW_STATIC_METHOD_ACCESS = "struts.ognl.allowStaticMethodAccess";
|
||||
|
||||
/** The com.opensymphony.xwork2.validator.ActionValidatorManager implementation class */
|
||||
public static final String STRUTS_ACTIONVALIDATORMANAGER = "struts.actionValidatorManager";
|
||||
|
||||
/** The {@link com.opensymphony.xwork2.util.ValueStackFactory} implementation class */
|
||||
@@ -236,7 +239,7 @@ public final class StrutsConstants {
|
||||
|
||||
/** The {@link com.opensymphony.xwork2.util.reflection.ReflectionContextFactory} implementation class */
|
||||
public static final String STRUTS_REFLECTIONCONTEXTFACTORY = "struts.reflectionContextFactory";
|
||||
|
||||
|
||||
/** The {@link com.opensymphony.xwork2.util.PatternMatcher} implementation class */
|
||||
public static final String STRUTS_PATTERNMATCHER = "struts.patternMatcher";
|
||||
|
||||
@@ -246,32 +249,32 @@ public final class StrutsConstants {
|
||||
/** The {@link com.opensymphony.xwork2.UnknownHandlerManager} implementation class */
|
||||
public static final String STRUTS_UNKNOWN_HANDLER_MANAGER = "struts.unknownHandlerManager";
|
||||
|
||||
/** Throw RuntimeException when a property is not found, or the evaluation of the espression fails*/
|
||||
/** Throw RuntimeException when a property is not found, or the evaluation of the expression fails */
|
||||
public static final String STRUTS_EL_THROW_EXCEPTION = "struts.el.throwExceptionOnFailure";
|
||||
|
||||
/** Logs properties that are not found (very verbose) **/
|
||||
/** Logs properties that are not found (very verbose) */
|
||||
public static final String STRUTS_LOG_MISSING_PROPERTIES = "struts.ognl.logMissingProperties";
|
||||
|
||||
/** Enables caching of parsed OGNL expressions **/
|
||||
/** Enables caching of parsed OGNL expressions */
|
||||
public static final String STRUTS_ENABLE_OGNL_EXPRESSION_CACHE = "struts.ognl.enableExpressionCache";
|
||||
|
||||
/** Enables evaluation of OGNL expressions **/
|
||||
/** Enables evaluation of OGNL expressions */
|
||||
public static final String STRUTS_ENABLE_OGNL_EVAL_EXPRESSION = "struts.ognl.enableOGNLEvalExpression";
|
||||
|
||||
/** Disables {@link org.apache.struts2.dispatcher.StrutsRequestWrapper} request attribute value stack lookup (JSTL accessibility) **/
|
||||
/** Disables {@link org.apache.struts2.dispatcher.StrutsRequestWrapper} request attribute value stack lookup (JSTL accessibility) */
|
||||
public static final String STRUTS_DISABLE_REQUEST_ATTRIBUTE_VALUE_STACK_LOOKUP = "struts.disableRequestAttributeValueStackLookup";
|
||||
|
||||
/** The{@link org.apache.struts2.views.util.UrlHelper} implementation class **/
|
||||
/** The{@link org.apache.struts2.views.util.UrlHelper} implementation class */
|
||||
public static final String STRUTS_URL_HELPER = "struts.view.urlHelper";
|
||||
|
||||
/** {@link com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter} **/
|
||||
/** {@link com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter} */
|
||||
public static final String STRUTS_CONVERTER_COLLECTION = "struts.converter.collection";
|
||||
public static final String STRUTS_CONVERTER_ARRAY = "struts.converter.array";
|
||||
public static final String STRUTS_CONVERTER_DATE = "struts.converter.date";
|
||||
public static final String STRUTS_CONVERTER_NUMBER = "struts.converter.number";
|
||||
public static final String STRUTS_CONVERTER_STRING = "struts.converter.string";
|
||||
|
||||
/** Enable handling exceptions by Dispatcher - true by default **/
|
||||
/** Enable handling exceptions by Dispatcher - true by default */
|
||||
public static final String STRUTS_HANDLE_EXCEPTION = "struts.handle.exception";
|
||||
|
||||
public static final String STRUTS_CONVERTER_PROPERTIES_PROCESSOR = "struts.converter.properties.processor";
|
||||
@@ -282,42 +285,42 @@ public final class StrutsConstants {
|
||||
|
||||
public static final String STRUTS_EXPRESSION_PARSER = "struts.expression.parser";
|
||||
|
||||
/** namespaces names' whitelist **/
|
||||
/** Namespace names' whitelist */
|
||||
public static final String STRUTS_ALLOWED_NAMESPACE_NAMES = "struts.allowed.namespace.names";
|
||||
/** default namespace name to use when namespace didn't match the whitelist **/
|
||||
/** Default namespace name to use when namespace didn't match the whitelist */
|
||||
public static final String STRUTS_DEFAULT_NAMESPACE_NAME = "struts.default.namespace.name";
|
||||
|
||||
/** actions names' whitelist **/
|
||||
/** Action names' whitelist */
|
||||
public static final String STRUTS_ALLOWED_ACTION_NAMES = "struts.allowed.action.names";
|
||||
/** default action name to use when action didn't match the whitelist **/
|
||||
/** Default action name to use when action didn't match the whitelist */
|
||||
public static final String STRUTS_DEFAULT_ACTION_NAME = "struts.default.action.name";
|
||||
|
||||
/** methods names' whitelist **/
|
||||
/** Method names' whitelist */
|
||||
public static final String STRUTS_ALLOWED_METHOD_NAMES = "struts.allowed.method.names";
|
||||
/** default method name to use when method didn't match the whitelist **/
|
||||
/** Default method name to use when method didn't match the whitelist */
|
||||
public static final String STRUTS_DEFAULT_METHOD_NAME = "struts.default.method.name";
|
||||
|
||||
/** enables action: prefix **/
|
||||
/** Enables action: prefix */
|
||||
public static final String STRUTS_MAPPER_ACTION_PREFIX_ENABLED = "struts.mapper.action.prefix.enabled";
|
||||
|
||||
/** enables access to actions in other namespaces than current with action: prefix **/
|
||||
/** Enables access to actions in other namespaces than current with action: prefix */
|
||||
public static final String STRUTS_MAPPER_ACTION_PREFIX_CROSSNAMESPACES = "struts.mapper.action.prefix.crossNamespaces";
|
||||
|
||||
public static final String DEFAULT_TEMPLATE_TYPE_CONFIG_KEY = "struts.ui.templateSuffix";
|
||||
|
||||
/** Allows override default DispatcherErrorHandler **/
|
||||
/** Allows override default DispatcherErrorHandler */
|
||||
public static final String STRUTS_DISPATCHER_ERROR_HANDLER = "struts.dispatcher.errorHandler";
|
||||
|
||||
/** Comma delimited set of excluded classes and package names which cannot be accessed via expressions **/
|
||||
/** Comma delimited set of excluded classes and package names which cannot be accessed via expressions */
|
||||
public static final String STRUTS_EXCLUDED_CLASSES = "struts.excludedClasses";
|
||||
public static final String STRUTS_EXCLUDED_PACKAGE_NAME_PATTERNS = "struts.excludedPackageNamePatterns";
|
||||
public static final String STRUTS_EXCLUDED_PACKAGE_NAMES = "struts.excludedPackageNames";
|
||||
|
||||
/** Dedicated services to check if passed string is excluded/accepted **/
|
||||
/** Dedicated services to check if passed string is excluded/accepted */
|
||||
public static final String STRUTS_EXCLUDED_PATTERNS_CHECKER = "struts.excludedPatterns.checker";
|
||||
public static final String STRUTS_ACCEPTED_PATTERNS_CHECKER = "struts.acceptedPatterns.checker";
|
||||
|
||||
/** Constant is used to override framework's default excluded patterns **/
|
||||
/** Constant is used to override framework's default excluded patterns */
|
||||
public static final String STRUTS_OVERRIDE_EXCLUDED_PATTERNS = "struts.override.excludedPatterns";
|
||||
public static final String STRUTS_OVERRIDE_ACCEPTED_PATTERNS = "struts.override.acceptedPatterns";
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ package org.apache.struts2.components;
|
||||
|
||||
import com.opensymphony.xwork2.inject.Inject;
|
||||
import com.opensymphony.xwork2.util.ValueStack;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.struts2.RequestUtils;
|
||||
@@ -35,6 +36,7 @@ import javax.servlet.ServletRequest;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpServletResponseWrapper;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.*;
|
||||
@@ -90,17 +92,19 @@ public class Include extends Component {
|
||||
|
||||
private static final Logger LOG = LogManager.getLogger(Include.class);
|
||||
|
||||
private static String systemEncoding = System.getProperty("file.encoding");
|
||||
private static final String systemEncoding = System.getProperty("file.encoding");
|
||||
|
||||
protected String value;
|
||||
private HttpServletRequest req;
|
||||
private HttpServletResponse res;
|
||||
private static String defaultEncoding;
|
||||
private String defaultEncoding; // Made non-static (during WW-4971 fix)
|
||||
private boolean useResponseEncoding; // Added with WW-4971 fix (allows switch between usage of response or default encoding)
|
||||
|
||||
public Include(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
|
||||
super(stack);
|
||||
this.req = req;
|
||||
this.res = res;
|
||||
useResponseEncoding = false; // By default use defaultEncoding (vs. response/page encoding)
|
||||
}
|
||||
|
||||
@Inject(StrutsConstants.STRUTS_I18N_ENCODING)
|
||||
@@ -108,9 +112,25 @@ public class Include extends Component {
|
||||
defaultEncoding = encoding;
|
||||
}
|
||||
|
||||
@Inject(value = StrutsConstants.STRUTS_TAG_INCLUDETAG_USERESPONSEENCODING, required=false)
|
||||
public void setUseResponseEncoding(String useEncoding) {
|
||||
useResponseEncoding = Boolean.parseBoolean(useEncoding);
|
||||
}
|
||||
|
||||
public boolean end(Writer writer, String body) {
|
||||
String page = findString(value, "value", "You must specify the URL to include. Example: /foo.jsp");
|
||||
StringBuilder urlBuf = new StringBuilder();
|
||||
String encodingForInclude;
|
||||
|
||||
if (useResponseEncoding) {
|
||||
encodingForInclude = res.getCharacterEncoding(); // Use response (page) encoding
|
||||
if (encodingForInclude == null || encodingForInclude.length() == 0) {
|
||||
encodingForInclude = defaultEncoding; // Revert to defaultEncoding when response (page) encoding is invalid
|
||||
}
|
||||
}
|
||||
else {
|
||||
encodingForInclude = defaultEncoding; // Use default encoding (when useResponseEncoding is false)
|
||||
}
|
||||
|
||||
// Add URL
|
||||
urlBuf.append(page);
|
||||
@@ -147,7 +167,7 @@ public class Include extends Component {
|
||||
|
||||
// Include
|
||||
try {
|
||||
include(result, writer, req, res, defaultEncoding);
|
||||
include(result, writer, req, res, encodingForInclude);
|
||||
} catch (ServletException | IOException e) {
|
||||
LOG.warn("Exception thrown during include of {}", result, e);
|
||||
}
|
||||
@@ -209,7 +229,7 @@ public class Include extends Component {
|
||||
}
|
||||
|
||||
public void addParameter(String key, Object value) {
|
||||
// don't use the default implementation of addParameter,
|
||||
// Don't use the default implementation of addParameter,
|
||||
// instead, include tag requires that each parameter be a list of objects,
|
||||
// just like the HTTP servlet interfaces are (String[])
|
||||
if (value != null) {
|
||||
@@ -256,7 +276,7 @@ public class Include extends Component {
|
||||
// Use given encoding
|
||||
pageResponse.getContent().writeTo(writer, encoding);
|
||||
} else {
|
||||
//use the platform specific encoding
|
||||
// Use the platform specific encoding
|
||||
pageResponse.getContent().writeTo(writer, systemEncoding);
|
||||
}
|
||||
}
|
||||
@@ -349,9 +369,9 @@ public class Include extends Component {
|
||||
* @throws IOException
|
||||
*/
|
||||
public FastByteArrayOutputStream getContent() throws IOException {
|
||||
//if we are using a writer, we need to flush the
|
||||
//data to the underlying outputstream.
|
||||
//most containers do this - but it seems Jetty 4.0.5 doesn't
|
||||
// If we are using a writer, we need to flush the
|
||||
// data to the underlying outputstream.
|
||||
// Most containers do this - but it seems Jetty 4.0.5 doesn't
|
||||
if (pagePrintWriter != null) {
|
||||
pagePrintWriter.flush();
|
||||
}
|
||||
|
||||
@@ -140,4 +140,19 @@ public class OptGroup extends Component {
|
||||
public void setListValue(String listValue) {
|
||||
internalUiBean.setListValue(listValue);
|
||||
}
|
||||
|
||||
@StrutsTagAttribute(description = "Property of list objects to get css class from")
|
||||
public void setListCssClass(String listCssClass) {
|
||||
internalUiBean.setListCssClass(listCssClass);
|
||||
}
|
||||
|
||||
@StrutsTagAttribute(description = "Property of list objects to get css style from")
|
||||
public void setListCssStyle(String listCssStyle) {
|
||||
internalUiBean.setListCssStyle(listCssStyle);
|
||||
}
|
||||
|
||||
@StrutsTagAttribute(description = "Property of list objects to get title from")
|
||||
public void setListTitle(String listTitle) {
|
||||
internalUiBean.setListTitle(listTitle);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,6 +83,7 @@ import com.opensymphony.xwork2.util.ValueStack;
|
||||
public class Set extends ContextBean {
|
||||
protected String scope;
|
||||
protected String value;
|
||||
protected boolean trimBody = true;
|
||||
|
||||
public Set(ValueStack stack) {
|
||||
super(stack);
|
||||
@@ -136,6 +137,11 @@ public class Set extends ContextBean {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@StrutsTagAttribute(description="Set to false to prevent the default whitespace-trim of this tag's body content", type="Boolean", defaultValue="true")
|
||||
public void setTrimBody(boolean trimBody) {
|
||||
this.trimBody = trimBody;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean usesBody() {
|
||||
return true;
|
||||
|
||||
@@ -261,6 +261,7 @@ public class I18nInterceptor extends AbstractInterceptor {
|
||||
super(invocation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Locale find() {
|
||||
Locale requestOnlyLocale = super.find();
|
||||
|
||||
@@ -281,15 +282,13 @@ public class I18nInterceptor extends AbstractInterceptor {
|
||||
|
||||
@Override
|
||||
public Locale store(ActionInvocation invocation, Locale locale) {
|
||||
HttpSession session = ServletActionContext.getRequest().getSession(false);
|
||||
Map<String, Object> session = invocation.getInvocationContext().getSession();
|
||||
|
||||
if (session != null) {
|
||||
String sessionId = session.getId();
|
||||
String sessionId = ServletActionContext.getRequest().getSession().getId();
|
||||
synchronized (sessionId.intern()) {
|
||||
invocation.getInvocationContext().getSession().put(attributeName, locale);
|
||||
session.put(attributeName, locale);
|
||||
}
|
||||
} else {
|
||||
LOG.debug("session creation avoided as it doesn't exist already");
|
||||
}
|
||||
|
||||
return locale;
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
*/
|
||||
package org.apache.struts2.util;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import javax.servlet.jsp.JspWriter;
|
||||
import java.io.*;
|
||||
import java.nio.ByteBuffer;
|
||||
@@ -35,6 +38,9 @@ import java.util.LinkedList;
|
||||
*
|
||||
*/
|
||||
public class FastByteArrayOutputStream extends OutputStream {
|
||||
|
||||
private static final Logger LOG = LogManager.getLogger(FastByteArrayOutputStream.class);
|
||||
|
||||
private static final int DEFAULT_BLOCK_SIZE = 8192;
|
||||
|
||||
private LinkedList<byte[]> buffers;
|
||||
@@ -144,7 +150,7 @@ public class FastByteArrayOutputStream extends OutputStream {
|
||||
// Append bytes to current buffer
|
||||
// Previous data maybe partially decoded, this part will appended to previous
|
||||
in.put(bytes, 0, length);
|
||||
// To begin of data
|
||||
// To begin processing of data
|
||||
in.flip();
|
||||
decodeAndWriteBuffered(writer, in, out, decoder, endOfInput);
|
||||
}
|
||||
@@ -158,7 +164,7 @@ public class FastByteArrayOutputStream extends OutputStream {
|
||||
if (in.hasRemaining()) {
|
||||
// Move remaining to top of buffer
|
||||
in.compact();
|
||||
if (result.isOverflow() && !result.isError() && !result.isMalformed()) {
|
||||
if (result.isOverflow() && !result.isError()) { // isError covers isMalformed and isUnmappable
|
||||
// Not all buffer chars decoded, spin it again
|
||||
// Set to begin
|
||||
in.flip();
|
||||
@@ -167,16 +173,24 @@ public class FastByteArrayOutputStream extends OutputStream {
|
||||
// Clean up buffer
|
||||
in.clear();
|
||||
}
|
||||
} while (in.hasRemaining() && result.isOverflow() && !result.isError() && !result.isMalformed());
|
||||
} while (in.hasRemaining() && result.isOverflow() && !result.isError()); // isError covers isMalformed and isUnmappable
|
||||
|
||||
if (result.isError()) {
|
||||
if (LOG.isWarnEnabled()) {
|
||||
// Provide a log warning when the decoding fails (prior to 2.5.19 it failed silently).
|
||||
// Note: Set FastByteArrayOutputStream's Logger level to error or higher to suppress this log warning.
|
||||
LOG.warn("Buffer decoding-in-to-out [{}] failed, coderResult [{}]", decoder.charset().name(), result.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static CoderResult decodeAndWrite(Writer writer, ByteBuffer in, CharBuffer out, CharsetDecoder decoder, boolean endOfInput) throws IOException {
|
||||
CoderResult result = decoder.decode(in, out, endOfInput);
|
||||
// To begin of decoded data
|
||||
// To begin processing of decoded data
|
||||
out.flip();
|
||||
// Output
|
||||
writer.write(out.toString());
|
||||
// clear output to avoid infinitive loops, see WW-4383
|
||||
// Clear output to avoid infinite loops, see WW-4383
|
||||
out.clear();
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ public class JBossFileManager extends DefaultFileManager {
|
||||
|
||||
@Override
|
||||
public void monitorFile(URL fileUrl) {
|
||||
if (isJBossUrl(fileUrl)) {
|
||||
if (reloadingConfigs && isJBossUrl(fileUrl)) {
|
||||
String fileName = fileUrl.toString();
|
||||
LOG.debug("Creating revision for URL: {}", fileName);
|
||||
URL normalizedUrl = normalizeToFileProtocol(fileUrl);
|
||||
|
||||
@@ -35,6 +35,7 @@ public class SetTag extends ContextBeanTag {
|
||||
|
||||
protected String scope;
|
||||
protected String value;
|
||||
protected boolean trimBody = true;
|
||||
|
||||
public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
|
||||
return new Set(stack);
|
||||
@@ -59,4 +60,17 @@ public class SetTag extends ContextBeanTag {
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public void setTrimBody(boolean trimBody) {
|
||||
this.trimBody = trimBody;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getBody() {
|
||||
if (trimBody) {
|
||||
return super.getBody();
|
||||
} else {
|
||||
return (bodyContent == null ? "" : bodyContent.getString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,9 @@ public class OptGroupTag extends ComponentTagSupport {
|
||||
protected String disabled;
|
||||
protected String listKey;
|
||||
protected String listValue;
|
||||
protected String listCssClass;
|
||||
protected String listCssStyle;
|
||||
protected String listTitle;
|
||||
|
||||
public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
|
||||
return new OptGroup(stack, req, res);
|
||||
@@ -50,6 +53,9 @@ public class OptGroupTag extends ComponentTagSupport {
|
||||
optGroup.setDisabled(disabled);
|
||||
optGroup.setListKey(listKey);
|
||||
optGroup.setListValue(listValue);
|
||||
optGroup.setListCssClass(listCssClass);
|
||||
optGroup.setListCssStyle(listCssStyle);
|
||||
optGroup.setListTitle(listTitle);
|
||||
}
|
||||
|
||||
public void setList(String list) {
|
||||
@@ -71,4 +77,16 @@ public class OptGroupTag extends ComponentTagSupport {
|
||||
public void setListValue(String listValue) {
|
||||
this.listValue = listValue;
|
||||
}
|
||||
|
||||
public void setListCssClass(String listCssClass) {
|
||||
this.listCssClass = listCssClass;
|
||||
}
|
||||
|
||||
public void setListCssStyle(String listCssStyle) {
|
||||
this.listCssStyle = listCssStyle;
|
||||
}
|
||||
|
||||
public void setListTitle(String listTitle) {
|
||||
this.listTitle = listTitle;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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." />
|
||||
|
||||
@@ -21,27 +21,47 @@
|
||||
<#if parameters.optGroupInternalListUiBeanList??>
|
||||
<#assign optGroupInternalListUiBeans=parameters.optGroupInternalListUiBeanList />
|
||||
<#list optGroupInternalListUiBeans as optGroupInternalListUiBean>
|
||||
<optgroup
|
||||
<optgroup<#rt>
|
||||
<#if optGroupInternalListUiBean.parameters.label?has_content>
|
||||
label="${optGroupInternalListUiBean.parameters.label}"
|
||||
label="${optGroupInternalListUiBean.parameters.label}"<#rt>
|
||||
</#if>
|
||||
<#if optGroupInternalListUiBean.parameters.disabled!false>
|
||||
disabled="disabled"
|
||||
disabled="disabled"<#rt>
|
||||
</#if>
|
||||
<#include "/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
|
||||
>
|
||||
|
||||
<#list optGroupInternalListUiBean.parameters.list as optGroupBean>
|
||||
<#assign trash=stack.push(optGroupBean) />
|
||||
<#assign tmpKey=stack.findValue(optGroupInternalListUiBean.parameters.listKey) />
|
||||
<#assign tmpValue=stack.findValue(optGroupInternalListUiBean.parameters.listValue) />
|
||||
<#assign tmpKeyStr = tmpKey.toString() />
|
||||
<option value="${tmpKeyStr?html}"
|
||||
<#if tag.contains(parameters.nameValue, tmpKey) == true>
|
||||
selected="selected"
|
||||
<#assign optGroupItemCssClass = ''/>
|
||||
<#if optGroupInternalListUiBean.parameters.listCssClass??>
|
||||
<#assign optGroupItemCssClass= stack.findString(optGroupInternalListUiBean.parameters.listCssClass)!''/>
|
||||
</#if>
|
||||
>${tmpValue?html}
|
||||
</option>
|
||||
<#assign optGroupItemCssStyle = ''/>
|
||||
<#if optGroupInternalListUiBean.parameters.listCssStyle??>
|
||||
<#assign optGroupItemCssStyle= stack.findString(optGroupInternalListUiBean.parameters.listCssStyle)!''/>
|
||||
</#if>
|
||||
<#assign optGroupItemTitle = ''/>
|
||||
<#if optGroupInternalListUiBean.parameters.listTitle??>
|
||||
<#assign optGroupItemTitle= stack.findString(optGroupInternalListUiBean.parameters.listTitle)!''/>
|
||||
</#if>
|
||||
<option value="${tmpKeyStr?html}"<#rt>
|
||||
<#if tag.contains(parameters.nameValue, tmpKey) == true>
|
||||
selected="selected"<#rt>
|
||||
</#if>
|
||||
<#if optGroupItemCssClass?has_content>
|
||||
class="${optGroupItemCssClass?html}"<#rt/>
|
||||
</#if>
|
||||
<#if optGroupItemCssStyle?has_content>
|
||||
style="${optGroupItemCssStyle?html}"<#rt/>
|
||||
</#if>
|
||||
<#if optGroupItemTitle?has_content>
|
||||
title="${optGroupItemTitle?html}"<#rt/>
|
||||
</#if>
|
||||
>${tmpValue?html}<#t>
|
||||
</option><#lt>
|
||||
<#assign trash=stack.pop() />
|
||||
</#list>
|
||||
</optgroup>
|
||||
|
||||
@@ -57,6 +57,22 @@ Please do not edit it directly.
|
||||
<td align="left" valign="top">String</td>
|
||||
<td align="left" valign="top">Set the list attribute.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top">listCssClass</td>
|
||||
<td align="left" valign="top">false</td>
|
||||
<td align="left" valign="top"></td>
|
||||
<td align="left" valign="top">false</td>
|
||||
<td align="left" valign="top">String</td>
|
||||
<td align="left" valign="top">Property of list objects to get css class from</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top">listCssStyle</td>
|
||||
<td align="left" valign="top">false</td>
|
||||
<td align="left" valign="top"></td>
|
||||
<td align="left" valign="top">false</td>
|
||||
<td align="left" valign="top">String</td>
|
||||
<td align="left" valign="top">Property of list objects to get css style from</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top">listKey</td>
|
||||
<td align="left" valign="top">false</td>
|
||||
@@ -65,6 +81,14 @@ Please do not edit it directly.
|
||||
<td align="left" valign="top">String</td>
|
||||
<td align="left" valign="top">Set the listKey attribute.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top">listTitle</td>
|
||||
<td align="left" valign="top">false</td>
|
||||
<td align="left" valign="top"></td>
|
||||
<td align="left" valign="top">false</td>
|
||||
<td align="left" valign="top">String</td>
|
||||
<td align="left" valign="top">Property of list objects to get title from</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top">listValue</td>
|
||||
<td align="left" valign="top">false</td>
|
||||
|
||||
@@ -41,6 +41,14 @@ Please do not edit it directly.
|
||||
<td align="left" valign="top">String</td>
|
||||
<td align="left" valign="top">The scope in which to assign the variable. Can be <b>application</b>, <b>session</b>, <b>request</b>, <b>page</b>, or <b>action</b>.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top">trimBody</td>
|
||||
<td align="left" valign="top">false</td>
|
||||
<td align="left" valign="top">true</td>
|
||||
<td align="left" valign="top">false</td>
|
||||
<td align="left" valign="top">Boolean</td>
|
||||
<td align="left" valign="top">Set to false to prevent the default whitespace-trim of this tag's body content</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top">value</td>
|
||||
<td align="left" valign="top">false</td>
|
||||
|
||||
+34
-20
@@ -18,31 +18,45 @@
|
||||
*/
|
||||
package com.opensymphony.xwork2.config.providers;
|
||||
|
||||
import org.apache.struts2.StrutsInternalTestCase;
|
||||
import static org.hamcrest.core.Is.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
import org.apache.struts2.StrutsInternalTestCase;
|
||||
|
||||
public class EnvsValueSubstitutorTest extends StrutsInternalTestCase {
|
||||
|
||||
public void testSimpleValue() throws Exception {
|
||||
// given
|
||||
String expected = System.getenv("USER");
|
||||
ValueSubstitutor substitutor = new EnvsValueSubstitutor();
|
||||
private ValueSubstitutor substitutor;
|
||||
|
||||
// when
|
||||
String actual = substitutor.substitute("${env.USER}");
|
||||
|
||||
// then
|
||||
assertEquals(expected, actual);
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
substitutor = new EnvsValueSubstitutor();
|
||||
}
|
||||
|
||||
public void testNoSubstitution() throws Exception {
|
||||
// given
|
||||
ValueSubstitutor substitutor = new EnvsValueSubstitutor();
|
||||
|
||||
// when
|
||||
String actual = substitutor.substitute("val1");
|
||||
|
||||
// then
|
||||
assertEquals("val1", actual);
|
||||
public void testEnvSimpleValue() {
|
||||
if (SystemUtils.IS_OS_WINDOWS) {
|
||||
assertThat(substitutor.substitute("${env.USERNAME}"), is(System.getenv("USERNAME")));
|
||||
} else {
|
||||
assertThat(substitutor.substitute("${env.USER}"), is(System.getenv("USER")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testEnvSimpleDefaultValue() {
|
||||
final String defaultValue = "defaultValue";
|
||||
assertThat(substitutor.substitute("${env.UNKNOWN:" + defaultValue + "}"), is(defaultValue));
|
||||
}
|
||||
|
||||
public void testSystemSimpleValue() {
|
||||
final String key = "sysPropKey";
|
||||
final String value = "sysPropValue";
|
||||
System.setProperty(key, value);
|
||||
|
||||
assertThat(substitutor.substitute("${" + key + "}"), is(value));
|
||||
}
|
||||
|
||||
public void testNoSubstitution() {
|
||||
final String value = "val1";
|
||||
assertThat(substitutor.substitute(value), is(value));
|
||||
}
|
||||
}
|
||||
|
||||
+25
-12
@@ -18,29 +18,42 @@
|
||||
*/
|
||||
package com.opensymphony.xwork2.config.providers;
|
||||
|
||||
import com.opensymphony.xwork2.config.ConfigurationException;
|
||||
import com.opensymphony.xwork2.config.ConfigurationProvider;
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
import org.apache.struts2.StrutsConstants;
|
||||
|
||||
public class XmlConfigurationProviderEnvsSubstitutionTest extends ConfigurationTestBase {
|
||||
|
||||
public void testSubstitution() throws ConfigurationException {
|
||||
final String filename = "com/opensymphony/xwork2/config/providers/xwork-test-envs-substitution.xml";
|
||||
ConfigurationProvider provider = buildConfigurationProvider(filename);
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
configurationManager.addContainerProvider(provider);
|
||||
configurationManager.addContainerProvider(buildConfigurationProvider(
|
||||
"com/opensymphony/xwork2/config/providers/xwork-test-envs-substitution.xml"));
|
||||
configurationManager.reload();
|
||||
configuration = configurationManager.getConfiguration();
|
||||
container = configuration.getContainer();
|
||||
}
|
||||
|
||||
String foo = container.getInstance(String.class, "foo");
|
||||
assertEquals("bar", foo);
|
||||
public void testSubstitution() {
|
||||
assertEquals("bar", container.getInstance(String.class, "foo"));
|
||||
|
||||
String user = container.getInstance(String.class, "user");
|
||||
assertEquals(System.getenv("USER"), user);
|
||||
String user;
|
||||
if (SystemUtils.IS_OS_WINDOWS) {
|
||||
user = container.getInstance(String.class, "username");
|
||||
assertEquals(System.getenv("USERNAME"), user);
|
||||
} else {
|
||||
user = container.getInstance(String.class, "user");
|
||||
assertEquals(System.getenv("USER"), user);
|
||||
}
|
||||
|
||||
String home = container.getInstance(String.class, "home");
|
||||
assertEquals("Current HOME = " + System.getenv("HOME"), home);
|
||||
String home;
|
||||
if (SystemUtils.IS_OS_WINDOWS) {
|
||||
home = container.getInstance(String.class, "homedrive.homepath");
|
||||
assertEquals("Current HOMEDRIVE.HOMEPATH = " + System.getenv("HOMEDRIVE") + System.getenv("HOMEPATH"), home);
|
||||
} else {
|
||||
home = container.getInstance(String.class, "home");
|
||||
assertEquals("Current HOME = " + System.getenv("HOME"), home);
|
||||
}
|
||||
|
||||
String os = container.getInstance(String.class, "os");
|
||||
assertEquals("Current OS = " + System.getProperty("os.name"), os);
|
||||
|
||||
+39
-6
@@ -31,6 +31,9 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
@@ -80,10 +83,10 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
|
||||
public void testNeedsReload() throws Exception {
|
||||
final String filename = "com/opensymphony/xwork2/config/providers/xwork-test-actions.xml";
|
||||
ConfigurationProvider provider = new XmlConfigurationProvider(filename, true);
|
||||
container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
|
||||
container.inject(provider);
|
||||
provider.init(configuration);
|
||||
provider.loadPackages();
|
||||
container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
|
||||
|
||||
assertFalse(provider.needsReload()); // Revision exists and timestamp didn't change
|
||||
|
||||
@@ -94,6 +97,36 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
|
||||
assertTrue(provider.needsReload());
|
||||
}
|
||||
|
||||
public void testReload() throws Exception {
|
||||
final String filename = "com/opensymphony/xwork2/config/providers/xwork-test-reload.xml";
|
||||
ConfigurationProvider provider = new XmlConfigurationProvider(filename, true);
|
||||
loadConfigurationProviders(provider);
|
||||
|
||||
assertFalse(provider.needsReload()); // Revision exists and timestamp didn't change
|
||||
|
||||
File file = new File(getClass().getResource("/" + filename).toURI());
|
||||
assertTrue("not exists: " + file.toString(), file.exists());
|
||||
|
||||
Path configPath = Paths.get(file.getAbsolutePath());
|
||||
String content = new String(Files.readAllBytes(configPath));
|
||||
content = content.replaceAll("<constant name=\"struts.configuration.xml.reload\" value=\"true\" />",
|
||||
"<constant name=\"struts.configuration.xml.reload\" value=\"false\" />");
|
||||
Files.write(configPath, content.getBytes()); // user demand: stop reloading configs
|
||||
|
||||
try {
|
||||
assertTrue(provider.needsReload()); // config file has changed in previous lines
|
||||
|
||||
configurationManager.reload();
|
||||
|
||||
changeFileTime(file);
|
||||
assertFalse(provider.needsReload()); // user already has stopped reloading configs
|
||||
} finally {
|
||||
content = content.replaceAll("<constant name=\"struts.configuration.xml.reload\" value=\"false\" />",
|
||||
"<constant name=\"struts.configuration.xml.reload\" value=\"true\" />");
|
||||
Files.write(configPath, content.getBytes());
|
||||
}
|
||||
}
|
||||
|
||||
public void testNeedsReloadNotReloadingConfigs() throws Exception {
|
||||
final String filename = "com/opensymphony/xwork2/config/providers/xwork-test-actions.xml";
|
||||
buildConfigurationProvider(filename);
|
||||
@@ -176,10 +209,10 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
|
||||
public void testEmptySpaces() throws Exception {
|
||||
final String filename = "com/opensymphony/xwork2/config/providers/xwork- test.xml";
|
||||
ConfigurationProvider provider = new XmlConfigurationProvider(filename, true);
|
||||
container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
|
||||
container.inject(provider);
|
||||
provider.init(configuration);
|
||||
provider.loadPackages();
|
||||
container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
|
||||
|
||||
assertFalse(provider.needsReload());
|
||||
|
||||
@@ -215,7 +248,6 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
|
||||
}
|
||||
|
||||
public void testConfigsInJarFiles() throws Exception {
|
||||
container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
|
||||
testProvider("xwork-jar.xml");
|
||||
testProvider("xwork-zip.xml");
|
||||
testProvider("xwork - jar.xml");
|
||||
@@ -229,7 +261,8 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
|
||||
|
||||
private void testProvider(String configFile) throws Exception {
|
||||
ConfigurationProvider provider = buildConfigurationProvider(configFile);
|
||||
assertTrue(!provider.needsReload());
|
||||
container.getInstance(FileManagerFactory.class).getFileManager().setReloadingConfigs(true);
|
||||
assertFalse(provider.needsReload());
|
||||
|
||||
String fullPath = ClassLoaderUtil.getResource(configFile, ConfigurationProvider.class).toString();
|
||||
|
||||
@@ -241,9 +274,9 @@ public class XmlConfigurationProviderTest extends ConfigurationTestBase {
|
||||
File file = new File(jar);
|
||||
|
||||
assertTrue("File [" + file + "] doesn't exist!", file.exists());
|
||||
file.setLastModified(System.currentTimeMillis());
|
||||
changeFileTime(file);
|
||||
|
||||
assertTrue(!provider.needsReload());
|
||||
assertFalse(provider.needsReload());
|
||||
}
|
||||
|
||||
public void testIncludeWithWildcard() throws Exception {
|
||||
|
||||
@@ -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.*;
|
||||
@@ -29,6 +34,7 @@ import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
|
||||
import ognl.*;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.text.DateFormat;
|
||||
import java.util.*;
|
||||
|
||||
public class OgnlUtilTest extends XWorkTestCase {
|
||||
@@ -363,24 +369,19 @@ 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);
|
||||
cal.set(Calendar.YEAR, 1982);
|
||||
|
||||
assertEquals(cal.getTime(), foo.getBirthday());
|
||||
|
||||
//UK style test
|
||||
props.put("event", "18/10/2006 14:23:45");
|
||||
props.put("meeting", "09/09/2006 14:30");
|
||||
context.put(ActionContext.LOCALE, Locale.UK);
|
||||
|
||||
ognlUtil.setProperties(props, foo, context);
|
||||
|
||||
cal = Calendar.getInstance();
|
||||
//UK style test
|
||||
cal = Calendar.getInstance(Locale.UK);
|
||||
cal.clear();
|
||||
cal.set(Calendar.MONTH, Calendar.OCTOBER);
|
||||
cal.set(Calendar.DAY_OF_MONTH, 18);
|
||||
@@ -388,24 +389,39 @@ public class OgnlUtilTest extends XWorkTestCase {
|
||||
cal.set(Calendar.HOUR_OF_DAY, 14);
|
||||
cal.set(Calendar.MINUTE, 23);
|
||||
cal.set(Calendar.SECOND, 45);
|
||||
|
||||
assertEquals(cal.getTime(), foo.getEvent());
|
||||
|
||||
cal = Calendar.getInstance();
|
||||
|
||||
Date eventTime = cal.getTime();
|
||||
String formatted = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.UK)
|
||||
.format(eventTime);
|
||||
props.put("event", formatted);
|
||||
|
||||
cal = Calendar.getInstance(Locale.UK);
|
||||
cal.clear();
|
||||
cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
|
||||
cal.set(Calendar.DAY_OF_MONTH, 9);
|
||||
cal.set(Calendar.YEAR, 2006);
|
||||
cal.set(Calendar.HOUR_OF_DAY, 14);
|
||||
cal.set(Calendar.MINUTE, 30);
|
||||
|
||||
assertEquals(cal.getTime(), foo.getMeeting());
|
||||
|
||||
Date meetingTime = cal.getTime();
|
||||
formatted = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.UK)
|
||||
.format(meetingTime);
|
||||
props.put("meeting", formatted);
|
||||
|
||||
context.put(ActionContext.LOCALE, Locale.UK);
|
||||
|
||||
ognlUtil.setProperties(props, foo, context);
|
||||
|
||||
assertEquals(eventTime, foo.getEvent());
|
||||
|
||||
assertEquals(meetingTime, foo.getMeeting());
|
||||
|
||||
//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);
|
||||
@@ -418,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());
|
||||
}
|
||||
@@ -636,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) {
|
||||
;
|
||||
@@ -648,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();
|
||||
|
||||
@@ -803,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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -19,11 +19,17 @@
|
||||
package com.opensymphony.xwork2.util;
|
||||
|
||||
import com.opensymphony.xwork2.XWorkTestCase;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
|
||||
public class ClassPathFinderTest extends XWorkTestCase {
|
||||
|
||||
|
||||
public void testFinder() {
|
||||
ClassPathFinder finder = new ClassPathFinder();
|
||||
finder.setPattern("**/xwork-test-wildcard-*.xml");
|
||||
@@ -52,4 +58,50 @@ public class ClassPathFinderTest extends XWorkTestCase {
|
||||
|
||||
}
|
||||
|
||||
public void testFinderNotURLClassLoader() throws Exception {
|
||||
NotURLClassLoader loader = new NotURLClassLoader(Thread.currentThread().getContextClassLoader());
|
||||
Thread.currentThread().setContextClassLoader(loader);
|
||||
|
||||
try {
|
||||
Class<?> clazz = loader.loadClass(ClassPathFinderTest.class.getName());
|
||||
Object test = clazz.getConstructor().newInstance();
|
||||
|
||||
clazz.getMethod("testFinder").invoke(test);
|
||||
} finally {
|
||||
Thread.currentThread().setContextClassLoader(loader.parentClassLoader);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private class NotURLClassLoader extends ClassLoader {
|
||||
private Map<String, Class<?>> loadedClasses = new HashMap<>();
|
||||
private ClassLoader parentClassLoader;
|
||||
|
||||
NotURLClassLoader(ClassLoader parentClassLoader) {
|
||||
super(null);
|
||||
this.parentClassLoader = parentClassLoader;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
||||
if (!loadedClasses.containsKey(name)) {
|
||||
try {
|
||||
byte[] classBits = IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream(
|
||||
name.replace('.', '/') + ".class"));
|
||||
loadedClasses.put(name, defineClass(name, classBits, 0, classBits.length));
|
||||
} catch (IOException e) {
|
||||
throw new ClassNotFoundException("class " + name + " is not findable", e);
|
||||
} catch (Exception e) {
|
||||
loadedClasses.put(name, parentClassLoader.loadClass(name));
|
||||
}
|
||||
}
|
||||
|
||||
return loadedClasses.get(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Enumeration<URL> findResources(String name) throws IOException {
|
||||
return parentClassLoader.getResources(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import java.net.URLConnection;
|
||||
import java.net.URLStreamHandler;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.jar.Manifest;
|
||||
@@ -49,10 +50,13 @@ public class JarEntryRevisionTest extends XWorkTestCase {
|
||||
fileManager = container.getInstance(FileManagerFactory.class).getFileManager();
|
||||
}
|
||||
|
||||
private void createJarFile(long time) throws Exception {
|
||||
private String createJarFile(long time) throws Exception {
|
||||
Manifest manifest = new Manifest();
|
||||
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
|
||||
FileOutputStream fos = new FileOutputStream("target/JarEntryRevisionTest_testNeedsReloading.jar", false);
|
||||
Path jarPath = Paths.get(Thread.currentThread().getContextClassLoader()
|
||||
.getResource("xwork-jar.jar").toURI()).getParent();
|
||||
File jarFile = jarPath.resolve("JarEntryRevisionTest_testNeedsReloading.jar").toFile();
|
||||
FileOutputStream fos = new FileOutputStream(jarFile, false);
|
||||
JarOutputStream target = new JarOutputStream(fos, manifest);
|
||||
target.putNextEntry(new ZipEntry("com/opensymphony/xwork2/util/fs/"));
|
||||
ZipEntry entry = new ZipEntry("com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class");
|
||||
@@ -64,13 +68,14 @@ public class JarEntryRevisionTest extends XWorkTestCase {
|
||||
target.closeEntry();
|
||||
target.close();
|
||||
fos.close();
|
||||
|
||||
return jarFile.toURI().toURL().toExternalForm();
|
||||
}
|
||||
|
||||
public void testNeedsReloading() throws Exception {
|
||||
long now = System.currentTimeMillis();
|
||||
|
||||
createJarFile(now);
|
||||
URL url = new URL("jar:file:target/JarEntryRevisionTest_testNeedsReloading.jar!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class");
|
||||
URL url = new URL("jar:" + createJarFile(now) + "!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class");
|
||||
Revision entry = JarEntryRevision.build(url, fileManager);
|
||||
assert entry != null;
|
||||
assertFalse(entry.needsReloading());
|
||||
@@ -82,9 +87,8 @@ public class JarEntryRevisionTest extends XWorkTestCase {
|
||||
public void testNeedsReloadingWithContainerProvidedURLConnection() throws Exception {
|
||||
long now = System.currentTimeMillis();
|
||||
|
||||
createJarFile(now);
|
||||
URL url = new URL(null,
|
||||
"jar:file:target/JarEntryRevisionTest_testNeedsReloading.jar!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class",
|
||||
"jar:" + createJarFile(now) + "!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class",
|
||||
new ContainerProvidedURLStreamHandler());
|
||||
Revision entry = JarEntryRevision.build(url, fileManager);
|
||||
assert entry != null;
|
||||
@@ -97,9 +101,7 @@ public class JarEntryRevisionTest extends XWorkTestCase {
|
||||
public void testNeedsReloadingWithContainerProvidedURLConnectionEmptyProtocol() throws Exception {
|
||||
long now = System.currentTimeMillis();
|
||||
|
||||
createJarFile(now);
|
||||
File targetDir = new File("target");
|
||||
String targetUrlStr = targetDir.toURI().toURL().toString();
|
||||
String targetUrlStr = createJarFile(now);
|
||||
if (targetUrlStr.startsWith("file:")) {
|
||||
targetUrlStr = targetUrlStr.substring(5);//emptying protocol; we expect framework will fix it
|
||||
}
|
||||
@@ -107,7 +109,7 @@ public class JarEntryRevisionTest extends XWorkTestCase {
|
||||
targetUrlStr = targetUrlStr.substring(1);//we expect framework will fix it also
|
||||
}
|
||||
URL url = new URL(null,
|
||||
"zip:" + targetUrlStr + "JarEntryRevisionTest_testNeedsReloading.jar!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class",
|
||||
"zip:" + targetUrlStr + "!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class",
|
||||
new ContainerProvidedURLStreamHandler());
|
||||
Revision entry = JarEntryRevision.build(url, fileManager);
|
||||
assert entry != null;
|
||||
|
||||
@@ -20,6 +20,7 @@ package org.apache.struts2;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
|
||||
@@ -79,8 +79,8 @@ public class I18nInterceptorTest extends TestCase {
|
||||
|
||||
assertFalse("should have been removed",
|
||||
mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined());
|
||||
assertNull("should not be created", request.getSession(false));
|
||||
assertNull("should not be stored here", session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE));
|
||||
assertNotNull("should be created", request.getSession(false));
|
||||
assertNotNull("should be stored here", session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE));
|
||||
}
|
||||
|
||||
public void testDefaultLocale() throws Exception {
|
||||
|
||||
@@ -51,7 +51,7 @@ public class IncludeTagTest extends AbstractTagTest {
|
||||
|
||||
public void testIncludeNoParam() throws Exception {
|
||||
|
||||
// use always matcher as we can not determine the excact objects used in mock.include(request, response) call
|
||||
// Use always matcher as we can not determine the exact objects used in mock.include(request, response) call
|
||||
mockRequestDispatcher.include(anyObject(ServletRequest.class), anyObject(ServletResponse.class));
|
||||
expectLastCall().times(1);
|
||||
|
||||
@@ -69,7 +69,7 @@ public class IncludeTagTest extends AbstractTagTest {
|
||||
|
||||
public void testIncludeWithParameters() throws Exception {
|
||||
|
||||
// use always matcher as we can not determine the excact objects used in mock.include(request, response) call
|
||||
// Use always matcher as we can not determine the exact objects used in mock.include(request, response) call
|
||||
mockRequestDispatcher.include(anyObject(ServletRequest.class), anyObject(ServletResponse.class));
|
||||
expectLastCall().times(1);
|
||||
|
||||
@@ -90,7 +90,7 @@ public class IncludeTagTest extends AbstractTagTest {
|
||||
|
||||
public void testIncludeRelative2Dots() throws Exception {
|
||||
// TODO: we should test for .. in unit test - is this test correct?
|
||||
// use always matcher as we can not determine the exact objects used in mock.include(request, response) call
|
||||
// Use always matcher as we can not determine the exact objects used in mock.include(request, response) call
|
||||
mockRequestDispatcher.include(anyObject(ServletRequest.class), anyObject(ServletResponse.class));
|
||||
expectLastCall().times(1);
|
||||
|
||||
@@ -108,6 +108,60 @@ public class IncludeTagTest extends AbstractTagTest {
|
||||
verify(mockRequestDispatcher);
|
||||
}
|
||||
|
||||
public void testIncludeSetUseResponseEncodingTrue() throws Exception {
|
||||
// TODO: If possible in future mock-test an actual content-includes with various encodings
|
||||
// while setting the response encoding to match. Doesn't appear to be possible
|
||||
// right now in unit-test form.
|
||||
// Seems that the best we can do is verify the setUseResponseEncoding() doesn't fail...
|
||||
|
||||
// Use always matcher as we can not determine the exact objects used in mock.include(request, response) call
|
||||
mockRequestDispatcher.include(anyObject(ServletRequest.class), anyObject(ServletResponse.class));
|
||||
expectLastCall().times(1);
|
||||
|
||||
replay(mockRequestDispatcher);
|
||||
|
||||
tag.setValue("person/create.jsp");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
tag.doStartTag();
|
||||
// Manipulate after doStartTag to ensure the tag component has undergone injection
|
||||
Include include = (Include) tag.getComponent();
|
||||
include.setUseResponseEncoding("true");
|
||||
tag.doEndTag();
|
||||
|
||||
assertEquals("UTF-8", response.getCharacterEncoding());
|
||||
assertEquals("/person/create.jsp", request.getRequestDispatherString());
|
||||
assertEquals("", writer.toString()); // Nothing gets written for mock-include
|
||||
|
||||
verify(mockRequestDispatcher);
|
||||
}
|
||||
|
||||
public void testIncludeSetUseResponseEncodingFalse() throws Exception {
|
||||
// TODO: If possible in future mock-test an actual content-includes with various encodings
|
||||
// while setting the response encoding to match. Doesn't appear to be possible
|
||||
// right now in unit-test form.
|
||||
// Seems that the best we can do is verify the setUseResponseEncoding() doesn't fail...
|
||||
|
||||
// Use always matcher as we can not determine the exact objects used in mock.include(request, response) call
|
||||
mockRequestDispatcher.include(anyObject(ServletRequest.class), anyObject(ServletResponse.class));
|
||||
expectLastCall().times(1);
|
||||
|
||||
replay(mockRequestDispatcher);
|
||||
|
||||
tag.setValue("person/create.jsp");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
tag.doStartTag();
|
||||
// Manipulate after doStartTag to ensure the tag component has undergone injection
|
||||
Include include = (Include) tag.getComponent();
|
||||
include.setUseResponseEncoding("false");
|
||||
tag.doEndTag();
|
||||
|
||||
assertEquals("UTF-8", response.getCharacterEncoding());
|
||||
assertEquals("/person/create.jsp", request.getRequestDispatherString());
|
||||
assertEquals("", writer.toString()); // Nothing gets written for mock-include
|
||||
|
||||
verify(mockRequestDispatcher);
|
||||
}
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
request.setupGetRequestDispatcher(new MockRequestDispatcher());
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
*/
|
||||
package org.apache.struts2.views.jsp;
|
||||
|
||||
import com.mockobjects.servlet.MockJspWriter;
|
||||
import java.io.IOException;
|
||||
import javax.servlet.jsp.JspException;
|
||||
|
||||
|
||||
@@ -83,6 +85,42 @@ public class SetTagTest extends AbstractUITagTest {
|
||||
assertEquals(chewie, context.get("chewie"));
|
||||
}
|
||||
|
||||
public void testSetTrimBody() throws JspException, IOException {
|
||||
final String beginEndSpaceString = " Preceding and trailing spaces. ";
|
||||
final String trimmedBeginEndSpaceString = beginEndSpaceString.trim();
|
||||
StrutsMockBodyContent mockBodyContent;
|
||||
|
||||
tag.setName("foo");
|
||||
tag.setValue(null);
|
||||
// Do not set any value - default for tag should be true
|
||||
mockBodyContent = new StrutsMockBodyContent(new MockJspWriter());
|
||||
mockBodyContent.setString(beginEndSpaceString);
|
||||
tag.setBodyContent(mockBodyContent);
|
||||
tag.doStartTag();
|
||||
tag.doEndTag();
|
||||
assertEquals(trimmedBeginEndSpaceString, context.get("foo"));
|
||||
|
||||
tag.setName("foo");
|
||||
tag.setValue(null);
|
||||
tag.setTrimBody(true);
|
||||
mockBodyContent = new StrutsMockBodyContent(new MockJspWriter());
|
||||
mockBodyContent.setString(beginEndSpaceString);
|
||||
tag.setBodyContent(mockBodyContent);
|
||||
tag.doStartTag();
|
||||
tag.doEndTag();
|
||||
assertEquals(trimmedBeginEndSpaceString, context.get("foo"));
|
||||
|
||||
tag.setName("foo");
|
||||
tag.setValue(null);
|
||||
tag.setTrimBody(false);
|
||||
mockBodyContent = new StrutsMockBodyContent(new MockJspWriter());
|
||||
mockBodyContent.setString(beginEndSpaceString);
|
||||
tag.setBodyContent(mockBodyContent);
|
||||
tag.doStartTag();
|
||||
tag.doEndTag();
|
||||
assertEquals(beginEndSpaceString, context.get("foo"));
|
||||
}
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
|
||||
@@ -253,4 +253,40 @@ public class OptGroupTest extends AbstractUITagTest {
|
||||
verify(SelectTag.class.getResource("OptGroup-6.txt"));
|
||||
}
|
||||
|
||||
public void testOptGroupListAttributes() throws Exception {
|
||||
SelectTag selectTag = new SelectTag();
|
||||
selectTag.setName("mySelection");
|
||||
selectTag.setLabel("My Selection");
|
||||
selectTag.setList("#{'ONE':'one','TWO':'two','THREE':'three'}");
|
||||
selectTag.setListCssClass("'option-css-class ' + key");
|
||||
selectTag.setListCssStyle("'background-color: green; font-family: ' + key");
|
||||
selectTag.setListTitle("'option-title' + key");
|
||||
|
||||
OptGroupTag optGroupTag1 = new OptGroupTag();
|
||||
optGroupTag1.setLabel("My Label 1");
|
||||
optGroupTag1.setList("#{'AAA':'aaa','BBB':'bbb','CCC':'ccc'}");
|
||||
optGroupTag1.setListCssClass("'optgroup-option-css-class ' + key");
|
||||
optGroupTag1.setListCssStyle("'background-color: blue; font-family: ' + key");
|
||||
optGroupTag1.setListTitle("'optgroup-option-title' + key");
|
||||
|
||||
OptGroupTag optGroupTag2 = new OptGroupTag();
|
||||
optGroupTag2.setLabel("My Label 2");
|
||||
optGroupTag2.setList("#{'DDD':'ddd','EEE':'eee','FFF':'fff'}");
|
||||
optGroupTag2.setListCssClass("notExistingProperty");
|
||||
optGroupTag2.setListCssStyle("notExistingProperty");
|
||||
optGroupTag2.setListTitle("notExistingProperty");
|
||||
|
||||
selectTag.setPageContext(pageContext);
|
||||
selectTag.doStartTag();
|
||||
optGroupTag1.setPageContext(pageContext);
|
||||
optGroupTag1.doStartTag();
|
||||
optGroupTag1.doEndTag();
|
||||
optGroupTag2.setPageContext(pageContext);
|
||||
optGroupTag2.doStartTag();
|
||||
optGroupTag2.doEndTag();
|
||||
selectTag.doEndTag();
|
||||
|
||||
//System.out.println(writer.toString());
|
||||
verify(SelectTag.class.getResource("OptGroup-8.txt"));
|
||||
}
|
||||
}
|
||||
|
||||
+88
@@ -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>
|
||||
+88
@@ -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>
|
||||
+88
@@ -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>
|
||||
+88
@@ -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>
|
||||
+8
@@ -28,8 +28,16 @@
|
||||
|
||||
<constant name="foo" value="bar"/>
|
||||
|
||||
<!-- Linux/Unix (or Unix-like) Environment -->
|
||||
<constant name="user" value="${env.USER}"/>
|
||||
<constant name="home" value="Current HOME = ${env.HOME}"/>
|
||||
<!-- Linux/Unix (or Unix-like) Environment -->
|
||||
|
||||
<!-- Windows (or Windows-like) Environment -->
|
||||
<constant name="username" value="${env.USERNAME}"/>
|
||||
<constant name="homedrive.homepath" value="Current HOMEDRIVE.HOMEPATH = ${env.HOMEDRIVE}${env.HOMEPATH}"/>
|
||||
<!-- Windows (or Windows-like) Environment -->
|
||||
|
||||
<constant name="os" value="Current OS = ${os.name}"/>
|
||||
<constant name="unknown" value="Unknown = ${env.UNKNOWN:default}"/>
|
||||
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
<?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.configuration.xml.reload" value="true" />
|
||||
|
||||
</xwork>
|
||||
@@ -0,0 +1,40 @@
|
||||
<tr>
|
||||
<td class="tdLabel"><label for="mySelection" class="label">My Selection:</label></td>
|
||||
<td class="tdInput">
|
||||
<select name="mySelection" id="mySelection">
|
||||
<option value="ONE" class="option-css-class ONE" style="background-color: green; font-family: ONE" title="option-title ONE">one</option>
|
||||
<option value="TWO" class="option-css-class TWO" style="background-color: green; font-family: TWO" title="option-title TWO">two</option>
|
||||
<option value="THREE" class="option-css-class THREE" style="background-color: green; font-family: THREE" title="option-title THREE">three</option>
|
||||
|
||||
<optgroup
|
||||
label="My Label 1"
|
||||
>
|
||||
|
||||
<option value="AAA" class="optgroup-option-css-class AAA" style="background-color: blue; font-family: AAA" title="optgroup-option-title AAA"
|
||||
>aaa
|
||||
</option>
|
||||
<option value="BBB" class="optgroup-option-css-class BBB" style="background-color: blue; font-family: BBB" title="optgroup-option-title BBB"
|
||||
>bbb
|
||||
</option>
|
||||
<option value="CCC" class="optgroup-option-css-class CCC" style="background-color: blue; font-family: CCC" title="optgroup-option-title CCC"
|
||||
>ccc
|
||||
</option>
|
||||
</optgroup>
|
||||
<optgroup
|
||||
label="My Label 2"
|
||||
>
|
||||
|
||||
<option value="DDD"
|
||||
>ddd
|
||||
</option>
|
||||
<option value="EEE"
|
||||
>eee
|
||||
</option>
|
||||
<option value="FFF"
|
||||
>fff
|
||||
</option>
|
||||
</optgroup>
|
||||
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
@@ -61,6 +61,37 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!--
|
||||
The Java EE API modules listed below are all marked @Deprecated(forRemoval=true), because they are scheduled
|
||||
for removal in Java 11. So the -add-module approach will no longer work in Java 11 out of the box.
|
||||
What we will need to do in Java 11 and forward is include our own copy of the Java EE APIs on the class path
|
||||
or module path. For example, we can add the JAX-B APIs as a maven dependency like this:
|
||||
-->
|
||||
<dependency>
|
||||
<groupId>javax.xml.bind</groupId>
|
||||
<artifactId>jaxb-api</artifactId>
|
||||
<version>2.3.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sun.xml.bind</groupId>
|
||||
<artifactId>jaxb-core</artifactId>
|
||||
<version>2.3.0.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sun.xml.bind</groupId>
|
||||
<artifactId>jaxb-impl</artifactId>
|
||||
<version>2.3.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
<artifactId>activation</artifactId>
|
||||
<version>1.1.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
+1
-1
@@ -25,7 +25,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-cdi-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-config-browser-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-convention-plugin</artifactId>
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-dwr-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-embeddedjsp-plugin</artifactId>
|
||||
@@ -101,7 +101,6 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.19.1</version>
|
||||
<configuration>
|
||||
<additionalClasspathElements>
|
||||
<element>${project.build.testOutputDirectory}/jsps.jar</element>
|
||||
|
||||
+2
-2
@@ -80,7 +80,7 @@ public class JspCompilationContext {
|
||||
protected String baseURI;
|
||||
protected String outputDir;
|
||||
protected ServletContext context;
|
||||
protected URLClassLoader loader;
|
||||
protected ClassLoader loader;
|
||||
|
||||
protected JspRuntimeContext rctxt;
|
||||
|
||||
@@ -177,7 +177,7 @@ public class JspCompilationContext {
|
||||
return rctxt.getParentClassLoader();
|
||||
}
|
||||
|
||||
public void setClassLoader(URLClassLoader loader) {
|
||||
public void setClassLoader(ClassLoader loader) {
|
||||
this.loader = loader;
|
||||
}
|
||||
|
||||
|
||||
+47
-35
@@ -33,12 +33,14 @@ import javax.servlet.jsp.JspFactory;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FilePermission;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.security.CodeSource;
|
||||
import java.security.PermissionCollection;
|
||||
import java.security.Policy;
|
||||
import java.security.cert.Certificate;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@@ -121,11 +123,9 @@ public final class JspRuntimeContext {
|
||||
this.options = options;
|
||||
|
||||
// Get the parent class loader
|
||||
parentClassLoader =
|
||||
(URLClassLoader) Thread.currentThread().getContextClassLoader();
|
||||
parentClassLoader = Thread.currentThread().getContextClassLoader();
|
||||
if (parentClassLoader == null) {
|
||||
parentClassLoader =
|
||||
(URLClassLoader) this.getClass().getClassLoader();
|
||||
parentClassLoader = this.getClass().getClassLoader();
|
||||
}
|
||||
|
||||
if (log.isDebugEnabled()) {
|
||||
@@ -138,7 +138,11 @@ public final class JspRuntimeContext {
|
||||
}
|
||||
}
|
||||
|
||||
initClassPath();
|
||||
try {
|
||||
initClassPath();
|
||||
} catch (IOException e) {
|
||||
context.log("ClassPath Init for context failed", e);
|
||||
}
|
||||
|
||||
if (context instanceof JspCServletContext) {
|
||||
return;
|
||||
@@ -165,7 +169,7 @@ public final class JspRuntimeContext {
|
||||
*/
|
||||
private ServletContext context;
|
||||
private Options options;
|
||||
private URLClassLoader parentClassLoader;
|
||||
private ClassLoader parentClassLoader;
|
||||
private PermissionCollection permissionCollection;
|
||||
private CodeSource codeSource;
|
||||
private String classpath;
|
||||
@@ -233,7 +237,7 @@ public final class JspRuntimeContext {
|
||||
*
|
||||
* @return URLClassLoader parent
|
||||
*/
|
||||
public URLClassLoader getParentClassLoader() {
|
||||
public ClassLoader getParentClassLoader() {
|
||||
return parentClassLoader;
|
||||
}
|
||||
|
||||
@@ -333,9 +337,14 @@ public final class JspRuntimeContext {
|
||||
/**
|
||||
* Method used to initialize classpath for compiles.
|
||||
*/
|
||||
private void initClassPath() {
|
||||
private void initClassPath() throws IOException {
|
||||
|
||||
URL[] urls = parentClassLoader.getURLs();
|
||||
URL[] urls;
|
||||
if (parentClassLoader instanceof URLClassLoader) {
|
||||
urls = ((URLClassLoader) parentClassLoader).getURLs();
|
||||
} else { //jdk9 or later
|
||||
urls = Collections.list(parentClassLoader.getResources("")).toArray(new URL[0]);
|
||||
}
|
||||
StringBuffer cpath = new StringBuffer();
|
||||
String sep = System.getProperty("path.separator");
|
||||
|
||||
@@ -418,34 +427,37 @@ public final class JspRuntimeContext {
|
||||
permissionCollection.add(new RuntimePermission(
|
||||
"accessClassInPackage.org.apache.struts2.jasper.runtime"));
|
||||
|
||||
URL[] urls;
|
||||
if (parentClassLoader instanceof URLClassLoader) {
|
||||
URL[] urls = parentClassLoader.getURLs();
|
||||
String jarUrl = null;
|
||||
String jndiUrl = null;
|
||||
for (int i = 0; i < urls.length; i++) {
|
||||
if (jndiUrl == null
|
||||
&& urls[i].toString().startsWith("jndi:")) {
|
||||
jndiUrl = urls[i].toString() + "-";
|
||||
}
|
||||
if (jarUrl == null
|
||||
&& urls[i].toString().startsWith("jar:jndi:")
|
||||
) {
|
||||
jarUrl = urls[i].toString();
|
||||
jarUrl = jarUrl.substring(0, jarUrl.length() - 2);
|
||||
jarUrl = jarUrl.substring(0,
|
||||
jarUrl.lastIndexOf('/')) + "/-";
|
||||
}
|
||||
}
|
||||
if (jarUrl != null) {
|
||||
permissionCollection.add(
|
||||
new FilePermission(jarUrl, "read"));
|
||||
permissionCollection.add(
|
||||
new FilePermission(jarUrl.substring(4), "read"));
|
||||
}
|
||||
if (jndiUrl != null)
|
||||
permissionCollection.add(
|
||||
new FilePermission(jndiUrl, "read"));
|
||||
urls = ((URLClassLoader) parentClassLoader).getURLs();
|
||||
} else { //jdk9 or later
|
||||
urls = Collections.list(parentClassLoader.getResources("")).toArray(new URL[0]);
|
||||
}
|
||||
String jarUrl = null;
|
||||
String jndiUrl = null;
|
||||
for (URL url1 : urls) {
|
||||
if (jndiUrl == null
|
||||
&& url1.toString().startsWith("jndi:")) {
|
||||
jndiUrl = url1.toString() + "-";
|
||||
}
|
||||
if (jarUrl == null
|
||||
&& url1.toString().startsWith("jar:jndi:")
|
||||
) {
|
||||
jarUrl = url1.toString();
|
||||
jarUrl = jarUrl.substring(0, jarUrl.length() - 2);
|
||||
jarUrl = jarUrl.substring(0,
|
||||
jarUrl.lastIndexOf('/')) + "/-";
|
||||
}
|
||||
}
|
||||
if (jarUrl != null) {
|
||||
permissionCollection.add(
|
||||
new FilePermission(jarUrl, "read"));
|
||||
permissionCollection.add(
|
||||
new FilePermission(jarUrl.substring(4), "read"));
|
||||
}
|
||||
if (jndiUrl != null)
|
||||
permissionCollection.add(
|
||||
new FilePermission(jndiUrl, "read"));
|
||||
} catch (Exception e) {
|
||||
context.log("Security Init for context failed", e);
|
||||
}
|
||||
|
||||
+1
-2
@@ -594,8 +594,7 @@ class TagFileProcessor {
|
||||
rctxt.addWrapper(tagFileJarPath + tagFilePath, wrapper);
|
||||
|
||||
// Use same classloader and classpath for compiling tag files
|
||||
wrapper.getJspEngineContext().setClassLoader(
|
||||
(URLClassLoader) ctxt.getClassLoader());
|
||||
wrapper.getJspEngineContext().setClassLoader(ctxt.getClassLoader());
|
||||
wrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
|
||||
} else {
|
||||
// Make sure that JspCompilationContext gets the latest TagInfo
|
||||
|
||||
+21
-23
@@ -25,12 +25,7 @@ import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.net.URLConnection;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.*;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import org.xml.sax.InputSource;
|
||||
@@ -508,24 +503,27 @@ public class TldLocationsCache {
|
||||
ClassLoader loader = webappLoader;
|
||||
|
||||
while (loader != null) {
|
||||
URL[] urls;
|
||||
if (loader instanceof URLClassLoader) {
|
||||
URL[] urls = ((URLClassLoader) loader).getURLs();
|
||||
for (int i=0; i<urls.length; i++) {
|
||||
URLConnection conn = urls[i].openConnection();
|
||||
if (conn instanceof JarURLConnection) {
|
||||
if (needScanJar(loader, webappLoader,
|
||||
((JarURLConnection) conn).getJarFile().getName())) {
|
||||
scanJar((JarURLConnection) conn, true);
|
||||
}
|
||||
} else {
|
||||
String urlStr = urls[i].toString();
|
||||
if (urlStr.startsWith(FILE_PROTOCOL)
|
||||
&& urlStr.endsWith(JAR_FILE_SUFFIX)
|
||||
&& needScanJar(loader, webappLoader, urlStr)) {
|
||||
URL jarURL = new URL("jar:" + urlStr + "!/");
|
||||
scanJar((JarURLConnection) jarURL.openConnection(),
|
||||
true);
|
||||
}
|
||||
urls = ((URLClassLoader) loader).getURLs();
|
||||
} else { //jdk9 or later
|
||||
urls = Collections.list(loader.getResources("")).toArray(new URL[0]);
|
||||
}
|
||||
for (URL url : urls) {
|
||||
URLConnection conn = url.openConnection();
|
||||
if (conn instanceof JarURLConnection) {
|
||||
if (needScanJar(loader, webappLoader,
|
||||
((JarURLConnection) conn).getJarFile().getName())) {
|
||||
scanJar((JarURLConnection) conn, true);
|
||||
}
|
||||
} else {
|
||||
String urlStr = url.toString();
|
||||
if (urlStr.startsWith(FILE_PROTOCOL)
|
||||
&& urlStr.endsWith(JAR_FILE_SUFFIX)
|
||||
&& needScanJar(loader, webappLoader, urlStr)) {
|
||||
URL jarURL = new URL("jar:" + urlStr + "!/");
|
||||
scanJar((JarURLConnection) jarURL.openConnection(),
|
||||
true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,6 @@ import com.opensymphony.xwork2.util.ValueStack;
|
||||
import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
|
||||
import com.opensymphony.xwork2.util.finder.ClassLoaderInterfaceDelegate;
|
||||
import com.opensymphony.xwork2.util.fs.DefaultFileManager;
|
||||
import com.sun.net.httpserver.HttpsParameters;
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.struts2.dispatcher.HttpParameters;
|
||||
@@ -46,11 +45,7 @@ import javax.servlet.Servlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpSession;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.BrokenBarrierException;
|
||||
import java.util.concurrent.CyclicBarrier;
|
||||
|
||||
@@ -231,6 +226,21 @@ public class EmbeddedJSPResultTest extends TestCase {
|
||||
assertEquals("WhoamI?", StringUtils.deleteWhitespace(response.getContentAsString()));
|
||||
}
|
||||
|
||||
public void testNotURLClassLoader() throws Exception {
|
||||
ClassLoader parentClassLoader = Thread.currentThread().getContextClassLoader();
|
||||
NotURLClassLoader loader = new NotURLClassLoader(parentClassLoader);
|
||||
Thread.currentThread().setContextClassLoader(loader);
|
||||
|
||||
try {
|
||||
result.setLocation("org/apache/struts2/tag0.jsp");
|
||||
result.execute(null);
|
||||
|
||||
assertEquals("Thissessionisnotsecure.OtherText", StringUtils.deleteWhitespace(response.getContentAsString()));
|
||||
} finally {
|
||||
Thread.currentThread().setContextClassLoader(parentClassLoader);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
@@ -374,3 +384,10 @@ class CountingClassLoaderInterface extends ClassLoaderInterfaceDelegate {
|
||||
return super.getResourceAsStream(name);
|
||||
}
|
||||
}
|
||||
|
||||
class NotURLClassLoader extends ClassLoader {
|
||||
|
||||
NotURLClassLoader(ClassLoader parentClassLoader) {
|
||||
super(parentClassLoader);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-gxp-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-jasperreports-plugin</artifactId>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-javatemplates-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-jfreechart-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-json-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-junit-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-osgi-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-oval-plugin</artifactId>
|
||||
|
||||
+27
-2
@@ -28,6 +28,8 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import junit.framework.AssertionFailedError;
|
||||
|
||||
public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
public void testSimpleFieldsXML() throws Exception {
|
||||
ActionProxy baseActionProxy = actionProxyFactory.createActionProxy("oval", "simpleFieldsXML", null, null);
|
||||
@@ -283,7 +285,18 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
assertEquals(5, fieldErrors.size()); // 5: as there will be field errors for 'model' and 'address' themselves
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "email", Arrays.asList("email cannot be null"));
|
||||
assertValue(fieldErrors, "address.street", Arrays.asList("street cannot be smaller than 7 characters"));
|
||||
try {
|
||||
// Oval version <= 1.40 validation error for invalid data reports: "net.sf.oval.constraint.AssertValid.violated".
|
||||
assertValue(fieldErrors, "address", Arrays.asList("net.sf.oval.constraint.AssertValid.violated"));
|
||||
// Oval version <= 1.40 validation error for minimum length reports: "street cannot be smaller than 7 characters".
|
||||
assertValue(fieldErrors, "address.street", Arrays.asList("street cannot be smaller than 7 characters"));
|
||||
}
|
||||
catch (AssertionFailedError afe) {
|
||||
// Oval version >= 1.50 validation error for invalid data reports: "address is invalid".
|
||||
assertValue(fieldErrors, "address", Arrays.asList("address is invalid"));
|
||||
// Oval version >= 1.50 validation error for minimum length reports: "street cannot be shorter than 7 characters".
|
||||
assertValue(fieldErrors, "address.street", Arrays.asList("street cannot be shorter than 7 characters"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -300,7 +313,19 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
assertEquals(5, fieldErrors.size()); // 5: as there will be field errors for 'person' and 'person.address' themselves
|
||||
assertValue(fieldErrors, "person.name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "person.email", Arrays.asList("email cannot be null"));
|
||||
assertValue(fieldErrors, "person.address.street", Arrays.asList("street cannot be smaller than 7 characters"));
|
||||
try {
|
||||
// Oval version <= 1.40 validation error for invalid data reports: "net.sf.oval.constraint.AssertValid.violated".
|
||||
assertValue(fieldErrors, "person.address", Arrays.asList("net.sf.oval.constraint.AssertValid.violated"));
|
||||
// Oval version <= 1.40 validation error for minimum length reports: "street cannot be smaller than 7 characters".
|
||||
assertValue(fieldErrors, "person.address.street", Arrays.asList("street cannot be smaller than 7 characters"));
|
||||
}
|
||||
catch (AssertionFailedError afe) {
|
||||
// Oval version >= 1.50 validation error for invalid data reports: "address is invalid".
|
||||
assertValue(fieldErrors, "person.address", Arrays.asList("address is invalid"));
|
||||
// Oval version >= 1.50 validation error for minimum length reports: "street cannot be shorter than 7 characters".
|
||||
assertValue(fieldErrors, "person.address.street", Arrays.asList("street cannot be shorter than 7 characters"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-pell-multipart-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-plexus-plugin</artifactId>
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-parent</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-portlet-tiles-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-portlet-plugin</artifactId>
|
||||
|
||||
+1
@@ -261,6 +261,7 @@ public class Jsr168DispatcherTest extends MockObjectTestCase {
|
||||
Map<String, String> initParams = new HashMap<String, String>();
|
||||
initParams.put("viewNamespace", "/view");
|
||||
initParams.put("editNamespace", "/edit");
|
||||
initParams.put(StrutsConstants.STRUTS_ALWAYS_SELECT_FULL_NAMESPACE, "true");
|
||||
|
||||
initPortletConfig(initParams, new HashMap<String, Object>());
|
||||
initRequest(requestParams, new HashMap<String, Object>(), sessionMap, mode, WindowState.NORMAL, false, null);
|
||||
|
||||
+1
@@ -142,6 +142,7 @@ public class Jsr286DispatcherTest extends MockObjectTestCase {
|
||||
Map<String, String> initParams = new HashMap<String, String>();
|
||||
initParams.put("viewNamespace", "/view");
|
||||
initParams.put("editNamespace", "/edit");
|
||||
initParams.put(StrutsConstants.STRUTS_ALWAYS_SELECT_FULL_NAMESPACE, "true");
|
||||
|
||||
initPortletConfig(initParams, new HashMap<String, Object>());
|
||||
initRequest(requestParams, new HashMap<String, Object>(), sessionMap,
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-rest-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-sitegraph-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-sitemesh-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-spring-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-testng-plugin</artifactId>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<parent>
|
||||
<groupId>org.apache.struts</groupId>
|
||||
<artifactId>struts2-plugins</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>struts2-tiles-plugin</artifactId>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>struts2-parent</artifactId>
|
||||
<version>2.5.18</version>
|
||||
<version>2.5.20</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Struts 2</name>
|
||||
<url>http://struts.apache.org/</url>
|
||||
@@ -51,7 +51,7 @@
|
||||
<connection>scm:git:https://gitbox.apache.org/repos/asf/struts.git</connection>
|
||||
<developerConnection>scm:git:https://gitbox.apache.org/repos/asf/struts.git</developerConnection>
|
||||
<url>https://github.com/apache/struts/</url>
|
||||
<tag>STRUTS_2_5_18</tag>
|
||||
<tag>STRUTS_2_5_20</tag>
|
||||
</scm>
|
||||
|
||||
<issueManagement>
|
||||
@@ -97,19 +97,20 @@
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
<spring.platformVersion>4.3.13.RELEASE</spring.platformVersion>
|
||||
<ognl.version>3.1.15</ognl.version>
|
||||
<spring.platformVersion>4.3.20.RELEASE</spring.platformVersion>
|
||||
<ognl.version>3.1.21</ognl.version>
|
||||
<asm.version>5.2</asm.version>
|
||||
<tiles.version>3.0.7</tiles.version>
|
||||
<tiles-request.version>1.0.6</tiles-request.version>
|
||||
<log4j2.version>2.10.0</log4j2.version>
|
||||
<jackson.version>2.9.5</jackson.version>
|
||||
<tiles.version>3.0.8</tiles.version>
|
||||
<tiles-request.version>1.0.7</tiles-request.version>
|
||||
<log4j2.version>2.11.1</log4j2.version>
|
||||
<jackson.version>2.9.7</jackson.version>
|
||||
|
||||
<!-- Site generation -->
|
||||
<fluido-skin.version>1.6</fluido-skin.version>
|
||||
<fluido-skin.version>1.7</fluido-skin.version>
|
||||
|
||||
<!-- Sonar -->
|
||||
<sonar.host.url>https://builds.apache.org/analysis/</sonar.host.url>
|
||||
<maven-surefire-plugin.version>2.22.1</maven-surefire-plugin.version>
|
||||
</properties>
|
||||
|
||||
<profiles>
|
||||
@@ -146,7 +147,7 @@
|
||||
<profile>
|
||||
<id>jdk8</id>
|
||||
<activation>
|
||||
<jdk>1.8</jdk>
|
||||
<jdk>[1.8,)</jdk>
|
||||
</activation>
|
||||
<build>
|
||||
<pluginManagement>
|
||||
@@ -165,10 +166,11 @@
|
||||
<profile>
|
||||
<id>jdk9</id>
|
||||
<activation>
|
||||
<jdk>9</jdk>
|
||||
<jdk>[9,)</jdk>
|
||||
</activation>
|
||||
<properties>
|
||||
<!-- coverall version 4.3.0 does not work with java 9, see https://github.com/trautonen/coveralls-maven-plugin/issues/112 -->
|
||||
<!-- TODO delete coveralls.skip property after fix of https://github.com/cobertura/cobertura/issues/271 -->
|
||||
<coveralls.skip>true</coveralls.skip>
|
||||
</properties>
|
||||
<build>
|
||||
@@ -178,7 +180,8 @@
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<argLine>--add-modules java.activation --add-modules java.xml.bind</argLine>
|
||||
<!-- TODO delete forkCount=0 after fix of https://issues.apache.org/jira/browse/SUREFIRE-1588 -->
|
||||
<forkCount>0</forkCount>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
@@ -233,7 +236,14 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.20.1</version>
|
||||
<version>${maven-surefire-plugin.version}</version>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.surefire</groupId>
|
||||
<artifactId>surefire-junit47</artifactId>
|
||||
<version>${maven-surefire-plugin.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<configuration>
|
||||
<argLine>-Duser.language=en -Duser.region=US</argLine>
|
||||
<includes>
|
||||
@@ -242,6 +252,12 @@
|
||||
<excludes>
|
||||
<exclude>**/TestBean.java</exclude>
|
||||
</excludes>
|
||||
<properties>
|
||||
<property>
|
||||
<name>junit</name>
|
||||
<value>false</value>
|
||||
</property>
|
||||
</properties>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
@@ -312,7 +328,7 @@
|
||||
<plugin>
|
||||
<groupId>org.owasp</groupId>
|
||||
<artifactId>dependency-check-maven</artifactId>
|
||||
<version>3.1.1</version>
|
||||
<version>3.3.4</version>
|
||||
<configuration>
|
||||
<suppressionFiles>
|
||||
<suppressionFile>src/etc/project-suppression.xml</suppressionFile>
|
||||
@@ -373,12 +389,12 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.doxia</groupId>
|
||||
<artifactId>doxia-core</artifactId>
|
||||
<version>1.7</version>
|
||||
<version>1.8</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.doxia</groupId>
|
||||
<artifactId>doxia-module-markdown</artifactId>
|
||||
<version>1.3</version>
|
||||
<version>1.7</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
@@ -445,7 +461,7 @@
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>versions-maven-plugin</artifactId>
|
||||
<version>2.5</version>
|
||||
<version>2.7</version>
|
||||
<reportSets>
|
||||
<reportSet>
|
||||
<reports>
|
||||
@@ -607,13 +623,13 @@
|
||||
<dependency>
|
||||
<groupId>org.freemarker</groupId>
|
||||
<artifactId>freemarker</artifactId>
|
||||
<version>2.3.26-incubating</version>
|
||||
<version>2.3.28</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.felix</groupId>
|
||||
<artifactId>org.apache.felix.main</artifactId>
|
||||
<version>4.0.3</version>
|
||||
<version>4.6.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.felix</groupId>
|
||||
@@ -690,12 +706,13 @@
|
||||
<groupId>cglib</groupId>
|
||||
<artifactId>cglib-nodep</artifactId>
|
||||
<version>2.1_3</version>
|
||||
<!-- Recommended version for jmock-cglib 1.2.0 -->
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.easymock</groupId>
|
||||
<artifactId>easymock</artifactId>
|
||||
<version>3.4</version>
|
||||
<version>3.5.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
@@ -709,7 +726,7 @@
|
||||
<dependency>
|
||||
<groupId>org.glassfish</groupId>
|
||||
<artifactId>javax.el</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<version>3.0.1-b10</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -729,7 +746,7 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat</groupId>
|
||||
<artifactId>jasper</artifactId>
|
||||
<version>6.0.18</version>
|
||||
<version>6.0.53</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@@ -813,19 +830,19 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat</groupId>
|
||||
<artifactId>juli</artifactId>
|
||||
<version>6.0.18</version>
|
||||
<version>6.0.53</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Commons -->
|
||||
<dependency>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<version>1.1.3</version>
|
||||
<version>1.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-collections4</artifactId>
|
||||
<version>4.1</version>
|
||||
<version>4.2</version>
|
||||
</dependency>
|
||||
<!-- it's a dependency of Velocity defined here to override the transitive one -->
|
||||
<dependency>
|
||||
@@ -836,17 +853,17 @@
|
||||
<dependency>
|
||||
<groupId>commons-fileupload</groupId>
|
||||
<artifactId>commons-fileupload</artifactId>
|
||||
<version>1.3.3</version>
|
||||
<version>1.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.5</version>
|
||||
<version>2.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.6</version>
|
||||
<version>3.8.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-digester</groupId>
|
||||
@@ -867,12 +884,12 @@
|
||||
<dependency>
|
||||
<groupId>commons-beanutils</groupId>
|
||||
<artifactId>commons-beanutils</artifactId>
|
||||
<version>1.9.2</version>
|
||||
<version>1.9.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-validator</groupId>
|
||||
<artifactId>commons-validator</artifactId>
|
||||
<version>1.5.1</version>
|
||||
<version>1.6</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Mocks for unit testing (by Spring) -->
|
||||
@@ -970,7 +987,7 @@
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-all</artifactId>
|
||||
<version>1.9.5</version>
|
||||
<version>1.10.19</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
@@ -984,12 +1001,12 @@
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>1.7.12</version>
|
||||
<version>1.7.25</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
<version>1.7.12</version>
|
||||
<version>1.7.25</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -1009,13 +1026,13 @@
|
||||
<dependency>
|
||||
<groupId>net.sf.oval</groupId>
|
||||
<artifactId>oval</artifactId>
|
||||
<version>1.31</version>
|
||||
<version>1.90</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.thoughtworks.xstream</groupId>
|
||||
<artifactId>xstream</artifactId>
|
||||
<version>1.4.10</version>
|
||||
<version>1.4.11.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -1027,12 +1044,12 @@
|
||||
<dependency>
|
||||
<groupId>org.mortbay.jetty</groupId>
|
||||
<artifactId>jetty</artifactId>
|
||||
<version>6.1.9</version>
|
||||
<version>6.1.26</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mortbay.jetty</groupId>
|
||||
<artifactId>jsp-2.1</artifactId>
|
||||
<version>6.1.9</version>
|
||||
<version>6.1.26</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Portlet -->
|
||||
@@ -1075,13 +1092,13 @@
|
||||
<dependency>
|
||||
<groupId>javax.enterprise</groupId>
|
||||
<artifactId>cdi-api</artifactId>
|
||||
<version>1.0-SP1</version>
|
||||
<version>1.0-SP4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jboss.weld</groupId>
|
||||
<artifactId>weld-core</artifactId>
|
||||
<version>1.0.1-Final</version>
|
||||
<version>1.0.1-SP4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -1093,7 +1110,7 @@
|
||||
<dependency>
|
||||
<groupId>xerces</groupId>
|
||||
<artifactId>xercesImpl</artifactId>
|
||||
<version>2.10.0</version>
|
||||
<version>2.12.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user