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 2015/09/28 20:52:50 UTC

[01/33] struts git commit: Drops wildcard as a valid action method

Repository: struts
Updated Branches:
  refs/heads/master 48ea26be7 -> b88268165


Drops wildcard as a valid action method


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/065b5b79
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/065b5b79
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/065b5b79

Branch: refs/heads/master
Commit: 065b5b79ae068ab7891a4232a0769290fd21bb17
Parents: 0fac539
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 14:31:59 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 14:31:59 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/ActionConfig.java    | 40 +++++++-------------
 1 file changed, 13 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/065b5b79/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
index b32f2cf..b947ed9 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
@@ -42,7 +42,6 @@ import java.util.*;
 public class ActionConfig extends Located implements Serializable {
 
     public static final String DEFAULT_METHOD = "execute";
-    public static final String WILDCARD = "*";
 
     protected List<InterceptorMapping> interceptors; // a list of interceptorMapping Objects eg. List<InterceptorMapping>
     protected Map<String,String> params;
@@ -58,11 +57,11 @@ public class ActionConfig extends Located implements Serializable {
         this.packageName = packageName;
         this.name = name;
         this.className = className;
-        params = new LinkedHashMap<String, String>();
-        results = new LinkedHashMap<String, ResultConfig>();
-        interceptors = new ArrayList<InterceptorMapping>();
-        exceptionMappings = new ArrayList<ExceptionMappingConfig>();
-        allowedMethods = new HashSet<String>();
+        params = new LinkedHashMap<>();
+        results = new LinkedHashMap<>();
+        interceptors = new ArrayList<>();
+        exceptionMappings = new ArrayList<>();
+        allowedMethods = new HashSet<>(Collections.singletonList(DEFAULT_METHOD));
     }
 
     /**
@@ -128,11 +127,7 @@ public class ActionConfig extends Located implements Serializable {
     }
 
     public boolean isAllowedMethod(String method) {
-        if (allowedMethods.size() == 1 && WILDCARD.equals(allowedMethods.iterator().next())) {
-            return true;
-        } else {
-            return method.equals(methodName != null ? methodName : DEFAULT_METHOD) || allowedMethods.contains(method);
-        }
+        return method.equals(methodName != null ? methodName : DEFAULT_METHOD) || allowedMethods.contains(method);
     }
 
     @Override public boolean equals(Object o) {
@@ -214,7 +209,6 @@ public class ActionConfig extends Located implements Serializable {
     public static class Builder implements InterceptorListHolder{
 
         protected ActionConfig target;
-        private boolean gotMethods;
 
         public Builder(ActionConfig toClone) {
             target = new ActionConfig(toClone);
@@ -249,6 +243,7 @@ public class ActionConfig extends Located implements Serializable {
 
         public Builder methodName(String method) {
             target.methodName = method;
+            addAllowedMethod(method);
             return this;
         }
 
@@ -317,10 +312,7 @@ public class ActionConfig extends Located implements Serializable {
         }
 
         public Builder addAllowedMethod(Collection<String> methods) {
-            if (methods != null) {
-                gotMethods = true;
-                target.allowedMethods.addAll(methods);
-            }
+            target.allowedMethods.addAll(methods);
             return this;
         }
 
@@ -330,22 +322,16 @@ public class ActionConfig extends Located implements Serializable {
         }
 
         public ActionConfig build() {
-            embalmTarget();
-            ActionConfig result = target;
-            target = new ActionConfig(target);
-            return result;
-        }
-
-        protected void embalmTarget() {
-            if (!gotMethods && target.allowedMethods.isEmpty()) {
-                target.allowedMethods.add(WILDCARD);
-            }
-
             target.params = Collections.unmodifiableMap(target.params);
             target.results = Collections.unmodifiableMap(target.results);
             target.interceptors = Collections.unmodifiableList(target.interceptors);
             target.exceptionMappings = Collections.unmodifiableList(target.exceptionMappings);
             target.allowedMethods = Collections.unmodifiableSet(target.allowedMethods);
+
+            ActionConfig result = target;
+            target = new ActionConfig(target);
+            return result;
         }
+
     }
 }


[29/33] struts git commit: Includes additional global allowed methods

Posted by lu...@apache.org.
Includes additional global allowed methods


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/e3743111
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/e3743111
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/e3743111

Branch: refs/heads/master
Commit: e3743111ffe13eec93232e5e71a56e5ac1fca0a5
Parents: d511d28
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Tue Sep 15 09:02:38 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Tue Sep 15 09:02:38 2015 +0200

----------------------------------------------------------------------
 core/src/main/resources/struts-default.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/e3743111/core/src/main/resources/struts-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index 2dd6b75..b95a1a0 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -362,7 +362,7 @@
 
         <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
 
-        <global-allowed-methods>execute,input,back,cancel,browse</global-allowed-methods>
+        <global-allowed-methods>execute,input,back,cancel,browse,save,delete,list,index</global-allowed-methods>
 
     </package>
 


[12/33] struts git commit: Adds missing comma

Posted by lu...@apache.org.
Adds missing comma


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/63bb6e30
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/63bb6e30
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/63bb6e30

Branch: refs/heads/master
Commit: 63bb6e30e75facf5382608857494cf971f0378dd
Parents: 47a01ea
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 21:06:06 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 21:06:06 2015 +0200

----------------------------------------------------------------------
 core/src/main/resources/struts-2.5.dtd     | 2 +-
 core/src/main/resources/struts-default.xml | 5 +++--
 2 files changed, 4 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/63bb6e30/core/src/main/resources/struts-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-2.5.dtd b/core/src/main/resources/struts-2.5.dtd
index 6591ddb..0845eee 100644
--- a/core/src/main/resources/struts-2.5.dtd
+++ b/core/src/main/resources/struts-2.5.dtd
@@ -37,7 +37,7 @@
     order CDATA #IMPLIED
 >
 
-<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-allowed-methods? global-exception-mappings?, action*)>
+<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-allowed-methods?, global-exception-mappings?, action*)>
 <!ATTLIST package
     name CDATA #REQUIRED
     extends CDATA #IMPLIED

http://git-wip-us.apache.org/repos/asf/struts/blob/63bb6e30/core/src/main/resources/struts-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index d7a0ee0..f1684e5 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -358,11 +358,12 @@
 
        </interceptors>
 
-       <global-allowed-methods>execute,input,back,cancel,browse</global-allowed-methods>
-
         <default-interceptor-ref name="defaultStack"/>
 
         <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
+
+        <global-allowed-methods>execute,input,back,cancel,browse</global-allowed-methods>
+
     </package>
 
 </struts>


[05/33] struts git commit: Drops outdated attribute

Posted by lu...@apache.org.
Drops outdated attribute


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/fb0c4a58
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/fb0c4a58
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/fb0c4a58

Branch: refs/heads/master
Commit: fb0c4a58507c7fb1af135bb376af5b475f43d7ee
Parents: 55b8070
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 14:42:44 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 14:42:44 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/providers/XmlConfigurationProvider.java       | 5 -----
 core/src/main/resources/struts-2.5.dtd                          | 1 -
 2 files changed, 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/fb0c4a58/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 449d254..fd9f92a 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -649,11 +649,6 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         String name = StringUtils.defaultString(packageElement.getAttribute("name"));
         String namespace = StringUtils.defaultString(packageElement.getAttribute("namespace"));
 
-        if (StringUtils.isNotEmpty(packageElement.getAttribute("externalReferenceResolver"))) {
-            throw new ConfigurationException("The 'externalReferenceResolver' attribute has been removed.  Please use " +
-                    "a custom ObjectFactory or Interceptor.", packageElement);
-        }
-
         PackageConfig.Builder cfg = new PackageConfig.Builder(name)
                 .namespace(namespace)
                 .isAbstract(isAbstract)

http://git-wip-us.apache.org/repos/asf/struts/blob/fb0c4a58/core/src/main/resources/struts-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-2.5.dtd b/core/src/main/resources/struts-2.5.dtd
index 86afbc0..25ca800 100644
--- a/core/src/main/resources/struts-2.5.dtd
+++ b/core/src/main/resources/struts-2.5.dtd
@@ -43,7 +43,6 @@
     extends CDATA #IMPLIED
     namespace CDATA #IMPLIED
     abstract CDATA #IMPLIED
-    externalReferenceResolver NMTOKEN #IMPLIED
 >
 
 <!ELEMENT result-types (result-type+)>


[25/33] struts git commit: Enables Strict DMI by default

Posted by lu...@apache.org.
Enables Strict DMI by default


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/e9e6ae90
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/e9e6ae90
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/e9e6ae90

Branch: refs/heads/master
Commit: e9e6ae90e6d7efc931b1738c55fa052045b7bef5
Parents: 3ccd730
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 11:44:44 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 11:44:44 2015 +0200

----------------------------------------------------------------------
 core/src/main/resources/struts-default.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/e9e6ae90/core/src/main/resources/struts-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index f1684e5..2dd6b75 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -165,7 +165,7 @@
     <bean type="com.opensymphony.xwork2.security.ExcludedPatternsChecker" name="struts" class="com.opensymphony.xwork2.security.DefaultExcludedPatternsChecker" scope="prototype" />
     <bean type="com.opensymphony.xwork2.security.AcceptedPatternsChecker" name="struts" class="com.opensymphony.xwork2.security.DefaultAcceptedPatternsChecker" scope="prototype" />
 
-    <package name="struts-default" abstract="true">
+    <package name="struts-default" abstract="true" strict-method-invocation="true">
         <result-types>
             <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
             <result-type name="dispatcher" class="org.apache.struts2.result.ServletDispatcherResult" default="true"/>


[15/33] struts git commit: Fixes test

Posted by lu...@apache.org.
Fixes test


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/dd406fbb
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/dd406fbb
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/dd406fbb

Branch: refs/heads/master
Commit: dd406fbb04e755c0545c318c3ea099674fb78363
Parents: 7769156
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 21:46:55 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 21:46:55 2015 +0200

----------------------------------------------------------------------
 .../src/test/java/org/apache/struts2/TestConfigurationProvider.java | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/dd406fbb/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java b/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java
index aee8473..0eebd85 100644
--- a/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java
+++ b/core/src/test/java/org/apache/struts2/TestConfigurationProvider.java
@@ -127,6 +127,7 @@ public class TestConfigurationProvider implements ConfigurationProvider {
             .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())
+                .addAllowedMethod("input")
                 .build())
             .build();
 


[20/33] struts git commit: Adds toString implementations

Posted by lu...@apache.org.
Adds toString implementations


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/f1dbc5a7
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/f1dbc5a7
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/f1dbc5a7

Branch: refs/heads/master
Commit: f1dbc5a71914f4159d9aa0f0a8b6c8bfbd37f864
Parents: cb06d7d
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 09:24:11 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 09:24:11 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/AllowedMethods.java       | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/f1dbc5a7/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
index 7582696..e8796b1 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
@@ -117,6 +117,14 @@ public class AllowedMethods {
         public int hashCode() {
             return original.hashCode();
         }
+
+        @Override
+        public String toString() {
+            return "PatternAllowedMethod{" +
+                    "allowedMethodPattern=" + allowedMethodPattern +
+                    ", original='" + original + '\'' +
+                    '}';
+        }
     }
 
     private static class LiteralAllowedMethod implements AllowedMethod {
@@ -152,6 +160,13 @@ public class AllowedMethods {
         public int hashCode() {
             return allowedMethod.hashCode();
         }
+
+        @Override
+        public String toString() {
+            return "LiteralAllowedMethod{" +
+                    "allowedMethod='" + allowedMethod + '\'' +
+                    '}';
+        }
     }
 
 }


[04/33] struts git commit: Drops strict DMI

Posted by lu...@apache.org.
Drops strict DMI


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/55b80700
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/55b80700
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/55b80700

Branch: refs/heads/master
Commit: 55b8070048cbec0a6e08b1781f81b1bfdb3354f2
Parents: fd22e3a
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 14:41:57 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 14:41:57 2015 +0200

----------------------------------------------------------------------
 core/src/main/resources/xwork-2.5.dtd | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/55b80700/core/src/main/resources/xwork-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/xwork-2.5.dtd b/core/src/main/resources/xwork-2.5.dtd
index efbd765..4d3e1ca 100644
--- a/core/src/main/resources/xwork-2.5.dtd
+++ b/core/src/main/resources/xwork-2.5.dtd
@@ -22,7 +22,6 @@
     extends CDATA #IMPLIED
     namespace CDATA #IMPLIED
     abstract CDATA #IMPLIED
-    strict-method-invocation CDATA #IMPLIED
 >
 
 <!ELEMENT result-types (result-type+)>


[21/33] struts git commit: Adds basic test case

Posted by lu...@apache.org.
Adds basic test case


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/7db5e761
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/7db5e761
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/7db5e761

Branch: refs/heads/master
Commit: 7db5e76133e22e86e0af0687fe1b3f1b80bfc09a
Parents: f1dbc5a
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 09:24:18 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 09:24:18 2015 +0200

----------------------------------------------------------------------
 .../config/entities/AllowedMethodsTest.java     | 55 ++++++++++++++++++++
 1 file changed, 55 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/7db5e761/core/src/test/java/com/opensymphony/xwork2/config/entities/AllowedMethodsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/entities/AllowedMethodsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/entities/AllowedMethodsTest.java
new file mode 100644
index 0000000..78f3094
--- /dev/null
+++ b/core/src/test/java/com/opensymphony/xwork2/config/entities/AllowedMethodsTest.java
@@ -0,0 +1,55 @@
+package com.opensymphony.xwork2.config.entities;
+
+import junit.framework.TestCase;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class AllowedMethodsTest extends TestCase {
+
+    public void testLiteralMethods() throws Exception {
+        // given
+        String method = "myMethod";
+        Set<String> literals = new HashSet<>();
+        literals.add(method);
+
+        // when
+        AllowedMethods allowedMethods = AllowedMethods.build(literals);
+
+        // then
+        assertEquals(1, allowedMethods.list().size());
+        assertTrue(allowedMethods.isAllowed(method));
+        assertFalse(allowedMethods.isAllowed("someOtherMethod"));
+    }
+
+    public void testWidlcardMethods() throws Exception {
+        // given
+        String method = "my{1}";
+        Set<String> literals = new HashSet<>();
+        literals.add(method);
+
+        // when
+        AllowedMethods allowedMethods = AllowedMethods.build(literals);
+
+        // then
+        assertEquals(1, allowedMethods.list().size());
+        assertTrue(allowedMethods.isAllowed("myMethod"));
+        assertFalse(allowedMethods.isAllowed("someOtherMethod"));
+    }
+
+    public void testRegexMethods() throws Exception {
+        // given
+        String method = "regex:my([a-zA-Z].*)";
+        Set<String> literals = new HashSet<>();
+        literals.add(method);
+
+        // when
+        AllowedMethods allowedMethods = AllowedMethods.build(literals);
+
+        // then
+        assertEquals(1, allowedMethods.list().size());
+        assertTrue(allowedMethods.isAllowed("myMethod"));
+        assertFalse(allowedMethods.isAllowed("someOtherMethod"));
+    }
+
+}


[16/33] struts git commit: Adds annotation to support AllowedMethods

Posted by lu...@apache.org.
Adds annotation to support AllowedMethods


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/ab5fb27d
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/ab5fb27d
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/ab5fb27d

Branch: refs/heads/master
Commit: ab5fb27d368f8857e137bc3a319c21fc85b519ee
Parents: dd406fb
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Thu Sep 3 13:03:55 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Thu Sep 3 13:03:55 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/PackageConfig.java   | 13 ++++-
 .../PackageBasedActionConfigBuilder.java        | 30 ++++++++--
 .../convention/annotation/AllowedMethods.java   | 30 ++++++++++
 .../PackageBasedActionConfigBuilderTest.java    | 60 ++++++++++++++++++--
 .../ClassLevelAllowedMethodsAction.java         | 10 ++++
 .../PackageLevelAllowedMethodsAction.java       |  7 +++
 .../actions/allowedmethods/package-info.java    | 23 ++++++++
 .../PackageLevelAllowedMethodsChildAction.java  |  9 +++
 8 files changed, 171 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/ab5fb27d/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
index 19ce36f..093985c 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
@@ -531,7 +531,18 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         }
 
         public Set<String> getGlobalAllowedMethods() {
-            return target.globalAllowedMethods;
+            Set <String> allowedMethods = target.globalAllowedMethods;
+            allowedMethods.addAll(getParentsAllowedMethods(target.parents));
+            return allowedMethods;
+        }
+
+        public Set<String> getParentsAllowedMethods(List<PackageConfig> parents) {
+            Set<String> allowedMethods = new HashSet<>();
+            for (PackageConfig parent : parents) {
+                allowedMethods.addAll(parent.globalAllowedMethods);
+                allowedMethods.addAll(getParentsAllowedMethods(parent.getParents()));
+            }
+            return allowedMethods;
         }
 
         public Builder addGlobalAllowedMethods(Set<String> allowedMethods) {

http://git-wip-us.apache.org/repos/asf/struts/blob/ab5fb27d/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
index b4a8be9..64a0e98 100644
--- a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
+++ b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
@@ -42,6 +42,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.StrutsException;
 import org.apache.struts2.convention.annotation.*;
+import org.apache.struts2.convention.annotation.AllowedMethods;
 
 import java.io.IOException;
 import java.lang.reflect.Method;
@@ -652,6 +653,8 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
             String actionPackage = actionClass.getPackage().getName();
             LOG.debug("Processing class [{}] in package [{}]", actionClass.getName(), actionPackage);
 
+            Set<String> allowedMethods = getAllowedMethods(actionClass);
+
             // Determine the default namespace and action name
             List<String> namespaces = determineActionNamespace(actionClass);
             for (String namespace : namespaces) {
@@ -692,7 +695,7 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
 
                     // Build the default
                     if (!found) {
-                        createActionConfig(defaultPackageConfig, actionClass, defaultActionName, DEFAULT_METHOD, null);
+                        createActionConfig(defaultPackageConfig, actionClass, defaultActionName, DEFAULT_METHOD, null, allowedMethods);
                     }
                 }
 
@@ -706,14 +709,14 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
                                     actionClass, action);
                         }
 
-                        createActionConfig(pkgCfg, actionClass, defaultActionName, method, action);
+                        createActionConfig(pkgCfg, actionClass, defaultActionName, method, action, allowedMethods);
                     }
                 }
 
                 // some actions will not have any @Action or a default method, like the rest actions
                 // where the action mapper is the one that finds the right method at runtime
                 if (map.isEmpty() && mapAllMatches && actionAnnotation == null && actionsAnnotation == null) {
-                    createActionConfig(defaultPackageConfig, actionClass, defaultActionName, null, actionAnnotation);
+                    createActionConfig(defaultPackageConfig, actionClass, defaultActionName, null, actionAnnotation, allowedMethods);
                 }
 
                 //if there are @Actions or @Action at the class level, create the mappings for them
@@ -721,9 +724,9 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
                 if (actionsAnnotation != null) {
                     List<Action> actionAnnotations = checkActionsAnnotation(actionsAnnotation);
                     for (Action actionAnnotation2 : actionAnnotations)
-                        createActionConfig(defaultPackageConfig, actionClass, defaultActionName, methodName, actionAnnotation2);
+                        createActionConfig(defaultPackageConfig, actionClass, defaultActionName, methodName, actionAnnotation2, allowedMethods);
                 } else if (actionAnnotation != null)
-                    createActionConfig(defaultPackageConfig, actionClass, defaultActionName, methodName, actionAnnotation);
+                    createActionConfig(defaultPackageConfig, actionClass, defaultActionName, methodName, actionAnnotation, allowedMethods);
             }
         }
 
@@ -736,6 +739,15 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
         }
     }
 
+    private Set<String> getAllowedMethods(Class<?> actionClass) {
+        AllowedMethods annotation = AnnotationUtils.findAnnotation(actionClass, AllowedMethods.class);
+        if (annotation == null) {
+            return Collections.emptySet();
+        } else {
+            return TextParseUtil.commaDelimitedStringToSet(annotation.value());
+        }
+    }
+
     /**
      * Interfaces, enums, annotations, and abstract classes cannot be instantiated.
      * @param actionClass class to check
@@ -896,7 +908,7 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
      * @param annotation   The ActionName annotation that might override the action name and possibly
      */
     protected void createActionConfig(PackageConfig.Builder pkgCfg, Class<?> actionClass, String actionName,
-                                      String actionMethod, Action annotation) {
+                                      String actionMethod, Action annotation, Set<String> allowedMethods) {
     	String className = actionClass.getName();
         if (annotation != null) {
             actionName = annotation.value() != null && annotation.value().equals(Action.DEFAULT_VALUE) ? actionName : annotation.value();
@@ -909,6 +921,12 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
         ActionConfig.Builder actionConfig = new ActionConfig.Builder(pkgCfg.getName(), actionName, className);
         actionConfig.methodName(actionMethod);
 
+        if (!allowedMethods.contains(actionMethod)) {
+            actionConfig.addAllowedMethod(actionMethod);
+        }
+        actionConfig.addAllowedMethod(allowedMethods);
+        actionConfig.addAllowedMethod(pkgCfg.getGlobalAllowedMethods());
+
         if (LOG.isDebugEnabled()) {
             LOG.debug("Creating action config for class [{}], name [{}] and package name [{}] in namespace [{}]",
                     actionClass.toString(), actionName, pkgCfg.getName(), pkgCfg.getNamespace());

http://git-wip-us.apache.org/repos/asf/struts/blob/ab5fb27d/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/AllowedMethods.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/AllowedMethods.java b/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/AllowedMethods.java
new file mode 100644
index 0000000..8e3c9ab
--- /dev/null
+++ b/plugins/convention/src/main/java/org/apache/struts2/convention/annotation/AllowedMethods.java
@@ -0,0 +1,30 @@
+package org.apache.struts2.convention.annotation;
+
+import com.opensymphony.xwork2.config.entities.ActionConfig;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * <!-- START SNIPPET: javadoc -->
+ * <p>
+ * This annotation allows actions to specify allowed action methods
+ * to limit access to any other public action's methods
+ * </p>
+ *
+ * <p>
+ * This annotation can be used directly on Action classes or
+ * in the <strong>package-info.java</strong> class in order
+ * to specify global allowed methods for all sub-packages.
+ * </p>
+ * <!-- END SNIPPET: javadoc -->
+ */
+@Target({ElementType.TYPE, ElementType.PACKAGE})
+@Retention(value = RetentionPolicy.RUNTIME)
+public @interface AllowedMethods {
+
+    String value() default ActionConfig.DEFAULT_METHOD;
+
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/ab5fb27d/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
index 38403a0..61ed3eb 100644
--- a/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
+++ b/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
@@ -29,6 +29,7 @@ import com.opensymphony.xwork2.factory.DefaultResultFactory;
 import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.inject.Scope.Strategy;
 import com.opensymphony.xwork2.ognl.OgnlReflectionProvider;
+import com.opensymphony.xwork2.util.TextParseUtil;
 import com.opensymphony.xwork2.util.fs.DefaultFileManager;
 import com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory;
 import com.opensymphony.xwork2.util.reflection.ReflectionException;
@@ -37,6 +38,9 @@ import org.apache.struts2.convention.actions.DefaultResultPathAction;
 import org.apache.struts2.convention.actions.NoAnnotationAction;
 import org.apache.struts2.convention.actions.Skip;
 import org.apache.struts2.convention.actions.action.*;
+import org.apache.struts2.convention.actions.allowedmethods.ClassLevelAllowedMethodsAction;
+import org.apache.struts2.convention.actions.allowedmethods.PackageLevelAllowedMethodsAction;
+import org.apache.struts2.convention.actions.allowedmethods.sub.PackageLevelAllowedMethodsChildAction;
 import org.apache.struts2.convention.actions.chain.ChainedAction;
 import org.apache.struts2.convention.actions.defaultinterceptor.SingleActionNameAction2;
 import org.apache.struts2.convention.actions.exception.ExceptionsActionLevelAction;
@@ -125,8 +129,10 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
                 new ResultTypeConfig.Builder("chain",
                         ActionChainResult.class.getName()).defaultResultParam("actionName").build()};
 
+        Set<String> globalAllowedMethods = TextParseUtil.commaDelimitedStringToSet("execute,browse,cancel,input");
+
         PackageConfig strutsDefault = makePackageConfig("struts-default", null, null, "dispatcher",
-                defaultResults, defaultInterceptors, defaultInterceptorStacks);
+                defaultResults, defaultInterceptors, defaultInterceptorStacks, globalAllowedMethods);
 
         PackageConfig packageLevelParentPkg = makePackageConfig("package-level", null, null, null);
         PackageConfig classLevelParentPkg = makePackageConfig("class-level", null, null, null);
@@ -151,6 +157,16 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
             "/parentpackage", packageLevelParentPkg, null);
         PackageConfig packageLevelSubPkg = makePackageConfig("org.apache.struts2.convention.actions.parentpackage.sub#package-level#/parentpackage/sub",
             "/parentpackage/sub", packageLevelParentPkg, null);
+
+        // Unexpected method call build(class org.apache.struts2.convention.actions.allowedmethods.PackageLevelAllowedMethodsAction, null, "package-level-allowed-methods", PackageConfig: [org.apache.struts2.convention.actions.allowedmethods#struts-default#/allowedmethods] for namespace [/allowedmethods] with parents [[PackageConfig: [struts-default] for namespace [] with parents [[]]]]):
+        PackageConfig packageLevelAllowedMethodsPkg = makePackageConfig("org.apache.struts2.convention.actions.allowedmethods#struts-default#/allowedmethods",
+                "/allowedmethods", strutsDefault, null);
+        PackageConfig packageLevelAllowedMethodsSubPkg = makePackageConfig("org.apache.struts2.convention.actions.allowedmethods.sub#struts-default#/allowedmethods/sub",
+                "/allowedmethods/sub", strutsDefault, null);
+
+        PackageConfig classLevelAllowedMethodsPkg = makePackageConfig("org.apache.struts2.convention.actions.allowedmethods#struts-default#/allowedmethods",
+                "/allowedmethods", strutsDefault, null);
+
         PackageConfig differentPkg = makePackageConfig("org.apache.struts2.convention.actions.parentpackage#class-level#/parentpackage",
             "/parentpackage", classLevelParentPkg, null);
         PackageConfig differentSubPkg = makePackageConfig("org.apache.struts2.convention.actions.parentpackage.sub#class-level#/parentpackage/sub",
@@ -261,6 +277,11 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
         expect(resultMapBuilder.build(ClassLevelParentPackageAction.class, null, "class-level-parent-package", differentPkg)).andReturn(results);
         expect(resultMapBuilder.build(ClassLevelParentPackageChildAction.class, null, "class-level-parent-package-child", differentSubPkg)).andReturn(results);
 
+        /* org.apache.struts2.convention.actions.allowedmethods */
+        expect(resultMapBuilder.build(ClassLevelAllowedMethodsAction.class, null, "class-level-allowed-methods", classLevelAllowedMethodsPkg)).andReturn(results);
+        expect(resultMapBuilder.build(PackageLevelAllowedMethodsAction.class, null, "package-level-allowed-methods", packageLevelAllowedMethodsPkg)).andReturn(results);
+        expect(resultMapBuilder.build(PackageLevelAllowedMethodsChildAction.class, null, "package-level-allowed-methods-child", packageLevelAllowedMethodsSubPkg)).andReturn(results);
+
         /* org.apache.struts2.convention.actions.result */
         expect(resultMapBuilder.build(ClassLevelResultAction.class, null, "class-level-result", resultPkg)).andReturn(results);
         expect(resultMapBuilder.build(ClassLevelResultsAction.class, null, "class-level-results", resultPkg)).andReturn(results);
@@ -450,7 +471,7 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
         verifyActionConfig(pkgConfig, "", org.apache.struts2.convention.actions.idx.Index.class, "execute", pkgConfig.getName());
         verifyActionConfig(pkgConfig, "index", org.apache.struts2.convention.actions.idx.Index.class, "execute", pkgConfig.getName());
         verifyActionConfig(pkgConfig, "idx2", org.apache.struts2.convention.actions.idx.idx2.Index.class, "execute",
-            "org.apache.struts2.convention.actions.idx.idx2#struts-default#/idx/idx2");
+                "org.apache.struts2.convention.actions.idx.idx2#struts-default#/idx/idx2");
 
         /* org.apache.struts2.convention.actions.defaultinterceptor */
         pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.defaultinterceptor#struts-default#/defaultinterceptor");
@@ -514,6 +535,33 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
         verifyActionConfig(pkgConfig, "package-level-parent-package-child", PackageLevelParentPackageChildAction.class, "execute", pkgConfig.getName());
         assertEquals("package-level", pkgConfig.getParents().get(0).getName());
 
+        /* org.apache.struts2.convention.actions.allowedmethods class level */
+        pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.allowedmethods#struts-default#/allowedmethods");
+        assertNotNull(pkgConfig);
+        assertEquals(2, pkgConfig.getActionConfigs().size());
+        verifyActionConfig(pkgConfig, "class-level-allowed-methods", ClassLevelAllowedMethodsAction.class, "execute", pkgConfig.getName());
+        assertEquals("struts-default", pkgConfig.getParents().get(0).getName());
+
+        ActionConfig actionConfig = pkgConfig.getActionConfigs().get("class-level-allowed-methods");
+        assertEquals(actionConfig.getAllowedMethods().size(), 5);
+        assertTrue(actionConfig.getAllowedMethods().contains("execute"));
+        assertTrue(actionConfig.getAllowedMethods().contains("end"));
+        assertTrue(actionConfig.getAllowedMethods().contains("input"));
+
+        /* org.apache.struts2.convention.actions.allowedmethods.sub package level */
+        pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.allowedmethods.sub#struts-default#/allowedmethods/sub");
+        assertNotNull(pkgConfig);
+        assertEquals(1, pkgConfig.getActionConfigs().size());
+        verifyActionConfig(pkgConfig, "package-level-allowed-methods-child", PackageLevelAllowedMethodsChildAction.class, "execute", pkgConfig.getName());
+        assertEquals("struts-default", pkgConfig.getParents().get(0).getName());
+
+        actionConfig = pkgConfig.getActionConfigs().get("package-level-allowed-methods-child");
+        assertEquals(actionConfig.getAllowedMethods().size(), 6);
+        assertTrue(actionConfig.getAllowedMethods().contains("execute"));
+        assertTrue(actionConfig.getAllowedMethods().contains("home"));
+        assertTrue(actionConfig.getAllowedMethods().contains("start"));
+        assertTrue(actionConfig.getAllowedMethods().contains("input"));
+
         /* org.apache.struts2.convention.actions.result */
         pkgConfig = configuration.getPackageConfig("org.apache.struts2.convention.actions.result#struts-default#/result");
         assertNotNull(pkgConfig);
@@ -631,12 +679,12 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
 
     private PackageConfig makePackageConfig(String name, String namespace, PackageConfig parent,
             String defaultResultType, ResultTypeConfig... results) {
-        return makePackageConfig(name, namespace, parent, defaultResultType, results, null, null);
+        return makePackageConfig(name, namespace, parent, defaultResultType, results, null, null, null);
     }
 
     private PackageConfig makePackageConfig(String name, String namespace, PackageConfig parent,
             String defaultResultType, ResultTypeConfig[] results, List<InterceptorConfig> interceptors,
-            List<InterceptorStackConfig> interceptorStacks) {
+            List<InterceptorStackConfig> interceptorStacks, Set<String> globalAllowedMethods) {
         PackageConfig.Builder builder = new PackageConfig.Builder(name);
         if (namespace != null) {
             builder.namespace(namespace);
@@ -663,6 +711,10 @@ public class PackageBasedActionConfigBuilderTest extends TestCase {
             }
         }
 
+        if (globalAllowedMethods != null) {
+            builder.addGlobalAllowedMethods(globalAllowedMethods);
+        }
+
         return new MyPackageConfig(builder.build());
     }
 

http://git-wip-us.apache.org/repos/asf/struts/blob/ab5fb27d/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/ClassLevelAllowedMethodsAction.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/ClassLevelAllowedMethodsAction.java b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/ClassLevelAllowedMethodsAction.java
new file mode 100644
index 0000000..24ea489
--- /dev/null
+++ b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/ClassLevelAllowedMethodsAction.java
@@ -0,0 +1,10 @@
+package org.apache.struts2.convention.actions.allowedmethods;
+
+import org.apache.struts2.convention.annotation.AllowedMethods;
+
+@AllowedMethods("end")
+public class ClassLevelAllowedMethodsAction {
+
+    public String execute() { return null; }
+
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/ab5fb27d/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/PackageLevelAllowedMethodsAction.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/PackageLevelAllowedMethodsAction.java b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/PackageLevelAllowedMethodsAction.java
new file mode 100644
index 0000000..eab0895
--- /dev/null
+++ b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/PackageLevelAllowedMethodsAction.java
@@ -0,0 +1,7 @@
+package org.apache.struts2.convention.actions.allowedmethods;
+
+public class PackageLevelAllowedMethodsAction {
+
+    public String execute() { return null; }
+
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/ab5fb27d/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/package-info.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/package-info.java b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/package-info.java
new file mode 100644
index 0000000..461131f
--- /dev/null
+++ b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+@org.apache.struts2.convention.annotation.AllowedMethods("home,start")
+package org.apache.struts2.convention.actions.allowedmethods;
+

http://git-wip-us.apache.org/repos/asf/struts/blob/ab5fb27d/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/sub/PackageLevelAllowedMethodsChildAction.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/sub/PackageLevelAllowedMethodsChildAction.java b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/sub/PackageLevelAllowedMethodsChildAction.java
new file mode 100644
index 0000000..4a6223d
--- /dev/null
+++ b/plugins/convention/src/test/java/org/apache/struts2/convention/actions/allowedmethods/sub/PackageLevelAllowedMethodsChildAction.java
@@ -0,0 +1,9 @@
+package org.apache.struts2.convention.actions.allowedmethods.sub;
+
+import org.apache.struts2.convention.actions.allowedmethods.PackageLevelAllowedMethodsAction;
+
+public class PackageLevelAllowedMethodsChildAction extends PackageLevelAllowedMethodsAction {
+
+    public String execute() { return null; }
+
+}


[30/33] struts git commit: Respects parent package flag when Strict DMI is disabled

Posted by lu...@apache.org.
Respects parent package flag when Strict DMI is disabled


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/b8381057
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/b8381057
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/b8381057

Branch: refs/heads/master
Commit: b8381057190c3abebbc3a65c404fd5de5f2c6c52
Parents: e374311
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Wed Sep 23 11:30:54 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Wed Sep 23 11:30:54 2015 +0200

----------------------------------------------------------------------
 .../convention/PackageBasedActionConfigBuilder.java       | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/b8381057/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
index 0fc238c..c388ee9 100644
--- a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
+++ b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
@@ -921,9 +921,13 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
         ActionConfig.Builder actionConfig = new ActionConfig.Builder(pkgCfg.getName(), actionName, className);
         actionConfig.methodName(actionMethod);
 
-        actionConfig.addAllowedMethod(actionMethod);
-        actionConfig.addAllowedMethod(allowedMethods);
-        actionConfig.addAllowedMethod(pkgCfg.getGlobalAllowedMethods());
+        if (pkgCfg.isStrictMethodInvocation()) {
+            actionConfig.addAllowedMethod(actionMethod);
+            actionConfig.addAllowedMethod(allowedMethods);
+            actionConfig.addAllowedMethod(pkgCfg.getGlobalAllowedMethods());
+        } else {
+            actionConfig.addAllowedMethod(ActionConfig.REGEX_WILDCARD);
+        }
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("Creating action config for class [{}], name [{}] and package name [{}] in namespace [{}]",


[28/33] struts git commit: Inlines and simplifies

Posted by lu...@apache.org.
Inlines and simplifies


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/d511d282
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/d511d282
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/d511d282

Branch: refs/heads/master
Commit: d511d282045fa30aee3f994c7fdac78c600cc417
Parents: 2940761
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Tue Sep 8 08:31:40 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Tue Sep 8 08:31:40 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/PackageConfig.java             | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/d511d282/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
index 10286c4..e5d3ef4 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
@@ -614,19 +614,15 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         }
 
         public PackageConfig build() {
-            embalmTarget();
-            PackageConfig result = target;
-            target = new PackageConfig(result);
-            return result;
-        }
-
-        protected void embalmTarget() {
             target.actionConfigs = Collections.unmodifiableMap(target.actionConfigs);
             target.globalResultConfigs = Collections.unmodifiableMap(target.globalResultConfigs);
             target.interceptorConfigs = Collections.unmodifiableMap(target.interceptorConfigs);
             target.resultTypeConfigs = Collections.unmodifiableMap(target.resultTypeConfigs);
             target.globalExceptionMappingConfigs = Collections.unmodifiableList(target.globalExceptionMappingConfigs);
             target.parents = Collections.unmodifiableList(target.parents);
+            PackageConfig result = target;
+            target = new PackageConfig(result);
+            return result;
         }
 
         @Override


[19/33] struts git commit: Uses factory method pattern

Posted by lu...@apache.org.
Uses factory method pattern


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/cb06d7d2
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/cb06d7d2
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/cb06d7d2

Branch: refs/heads/master
Commit: cb06d7d2580e37ab8aba2170c433c1674932c4de
Parents: e38d465
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 09:08:32 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 09:08:32 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/ActionConfig.java    |  6 +--
 .../xwork2/config/entities/AllowedMethods.java  | 54 ++++++++++----------
 2 files changed, 31 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/cb06d7d2/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
index 7c10c90..a821c93 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
@@ -63,7 +63,7 @@ public class ActionConfig extends Located implements Serializable {
         results = new LinkedHashMap<>();
         interceptors = new ArrayList<>();
         exceptionMappings = new ArrayList<>();
-        allowedMethods = new AllowedMethods(new HashSet<>(Collections.singletonList(DEFAULT_METHOD)));
+        allowedMethods = AllowedMethods.build(new HashSet<>(Collections.singletonList(DEFAULT_METHOD)));
     }
 
     /**
@@ -80,7 +80,7 @@ public class ActionConfig extends Located implements Serializable {
         this.interceptors = new ArrayList<>(orig.interceptors);
         this.results = new LinkedHashMap<>(orig.results);
         this.exceptionMappings = new ArrayList<>(orig.exceptionMappings);
-        this.allowedMethods = new AllowedMethods(orig.allowedMethods.list());
+        this.allowedMethods = AllowedMethods.build(orig.allowedMethods.list());
         this.location = orig.location;
     }
 
@@ -332,7 +332,7 @@ public class ActionConfig extends Located implements Serializable {
             target.results = Collections.unmodifiableMap(target.results);
             target.interceptors = Collections.unmodifiableList(target.interceptors);
             target.exceptionMappings = Collections.unmodifiableList(target.exceptionMappings);
-            target.allowedMethods = new AllowedMethods(allowedMethods);
+            target.allowedMethods = AllowedMethods.build(allowedMethods);
 
             ActionConfig result = target;
             target = new ActionConfig(target);

http://git-wip-us.apache.org/repos/asf/struts/blob/cb06d7d2/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
index f619d89..7582696 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
@@ -9,37 +9,39 @@ public class AllowedMethods {
 
     private Set<AllowedMethod> allowedMethods;
 
-    public AllowedMethods(Set<String> methods) {
+    public static AllowedMethods build(Set<String> methods) {
+
         Set<AllowedMethod> allowedMethods = new HashSet<>();
         for (String method : methods) {
-            allowedMethods.add(build(method));
-        }
-        this.allowedMethods = Collections.unmodifiableSet(allowedMethods);
-    }
-
-    private AllowedMethod build(String method) {
-        boolean isPattern = false;
-        int len = method.length();
-        StringBuilder ret = new StringBuilder();
-        char c;
-        for (int x = 0; x < len; x++) {
-            c = method.charAt(x);
-            if (x < len - 2 && c == '{' && '}' == method.charAt(x + 2)) {
-                ret.append("(.*)");
-                isPattern = true;
-                x += 2;
+            boolean isPattern = false;
+            int len = method.length();
+            StringBuilder ret = new StringBuilder();
+            char c;
+            for (int x = 0; x < len; x++) {
+                c = method.charAt(x);
+                if (x < len - 2 && c == '{' && '}' == method.charAt(x + 2)) {
+                    ret.append("(.*)");
+                    isPattern = true;
+                    x += 2;
+                } else {
+                    ret.append(c);
+                }
+            }
+            if (isPattern && !method.startsWith("regex:")) {
+                allowedMethods.add(new PatternAllowedMethod(ret.toString(), method));
+            } else if (method.startsWith("regex:")) {
+                String pattern = method.substring(method.indexOf(":") + 1);
+                allowedMethods.add(new PatternAllowedMethod(pattern, method));
             } else {
-                ret.append(c);
+                allowedMethods.add(new LiteralAllowedMethod(ret.toString()));
             }
         }
-        if (isPattern && !method.startsWith("regex:")) {
-            return new PatternAllowedMethod(ret.toString(), method);
-        } else if (method.startsWith("regex:")) {
-            String pattern = method.substring(method.indexOf(":") + 1);
-            return new PatternAllowedMethod(pattern, method);
-        } else {
-            return new LiteralAllowedMethod(ret.toString());
-        }
+
+        return new AllowedMethods(allowedMethods);
+    }
+
+    private AllowedMethods(Set<AllowedMethod> methods) {
+        this.allowedMethods = Collections.unmodifiableSet(methods);
     }
 
     public boolean isAllowed(String method) {


[09/33] struts git commit: Adds support for wildcards

Posted by lu...@apache.org.
Adds support for wildcards


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/3b31c428
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/3b31c428
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/3b31c428

Branch: refs/heads/master
Commit: 3b31c428856766389ad6df4ba1edc3d60ecf5e24
Parents: c1928ad
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 18:36:29 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 18:36:29 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/ActionConfig.java    |  22 +--
 .../xwork2/config/entities/AllowedMethods.java  | 152 +++++++++++++++++++
 2 files changed, 165 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/3b31c428/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
index fd61ad9..5303e83 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
@@ -52,7 +52,7 @@ public class ActionConfig extends Located implements Serializable {
     protected String methodName;
     protected String packageName;
     protected String name;
-    protected Set<String> allowedMethods;
+    protected AllowedMethods allowedMethods;
 
     protected ActionConfig(String packageName, String name, String className) {
         this.packageName = packageName;
@@ -62,7 +62,7 @@ public class ActionConfig extends Located implements Serializable {
         results = new LinkedHashMap<>();
         interceptors = new ArrayList<>();
         exceptionMappings = new ArrayList<>();
-        allowedMethods = new HashSet<>(Collections.singletonList(DEFAULT_METHOD));
+        allowedMethods = new AllowedMethods(new HashSet<>(Collections.singletonList(DEFAULT_METHOD)));
     }
 
     /**
@@ -79,7 +79,7 @@ public class ActionConfig extends Located implements Serializable {
         this.interceptors = new ArrayList<>(orig.interceptors);
         this.results = new LinkedHashMap<>(orig.results);
         this.exceptionMappings = new ArrayList<>(orig.exceptionMappings);
-        this.allowedMethods = new HashSet<>(orig.allowedMethods);
+        this.allowedMethods = new AllowedMethods(orig.allowedMethods.list());
         this.location = orig.location;
     }
 
@@ -100,7 +100,7 @@ public class ActionConfig extends Located implements Serializable {
     }
 
     public Set<String> getAllowedMethods() {
-        return allowedMethods;
+        return allowedMethods.list();
     }
 
     /**
@@ -128,7 +128,7 @@ public class ActionConfig extends Located implements Serializable {
     }
 
     public boolean isAllowedMethod(String method) {
-        return method.equals(methodName != null ? methodName : DEFAULT_METHOD) || allowedMethods.contains(method);
+        return method.equals(methodName != null ? methodName : DEFAULT_METHOD) || allowedMethods.isAllowed(method);
     }
 
     @Override public boolean equals(Object o) {
@@ -210,14 +210,16 @@ public class ActionConfig extends Located implements Serializable {
     public static class Builder implements InterceptorListHolder{
 
         protected ActionConfig target;
+        protected Set<String> allowedMethods;
 
         public Builder(ActionConfig toClone) {
             target = new ActionConfig(toClone);
-            addAllowedMethod(toClone.getAllowedMethods());
+            allowedMethods = toClone.getAllowedMethods();
         }
 
         public Builder(String packageName, String name, String className) {
             target = new ActionConfig(packageName, name, className);
+            allowedMethods = new HashSet<>();
         }
 
         public Builder packageName(String name) {
@@ -308,12 +310,14 @@ public class ActionConfig extends Located implements Serializable {
         }
 
         public Builder addAllowedMethod(String methodName) {
-            target.allowedMethods.add(methodName);
+            if (methodName != null) {
+                allowedMethods.add(methodName);
+            }
             return this;
         }
 
         public Builder addAllowedMethod(Collection<String> methods) {
-            target.allowedMethods.addAll(methods);
+            allowedMethods.addAll(methods);
             return this;
         }
 
@@ -327,7 +331,7 @@ public class ActionConfig extends Located implements Serializable {
             target.results = Collections.unmodifiableMap(target.results);
             target.interceptors = Collections.unmodifiableList(target.interceptors);
             target.exceptionMappings = Collections.unmodifiableList(target.exceptionMappings);
-            target.allowedMethods = Collections.unmodifiableSet(target.allowedMethods);
+            target.allowedMethods = new AllowedMethods(allowedMethods);
 
             ActionConfig result = target;
             target = new ActionConfig(target);

http://git-wip-us.apache.org/repos/asf/struts/blob/3b31c428/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
new file mode 100644
index 0000000..7a4fec1
--- /dev/null
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
@@ -0,0 +1,152 @@
+package com.opensymphony.xwork2.config.entities;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+public class AllowedMethods {
+
+    private Set<AllowedMethod> allowedMethods;
+
+    public AllowedMethods(Set<String> methods) {
+        Set<AllowedMethod> allowedMethods = new HashSet<>();
+        for (String method : methods) {
+            allowedMethods.add(build(method));
+        }
+        this.allowedMethods = Collections.unmodifiableSet(allowedMethods);
+    }
+
+    private AllowedMethod build(String method) {
+        boolean isPattern = false;
+        int len = method.length();
+        StringBuilder ret = new StringBuilder();
+        char c;
+        for (int x = 0; x < len; x++) {
+            c = method.charAt(x);
+            if (x < len - 2 && c == '{' && '}' == method.charAt(x + 2)) {
+                ret.append("(.*)");
+                isPattern = true;
+                x += 2;
+            } else {
+                ret.append(c);
+            }
+        }
+        if (isPattern) {
+            return new PatternAllowedMethod(ret.toString(), method);
+        } else {
+            return new LiteralAllowedMethod(ret.toString());
+        }
+    }
+
+    public boolean isAllowed(String method) {
+        for (AllowedMethod allowedMethod : allowedMethods) {
+            if (allowedMethod.isAllowed(method)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public Set<String> list() {
+        Set<String> result = new HashSet<>();
+        for (AllowedMethod allowedMethod : allowedMethods) {
+            result.add(allowedMethod.original());
+        }
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        AllowedMethods that = (AllowedMethods) o;
+
+        return allowedMethods.equals(that.allowedMethods);
+    }
+
+    @Override
+    public int hashCode() {
+        return allowedMethods.hashCode();
+    }
+
+    private interface AllowedMethod {
+        boolean isAllowed(String methodName);
+
+        String original();
+    }
+
+    private static class PatternAllowedMethod implements AllowedMethod {
+
+        private final Pattern allowedMethodPattern;
+        private String original;
+
+        public PatternAllowedMethod(String pattern, String original) {
+            this.original = original;
+            allowedMethodPattern = Pattern.compile(pattern);
+        }
+
+        @Override
+        public boolean isAllowed(String methodName) {
+            return allowedMethodPattern.matcher(methodName).matches();
+        }
+
+        @Override
+        public String original() {
+            return original;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            PatternAllowedMethod that = (PatternAllowedMethod) o;
+
+            return original.equals(that.original);
+
+        }
+
+        @Override
+        public int hashCode() {
+            return original.hashCode();
+        }
+    }
+
+    private static class LiteralAllowedMethod implements AllowedMethod {
+
+        private String allowedMethod;
+
+        public LiteralAllowedMethod(String allowedMethod) {
+            this.allowedMethod = allowedMethod;
+        }
+
+        @Override
+        public boolean isAllowed(String methodName) {
+            return methodName.equals(allowedMethod);
+        }
+
+        @Override
+        public String original() {
+            return allowedMethod;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            LiteralAllowedMethod that = (LiteralAllowedMethod) o;
+
+            return allowedMethod.equals(that.allowedMethod);
+
+        }
+
+        @Override
+        public int hashCode() {
+            return allowedMethod.hashCode();
+        }
+    }
+
+}


[22/33] struts git commit: Drops unneeded if clause

Posted by lu...@apache.org.
Drops unneeded if clause


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/45af8765
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/45af8765
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/45af8765

Branch: refs/heads/master
Commit: 45af87655d1904bc55934512b5f0790dd04afa2d
Parents: 7db5e76
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 11:35:07 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 11:35:07 2015 +0200

----------------------------------------------------------------------
 .../struts2/convention/PackageBasedActionConfigBuilder.java      | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/45af8765/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
index 64a0e98..0fc238c 100644
--- a/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
+++ b/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
@@ -921,9 +921,7 @@ public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
         ActionConfig.Builder actionConfig = new ActionConfig.Builder(pkgCfg.getName(), actionName, className);
         actionConfig.methodName(actionMethod);
 
-        if (!allowedMethods.contains(actionMethod)) {
-            actionConfig.addAllowedMethod(actionMethod);
-        }
+        actionConfig.addAllowedMethod(actionMethod);
         actionConfig.addAllowedMethod(allowedMethods);
         actionConfig.addAllowedMethod(pkgCfg.getGlobalAllowedMethods());
 


[02/33] struts git commit: Defines global-allowed-methods

Posted by lu...@apache.org.
Defines global-allowed-methods


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/ce884e92
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/ce884e92
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/ce884e92

Branch: refs/heads/master
Commit: ce884e92a15ef601b0e119963d3c521fa68d8bb1
Parents: 065b5b7
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 14:33:31 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 14:33:31 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/ActionConfig.java    |   1 +
 .../providers/XmlConfigurationProvider.java     |  48 ++++--
 .../config/StrutsXmlConfigurationProvider.java  |   1 +
 core/src/main/resources/struts-2.5.dtd          | 156 +++++++++++++++++++
 core/src/main/resources/struts-default.xml      |   6 +-
 core/src/main/resources/xwork-2.5.dtd           | 135 ++++++++++++++++
 6 files changed, 336 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/ce884e92/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
index b947ed9..fd61ad9 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
@@ -42,6 +42,7 @@ import java.util.*;
 public class ActionConfig extends Located implements Serializable {
 
     public static final String DEFAULT_METHOD = "execute";
+    public static final String WILDCARD = "*";
 
     protected List<InterceptorMapping> interceptors; // a list of interceptorMapping Objects eg. List<InterceptorMapping>
     protected Map<String,String> params;

http://git-wip-us.apache.org/repos/asf/struts/blob/ce884e92/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 12a71c7..449d254 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -15,12 +15,24 @@
  */
 package com.opensymphony.xwork2.config.providers;
 
-import com.opensymphony.xwork2.*;
+import com.opensymphony.xwork2.Action;
+import com.opensymphony.xwork2.FileManager;
+import com.opensymphony.xwork2.FileManagerFactory;
+import com.opensymphony.xwork2.ObjectFactory;
+import com.opensymphony.xwork2.XWorkException;
 import com.opensymphony.xwork2.config.Configuration;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.config.ConfigurationProvider;
 import com.opensymphony.xwork2.config.ConfigurationUtil;
-import com.opensymphony.xwork2.config.entities.*;
+import com.opensymphony.xwork2.config.entities.ActionConfig;
+import com.opensymphony.xwork2.config.entities.ExceptionMappingConfig;
+import com.opensymphony.xwork2.config.entities.InterceptorConfig;
+import com.opensymphony.xwork2.config.entities.InterceptorMapping;
+import com.opensymphony.xwork2.config.entities.InterceptorStackConfig;
+import com.opensymphony.xwork2.config.entities.PackageConfig;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
+import com.opensymphony.xwork2.config.entities.ResultTypeConfig;
+import com.opensymphony.xwork2.config.entities.UnknownHandlerConfig;
 import com.opensymphony.xwork2.config.impl.LocatableFactory;
 import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.inject.ContainerBuilder;
@@ -47,7 +59,17 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Modifier;
 import java.net.URL;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
 
 
 /**
@@ -90,6 +112,7 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         this.errorIfMissing = errorIfMissing;
 
         Map<String, String> mappings = new HashMap<>();
+        mappings.put("-//Apache Struts//XWork 2.5//EN", "xwork-2.5.dtd");
         mappings.put("-//Apache Struts//XWork 2.3//EN", "xwork-2.3.dtd");
         mappings.put("-//Apache Struts//XWork 2.1.3//EN", "xwork-2.1.3.dtd");
         mappings.put("-//Apache Struts//XWork 2.1//EN", "xwork-2.1.dtd");
@@ -522,6 +545,8 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         // load the global result list for this package
         loadGlobalResults(newPackage, packageElement);
 
+        loadGlobalAllowedMethods(newPackage, packageElement);
+
         // load the global exception handler list for this package
         loadGobalExceptionMappings(newPackage, packageElement);
 
@@ -623,8 +648,6 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         boolean isAbstract = Boolean.parseBoolean(abstractVal);
         String name = StringUtils.defaultString(packageElement.getAttribute("name"));
         String namespace = StringUtils.defaultString(packageElement.getAttribute("namespace"));
-        String strictDMIVal = StringUtils.defaultString(packageElement.getAttribute("strict-method-invocation"));
-        boolean strictDMI = Boolean.parseBoolean(strictDMIVal);
 
         if (StringUtils.isNotEmpty(packageElement.getAttribute("externalReferenceResolver"))) {
             throw new ConfigurationException("The 'externalReferenceResolver' attribute has been removed.  Please use " +
@@ -634,7 +657,6 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         PackageConfig.Builder cfg = new PackageConfig.Builder(name)
                 .namespace(namespace)
                 .isAbstract(isAbstract)
-                .strictMethodInvocation(strictDMI)
                 .location(DomHelper.getLocationObject(packageElement));
 
         if (StringUtils.isNotEmpty(StringUtils.defaultString(parent))) { // has parents, let's look it up
@@ -825,7 +847,7 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
     protected Set<String> buildAllowedMethods(Element element, PackageConfig.Builder packageContext) {
         NodeList allowedMethodsEls = element.getElementsByTagName("allowed-methods");
 
-        Set<String> allowedMethods = null;
+        Set<String> allowedMethods = packageContext.getGlobalAllowedMethods();
 
         if (allowedMethodsEls.getLength() > 0) {
             allowedMethods = new HashSet<>();
@@ -836,8 +858,6 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
                     allowedMethods = TextParseUtil.commaDelimitedStringToSet(s);
                 }
             }
-        } else if (packageContext.isStrictMethodInvocation()) {
-            allowedMethods = new HashSet<>();
         }
 
         return allowedMethods;
@@ -877,6 +897,16 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         }
     }
 
+    protected void loadGlobalAllowedMethods(PackageConfig.Builder packageContext, Element packageElement) {
+        NodeList globalAllowedMethods = packageElement.getElementsByTagName("global-allowed-methods");
+
+        if (globalAllowedMethods.getLength() > 0) {
+            Element globalAllowedMethodsElement = (Element) globalAllowedMethods.item(0);
+            Set<String> results = TextParseUtil.commaDelimitedStringToSet(globalAllowedMethodsElement.getAttribute("methods"));
+            packageContext.addGlobalAllowedMethods(results);
+        }
+    }
+
     protected void loadDefaultClassRef(PackageConfig.Builder packageContext, Element element) {
         NodeList defaultClassRefList = element.getElementsByTagName("default-class-ref");
         if (defaultClassRefList.getLength() > 0) {

http://git-wip-us.apache.org/repos/asf/struts/blob/ce884e92/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java b/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java
index cca80b7..e39e475 100644
--- a/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java
+++ b/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java
@@ -75,6 +75,7 @@ public class StrutsXmlConfigurationProvider extends XmlConfigurationProvider {
         dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.1//EN", "struts-2.1.dtd");
         dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN", "struts-2.1.7.dtd");
         dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.3//EN", "struts-2.3.dtd");
+        dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.5//EN", "struts-2.5.dtd");
         setDtdMappings(dtdMappings);
         File file = new File(filename);
         if (file.getParent() != null) {

http://git-wip-us.apache.org/repos/asf/struts/blob/ce884e92/core/src/main/resources/struts-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-2.5.dtd b/core/src/main/resources/struts-2.5.dtd
new file mode 100644
index 0000000..86afbc0
--- /dev/null
+++ b/core/src/main/resources/struts-2.5.dtd
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * $Id: struts-2.0.dtd 651946 2008-04-27 13:41:38Z apetrelli $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+<!-- START SNIPPET: strutsDtd -->
+
+<!--
+   Struts configuration DTD.
+   Use the following DOCTYPE
+
+   <!DOCTYPE struts PUBLIC
+	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
+	"http://struts.apache.org/dtds/struts-2.5.dtd">
+-->
+
+<!ELEMENT struts ((package|include|bean|constant)*, unknown-handler-stack?)>
+<!ATTLIST struts
+    order CDATA #IMPLIED
+>
+
+<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-allowed-methods? global-exception-mappings?, action*)>
+<!ATTLIST package
+    name CDATA #REQUIRED
+    extends CDATA #IMPLIED
+    namespace CDATA #IMPLIED
+    abstract CDATA #IMPLIED
+    externalReferenceResolver NMTOKEN #IMPLIED
+>
+
+<!ELEMENT result-types (result-type+)>
+
+<!ELEMENT result-type (param*)>
+<!ATTLIST result-type
+    name CDATA #REQUIRED
+    class CDATA #REQUIRED
+    default (true|false) "false"
+>
+
+<!ELEMENT interceptors (interceptor|interceptor-stack)+>
+
+<!ELEMENT interceptor (param*)>
+<!ATTLIST interceptor
+    name CDATA #REQUIRED
+    class CDATA #REQUIRED
+>
+
+<!ELEMENT interceptor-stack (interceptor-ref*)>
+<!ATTLIST interceptor-stack
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT interceptor-ref (param*)>
+<!ATTLIST interceptor-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-interceptor-ref (#PCDATA)>
+<!ATTLIST default-interceptor-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-action-ref (#PCDATA)>
+<!ATTLIST default-action-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-class-ref (#PCDATA)>
+<!ATTLIST default-class-ref
+    class CDATA #REQUIRED
+>
+
+<!ELEMENT global-results (result+)>
+
+<!ELEMENT global-allowed-methods (#PCDATA)>
+<!ATTLIST global-allowed-methods
+    methods CDATA #REQUIRED
+>
+
+<!ELEMENT global-exception-mappings (exception-mapping+)>
+
+<!ELEMENT action ((param|result|interceptor-ref|exception-mapping)*,allowed-methods?)>
+<!ATTLIST action
+    name CDATA #REQUIRED
+    class CDATA #IMPLIED
+    method CDATA #IMPLIED
+    converter CDATA #IMPLIED
+>
+
+<!ELEMENT param (#PCDATA)>
+<!ATTLIST param
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT result (#PCDATA|param)*>
+<!ATTLIST result
+    name CDATA #IMPLIED
+    type CDATA #IMPLIED
+>
+
+<!ELEMENT exception-mapping (#PCDATA|param)*>
+<!ATTLIST exception-mapping
+    name CDATA #IMPLIED
+    exception CDATA #REQUIRED
+    result CDATA #REQUIRED
+>
+
+<!ELEMENT allowed-methods (#PCDATA)>
+
+<!ELEMENT include (#PCDATA)>
+<!ATTLIST include
+    file CDATA #REQUIRED
+>
+
+<!ELEMENT bean (#PCDATA)>
+<!ATTLIST bean
+    type CDATA #IMPLIED
+    name CDATA #IMPLIED
+    class CDATA #REQUIRED
+    scope CDATA #IMPLIED
+    static CDATA #IMPLIED
+    optional CDATA #IMPLIED
+>
+
+<!ELEMENT constant (#PCDATA)>
+<!ATTLIST constant
+    name CDATA #REQUIRED
+    value CDATA #REQUIRED
+>
+
+<!ELEMENT unknown-handler-stack (unknown-handler-ref*)>
+<!ELEMENT unknown-handler-ref (#PCDATA)>
+<!ATTLIST unknown-handler-ref
+    name CDATA #REQUIRED
+>
+
+<!-- END SNIPPET: strutsDtd -->
+

http://git-wip-us.apache.org/repos/asf/struts/blob/ce884e92/core/src/main/resources/struts-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index ca2a654..9fc1c21 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -33,8 +33,8 @@
     and {@link com.opensymphony.xwork2.inject.Inject}
 -->
 <!DOCTYPE struts PUBLIC
-    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
-    "http://struts.apache.org/dtds/struts-2.3.dtd">
+    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
+    "http://struts.apache.org/dtds/struts-2.5.dtd">
 
 <struts>
 
@@ -358,6 +358,8 @@
 
        </interceptors>
 
+       <global-allowed-methods methods="execute,input,back,cancel,browse"/>
+
         <default-interceptor-ref name="defaultStack"/>
 
         <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

http://git-wip-us.apache.org/repos/asf/struts/blob/ce884e92/core/src/main/resources/xwork-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/xwork-2.5.dtd b/core/src/main/resources/xwork-2.5.dtd
new file mode 100644
index 0000000..efbd765
--- /dev/null
+++ b/core/src/main/resources/xwork-2.5.dtd
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- START SNIPPET: xworkDtd -->
+
+<!--
+   XWork configuration DTD.
+   Use the following DOCTYPE
+
+   <!DOCTYPE xwork PUBLIC
+	"-//Apache Struts//XWork 2.5//EN"
+	"http://struts.apache.org/dtds/xwork-2.5.dtd">
+-->
+
+<!ELEMENT xwork ((package|include|bean|constant)*, unknown-handler-stack?)>
+<!ATTLIST xwork
+    order CDATA #IMPLIED
+>
+
+<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-allowed-methods?, global-exception-mappings?, action*)>
+<!ATTLIST package
+    name CDATA #REQUIRED
+    extends CDATA #IMPLIED
+    namespace CDATA #IMPLIED
+    abstract CDATA #IMPLIED
+    strict-method-invocation CDATA #IMPLIED
+>
+
+<!ELEMENT result-types (result-type+)>
+
+<!ELEMENT result-type (param*)>
+<!ATTLIST result-type
+    name CDATA #REQUIRED
+    class CDATA #REQUIRED
+    default (true|false) "false"
+>
+
+<!ELEMENT interceptors (interceptor|interceptor-stack)+>
+
+<!ELEMENT interceptor (param*)>
+<!ATTLIST interceptor
+    name CDATA #REQUIRED
+    class CDATA #REQUIRED
+>
+
+<!ELEMENT interceptor-stack (interceptor-ref*)>
+<!ATTLIST interceptor-stack
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT interceptor-ref (param*)>
+<!ATTLIST interceptor-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-interceptor-ref (#PCDATA)>
+<!ATTLIST default-interceptor-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-action-ref (#PCDATA)>
+<!ATTLIST default-action-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-class-ref (#PCDATA)>
+<!ATTLIST default-class-ref
+   class CDATA #REQUIRED
+>
+
+<!ELEMENT global-results (result+)>
+
+<!ELEMENT global-allowed-methods (#PCDATA)>
+<!ATTLIST global-allowed-methods
+    methods CDATA #REQUIRED
+>
+
+<!ELEMENT global-exception-mappings (exception-mapping+)>
+
+<!ELEMENT action ((param|result|interceptor-ref|exception-mapping)*,allowed-methods?)>
+<!ATTLIST action
+    name CDATA #REQUIRED
+    class CDATA #IMPLIED
+    method CDATA #IMPLIED
+    converter CDATA #IMPLIED
+>
+
+<!ELEMENT param (#PCDATA)>
+<!ATTLIST param
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT result (#PCDATA|param)*>
+<!ATTLIST result
+    name CDATA #IMPLIED
+    type CDATA #IMPLIED
+>
+
+<!ELEMENT exception-mapping (#PCDATA|param)*>
+<!ATTLIST exception-mapping
+    name CDATA #IMPLIED
+    exception CDATA #REQUIRED
+    result CDATA #REQUIRED
+>
+
+<!ELEMENT allowed-methods (#PCDATA)>
+
+<!ELEMENT include (#PCDATA)>
+<!ATTLIST include
+    file CDATA #REQUIRED
+>
+
+<!ELEMENT bean (#PCDATA)>
+<!ATTLIST bean
+    type CDATA #IMPLIED
+    name CDATA #IMPLIED
+    class CDATA #REQUIRED
+    scope CDATA #IMPLIED
+    static CDATA #IMPLIED
+    optional CDATA #IMPLIED
+>
+
+<!ELEMENT constant (#PCDATA)>
+<!ATTLIST constant
+    name CDATA #REQUIRED
+    value CDATA #REQUIRED
+>
+
+<!ELEMENT unknown-handler-stack (unknown-handler-ref*)>
+<!ELEMENT unknown-handler-ref (#PCDATA)>
+<!ATTLIST unknown-handler-ref
+    name CDATA #REQUIRED
+>
+
+<!-- END SNIPPET: xworkDtd -->
+


[27/33] struts git commit: Inherits parents' strict DMI

Posted by lu...@apache.org.
Inherits parents' strict DMI


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/29407614
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/29407614
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/29407614

Branch: refs/heads/master
Commit: 294076145f153e291eb7c38bb58a9b04bf3fb0e5
Parents: a61a369
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Tue Sep 8 08:24:28 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Tue Sep 8 08:24:28 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/PackageConfig.java   | 102 +++++++++----------
 ...mlConfigurationProviderInterceptorsTest.java |   2 -
 2 files changed, 46 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/29407614/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
index aa53a12..10286c4 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
@@ -53,6 +53,7 @@ public class PackageConfig extends Located implements Comparable, Serializable,
     protected String namespace = "";
     protected boolean isAbstract = false;
     protected boolean needsRefresh;
+    protected boolean strictMethodInvocation = true;
 
     protected PackageConfig(String name) {
         this.name = name;
@@ -82,6 +83,7 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         this.globalExceptionMappingConfigs = new ArrayList<>(orig.globalExceptionMappingConfigs);
         this.parents = new ArrayList<>(orig.parents);
         this.location = orig.location;
+        this.strictMethodInvocation = orig.strictMethodInvocation;
     }
 
     public boolean isAbstract() {
@@ -330,7 +332,6 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         return resultTypeConfigs;
     }
 
-
     public boolean isNeedsRefresh() {
         return needsRefresh;
     }
@@ -345,80 +346,64 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         return globalExceptionMappingConfigs;
     }
 
+    public boolean isStrictMethodInvocation() {
+        return strictMethodInvocation;
+    }
+
     @Override
     public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (!(o instanceof PackageConfig)) {
-            return false;
-        }
-
-        final PackageConfig packageConfig = (PackageConfig) o;
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
 
-        if (isAbstract != packageConfig.isAbstract) {
-            return false;
-        }
+        PackageConfig that = (PackageConfig) o;
 
-        if ((actionConfigs != null) ? (!actionConfigs.equals(packageConfig.actionConfigs)) : (packageConfig.actionConfigs != null)) {
+        if (isAbstract != that.isAbstract) return false;
+        if (needsRefresh != that.needsRefresh) return false;
+        if (strictMethodInvocation != that.strictMethodInvocation) return false;
+        if (actionConfigs != null ? !actionConfigs.equals(that.actionConfigs) : that.actionConfigs != null)
             return false;
-        }
-
-        if ((defaultResultType != null) ? (!defaultResultType.equals(packageConfig.defaultResultType)) : (packageConfig.defaultResultType != null)) {
+        if (globalResultConfigs != null ? !globalResultConfigs.equals(that.globalResultConfigs) : that.globalResultConfigs != null)
             return false;
-        }
-
-        if ((defaultClassRef != null) ? (!defaultClassRef.equals(packageConfig.defaultClassRef)) : (packageConfig.defaultClassRef != null)) {
+        if (globalAllowedMethods != null ? !globalAllowedMethods.equals(that.globalAllowedMethods) : that.globalAllowedMethods != null)
             return false;
-        }
-
-        if ((globalResultConfigs != null) ? (!globalResultConfigs.equals(packageConfig.globalResultConfigs)) : (packageConfig.globalResultConfigs != null)) {
+        if (interceptorConfigs != null ? !interceptorConfigs.equals(that.interceptorConfigs) : that.interceptorConfigs != null)
             return false;
-        }
-
-        if ((interceptorConfigs != null) ? (!interceptorConfigs.equals(packageConfig.interceptorConfigs)) : (packageConfig.interceptorConfigs != null)) {
+        if (resultTypeConfigs != null ? !resultTypeConfigs.equals(that.resultTypeConfigs) : that.resultTypeConfigs != null)
             return false;
-        }
-
-        if ((name != null) ? (!name.equals(packageConfig.name)) : (packageConfig.name != null)) {
+        if (globalExceptionMappingConfigs != null ? !globalExceptionMappingConfigs.equals(that.globalExceptionMappingConfigs) : that.globalExceptionMappingConfigs != null)
             return false;
-        }
-
-        if ((namespace != null) ? (!namespace.equals(packageConfig.namespace)) : (packageConfig.namespace != null)) {
+        if (parents != null ? !parents.equals(that.parents) : that.parents != null) return false;
+        if (defaultInterceptorRef != null ? !defaultInterceptorRef.equals(that.defaultInterceptorRef) : that.defaultInterceptorRef != null)
             return false;
-        }
-
-        if ((parents != null) ? (!parents.equals(packageConfig.parents)) : (packageConfig.parents != null)) {
+        if (defaultActionRef != null ? !defaultActionRef.equals(that.defaultActionRef) : that.defaultActionRef != null)
             return false;
-        }
-
-        if ((resultTypeConfigs != null) ? (!resultTypeConfigs.equals(packageConfig.resultTypeConfigs)) : (packageConfig.resultTypeConfigs != null)) {
+        if (defaultResultType != null ? !defaultResultType.equals(that.defaultResultType) : that.defaultResultType != null)
             return false;
-        }
-
-        if ((globalExceptionMappingConfigs != null) ? (!globalExceptionMappingConfigs.equals(packageConfig.globalExceptionMappingConfigs)) : (packageConfig.globalExceptionMappingConfigs != null)) {
+        if (defaultClassRef != null ? !defaultClassRef.equals(that.defaultClassRef) : that.defaultClassRef != null)
             return false;
-        }
+        if (!name.equals(that.name)) return false;
+        return !(namespace != null ? !namespace.equals(that.namespace) : that.namespace != null);
 
-        return true;
     }
 
     @Override
     public int hashCode() {
-        int result;
-        result = ((name != null) ? name.hashCode() : 0);
-        result = (29 * result) + ((parents != null) ? parents.hashCode() : 0);
-        result = (29 * result) + ((actionConfigs != null) ? actionConfigs.hashCode() : 0);
-        result = (29 * result) + ((globalResultConfigs != null) ? globalResultConfigs.hashCode() : 0);
-        result = (29 * result) + ((interceptorConfigs != null) ? interceptorConfigs.hashCode() : 0);
-        result = (29 * result) + ((resultTypeConfigs != null) ? resultTypeConfigs.hashCode() : 0);
-        result = (29 * result) + ((globalExceptionMappingConfigs != null) ? globalExceptionMappingConfigs.hashCode() : 0);
-        result = (29 * result) + ((defaultResultType != null) ? defaultResultType.hashCode() : 0);
-        result = (29 * result) + ((defaultClassRef != null) ? defaultClassRef.hashCode() : 0);
-        result = (29 * result) + ((namespace != null) ? namespace.hashCode() : 0);
-        result = (29 * result) + (isAbstract ? 1 : 0);
-
+        int result = actionConfigs != null ? actionConfigs.hashCode() : 0;
+        result = 31 * result + (globalResultConfigs != null ? globalResultConfigs.hashCode() : 0);
+        result = 31 * result + (globalAllowedMethods != null ? globalAllowedMethods.hashCode() : 0);
+        result = 31 * result + (interceptorConfigs != null ? interceptorConfigs.hashCode() : 0);
+        result = 31 * result + (resultTypeConfigs != null ? resultTypeConfigs.hashCode() : 0);
+        result = 31 * result + (globalExceptionMappingConfigs != null ? globalExceptionMappingConfigs.hashCode() : 0);
+        result = 31 * result + (parents != null ? parents.hashCode() : 0);
+        result = 31 * result + (defaultInterceptorRef != null ? defaultInterceptorRef.hashCode() : 0);
+        result = 31 * result + (defaultActionRef != null ? defaultActionRef.hashCode() : 0);
+        result = 31 * result + (defaultResultType != null ? defaultResultType.hashCode() : 0);
+        result = 31 * result + (defaultClassRef != null ? defaultClassRef.hashCode() : 0);
+        result = 31 * result + name.hashCode();
+        result = 31 * result + (namespace != null ? namespace.hashCode() : 0);
+        result = 31 * result + (isAbstract ? 1 : 0);
+        result = 31 * result + (needsRefresh ? 1 : 0);
+        result = 31 * result + (strictMethodInvocation ? 1 : 0);
         return result;
     }
 
@@ -620,6 +605,11 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         }
 
         public boolean isStrictMethodInvocation() {
+            for (PackageConfig parent : target.parents) {
+                if (parent.isStrictMethodInvocation()) {
+                    return true;
+                }
+            }
             return strictDMI;
         }
 

http://git-wip-us.apache.org/repos/asf/struts/blob/29407614/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
index b10eb49..cfd7f60 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
@@ -120,7 +120,6 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
         // this should inherit
         ActionConfig actionWithNoRef = new ActionConfig.Builder("", "ActionWithNoRef", SimpleAction.class.getName())
             .addInterceptor(new InterceptorMapping("timer", objectFactory.buildInterceptor(timerInterceptor, new HashMap<String, String>())))
-            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         interceptors = new ArrayList<>();
@@ -128,7 +127,6 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
 
         ActionConfig anotherActionWithOwnRef = new ActionConfig.Builder("", "AnotherActionWithOwnRef", SimpleAction.class.getName())
             .addInterceptor(new InterceptorMapping("logging", objectFactory.buildInterceptor(loggingInterceptor, new HashMap<String, String>())))
-            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         RuntimeConfiguration runtimeConfig = configurationManager.getConfiguration().getRuntimeConfiguration();


[14/33] struts git commit: Implements required method

Posted by lu...@apache.org.
Implements required method


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/77691563
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/77691563
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/77691563

Branch: refs/heads/master
Commit: 77691563b9b8d2ad01c078a66d1ed207bf3611b3
Parents: 4c7a7dd
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 21:46:47 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 21:46:47 2015 +0200

----------------------------------------------------------------------
 .../struts2/convention/ConventionUnknownHandler.java      | 10 ++++++++++
 1 file changed, 10 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/77691563/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java b/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
index 85ce714..78c1956 100644
--- a/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
+++ b/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
@@ -28,6 +28,7 @@ import com.opensymphony.xwork2.config.providers.InterceptorBuilder;
 import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.ClassLoaderUtil;
+import com.opensymphony.xwork2.util.TextParseUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -67,6 +68,8 @@ public class ConventionUnknownHandler implements UnknownHandler {
     private ConventionsService conventionsService;
     private String nameSeparator;
 
+    protected Set<String> allowedMethods = new HashSet<>();
+
     /**
      * Constructs the unknown handler.
      *
@@ -102,6 +105,8 @@ public class ConventionUnknownHandler implements UnknownHandler {
         }
 
         this.redirectToSlash = Boolean.parseBoolean(redirectToSlash);
+
+        allowedMethods = TextParseUtil.commaDelimitedStringToSet("execute,input,back,cancel,browse");
     }
 
     public ActionConfig handleUnknownAction(String namespace, String actionName)
@@ -398,4 +403,9 @@ public class ConventionUnknownHandler implements UnknownHandler {
             this.ext = ext;
         }
     }
+
+    @Override
+    public boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig) {
+        return false;
+    }
 }


[33/33] struts git commit: WW-4540 Implements Strict DMI aka SMI

Posted by lu...@apache.org.
WW-4540 Implements Strict DMI aka SMI


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/b8826816
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/b8826816
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/b8826816

Branch: refs/heads/master
Commit: b8826816550422be78be1f7f86ef28f86ee3ca3c
Parents: 48ea26b fdb6dae
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Sep 28 20:51:50 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Sep 28 20:51:50 2015 +0200

----------------------------------------------------------------------
 .../opensymphony/xwork2/DefaultActionProxy.java |   9 +-
 .../xwork2/DefaultUnknownHandlerManager.java    |   1 +
 .../xwork2/UnknownHandlerManager.java           |   1 +
 .../xwork2/config/entities/ActionConfig.java    |  56 +++---
 .../xwork2/config/entities/AllowedMethods.java  | 172 +++++++++++++++++++
 .../xwork2/config/entities/PackageConfig.java   | 136 ++++++++-------
 .../xwork2/config/impl/ActionConfigMatcher.java |   2 +-
 .../providers/XmlConfigurationProvider.java     |  85 +++++++--
 .../config/StrutsXmlConfigurationProvider.java  |   1 +
 core/src/main/resources/struts-2.5.dtd          | 153 +++++++++++++++++
 core/src/main/resources/struts-default.xml      |   9 +-
 core/src/main/resources/xwork-2.5.dtd           | 132 ++++++++++++++
 .../xwork2/ActionInvocationTest.java            |  17 +-
 .../config/entities/AllowedMethodsTest.java     |  55 ++++++
 .../config/entities/PackageConfigTest.java      |  62 ++++++-
 .../XmlConfigurationProviderActionsTest.java    |   8 +-
 ...ConfigurationProviderAllowedMethodsTest.java |   4 +-
 ...figurationProviderExceptionMappingsTest.java |   6 +-
 .../struts2/TestConfigurationProvider.java      |   1 +
 .../providers/xwork-test-allowed-methods.xml    |   2 +-
 core/src/test/resources/xwork-sample.xml        |   6 +-
 .../convention/ConventionUnknownHandler.java    |   6 +
 .../PackageBasedActionConfigBuilder.java        |  32 +++-
 .../convention/annotation/AllowedMethods.java   |  30 ++++
 .../PackageBasedActionConfigBuilderTest.java    |  60 ++++++-
 .../ClassLevelAllowedMethodsAction.java         |  10 ++
 .../PackageLevelAllowedMethodsAction.java       |   7 +
 .../actions/allowedmethods/package-info.java    |  23 +++
 .../PackageLevelAllowedMethodsChildAction.java  |   9 +
 29 files changed, 944 insertions(+), 151 deletions(-)
----------------------------------------------------------------------



[10/33] struts git commit: Simplifies implementation

Posted by lu...@apache.org.
Simplifies implementation


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/18553046
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/18553046
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/18553046

Branch: refs/heads/master
Commit: 185530464b838b3aac9681b5ff5b16401ccef56d
Parents: 3b31c42
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 18:36:41 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 18:36:41 2015 +0200

----------------------------------------------------------------------
 .../config/providers/XmlConfigurationProvider.java  | 16 +++++++++++-----
 core/src/main/resources/struts-2.5.dtd              |  3 ---
 core/src/main/resources/struts-default.xml          |  2 +-
 core/src/main/resources/xwork-2.5.dtd               |  3 ---
 core/src/test/resources/xwork-sample.xml            |  2 +-
 5 files changed, 13 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/18553046/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index fd9f92a..0d64ad7 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -893,12 +893,18 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
     }
 
     protected void loadGlobalAllowedMethods(PackageConfig.Builder packageContext, Element packageElement) {
-        NodeList globalAllowedMethods = packageElement.getElementsByTagName("global-allowed-methods");
+        NodeList globalAllowedMethodsElms = packageElement.getElementsByTagName("global-allowed-methods");
 
-        if (globalAllowedMethods.getLength() > 0) {
-            Element globalAllowedMethodsElement = (Element) globalAllowedMethods.item(0);
-            Set<String> results = TextParseUtil.commaDelimitedStringToSet(globalAllowedMethodsElement.getAttribute("methods"));
-            packageContext.addGlobalAllowedMethods(results);
+        if (globalAllowedMethodsElms.getLength() > 0) {
+            Set<String> globalAllowedMethods = new HashSet<>();
+            Node n = globalAllowedMethodsElms.item(0).getFirstChild();
+            if (n != null) {
+                String s = n.getNodeValue().trim();
+                if (s.length() > 0) {
+                    globalAllowedMethods = TextParseUtil.commaDelimitedStringToSet(s);
+                }
+            }
+            packageContext.addGlobalAllowedMethods(globalAllowedMethods);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/struts/blob/18553046/core/src/main/resources/struts-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-2.5.dtd b/core/src/main/resources/struts-2.5.dtd
index 25ca800..6591ddb 100644
--- a/core/src/main/resources/struts-2.5.dtd
+++ b/core/src/main/resources/struts-2.5.dtd
@@ -90,9 +90,6 @@
 <!ELEMENT global-results (result+)>
 
 <!ELEMENT global-allowed-methods (#PCDATA)>
-<!ATTLIST global-allowed-methods
-    methods CDATA #REQUIRED
->
 
 <!ELEMENT global-exception-mappings (exception-mapping+)>
 

http://git-wip-us.apache.org/repos/asf/struts/blob/18553046/core/src/main/resources/struts-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index 9fc1c21..d7a0ee0 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -358,7 +358,7 @@
 
        </interceptors>
 
-       <global-allowed-methods methods="execute,input,back,cancel,browse"/>
+       <global-allowed-methods>execute,input,back,cancel,browse</global-allowed-methods>
 
         <default-interceptor-ref name="defaultStack"/>
 

http://git-wip-us.apache.org/repos/asf/struts/blob/18553046/core/src/main/resources/xwork-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/xwork-2.5.dtd b/core/src/main/resources/xwork-2.5.dtd
index 4d3e1ca..197d0c1 100644
--- a/core/src/main/resources/xwork-2.5.dtd
+++ b/core/src/main/resources/xwork-2.5.dtd
@@ -69,9 +69,6 @@
 <!ELEMENT global-results (result+)>
 
 <!ELEMENT global-allowed-methods (#PCDATA)>
-<!ATTLIST global-allowed-methods
-    methods CDATA #REQUIRED
->
 
 <!ELEMENT global-exception-mappings (exception-mapping+)>
 

http://git-wip-us.apache.org/repos/asf/struts/blob/18553046/core/src/test/resources/xwork-sample.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/xwork-sample.xml b/core/src/test/resources/xwork-sample.xml
index cd2ddcb..7f5e547 100644
--- a/core/src/test/resources/xwork-sample.xml
+++ b/core/src/test/resources/xwork-sample.xml
@@ -14,7 +14,7 @@
             </result>
         </global-results>
 
-        <global-allowed-methods methods="execute,input,back,cancel,browse"/>
+        <global-allowed-methods>execute,input,back,cancel,browse</global-allowed-methods>
 
         <action name="Foo" class="com.opensymphony.xwork2.SimpleAction">
             <param name="foo">17</param>


[03/33] struts git commit: Uses global-allowed-methods config para

Posted by lu...@apache.org.
Uses global-allowed-methods config para


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/fd22e3a1
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/fd22e3a1
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/fd22e3a1

Branch: refs/heads/master
Commit: fd22e3a16c88ef0528c1e26e0d6bdfdf1c02c755
Parents: ce884e9
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 14:35:16 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 14:35:16 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/PackageConfig.java   | 22 +++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/fd22e3a1/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
index c9ef12d..19ce36f 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
@@ -40,6 +40,7 @@ public class PackageConfig extends Located implements Comparable, Serializable,
 
     protected Map<String, ActionConfig> actionConfigs;
     protected Map<String, ResultConfig> globalResultConfigs;
+    protected Set<String> globalAllowedMethods;
     protected Map<String, Object> interceptorConfigs;
     protected Map<String, ResultTypeConfig> resultTypeConfigs;
     protected List<ExceptionMappingConfig> globalExceptionMappingConfigs;
@@ -57,6 +58,7 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         this.name = name;
         actionConfigs = new LinkedHashMap<>();
         globalResultConfigs = new LinkedHashMap<>();
+        globalAllowedMethods = new HashSet<>();
         interceptorConfigs = new LinkedHashMap<>();
         resultTypeConfigs = new LinkedHashMap<>();
         globalExceptionMappingConfigs = new ArrayList<>();
@@ -74,6 +76,7 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         this.needsRefresh = orig.needsRefresh;
         this.actionConfigs = new LinkedHashMap<>(orig.actionConfigs);
         this.globalResultConfigs = new LinkedHashMap<>(orig.globalResultConfigs);
+        this.globalAllowedMethods = new LinkedHashSet<>(orig.globalAllowedMethods);
         this.interceptorConfigs = new LinkedHashMap<>(orig.interceptorConfigs);
         this.resultTypeConfigs = new LinkedHashMap<>(orig.resultTypeConfigs);
         this.globalExceptionMappingConfigs = new ArrayList<>(orig.globalExceptionMappingConfigs);
@@ -445,7 +448,6 @@ public class PackageConfig extends Located implements Comparable, Serializable,
     public static class Builder implements InterceptorLocator {
 
         protected PackageConfig target;
-        private boolean strictDMI;
 
         public Builder(String name) {
             target = new PackageConfig(name);
@@ -528,6 +530,15 @@ public class PackageConfig extends Located implements Comparable, Serializable,
             return this;
         }
 
+        public Set<String> getGlobalAllowedMethods() {
+            return target.globalAllowedMethods;
+        }
+
+        public Builder addGlobalAllowedMethods(Set<String> allowedMethods) {
+            target.globalAllowedMethods.addAll(allowedMethods);
+            return this;
+        }
+
         public Builder addExceptionMappingConfig(ExceptionMappingConfig exceptionMappingConfig) {
             target.globalExceptionMappingConfigs.add(exceptionMappingConfig);
             return this;
@@ -591,15 +602,6 @@ public class PackageConfig extends Located implements Comparable, Serializable,
             return target.getAllInterceptorConfigs().get(name);
         }
 
-        public Builder strictMethodInvocation(boolean strict) {
-            strictDMI = strict;
-            return this;
-        }
-
-        public boolean isStrictMethodInvocation() {
-            return strictDMI;
-        }
-
         public PackageConfig build() {
             embalmTarget();
             PackageConfig result = target;


[17/33] struts git commit: Puts back option to disable strict DMI

Posted by lu...@apache.org.
Puts back option to disable strict DMI


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/e4fc8528
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/e4fc8528
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/e4fc8528

Branch: refs/heads/master
Commit: e4fc8528b874d5d4d454ec8d8976b696a8375f82
Parents: ab5fb27
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 08:55:14 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 08:55:14 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/PackageConfig.java             | 10 ++++++++++
 .../xwork2/config/providers/XmlConfigurationProvider.java |  3 +++
 core/src/main/resources/struts-2.5.dtd                    |  1 +
 core/src/main/resources/xwork-2.5.dtd                     |  1 +
 4 files changed, 15 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/e4fc8528/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
index 093985c..aa53a12 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
@@ -448,6 +448,7 @@ public class PackageConfig extends Located implements Comparable, Serializable,
     public static class Builder implements InterceptorLocator {
 
         protected PackageConfig target;
+        private boolean strictDMI;
 
         public Builder(String name) {
             target = new PackageConfig(name);
@@ -613,6 +614,15 @@ public class PackageConfig extends Located implements Comparable, Serializable,
             return target.getAllInterceptorConfigs().get(name);
         }
 
+        public Builder strictMethodInvocation(boolean strict) {
+            strictDMI = strict;
+            return this;
+        }
+
+        public boolean isStrictMethodInvocation() {
+            return strictDMI;
+        }
+
         public PackageConfig build() {
             embalmTarget();
             PackageConfig result = target;

http://git-wip-us.apache.org/repos/asf/struts/blob/e4fc8528/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 0302a68..3009dcb 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -649,9 +649,12 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         String name = StringUtils.defaultString(packageElement.getAttribute("name"));
         String namespace = StringUtils.defaultString(packageElement.getAttribute("namespace"));
 
+        boolean strictDMI = Boolean.parseBoolean(packageElement.getAttribute("strict-method-invocation"));
+
         PackageConfig.Builder cfg = new PackageConfig.Builder(name)
                 .namespace(namespace)
                 .isAbstract(isAbstract)
+                .strictMethodInvocation(strictDMI)
                 .location(DomHelper.getLocationObject(packageElement));
 
         if (StringUtils.isNotEmpty(StringUtils.defaultString(parent))) { // has parents, let's look it up

http://git-wip-us.apache.org/repos/asf/struts/blob/e4fc8528/core/src/main/resources/struts-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-2.5.dtd b/core/src/main/resources/struts-2.5.dtd
index 0845eee..b426d29 100644
--- a/core/src/main/resources/struts-2.5.dtd
+++ b/core/src/main/resources/struts-2.5.dtd
@@ -43,6 +43,7 @@
     extends CDATA #IMPLIED
     namespace CDATA #IMPLIED
     abstract CDATA #IMPLIED
+    strict-method-invocation (true|false) "true"
 >
 
 <!ELEMENT result-types (result-type+)>

http://git-wip-us.apache.org/repos/asf/struts/blob/e4fc8528/core/src/main/resources/xwork-2.5.dtd
----------------------------------------------------------------------
diff --git a/core/src/main/resources/xwork-2.5.dtd b/core/src/main/resources/xwork-2.5.dtd
index 197d0c1..31c1167 100644
--- a/core/src/main/resources/xwork-2.5.dtd
+++ b/core/src/main/resources/xwork-2.5.dtd
@@ -22,6 +22,7 @@
     extends CDATA #IMPLIED
     namespace CDATA #IMPLIED
     abstract CDATA #IMPLIED
+    strict-method-invocation (true|false) "true"
 >
 
 <!ELEMENT result-types (result-type+)>


[26/33] struts git commit: Drops support for handleUnknownAllowedMethod as it was added to satisfy test

Posted by lu...@apache.org.
Drops support for handleUnknownAllowedMethod as it was added to satisfy test


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/a61a3692
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/a61a3692
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/a61a3692

Branch: refs/heads/master
Commit: a61a3692241d0da833139b9e4eab10a4a3e496aa
Parents: e9e6ae9
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Sun Sep 6 10:36:51 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Sun Sep 6 10:36:51 2015 +0200

----------------------------------------------------------------------
 .../java/com/opensymphony/xwork2/DefaultActionProxy.java  |  4 +---
 .../opensymphony/xwork2/DefaultUnknownHandlerManager.java |  9 ---------
 .../main/java/com/opensymphony/xwork2/UnknownHandler.java | 10 ----------
 .../com/opensymphony/xwork2/UnknownHandlerManager.java    |  2 --
 .../com/opensymphony/xwork2/ActionInvocationTest.java     |  7 +++----
 .../xwork2/config/providers/SomeUnknownHandler.java       |  5 -----
 .../struts2/convention/ConventionUnknownHandler.java      |  4 ----
 7 files changed, 4 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/a61a3692/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
index 6b8749e..72c6e9e 100644
--- a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
+++ b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
@@ -194,9 +194,7 @@ public class DefaultActionProxy implements ActionProxy, Serializable {
 
             resolveMethod();
 
-            if (config.isAllowedMethod(method) ||
-                    (unknownHandlerManager.hasUnknownHandlers() && unknownHandlerManager.isAllowedMethod(method, config))
-            ) {
+            if (config.isAllowedMethod(method)) {
                 invocation.init(this);
             } else {
                 throw new ConfigurationException("This method: " + method + " for action " + actionName + " is not allowed!");

http://git-wip-us.apache.org/repos/asf/struts/blob/a61a3692/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java b/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
index 04ac430..46af876 100644
--- a/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
+++ b/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
@@ -146,13 +146,4 @@ public class DefaultUnknownHandlerManager implements UnknownHandlerManager {
         return unknownHandlers;
     }
 
-    @Override
-    public boolean isAllowedMethod(String allowedMethod, ActionConfig config) {
-        for (UnknownHandler unknownHandler : unknownHandlers) {
-            if (unknownHandler.isAllowedMethod(allowedMethod, config)) {
-                return true;
-            }
-        }
-        return false;
-    }
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/a61a3692/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java b/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
index 1e6f5aa..51556d6 100644
--- a/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
+++ b/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
@@ -60,14 +60,4 @@ public interface UnknownHandler {
      */
 	Object handleUnknownActionMethod(Object action, String methodName);
 
-    /**
-     * Handles the case when an action method is unknown and cannot be validated if it is allowed to be executed.
-     *
-     * @since 2.5
-     * @param allowedMethod The method's name
-     * @param actionConfig The config of actions
-     * @return true if allowedMethod can be executed, false otherwise
-     */
-    boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig);
-
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/a61a3692/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java b/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java
index caf63b3..d8cce9f 100644
--- a/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java
+++ b/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java
@@ -44,6 +44,4 @@ public interface UnknownHandlerManager {
 
     List<UnknownHandler> getUnknownHandlers();
 
-    boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig);
-
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/a61a3692/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java b/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
index 37aa2a5..a1182cc 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
@@ -48,7 +48,9 @@ public class ActionInvocationTest extends XWorkTestCase {
 
         UnknownHandler unknownHandler = new UnknownHandler() {
 			public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException {
-                return new ActionConfig.Builder("test", actionName, ActionSupport.class.getName()).build();
+                return new ActionConfig.Builder("test", actionName, ActionSupport.class.getName())
+                        .addAllowedMethod("unknownmethod")
+                        .build();
             }
 			public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException {
 				return new MockResult();
@@ -60,9 +62,6 @@ public class ActionInvocationTest extends XWorkTestCase {
 					return null;
 				}
 			}
-            public boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig) {
-                return "unknownmethod".equals(allowedMethod);
-            }
         };
 
         UnknownHandlerManagerMock uhm = new UnknownHandlerManagerMock();

http://git-wip-us.apache.org/repos/asf/struts/blob/a61a3692/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
index 5e922e0..312f4c9 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
@@ -38,11 +38,6 @@ public class SomeUnknownHandler implements UnknownHandler{
         return null;
     }
 
-    @Override
-    public boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig) {
-        return false;
-    }
-
     public void setActionConfig(ActionConfig actionConfig) {
         this.actionConfig = actionConfig;
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/a61a3692/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
----------------------------------------------------------------------
diff --git a/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java b/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
index 78c1956..b7c7acf 100644
--- a/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
+++ b/plugins/convention/src/main/java/org/apache/struts2/convention/ConventionUnknownHandler.java
@@ -404,8 +404,4 @@ public class ConventionUnknownHandler implements UnknownHandler {
         }
     }
 
-    @Override
-    public boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig) {
-        return false;
-    }
 }


[23/33] struts git commit: Adds more strict DMI logic

Posted by lu...@apache.org.
Adds more strict DMI logic


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/0aaade64
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/0aaade64
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/0aaade64

Branch: refs/heads/master
Commit: 0aaade64cd332a7a5f45ae5068b8f7be1abb3817
Parents: 45af876
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 11:35:23 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 11:35:23 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/providers/XmlConfigurationProvider.java     | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/0aaade64/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 950d4a1..7d2e065 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -846,7 +846,8 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         NodeList allowedMethodsEls = element.getElementsByTagName("allowed-methods");
 
         Set<String> allowedMethods;
-        if (packageContext.isStrictMethodInvocation()) {
+        if (allowedMethodsEls.getLength() > 0) {
+            // user defined 'allowed-methods' so used them whatever Strict DMI was enabled or not
             allowedMethods = packageContext.getGlobalAllowedMethods();
 
             if (allowedMethodsEls.getLength() > 0) {
@@ -859,7 +860,11 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
                     }
                 }
             }
+        } else if (packageContext.isStrictMethodInvocation()) {
+            // user enabled Strict DMI but didn't defined action specific 'allowed-methods' so we use 'global-allowed-methods' only
+            allowedMethods = packageContext.getGlobalAllowedMethods();
         } else {
+            // Strict DMI is disabled to any method can be called
             allowedMethods = new HashSet<>();
             allowedMethods.add(ActionConfig.REGEX_WILDCARD);
         }


[07/33] struts git commit: Fixes tests

Posted by lu...@apache.org.
Fixes tests


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/c3f4457b
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/c3f4457b
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/c3f4457b

Branch: refs/heads/master
Commit: c3f4457b8b8ad6bd0e89646d825f2ef5f9f91118
Parents: 4565993
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 14:43:31 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 14:43:31 2015 +0200

----------------------------------------------------------------------
 .../opensymphony/xwork2/DefaultActionProxy.java   | 11 ++++++-----
 .../opensymphony/xwork2/ActionInvocationTest.java | 18 ++++++++++++++----
 .../config/providers/SomeUnknownHandler.java      |  5 +++++
 core/src/test/resources/xwork-sample.xml          |  6 ++++--
 4 files changed, 29 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/c3f4457b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
index d1bfd71..6b8749e 100644
--- a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
+++ b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
@@ -194,12 +194,13 @@ public class DefaultActionProxy implements ActionProxy, Serializable {
 
             resolveMethod();
 
-            if (!config.isAllowedMethod(method)) {
-                throw new ConfigurationException("Invalid method: " + method + " for action " + actionName);
+            if (config.isAllowedMethod(method) ||
+                    (unknownHandlerManager.hasUnknownHandlers() && unknownHandlerManager.isAllowedMethod(method, config))
+            ) {
+                invocation.init(this);
+            } else {
+                throw new ConfigurationException("This method: " + method + " for action " + actionName + " is not allowed!");
             }
-
-            invocation.init(this);
-
         } finally {
             UtilTimerStack.pop(profileKey);
         }

http://git-wip-us.apache.org/repos/asf/struts/blob/c3f4457b/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java b/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
index 05c09b2..37aa2a5 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ActionInvocationTest.java
@@ -17,6 +17,7 @@ package com.opensymphony.xwork2;
 
 import com.opensymphony.xwork2.config.entities.ActionConfig;
 import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
+import com.opensymphony.xwork2.mock.MockResult;
 
 import java.util.HashMap;
 
@@ -45,12 +46,12 @@ public class ActionInvocationTest extends XWorkTestCase {
 
     public void testCommandInvocationUnknownHandler() throws Exception {
 
-        DefaultActionProxy baseActionProxy = (DefaultActionProxy) actionProxyFactory.createActionProxy(
-                "baz", "unknownMethodTest", "unknownmethod", null);
         UnknownHandler unknownHandler = new UnknownHandler() {
-			public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException { return null;}
+			public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException {
+                return new ActionConfig.Builder("test", actionName, ActionSupport.class.getName()).build();
+            }
 			public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException {
-				return null;
+				return new MockResult();
 			}
 			public Object handleUnknownActionMethod(Object action, String methodName) {
 				if (methodName.equals("unknownmethod")) {
@@ -59,10 +60,19 @@ public class ActionInvocationTest extends XWorkTestCase {
 					return null;
 				}
 			}
+            public boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig) {
+                return "unknownmethod".equals(allowedMethod);
+            }
         };
 
         UnknownHandlerManagerMock uhm = new UnknownHandlerManagerMock();
         uhm.addUnknownHandler(unknownHandler);
+
+        loadButAdd(UnknownHandlerManager.class, uhm);
+
+        DefaultActionProxy baseActionProxy = (DefaultActionProxy) actionProxyFactory.createActionProxy(
+                "baz", "unknownMethodTest", "unknownmethod", null);
+
         ((DefaultActionInvocation)baseActionProxy.getInvocation()).setUnknownHandlerManager(uhm);
 
         assertEquals("found", baseActionProxy.execute());

http://git-wip-us.apache.org/repos/asf/struts/blob/c3f4457b/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
index 312f4c9..5e922e0 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/SomeUnknownHandler.java
@@ -38,6 +38,11 @@ public class SomeUnknownHandler implements UnknownHandler{
         return null;
     }
 
+    @Override
+    public boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig) {
+        return false;
+    }
+
     public void setActionConfig(ActionConfig actionConfig) {
         this.actionConfig = actionConfig;
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/c3f4457b/core/src/test/resources/xwork-sample.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/xwork-sample.xml b/core/src/test/resources/xwork-sample.xml
index 3705298..cd2ddcb 100644
--- a/core/src/test/resources/xwork-sample.xml
+++ b/core/src/test/resources/xwork-sample.xml
@@ -1,6 +1,6 @@
 <!DOCTYPE xwork PUBLIC
-    "-//Apache Struts//XWork 2.0//EN"
-    "http://struts.apache.org/dtds/xwork-2.0.dtd"
+    "-//Apache Struts//XWork 2.5//EN"
+    "http://struts.apache.org/dtds/xwork-2.5.dtd"
  >
  <!-- "file:///temp/ross/xwork/src/etc/xwork-1.0.dtd"  -->
 
@@ -14,6 +14,8 @@
             </result>
         </global-results>
 
+        <global-allowed-methods methods="execute,input,back,cancel,browse"/>
+
         <action name="Foo" class="com.opensymphony.xwork2.SimpleAction">
             <param name="foo">17</param>
             <param name="bar">23</param>


[11/33] struts git commit: Fixes typo

Posted by lu...@apache.org.
Fixes typo


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/47a01eab
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/47a01eab
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/47a01eab

Branch: refs/heads/master
Commit: 47a01eab10d940fdc134cb666d3d2db0280d8ca8
Parents: 1855304
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 20:28:45 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 20:28:45 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/providers/XmlConfigurationProvider.java        | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/47a01eab/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 0d64ad7..0302a68 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -548,7 +548,7 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         loadGlobalAllowedMethods(newPackage, packageElement);
 
         // load the global exception handler list for this package
-        loadGobalExceptionMappings(newPackage, packageElement);
+        loadGlobalExceptionMappings(newPackage, packageElement);
 
         // get actions
         NodeList actionList = packageElement.getElementsByTagName("action");
@@ -922,7 +922,7 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
      * @param packageContext the package context
      * @param packageElement the given XML element
      */
-    protected void loadGobalExceptionMappings(PackageConfig.Builder packageContext, Element packageElement) {
+    protected void loadGlobalExceptionMappings(PackageConfig.Builder packageContext, Element packageElement) {
         NodeList globalExceptionMappingList = packageElement.getElementsByTagName("global-exception-mappings");
 
         if (globalExceptionMappingList.getLength() > 0) {


[06/33] struts git commit: Extends Unknown Handler to allowed check if method is allowed

Posted by lu...@apache.org.
Extends Unknown Handler to allowed check if method is allowed


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/45659934
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/45659934
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/45659934

Branch: refs/heads/master
Commit: 4565993463f660e9be90b9fe9c3597ce54b58917
Parents: fb0c4a5
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 14:43:21 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 14:43:21 2015 +0200

----------------------------------------------------------------------
 .../opensymphony/xwork2/DefaultUnknownHandlerManager.java | 10 ++++++++++
 .../main/java/com/opensymphony/xwork2/UnknownHandler.java | 10 ++++++++++
 .../com/opensymphony/xwork2/UnknownHandlerManager.java    |  3 +++
 3 files changed, 23 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/45659934/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java b/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
index 5cafe9a..04ac430 100644
--- a/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
+++ b/core/src/main/java/com/opensymphony/xwork2/DefaultUnknownHandlerManager.java
@@ -145,4 +145,14 @@ public class DefaultUnknownHandlerManager implements UnknownHandlerManager {
     public List<UnknownHandler> getUnknownHandlers() {
         return unknownHandlers;
     }
+
+    @Override
+    public boolean isAllowedMethod(String allowedMethod, ActionConfig config) {
+        for (UnknownHandler unknownHandler : unknownHandlers) {
+            if (unknownHandler.isAllowedMethod(allowedMethod, config)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/45659934/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java b/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
index 51556d6..1e6f5aa 100644
--- a/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
+++ b/core/src/main/java/com/opensymphony/xwork2/UnknownHandler.java
@@ -60,4 +60,14 @@ public interface UnknownHandler {
      */
 	Object handleUnknownActionMethod(Object action, String methodName);
 
+    /**
+     * Handles the case when an action method is unknown and cannot be validated if it is allowed to be executed.
+     *
+     * @since 2.5
+     * @param allowedMethod The method's name
+     * @param actionConfig The config of actions
+     * @return true if allowedMethod can be executed, false otherwise
+     */
+    boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig);
+
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/45659934/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java b/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java
index f5e2542..caf63b3 100644
--- a/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java
+++ b/core/src/main/java/com/opensymphony/xwork2/UnknownHandlerManager.java
@@ -43,4 +43,7 @@ public interface UnknownHandlerManager {
     boolean hasUnknownHandlers();
 
     List<UnknownHandler> getUnknownHandlers();
+
+    boolean isAllowedMethod(String allowedMethod, ActionConfig actionConfig);
+
 }


[13/33] struts git commit: Adds null-safety

Posted by lu...@apache.org.
Adds null-safety


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/4c7a7dd6
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/4c7a7dd6
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/4c7a7dd6

Branch: refs/heads/master
Commit: 4c7a7dd6c02457cf006318ed4621b7c432cc478c
Parents: 63bb6e3
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 21:46:16 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 21:46:16 2015 +0200

----------------------------------------------------------------------
 .../com/opensymphony/xwork2/config/impl/ActionConfigMatcher.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/4c7a7dd6/core/src/main/java/com/opensymphony/xwork2/config/impl/ActionConfigMatcher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/ActionConfigMatcher.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/ActionConfigMatcher.java
index bb97ce8..7f17e41 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/impl/ActionConfigMatcher.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/ActionConfigMatcher.java
@@ -77,7 +77,7 @@ public class ActionConfigMatcher extends AbstractMatcher<ActionConfig> implement
         Map<String, String> vars) {
 
         String methodName = convertParam(orig.getMethodName(), vars);
-        if (!orig.isAllowedMethod(methodName)) {
+        if (methodName != null && !orig.isAllowedMethod(methodName)) {
             return null;
         }
 


[18/33] struts git commit: Adds support to define allowed methods as regex

Posted by lu...@apache.org.
Adds support to define allowed methods as regex


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/e38d4657
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/e38d4657
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/e38d4657

Branch: refs/heads/master
Commit: e38d4657c6a973b30b9ece360f7ea2c97fb69555
Parents: e4fc852
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 09:04:37 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 09:04:37 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/ActionConfig.java    |  1 +
 .../xwork2/config/entities/AllowedMethods.java  |  5 +++-
 .../providers/XmlConfigurationProvider.java     | 24 ++++++++++++--------
 3 files changed, 20 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/e38d4657/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
index 5303e83..7c10c90 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/ActionConfig.java
@@ -43,6 +43,7 @@ public class ActionConfig extends Located implements Serializable {
 
     public static final String DEFAULT_METHOD = "execute";
     public static final String WILDCARD = "*";
+    public static final String REGEX_WILDCARD = "regex:.*";
 
     protected List<InterceptorMapping> interceptors; // a list of interceptorMapping Objects eg. List<InterceptorMapping>
     protected Map<String,String> params;

http://git-wip-us.apache.org/repos/asf/struts/blob/e38d4657/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
index 7a4fec1..f619d89 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/AllowedMethods.java
@@ -32,8 +32,11 @@ public class AllowedMethods {
                 ret.append(c);
             }
         }
-        if (isPattern) {
+        if (isPattern && !method.startsWith("regex:")) {
             return new PatternAllowedMethod(ret.toString(), method);
+        } else if (method.startsWith("regex:")) {
+            String pattern = method.substring(method.indexOf(":") + 1);
+            return new PatternAllowedMethod(pattern, method);
         } else {
             return new LiteralAllowedMethod(ret.toString());
         }

http://git-wip-us.apache.org/repos/asf/struts/blob/e38d4657/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 3009dcb..950d4a1 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -845,17 +845,23 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
     protected Set<String> buildAllowedMethods(Element element, PackageConfig.Builder packageContext) {
         NodeList allowedMethodsEls = element.getElementsByTagName("allowed-methods");
 
-        Set<String> allowedMethods = packageContext.getGlobalAllowedMethods();
-
-        if (allowedMethodsEls.getLength() > 0) {
-            allowedMethods = new HashSet<>();
-            Node n = allowedMethodsEls.item(0).getFirstChild();
-            if (n != null) {
-                String s = n.getNodeValue().trim();
-                if (s.length() > 0) {
-                    allowedMethods = TextParseUtil.commaDelimitedStringToSet(s);
+        Set<String> allowedMethods;
+        if (packageContext.isStrictMethodInvocation()) {
+            allowedMethods = packageContext.getGlobalAllowedMethods();
+
+            if (allowedMethodsEls.getLength() > 0) {
+                allowedMethods = new HashSet<>();
+                Node n = allowedMethodsEls.item(0).getFirstChild();
+                if (n != null) {
+                    String s = n.getNodeValue().trim();
+                    if (s.length() > 0) {
+                        allowedMethods = TextParseUtil.commaDelimitedStringToSet(s);
+                    }
                 }
             }
+        } else {
+            allowedMethods = new HashSet<>();
+            allowedMethods.add(ActionConfig.REGEX_WILDCARD);
         }
 
         return allowedMethods;


[24/33] struts git commit: Adjusts tests

Posted by lu...@apache.org.
Adjusts tests


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/3ccd7307
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/3ccd7307
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/3ccd7307

Branch: refs/heads/master
Commit: 3ccd7307f9af04d1f45a9ddd2360c390d83e13b0
Parents: 0aaade6
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 4 11:35:31 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 4 11:35:31 2015 +0200

----------------------------------------------------------------------
 .../XmlConfigurationProviderActionsTest.java        | 16 ++++++++++++++--
 .../XmlConfigurationProviderAllowedMethodsTest.java | 10 +++++-----
 ...lConfigurationProviderExceptionMappingsTest.java |  7 ++++---
 .../XmlConfigurationProviderInterceptorsTest.java   |  6 ++++++
 .../XmlConfigurationProviderResultsTest.java        |  1 +
 .../config/providers/xwork-test-allowed-methods.xml |  4 ++--
 6 files changed, 32 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/3ccd7307/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java
index 2181181..cde4c62 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java
@@ -56,6 +56,7 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
 
 
         ActionConfig barAction = new ActionConfig.Builder("", "Bar", SimpleAction.class.getName())
+                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .addParams(params).build();
 
         // foo action is a little more complex, two params, a result and an interceptor stack
@@ -72,6 +73,7 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
                 .addParams(params)
                 .addResultConfigs(results)
                 .addInterceptors(interceptors)
+                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // wildcard action is simple wildcard example
@@ -81,6 +83,7 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
         ActionConfig wildcardAction = new ActionConfig.Builder("", "WildCard", SimpleAction.class.getName())
                 .addResultConfigs(results)
                 .addInterceptors(interceptors)
+                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // fooBar action is a little more complex, two params, a result and an interceptor stack
@@ -99,6 +102,7 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
                 .addResultConfigs(results)
                 .addInterceptors(interceptors)
                 .addExceptionMappings(exceptionMappings)
+                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // TestInterceptorParam action tests that an interceptor worked
@@ -112,6 +116,7 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
 
         ActionConfig intAction = new ActionConfig.Builder("", "TestInterceptorParam", SimpleAction.class.getName())
                 .addInterceptors(interceptors)
+                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // TestInterceptorParamOverride action tests that an interceptor with a param override worked
@@ -123,6 +128,7 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
 
         ActionConfig intOverAction = new ActionConfig.Builder("", "TestInterceptorParamOverride", SimpleAction.class.getName())
                 .addInterceptors(interceptors)
+                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // execute the configuration
@@ -164,7 +170,10 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
         params.put("bar", "23");
 
         ActionConfig barWithPackageDefaultClassRefConfig =
-                new ActionConfig.Builder("", "Bar", "").addParams(params).build();
+                new ActionConfig.Builder("", "Bar", "")
+                        .addParams(params)
+                        .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
+                        .build();
 
         // execute the configuration
         provider.init(configuration);
@@ -188,7 +197,10 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
         params.put("bar", "23");
 
         ActionConfig barWithoutClassNameConfig =
-                new ActionConfig.Builder("", "BarWithoutClassName", "").addParams(params).build();
+                new ActionConfig.Builder("", "BarWithoutClassName", "")
+                        .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
+                        .addParams(params)
+                        .build();
 
         // execute the configuration
         provider.init(configuration);

http://git-wip-us.apache.org/repos/asf/struts/blob/3ccd7307/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java
index 11f779a..4b4460a 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java
@@ -27,12 +27,12 @@ public class XmlConfigurationProviderAllowedMethodsTest extends ConfigurationTes
         assertEquals(5, actionConfigs.size());
 
         ActionConfig action = (ActionConfig) actionConfigs.get("Default");
-        assertEquals(0, action.getAllowedMethods().size());
+        assertEquals(1, action.getAllowedMethods().size());
         assertTrue(action.isAllowedMethod("execute"));
-        assertFalse(action.isAllowedMethod("foo"));
-        assertFalse(action.isAllowedMethod("bar"));
-        assertFalse(action.isAllowedMethod("baz"));
-        assertFalse(action.isAllowedMethod("xyz"));
+        assertTrue(action.isAllowedMethod("foo"));
+        assertTrue(action.isAllowedMethod("bar"));
+        assertTrue(action.isAllowedMethod("baz"));
+        assertTrue(action.isAllowedMethod("xyz"));
 
         action = (ActionConfig) actionConfigs.get("Boring");
         assertEquals(0, action.getAllowedMethods().size());

http://git-wip-us.apache.org/repos/asf/struts/blob/3ccd7307/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java
index 232efd3..d02a312 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java
@@ -32,20 +32,21 @@ public class XmlConfigurationProviderExceptionMappingsTest extends Configuration
 
         exceptionMappings.add(
                 new ExceptionMappingConfig.Builder("spooky-result", "com.opensymphony.xwork2.SpookyException", "spooky-result")
-                    .build());
+                        .build());
         results.put("spooky-result", new ResultConfig.Builder("spooky-result", MockResult.class.getName()).build());
 
         Map<String, String> resultParams = new HashMap<>();
         resultParams.put("actionName", "bar.vm");
         results.put("specificLocationResult",
                 new ResultConfig.Builder("specificLocationResult", ActionChainResult.class.getName())
-                    .addParams(resultParams)
-                    .build());
+                        .addParams(resultParams)
+                        .build());
 
         ActionConfig expectedAction = new ActionConfig.Builder("default", "Bar", SimpleAction.class.getName())
             .addParams(parameters)
             .addResultConfigs(results)
             .addExceptionMappings(exceptionMappings)
+            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         // execute the configuration

http://git-wip-us.apache.org/repos/asf/struts/blob/3ccd7307/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
index 4f26b5f..b10eb49 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
@@ -108,16 +108,19 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
 
         ActionConfig actionWithOwnRef = new ActionConfig.Builder("", "ActionWithOwnRef", SimpleAction.class.getName())
             .addInterceptors(interceptors)
+            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         ActionConfig actionWithDefaultRef = new ActionConfig.Builder("", "ActionWithDefaultRef", SimpleAction.class.getName())
             .addInterceptor(new InterceptorMapping("timer", objectFactory.buildInterceptor(timerInterceptor, new HashMap<String, String>())))
+            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         // sub package
         // this should inherit
         ActionConfig actionWithNoRef = new ActionConfig.Builder("", "ActionWithNoRef", SimpleAction.class.getName())
             .addInterceptor(new InterceptorMapping("timer", objectFactory.buildInterceptor(timerInterceptor, new HashMap<String, String>())))
+            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         interceptors = new ArrayList<>();
@@ -125,6 +128,7 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
 
         ActionConfig anotherActionWithOwnRef = new ActionConfig.Builder("", "AnotherActionWithOwnRef", SimpleAction.class.getName())
             .addInterceptor(new InterceptorMapping("logging", objectFactory.buildInterceptor(loggingInterceptor, new HashMap<String, String>())))
+            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         RuntimeConfiguration runtimeConfig = configurationManager.getConfiguration().getRuntimeConfiguration();
@@ -184,6 +188,7 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
 
         ActionConfig intAction = new ActionConfig.Builder("", "TestInterceptorParam", SimpleAction.class.getName())
             .addInterceptors(interceptors)
+            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         // TestInterceptorParamOverride action tests that an interceptor with a param override worked
@@ -202,6 +207,7 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
 
         ActionConfig intOverAction = new ActionConfig.Builder("", "TestInterceptorParamOverride", SimpleAction.class.getName())
             .addInterceptors(interceptors)
+            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         ConfigurationProvider provider = buildConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-interceptor-params.xml");

http://git-wip-us.apache.org/repos/asf/struts/blob/3ccd7307/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java
index caa9da0..d096c14 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java
@@ -67,6 +67,7 @@ public class XmlConfigurationProviderResultsTest extends ConfigurationTestBase {
         ActionConfig expectedAction = new ActionConfig.Builder("default", "Bar", SimpleAction.class.getName())
             .addParams(parameters)
             .addResultConfigs(results)
+            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         // execute the configuration

http://git-wip-us.apache.org/repos/asf/struts/blob/3ccd7307/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
index 4059d62..6741e66 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
@@ -4,7 +4,7 @@
  >
 
 <xwork>
-    <package name="default">
+    <package name="default" strict-method-invocation="false">
         <action name="Default">
         </action>
 
@@ -25,7 +25,7 @@
         </action>
     </package>
 
-    <package name="strict">
+    <package name="strict" strict-method-invocation="true">
         <action name="Default">
         </action>
 


[31/33] struts git commit: Switches Strict DMI to true by default and allows to be disabled in user's package

Posted by lu...@apache.org.
Switches Strict DMI to true by default and allows to be disabled in user's package


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/86afcbe6
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/86afcbe6
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/86afcbe6

Branch: refs/heads/master
Commit: 86afcbe611f7c3afda26e396cc4504d3c9998398
Parents: b838105
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Fri Sep 25 10:42:43 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Fri Sep 25 10:42:43 2015 +0200

----------------------------------------------------------------------
 .../opensymphony/xwork2/config/entities/PackageConfig.java  | 9 +++++++--
 .../xwork2/config/providers/XmlConfigurationProvider.java   | 6 +++++-
 .../providers/XmlConfigurationProviderActionsTest.java      | 8 --------
 .../XmlConfigurationProviderExceptionMappingsTest.java      | 1 -
 .../providers/XmlConfigurationProviderInterceptorsTest.java | 4 ----
 .../providers/XmlConfigurationProviderResultsTest.java      | 1 -
 6 files changed, 12 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/86afcbe6/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
index e5d3ef4..e297b49 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
@@ -433,7 +433,7 @@ public class PackageConfig extends Located implements Comparable, Serializable,
     public static class Builder implements InterceptorLocator {
 
         protected PackageConfig target;
-        private boolean strictDMI;
+        private boolean strictDMI = true;
 
         public Builder(String name) {
             target = new PackageConfig(name);
@@ -605,12 +605,17 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         }
 
         public boolean isStrictMethodInvocation() {
+            // if Strict DMI was disabled in this package,
+            // return without evaluating parent packages
+            if (!strictDMI) {
+                return false;
+            }
             for (PackageConfig parent : target.parents) {
                 if (parent.isStrictMethodInvocation()) {
                     return true;
                 }
             }
-            return strictDMI;
+            return true;
         }
 
         public PackageConfig build() {

http://git-wip-us.apache.org/repos/asf/struts/blob/86afcbe6/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 7d2e065..35e2019 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -649,7 +649,11 @@ public class XmlConfigurationProvider implements ConfigurationProvider {
         String name = StringUtils.defaultString(packageElement.getAttribute("name"));
         String namespace = StringUtils.defaultString(packageElement.getAttribute("namespace"));
 
-        boolean strictDMI = Boolean.parseBoolean(packageElement.getAttribute("strict-method-invocation"));
+        // Strict DMI is enabled by default, it can disabled by user
+        boolean strictDMI = true;
+        if (packageElement.hasAttribute("strict-method-invocation")) {
+            strictDMI = Boolean.parseBoolean(packageElement.getAttribute("strict-method-invocation"));
+        }
 
         PackageConfig.Builder cfg = new PackageConfig.Builder(name)
                 .namespace(namespace)

http://git-wip-us.apache.org/repos/asf/struts/blob/86afcbe6/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java
index cde4c62..bd23376 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderActionsTest.java
@@ -56,7 +56,6 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
 
 
         ActionConfig barAction = new ActionConfig.Builder("", "Bar", SimpleAction.class.getName())
-                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .addParams(params).build();
 
         // foo action is a little more complex, two params, a result and an interceptor stack
@@ -73,7 +72,6 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
                 .addParams(params)
                 .addResultConfigs(results)
                 .addInterceptors(interceptors)
-                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // wildcard action is simple wildcard example
@@ -83,7 +81,6 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
         ActionConfig wildcardAction = new ActionConfig.Builder("", "WildCard", SimpleAction.class.getName())
                 .addResultConfigs(results)
                 .addInterceptors(interceptors)
-                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // fooBar action is a little more complex, two params, a result and an interceptor stack
@@ -102,7 +99,6 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
                 .addResultConfigs(results)
                 .addInterceptors(interceptors)
                 .addExceptionMappings(exceptionMappings)
-                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // TestInterceptorParam action tests that an interceptor worked
@@ -116,7 +112,6 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
 
         ActionConfig intAction = new ActionConfig.Builder("", "TestInterceptorParam", SimpleAction.class.getName())
                 .addInterceptors(interceptors)
-                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // TestInterceptorParamOverride action tests that an interceptor with a param override worked
@@ -128,7 +123,6 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
 
         ActionConfig intOverAction = new ActionConfig.Builder("", "TestInterceptorParamOverride", SimpleAction.class.getName())
                 .addInterceptors(interceptors)
-                .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                 .build();
 
         // execute the configuration
@@ -172,7 +166,6 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
         ActionConfig barWithPackageDefaultClassRefConfig =
                 new ActionConfig.Builder("", "Bar", "")
                         .addParams(params)
-                        .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                         .build();
 
         // execute the configuration
@@ -198,7 +191,6 @@ public class XmlConfigurationProviderActionsTest extends ConfigurationTestBase {
 
         ActionConfig barWithoutClassNameConfig =
                 new ActionConfig.Builder("", "BarWithoutClassName", "")
-                        .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
                         .addParams(params)
                         .build();
 

http://git-wip-us.apache.org/repos/asf/struts/blob/86afcbe6/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java
index d02a312..14e7383 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderExceptionMappingsTest.java
@@ -46,7 +46,6 @@ public class XmlConfigurationProviderExceptionMappingsTest extends Configuration
             .addParams(parameters)
             .addResultConfigs(results)
             .addExceptionMappings(exceptionMappings)
-            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         // execute the configuration

http://git-wip-us.apache.org/repos/asf/struts/blob/86afcbe6/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
index cfd7f60..4f26b5f 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderInterceptorsTest.java
@@ -108,12 +108,10 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
 
         ActionConfig actionWithOwnRef = new ActionConfig.Builder("", "ActionWithOwnRef", SimpleAction.class.getName())
             .addInterceptors(interceptors)
-            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         ActionConfig actionWithDefaultRef = new ActionConfig.Builder("", "ActionWithDefaultRef", SimpleAction.class.getName())
             .addInterceptor(new InterceptorMapping("timer", objectFactory.buildInterceptor(timerInterceptor, new HashMap<String, String>())))
-            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         // sub package
@@ -186,7 +184,6 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
 
         ActionConfig intAction = new ActionConfig.Builder("", "TestInterceptorParam", SimpleAction.class.getName())
             .addInterceptors(interceptors)
-            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         // TestInterceptorParamOverride action tests that an interceptor with a param override worked
@@ -205,7 +202,6 @@ public class XmlConfigurationProviderInterceptorsTest extends ConfigurationTestB
 
         ActionConfig intOverAction = new ActionConfig.Builder("", "TestInterceptorParamOverride", SimpleAction.class.getName())
             .addInterceptors(interceptors)
-            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         ConfigurationProvider provider = buildConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-interceptor-params.xml");

http://git-wip-us.apache.org/repos/asf/struts/blob/86afcbe6/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java
index d096c14..caa9da0 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderResultsTest.java
@@ -67,7 +67,6 @@ public class XmlConfigurationProviderResultsTest extends ConfigurationTestBase {
         ActionConfig expectedAction = new ActionConfig.Builder("default", "Bar", SimpleAction.class.getName())
             .addParams(parameters)
             .addResultConfigs(results)
-            .addAllowedMethod(ActionConfig.REGEX_WILDCARD)
             .build();
 
         // execute the configuration


[08/33] struts git commit: Fixes tests

Posted by lu...@apache.org.
Fixes tests


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/c1928ad0
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/c1928ad0
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/c1928ad0

Branch: refs/heads/master
Commit: c1928ad06bdfbe245b1ed7d5bfeb07ed9bface37
Parents: c3f4457
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Aug 31 18:36:04 2015 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Aug 31 18:36:04 2015 +0200

----------------------------------------------------------------------
 .../XmlConfigurationProviderAllowedMethodsTest.java   | 14 +++++++-------
 .../config/providers/xwork-test-allowed-methods.xml   |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/c1928ad0/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java
index 6a55e75..11f779a 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderAllowedMethodsTest.java
@@ -27,12 +27,12 @@ public class XmlConfigurationProviderAllowedMethodsTest extends ConfigurationTes
         assertEquals(5, actionConfigs.size());
 
         ActionConfig action = (ActionConfig) actionConfigs.get("Default");
-        assertEquals(1, action.getAllowedMethods().size());
+        assertEquals(0, action.getAllowedMethods().size());
         assertTrue(action.isAllowedMethod("execute"));
-        assertTrue(action.isAllowedMethod("foo"));
-        assertTrue(action.isAllowedMethod("bar"));
-        assertTrue(action.isAllowedMethod("baz"));
-        assertTrue(action.isAllowedMethod("xyz"));
+        assertFalse(action.isAllowedMethod("foo"));
+        assertFalse(action.isAllowedMethod("bar"));
+        assertFalse(action.isAllowedMethod("baz"));
+        assertFalse(action.isAllowedMethod("xyz"));
 
         action = (ActionConfig) actionConfigs.get("Boring");
         assertEquals(0, action.getAllowedMethods().size());
@@ -59,7 +59,7 @@ public class XmlConfigurationProviderAllowedMethodsTest extends ConfigurationTes
         assertFalse(action.isAllowedMethod("xyz"));
 
         action = (ActionConfig) actionConfigs.get("Baz");
-        assertEquals(2, action.getAllowedMethods().size());
+        assertEquals(3, action.getAllowedMethods().size());
         assertFalse(action.isAllowedMethod("execute"));
         assertTrue(action.isAllowedMethod("foo"));
         assertTrue(action.isAllowedMethod("bar"));
@@ -114,7 +114,7 @@ public class XmlConfigurationProviderAllowedMethodsTest extends ConfigurationTes
         assertFalse(action.isAllowedMethod("xyz"));
 
         action = (ActionConfig) actionConfigs.get("Baz");
-        assertEquals(2, action.getAllowedMethods().size());
+        assertEquals(3, action.getAllowedMethods().size());
         assertFalse(action.isAllowedMethod("execute"));
         assertTrue(action.isAllowedMethod("foo"));
         assertTrue(action.isAllowedMethod("bar"));

http://git-wip-us.apache.org/repos/asf/struts/blob/c1928ad0/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
index 7851408..4059d62 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
@@ -25,7 +25,7 @@
         </action>
     </package>
 
-    <package name="strict" strict-method-invocation="true">
+    <package name="strict">
         <action name="Default">
         </action>
 


[32/33] struts git commit: Simplifies checking of Strict DMI to simple getter

Posted by lu...@apache.org.
Simplifies checking of Strict DMI to simple getter


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/fdb6daec
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/fdb6daec
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/fdb6daec

Branch: refs/heads/master
Commit: fdb6daec7859e0cf95a0da5482991b8342cf91ad
Parents: 86afcbe
Author: Lukasz Lenart <lu...@gmail.com>
Authored: Sat Sep 26 08:57:44 2015 +0200
Committer: Lukasz Lenart <lu...@gmail.com>
Committed: Sat Sep 26 08:57:44 2015 +0200

----------------------------------------------------------------------
 .../xwork2/config/entities/PackageConfig.java   | 14 +----
 .../config/entities/PackageConfigTest.java      | 62 +++++++++++++++++++-
 2 files changed, 62 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/fdb6daec/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
index e297b49..1e7a4dd 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/entities/PackageConfig.java
@@ -600,22 +600,12 @@ public class PackageConfig extends Located implements Comparable, Serializable,
         }
 
         public Builder strictMethodInvocation(boolean strict) {
-            strictDMI = strict;
+            target.strictMethodInvocation = strict;
             return this;
         }
 
         public boolean isStrictMethodInvocation() {
-            // if Strict DMI was disabled in this package,
-            // return without evaluating parent packages
-            if (!strictDMI) {
-                return false;
-            }
-            for (PackageConfig parent : target.parents) {
-                if (parent.isStrictMethodInvocation()) {
-                    return true;
-                }
-            }
-            return true;
+            return target.strictMethodInvocation;
         }
 
         public PackageConfig build() {

http://git-wip-us.apache.org/repos/asf/struts/blob/fdb6daec/core/src/test/java/com/opensymphony/xwork2/config/entities/PackageConfigTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/config/entities/PackageConfigTest.java b/core/src/test/java/com/opensymphony/xwork2/config/entities/PackageConfigTest.java
index e2f2868..4a25ccb 100644
--- a/core/src/test/java/com/opensymphony/xwork2/config/entities/PackageConfigTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/config/entities/PackageConfigTest.java
@@ -30,5 +30,63 @@ public class PackageConfigTest extends XWorkTestCase {
         
         assertEquals("ref2", cfg.getFullDefaultInterceptorRef());
     }
-    
-}
\ No newline at end of file
+
+    public void testStrictDMIInheritance() {
+        // given
+        PackageConfig parent = new PackageConfig.Builder("parent").build();
+
+        // when
+        PackageConfig child = new PackageConfig.Builder("child")
+                .addParent(parent)
+                .build();
+
+        // then
+        assertTrue(child.isStrictMethodInvocation());
+    }
+
+    public void testStrictDMIInheritanceDisabledInParentPackage() {
+        // given
+        PackageConfig parent = new PackageConfig.Builder("parent")
+                .strictMethodInvocation(false)
+                .build();
+
+        // when
+        PackageConfig child = new PackageConfig.Builder("child")
+                .addParent(parent)
+                .build();
+
+        // then
+        assertTrue(child.isStrictMethodInvocation());
+    }
+
+    public void testStrictDMIInheritanceDisabledInBothPackage() {
+        // given
+        PackageConfig parent = new PackageConfig.Builder("parent")
+                .strictMethodInvocation(false)
+                .build();
+
+        // when
+        PackageConfig child = new PackageConfig.Builder("child")
+                .addParent(parent)
+                .strictMethodInvocation(false)
+                .build();
+
+        // then
+        assertFalse(child.isStrictMethodInvocation());
+    }
+
+    public void testStrictDMIInheritanceDisabledInChildPackage() {
+        // given
+        PackageConfig parent = new PackageConfig.Builder("parent").build();
+
+        // when
+        PackageConfig child = new PackageConfig.Builder("child")
+                .addParent(parent)
+                .strictMethodInvocation(false)
+                .build();
+
+        // then
+        assertFalse(child.isStrictMethodInvocation());
+    }
+
+}