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 <lukaszlen...@apache.org> Authored: Mon Aug 31 14:33:31 2015 +0200 Committer: Lukasz Lenart <lukaszlen...@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 --> +