From 3a166ea742bdacebe94fdc26fe41f7293fba2a1a Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 12 Oct 2021 16:18:09 +0200 Subject: [PATCH] Add efficient existence check to ClassPathResource.isReadable() Includes reduced isReadable() check in PathResourceLookupFunction, aligned with PathResourceResolver. Closes gh-27538 See gh-21372 --- .../core/io/AbstractFileResolvingResource.java | 12 ++++++++++-- .../core/io/ClassPathResource.java | 12 ++++++++++++ .../server/PathResourceLookupFunction.java | 4 ++-- .../function/PathResourceLookupFunction.java | 15 +++++---------- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/io/AbstractFileResolvingResource.java b/spring-core/src/main/java/org/springframework/core/io/AbstractFileResolvingResource.java index 958b3babce..ac9ea29a5d 100644 --- a/spring-core/src/main/java/org/springframework/core/io/AbstractFileResolvingResource.java +++ b/spring-core/src/main/java/org/springframework/core/io/AbstractFileResolvingResource.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -88,7 +88,15 @@ public abstract class AbstractFileResolvingResource extends AbstractResource { @Override public boolean isReadable() { try { - URL url = getURL(); + return checkReadable(getURL()); + } + catch (IOException ex) { + return false; + } + } + + boolean checkReadable(URL url) { + try { if (ResourceUtils.isFileURL(url)) { // Proceed with file system resolution File file = getFile(); diff --git a/spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java b/spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java index 6374f2768b..f99adce06c 100644 --- a/spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java +++ b/spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java @@ -142,6 +142,18 @@ public class ClassPathResource extends AbstractFileResolvingResource { return (resolveURL() != null); } + /** + * This implementation checks for the resolution of a resource URL upfront, + * then proceeding with {@link AbstractFileResolvingResource}'s length check. + * @see java.lang.ClassLoader#getResource(String) + * @see java.lang.Class#getResource(String) + */ + @Override + public boolean isReadable() { + URL url = resolveURL(); + return (url != null && checkReadable(url)); + } + /** * Resolves a URL for the underlying class path resource. * @return the resolved URL, or {@code null} if not resolvable diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/PathResourceLookupFunction.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/PathResourceLookupFunction.java index eb4109c223..6d9dd2ecf3 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/PathResourceLookupFunction.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/PathResourceLookupFunction.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,7 +72,7 @@ class PathResourceLookupFunction implements Function