This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch fix/WW-5419-tiles in repository https://gitbox.apache.org/repos/asf/struts.git
commit b174f3ecf0a0d7b4d535d71d9df699191fd17675 Author: Lukasz Lenart <lukaszlen...@apache.org> AuthorDate: Sun Apr 21 10:21:55 2024 +0200 WW-5419 Fixes support for loading Tiles definitions --- plugins/tiles/pom.xml | 10 +++ .../struts2/tiles/StrutsTilesContainerFactory.java | 18 +---- .../StrutsWildcardServletApplicationContext.java | 9 ++- .../tiles/StrutsTilesContainerFactoryTest.java | 9 ++- ...trutsWildcardServletApplicationContextTest.java | 79 ++++++++++++++++++++++ plugins/tiles/src/test/resources/WEB-INF/tiles.xml | 39 +++++++++++ .../org/apache/tiles/core/config/tiles_defs1.xml | 75 ++++++++++++++++++++ 7 files changed, 213 insertions(+), 26 deletions(-) diff --git a/plugins/tiles/pom.xml b/plugins/tiles/pom.xml index 618bc6a8c..53d79b89d 100644 --- a/plugins/tiles/pom.xml +++ b/plugins/tiles/pom.xml @@ -102,6 +102,16 @@ <artifactId>log4j-jcl</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <scope>test</scope> + </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java index ed03f8268..21bbbf97e 100644 --- a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java +++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java @@ -68,10 +68,7 @@ import javax.el.MapELResolver; import javax.el.ResourceBundleELResolver; import javax.servlet.jsp.JspFactory; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -105,19 +102,8 @@ public class StrutsTilesContainerFactory extends BasicTilesContainerFactory { /** * Default pattern to be used to collect Tiles definitions if user didn't configure any - * - * @deprecated since Struts 6.4.0, use {@link #TILES_DEFAULT_PATTERNS} instead */ - @Deprecated - public static final String TILES_DEFAULT_PATTERN = "/WEB-INF/**/tiles*.xml,classpath*:META-INF/**/tiles*.xml"; - - /** - * Default pattern to be used to collect Tiles definitions if user didn't configure any - */ - public static final Set<String> TILES_DEFAULT_PATTERNS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( - "/WEB-INF/**/tiles*.xml", - "classpath*:META-INF/**/tiles*.xml" - ))); + public static final String TILES_DEFAULT_PATTERN = "*tiles*.xml"; /** * Supported expression languages @@ -227,7 +213,7 @@ public class StrutsTilesContainerFactory extends BasicTilesContainerFactory { if (params.containsKey(DefinitionsFactory.DEFINITIONS_CONFIG)) { return TextParseUtil.commaDelimitedStringToSet(params.get(DefinitionsFactory.DEFINITIONS_CONFIG)); } - return TILES_DEFAULT_PATTERNS; + return TextParseUtil.commaDelimitedStringToSet(TILES_DEFAULT_PATTERN); } protected ELAttributeEvaluator createELEvaluator(ApplicationContext applicationContext) { diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsWildcardServletApplicationContext.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsWildcardServletApplicationContext.java index 7af6069bb..2a30eb626 100644 --- a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsWildcardServletApplicationContext.java +++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsWildcardServletApplicationContext.java @@ -43,7 +43,7 @@ public class StrutsWildcardServletApplicationContext extends ServletApplicationC private static final Logger LOG = LogManager.getLogger(StrutsWildcardServletApplicationContext.class); - private ResourceFinder finder; + private final ResourceFinder finder; public StrutsWildcardServletApplicationContext(ServletContext context) { super(context); @@ -64,16 +64,15 @@ public class StrutsWildcardServletApplicationContext extends ServletApplicationC } try { - Enumeration<URL> resources = getClass().getClassLoader().getResources("/"); + Enumeration<URL> resources = getClass().getClassLoader().getResources(""); while (resources.hasMoreElements()) { - URL resource = resources.nextElement(); - urls.add(resource); + urls.add(resources.nextElement()); } } catch (IOException e) { throw new ConfigurationException(e); } - finder = new ResourceFinder(urls.toArray(new URL[urls.size()])); + finder = new ResourceFinder(urls.toArray(new URL[0])); } public Collection<ApplicationResource> getResources(String path) { diff --git a/plugins/tiles/src/test/java/org/apache/struts2/tiles/StrutsTilesContainerFactoryTest.java b/plugins/tiles/src/test/java/org/apache/struts2/tiles/StrutsTilesContainerFactoryTest.java index 122bfe51d..944aac2c9 100644 --- a/plugins/tiles/src/test/java/org/apache/struts2/tiles/StrutsTilesContainerFactoryTest.java +++ b/plugins/tiles/src/test/java/org/apache/struts2/tiles/StrutsTilesContainerFactoryTest.java @@ -34,8 +34,8 @@ import org.apache.tiles.request.render.Renderer; import org.junit.Before; import org.junit.Test; -import javax.servlet.ServletContext; import javax.servlet.jsp.JspFactory; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -64,12 +64,11 @@ public class StrutsTilesContainerFactoryTest { Objects.requireNonNull(getClass().getResource("/org/apache/tiles/core/config/tiles-defs.xml")) ); ApplicationResource classpathResource = new URLApplicationResource( - "/org/apache/tiles/core/config/defs1.xml", - Objects.requireNonNull(getClass().getResource("/org/apache/tiles/core/config/defs1.xml")) + "/org/apache/tiles/core/config/tiles_defs1.xml", + Objects.requireNonNull(getClass().getResource("/org/apache/tiles/core/config/tiles_defs1.xml")) ); when(applicationContext.getInitParams()).thenReturn(Collections.emptyMap()); - when(applicationContext.getResources("/WEB-INF/**/tiles*.xml")).thenReturn(Collections.singleton(pathResource)); - when(applicationContext.getResources("classpath*:META-INF/**/tiles*.xml")).thenReturn(Collections.singleton(classpathResource)); + when(applicationContext.getResources("*tiles*.xml")).thenReturn(Arrays.asList(pathResource, classpathResource)); List<ApplicationResource> resources = factory.getSources(applicationContext); assertEquals("The urls list is not two-sized", 2, resources.size()); diff --git a/plugins/tiles/src/test/java/org/apache/struts2/tiles/StrutsWildcardServletApplicationContextTest.java b/plugins/tiles/src/test/java/org/apache/struts2/tiles/StrutsWildcardServletApplicationContextTest.java new file mode 100644 index 000000000..972ed705a --- /dev/null +++ b/plugins/tiles/src/test/java/org/apache/struts2/tiles/StrutsWildcardServletApplicationContextTest.java @@ -0,0 +1,79 @@ +/* + * 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.core.definition.DefinitionsFactory; +import org.apache.tiles.request.ApplicationResource; +import org.junit.Before; +import org.junit.Test; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.FileUrlResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.mock.web.MockServletContext; + +import javax.servlet.ServletContext; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Collection; + +import static org.assertj.core.api.Assertions.assertThat; + +public class StrutsWildcardServletApplicationContextTest { + + private ServletContext context; + + @Before + public void setUp() throws Exception { + URL resource = getClass().getResource("/"); + context = new MockServletContext(resource.getPath(), new ResourceLoader() { + @Override + public Resource getResource(String location) { + try { + String finalLocation = location.replaceAll("//", "/"); + if (finalLocation.endsWith("/")) { + return new FileSystemResource(finalLocation); + } + return new FileUrlResource(finalLocation); + } catch (MalformedURLException e) { + return null; + } + } + + @Override + public ClassLoader getClassLoader() { + return StrutsWildcardServletApplicationContextTest.class.getClassLoader(); + } + }); + } + + @Test + public void wildcardSupport() { + StrutsWildcardServletApplicationContext applicationContext = new StrutsWildcardServletApplicationContext(context); + + Collection<ApplicationResource> resources = applicationContext.getResources("*tiles*.xml"); + + assertThat(resources) + .hasSize(1) + .extracting(ApplicationResource::getLocalePath) + .first().asString() + .endsWith("/WEB-INF/tiles.xml"); + } + +} \ No newline at end of file diff --git a/plugins/tiles/src/test/resources/WEB-INF/tiles.xml b/plugins/tiles/src/test/resources/WEB-INF/tiles.xml new file mode 100644 index 000000000..9fc36a4d6 --- /dev/null +++ b/plugins/tiles/src/test/resources/WEB-INF/tiles.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!-- +/* + * 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. + */ +--> + +<!DOCTYPE tiles-definitions PUBLIC + "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" + "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"> + +<tiles-definitions> + + <!-- Doc index page description --> + <definition name="top.mainLayout" template="/layout/classicLayout.jsp"> + <put-attribute name="title" value="Tiles Library Documentation"/> + <put-attribute name="header" value="/common/header.jsp"/> + <put-attribute name="menu" value="doc.menu.main"/> + <put-attribute name="footer" value="/common/footer.jsp"/> + <put-attribute name="body" value="doc.portal.body"/> + <put-attribute name="bean" value="This is an object" type="object"/> + </definition> + +</tiles-definitions> diff --git a/plugins/tiles/src/test/resources/org/apache/tiles/core/config/tiles_defs1.xml b/plugins/tiles/src/test/resources/org/apache/tiles/core/config/tiles_defs1.xml new file mode 100644 index 000000000..621d7cef9 --- /dev/null +++ b/plugins/tiles/src/test/resources/org/apache/tiles/core/config/tiles_defs1.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!-- +/* + * 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. + */ +--> + + <!DOCTYPE tiles-definitions PUBLIC + "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" + "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"> + +<!-- Definitions for Tiles documentation --> + +<tiles-definitions> + + <!-- ======================================================= --> + <!-- Master definition --> + <!-- ======================================================= --> + + <!-- This definition will remain the same for all locales --> + <definition name="test.common" template="/test.jsp"> + <put-attribute name="country" value="none"/> + <put-attribute name="title" value="Common Definition" /> + <put-attribute name="header" value="/common/header.jsp" /> + <put-attribute name="menu" value="doc.menu.main" /> + <put-attribute name="footer" value="/common/footer.jsp" /> + <put-attribute name="body" value="doc.portal.body" /> + </definition> + + <!-- Doc index page description --> + <definition name="test.def1" template="/test.jsp"> + <put-attribute name="country" value="default"/> + <put-attribute name="title" value="Tiles Library Documentation" /> + <put-attribute name="header" value="/common/header.jsp" /> + <put-attribute name="menu" value="doc.menu.main" /> + <put-attribute name="footer" value="/common/footer.jsp" /> + <put-attribute name="body" value="doc.portal.body" /> + </definition> + + <!-- This definition will be extended --> + <definition name="test.def.toextend" template="/test.jsp"> + <put-attribute name="country" value="default"/> + <put-attribute name="title" value="Definition to be extended" /> + <put-attribute name="header" value="/common/header.jsp" /> + <put-attribute name="menu" value="doc.menu.main" /> + <put-attribute name="footer" value="/common/footer.jsp" /> + <put-attribute name="body" value="doc.portal.body" /> + </definition> + + <!-- This definition will be overridden --> + <definition name="test.def.overridden" template="/test.jsp"> + <put-attribute name="country" value="default"/> + <put-attribute name="title" value="Definition to be overridden" /> + <put-attribute name="header" value="/common/header.jsp" /> + <put-attribute name="menu" value="doc.menu.main" /> + <put-attribute name="footer" value="/common/footer.jsp" /> + <put-attribute name="body" value="doc.portal.body" /> + </definition> + +</tiles-definitions>