[ 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: us...@infra.apache.org > 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)