This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5049-velocity-plugin in repository https://gitbox.apache.org/repos/asf/struts.git
commit a7cfed7a9641d2f48a7656dee76412bb8efa9b5a Author: Lukasz Lenart <lukaszlen...@apache.org> AuthorDate: Tue Nov 26 19:00:18 2019 +0100 WW-5049 Allows define a custom bean provider --- .../config/providers/XmlConfigurationProvider.java | 18 ++- core/src/main/resources/struts-2.6.dtd | 157 +++++++++++++++++++++ .../velocity/src/main/resources/struts-plugin.xml | 7 +- 3 files changed, 177 insertions(+), 5 deletions(-) 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 24d388e..dd61d81 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 @@ -219,7 +219,21 @@ public class XmlConfigurationProvider implements ConfigurationProvider { final String nodeName = child.getNodeName(); - if ("bean".equals(nodeName)) { + if ("bean-provider".equals(nodeName)) { + String name = child.getAttribute("name"); + String impl = child.getAttribute("class"); + try { + Class classImpl = ClassLoaderUtil.loadClass(impl, getClass()); + if (classImpl.isAssignableFrom(ConfigurationProvider.class)) { + ConfigurationProvider provider = (ConfigurationProvider) classImpl.newInstance(); + provider.register(containerBuilder, props); + } else { + throw new ConfigurationException("The bean-provider: name:" + name + " class:" + impl + " doesnt implement " + ConfigurationProvider.class.getName(), childNode); + } + } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { + throw new ConfigurationException("Unable to load bean-provider: name:" + name + " class:" + impl, e, childNode); + } + } else if ("bean".equals(nodeName)) { String type = child.getAttribute("type"); String name = child.getAttribute("name"); String impl = child.getAttribute("class"); @@ -233,8 +247,6 @@ public class XmlConfigurationProvider implements ConfigurationProvider { scope = Scope.REQUEST; } else if ("session".equals(scopeStr)) { scope = Scope.SESSION; - } else if ("singleton".equals(scopeStr)) { - scope = Scope.SINGLETON; } else if ("thread".equals(scopeStr)) { scope = Scope.THREAD; } diff --git a/core/src/main/resources/struts-2.6.dtd b/core/src/main/resources/struts-2.6.dtd new file mode 100644 index 0000000..6eb5654 --- /dev/null +++ b/core/src/main/resources/struts-2.6.dtd @@ -0,0 +1,157 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* + * 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.6//EN" + "http://struts.apache.org/dtds/struts-2.6.dtd"> +--> + +<!ELEMENT struts ((package|include|bean-provider|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 + strict-method-invocation (true|false) "true" +> + +<!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)> + +<!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-provider (#PCDATA)> +<!ATTLIST bean-provider + name CDATA #IMPLIED + class CDATA #IMPLIED +> + +<!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 --> + diff --git a/plugins/velocity/src/main/resources/struts-plugin.xml b/plugins/velocity/src/main/resources/struts-plugin.xml index 00a4207..04842de 100644 --- a/plugins/velocity/src/main/resources/struts-plugin.xml +++ b/plugins/velocity/src/main/resources/struts-plugin.xml @@ -20,10 +20,13 @@ */ --> <!DOCTYPE struts PUBLIC - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" - "http://struts.apache.org/dtds/struts-2.5.dtd"> + "-//Apache Software Foundation//DTD Struts Configuration 2.6//EN" + "http://struts.apache.org/dtds/struts-2.6.dtd"> <struts> + + <bean-provider name="velocityBeans" class="org.apache.struts2.views.velocity.VelocityBeanSelectionProvider"/> + <bean class="org.apache.struts2.views.velocity.VelocityManager" name="struts" /> <bean type="org.apache.struts2.components.template.TemplateEngine" name="vm"