001: /*
002: * Copyright 2002-2007 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.IOException;
021: import java.net.URI;
022: import java.net.URISyntaxException;
023:
024: import org.springframework.core.io.ClassPathResource;
025: import org.springframework.util.ClassUtils;
026: import org.springframework.util.ResourceUtils;
027: import org.springframework.util.StringUtils;
028:
029: /**
030: * Editor for <code>java.net.URI</code>, to directly populate a URI property
031: * instead of using a String property as bridge.
032: *
033: * <p>Supports Spring-style URI notation: any fully qualified standard URI
034: * ("file:", "http:", etc) and Spring's special "classpath:" pseudo-URL,
035: * which will be resolved to a corresponding URI.
036: *
037: * <p>Note: A URI is more relaxed than a URL in that it does not require
038: * a valid protocol to be specified. Any scheme within a valid URI syntax
039: * is allowed, even without a matching protocol handler being registered.
040: *
041: * @author Juergen Hoeller
042: * @since 2.0.2
043: * @see java.net.URI
044: * @see URLEditor
045: */
046: public class URIEditor extends PropertyEditorSupport {
047:
048: private final ClassLoader classLoader;
049:
050: /**
051: * Create a new URIEditor, converting "classpath:" locations into
052: * standard URIs (not trying to resolve them into physical resources).
053: */
054: public URIEditor() {
055: this .classLoader = null;
056: }
057:
058: /**
059: * Create a new URIEditor, using the given ClassLoader to resolve
060: * "classpath:" locations into physical resource URLs.
061: * @param classLoader the ClassLoader to use for resolving "classpath:" locations
062: * (may be <code>null</code> to indicate the default ClassLoader)
063: */
064: public URIEditor(ClassLoader classLoader) {
065: this .classLoader = (classLoader != null ? classLoader
066: : ClassUtils.getDefaultClassLoader());
067: }
068:
069: public void setAsText(String text) throws IllegalArgumentException {
070: if (StringUtils.hasText(text)) {
071: String uri = text.trim();
072: if (this .classLoader != null
073: && uri
074: .startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) {
075: ClassPathResource resource = new ClassPathResource(uri
076: .substring(ResourceUtils.CLASSPATH_URL_PREFIX
077: .length()), this .classLoader);
078: try {
079: String url = resource.getURL().toString();
080: setValue(createURI(url));
081: } catch (IOException ex) {
082: throw new IllegalArgumentException(
083: "Could not retrieve URI for " + resource
084: + ": " + ex.getMessage());
085: } catch (URISyntaxException ex) {
086: throw new IllegalArgumentException(
087: "Invalid URI syntax: " + ex);
088: }
089: } else {
090: try {
091: setValue(createURI(uri));
092: } catch (URISyntaxException ex) {
093: throw new IllegalArgumentException(
094: "Invalid URI syntax: " + ex);
095: }
096: }
097: } else {
098: setValue(null);
099: }
100: }
101:
102: /**
103: * Create a URI instance for the given (resolved) String value.
104: * <p>The default implementation uses the <code>URI(String)</code>
105: * constructor, replacing spaces with "%20" quotes first.
106: * @param value the value to convert into a URI instance
107: * @return the URI instance
108: * @throws URISyntaxException if URI conversion failed
109: */
110: protected URI createURI(String value) throws URISyntaxException {
111: return new URI(StringUtils.replace(value, " ", "%20"));
112: }
113:
114: public String getAsText() {
115: URI value = (URI) getValue();
116: return (value != null ? value.toString() : "");
117: }
118:
119: }
|