[
https://issues.apache.org/jira/browse/WW-4930?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16688190#comment-16688190
]
ASF GitHub Bot commented on WW-4930:
------------------------------------
lukaszlenart closed pull request #267: WW-4930 Add constant to enable smi
inheritance
URL: https://github.com/apache/struts/pull/267
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java
b/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java
index 46ec9d46c..d63c3c275 100644
---
a/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java
+++
b/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionConstants.java
@@ -49,4 +49,6 @@
public static final String CONVENTION_ACTION_MAP_ALL_MATCHES =
"struts.convention.action.mapAllMatches";
public static final String CONVENTION_ACTION_EAGER_LOADING =
"struts.convention.action.eagerLoading";
public static final String CONVENTION_RESULT_FLAT_LAYOUT =
"struts.convention.result.flatLayout";
+ /** Enables the inheritance of the SMI value from a parent package config
to its children */
+ public static final String CONVENTION_ENABLE_SMI_INHERITANCE =
"struts.convention.enable.smi.inheritance";
}
diff --git
a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
index bc586d4ac..764e72945 100644
---
a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
+++
b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
@@ -84,6 +84,7 @@
private boolean alwaysMapExecute;
private boolean excludeParentClassLoader;
private boolean slashesInActionNames;
+ private boolean enableSmiInheritance;
private static final String DEFAULT_METHOD = "execute";
private boolean eagerLoading = false;
@@ -102,12 +103,14 @@
* action for indexes. If this is set to
true, index actions are not created because
* the unknown handler will redirect from
/foo to /foo/. The only action that is created
* is to the empty action in the namespace
(e.g. the namespace /foo and the action "").
+ * @param enableSmiInheritance A boolean parameter which determines if a
newly created package config inherits the SMI value of its parent package config
* @param defaultParentPackage The default parent package for all the
configuration.
*/
@Inject
public PackageBasedActionConfigBuilder(Configuration configuration,
Container container, ObjectFactory objectFactory,
@Inject(ConventionConstants.CONVENTION_REDIRECT_TO_SLASH) String
redirectToSlash,
-
@Inject(ConventionConstants.CONVENTION_DEFAULT_PARENT_PACKAGE) String
defaultParentPackage) {
+
@Inject(ConventionConstants.CONVENTION_DEFAULT_PARENT_PACKAGE) String
defaultParentPackage,
+
@Inject(ConventionConstants.CONVENTION_ENABLE_SMI_INHERITANCE) String
enableSmiInheritance) {
// Validate that the parameters are okay
this.configuration = configuration;
@@ -116,6 +119,7 @@ public PackageBasedActionConfigBuilder(Configuration
configuration, Container co
this.interceptorMapBuilder =
container.getInstance(InterceptorMapBuilder.class,
container.getInstance(String.class,
ConventionConstants.CONVENTION_INTERCEPTOR_MAP_BUILDER));
this.objectFactory = objectFactory;
this.redirectToSlash = Boolean.parseBoolean(redirectToSlash);
+ this.enableSmiInheritance = Boolean.parseBoolean(enableSmiInheritance);
if (LOG.isTraceEnabled()) {
LOG.trace("Setting action default parent package to [{}]",
defaultParentPackage);
@@ -1042,6 +1046,9 @@ protected void createActionConfig(PackageConfig.Builder
pkgCfg, Class<?> actionC
PackageConfig.Builder pkgConfig = packageConfigs.get(name);
if (pkgConfig == null) {
pkgConfig = new
PackageConfig.Builder(name).namespace(actionNamespace).addParent(parentPkg);
+ if (enableSmiInheritance) {
+
pkgConfig.strictMethodInvocation(parentPkg.isStrictMethodInvocation());
+ }
packageConfigs.put(name, pkgConfig);
//check for @DefaultInterceptorRef in the package
diff --git
a/plugins/convention/src/main/java/org/apache/struts2/convention/config/entities/ConventionConstantConfig.java
b/plugins/convention/src/main/java/org/apache/struts2/convention/config/entities/ConventionConstantConfig.java
index 50bca2c88..f66e7710f 100644
---
a/plugins/convention/src/main/java/org/apache/struts2/convention/config/entities/ConventionConstantConfig.java
+++
b/plugins/convention/src/main/java/org/apache/struts2/convention/config/entities/ConventionConstantConfig.java
@@ -56,6 +56,7 @@
private Boolean conventionActionMapAllMatches;
private Boolean conventionActionEagerLoading;
private Boolean conventionResultFlatLayout;
+ private Boolean conventionEnableSmiInheritance;
@Override
public Map<String, String> getAllAsStringsMap() {
@@ -88,6 +89,7 @@
map.put(ConventionConstants.CONVENTION_ACTION_MAP_ALL_MATCHES,
Objects.toString(conventionActionMapAllMatches, null));
map.put(ConventionConstants.CONVENTION_ACTION_EAGER_LOADING,
Objects.toString(conventionActionEagerLoading, null));
map.put(ConventionConstants.CONVENTION_RESULT_FLAT_LAYOUT,
Objects.toString(conventionResultFlatLayout, null));
+ map.put(ConventionConstants.CONVENTION_ENABLE_SMI_INHERITANCE,
Objects.toString(conventionEnableSmiInheritance, null));
return map;
}
@@ -327,4 +329,12 @@ public Boolean getConventionResultFlatLayout() {
public void setConventionResultFlatLayout(Boolean
conventionResultFlatLayout) {
this.conventionResultFlatLayout = conventionResultFlatLayout;
}
+
+ public Boolean getConventionEnableSmiInheritance() {
+ return conventionEnableSmiInheritance;
+ }
+
+ public void setConventionEnableSmiInheritance(Boolean
conventionEnableSmiInheritance) {
+ this.conventionEnableSmiInheritance = conventionEnableSmiInheritance;
+ }
}
diff --git a/plugins/convention/src/main/resources/struts-plugin.xml
b/plugins/convention/src/main/resources/struts-plugin.xml
index 5205f1813..fed289a74 100644
--- a/plugins/convention/src/main/resources/struts-plugin.xml
+++ b/plugins/convention/src/main/resources/struts-plugin.xml
@@ -66,6 +66,8 @@
<constant name="struts.convention.exclude.parentClassLoader" value="true" />
+ <constant name="struts.convention.enable.smi.inheritance" value="false" />
+
<package name="convention-default" extends="struts-default">
</package>
</struts>
diff --git
a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
index d9e60f63b..a19be9bed 100644
---
a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
+++
b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
@@ -32,6 +32,8 @@
import com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory;
import com.opensymphony.xwork2.util.reflection.ReflectionException;
import junit.framework.TestCase;
+
+import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.convention.actions.DefaultResultPathAction;
import org.apache.struts2.convention.actions.NoAnnotationAction;
import org.apache.struts2.convention.actions.Skip;
@@ -108,7 +110,18 @@ public void testJustExcludedPackages() throws
MalformedURLException {
run("org.apache.struts2.convention.actions", null,
"org.apache.struts2.convention.actions.exclude");
}
+ public void testSmiInheritanceEnabled() throws MalformedURLException {
+ run("org.apache.struts2.convention.actions", null, null, "true");
+ }
+
+ public void testSmiInheritanceDisabled() throws MalformedURLException {
+ run("org.apache.struts2.convention.actions", null, null, "false");
+ }
+
private void run(String actionPackages, String packageLocators, String
excludePackages) throws MalformedURLException {
+ run(actionPackages, packageLocators, excludePackages, "");
+ }
+ private void run(String actionPackages, String packageLocators, String
excludePackages, String enableSmiInheritance) throws MalformedURLException {
//setup interceptors
List<InterceptorConfig> defaultInterceptors = new ArrayList<>();
defaultInterceptors.add(makeInterceptorConfig("interceptor-1"));
@@ -121,6 +134,19 @@ private void run(String actionPackages, String
packageLocators, String excludePa
InterceptorMapping interceptor2 = new
InterceptorMapping("interceptor-2", new TestInterceptor());
defaultInterceptorStacks.add(makeInterceptorStackConfig("stack-1",
interceptor1, interceptor2));
+ //setup strict MethodInvocation
+ boolean strictMethodInvocation = true;
+ boolean isSmiInheritanceEnabled = false;
+ // Sets the SMI value to false so we can test that the created package
configs adopt the SMI value of their parent.
+ // If enableSmiInheritance is set to false it is expected that the
generated package configs have their SMI value set to true (the default)
+ // even when the SMI of their parent is set to false.
+ if (StringUtils.equals(enableSmiInheritance, "true")) {
+ strictMethodInvocation = false;
+ isSmiInheritanceEnabled = true;
+ } else if (StringUtils.equals(enableSmiInheritance, "false")) {
+ strictMethodInvocation = false;
+ }
+
//setup results
ResultTypeConfig[] defaultResults = new ResultTypeConfig[]{new
ResultTypeConfig.Builder("dispatcher",
ServletDispatcherResult.class.getName()).defaultResultParam("location").build(),
@@ -130,8 +156,7 @@ private void run(String actionPackages, String
packageLocators, String excludePa
Set<String> globalAllowedMethods =
TextParseUtil.commaDelimitedStringToSet("execute,browse,cancel,input");
PackageConfig strutsDefault = makePackageConfig("struts-default",
null, null, "dispatcher",
- defaultResults, defaultInterceptors, defaultInterceptorStacks,
globalAllowedMethods);
-
+ defaultResults, defaultInterceptors, defaultInterceptorStacks,
globalAllowedMethods, strictMethodInvocation);
PackageConfig packageLevelParentPkg =
makePackageConfig("package-level", null, null, null);
PackageConfig classLevelParentPkg = makePackageConfig("class-level",
null, null, null);
@@ -347,7 +372,7 @@ public Container getContainer() {
mockContainer.setResultMapBuilder(resultMapBuilder);
mockContainer.setConventionsService(new ConventionsServiceImpl(""));
- PackageBasedActionConfigBuilder builder = new
PackageBasedActionConfigBuilder(configuration, mockContainer ,of, "false",
"struts-default");
+ PackageBasedActionConfigBuilder builder = new
PackageBasedActionConfigBuilder(configuration, mockContainer , of, "false",
"struts-default", enableSmiInheritance);
builder.setFileProtocols("jar");
if (actionPackages != null) {
builder.setActionPackages(actionPackages);
@@ -369,6 +394,7 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.action */
PackageConfig pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.action#struts-default#/action");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(14, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action1", ActionNameAction.class,
"run1", pkgConfig.getName());
verifyActionConfig(pkgConfig, "action2", ActionNameAction.class,
"run2", pkgConfig.getName());
@@ -392,12 +418,14 @@ public Container getContainer() {
//action on namespace1 (action level)
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace3#struts-default#/namespaces1");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action-level-namespaces",
ActionLevelNamespacesAction.class, "execute", pkgConfig.getName());
//action on namespace2 (action level)
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace3#struts-default#/namespaces2");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action-level-namespaces",
ActionLevelNamespacesAction.class, "execute", pkgConfig.getName());
@@ -405,12 +433,14 @@ public Container getContainer() {
//action on namespace3 (action level)
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace4#struts-default#/namespaces3");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action-and-package-level-namespaces",
ActionAndPackageLevelNamespacesAction.class, "execute", pkgConfig.getName());
//action on namespace4 (package level)
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace4#struts-default#/namespaces4");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action-and-package-level-namespaces",
ActionAndPackageLevelNamespacesAction.class, "execute", pkgConfig.getName());
@@ -419,6 +449,7 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.params */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.params#struts-default#/params");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
ActionConfig ac = pkgConfig.getAllActionConfigs().get("actionParam1");
assertNotNull(ac);
@@ -431,6 +462,7 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.params */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.exception#struts-default#/exception");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(2, pkgConfig.getActionConfigs().size());
ac = pkgConfig.getAllActionConfigs().get("exception1");
@@ -468,6 +500,7 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.idx */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.idx#struts-default#/idx");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(3, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "",
org.apache.struts2.convention.actions.idx.Index.class, "execute",
pkgConfig.getName());
verifyActionConfig(pkgConfig, "index",
org.apache.struts2.convention.actions.idx.Index.class, "execute",
pkgConfig.getName());
@@ -477,11 +510,13 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.defaultinterceptor */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.defaultinterceptor#struts-default#/defaultinterceptor");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals("validationWorkflowStack",
pkgConfig.getDefaultInterceptorRef());
/* org.apache.struts2.convention.actions.idx.idx2 */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.idx.idx2#struts-default#/idx/idx2");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(2, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "",
org.apache.struts2.convention.actions.idx.idx2.Index.class, "execute",
pkgConfig.getName());
verifyActionConfig(pkgConfig, "index",
org.apache.struts2.convention.actions.idx.idx2.Index.class, "execute",
pkgConfig.getName());
@@ -489,24 +524,28 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.namespace action level */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace#struts-default#/action-level");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "action",
ActionLevelNamespaceAction.class, "execute", pkgConfig.getName());
/* org.apache.struts2.convention.actions.namespace class level */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace#struts-default#/class-level");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "class-level-namespace",
ClassLevelNamespaceAction.class, "execute", pkgConfig.getName());
/* org.apache.struts2.convention.actions.namespace package level */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace#struts-default#/package-level");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "package-level-namespace",
PackageLevelNamespaceAction.class, "execute", pkgConfig.getName());
/* org.apache.struts2.convention.actions.namespace2 */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.namespace2#struts-default#/namespace2");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "default-namespace",
DefaultNamespaceAction.class, "execute", pkgConfig.getName());
@@ -539,37 +578,52 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.allowedmethods class level */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.allowedmethods#struts-default#/allowedmethods");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(2, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "class-level-allowed-methods",
ClassLevelAllowedMethodsAction.class, "execute", pkgConfig.getName());
assertEquals("struts-default",
pkgConfig.getParents().get(0).getName());
ActionConfig actionConfig =
pkgConfig.getActionConfigs().get("class-level-allowed-methods");
- assertEquals(7, actionConfig.getAllowedMethods().size());
assertTrue(actionConfig.getAllowedMethods().contains("execute"));
- assertTrue(actionConfig.getAllowedMethods().contains("end"));
- assertTrue(actionConfig.getAllowedMethods().contains("input"));
- assertTrue(actionConfig.getAllowedMethods().contains("cancel"));
- assertTrue(actionConfig.getAllowedMethods().contains("start"));
- assertTrue(actionConfig.getAllowedMethods().contains("home"));
- assertTrue(actionConfig.getAllowedMethods().contains("browse"));
+ int allowedMethodsSize = actionConfig.getAllowedMethods().size();
+ if (!pkgConfig.isStrictMethodInvocation()) {
+ // With strict method invocation disabled the allowed methods are
"execute" and the wildcard "*"
+ assertEquals(2, allowedMethodsSize);
+ } else {
+ assertEquals(7, allowedMethodsSize);
+ assertTrue(actionConfig.getAllowedMethods().contains("end"));
+ assertTrue(actionConfig.getAllowedMethods().contains("input"));
+ assertTrue(actionConfig.getAllowedMethods().contains("cancel"));
+ assertTrue(actionConfig.getAllowedMethods().contains("start"));
+ assertTrue(actionConfig.getAllowedMethods().contains("home"));
+ assertTrue(actionConfig.getAllowedMethods().contains("browse"));
+ }
/* org.apache.struts2.convention.actions.allowedmethods.sub package
level */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.allowedmethods.sub#struts-default#/allowedmethods/sub");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(1, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "package-level-allowed-methods-child",
PackageLevelAllowedMethodsChildAction.class, "execute", pkgConfig.getName());
assertEquals("struts-default",
pkgConfig.getParents().get(0).getName());
actionConfig =
pkgConfig.getActionConfigs().get("package-level-allowed-methods-child");
- assertEquals(actionConfig.getAllowedMethods().size(), 6);
assertTrue(actionConfig.getAllowedMethods().contains("execute"));
- assertTrue(actionConfig.getAllowedMethods().contains("home"));
- assertTrue(actionConfig.getAllowedMethods().contains("start"));
- assertTrue(actionConfig.getAllowedMethods().contains("input"));
+ allowedMethodsSize = actionConfig.getAllowedMethods().size();
+ if (!pkgConfig.isStrictMethodInvocation()) {
+ // With strict method invocation disabled the allowed methods are
execute and the wildcard *
+ assertEquals(2, allowedMethodsSize);
+ } else {
+ assertEquals(6, allowedMethodsSize);
+ assertTrue(actionConfig.getAllowedMethods().contains("home"));
+ assertTrue(actionConfig.getAllowedMethods().contains("start"));
+ assertTrue(actionConfig.getAllowedMethods().contains("input"));
+ }
/* org.apache.struts2.convention.actions.result */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.result#struts-default#/result");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(7, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "class-level-result",
ClassLevelResultAction.class, "execute", pkgConfig.getName());
verifyActionConfig(pkgConfig, "class-level-results",
ClassLevelResultsAction.class, "execute", pkgConfig.getName());
@@ -580,6 +634,7 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.resultpath */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.resultpath#struts-default#/resultpath");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(2, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "class-level-result-path",
ClassLevelResultPathAction.class, "execute", pkgConfig.getName());
verifyActionConfig(pkgConfig, "package-level-result-path",
PackageLevelResultPathAction.class, "execute", pkgConfig.getName());
@@ -587,6 +642,7 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.interceptorRefs */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.interceptor#struts-default#/interceptor");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(9, pkgConfig.getActionConfigs().size());
verifyActionConfigInterceptors(pkgConfig, "action100",
"interceptor-1");
verifyActionConfigInterceptors(pkgConfig, "action200",
"interceptor-1", "interceptor-2");
@@ -605,6 +661,7 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions#struts-default#");
assertNotNull(pkgConfig);
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
assertEquals(4, pkgConfig.getActionConfigs().size());
verifyActionConfig(pkgConfig, "no-annotation",
NoAnnotationAction.class, "execute", pkgConfig.getName());
@@ -615,6 +672,7 @@ public Container getContainer() {
/* org.apache.struts2.convention.actions.transactions */
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.transactions#struts-default#/transactions");
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
verifyActionConfig(pkgConfig, "trans1", TransNameAction.class,
"trans1", pkgConfig.getName());
verifyActionConfig(pkgConfig, "trans2", TransNameAction.class,
"trans2", pkgConfig.getName());
@@ -628,6 +686,7 @@ public Container getContainer() {
//test unknown handler automatic chaining
pkgConfig =
configuration.getPackageConfig("org.apache.struts2.convention.actions.chain#struts-default#/chain");
+ checkSmiValue(pkgConfig, strutsDefault, isSmiInheritanceEnabled);
ServletContext context = EasyMock.createNiceMock(ServletContext.class);
EasyMock.replay(context);
@@ -672,6 +731,14 @@ private void verifyActionConfig(PackageConfig pkgConfig,
String actionName, Stri
assertEquals(packageName, ac.getPackageName());
}
+ private void checkSmiValue(PackageConfig pkgConfig, PackageConfig
parentConfig, boolean isSmiInheritanceEnabled) {
+ if (isSmiInheritanceEnabled) {
+ assertEquals(parentConfig.isStrictMethodInvocation(),
pkgConfig.isStrictMethodInvocation());
+ } else if (!isSmiInheritanceEnabled &&
!parentConfig.isStrictMethodInvocation()){
+ assertTrue(pkgConfig.isStrictMethodInvocation());
+ }
+ }
+
private void verifyActionConfigInterceptors(PackageConfig pkgConfig,
String actionName, String... refs) {
ActionConfig ac = pkgConfig.getAllActionConfigs().get(actionName);
assertNotNull(ac);
@@ -684,12 +751,12 @@ private void verifyActionConfigInterceptors(PackageConfig
pkgConfig, String acti
private PackageConfig makePackageConfig(String name, String namespace,
PackageConfig parent,
String defaultResultType, ResultTypeConfig... results) {
- return makePackageConfig(name, namespace, parent, defaultResultType,
results, null, null, null);
+ return makePackageConfig(name, namespace, parent, defaultResultType,
results, null, null, null, true);
}
private PackageConfig makePackageConfig(String name, String namespace,
PackageConfig parent,
String defaultResultType, ResultTypeConfig[] results,
List<InterceptorConfig> interceptors,
- List<InterceptorStackConfig> interceptorStacks, Set<String>
globalAllowedMethods) {
+ List<InterceptorStackConfig> interceptorStacks, Set<String>
globalAllowedMethods, boolean strictMethodInvocation) {
PackageConfig.Builder builder = new PackageConfig.Builder(name);
if (namespace != null) {
builder.namespace(namespace);
@@ -720,6 +787,10 @@ private PackageConfig makePackageConfig(String name,
String namespace, PackageCo
builder.addGlobalAllowedMethods(globalAllowedMethods);
}
+ if (!strictMethodInvocation) {
+ builder.strictMethodInvocation(strictMethodInvocation);
+ }
+
return new MyPackageConfig(builder.build());
}
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> SMI cannot be diasabled for action-packages found via the convention-plugin
> ---------------------------------------------------------------------------
>
> Key: WW-4930
> URL: https://issues.apache.org/jira/browse/WW-4930
> Project: Struts 2
> Issue Type: Bug
> Components: Plugin - Convention
> Affects Versions: 2.5.16
> Environment: Windows 10
> Java 1.8
> Reporter: Philipp Heidelbach
> Priority: Major
> Fix For: 2.6
>
>
> I'm trying to update Struts 2.3.34 to 2.5.16 and disabling SMI doesn't seem
> to work.
> I debuged XmlConfigurationProvider but in the packageConfig of our package
> (named default see below) SMI is correctly set to false. Debugging
> PackageBaseActionConfigBuilder shows that our default-package is used as
> parent package and in the parentPkg SMI is set to false. The pkgConfig
> however is alwasy null (line: 1043) and so a new package config is created in
> which SMI is set to true.
> Thus for all these actions methods i get the error that these methods aren't
> allowed.
> If I use @AllowedMethod-annotations it works fine.
> Below the beginning of our struts.xml
> {code:xml}
> <?xml version="1.0" encoding="UTF-8" ?>
> <!DOCTYPE struts PUBLIC
> "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
> "http://struts.apache.org/dtds/struts-2.5.dtd">
> <struts>
> <constant name="struts.action.extension" value="action" />
> <constant name="struts.convention.action.fileProtocols"
> value="jar,zip,vfsfile,vfszip" />
> <constant name="struts.convention.action.includeJars"
> value=".*/newd[-.\w]*\.jar(!/)?" />
> <constant name="struts.convention.exclude.packages"
> value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"
> />
> <constant name="struts.convention.result.path" value="/WEB-INF/jsp/" />
> <constant name="struts.custom.i18n.resources"
> value="applicationResources" />
> <constant name="struts.locale" value="de_DE" />
> <constant name="struts.multipart.maxSize" value="52428800" />
> <constant name="struts.objectFactory" value="spring" />
> <constant name="struts.enable.DynamicMethodInvocation" value="true" />
> <constant name="struts.ui.theme" value="simple" />
> <constant name="struts.ui.templateDir" value="template" />
> <constant name="struts.devMode" value="false" />
> <constant name="struts.el.throwExceptionOnFailure" value="true" />
> <package name="default" extends="struts-default"
> strict-method-invocation="false">
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)