Author: lukaszlenart
Date: Thu Jul 25 10:03:42 2013
New Revision: 1506872

URL: http://svn.apache.org/r1506872
Log:
WW-4144 Defines ParamNameAwareResult interfaces and ResultBuilder to be used 
with

Added:
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/factory/
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/factory/StrutsResultBuilder.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/MyResultBuilder.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/StrutsResultBuilderTest.java
    
struts/struts2/trunk/core/src/test/resources/struts-object-factory-result-builder.xml
      - copied, changed from r1506116, 
struts/struts2/trunk/core/src/test/resources/struts.xml
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/result/
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/result/ParamNameAwareResult.java
Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
    struts/struts2/trunk/core/src/main/resources/struts-default.xml
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/StrutsTestCase.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java?rev=1506872&r1=1506871&r2=1506872&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java 
(original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java 
Thu Jul 25 10:03:42 2013
@@ -64,6 +64,8 @@ public final class StrutsConstants {
     /** The com.opensymphony.xwork2.ObjectFactory implementation class */
     public static final String STRUTS_OBJECTFACTORY = "struts.objectFactory";
 
+    public static final String STRUTS_OBJECTFACTORY_RESULTBUILDER = 
"struts.objectFactory.resultBuilder";
+
     /** The com.opensymphony.xwork2.util.FileManager implementation class */
     public static final String STRUTS_FILE_MANAGER_FACTORY = 
"struts.fileManagerFactory";
 

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java?rev=1506872&r1=1506871&r2=1506872&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
 Thu Jul 25 10:03:42 2013
@@ -61,6 +61,7 @@ import org.apache.struts2.components.Url
 import org.apache.struts2.dispatcher.StaticContentLoader;
 import org.apache.struts2.dispatcher.mapper.ActionMapper;
 import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
+import com.opensymphony.xwork2.factory.ResultBuilder;
 import org.apache.struts2.views.freemarker.FreemarkerManager;
 import org.apache.struts2.views.util.UrlHelper;
 import org.apache.struts2.views.velocity.VelocityManager;
@@ -92,6 +93,12 @@ import java.util.StringTokenizer;
  *     <td>Creates actions, results, and interceptors</td>
  *   </tr>
  *   <tr>
+ *     <td>com.opensymphony.xwork2.factory.ResultBuilder</td>
+ *     <td>struts.objectFactory.resultBuilder</td>
+ *     <td>singleton</td>
+ *     <td>Dedicated builder to create Results, you can implement/extend 
existing one instead of defining new ObjectFactory</td>
+ *   </tr>
+ *   <tr>
  *     <td>com.opensymphony.xwork2.ActionProxyFactory</td>
  *     <td>struts.actionProxyFactory</td>
  *     <td>singleton</td>
@@ -325,6 +332,8 @@ public class BeanSelectionProvider imple
 
     public void register(ContainerBuilder builder, LocatableProperties props) {
         alias(ObjectFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY, 
builder, props);
+        alias(ResultBuilder.class, 
StrutsConstants.STRUTS_OBJECTFACTORY_RESULTBUILDER, builder, props);
+
         alias(FileManagerFactory.class, 
StrutsConstants.STRUTS_FILE_MANAGER_FACTORY, builder, props, Scope.SINGLETON);
 
         alias(XWorkConverter.class, StrutsConstants.STRUTS_XWORKCONVERTER, 
builder, props);

Added: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/factory/StrutsResultBuilder.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/factory/StrutsResultBuilder.java?rev=1506872&view=auto
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/factory/StrutsResultBuilder.java
 (added)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/factory/StrutsResultBuilder.java
 Thu Jul 25 10:03:42 2013
@@ -0,0 +1,71 @@
+package org.apache.struts2.factory;
+
+import com.opensymphony.xwork2.ObjectFactory;
+import com.opensymphony.xwork2.Result;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
+import com.opensymphony.xwork2.factory.ResultBuilder;
+import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.util.reflection.ReflectionException;
+import com.opensymphony.xwork2.util.reflection.ReflectionExceptionHandler;
+import com.opensymphony.xwork2.util.reflection.ReflectionProvider;
+import com.opensymphony.xwork2.result.ParamNameAwareResult;
+
+import java.util.Map;
+
+/**
+ * Default implementation which uses {@link 
com.opensymphony.xwork2.result.ParamNameAwareResult} to accept or throwaway 
parameters
+ */
+public class StrutsResultBuilder implements ResultBuilder {
+
+    protected ObjectFactory objectFactory;
+    protected ReflectionProvider reflectionProvider;
+
+    @Inject
+    public void setObjectFactory(ObjectFactory objectFactory) {
+        this.objectFactory = objectFactory;
+    }
+
+    @Inject
+    public void setReflectionProvider(ReflectionProvider provider) {
+        this.reflectionProvider = provider;
+    }
+
+    public Result buildResult(ResultConfig resultConfig, Map<String, Object> 
extraContext) throws Exception {
+        String resultClassName = resultConfig.getClassName();
+        Result result = null;
+
+        if (resultClassName != null) {
+            result = (Result) objectFactory.buildBean(resultClassName, 
extraContext);
+            Map<String, String> params = resultConfig.getParams();
+            if (params != null) {
+                setParameters(extraContext, result, params);
+            }
+        }
+        return result;
+    }
+
+    protected void setParameters(Map<String, Object> extraContext, Result 
result, Map<String, String> params) {
+        for (Map.Entry<String, String> paramEntry : params.entrySet()) {
+            try {
+                String name = paramEntry.getKey();
+                String value = paramEntry.getValue();
+                setParameter(result, name, value, extraContext);
+            } catch (ReflectionException ex) {
+                if (result instanceof ReflectionExceptionHandler) {
+                    ((ReflectionExceptionHandler) result).handle(ex);
+                }
+            }
+        }
+    }
+
+    protected void setParameter(Result result, String name, String value, 
Map<String, Object> extraContext) {
+        if (result instanceof ParamNameAwareResult) {
+            if (((ParamNameAwareResult) result).acceptParamName(name, value)) {
+                reflectionProvider.setProperty(name, value, result, 
extraContext, true);
+            }
+        } else {
+            reflectionProvider.setProperty(name, value, result, extraContext, 
true);
+        }
+    }
+
+}

Modified: struts/struts2/trunk/core/src/main/resources/struts-default.xml
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/struts-default.xml?rev=1506872&r1=1506871&r2=1506872&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/struts-default.xml (original)
+++ struts/struts2/trunk/core/src/main/resources/struts-default.xml Thu Jul 25 
10:03:42 2013
@@ -28,6 +28,8 @@
 <struts>
     <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
     <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" 
class="org.apache.struts2.impl.StrutsObjectFactory" />
+    <bean type="com.opensymphony.xwork2.factory.ResultBuilder" name="xwork" 
class="org.apache.struts2.factory.StrutsResultBuilder" />
+    <bean type="com.opensymphony.xwork2.factory.ResultBuilder" name="struts" 
class="org.apache.struts2.factory.StrutsResultBuilder" />
 
     <bean type="com.opensymphony.xwork2.FileManager" 
class="com.opensymphony.xwork2.util.fs.DefaultFileManager" name="system" 
scope="singleton"/>
 

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/StrutsTestCase.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/StrutsTestCase.java?rev=1506872&r1=1506871&r2=1506872&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/StrutsTestCase.java 
(original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/StrutsTestCase.java 
Thu Jul 25 10:03:42 2013
@@ -21,23 +21,22 @@
 
 package org.apache.struts2;
 
+import com.opensymphony.xwork2.XWorkTestCase;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+import com.opensymphony.xwork2.util.logging.jdk.JdkLoggerFactory;
+import org.apache.struts2.dispatcher.Dispatcher;
+import org.apache.struts2.util.StrutsTestCaseHelper;
+import org.springframework.mock.web.MockServletContext;
+
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.logging.ConsoleHandler;
 import java.util.logging.Formatter;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
-import java.util.logging.SimpleFormatter;
-
-import org.apache.struts2.dispatcher.Dispatcher;
-import org.apache.struts2.util.StrutsTestCaseHelper;
-import org.springframework.mock.web.MockServletContext;
-
-import com.opensymphony.xwork2.XWorkTestCase;
-import com.opensymphony.xwork2.util.logging.LoggerFactory;
-import com.opensymphony.xwork2.util.logging.jdk.JdkLoggerFactory;
 
 /**
  * Base test case for JUnit testing Struts.
@@ -90,6 +89,19 @@ public abstract class StrutsTestCase ext
         return du;
     }
 
+    /**
+     * Init Dispatcher with provided comma delimited list of xml configs to 
use, ie:
+     * initDispatcherWithConfigs("struts-default.xml,test-struts-config.xml")
+     *
+     * @param configs comma delimited list of config files
+     * @return instance of {@see Dispatcher}
+     */
+    protected Dispatcher initDispatcherWithConfigs(String configs) {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("config", configs);
+        return initDispatcher(params);
+    }
+
     protected void tearDown() throws Exception {
         super.tearDown();
         StrutsTestCaseHelper.tearDown();

Added: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/MyResultBuilder.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/MyResultBuilder.java?rev=1506872&view=auto
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/MyResultBuilder.java
 (added)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/MyResultBuilder.java
 Thu Jul 25 10:03:42 2013
@@ -0,0 +1,4 @@
+package org.apache.struts2.factory;
+
+public class MyResultBuilder extends StrutsResultBuilder {
+}

Added: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/StrutsResultBuilderTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/StrutsResultBuilderTest.java?rev=1506872&view=auto
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/StrutsResultBuilderTest.java
 (added)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/factory/StrutsResultBuilderTest.java
 Thu Jul 25 10:03:42 2013
@@ -0,0 +1,75 @@
+package org.apache.struts2.factory;
+
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.Result;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
+import com.opensymphony.xwork2.factory.ResultBuilder;
+import org.apache.struts2.StrutsTestCase;
+import com.opensymphony.xwork2.result.ParamNameAwareResult;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StrutsResultBuilderTest extends StrutsTestCase {
+
+    public void testAcceptParams() throws Exception {
+        // given
+        initDispatcherWithConfigs("struts-default.xml");
+        StrutsResultBuilder builder = (StrutsResultBuilder) 
container.getInstance(ResultBuilder.class);
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("accept", "ok");
+        params.put("reject", "bad");
+        ResultConfig config = new ResultConfig.Builder("struts", 
MyResult.class.getName()).addParams(params).build();
+        Map<String, Object> context = new HashMap<String, Object>();
+
+        // when
+        Result result = builder.buildResult(config, context);
+
+        // then
+        assertEquals("ok", ((MyResult)result).getAccept());
+        assertEquals("ok", ((MyResult)result).getReject());
+    }
+
+    public void testUseCustomResultBuilder() throws Exception {
+        // given
+        
initDispatcherWithConfigs("struts-default.xml,struts-object-factory-result-builder.xml");
+
+        // when
+        ResultBuilder actual = container.getInstance(ResultBuilder.class);
+
+        // then
+        assertTrue(actual instanceof MyResultBuilder);
+    }
+
+    public static class MyResult implements Result, ParamNameAwareResult {
+
+        private String accept;
+        private String reject = "ok";
+
+        public boolean acceptParamName(String name, String value) {
+            return "accept".equals(name);
+        }
+
+        public void execute(ActionInvocation invocation) throws Exception {
+
+        }
+
+        public String getAccept() {
+            return accept;
+        }
+
+        public void setAccept(String accept) {
+            this.accept = accept;
+        }
+
+        public String getReject() {
+            return reject;
+        }
+
+        public void setReject(String reject) {
+            this.reject = reject;
+        }
+    }
+
+}

Copied: 
struts/struts2/trunk/core/src/test/resources/struts-object-factory-result-builder.xml
 (from r1506116, struts/struts2/trunk/core/src/test/resources/struts.xml)
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/resources/struts-object-factory-result-builder.xml?p2=struts/struts2/trunk/core/src/test/resources/struts-object-factory-result-builder.xml&p1=struts/struts2/trunk/core/src/test/resources/struts.xml&r1=1506116&r2=1506872&rev=1506872&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/resources/struts.xml (original)
+++ 
struts/struts2/trunk/core/src/test/resources/struts-object-factory-result-builder.xml
 Thu Jul 25 10:03:42 2013
@@ -21,78 +21,14 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
-          "http://struts.apache.org/dtds/struts-2.0.dtd";>
-<struts>
-    <package name="default" extends="struts-default">
-        <action name="hello" class="com.opensymphony.xwork2.ActionSupport">
-            <result name="success">hello.jsp</result>
-            <result name="tutorial" 
type="redirect">/tutorial/test.action</result>
-        </action>
-    </package>
-
-    <package name="tutorial" namespace="/tutorial" extends="struts-default">
-        <result-types>
-            <result-type name="freemarker" default="true"
-                         
class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
-        </result-types>
-
-        <action name="test" class="com.opensymphony.xwork2.ActionSupport">
-            <result name="input">sitegraph/guess-input.ftl</result>
-        </action>
-
-        <action name="test2" class="com.opensymphony.xwork2.ActionSupport">
-            <result type="freemarker">
-                <param 
name="location">org/apache/struts2/views/freemarker/callActionFreeMarker.ftl</param>
-            </result>
-        </action>
-
-        <action name="test3" class="com.opensymphony.xwork2.ActionSupport">
-            <result 
type="freemarker">org/apache/struts2/views/freemarker/nested.ftl</result>
-        </action>
+        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
+        "http://struts.apache.org/dtds/struts-2.3.dtd";>
 
-        <action name="test4" class="org.apache.struts2.TestAction" 
method="executeThrowsException">
-            <result type="freemarker">
-                <param 
name="location">org/apache/struts2/views/freemarker/nested.ftl</param>
-            </result>
-        </action>
-
-         <action name="test5" class="com.opensymphony.xwork2.ActionSupport">
-            <result type="freemarker">
-                <param 
name="location">org/apache/struts2/views/freemarker/callActionFreeMarker2.ftl</param>
-            </result>
-        </action>
-
-         <action name="test6" class="com.opensymphony.xwork2.ActionSupport">
-            <result type="freemarker">
-                <param 
name="location">org/apache/struts2/views/freemarker/dynaAttributes.ftl</param>
-            </result>
-        </action>
-
-         <action name="test7" class="com.opensymphony.xwork2.ActionSupport">
-            <result type="freemarker">
-                <param 
name="location">org/apache/struts2/views/freemarker/manual-list.ftl</param>
-            </result>
-        </action>
-
-         <action name="test8" class="com.opensymphony.xwork2.ActionSupport">
-            <result type="freemarker">
-                <param 
name="location">org/apache/struts2/views/freemarker/customTextField.ftl</param>
-            </result>
-        </action>
+<struts>
 
-    </package>
+    <bean type="com.opensymphony.xwork2.factory.ResultBuilder"
+          name="myResultBuilder" 
class="org.apache.struts2.factory.MyResultBuilder" />
 
-    <package name="sitegraph" namespace="/tutorial/sitegraph" 
extends="struts-default">
-        <result-types>
-            <result-type name="freemarker" default="true"
-                         
class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
-        </result-types>
+    <constant name="struts.objectFactory.resultBuilder" 
value="myResultBuilder" />
 
-        <action name="guess" class="com.opensymphony.xwork2.ActionSupport">
-            <result name="success" type="redirect">guess-success.jsp</result>
-            <result name="input">guess-input.ftl</result>
-            <result name="error">guess-error.ftl</result>
-        </action>
-    </package>
 </struts>

Added: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/result/ParamNameAwareResult.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/result/ParamNameAwareResult.java?rev=1506872&view=auto
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/result/ParamNameAwareResult.java
 (added)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/result/ParamNameAwareResult.java
 Thu Jul 25 10:03:42 2013
@@ -0,0 +1,10 @@
+package com.opensymphony.xwork2.result;
+
+/**
+ * Accept parameter name/value to be set on {@link 
com.opensymphony.xwork2.Result}
+ */
+public interface ParamNameAwareResult {
+
+    boolean acceptParamName(String name, String value);
+
+}


Reply via email to