001: /*
002: * Copyright 2002-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.beans.propertyeditors;
018:
019: import java.beans.PropertyEditorSupport;
020: import java.io.File;
021: import java.io.IOException;
022:
023: import org.springframework.core.io.Resource;
024: import org.springframework.core.io.ResourceEditor;
025: import org.springframework.util.Assert;
026: import org.springframework.util.ResourceUtils;
027: import org.springframework.util.StringUtils;
028:
029: /**
030: * Editor for <code>java.io.File</code>, to directly populate a File property
031: * from a Spring resource location.
032: *
033: * <p>Supports Spring-style URL notation: any fully qualified standard URL
034: * ("file:", "http:", etc) and Spring's special "classpath:" pseudo-URL.
035: *
036: * <p><b>NOTE:</b> The behavior of this editor has changed in Spring 2.0.
037: * Previously, it created a File instance directly from a filename.
038: * As of Spring 2.0, it takes a standard Spring resource location as input;
039: * this is consistent with URLEditor and InputStreamEditor now.
040: *
041: * <p><b>NOTE:</b> In Spring 2.5 the following modification was made.
042: * If a file name is specified without a URL prefix or without an absolute path
043: * then we try to locate the file using standard ResourceLoader semantics.
044: * If the file was not found, then a File instance is created assuming the file
045: * name refers to a relative file location.
046: *
047: * @author Juergen Hoeller
048: * @author Thomas Risberg
049: * @since 09.12.2003
050: * @see java.io.File
051: * @see org.springframework.core.io.ResourceEditor
052: * @see org.springframework.core.io.ResourceLoader
053: * @see URLEditor
054: * @see InputStreamEditor
055: */
056: public class FileEditor extends PropertyEditorSupport {
057:
058: private final ResourceEditor resourceEditor;
059:
060: /**
061: * Create a new FileEditor,
062: * using the default ResourceEditor underneath.
063: */
064: public FileEditor() {
065: this .resourceEditor = new ResourceEditor();
066: }
067:
068: /**
069: * Create a new FileEditor,
070: * using the given ResourceEditor underneath.
071: * @param resourceEditor the ResourceEditor to use
072: */
073: public FileEditor(ResourceEditor resourceEditor) {
074: Assert.notNull(resourceEditor,
075: "ResourceEditor must not be null");
076: this .resourceEditor = resourceEditor;
077: }
078:
079: public void setAsText(String text) throws IllegalArgumentException {
080: // Check whether we got an absolute file path without "file:" prefix.
081: // For backwards compatibility, we'll consider those as straight file path.
082: if (StringUtils.hasText(text) && !ResourceUtils.isUrl(text)) {
083: File file = new File(text);
084: if (file.isAbsolute()) {
085: setValue(file);
086: return;
087: }
088: }
089:
090: // Proceed with standard resource location parsing.
091: this .resourceEditor.setAsText(text);
092: Resource resource = (Resource) this .resourceEditor.getValue();
093: // Non URLs will be treated as relative paths if the resource was not found
094: if (ResourceUtils.isUrl(text) || resource.exists()) {
095: try {
096: setValue(resource != null ? resource.getFile() : null);
097: } catch (IOException ex) {
098: throw new IllegalArgumentException(
099: "Could not retrieve File for " + resource
100: + ": " + ex.getMessage());
101: }
102: } else {
103: // Create a relative File reference and hope for the best
104: File file = new File(text);
105: setValue(file);
106: }
107: }
108:
109: public String getAsText() {
110: File value = (File) getValue();
111: return (value != null ? value.getPath() : "");
112: }
113:
114: }
|