You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2026/03/16 06:25:36 UTC

(struts) branch release/struts-6-8-x updated: WW-2963 fix(core): resolve default-action-ref via wildcard matching (#1623)

This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch release/struts-6-8-x
in repository https://gitbox.apache.org/repos/asf/struts.git


The following commit(s) were added to refs/heads/release/struts-6-8-x by this push:
     new 0c4762791 WW-2963 fix(core): resolve default-action-ref via wildcard matching (#1623)
0c4762791 is described below

commit 0c476279108c4b7c383c2554c84ac4a9065bf0d9
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Mon Mar 16 07:25:30 2026 +0100

    WW-2963 fix(core): resolve default-action-ref via wildcard matching (#1623)
    
    When a default-action-ref points to an action name that only exists as a
    wildcard pattern (e.g. "movie-input" matching "movie-*"), the framework
    now falls back to wildcard matching after the exact lookup fails.
    
    Port of PR #1614 from Struts 7 to Struts 6.x.
    
    Co-authored-by: Claude Opus 4.6 <no...@anthropic.com>
---
 .../xwork2/config/impl/DefaultConfiguration.java    |  3 +++
 .../xwork2/config/ConfigurationTest.java            | 20 ++++++++++++++++++++
 core/src/test/resources/xwork-sample.xml            | 21 +++++++++++++++++++++
 3 files changed, 44 insertions(+)

diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
index a2f73879d..b821f7f88 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
@@ -622,6 +622,9 @@ public class DefaultConfiguration implements Configuration {
                         String defaultActionRef = namespaceConfigs.get(namespace);
                         if (defaultActionRef != null) {
                             config = actions.get(defaultActionRef);
+                            if (config == null) {
+                                config = namespaceActionConfigMatchers.get(namespace).match(defaultActionRef);
+                            }
                         }
                     }
                 }
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationTest.java b/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationTest.java
index 520f8c240..d23407b9e 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationTest.java
@@ -338,6 +338,26 @@ public class ConfigurationTest extends XWorkTestCase {
     }
 
 
+    public void testDefaultActionRefWithWildcard() {
+        RuntimeConfiguration runtimeConfiguration = configurationManager.getConfiguration().getRuntimeConfiguration();
+        ActionConfig config = runtimeConfiguration.getActionConfig("/wildcard-default", "unmatchedAction");
+        assertNotNull("Wildcard default action ref should resolve via wildcard matching", config);
+        assertEquals("com.opensymphony.xwork2.SimpleAction", config.getClassName());
+    }
+
+    public void testDefaultActionRefWithExactMatch() {
+        RuntimeConfiguration runtimeConfiguration = configurationManager.getConfiguration().getRuntimeConfiguration();
+        ActionConfig config = runtimeConfiguration.getActionConfig("/exact-default", "unmatchedAction");
+        assertNotNull("Exact default action ref should resolve via exact matching", config);
+        assertEquals("com.opensymphony.xwork2.SimpleAction", config.getClassName());
+    }
+
+    public void testDefaultActionRefWithWildcardNoMatch() {
+        RuntimeConfiguration runtimeConfiguration = configurationManager.getConfiguration().getRuntimeConfiguration();
+        ActionConfig config = runtimeConfiguration.getActionConfig("/wildcard-default-nomatch", "unmatchedAction");
+        assertNull("Default action ref with no matching action should return null", config);
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
diff --git a/core/src/test/resources/xwork-sample.xml b/core/src/test/resources/xwork-sample.xml
index 4e62f4c12..c2b17e154 100644
--- a/core/src/test/resources/xwork-sample.xml
+++ b/core/src/test/resources/xwork-sample.xml
@@ -295,5 +295,26 @@
  			<!--  default-class-ref is expected to be inherited -->
         </package>
 
+    <package name="wildcardDefault" extends="default" namespace="/wildcard-default">
+        <default-action-ref name="movie-input" />
+        <action name="movie-*" class="com.opensymphony.xwork2.SimpleAction">
+            <result name="success" type="mock">/movie/{1}.jsp</result>
+        </action>
+    </package>
+
+    <package name="exactDefault" extends="default" namespace="/exact-default">
+        <default-action-ref name="home" />
+        <action name="home" class="com.opensymphony.xwork2.SimpleAction">
+            <result name="success" type="mock">/home.jsp</result>
+        </action>
+    </package>
+
+    <package name="wildcardDefaultNoMatch" extends="default" namespace="/wildcard-default-nomatch">
+        <default-action-ref name="nonExistentAction" />
+        <action name="movie-*" class="com.opensymphony.xwork2.SimpleAction">
+            <result name="success" type="mock">/movie/{1}.jsp</result>
+        </action>
+    </package>
+
     <include file="includeTest.xml"/>
 </struts>