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 2022/06/10 14:06:51 UTC

[struts] 01/02: WW-5185 Reintroduces proper implementation of Tiles resource to support wildcard matching of Tiles definitions It was broken after refactoring related to WW-5011

This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch WW-5185-struts-resource
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 3825229f44450bd34a8e2e22ac80291515170847
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Fri Jun 10 16:06:10 2022 +0200

    WW-5185 Reintroduces proper implementation of Tiles resource to support wildcard matching of Tiles definitions
    It was broken after refactoring related to WW-5011
---
 .../struts2/tiles/StrutsApplicationResource.java   | 82 ++++++++++++++++++++++
 .../StrutsWildcardServletApplicationContext.java   |  5 +-
 2 files changed, 84 insertions(+), 3 deletions(-)

diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsApplicationResource.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsApplicationResource.java
new file mode 100644
index 000000000..1ad6ab95e
--- /dev/null
+++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsApplicationResource.java
@@ -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();
+    }
+}
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 5b1181fd3..6a890d4a9 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
@@ -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()));
             }
         }