PathEditor tries file system path in case of non-existing resource
Issue: SPR-14549
(cherry picked from commit d69afaa)
			
			
This commit is contained in:
		
							parent
							
								
									ad8ebbaa05
								
							
						
					
					
						commit
						4ada571384
					
				| 
						 | 
				
			
			@ -84,8 +84,9 @@ public class FileEditor extends PropertyEditorSupport {
 | 
			
		|||
 | 
			
		||||
		// Check whether we got an absolute file path without "file:" prefix.
 | 
			
		||||
		// For backwards compatibility, we'll consider those as straight file path.
 | 
			
		||||
		File file = null;
 | 
			
		||||
		if (!ResourceUtils.isUrl(text)) {
 | 
			
		||||
			File file = new File(text);
 | 
			
		||||
			file = new File(text);
 | 
			
		||||
			if (file.isAbsolute()) {
 | 
			
		||||
				setValue(file);
 | 
			
		||||
				return;
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +98,7 @@ public class FileEditor extends PropertyEditorSupport {
 | 
			
		|||
		Resource resource = (Resource) this.resourceEditor.getValue();
 | 
			
		||||
 | 
			
		||||
		// If it's a URL or a path pointing to an existing resource, use it as-is.
 | 
			
		||||
		if (ResourceUtils.isUrl(text) || resource.exists()) {
 | 
			
		||||
		if (file == null || resource.exists()) {
 | 
			
		||||
			try {
 | 
			
		||||
				setValue(resource.getFile());
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -107,8 +108,8 @@ public class FileEditor extends PropertyEditorSupport {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			// Create a relative File reference and hope for the best.
 | 
			
		||||
			setValue(new File(text));
 | 
			
		||||
			// Set a relative File reference and hope for the best.
 | 
			
		||||
			setValue(file);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,13 +37,10 @@ import org.springframework.util.Assert;
 | 
			
		|||
 * <p>Based on {@link Paths#get(URI)}'s resolution algorithm, checking
 | 
			
		||||
 * registered NIO file system providers, including the default file system
 | 
			
		||||
 * for "file:..." paths. Also supports Spring-style URL notation: any fully
 | 
			
		||||
 * qualified standard URL and Spring's special "classpath:" pseudo-URL,
 | 
			
		||||
 * as well as Spring's context-specific relative file paths.
 | 
			
		||||
 *
 | 
			
		||||
 * <p>Note that, in contrast to {@link FileEditor}, relative paths are only
 | 
			
		||||
 * supported by Spring's resource abstraction here. Direct {@code Paths.get}
 | 
			
		||||
 * resolution in a file system always has to go through the corresponding
 | 
			
		||||
 * file system provider's scheme, i.e. "file" for the default file system.
 | 
			
		||||
 * qualified standard URL and Spring's special "classpath:" pseudo-URL, as
 | 
			
		||||
 * well as Spring's context-specific relative file paths. As a fallback, a
 | 
			
		||||
 * path will be resolved in the file system via {@code Paths#get(String)}
 | 
			
		||||
 * if no existing context-relative resource could be found.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Juergen Hoeller
 | 
			
		||||
 * @since 4.3.2
 | 
			
		||||
| 
						 | 
				
			
			@ -79,10 +76,12 @@ public class PathEditor extends PropertyEditorSupport {
 | 
			
		|||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setAsText(String text) throws IllegalArgumentException {
 | 
			
		||||
		if (!text.startsWith("/") && !text.startsWith(ResourceLoader.CLASSPATH_URL_PREFIX)) {
 | 
			
		||||
		boolean nioPathCandidate = !text.startsWith(ResourceLoader.CLASSPATH_URL_PREFIX);
 | 
			
		||||
		if (nioPathCandidate && !text.startsWith("/")) {
 | 
			
		||||
			try {
 | 
			
		||||
				URI uri = new URI(text);
 | 
			
		||||
				if (uri.getScheme() != null) {
 | 
			
		||||
					nioPathCandidate = false;
 | 
			
		||||
					// Let's try NIO file system providers via Paths.get(URI)
 | 
			
		||||
					setValue(Paths.get(uri).normalize());
 | 
			
		||||
					return;
 | 
			
		||||
| 
						 | 
				
			
			@ -99,11 +98,19 @@ public class PathEditor extends PropertyEditorSupport {
 | 
			
		|||
 | 
			
		||||
		this.resourceEditor.setAsText(text);
 | 
			
		||||
		Resource resource = (Resource) this.resourceEditor.getValue();
 | 
			
		||||
		try {
 | 
			
		||||
			setValue(resource != null ? resource.getFile().toPath() : null);
 | 
			
		||||
		if (resource == null) {
 | 
			
		||||
			setValue(null);
 | 
			
		||||
		}
 | 
			
		||||
		catch (IOException ex) {
 | 
			
		||||
			throw new IllegalArgumentException("Failed to retrieve file for " + resource, ex);
 | 
			
		||||
		else if (!resource.exists() && nioPathCandidate) {
 | 
			
		||||
			setValue(Paths.get(text).normalize());
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			try {
 | 
			
		||||
				setValue(resource.getFile().toPath());
 | 
			
		||||
			}
 | 
			
		||||
			catch (IOException ex) {
 | 
			
		||||
				throw new IllegalArgumentException("Failed to retrieve file for " + resource, ex);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,7 @@ import static org.junit.Assert.*;
 | 
			
		|||
/**
 | 
			
		||||
 * @author Thomas Risberg
 | 
			
		||||
 * @author Chris Beams
 | 
			
		||||
 * @author Juergen Hoeller
 | 
			
		||||
 */
 | 
			
		||||
public class FileEditorTests {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -78,10 +79,7 @@ public class FileEditorTests {
 | 
			
		|||
		assertTrue(value instanceof File);
 | 
			
		||||
		File file = (File) value;
 | 
			
		||||
		assertTrue(file.exists());
 | 
			
		||||
		String absolutePath = file.getAbsolutePath();
 | 
			
		||||
		if (File.separatorChar == '\\') {
 | 
			
		||||
			absolutePath = absolutePath.replace('\\', '/');
 | 
			
		||||
		}
 | 
			
		||||
		String absolutePath = file.getAbsolutePath().replace('\\', '/');
 | 
			
		||||
		assertTrue(absolutePath.endsWith(fileName));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -95,10 +93,7 @@ public class FileEditorTests {
 | 
			
		|||
		assertTrue(value instanceof File);
 | 
			
		||||
		File file = (File) value;
 | 
			
		||||
		assertFalse(file.exists());
 | 
			
		||||
		String absolutePath = file.getAbsolutePath();
 | 
			
		||||
		if (File.separatorChar == '\\') {
 | 
			
		||||
			absolutePath = absolutePath.replace('\\', '/');
 | 
			
		||||
		}
 | 
			
		||||
		String absolutePath = file.getAbsolutePath().replace('\\', '/');
 | 
			
		||||
		assertTrue(absolutePath.endsWith(fileName));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,6 +59,16 @@ public class PathEditorTests {
 | 
			
		|||
		assertTrue(!path.toFile().exists());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testAbsolutePath() throws Exception {
 | 
			
		||||
		PropertyEditor pathEditor = new PathEditor();
 | 
			
		||||
		pathEditor.setAsText("/no_way_this_file_is_found.doc");
 | 
			
		||||
		Object value = pathEditor.getValue();
 | 
			
		||||
		assertTrue(value instanceof Path);
 | 
			
		||||
		Path path = (Path) value;
 | 
			
		||||
		assertTrue(!path.toFile().exists());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testUnqualifiedPathNameFound() throws Exception {
 | 
			
		||||
		PropertyEditor pathEditor = new PathEditor();
 | 
			
		||||
| 
						 | 
				
			
			@ -77,4 +87,22 @@ public class PathEditorTests {
 | 
			
		|||
		assertTrue(absolutePath.endsWith(fileName));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testUnqualifiedPathNameNotFound() throws Exception {
 | 
			
		||||
		PropertyEditor pathEditor = new PathEditor();
 | 
			
		||||
		String fileName = ClassUtils.classPackageAsResourcePath(getClass()) + "/" +
 | 
			
		||||
				ClassUtils.getShortName(getClass()) + ".clazz";
 | 
			
		||||
		pathEditor.setAsText(fileName);
 | 
			
		||||
		Object value = pathEditor.getValue();
 | 
			
		||||
		assertTrue(value instanceof Path);
 | 
			
		||||
		Path path = (Path) value;
 | 
			
		||||
		File file = path.toFile();
 | 
			
		||||
		assertFalse(file.exists());
 | 
			
		||||
		String absolutePath = file.getAbsolutePath();
 | 
			
		||||
		if (File.separatorChar == '\\') {
 | 
			
		||||
			absolutePath = absolutePath.replace('\\', '/');
 | 
			
		||||
		}
 | 
			
		||||
		assertTrue(absolutePath.endsWith(fileName));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue