001 package org.picocontainer.converters; 002 003 import org.picocontainer.Converters; 004 005 import java.io.File; 006 import java.io.Serializable; 007 import java.lang.reflect.Type; 008 import java.net.URL; 009 import java.util.HashMap; 010 import java.util.Map; 011 012 /** 013 * Provides some built-in converters used by {@link DefaultPicoContainer}. It 014 * supports by default primitive types (and boxed equivalents) and for 015 * {@link File} and {@link URL} types. Built-in converters can be changed by 016 * extending the class and overriding the method {@link #addBuiltInConverters()}. 017 */ 018 @SuppressWarnings("serial") 019 public class BuiltInConverters implements Converters, Serializable { 020 021 private final Map<Class<?>, Converter<?>> converters = new HashMap<Class<?>, Converter<?>>(); 022 023 public BuiltInConverters() { 024 addBuiltInConverters(); 025 } 026 027 protected void addBuiltInConverters() { 028 addMultiTypeConverter(new IntegerConverter(), Integer.class, Integer.TYPE); 029 addMultiTypeConverter(new DoubleConverter(), Double.class, Double.TYPE); 030 addMultiTypeConverter(new BooleanConverter(), Boolean.class, Boolean.TYPE); 031 addMultiTypeConverter(new LongConverter(), Long.class, Long.TYPE); 032 addMultiTypeConverter(new FloatConverter(), Float.class, Float.TYPE); 033 addMultiTypeConverter(new CharacterConverter(), Character.class, Character.TYPE); 034 addMultiTypeConverter(new ByteConverter(), Byte.class, Byte.TYPE); 035 addMultiTypeConverter(new ShortConverter(), Short.class, Short.TYPE); 036 addConverter(new FileConverter(), File.class); 037 addConverter(new UrlConverter(), URL.class); 038 } 039 040 private void addMultiTypeConverter(Converter<?> converter, Class<?>... types) { 041 for (Class<?> type : types) { 042 addConverter(converter, type); 043 } 044 } 045 046 protected void addConverter(Converter<?> converter, Class<?> key) { 047 converters.put(key, converter); 048 } 049 050 public boolean canConvert(Type type) { 051 return converters.containsKey(type); 052 } 053 054 public Object convert(String paramValue, Type type) { 055 Converter<?> converter = converters.get(type); 056 if (converter == null) { 057 return null; 058 } 059 return converter.convert(paramValue); 060 } 061 062 }