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() {
+
+    }
+}


Reply via email to