Merge branch 'master' into WW-5190-match-action-proxy

This commit is contained in:
Lukasz Lenart
2022-06-18 09:45:20 +02:00
10 changed files with 126 additions and 41 deletions
@@ -19,13 +19,14 @@
* under the License.
*/
-->
<web-app id="starter" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Struts 2 Rest Example</display-name>
<!-- Filters -->
<!-- START SNIPPET: filter -->
<filter>
+19 -23
View File
@@ -1,5 +1,6 @@
<?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
@@ -16,20 +17,16 @@
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<web-app id="starter" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Struts Showcase Application</display-name>
<context-param>
<param-name>org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG</param-name>
<param-value>
/WEB-INF/tiles.xml
</param-value>
</context-param>
<filter>
<filter-name>async</filter-name>
<filter-class>org.apache.struts2.showcase.async.AsyncFilter</filter-class>
@@ -46,11 +43,10 @@
<filter-class>org.apache.struts2.dispatcher.filter.StrutsExecuteFilter</filter-class>
</filter>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>async</filter-name>
@@ -90,9 +86,9 @@
<!-- Chat Example in Showcase -->
<listener>
<listener-class>
org.apache.struts2.showcase.chat.ChatSessionListener
</listener-class>
<listener-class>
org.apache.struts2.showcase.chat.ChatSessionListener
</listener-class>
</listener>
<listener>
@@ -109,13 +105,13 @@
<param-value>true</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>JspSupportServlet</servlet-name>
<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>JspSupportServlet</servlet-name>
<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Sitemesh Freemarker and Velocity Decorator Servlets. Shares configuration with Struts.-->
<!-- Sitemesh Freemarker and Velocity Decorator Servlets. Shares configuration with Struts.-->
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet</servlet-class>
@@ -73,7 +73,7 @@ public class TextareaTag extends AbstractUITag {
public void setWrap(String wrap) {
this.wrap = wrap;
}
public void setMaxlength(String maxlength) {
this.maxlength = maxlength;
}
@@ -100,6 +100,8 @@ public class TextareaTag extends AbstractUITag {
this.readonly = null;
this.rows = null;
this.wrap = null;
this.maxlength = null;
this.minlength = null;
}
}
@@ -45,6 +45,12 @@
<#if parameters.title?has_content>
title="${parameters.title}"<#rt/>
</#if>
<#if parameters.maxlength?has_content>
maxlength="${parameters.maxlength}"<#rt/>
</#if>
<#if parameters.minlength?has_content>
minlength="${parameters.minlength}"<#rt/>
</#if>
<#include "/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" />
<#include "/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" />
<#include "/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
@@ -52,10 +58,4 @@
<#if parameters.nameValue??>
<@s.property value="parameters.nameValue"/><#t/>
</#if>
<#if parameters.maxlength?has_content>
maxlength="${parameters.maxlength}"<#rt/>
</#if>
<#if parameters.minlength?has_content>
minlength="${parameters.minlength}"<#rt/>
</#if>
</textarea>
</textarea>
@@ -47,6 +47,8 @@ public class TextareaTest extends AbstractUITagTest {
tag.setId("the_id");
tag.setOnkeyup("alert('hello');");
tag.setReadonly("true");
tag.setMaxlength("100");
tag.setMinlength("10");
tag.doStartTag();
tag.doEndTag();
@@ -81,6 +83,8 @@ public class TextareaTest extends AbstractUITagTest {
tag.setId("the_id");
tag.setOnkeyup("alert('hello');");
tag.setReadonly("true");
tag.setMaxlength("100");
tag.setMinlength("10");
tag.doStartTag();
setComponentTagClearTagState(tag, true); // Ensure component tag state clearing is set true (to match tag).
@@ -1,4 +1,4 @@
<tr>
<td class="tdLabel"><label for="the_id" class="label">mylabel:</label></td>
<td class="tdInput"><textarea name="myname" cols="20" rows="30" disabled="disabled" readonly="readonly" tabindex="5" id="the_id" title="mytitle" onclick="alert('onclick');" onkeyup="alert('hello');" onchange="alert('goodbye');">bar</textarea></td>
<td class="tdInput"><textarea name="myname" cols="20" rows="30" disabled="disabled" readonly="readonly" tabindex="5" id="the_id" title="mytitle" maxlength="100" minlength="10" onclick="alert('onclick');" onkeyup="alert('hello');" onchange="alert('goodbye');">bar</textarea></td>
</tr>
@@ -50,7 +50,7 @@ public class VelocityPageFilter extends SiteMeshFilter {
// TODO: Remove heavy coupling on horrible SM2 Factory
Factory factory = Factory.getInstance(new Config(filterConfig));
factory.refresh();
return new FreemarkerMapper2DecoratorSelector(factory.getDecoratorMapper());
return new VelocityMapper2DecoratorSelector(factory.getDecoratorMapper());
}
}
@@ -22,8 +22,9 @@
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<bean class="org.apache.struts2.sitemesh.FreemarkerPageFilter" static="true" optional="true"/>
<bean class="org.apache.struts2.sitemesh.VelocityPageFilter" static="true" optional="true"/>
<!-- if you want to use Velocity with Sitemesh, please define this bean in your struts.xml -->
<!-- bean class="org.apache.struts2.sitemesh.VelocityPageFilter" static="true" optional="true"/ -->
</struts>
@@ -0,0 +1,82 @@
/*
* 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.
*/
package org.apache.struts2.tiles;
import org.apache.tiles.request.locale.PostfixedApplicationResource;
import org.apache.tiles.request.locale.URLApplicationResource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
public class StrutsApplicationResource extends PostfixedApplicationResource {
private final URL url;
private final File file;
/**
* fixes WW-5011
* @return file path for "file" protocol elsewhere url path as before to keep backward-compatibility
* @see URLApplicationResource#getFile(URL)
*/
private static String getFilePath(URL url) {
String path = url.getPath();
if (!"file".equals(url.getProtocol())) {
return path;
}
try {
// fixes WW-5011 because includes ref in path - like URLApplicationResource#getFile(URL)
path = (new URI(url.toExternalForm())).getSchemeSpecificPart();
} catch (Exception e) {
// fallback solution
if (url.getRef() != null && !new File(path).exists()) {
// it's like WW-5011
path += "#" + url.getRef();
}
}
return path;
}
public StrutsApplicationResource(URL url) {
super(getFilePath(url));
this.url = url;
this.file = new File(getFilePath(url));
}
@Override
public InputStream getInputStream() throws IOException {
return url.openStream();
}
@Override
public long getLastModified() throws IOException {
if (file.exists()) {
return file.lastModified();
}
return 0;
}
@Override
public String toString() {
return "Resource " + getLocalePath() + " at " + url.toString();
}
}
@@ -102,7 +102,7 @@ public class StrutsWildcardServletApplicationContext extends ServletApplicationC
File localFile = new File(localePath);
if (localFile.exists()) {
try {
return new URLApplicationResource(localePath, localFile.toURI().toURL());
return new StrutsApplicationResource(localFile.toURI().toURL());
} catch (MalformedURLException e) {
LOG.warn("Cannot access [{}]", localePath, e);
return null;
@@ -121,8 +121,7 @@ public class StrutsWildcardServletApplicationContext extends ServletApplicationC
for (Map.Entry<String, URL> entry : matches.entrySet()) {
if (pattern.matcher(entry.getKey()).matches()) {
URL url = entry.getValue();
resources.add(new URLApplicationResource(url.toExternalForm(), url));
resources.add(new StrutsApplicationResource(entry.getValue()));
}
}