Merge branch 'master' into WW-4717

This commit is contained in:
Lukasz Lenart
2016-11-23 15:15:15 +01:00
25 changed files with 143 additions and 66 deletions
+1
View File
@@ -31,6 +31,7 @@
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<excludes>
+1
View File
@@ -31,6 +31,7 @@
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<excludes>
+1 -4
View File
@@ -31,7 +31,7 @@
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>true</useProjectArtifact>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveDependencies>true</useTransitiveDependencies>
<outputDirectory>lib</outputDirectory>
<includes>
@@ -40,9 +40,6 @@
<include>org.apache.commons:commons-lang3</include>
<include>org.apache.logging.log4j:log4j-api</include>
<include>ognl:ognl</include>
<include>org.ow2.asm:asm</include>
<include>org.ow2.asm:asm-tree</include>
<include>org.ow2.asm:asm-commons</include>
<include>org.javassist:javassist</include>
<include>commons-fileupload:commons-fileupload</include>
<include>commons-io:commons-io</include>
-8
View File
@@ -266,14 +266,6 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
@@ -112,7 +112,7 @@ public class ParameterFilterInterceptor extends AbstractInterceptor {
Map<String, Boolean> includesExcludesMap = getIncludesExcludesMap();
for (String param : parameters.getNames()) {
for (String param : parameters.keySet()) {
boolean currentAllowed = !isDefaultBlock();
for (String currRule : includesExcludesMap.keySet()) {
@@ -168,7 +168,7 @@ public class ParametersInterceptor extends MethodFilterInterceptor {
acceptableParameters = new TreeMap<>();
}
for (String name : params.getNames()) {
for (String name : params.keySet()) {
Parameter parameter = params.get(name);
if (isAcceptableParameter(name, action)) {
acceptableParameters.put(name, parameter);
@@ -262,7 +262,7 @@ public class ParametersInterceptor extends MethodFilterInterceptor {
}
StringBuilder logEntry = new StringBuilder();
for (String name : parameters.getNames()) {
for (String name : parameters.keySet()) {
logEntry.append(String.valueOf(name));
logEntry.append(" => ");
logEntry.append(parameters.get(name).getValue());
@@ -54,7 +54,7 @@ public class AnnotationParameterFilterInterceptor extends AbstractInterceptor {
AnnotationUtils.addAllFields(Allowed.class, model.getClass(), annotatedFields);
}
for (String paramName : parameters.getNames()) {
for (String paramName : parameters.keySet()) {
boolean allowed = false;
for (Field field : annotatedFields) {
@@ -76,7 +76,7 @@ public class AnnotationParameterFilterInterceptor extends AbstractInterceptor {
AnnotationUtils.addAllFields(Blocked.class, model.getClass(), annotatedFields);
}
for (String paramName : parameters.getNames()) {
for (String paramName : parameters.keySet()) {
for (Field field : annotatedFields) {
//TODO only matches exact field names. need to change to it matches start of ognl expression
//i.e take param name up to first . (period) and match against that
@@ -1,7 +1,28 @@
/*
* 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.
*/
package org.apache.struts2.dispatcher;
import org.apache.struts2.interceptor.ParameterAware;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
@@ -10,7 +31,8 @@ import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
public class HttpParameters implements Cloneable {
@SuppressWarnings("unchecked")
public class HttpParameters implements Map<String, Parameter>, Cloneable {
private Map<String, Parameter> parameters;
@@ -26,18 +48,6 @@ public class HttpParameters implements Cloneable {
return new Builder(new HashMap<String, Object>());
}
public Parameter get(String name) {
if (parameters.containsKey(name)) {
return parameters.get(name);
} else {
return new Parameter.Empty(name);
}
}
public Set<String> getNames() {
return new TreeSet<>(parameters.keySet());
}
public HttpParameters remove(Set<String> paramsToRemove) {
for (String paramName : paramsToRemove) {
parameters.remove(paramName);
@@ -78,6 +88,70 @@ public class HttpParameters implements Cloneable {
parameterAware.setParameters(toMap());
}
@Override
public int size() {
return parameters.size();
}
@Override
public boolean isEmpty() {
return parameters.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return parameters.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return parameters.containsValue(value);
}
@Override
public Parameter get(Object key) {
if (parameters.containsKey(key)) {
return parameters.get(key);
} else {
return new Parameter.Empty(String.valueOf(key));
}
}
@Override
public Parameter put(String key, Parameter value) {
throw new IllegalAccessError("HttpParameters are immutable, you cannot put value directly!");
}
@Override
public Parameter remove(Object key) {
throw new IllegalAccessError("HttpParameters are immutable, you cannot remove object directly!");
}
@Override
public void putAll(Map<? extends String, ? extends Parameter> m) {
throw new IllegalAccessError("HttpParameters are immutable, you cannot put values directly!");
}
@Override
public void clear() {
throw new IllegalAccessError("HttpParameters are immutable, you cannot clear values directly!");
}
@Override
public Set<String> keySet() {
return Collections.unmodifiableSet(new TreeSet<>(parameters.keySet()));
}
@Override
public Collection<Parameter> values() {
return Collections.unmodifiableCollection(parameters.values());
}
@Override
public Set<Entry<String, Parameter>> entrySet() {
return Collections.unmodifiableSet(parameters.entrySet());
}
public static class Builder {
private Map<String, Object> requestParameterMap;
private HttpParameters parent;
@@ -63,7 +63,7 @@ public class CheckboxInterceptor extends AbstractInterceptor {
HttpParameters parameters = ai.getInvocationContext().getParameters();
Map<String, Parameter> extraParams = new HashMap<>();
for (String name : parameters.getNames()) {
for (String name : parameters.keySet()) {
if (name.startsWith("__checkbox_")) {
String checkboxName = name.substring("__checkbox_".length());
@@ -70,7 +70,7 @@ public class DateTextFieldInterceptor implements Interceptor {
DateWord[] dateWords = DateWord.getAll();
// Get all the values of date type
Set<String> names = parameters.getNames();
Set<String> names = parameters.keySet();
for (String name : names) {
for (DateWord dateWord : dateWords) {
@@ -50,7 +50,7 @@ public class MultiselectInterceptor extends AbstractInterceptor {
HttpParameters parameters = ai.getInvocationContext().getParameters();
Map<String, Parameter> newParams = new HashMap<>();
for (String name : parameters.getNames()) {
for (String name : parameters.keySet()) {
if (name.startsWith("__multiselect_")) {
String key = name.substring("__multiselect_".length());
@@ -90,7 +90,7 @@ public class ActionContextTest extends XWorkTestCase {
public void testParameters() {
context.setParameters(HttpParameters.create().build());
assertEquals(0, context.getParameters().getNames().size());
assertEquals(0, context.getParameters().keySet().size());
}
public void testConversionErrors() {
@@ -116,7 +116,7 @@ public class ParameterFilterInterceptorTest extends XWorkTestCase {
}
private Collection getParameterNames() {
return ((HttpParameters)contextMap.get(ActionContext.PARAMETERS)).getNames();
return ((HttpParameters)contextMap.get(ActionContext.PARAMETERS)).keySet();
}
public void runAction() throws Exception {
@@ -50,7 +50,7 @@ public class ParameterRemoverInterceptorTest extends TestCase {
interceptor.intercept(actionInvocation);
HttpParameters params = (HttpParameters) contextMap.get(ActionContext.PARAMETERS);
assertEquals(params.getNames().size(), 2);
assertEquals(params.keySet().size(), 2);
assertTrue(params.contains("param3"));
assertTrue(params.contains("param"));
assertEquals(params.get("param3").getValue(), "paramValue3");
@@ -76,7 +76,7 @@ public class ParameterRemoverInterceptorTest extends TestCase {
interceptor.intercept(actionInvocation);
HttpParameters params = (HttpParameters) contextMap.get(ActionContext.PARAMETERS);
assertEquals(params.getNames().size(), 0);
assertEquals(params.keySet().size(), 0);
verify(actionInvocation);
}
@@ -98,7 +98,7 @@ public class ParameterRemoverInterceptorTest extends TestCase {
interceptor.intercept(actionInvocation);
HttpParameters params = (HttpParameters) contextMap.get(ActionContext.PARAMETERS);
assertEquals(params.getNames().size(), 2);
assertEquals(params.keySet().size(), 2);
assertTrue(params.contains("param1"));
assertTrue(params.contains("param2"));
assertEquals(params.get("param1").getValue(), "paramValueOne");
@@ -133,7 +133,7 @@ public class StaticParametersInterceptorTest extends XWorkTestCase {
assertEquals(before, ActionContext.getContext().getValueStack().size());
assertEquals("${top.hero}", user.getName());
assertEquals(0, ActionContext.getContext().getParameters().getNames().size());
assertEquals(0, ActionContext.getContext().getParameters().keySet().size());
}
public void testFewParametersParse() throws Exception {
@@ -59,7 +59,7 @@ public class AnnotationParameterFilterInterceptorTest extends TestCase {
interceptor.intercept(invocation);
HttpParameters parameters = invocation.getInvocationContext().getParameters();
assertEquals("Parameter map should contain one entry", 1, parameters.getNames().size());
assertEquals("Parameter map should contain one entry", 1, parameters.keySet().size());
assertFalse(parameters.get("job").isDefined());
assertTrue(parameters.get("name").isDefined());
@@ -97,7 +97,7 @@ public class AnnotationParameterFilterInterceptorTest extends TestCase {
interceptor.intercept(invocation);
HttpParameters parameters = invocation.getInvocationContext().getParameters();
assertEquals("Paramwter map should contain one entry", 1, parameters.getNames().size());
assertEquals("Paramwter map should contain one entry", 1, parameters.keySet().size());
assertTrue(parameters.get("job").isDefined());
assertFalse(parameters.get("name").isDefined());
@@ -135,7 +135,7 @@ public class AnnotationParameterFilterInterceptorTest extends TestCase {
interceptor.intercept(invocation);
HttpParameters parameters = invocation.getInvocationContext().getParameters();
assertEquals("Parameter map should contain two entries", 2, parameters.getNames().size());
assertEquals("Parameter map should contain two entries", 2, parameters.keySet().size());
assertFalse(parameters.get("job").isDefined());
assertTrue(parameters.get("name").isDefined());
assertTrue(parameters.get("m1").isDefined());
@@ -175,7 +175,7 @@ public class AnnotationParameterFilterInterceptorTest extends TestCase {
interceptor.intercept(invocation);
HttpParameters parameters = invocation.getInvocationContext().getParameters();
assertEquals("Parameter map should contain two entries", 2, parameters.getNames().size());
assertEquals("Parameter map should contain two entries", 2, parameters.keySet().size());
assertTrue(parameters.get("job").isDefined());
assertFalse(parameters.get("name").isDefined());
assertFalse(parameters.get("m1").isDefined());
@@ -47,7 +47,7 @@ public class ActionComponentTest extends StrutsInternalTestCase {
comp.addParameter("baz", new String[]{"jim", "sarah"});
HttpParameters params = comp.createParametersForContext();
assertNotNull(params);
assertEquals(2, params.getNames().size());
assertEquals(2, params.keySet().size());
assertEquals("bar", params.get("foo").getValue());
assertEquals(2, params.get("baz").getMultipleValues().length);
mockValueStack.verify();
@@ -72,7 +72,7 @@ public class CheckboxInterceptorTest extends StrutsInternalTestCase {
interceptor.intercept(ai);
interceptor.destroy();
assertEquals(1, ai.getInvocationContext().getParameters().getNames().size());
assertEquals(1, ai.getInvocationContext().getParameters().keySet().size());
}
public void testPassthroughTwo() throws Exception {
@@ -85,7 +85,7 @@ public class CheckboxInterceptorTest extends StrutsInternalTestCase {
interceptor.intercept(ai);
interceptor.destroy();
assertEquals(2, ai.getInvocationContext().getParameters().getNames().size());
assertEquals(2, ai.getInvocationContext().getParameters().keySet().size());
}
public void testOneCheckboxTrue() throws Exception {
@@ -103,7 +103,7 @@ public class CheckboxInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__checkbox_superpower"));
assertEquals(3, parameters.getNames().size()); // should be 3 as __checkbox_ should be removed
assertEquals(3, parameters.keySet().size()); // should be 3 as __checkbox_ should be removed
assertEquals("true", parameters.get("superpower").getValue());
}
@@ -121,7 +121,7 @@ public class CheckboxInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__checkbox_superpower"));
assertEquals(3, parameters.getNames().size()); // should be 3 as __checkbox_ should be removed
assertEquals(3, parameters.keySet().size()); // should be 3 as __checkbox_ should be removed
assertEquals("false", parameters.get("superpower").getValue());
}
@@ -140,7 +140,7 @@ public class CheckboxInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__checkbox_superpower"));
assertEquals(3, parameters.getNames().size()); // should be 3 as __checkbox_ should be removed
assertEquals(3, parameters.keySet().size()); // should be 3 as __checkbox_ should be removed
assertEquals("off", parameters.get("superpower").getValue());
}
@@ -157,7 +157,7 @@ public class CheckboxInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__checkbox_superpower"));
assertEquals(2, parameters.getNames().size()); // should be 2 as __checkbox_ should be removed
assertEquals(2, parameters.keySet().size()); // should be 2 as __checkbox_ should be removed
assertFalse(parameters.get("superpower").isDefined());
}
@@ -179,7 +179,7 @@ public class CheckboxInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__checkbox_superpower"));
assertFalse(parameters.contains("__checkbox_cool"));
assertEquals(4, parameters.getNames().size()); // should be 4 as __checkbox_ should be removed
assertEquals(4, parameters.keySet().size()); // should be 4 as __checkbox_ should be removed
assertEquals("yes", parameters.get("superpower").getValue());
assertEquals("false", parameters.get("cool").getValue()); // will use false as default and not 'no'
}
@@ -203,7 +203,7 @@ public class CheckboxInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__checkbox_superpower"));
assertFalse(parameters.contains("__checkbox_cool"));
assertEquals(4, parameters.getNames().size()); // should be 4 as __checkbox_ should be removed
assertEquals(4, parameters.keySet().size()); // should be 4 as __checkbox_ should be removed
assertEquals("yes", parameters.get("superpower").getValue());
assertEquals("no", parameters.get("cool").getValue());
}
@@ -36,7 +36,7 @@ public class DateTextFieldInterceptorTest extends StrutsInternalTestCase {
interceptor.intercept(ai);
interceptor.destroy();
assertEquals(0, ai.getInvocationContext().getParameters().getNames().size());
assertEquals(0, ai.getInvocationContext().getParameters().keySet().size());
}
public void testOneDateTextField() throws Exception {
@@ -55,7 +55,7 @@ public class DateTextFieldInterceptorTest extends StrutsInternalTestCase {
assertFalse(parameters.contains("__month_name"));
assertFalse(parameters.contains("__day_name"));
assertTrue(parameters.contains("name"));
assertEquals(1, parameters.getNames().size());
assertEquals(1, parameters.keySet().size());
Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2000-06-15");
assertEquals(date, parameters.get("name").getObject());
}
@@ -296,7 +296,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
assertTrue(!action.hasErrors());
HttpParameters parameters = mai.getInvocationContext().getParameters();
assertTrue(parameters.getNames().size() == 3);
assertTrue(parameters.keySet().size() == 3);
UploadedFile[] files = (UploadedFile[]) parameters.get("file").getObject();
String[] fileContentTypes = parameters.get("fileContentType").getMultipleValues();
String[] fileRealFilenames = parameters.get("fileFileName").getMultipleValues();
@@ -356,7 +356,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
interceptor.intercept(mai);
HttpParameters parameters = mai.getInvocationContext().getParameters();
assertEquals(3, parameters.getNames().size());
assertEquals(3, parameters.keySet().size());
UploadedFile[] files = (UploadedFile[]) parameters.get("file").getObject();
String[] fileContentTypes = parameters.get("fileContentType").getMultipleValues();
String[] fileRealFilenames = parameters.get("fileFileName").getMultipleValues();
@@ -93,7 +93,7 @@ public class MultiselectInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__multiselect_superpower"));
assertEquals(3, parameters.getNames().size()); // should be 3 as __multiselect_ should be removed
assertEquals(3, parameters.keySet().size()); // should be 3 as __multiselect_ should be removed
assertEquals("robin", parameters.get("superpower").getValue());
}
@@ -111,7 +111,7 @@ public class MultiselectInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__multiselect_superpower"));
assertEquals(3, parameters.getNames().size()); // should be 3 as __multiselect_ should be removed
assertEquals(3, parameters.keySet().size()); // should be 3 as __multiselect_ should be removed
assertFalse(parameters.get("superpower").isDefined());
}
@@ -133,7 +133,7 @@ public class MultiselectInterceptorTest extends StrutsInternalTestCase {
HttpParameters parameters = ai.getInvocationContext().getParameters();
assertFalse(parameters.contains("__multiselect_superpower"));
assertFalse(parameters.contains("__multiselect_cool"));
assertEquals(4, parameters.getNames().size()); // should be 4 as __multiselect_ should be removed
assertEquals(4, parameters.keySet().size()); // should be 4 as __multiselect_ should be removed
assertEquals("yes", parameters.get("superpower").getValue());
assertFalse(parameters.get("cool").isDefined());
}
@@ -227,7 +227,7 @@ public class ActionTagTest extends AbstractTagTest {
// check parameters, there should be one
ActionInvocation ai = component.getProxy().getInvocation();
ActionContext ac = ai.getInvocationContext();
assertEquals(1, ac.getParameters().getNames().size());
assertEquals(1, ac.getParameters().keySet().size());
}
public void testIngoreContextParamsTrue() throws Exception {
@@ -252,7 +252,7 @@ public class ActionTagTest extends AbstractTagTest {
// check parameters, there should be one
ActionInvocation ai = component.getProxy().getInvocation();
ActionContext ac = ai.getInvocationContext();
assertEquals(0, ac.getParameters().getNames().size());
assertEquals(0, ac.getParameters().keySet().size());
}
public void testNoNameDefined() throws Exception {
+10
View File
@@ -32,6 +32,16 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-commons</artifactId>
</dependency>
<!-- testing -->
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
@@ -13,12 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.opensymphony.xwork2.util.finder;
package org.apache.struts2.convention;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.FileManager;
import com.opensymphony.xwork2.FileManagerFactory;
import com.opensymphony.xwork2.XWorkException;
import com.opensymphony.xwork2.util.finder.ClassFinder;
import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
import com.opensymphony.xwork2.util.finder.Test;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+3 -4
View File
@@ -85,8 +85,7 @@
<currentVersion>${project.version}</currentVersion>
<struts2.springPlatformVersion>4.1.6.RELEASE</struts2.springPlatformVersion>
<ognl.version>3.1.12</ognl.version>
<asm.version>3.3</asm.version>
<asm5.version>5.1</asm5.version>
<asm.version>5.1</asm.version>
<tiles.version>3.0.7</tiles.version>
<tiles-request.version>1.0.6</tiles-request.version>
<log4j2.version>2.7</log4j2.version>
@@ -547,12 +546,12 @@
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>${asm5.version}</version>
<version>${asm.version}</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-commons</artifactId>
<version>${asm5.version}</version>
<version>${asm.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>