You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mr...@apache.org on 2007/12/09 13:11:28 UTC

svn commit: r602665 - in /struts/struts2/trunk: core/src/main/java/org/apache/struts2/components/ core/src/main/java/org/apache/struts2/config/ core/src/main/java/org/apache/struts2/dispatcher/ core/src/main/java/org/apache/struts2/impl/ core/src/main/...

Author: mrdon
Date: Sun Dec  9 04:11:25 2007
New Revision: 602665

URL: http://svn.apache.org/viewvc?rev=602665&view=rev
Log:
Updating Struts to support the new immutable object scheme and the
new xwork capability to limit methods that are called.  Still more to do
here.

WW-2363 XW-595 XW-594

Removed:
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/MethodConfigurationProvider.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/MethodConfigurationProviderTest.java
Modified:
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ActionComponent.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ActionContextCleanUp.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxy.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/validators/DWRValidator.java
    struts/struts2/trunk/core/src/main/resources/template/simple/checkbox.ftl
    struts/struts2/trunk/core/src/main/resources/template/simple/file.ftl
    struts/struts2/trunk/core/src/main/resources/template/simple/password.ftl
    struts/struts2/trunk/core/src/main/resources/template/simple/select.ftl
    struts/struts2/trunk/core/src/main/resources/template/simple/text.ftl
    struts/struts2/trunk/core/src/main/resources/template/simple/textarea.ftl
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptorTest.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java
    struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/codebehind/CodebehindUnknownHandler.java
    struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java
    struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java
    struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/config/ClasspathPackageProviderTest.java
    struts/struts2/trunk/plugins/pom.xml
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
    struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
    struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
    struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionProxyFactory.java
    struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java
    struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java
    struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java
    struts/struts2/trunk/plugins/sitegraph/src/test/resources/org/apache/struts2/sitegraph/out.txt
    struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/TemplatePageFilter.java
    struts/struts2/trunk/plugins/struts1/src/main/java/org/apache/struts2/s1/ActionFormValidationInterceptor.java
    struts/struts2/trunk/plugins/struts1/src/test/java/org/apache/struts2/s1/Struts1FactoryTest.java

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ActionComponent.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ActionComponent.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ActionComponent.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/ActionComponent.java Sun Dec  9 04:11:25 2007
@@ -277,8 +277,7 @@
         // execute at this point, after params have been set
         try {
 
-            proxy = actionProxyFactory.createActionProxy(namespace, actionName, createExtraContext(), executeResult, true);
-            proxy.setMethod(methodName);
+            proxy = actionProxyFactory.createActionProxy(namespace, actionName, methodName, createExtraContext(), executeResult, true);
             // set the new stack into the request for the taglib to use
             req.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
             proxy.execute();

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ActionContextCleanUp.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ActionContextCleanUp.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ActionContextCleanUp.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/ActionContextCleanUp.java Sun Dec  9 04:11:25 2007
@@ -59,7 +59,6 @@
  *
  *
  * @see FilterDispatcher
- * @see AbstractFilter
  * @see Dispatcher
  *
  * @version $Date$ $Id$

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java Sun Dec  9 04:11:25 2007
@@ -464,8 +464,8 @@
 
             Configuration config = configurationManager.getConfiguration();
             ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
-                    namespace, name, extraContext, true, false);
-            proxy.setMethod(method);
+                    namespace, name, method, extraContext, true, false);
+
             request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
 
             // if the ActionMapping says to go straight to a result, do it!
@@ -484,7 +484,7 @@
             LOG.error("Could not find action or result", e);
             sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e);
         } catch (Exception e) {
-            throw new ServletException(e);
+            sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
         } finally {
             UtilTimerStack.pop(timerKey);
         }

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxy.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxy.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxy.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxy.java Sun Dec  9 04:11:25 2007
@@ -32,9 +32,9 @@
 
     private static final long serialVersionUID = -2434901249671934080L;
 
-    public StrutsActionProxy(ActionInvocation inv, String namespace, String actionName, Map extraContext,
-                             boolean executeResult, boolean cleanupContext) throws Exception {
-        super(inv, namespace, actionName, extraContext, executeResult, cleanupContext);
+    public StrutsActionProxy(ActionInvocation inv, String namespace, String actionName, String methodName,
+                             boolean executeResult, boolean cleanupContext) {
+        super(inv, namespace, actionName, methodName, executeResult, cleanupContext);
     }
 
     public String execute() throws Exception {
@@ -54,4 +54,10 @@
                 ActionContext.setContext(previous);
         }
     }
+
+    @Override
+    protected void prepare() {
+        super.prepare();
+    }
+
 }

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/impl/StrutsActionProxyFactory.java Sun Dec  9 04:11:25 2007
@@ -30,9 +30,10 @@
 
 public class StrutsActionProxyFactory extends DefaultActionProxyFactory {
 
-    public ActionProxy createActionProxy(ActionInvocation inv, String namespace, String actionName, Map extraContext, boolean executeResult, boolean cleanupContext) throws Exception {
+    @Override
+    public ActionProxy createActionProxy(ActionInvocation inv, String namespace, String actionName, String methodName, boolean executeResult, boolean cleanupContext) {
         
-        ActionProxy proxy = new StrutsActionProxy(inv, namespace, actionName, extraContext, executeResult, cleanupContext);
+        StrutsActionProxy proxy = new StrutsActionProxy(inv, namespace, actionName, methodName, executeResult, cleanupContext);
         container.inject(proxy);
         proxy.prepare();
         return proxy;

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java Sun Dec  9 04:11:25 2007
@@ -242,8 +242,9 @@
                             "provide an action-specific or global result named '" + WAIT +
                             "'! This requires FreeMarker support and won't work if you don't have it installed");
                     // no wait result? hmm -- let's try to do dynamically put it in for you!
-                    ResultConfig rc = new ResultConfig(WAIT, "org.apache.struts2.views.freemarker.FreemarkerResult",
-                            Collections.singletonMap("location", "/org/apache/struts2/interceptor/wait.ftl"));
+                    ResultConfig rc = new ResultConfig.Builder(WAIT, "org.apache.struts2.views.freemarker.FreemarkerResult")
+                            .addParams(Collections.singletonMap("location", "/org/apache/struts2/interceptor/wait.ftl"))
+                            .build();
                     results.put(WAIT, rc);
                 }
 

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/validators/DWRValidator.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/validators/DWRValidator.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/validators/DWRValidator.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/validators/DWRValidator.java Sun Dec  9 04:11:25 2007
@@ -100,7 +100,7 @@
         try {
             Configuration cfg = du.getConfigurationManager().getConfiguration();
             ActionInvocation inv = new ValidatorActionInvocation(ctx, true);
-            ActionProxy proxy = actionProxyFactory.createActionProxy(inv, namespace, action, ctx, true, true);
+            ActionProxy proxy = actionProxyFactory.createActionProxy(inv, namespace, action, null, true, true);
             proxy.execute();
             Object a = proxy.getAction();
 

Modified: struts/struts2/trunk/core/src/main/resources/template/simple/checkbox.ftl
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/simple/checkbox.ftl?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/template/simple/checkbox.ftl (original)
+++ struts/struts2/trunk/core/src/main/resources/template/simple/checkbox.ftl Sun Dec  9 04:11:25 2007
@@ -36,12 +36,7 @@
 <#if parameters.id?exists>
  id="${parameters.id?html}"<#rt/>
 </#if>
-<#if parameters.cssClass?exists>
- class="${parameters.cssClass?html}"<#rt/>
-</#if>
-<#if parameters.cssStyle?exists>
- style="${parameters.cssStyle?html}"<#rt/>
-</#if>
+<#include "/${parameters.templateDir}/simple/css.ftl" />
 <#if parameters.title?exists>
  title="${parameters.title?html}"<#rt/>
 </#if>

Modified: struts/struts2/trunk/core/src/main/resources/template/simple/file.ftl
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/simple/file.ftl?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/template/simple/file.ftl (original)
+++ struts/struts2/trunk/core/src/main/resources/template/simple/file.ftl Sun Dec  9 04:11:25 2007
@@ -40,12 +40,7 @@
 <#if parameters.id?exists>
  id="${parameters.id?html}"<#rt/>
 </#if>
-<#if parameters.cssClass?exists>
- class="${parameters.cssClass?html}"<#rt/>
-</#if>
-<#if parameters.cssStyle?exists>
- style="${parameters.cssStyle?html}"<#rt/>
-</#if>
+<#include "/${parameters.templateDir}/simple/css.ftl" />
 <#if parameters.title?exists>
  title="${parameters.title?html}"<#rt/>
 </#if>

Modified: struts/struts2/trunk/core/src/main/resources/template/simple/password.ftl
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/simple/password.ftl?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/template/simple/password.ftl (original)
+++ struts/struts2/trunk/core/src/main/resources/template/simple/password.ftl Sun Dec  9 04:11:25 2007
@@ -43,12 +43,7 @@
 <#if parameters.id?exists>
  id="${parameters.id?html}"<#rt/>
 </#if>
-<#if parameters.cssClass?exists>
- class="${parameters.cssClass?html}"<#rt/>
-</#if>
-<#if parameters.cssStyle?exists>
- style="${parameters.cssStyle?html}"<#rt/>
-</#if>
+<#include "/${parameters.templateDir}/simple/css.ftl" />
 <#if parameters.title?exists>
  title="${parameters.title?html}"<#rt/>
 </#if>

Modified: struts/struts2/trunk/core/src/main/resources/template/simple/select.ftl
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/simple/select.ftl?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/template/simple/select.ftl (original)
+++ struts/struts2/trunk/core/src/main/resources/template/simple/select.ftl Sun Dec  9 04:11:25 2007
@@ -35,12 +35,7 @@
 <#if parameters.id?exists>
  id="${parameters.id?html}"<#rt/>
 </#if>
-<#if parameters.cssClass?exists>
- class="${parameters.cssClass?html}"<#rt/>
-</#if>
-<#if parameters.cssStyle?exists>
- style="${parameters.cssStyle?html}"<#rt/>
-</#if>
+<#include "/${parameters.templateDir}/simple/css.ftl" />
 <#if parameters.title?exists>
  title="${parameters.title?html}"<#rt/>
 </#if>

Modified: struts/struts2/trunk/core/src/main/resources/template/simple/text.ftl
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/simple/text.ftl?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/template/simple/text.ftl (original)
+++ struts/struts2/trunk/core/src/main/resources/template/simple/text.ftl Sun Dec  9 04:11:25 2007
@@ -43,12 +43,7 @@
 <#if parameters.id?exists>
  id="${parameters.id?html}"<#rt/>
 </#if>
-<#if parameters.cssClass?exists>
- class="${parameters.cssClass?html}"<#rt/>
-</#if>
-<#if parameters.cssStyle?exists>
- style="${parameters.cssStyle?html}"<#rt/>
-</#if>
+<#include "/${parameters.templateDir}/simple/css.ftl" />
 <#if parameters.title?exists>
  title="${parameters.title?html}"<#rt/>
 </#if>

Modified: struts/struts2/trunk/core/src/main/resources/template/simple/textarea.ftl
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/simple/textarea.ftl?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/template/simple/textarea.ftl (original)
+++ struts/struts2/trunk/core/src/main/resources/template/simple/textarea.ftl Sun Dec  9 04:11:25 2007
@@ -39,12 +39,7 @@
 <#if parameters.id?exists>
  id="${parameters.id?html}"<#rt/>
 </#if>
-<#if parameters.cssClass?exists>
- class="${parameters.cssClass?html}"<#rt/>
-</#if>
-<#if parameters.cssStyle?exists>
- style="${parameters.cssStyle?html}"<#rt/>
-</#if>
+<#include "/${parameters.templateDir}/simple/css.ftl" />
 <#if parameters.title?exists>
  title="${parameters.title?html}"<#rt/>
 </#if>

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java Sun Dec  9 04:11:25 2007
@@ -77,80 +77,58 @@
      * Initializes the configuration object.
      */
     public void loadPackages() {
-        PackageConfig defaultPackageConfig = new PackageConfig("");
-
-        HashMap results = new HashMap();
 
         HashMap successParams = new HashMap();
         successParams.put("propertyName", "executionCount");
         successParams.put("expectedValue", "1");
 
-        ResultConfig successConfig = new ResultConfig(Action.SUCCESS, TestResult.class.getName(), successParams);
-
-        results.put(Action.SUCCESS, successConfig);
-
-        List interceptors = new ArrayList();
-
-        ActionConfig executionCountActionConfig = new ActionConfig(null, ExecutionCountTestAction.class, null, results, interceptors);
-        defaultPackageConfig.addActionConfig(EXECUTION_COUNT_ACTION_NAME, executionCountActionConfig);
-
-        results = new HashMap();
-
-        successParams = new HashMap();
-        successParams.put("location", "success.jsp");
-
-        successConfig = new ResultConfig(Action.SUCCESS, ServletDispatcherResult.class.getName(), successParams);
-
-        results.put(Action.SUCCESS, successConfig);
-
-        interceptors.add(new InterceptorMapping("params", new ParametersInterceptor()));
+        ActionConfig executionCountActionConfig = new ActionConfig.Builder("", "", ExecutionCountTestAction.class.getName())
+            .addResultConfig(new ResultConfig.Builder(Action.SUCCESS, TestResult.class.getName())
+                .addParams(successParams)
+                .build())
+            .build();
+
+
+        ActionConfig testActionConfig = new ActionConfig.Builder("", "", TestAction.class.getName())
+            .addResultConfig(new ResultConfig.Builder(Action.SUCCESS, ServletDispatcherResult.class.getName())
+                    .addParam("location", "success.jsp")
+                    .build())
+            .addInterceptor(new InterceptorMapping("params", new ParametersInterceptor()))
+            .build();
+
+
+        ActionConfig tokenActionConfig = new ActionConfig.Builder("", "", TestAction.class.getName())
+            .addInterceptor(new InterceptorMapping("token", new TokenInterceptor()))
+            .addResultConfig(new ResultConfig.Builder("invalid.token", MockResult.class.getName()).build())
+            .addResultConfig(new ResultConfig.Builder("success", MockResult.class.getName()).build())
+            .build();
 
-        ActionConfig testActionConfig = new ActionConfig(null, TestAction.class, null, results, interceptors);
-        defaultPackageConfig.addActionConfig(TEST_ACTION_NAME, testActionConfig);
-
-        interceptors = new ArrayList();
-        interceptors.add(new InterceptorMapping("token", new TokenInterceptor()));
-
-        results = new HashMap();
-
-        ActionConfig tokenActionConfig = new ActionConfig(null, TestAction.class, null, results, interceptors);
-        tokenActionConfig.addResultConfig(new ResultConfig("invalid.token", MockResult.class.getName()));
-        tokenActionConfig.addResultConfig(new ResultConfig("success", MockResult.class.getName()));
-        defaultPackageConfig.addActionConfig(TOKEN_ACTION_NAME, tokenActionConfig);
-
-        interceptors = new ArrayList();
-        interceptors.add(new InterceptorMapping("token-session", new TokenSessionStoreInterceptor()));
-
-        results = new HashMap();
-
-        successParams = new HashMap();
-        successParams.put("actionName", EXECUTION_COUNT_ACTION_NAME);
-
-        successConfig = new ResultConfig(Action.SUCCESS, ActionChainResult.class.getName(), successParams);
-
-        results.put(Action.SUCCESS, successConfig);
 
         // empty results for token session unit test
-        results = new HashMap();
-        ActionConfig tokenSessionActionConfig = new ActionConfig(null, TestAction.class, null, results, interceptors);
-        tokenSessionActionConfig.addResultConfig(new ResultConfig("invalid.token", MockResult.class.getName()));
-        tokenSessionActionConfig.addResultConfig(new ResultConfig("success", MockResult.class.getName()));
-        defaultPackageConfig.addActionConfig(TOKEN_SESSION_ACTION_NAME, tokenSessionActionConfig);
+        ActionConfig tokenSessionActionConfig = new ActionConfig.Builder("", "", TestAction.class.getName())
+            .addResultConfig(new ResultConfig.Builder("invalid.token", MockResult.class.getName()).build())
+            .addResultConfig(new ResultConfig.Builder("success", MockResult.class.getName()).build())
+            .addInterceptor(new InterceptorMapping("token-session", new TokenSessionStoreInterceptor()))
+            .build();
+
+        PackageConfig defaultPackageConfig = new PackageConfig.Builder("")
+            .addActionConfig(EXECUTION_COUNT_ACTION_NAME, executionCountActionConfig)
+            .addActionConfig(TEST_ACTION_NAME, testActionConfig)
+            .addActionConfig(TOKEN_ACTION_NAME, tokenActionConfig)
+            .addActionConfig(TOKEN_SESSION_ACTION_NAME, tokenSessionActionConfig)
+            .addActionConfig("testActionTagAction", new ActionConfig.Builder("", "", TestAction.class.getName())
+                .addResultConfig(new ResultConfig.Builder(Action.SUCCESS, TestActionTagResult.class.getName()).build())
+                .addResultConfig(new ResultConfig.Builder(Action.INPUT, TestActionTagResult.class.getName()).build())
+                .build())
+            .build();
 
         configuration.addPackageConfig("", defaultPackageConfig);
 
-        Map testActionTagResults = new HashMap();
-        testActionTagResults.put(Action.SUCCESS, new ResultConfig(Action.SUCCESS, TestActionTagResult.class.getName(), new HashMap()));
-        testActionTagResults.put(Action.INPUT, new ResultConfig(Action.INPUT, TestActionTagResult.class.getName(), new HashMap()));
-        ActionConfig testActionTagActionConfig = new ActionConfig((String) null, TestAction.class, (Map) null, testActionTagResults, new ArrayList());
-        defaultPackageConfig.addActionConfig("testActionTagAction", testActionTagActionConfig);
-
-        PackageConfig namespacePackageConfig = new PackageConfig("namespacePackage");
-        namespacePackageConfig.setNamespace(TEST_NAMESPACE);
-        namespacePackageConfig.addParent(defaultPackageConfig);
-
-        ActionConfig namespaceAction = new ActionConfig(null, TestAction.class, null, null, null);
-        namespacePackageConfig.addActionConfig(TEST_NAMESPACE_ACTION, namespaceAction);
+        PackageConfig namespacePackageConfig = new PackageConfig.Builder("namespacePackage")
+            .namespace(TEST_NAMESPACE)
+            .addParent(defaultPackageConfig)
+            .addActionConfig(TEST_NAMESPACE_ACTION, new ActionConfig.Builder("", "", TestAction.class.getName()).build())
+            .build();
 
         configuration.addPackageConfig("namespacePackage", namespacePackageConfig);
     }

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletActionRedirectResultTest.java Sun Dec  9 04:11:25 2007
@@ -46,17 +46,18 @@
 
     public void testIncludeParameterInResultWithConditionParseOn() throws Exception {
 
-        ResultConfig resultConfig = new ResultConfig();
-        resultConfig.addParam("actionName", "someActionName");
-        resultConfig.addParam("namespace", "someNamespace");
-        resultConfig.addParam("encode", "true");
-        resultConfig.addParam("parse", "true");
-        resultConfig.addParam("location", "someLocation");
-        resultConfig.addParam("prependServletContext", "true");
-        resultConfig.addParam("method", "someMethod");
-        resultConfig.addParam("param1", "${#value1}");
-        resultConfig.addParam("param2", "${#value2}");
-        resultConfig.addParam("param3", "${#value3}");
+        ResultConfig resultConfig = new ResultConfig.Builder("", "")
+            .addParam("actionName", "someActionName")
+            .addParam("namespace", "someNamespace")
+            .addParam("encode", "true")
+            .addParam("parse", "true")
+            .addParam("location", "someLocation")
+            .addParam("prependServletContext", "true")
+            .addParam("method", "someMethod")
+            .addParam("param1", "${#value1}")
+            .addParam("param2", "${#value2}")
+            .addParam("param3", "${#value3}")
+            .build();
 
 
 
@@ -74,8 +75,8 @@
         Map<String, ResultConfig> results=  new HashMap<String, ResultConfig>();
         results.put("myResult", resultConfig);
 
-        ActionConfig actionConfig = new ActionConfig();
-        actionConfig.setResults(results);
+        ActionConfig actionConfig = new ActionConfig.Builder("", "", "")
+                .addResultConfigs(results).build();
 
         ServletActionRedirectResult result = new ServletActionRedirectResult();
         result.setActionName("myAction");
@@ -109,17 +110,18 @@
 
     public void testIncludeParameterInResult() throws Exception {
 
-        ResultConfig resultConfig = new ResultConfig();
-        resultConfig.addParam("actionName", "someActionName");
-        resultConfig.addParam("namespace", "someNamespace");
-        resultConfig.addParam("encode", "true");
-        resultConfig.addParam("parse", "true");
-        resultConfig.addParam("location", "someLocation");
-        resultConfig.addParam("prependServletContext", "true");
-        resultConfig.addParam("method", "someMethod");
-        resultConfig.addParam("param1", "value 1");
-        resultConfig.addParam("param2", "value 2");
-        resultConfig.addParam("param3", "value 3");
+        ResultConfig resultConfig = new ResultConfig.Builder("", "")
+            .addParam("actionName", "someActionName")
+            .addParam("namespace", "someNamespace")
+            .addParam("encode", "true")
+            .addParam("parse", "true")
+            .addParam("location", "someLocation")
+            .addParam("prependServletContext", "true")
+            .addParam("method", "someMethod")
+            .addParam("param1", "value 1")
+            .addParam("param2", "value 2")
+            .addParam("param3", "value 3")
+            .build();
 
         ActionContext context = ActionContext.getContext();
         MockHttpServletRequest req = new MockHttpServletRequest();
@@ -131,8 +133,8 @@
         Map<String, ResultConfig> results=  new HashMap<String, ResultConfig>();
         results.put("myResult", resultConfig);
 
-        ActionConfig actionConfig = new ActionConfig();
-        actionConfig.setResults(results);
+        ActionConfig actionConfig = new ActionConfig.Builder("", "", "")
+                .addResultConfigs(results).build();
 
         ServletActionRedirectResult result = new ServletActionRedirectResult();
         result.setActionName("myAction");

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/ServletRedirectResultTest.java Sun Dec  9 04:11:25 2007
@@ -140,8 +140,7 @@
     protected void setUp() throws Exception {
         super.setUp();
         configurationManager.getConfiguration().
-            addPackageConfig("foo", new PackageConfig("foo", "/namespace", false, null));
-
+            addPackageConfig("foo", new PackageConfig.Builder("foo").namespace("/namespace").build());
 
         view = new ServletRedirectResult();
         container.inject(view);

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Sun Dec  9 04:11:25 2007
@@ -62,8 +62,9 @@
         req.setupGetContextPath("/my/namespace");
 
         config = new DefaultConfiguration();
-        PackageConfig pkg = new PackageConfig("myns", "/my/namespace", false, null);
-        PackageConfig pkg2 = new PackageConfig("my", "/my", false, null);
+        PackageConfig pkg = new PackageConfig.Builder("myns")
+            .namespace("/my/namespace").build();
+        PackageConfig pkg2 = new PackageConfig.Builder("my").namespace("/my").build();
         config.addPackageConfig("mvns", pkg);
         config.addPackageConfig("my", pkg2);
         configManager = new ConfigurationManager() {

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java Sun Dec  9 04:11:25 2007
@@ -47,8 +47,10 @@
         req.setupGetContextPath("/my/namespace");
 
         config = new DefaultConfiguration();
-        PackageConfig pkg = new PackageConfig("myns", "/my/namespace", false, null);
-        PackageConfig pkg2 = new PackageConfig("my", "/my", false, null);
+        PackageConfig pkg = new PackageConfig.Builder("myns")
+            .namespace("/my/namespace").build();
+        PackageConfig pkg2 = new PackageConfig.Builder("my")
+            .namespace("/my").build();
         config.addPackageConfig("mvns", pkg);
         config.addPackageConfig("my", pkg2);
         configManager = new ConfigurationManager() {

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptorTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptorTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptorTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptorTest.java Sun Dec  9 04:11:25 2007
@@ -170,7 +170,7 @@
     }
 
     protected ActionProxy buildProxy(String actionName) throws Exception {
-        return actionProxyFactory.createActionProxy("", actionName, context);
+        return actionProxyFactory.createActionProxy("", actionName, null, context);
     }
 
     protected void setUp() throws Exception {
@@ -211,21 +211,19 @@
         }
 
         public void loadPackages() throws ConfigurationException {
-            PackageConfig wait = new PackageConfig("");
 
-            Map results = new HashMap();
-            results.put(Action.SUCCESS, new ResultConfig(Action.SUCCESS, MockResult.class.getName(), null));
-            results.put(ExecuteAndWaitInterceptor.WAIT, new ResultConfig(ExecuteAndWaitInterceptor.WAIT, MockResult.class.getName(), null));
 
             // interceptors
             waitInterceptor = new ExecuteAndWaitInterceptor();
-            List interceptors = new ArrayList();
-            interceptors.add(new InterceptorMapping("params", new ParametersInterceptor()));
-            interceptors.add(new InterceptorMapping("execAndWait", waitInterceptor));
-
-            ActionConfig ac = new ActionConfig(null, ExecuteAndWaitDelayAction.class, null, results, interceptors);
-            wait.addActionConfig("action1", ac);
 
+            PackageConfig wait = new PackageConfig.Builder("")
+                .addActionConfig("action1", new ActionConfig.Builder("", "action1", ExecuteAndWaitDelayAction.class.getName())
+                    .addResultConfig(new ResultConfig.Builder(Action.SUCCESS, MockResult.class.getName()).build())
+                    .addResultConfig(new ResultConfig.Builder(ExecuteAndWaitInterceptor.WAIT, MockResult.class.getName()).build())
+                    .addInterceptor(new InterceptorMapping("params", new ParametersInterceptor()))
+                    .addInterceptor(new InterceptorMapping("execAndWait", waitInterceptor))
+                .build())
+            .build();
             configuration.addPackageConfig("", wait);
         }
 

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java Sun Dec  9 04:11:25 2007
@@ -156,16 +156,14 @@
                 public RuntimeConfiguration getRuntimeConfiguration() {
                     return new RuntimeConfiguration() {
                         public ActionConfig getActionConfig(String namespace, String name) {
-                            ActionConfig actionConfig = new ActionConfig() {
+                            ActionConfig actionConfig = new ActionConfig("", name, "") {
                                 public List getInterceptors() {
                                     List interceptors = new ArrayList();
 
                                     ValidationInterceptor validationInterceptor = new ValidationInterceptor();
                                     validationInterceptor.setIncludeMethods("*");
 
-                                    InterceptorMapping interceptorMapping = new InterceptorMapping();
-                                    interceptorMapping.setName("validation");
-                                    interceptorMapping.setInterceptor(validationInterceptor);
+                                    InterceptorMapping interceptorMapping = new InterceptorMapping("validation", validationInterceptor);
                                     interceptors.add(interceptorMapping);
 
                                     return interceptors;
@@ -249,16 +247,14 @@
                 public RuntimeConfiguration getRuntimeConfiguration() {
                     return new RuntimeConfiguration() {
                         public ActionConfig getActionConfig(String namespace, String name) {
-                            ActionConfig actionConfig = new ActionConfig() {
+                            ActionConfig actionConfig = new ActionConfig("", name, "") {
                                 public List getInterceptors() {
                                     List interceptors = new ArrayList();
 
                                     ValidationInterceptor validationInterceptor = new ValidationInterceptor();
                                     validationInterceptor.setExcludeMethods("*");
 
-                                    InterceptorMapping interceptorMapping = new InterceptorMapping();
-                                    interceptorMapping.setName("validation");
-                                    interceptorMapping.setInterceptor(validationInterceptor);
+                                    InterceptorMapping interceptorMapping = new InterceptorMapping("validation", validationInterceptor);
                                     interceptors.add(interceptorMapping);
 
                                     return interceptors;

Modified: struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/codebehind/CodebehindUnknownHandler.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/codebehind/CodebehindUnknownHandler.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/codebehind/CodebehindUnknownHandler.java (original)
+++ struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/codebehind/CodebehindUnknownHandler.java Sun Dec  9 04:11:25 2007
@@ -120,19 +120,15 @@
     }
 
     protected ActionConfig buildActionConfig(String path, String namespace, String actionName, ResultTypeConfig resultTypeConfig) {
-        Map<String,ResultConfig> results = new HashMap<String,ResultConfig>();
-        HashMap params = new HashMap();
-        if (resultTypeConfig.getParams() != null) {
-            params.putAll(resultTypeConfig.getParams());
-        }
-        params.put(resultTypeConfig.getDefaultResultParam(), path);
-        
         PackageConfig pkg = configuration.getPackageConfig(defaultPackageName);
-        List interceptors = InterceptorBuilder.constructInterceptorReference(pkg, pkg.getFullDefaultInterceptorRef(), 
-                Collections.EMPTY_MAP, null, objectFactory); 
-        ResultConfig config = new ResultConfig(Action.SUCCESS, resultTypeConfig.getClazz(), params);
-        results.put(Action.SUCCESS, config);
-        return new ActionConfig("execute", ActionSupport.class.getName(), defaultPackageName, new HashMap(), results, interceptors);
+        return new ActionConfig.Builder(defaultPackageName, "execute", ActionSupport.class.getName())
+                .addInterceptors(InterceptorBuilder.constructInterceptorReference(pkg, pkg.getFullDefaultInterceptorRef(),
+                Collections.EMPTY_MAP, null, objectFactory))
+                .addResultConfig(new ResultConfig.Builder(Action.SUCCESS, resultTypeConfig.getClassName())
+                        .addParams(resultTypeConfig.getParams())
+                        .addParam(resultTypeConfig.getDefaultResultParam(), path)
+                        .build())
+                .build();
     }
 
     public Result handleUnknownResult(ActionContext actionContext, String actionName, 
@@ -172,15 +168,10 @@
     }
     
     protected Result buildResult(String path, String resultCode, ResultTypeConfig config, ActionContext invocationContext) {
-        String resultClass = config.getClazz();
-
-        Map<String,String> params = new LinkedHashMap<String,String>();
-        if (config.getParams() != null) {
-            params.putAll(config.getParams());
-        }
-        params.put(config.getDefaultResultParam(), path);
-
-        ResultConfig resultConfig = new ResultConfig(resultCode, resultClass, params);
+        ResultConfig resultConfig = new ResultConfig.Builder(resultCode, config.getClassName())
+            .addParams(config.getParams())
+            .addParam(config.getDefaultResultParam(), path)
+            .build();
         try {
             return objectFactory.buildResult(resultConfig, invocationContext.getContextMap());
         } catch (Exception e) {

Modified: struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java (original)
+++ struts/struts2/trunk/plugins/codebehind/src/main/java/org/apache/struts2/config/ClasspathPackageProvider.java Sun Dec  9 04:11:25 2007
@@ -24,9 +24,7 @@
 import java.lang.reflect.Modifier;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import javax.servlet.ServletContext;
 
@@ -123,12 +121,7 @@
      */
     private boolean initialized = false;
 
-    /**
-     * The package configurations for scanned Actions.
-     *
-     * @see #loadPackageConfig
-     */
-    private Map<String,PackageConfig> loadedPackageConfigs = new HashMap<String,PackageConfig>();
+    private PackageLoader packageLoader;
 
     /**
      * Logging instance for this class.
@@ -235,6 +228,7 @@
      */
     protected void loadPackages(String[] pkgs) {
 
+        packageLoader = new PackageLoader();
         ResolverUtil<Class> resolver = new ResolverUtil<Class>();
         resolver.find(createActionClassTest(), pkgs);
 
@@ -246,8 +240,8 @@
            }
         }
 
-        for (String key : loadedPackageConfigs.keySet()) {
-            configuration.addPackageConfig(key, loadedPackageConfigs.get(key));
+        for (PackageConfig config : packageLoader.createPackageConfigs()) {
+            configuration.addPackageConfig(config.getName(), config);
         }
     }
 
@@ -279,7 +273,6 @@
      * @param pkgs List of packages that were scanned for Actions
      */
     protected void processActionClass(Class<?> cls, String[] pkgs) {
-        ActionConfig actionConfig = new ActionConfig();
         String name = cls.getName();
         String actionPackage = cls.getPackage().getName();
         String actionNamespace = null;
@@ -328,7 +321,7 @@
             }
         }
 
-        PackageConfig pkgConfig = loadPackageConfig(actionNamespace, actionPackage, cls);
+        PackageConfig.Builder pkgConfig = loadPackageConfig(actionNamespace, actionPackage, cls);
 
         // In case the package changed due to namespace annotation processing
         if (!actionPackage.equals(pkgConfig.getName())) {
@@ -345,14 +338,14 @@
             pkgConfig.addParent(parentPkg);
 
             if (!TextUtils.stringSet(pkgConfig.getNamespace()) && TextUtils.stringSet(parentPkg.getNamespace())) {
-                pkgConfig.setNamespace(parentPkg.getNamespace());
+                pkgConfig.namespace(parentPkg.getNamespace());
             }
         }
 
-        actionConfig.setClassName(cls.getName());
-        actionConfig.setPackageName(actionPackage);
-
-        actionConfig.setResults(new ResultMap<String,ResultConfig>(cls, actionName, pkgConfig));
+        ResultTypeConfig defaultResultType = packageLoader.getDefaultResultType(pkgConfig);
+        ActionConfig actionConfig = new ActionConfig.Builder(actionPackage, actionName, cls.getName())
+                .addResultConfigs(new ResultMap<String,ResultConfig>(cls, actionName, defaultResultType))
+                .build();
         pkgConfig.addActionConfig(actionName, actionConfig);
     }
 
@@ -367,8 +360,8 @@
      * @param actionClass The Action class instance
      * @return PackageConfig object for the Action class
      */
-    protected PackageConfig loadPackageConfig(String actionNamespace, String actionPackage, Class actionClass) {
-        PackageConfig parent = null;
+    protected PackageConfig.Builder loadPackageConfig(String actionNamespace, String actionPackage, Class actionClass) {
+        PackageConfig.Builder parent = null;
 
         // Check for the @Namespace annotation
         if (actionClass != null) {
@@ -391,29 +384,34 @@
         }
 
         
-        PackageConfig pkgConfig = loadedPackageConfigs.get(actionPackage);
+        PackageConfig.Builder pkgConfig = packageLoader.getPackage(actionPackage);
         if (pkgConfig == null) {
-            pkgConfig = new PackageConfig();
-            pkgConfig.setName(actionPackage);
-
-            if (parent == null) {
-                parent = configuration.getPackageConfig(defaultParentPackage);
-            }
+            pkgConfig = new PackageConfig.Builder(actionPackage);
 
+            pkgConfig.namespace(actionNamespace);
             if (parent == null) {
-                throw new ConfigurationException("ClasspathPackageProvider: Unable to locate default parent package: " +
+                PackageConfig cfg = configuration.getPackageConfig(defaultParentPackage);
+                if (cfg != null) {
+                    pkgConfig.addParent(cfg);
+                } else {
+                    throw new ConfigurationException("ClasspathPackageProvider: Unable to locate default parent package: " +
                         defaultParentPackage);
+                }
             }
-            pkgConfig.addParent(parent);
 
-            pkgConfig.setNamespace(actionNamespace);
+            packageLoader.registerPackage(pkgConfig);
 
-            loadedPackageConfigs.put(actionPackage, pkgConfig);
-            
         // if the parent package was first created by a child, ensure the namespace is correct
         } else if (pkgConfig.getNamespace() == null) {
-            pkgConfig.setNamespace(actionNamespace);
+            pkgConfig.namespace(actionNamespace);
+        }
+
+        if (parent != null) {
+            packageLoader.registerChildToParent(pkgConfig, parent);
         }
+
+        System.out.println("class:"+actionClass+" parent:"+parent+" current:"+(pkgConfig != null ? pkgConfig.getName() : ""));
+        
         return pkgConfig;
     }
 
@@ -439,7 +437,6 @@
      * @throws ConfigurationException
      */
     public void loadPackages() throws ConfigurationException {
-        loadedPackageConfigs.clear();
         if (actionPackages != null) {
             String[] names = actionPackages.split("\\s*[,]\\s*");
             // Initialize the classloader scanner with the configured packages
@@ -467,12 +464,12 @@
     class ResultMap<K,V> extends HashMap<K,V> {
         private Class actionClass;
         private String actionName;
-        private PackageConfig pkgConfig;
+        private ResultTypeConfig defaultResultType;
 
-        public ResultMap(Class actionClass, String actionName, PackageConfig pkgConfig) {
+        public ResultMap(Class actionClass, String actionName, ResultTypeConfig defaultResultType) {
             this.actionClass = actionClass;
             this.actionName = actionName;
-            this.pkgConfig = pkgConfig;
+            this.defaultResultType = defaultResultType;
 
             // check if any annotations are around
             while (!actionClass.getName().equals(Object.class.getName())) {
@@ -543,10 +540,8 @@
                                                 String location,
                                                 Map<? extends Object,? extends Object > configParams) {
             if (resultClass == null) {
-                String defaultResultType = pkgConfig.getFullDefaultResultType();
-                ResultTypeConfig resultType = pkgConfig.getAllResultTypeConfigs().get(defaultResultType);
-                configParams = resultType.getParams();
-                String className = resultType.getClazz();
+                configParams = defaultResultType.getParams();
+                String className = defaultResultType.getClassName();
                 try {
                     resultClass = ClassLoaderUtil.loadClass(className, getClass());
                 } catch (ClassNotFoundException ex) {
@@ -568,7 +563,7 @@
             }
 
             params.put(defaultParam, location);
-            return new ResultConfig((String) key, resultClass.getName(), params);
+            return new ResultConfig.Builder((String) key, resultClass.getName()).addParams(params).build();
         }
     }
 
@@ -596,6 +591,70 @@
                 }
             }
             return url;
+        }
+    }
+
+    private static class PackageLoader {
+
+        /**
+         * The package configurations for scanned Actions.
+         */
+        private Map<String,PackageConfig.Builder> packageConfigBuilders = new HashMap<String,PackageConfig.Builder>();
+
+        private Map<PackageConfig.Builder,PackageConfig.Builder> childToParent = new HashMap<PackageConfig.Builder,PackageConfig.Builder>();
+
+        public PackageConfig.Builder getPackage(String name) {
+            return packageConfigBuilders.get(name);
+        }
+
+        public void registerChildToParent(PackageConfig.Builder child, PackageConfig.Builder parent) {
+            childToParent.put(child, parent);
+        }
+
+        public void registerPackage(PackageConfig.Builder builder) {
+            packageConfigBuilders.put(builder.getName(), builder);
+        }
+
+        public Collection<PackageConfig> createPackageConfigs() {
+            Map<String, PackageConfig> configs = new HashMap<String, PackageConfig>();
+
+            Set<PackageConfig.Builder> builders;
+            while ((builders = findPackagesWithNoParents()).size() > 0) {
+                for (PackageConfig.Builder parent : builders) {
+                    PackageConfig config = parent.build();
+                    configs.put(config.getName(), config);
+                    packageConfigBuilders.remove(config.getName());
+
+                    for (Iterator<Map.Entry<PackageConfig.Builder,PackageConfig.Builder>> i = childToParent.entrySet().iterator(); i.hasNext(); ) {
+                        Map.Entry<PackageConfig.Builder,PackageConfig.Builder> entry = i.next();
+                        if (entry.getValue() == parent) {
+                            entry.getKey().addParent(config);
+                            i.remove();
+                        }
+                    }
+                }
+            }
+            return configs.values();
+        }
+
+        Set<PackageConfig.Builder> findPackagesWithNoParents() {
+            Set<PackageConfig.Builder> builders = new HashSet<PackageConfig.Builder>();
+            for (PackageConfig.Builder child : packageConfigBuilders.values()) {
+                if (!childToParent.containsKey(child)) {
+                    builders.add(child);
+                }
+            }
+            return builders;
+        }
+
+        public ResultTypeConfig getDefaultResultType(PackageConfig.Builder pkgConfig) {
+            PackageConfig.Builder parent;
+            PackageConfig.Builder current = pkgConfig;
+
+            while ((parent = childToParent.get(current)) != null) {
+                current = parent;
+            }
+            return current.getResultType(current.getFullDefaultResultType());
         }
     }
 }

Modified: struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java (original)
+++ struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/codebehind/CodebehindUnknownHandlerTest.java Sun Dec  9 04:11:25 2007
@@ -61,7 +61,7 @@
 
     public void testBuildResult() {
         ActionContext ctx = new ActionContext(new HashMap());
-        ResultTypeConfig config = new ResultTypeConfig("null", SomeResult.class.getName(), "location");
+        ResultTypeConfig config = new ResultTypeConfig.Builder("null", SomeResult.class.getName()).defaultResultParam("location").build();
         
         Result result = handler.buildResult("/foo.jsp", "success", config, ctx);
         assertNotNull(result);

Modified: struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/config/ClasspathPackageProviderTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/config/ClasspathPackageProviderTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/config/ClasspathPackageProviderTest.java (original)
+++ struts/struts2/trunk/plugins/codebehind/src/test/java/org/apache/struts2/config/ClasspathPackageProviderTest.java Sun Dec  9 04:11:25 2007
@@ -44,12 +44,16 @@
         provider = new ClasspathPackageProvider();
         provider.setActionPackages("org.apache.struts2.config");
         config = new DefaultConfiguration();
-        PackageConfig strutsDefault = new PackageConfig("struts-default");
-        strutsDefault.addResultTypeConfig(new ResultTypeConfig("dispatcher", ServletDispatcherResult.class.getName(), "location"));
-        strutsDefault.setDefaultResultType("dispatcher");
+        PackageConfig strutsDefault = new PackageConfig.Builder("struts-default")
+                .addResultTypeConfig(new ResultTypeConfig.Builder("dispatcher", ServletDispatcherResult.class.getName())
+                        .defaultResultParam("location")
+                        .build())
+                .defaultResultType("dispatcher")
+                .build();
         config.addPackageConfig("struts-default", strutsDefault);
-        PackageConfig customPackage = new PackageConfig("custom-package");
-        customPackage.setNamespace("/custom");
+        PackageConfig customPackage = new PackageConfig.Builder("custom-package")
+            .namespace("/custom")
+            .build();
         config.addPackageConfig("custom-package", customPackage);
         provider.init(config);
         provider.loadPackages();
@@ -59,7 +63,7 @@
         provider = null;
         config = null;
     }
-    
+
     public void testFoundRootPackages() {
         assertEquals(6, config.getPackageConfigs().size());
         PackageConfig pkg = config.getPackageConfig("org.apache.struts2.config");

Modified: struts/struts2/trunk/plugins/pom.xml
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/pom.xml?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/pom.xml (original)
+++ struts/struts2/trunk/plugins/pom.xml Sun Dec  9 04:11:25 2007
@@ -55,7 +55,7 @@
         <module>tiles</module>
         <module>dojo</module>
         <module>rest</module>
-    <module>portlet</module>
+        <module>portlet</module>
     </modules>
 
     <dependencies>

Modified: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java (original)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java Sun Dec  9 04:11:25 2007
@@ -439,8 +439,7 @@
             LOG.debug("Creating action proxy for name = " + actionName
                     + ", namespace = " + namespace);
             ActionProxy proxy = factory.createActionProxy(namespace,
-                    actionName, extraContext);
-            proxy.setMethod(mapping.getMethod());
+                    actionName, mapping.getMethod(), extraContext);
             request.setAttribute("struts.valueStack", proxy.getInvocation()
                     .getStack());
             proxy.execute();

Modified: struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java (original)
+++ struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java Sun Dec  9 04:11:25 2007
@@ -115,11 +115,10 @@
         mockActionProxy = mock(ActionProxy.class);
         mockInvocation = mock(ActionInvocation.class);
 
-        mockActionFactory.expects(once()).method("createActionProxy").with(new Constraint[]{eq(namespace), eq(actionName), isA(Map.class)}).will(returnValue(mockActionProxy.proxy()));
+        mockActionFactory.expects(once()).method("createActionProxy").with(new Constraint[]{eq(namespace), eq(actionName), NULL, isA(Map.class)}).will(returnValue(mockActionProxy.proxy()));
         mockActionProxy.stubs().method("getAction").will(returnValue(mockAction.proxy()));
         mockActionProxy.expects(once()).method("execute").will(returnValue(result));
         mockActionProxy.expects(once()).method("getInvocation").will(returnValue(mockInvocation.proxy()));
-        mockActionProxy.expects(once()).method("setMethod");
         mockInvocation.stubs().method("getStack").will(returnValue(stack));
 
     }
@@ -243,11 +242,6 @@
         mockRequest.stubs().method("getWindowState").will(returnValue(state));
     }
 
-    /**
-     * @param requestParams
-     * @param mockRequest2
-     * @param string
-     */
     private void setupParamStub(Map requestParams, Mock mockRequest, String method) {
         Map newMap = new HashMap();
         Iterator it = requestParams.keySet().iterator();

Modified: struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java (original)
+++ struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java Sun Dec  9 04:11:25 2007
@@ -78,7 +78,7 @@
     
     private ContentTypeHandlerManager handlerSelector;
 
-    protected RestActionInvocation(Map extraContext, boolean pushAction) throws Exception {
+    protected RestActionInvocation(Map extraContext, boolean pushAction) {
         super(extraContext, pushAction);
     }
 

Modified: struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionProxyFactory.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionProxyFactory.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionProxyFactory.java (original)
+++ struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionProxyFactory.java Sun Dec  9 04:11:25 2007
@@ -35,10 +35,11 @@
  */
 public class RestActionProxyFactory extends DefaultActionProxyFactory {
 
-    public ActionProxy createActionProxy(String namespace, String actionName, Map extraContext, boolean executeResult, boolean cleanupContext) throws Exception {
+    @Override
+    public ActionProxy createActionProxy(String namespace, String actionName, String methodName, Map extraContext, boolean executeResult, boolean cleanupContext) {
         ActionInvocation inv = new RestActionInvocation(extraContext, true);
         container.inject(inv);
-        return createActionProxy(inv, namespace, actionName, extraContext, executeResult, cleanupContext);
+        return createActionProxy(inv, namespace, actionName, methodName, executeResult, cleanupContext);
     }
 
 }

Modified: struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java (original)
+++ struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java Sun Dec  9 04:11:25 2007
@@ -43,7 +43,7 @@
  * An interceptor that makes sure there are not validation errors before allowing the interceptor chain to continue.
  * <b>This interceptor does not perform any validation</b>.
  * 
- * <p>Copied from the {@link DefaultWorkflowInterceptor}, this interceptor adds support for error handling of Restful
+ * <p>Copied from the {@link com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor}, this interceptor adds support for error handling of Restful
  * operations.  For example, if an validation error is discovered, a map of errors is created and processed to be
  * returned, using the appropriate content handler for rendering the body.</p>
  *

Modified: struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java (original)
+++ struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java Sun Dec  9 04:11:25 2007
@@ -79,7 +79,7 @@
         };
         mgr.handlers.put("xml", handler);
         mgr.defaultExtension = "xml";
-        mgr.handleResult(new ActionConfig(), new DefaultHttpHeaders().withStatus(SC_OK), obj);
+        mgr.handleResult(new ActionConfig.Builder("", "", "").build(), new DefaultHttpHeaders().withStatus(SC_OK), obj);
 
         assertEquals(obj.getBytes().length, mockResponse.getContentLength());
     }

Modified: struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java (original)
+++ struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java Sun Dec  9 04:11:25 2007
@@ -24,8 +24,8 @@
         mapper = new RestActionMapper();
 
         config = new DefaultConfiguration();
-        PackageConfig pkg = new PackageConfig("myns", "/animals", false, null);
-        PackageConfig pkg2 = new PackageConfig("my", "/my", false, null);
+        PackageConfig pkg = new PackageConfig.Builder("myns").namespace("/animals").build();
+        PackageConfig pkg2 = new PackageConfig.Builder("my").namespace("/my").build();
         config.addPackageConfig("mvns", pkg);
         config.addPackageConfig("my", pkg2);
         configManager = new ConfigurationManager() {

Modified: struts/struts2/trunk/plugins/sitegraph/src/test/resources/org/apache/struts2/sitegraph/out.txt
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/sitegraph/src/test/resources/org/apache/struts2/sitegraph/out.txt?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/sitegraph/src/test/resources/org/apache/struts2/sitegraph/out.txt (original)
+++ struts/struts2/trunk/plugins/sitegraph/src/test/resources/org/apache/struts2/sitegraph/out.txt Sun Dec  9 04:11:25 2007
@@ -12,9 +12,9 @@
             fontcolor=grey;
             label="sitegraph";
             tutorial_sitegraph_guess [label="guess",color="coral1"];
-            tutorial_sitegraph_guess_error_ftl [label="guess-error.ftl",color="darkseagreen2"];
-            tutorial_sitegraph_guess_input_ftl [label="guess-input.ftl",color="darkseagreen2"];
             tutorial_sitegraph_guess_success_jsp [label="guess-success.jsp",color="darkseagreen2"];
+            tutorial_sitegraph_guess_input_ftl [label="guess-input.ftl",color="darkseagreen2"];
+            tutorial_sitegraph_guess_error_ftl [label="guess-error.ftl",color="darkseagreen2"];
         }
         tutorial_test [label="test",color="coral1"];
         tutorial_guess_input_ftl [label="guess-input.ftl",color="darkseagreen2"];

Modified: struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/TemplatePageFilter.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/TemplatePageFilter.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/TemplatePageFilter.java (original)
+++ struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/TemplatePageFilter.java Sun Dec  9 04:11:25 2007
@@ -185,7 +185,7 @@
         public void setActionEventListener(ActionEventListener listener) {
         }
 
-        public void init(ActionProxy proxy) throws Exception {
+        public void init(ActionProxy proxy) {
         }
     }
 }

Modified: struts/struts2/trunk/plugins/struts1/src/main/java/org/apache/struts2/s1/ActionFormValidationInterceptor.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/struts1/src/main/java/org/apache/struts2/s1/ActionFormValidationInterceptor.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/struts1/src/main/java/org/apache/struts2/s1/ActionFormValidationInterceptor.java (original)
+++ struts/struts2/trunk/plugins/struts1/src/main/java/org/apache/struts2/s1/ActionFormValidationInterceptor.java Sun Dec  9 04:11:25 2007
@@ -208,7 +208,7 @@
     }
 
     /**
-     * @param pathnames the pathnames to set
+     * @param pathNames the pathnames to set
      */
     public void setPathnames(String pathNames) {
         this.pathnames = pathNames;

Modified: struts/struts2/trunk/plugins/struts1/src/test/java/org/apache/struts2/s1/Struts1FactoryTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/struts1/src/test/java/org/apache/struts2/s1/Struts1FactoryTest.java?rev=602665&r1=602664&r2=602665&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/struts1/src/test/java/org/apache/struts2/s1/Struts1FactoryTest.java (original)
+++ struts/struts2/trunk/plugins/struts1/src/test/java/org/apache/struts2/s1/Struts1FactoryTest.java Sun Dec  9 04:11:25 2007
@@ -138,7 +138,7 @@
 
         ExceptionConfig[] exceptionConfigs = mapping.findExceptionConfigs();
         assertNotNull(exceptionConfigs);
-        assertEquals(3, exceptionConfigs.length);
+        assertEquals(2, exceptionConfigs.length);
         
         ModuleConfig moduleConfig = mapping.getModuleConfig();
         assertNotNull(moduleConfig);