001    /*
002     *  Copyright 2003-2004 The Apache Software Foundation
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    package org.apache.commons.convert1.string;
017    
018    
019    import org.apache.commons.convert1.ConversionException;
020    import org.apache.commons.convert1.Converter;
021    
022    import java.net.URL;
023    import java.net.MalformedURLException;
024    
025    
026    
027    /**
028     * <p>Standard {@link Converter} implementation that converts an incoming
029     * String into a <code>java.net.URL</code> object, optionally using a
030     * default value or throwing a {@link ConversionException} if a conversion
031     * error occurs.</p>
032     *
033     * @author Henri Yandell
034     * @version $Id: URLConverter.java 155441 2005-02-26 13:19:22Z dirkv $
035     * @since 0.1
036     */
037    
038    public final class URLConverter implements Converter {
039    
040    
041        // ----------------------------------------------------------- Constructors
042    
043    
044        /**
045         * Create a {@link Converter} that will throw a {@link ConversionException}
046         * if a conversion error occurs.
047         */
048        public URLConverter() {
049    
050            this.defaultValue = null;
051            this.useDefault = false;
052    
053        }
054    
055    
056        /**
057         * Create a {@link Converter} that will return the specified default value
058         * if a conversion error occurs.
059         *
060         * @param defaultValue The default value to be returned
061         */
062        public URLConverter(Object defaultValue) {
063    
064            this.defaultValue = defaultValue;
065            this.useDefault = true;
066    
067        }
068    
069    
070        // ----------------------------------------------------- Instance Variables
071    
072    
073        /**
074         * The default value specified to our Constructor, if any.
075         */
076        private Object defaultValue = null;
077    
078    
079        /**
080         * Should we return the default value on conversion errors?
081         */
082        private boolean useDefault = true;
083    
084    
085        // --------------------------------------------------------- Public Methods
086    
087    
088        /**
089         * Convert the specified input object into an output object of the
090         * specified type.
091         *
092         * @param type Data type to which this value should be converted
093         * @param value The input value to be converted
094         *
095         * @exception ConversionException if conversion cannot be performed
096         *  successfully
097         */
098        public Object convert(Class type, Object value) {
099    
100            if (value == null) {
101                if (useDefault) {
102                    return (defaultValue);
103                } else {
104                    throw new ConversionException("No value specified");
105                }
106            }
107    
108            if (value instanceof URL) {
109                return (value);
110            }
111    
112            try {
113                return new URL(value.toString());
114            } catch(MalformedURLException murle) {
115                if (useDefault) {
116                    return (defaultValue);
117                } else {
118                    throw new ConversionException(murle);
119                }
120            }
121    
122        }
123    
124    
125    }