From 087cf610abcd262980a41c30a2f9360aa3f416e1 Mon Sep 17 00:00:00 2001 From: Aleksandr Mashchenko Date: Mon, 18 Jan 2016 21:23:46 +0200 Subject: [PATCH 1/3] WW-4590 - Allow to use multiple names in result --- .../providers/XmlConfigurationProvider.java | 20 +++- .../XmlConfigurationProviderResultsTest.java | 54 +++++++++ .../providers/xwork-test-result-names.xml | 48 ++++++++ .../convention/DefaultResultMapBuilder.java | 35 ++++-- .../DefaultResultMapBuilderTest.java | 104 ++++++++++++++++++ .../PackageBasedActionConfigBuilderTest.java | 6 +- .../result/ActionLevelResultsNamesAction.java | 61 ++++++++++ 7 files changed, 314 insertions(+), 14 deletions(-) create mode 100644 core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml create mode 100644 plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/ActionLevelResultsNamesAction.java diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java index 58469698f..e3b0c19bf 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java @@ -777,11 +777,21 @@ public class XmlConfigurationProvider implements ConfigurationProvider { } params.putAll(resultParams); - ResultConfig resultConfig = new ResultConfig.Builder(resultName, resultClass) - .addParams(params) - .location(DomHelper.getLocationObject(element)) - .build(); - results.put(resultConfig.getName(), resultConfig); + Set resultNamesSet; + if (",".equals(resultName.trim())) { + resultNamesSet = new HashSet<>(1); + resultNamesSet.add(resultName); + } else { + resultNamesSet = TextParseUtil.commaDelimitedStringToSet(resultName); + } + + for (String name : resultNamesSet) { + ResultConfig resultConfig = new ResultConfig.Builder(name, resultClass) + .addParams(params) + .location(DomHelper.getLocationObject(element)) + .build(); + results.put(resultConfig.getName(), resultConfig); + } } } diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java index caa9da0d6..468ea1a18 100644 --- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java @@ -15,6 +15,7 @@ */ package com.opensymphony.xwork2.config.providers; +import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionChainResult; import com.opensymphony.xwork2.SimpleAction; import com.opensymphony.xwork2.config.ConfigurationException; @@ -118,4 +119,57 @@ public class XmlConfigurationProviderResultsTest extends ConfigurationTestBase { assertEquals(chainResult, resultTypes.get("chain")); assertEquals(mockResult, resultTypes.get("mock")); } + + public void testResultNames() throws ConfigurationException { + final String filename = "com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml"; + ConfigurationProvider provider = buildConfigurationProvider(filename); + + // execute the configuration + provider.init(configuration); + provider.loadPackages(); + + PackageConfig pkg = configuration.getPackageConfig("default"); + Map actionConfigs = pkg.getActionConfigs(); + + // assertions + assertNotNull(actionConfigs); + + Map resultConfigs = actionConfigs.get("noname").getResults(); + assertEquals(1, resultConfigs.size()); + assertTrue(resultConfigs.containsKey(Action.SUCCESS)); + + resultConfigs = actionConfigs.get("success").getResults(); + assertEquals(1, resultConfigs.size()); + assertTrue(resultConfigs.containsKey(Action.SUCCESS)); + + resultConfigs = actionConfigs.get("empty").getResults(); + assertEquals(1, resultConfigs.size()); + assertTrue(resultConfigs.containsKey(Action.SUCCESS)); + + resultConfigs = actionConfigs.get("comma").getResults(); + assertEquals(1, resultConfigs.size()); + assertTrue(resultConfigs.containsKey(" , ")); + + resultConfigs = actionConfigs.get("error-input").getResults(); + assertEquals(2, resultConfigs.size()); + assertTrue(resultConfigs.containsKey(Action.ERROR)); + assertTrue(resultConfigs.containsKey(Action.INPUT)); + + resultConfigs = actionConfigs.get("error-input2").getResults(); + assertEquals(2, resultConfigs.size()); + assertTrue(resultConfigs.containsKey(Action.ERROR)); + assertTrue(resultConfigs.containsKey(Action.INPUT)); + + resultConfigs = actionConfigs.get("noname-error-input").getResults(); + assertEquals(3, resultConfigs.size()); + assertTrue(resultConfigs.containsKey(Action.SUCCESS)); + assertTrue(resultConfigs.containsKey(Action.ERROR)); + assertTrue(resultConfigs.containsKey(Action.INPUT)); + + resultConfigs = actionConfigs.get("noname-error-input2").getResults(); + assertEquals(3, resultConfigs.size()); + assertTrue(resultConfigs.containsKey(Action.SUCCESS)); + assertTrue(resultConfigs.containsKey(Action.ERROR)); + assertTrue(resultConfigs.containsKey(Action.INPUT)); + } } diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml new file mode 100644 index 000000000..e7405775b --- /dev/null +++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java b/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java index 87fb9706e..b7c5b51d2 100644 --- a/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java +++ b/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java @@ -28,6 +28,7 @@ import com.opensymphony.xwork2.config.entities.ResultConfig; import com.opensymphony.xwork2.config.entities.ResultTypeConfig; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.TextParseUtil; import com.opensymphony.xwork2.util.finder.ClassLoaderInterface; import com.opensymphony.xwork2.util.finder.ClassLoaderInterfaceDelegate; import com.opensymphony.xwork2.util.finder.ResourceFinder; @@ -409,11 +410,21 @@ public class DefaultResultMapBuilder implements ResultMapBuilder { Class actionClass, Map resultsByExtension) { // Check for multiple results on the class for (Result result : results) { - ResultConfig config = createResultConfig(actionClass, - new ResultInfo(result, packageConfig, resultPath, actionClass, resultsByExtension), - packageConfig, result); - if (config != null) { - resultConfigs.put(config.getName(), config); + Set names; + if (",".equals(result.name().trim())) { + names = new HashSet<>(1); + names.add(result.name()); + } else { + names = TextParseUtil.commaDelimitedStringToSet(result.name()); + } + + for (String name : names) { + ResultConfig config = createResultConfig(actionClass, new ResultInfo( + name, result, packageConfig, resultPath, actionClass, + resultsByExtension), packageConfig, result); + if (config != null) { + resultConfigs.put(config.getName(), config); + } } } } @@ -478,9 +489,10 @@ public class DefaultResultMapBuilder implements ResultMapBuilder { this.type = determineType(location, packageConfig, resultsByExtension); } - public ResultInfo(Result result, PackageConfig packageConfig, String resultPath, - Class actionClass, Map resultsByExtension) { - this.name = result.name(); + public ResultInfo(String name, Result result, PackageConfig packageConfig, + String resultPath, Class actionClass, + Map resultsByExtension) { + this.name = name; if (StringUtils.isNotBlank(result.type())) { this.type = result.type(); } else if (StringUtils.isNotBlank(result.location())) { @@ -503,6 +515,13 @@ public class DefaultResultMapBuilder implements ResultMapBuilder { } } + public ResultInfo(Result result, PackageConfig packageConfig, + String resultPath, Class actionClass, + Map resultsByExtension) { + this(result.name(), result, packageConfig, resultPath, actionClass, + resultsByExtension); + } + String determineType(String location, PackageConfig packageConfig, Map resultsByExtension) { int indexOfDot = location.lastIndexOf("."); diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java b/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java index abda7b355..b73667a9e 100644 --- a/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java +++ b/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java @@ -487,6 +487,110 @@ public class DefaultResultMapBuilderTest extends TestCase { EasyMock.verify(context); } + public void testActionLevelMultipleResultNamesAnnotation() throws Exception { + ServletContext context = EasyMock.createStrictMock(ServletContext.class); + + // Setup some mock jsps + Set resources = new HashSet<>(); + EasyMock.expect(context.getResourcePaths("/WEB-INF/location/namespace/")).andReturn(resources); + EasyMock.replay(context); + + PackageConfig packageConfig = createPackageConfigBuilder("/namespace"); + + this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location"); + DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker"); + Map results = builder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "execute", Action.class), "action-level-results", packageConfig); + assertEquals(4, results.size()); + assertEquals("error", results.get("error").getName()); + assertEquals("input", results.get("input").getName()); + assertEquals("success", results.get("success").getName()); + assertEquals("failure", results.get("failure").getName()); + assertEquals(3, results.get("error").getParams().size()); + assertEquals("/WEB-INF/location/namespace/error.jsp", results.get("error").getParams().get("location")); + assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("error").getClassName()); + assertEquals("value", results.get("success").getParams().get("key")); + assertEquals("value1", results.get("success").getParams().get("key1")); + assertEquals(3, results.get("input").getParams().size()); + assertEquals("/WEB-INF/location/namespace/error.jsp", results.get("input").getParams().get("location")); + assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("input").getClassName()); + assertEquals(3, results.get("failure").getParams().size()); + assertEquals("/WEB-INF/location/namespace/action-failure.jsp", results.get("failure").getParams().get("location")); + assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("failure").getClassName()); + assertEquals(3, results.get("success").getParams().size()); + assertEquals("/WEB-INF/location/namespace/action-success.jsp", results.get("success").getParams().get("location")); + assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("success").getClassName()); + EasyMock.verify(context); + } + + public void testActionLevelMultipleResultNamesAnnotationErrorInput() throws Exception { + ServletContext context = EasyMock.createStrictMock(ServletContext.class); + + // Setup some mock jsps + Set resources = new HashSet<>(); + EasyMock.expect(context.getResourcePaths("/WEB-INF/location/namespace/")).andReturn(resources); + EasyMock.replay(context); + + PackageConfig packageConfig = createPackageConfigBuilder("/namespace"); + + this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location"); + DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker"); + Map results = builder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "errorinput", Action.class), "action-level-results", packageConfig); + assertEquals(2, results.size()); + assertEquals("error", results.get("error").getName()); + assertEquals("input", results.get("input").getName()); + assertEquals(3, results.get("error").getParams().size()); + assertEquals("/WEB-INF/location/namespace/error.jsp", results.get("error").getParams().get("location")); + assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("error").getClassName()); + assertEquals(3, results.get("input").getParams().size()); + assertEquals("/WEB-INF/location/namespace/error.jsp", results.get("input").getParams().get("location")); + assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("input").getClassName()); + EasyMock.verify(context); + } + + public void testActionLevelMultipleResultNamesAnnotationComma() throws Exception { + ServletContext context = EasyMock.createStrictMock(ServletContext.class); + + // Setup some mock jsps + Set resources = new HashSet<>(); + EasyMock.expect(context.getResourcePaths("/WEB-INF/location/namespace/")).andReturn(resources); + EasyMock.replay(context); + + PackageConfig packageConfig = createPackageConfigBuilder("/namespace"); + + this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location"); + DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker"); + Map results = builder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "comma", Action.class), "action-level-results", packageConfig); + assertEquals(1, results.size()); + assertEquals(" , ", results.get(" , ").getName()); + assertEquals(3, results.get(" , ").getParams().size()); + assertEquals("/WEB-INF/location/namespace/error.jsp", results.get(" , ").getParams().get("location")); + assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get(" , ").getClassName()); + EasyMock.verify(context); + } + + public void testActionLevelMultipleResultNamesAnnotationNoName() throws Exception { + ServletContext context = EasyMock.createStrictMock(ServletContext.class); + + // Setup some mock jsps + Set resources = new HashSet<>(); + EasyMock.expect(context.getResourcePaths("/WEB-INF/location/namespace/")).andReturn(resources); + EasyMock.replay(context); + + PackageConfig packageConfig = createPackageConfigBuilder("/namespace"); + + this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location"); + DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker"); + Map results = builder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "noname", Action.class), "action-level-results", packageConfig); + assertEquals(1, results.size()); + assertEquals("success", results.get("success").getName()); + assertEquals(3, results.get("success").getParams().size()); + assertEquals("value", results.get("success").getParams().get("key")); + assertEquals("value1", results.get("success").getParams().get("key1")); + assertEquals("/WEB-INF/location/namespace/action-success.jsp", results.get("success").getParams().get("location")); + assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("success").getClassName()); + EasyMock.verify(context); + } + public void testClassPath() throws Exception { ServletContext context = EasyMock.createNiceMock(ServletContext.class); 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 61ed3eb28..7e47ff641 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 @@ -291,6 +291,10 @@ public class PackageBasedActionConfigBuilderTest extends TestCase { expect(resultMapBuilder.build(OverrideResultAction.class, getAnnotation(OverrideResultAction.class, "execute", Action.class), "override-result", resultPkg)).andReturn(results); expect(resultMapBuilder.build(GlobalResultAction.class, null, "global-result", globalResultPkg)).andReturn(results); expect(resultMapBuilder.build(GlobalResultOverrideAction.class, null, "global-result-override", globalResultPkg)).andReturn(results); + expect(resultMapBuilder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "execute", Action.class), "action-level-results-names", resultPkg)).andReturn(results); + expect(resultMapBuilder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "errorinput", Action.class), "action-level-results-names", resultPkg)).andReturn(results); + expect(resultMapBuilder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "comma", Action.class), "action-level-results-names", resultPkg)).andReturn(results); + expect(resultMapBuilder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "noname", Action.class), "action-level-results-names", resultPkg)).andReturn(results); /* org.apache.struts2.convention.actions.resultpath */ expect(resultMapBuilder.build(ClassLevelResultPathAction.class, null, "class-level-result-path", resultPathPkg)).andReturn(results); @@ -565,7 +569,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase { /* org.apache.struts2.convention.actions.result */ pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.result#struts-default#/result"); assertNotNull(pkgConfig); - assertEquals(6, pkgConfig.getActionConfigs().size()); + 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()); verifyActionConfig(pkgConfig, "action-level-result", ActionLevelResultAction.class, "execute", pkgConfig.getName()); diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/ActionLevelResultsNamesAction.java b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/ActionLevelResultsNamesAction.java new file mode 100644 index 000000000..8ad30f168 --- /dev/null +++ b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/ActionLevelResultsNamesAction.java @@ -0,0 +1,61 @@ +/* + * $Id$ + * + * 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.convention.actions.result; + +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Result; + +/** + *

+ * This is a test action with multiple results names. + *

+ */ +public class ActionLevelResultsNamesAction { + @Action(results = { + @Result(name="error, input", location="error.jsp"), + @Result(name="success", location="/WEB-INF/location/namespace/action-success.jsp"), + @Result(name="failure", location="/WEB-INF/location/namespace/action-failure.jsp") + }) + public String execute() { + return null; + } + + @Action(results = { + @Result(name="error, input, ", location="error.jsp") + }) + public String errorinput() { + return null; + } + + @Action(results = { + @Result(name=" , ", location="error.jsp") + }) + public String comma() { + return null; + } + + @Action(results = { + @Result(location="/WEB-INF/location/namespace/action-success.jsp") + }) + public String noname() { + return null; + } +} From 930f6e4cf7df951fee03159ad891e4e606f36aef Mon Sep 17 00:00:00 2001 From: Aleksandr Mashchenko Date: Wed, 20 Jan 2016 17:52:56 +0200 Subject: [PATCH 2/3] Cleaner result name parsing --- .../xwork2/config/providers/XmlConfigurationProvider.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java index e3b0c19bf..b04cffb36 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java @@ -777,12 +777,9 @@ public class XmlConfigurationProvider implements ConfigurationProvider { } params.putAll(resultParams); - Set resultNamesSet; - if (",".equals(resultName.trim())) { - resultNamesSet = new HashSet<>(1); + Set resultNamesSet = TextParseUtil.commaDelimitedStringToSet(resultName); + if (resultNamesSet.isEmpty()) { resultNamesSet.add(resultName); - } else { - resultNamesSet = TextParseUtil.commaDelimitedStringToSet(resultName); } for (String name : resultNamesSet) { From 2a46a6586ec22e174dedce56f93e5993f757a87b Mon Sep 17 00:00:00 2001 From: Aleksandr Mashchenko Date: Wed, 20 Jan 2016 18:03:57 +0200 Subject: [PATCH 3/3] Result annotation name attribute as an array, removed one of ResultInfo constructors --- .../convention/DefaultResultMapBuilder.java | 17 +------ .../struts2/convention/annotation/Result.java | 2 +- .../DefaultResultMapBuilderTest.java | 46 ------------------- .../PackageBasedActionConfigBuilderTest.java | 2 - .../result/ActionLevelResultsNamesAction.java | 16 +------ 5 files changed, 3 insertions(+), 80 deletions(-) diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java b/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java index b7c5b51d2..40ea279cd 100644 --- a/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java +++ b/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java @@ -410,15 +410,7 @@ public class DefaultResultMapBuilder implements ResultMapBuilder { Class actionClass, Map resultsByExtension) { // Check for multiple results on the class for (Result result : results) { - Set names; - if (",".equals(result.name().trim())) { - names = new HashSet<>(1); - names.add(result.name()); - } else { - names = TextParseUtil.commaDelimitedStringToSet(result.name()); - } - - for (String name : names) { + for (String name : result.name()) { ResultConfig config = createResultConfig(actionClass, new ResultInfo( name, result, packageConfig, resultPath, actionClass, resultsByExtension), packageConfig, result); @@ -515,13 +507,6 @@ public class DefaultResultMapBuilder implements ResultMapBuilder { } } - public ResultInfo(Result result, PackageConfig packageConfig, - String resultPath, Class actionClass, - Map resultsByExtension) { - this(result.name(), result, packageConfig, resultPath, actionClass, - resultsByExtension); - } - String determineType(String location, PackageConfig packageConfig, Map resultsByExtension) { int indexOfDot = location.lastIndexOf("."); diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/Result.java b/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/Result.java index f8e9ecd89..f90e7b50c 100644 --- a/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/Result.java +++ b/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/Result.java @@ -69,7 +69,7 @@ public @interface Result { * @return The name of the result mapping. This is the value that is returned from the action * method and is used to associate a location with a return value. */ - String name() default com.opensymphony.xwork2.Action.SUCCESS; + String[] name() default com.opensymphony.xwork2.Action.SUCCESS; /** * @return The location of the result within the web application or anywhere on disk. This location diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java b/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java index b73667a9e..8a4325b90 100644 --- a/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java +++ b/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java @@ -522,52 +522,6 @@ public class DefaultResultMapBuilderTest extends TestCase { EasyMock.verify(context); } - public void testActionLevelMultipleResultNamesAnnotationErrorInput() throws Exception { - ServletContext context = EasyMock.createStrictMock(ServletContext.class); - - // Setup some mock jsps - Set resources = new HashSet<>(); - EasyMock.expect(context.getResourcePaths("/WEB-INF/location/namespace/")).andReturn(resources); - EasyMock.replay(context); - - PackageConfig packageConfig = createPackageConfigBuilder("/namespace"); - - this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location"); - DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker"); - Map results = builder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "errorinput", Action.class), "action-level-results", packageConfig); - assertEquals(2, results.size()); - assertEquals("error", results.get("error").getName()); - assertEquals("input", results.get("input").getName()); - assertEquals(3, results.get("error").getParams().size()); - assertEquals("/WEB-INF/location/namespace/error.jsp", results.get("error").getParams().get("location")); - assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("error").getClassName()); - assertEquals(3, results.get("input").getParams().size()); - assertEquals("/WEB-INF/location/namespace/error.jsp", results.get("input").getParams().get("location")); - assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get("input").getClassName()); - EasyMock.verify(context); - } - - public void testActionLevelMultipleResultNamesAnnotationComma() throws Exception { - ServletContext context = EasyMock.createStrictMock(ServletContext.class); - - // Setup some mock jsps - Set resources = new HashSet<>(); - EasyMock.expect(context.getResourcePaths("/WEB-INF/location/namespace/")).andReturn(resources); - EasyMock.replay(context); - - PackageConfig packageConfig = createPackageConfigBuilder("/namespace"); - - this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location"); - DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker"); - Map results = builder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "comma", Action.class), "action-level-results", packageConfig); - assertEquals(1, results.size()); - assertEquals(" , ", results.get(" , ").getName()); - assertEquals(3, results.get(" , ").getParams().size()); - assertEquals("/WEB-INF/location/namespace/error.jsp", results.get(" , ").getParams().get("location")); - assertEquals("org.apache.struts2.result.ServletDispatcherResult", results.get(" , ").getClassName()); - EasyMock.verify(context); - } - public void testActionLevelMultipleResultNamesAnnotationNoName() throws Exception { ServletContext context = EasyMock.createStrictMock(ServletContext.class); 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 7e47ff641..dfa1ad622 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 @@ -292,8 +292,6 @@ public class PackageBasedActionConfigBuilderTest extends TestCase { expect(resultMapBuilder.build(GlobalResultAction.class, null, "global-result", globalResultPkg)).andReturn(results); expect(resultMapBuilder.build(GlobalResultOverrideAction.class, null, "global-result-override", globalResultPkg)).andReturn(results); expect(resultMapBuilder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "execute", Action.class), "action-level-results-names", resultPkg)).andReturn(results); - expect(resultMapBuilder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "errorinput", Action.class), "action-level-results-names", resultPkg)).andReturn(results); - expect(resultMapBuilder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "comma", Action.class), "action-level-results-names", resultPkg)).andReturn(results); expect(resultMapBuilder.build(ActionLevelResultsNamesAction.class, getAnnotation(ActionLevelResultsNamesAction.class, "noname", Action.class), "action-level-results-names", resultPkg)).andReturn(results); /* org.apache.struts2.convention.actions.resultpath */ diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/ActionLevelResultsNamesAction.java b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/ActionLevelResultsNamesAction.java index 8ad30f168..2ae4bb629 100644 --- a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/ActionLevelResultsNamesAction.java +++ b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/ActionLevelResultsNamesAction.java @@ -30,7 +30,7 @@ import org.apache.struts2.convention.annotation.Result; */ public class ActionLevelResultsNamesAction { @Action(results = { - @Result(name="error, input", location="error.jsp"), + @Result(name={"error", "input"}, location="error.jsp"), @Result(name="success", location="/WEB-INF/location/namespace/action-success.jsp"), @Result(name="failure", location="/WEB-INF/location/namespace/action-failure.jsp") }) @@ -38,20 +38,6 @@ public class ActionLevelResultsNamesAction { return null; } - @Action(results = { - @Result(name="error, input, ", location="error.jsp") - }) - public String errorinput() { - return null; - } - - @Action(results = { - @Result(name=" , ", location="error.jsp") - }) - public String comma() { - return null; - } - @Action(results = { @Result(location="/WEB-INF/location/namespace/action-success.jsp") })