/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.util;
import java.math.BigInteger;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.BigDecimalConverter;
import org.apache.commons.beanutils.converters.BigIntegerConverter;
import org.apache.commons.beanutils.converters.BooleanConverter;
import org.apache.commons.beanutils.converters.ByteConverter;
import org.apache.commons.beanutils.converters.CharacterConverter;
import org.apache.commons.beanutils.converters.DoubleConverter;
import org.apache.commons.beanutils.converters.FloatConverter;
import org.apache.commons.beanutils.converters.IntegerConverter;
import org.apache.commons.beanutils.converters.LongConverter;
import org.apache.commons.beanutils.converters.ShortConverter;
import org.geotools.factory.Hints;
/**
* ConverterFactory based on the apache commons {@link org.apache.commons.beanutils.Converter}
* interface.
*
* @author Justin Deoliveira, The Open Planning Project
* @since 2.4
*
* @source $URL$
*/
public class CommonsConverterFactory implements ConverterFactory {
//some additional converters
/**
* converts a string to a uri.
*/
static org.apache.commons.beanutils.Converter uri = new org.apache.commons.beanutils.Converter() {
public Object convert( Class target, Object value ) {
String string = (String) value;
try {
return new URI( string );
}
catch (URISyntaxException e) { }
return null;
}
};
/**
* converts a string to a number when the target class == Number, does so
* by delegating to the other numeric converters
*/
static org.apache.commons.beanutils.Converter number = new org.apache.commons.beanutils.Converter() {
public Object convert(Class type, Object value) {
String string = (String) value;
Number parsed = null;
try {
//first try integer
parsed = (Number) new IntegerConverter().convert(Integer.class, string);
}
catch(Exception e) {}
if ( parsed == null ) {
//try double
parsed = (Number) new DoubleConverter().convert(Double.class,string);
}
return parsed;
};
};
static {
ConvertUtils.register( uri, URI.class );
ConvertUtils.register( number, Number.class );
//make sure numeric converters do not use default value
ConvertUtils.register( new ByteConverter(null), Byte.class );
ConvertUtils.register( new ShortConverter(null), Short.class );
ConvertUtils.register( new IntegerConverter(null), Integer.class );
ConvertUtils.register( new LongConverter(null), Long.class );
ConvertUtils.register( new BigIntegerConverter(null), BigInteger.class );
ConvertUtils.register( new FloatConverter(null), Float.class );
ConvertUtils.register( new DoubleConverter(null), Double.class );
ConvertUtils.register( new BigDecimalConverter(null), BigDecimalConverter.class );
ConvertUtils.register( new BooleanConverter(null), Boolean.class );
ConvertUtils.register( new CharacterConverter(null), Character.class );
}
/**
* Delegates to {@link ConvertUtils#lookup(java.lang.Class)} to create a
* converter instance.
*
* @see ConverterFactory#createConverter(Class, Class, Hints).
*/
public Converter createConverter(Class source, Class target, Hints hints) {
//only do strings
if ( source.equals( String.class ) ) {
org.apache.commons.beanutils.Converter converter = ConvertUtils.lookup( target );
if ( converter != null ) {
return new CommonsConverterWrapper( converter );
}
}
return null;
}
/**
* Decorates a beanutils converter in a geotools converter.
*
* @author Justin Deoliveira, The Open Planning Project
*
*/
static class CommonsConverterWrapper implements Converter {
org.apache.commons.beanutils.Converter delegate;
public CommonsConverterWrapper( org.apache.commons.beanutils.Converter delegate ) {
this.delegate = delegate;
}
public Object convert(Object source, Class target) throws Exception {
return delegate.convert( target, source );
}
}
}