Author: musachy Date: Tue Mar 17 20:24:26 2009 New Revision: 755382 URL: http://svn.apache.org/viewvc?rev=755382&view=rev Log: WW-3043 Result annotations at the method level should overwrite result annotations at the class level in the Convention plugin
Added: struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/OverrideResultAction.java Modified: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java Modified: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java?rev=755382&r1=755381&r2=755382&view=diff ============================================================================== --- struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java (original) +++ struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/DefaultResultMapBuilder.java Tue Mar 17 20:24:26 2009 @@ -180,20 +180,23 @@ String resultPrefix = defaultResultPath + actionName; + //results from files Map<String, ResultConfig> results = new HashMap<String, ResultConfig>(); Map<String, ResultTypeConfig> resultsByExtension = conventionsService.getResultTypesByExtension(packageConfig); createFromResources(actionClass, results, defaultResultPath, resultPrefix, actionName, packageConfig, resultsByExtension); - if (annotation != null && annotation.results() != null && annotation.results().length > 0) { - createFromAnnotations(results, defaultResultPath, packageConfig, annotation.results(), - actionClass, resultsByExtension); - } - //get inherited @Results and @Result + //get inherited @Results and @Result (class level) for (Class<?> clazz : ReflectionTools.getClassHierarchy(actionClass)) { createResultsFromAnnotations(clazz, packageConfig, defaultResultPath, results, resultsByExtension); } + + //method level + if (annotation != null && annotation.results() != null && annotation.results().length > 0) { + createFromAnnotations(results, defaultResultPath, packageConfig, annotation.results(), + actionClass, resultsByExtension); + } return results; } Modified: struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java?rev=755382&r1=755381&r2=755382&view=diff ============================================================================== --- struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java (original) +++ struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/DefaultResultMapBuilderTest.java Tue Mar 17 20:24:26 2009 @@ -29,6 +29,7 @@ import static org.apache.struts2.convention.ReflectionTools.*; import org.apache.struts2.convention.actions.NoAnnotationAction; +import org.apache.struts2.convention.actions.result.OverrideResultAction; import org.apache.struts2.convention.actions.result.ActionLevelResultAction; import org.apache.struts2.convention.actions.result.ActionLevelResultsAction; import org.apache.struts2.convention.actions.result.ClassLevelResultAction; @@ -74,6 +75,20 @@ verify(context, "/WEB-INF/location", results, false); } + public void testResultOverrride() throws Exception { + ServletContext context = mockServletContext("/WEB-INF/location"); + + // Test with a slash + PackageConfig packageConfig = createPackageConfigBuilder("/namespace"); + this.conventionsService = new ConventionsServiceImpl("/WEB-INF/location"); + DefaultResultMapBuilder builder = new DefaultResultMapBuilder(context, container, "dispatcher,velocity,freemarker"); + Action actionAnn = OverrideResultAction.class.getMethod("execute").getAnnotation(Action.class); + Map<String, ResultConfig> results = builder.build(OverrideResultAction.class, actionAnn, "action100", packageConfig); + ResultConfig result = results.get("error"); + assertNotNull(result); + assertEquals("/WEB-INF/location/namespace/error-overriden.jsp", result.getParams().get("location")); + } + public void testNull() throws Exception { ServletContext context = EasyMock.createStrictMock(ServletContext.class); EasyMock.expect(context.getResourcePaths("/WEB-INF/location/namespace/")).andReturn(null); Modified: struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java?rev=755382&r1=755381&r2=755382&view=diff ============================================================================== --- struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java (original) +++ struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java Tue Mar 17 20:24:26 2009 @@ -61,6 +61,7 @@ import org.apache.struts2.convention.actions.result.ClassLevelResultAction; import org.apache.struts2.convention.actions.result.ClassLevelResultsAction; import org.apache.struts2.convention.actions.result.InheritedResultExtends; +import org.apache.struts2.convention.actions.result.OverrideResultAction; import org.apache.struts2.convention.actions.resultpath.ClassLevelResultPathAction; import org.apache.struts2.convention.actions.resultpath.PackageLevelResultPathAction; import org.apache.struts2.convention.actions.skip.Index; @@ -241,6 +242,7 @@ expect(resultMapBuilder.build(ActionLevelResultAction.class, getAnnotation(ActionLevelResultAction.class, "execute", Action.class), "action-level-result", resultPkg)).andReturn(results); expect(resultMapBuilder.build(ActionLevelResultsAction.class, getAnnotation(ActionLevelResultsAction.class, "execute", Action.class), "action-level-results", resultPkg)).andReturn(results); expect(resultMapBuilder.build(InheritedResultExtends.class, null, "inherited-result-extends", resultPkg)).andReturn(results); + expect(resultMapBuilder.build(OverrideResultAction.class, getAnnotation(OverrideResultAction.class, "execute", Action.class), "override-result", resultPkg)).andReturn(results); /* org.apache.struts2.convention.actions.resultpath */ expect(resultMapBuilder.build(ClassLevelResultPathAction.class, null, "class-level-result-path", resultPathPkg)).andReturn(results); @@ -450,7 +452,7 @@ /* org.apache.struts2.convention.actions.result */ pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.result#struts-default#/result"); assertNotNull(pkgConfig); - assertEquals(5, pkgConfig.getActionConfigs().size()); + assertEquals(6, 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()); Added: struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/OverrideResultAction.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/OverrideResultAction.java?rev=755382&view=auto ============================================================================== --- struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/OverrideResultAction.java (added) +++ struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/actions/result/OverrideResultAction.java Tue Mar 17 20:24:26 2009 @@ -0,0 +1,35 @@ +/* + * $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.Result; +import org.apache.struts2.convention.annotation.Action; + +...@result(name = "error", location = "error.jsp") +public class OverrideResultAction { + + @Action(value = "override-result", results = { + @Result(name = "error", location = "error-overriden.jsp") + }) + public void execute() { + + } +}