001 /***************************************************************************** 002 * Copyright (C) PicoContainer Organization. All rights reserved. * 003 * ------------------------------------------------------------------------- * 004 * The software in this package is published under the terms of the BSD * 005 * style license a copy of which has been included with this distribution in * 006 * the LICENSE.txt file. * 007 * * 008 * Original code by Joe Walnes * 009 *****************************************************************************/ 010 011 012 package org.picocontainer.script.util; 013 014 import org.picocontainer.PicoCompositionException; 015 016 import java.util.HashMap; 017 import java.util.Map; 018 019 @SuppressWarnings("serial") 020 public class StringConversions { 021 022 public interface StringConverter<T> { 023 T convert(String in); 024 } 025 026 public static class InvalidConversionException extends PicoCompositionException { 027 public InvalidConversionException(String message) { 028 super(message); 029 } 030 } 031 032 private final Map<Class<?>, StringConverter<?>> converters = new HashMap<Class<?>, StringConverter<?>>(); 033 034 public StringConversions() { 035 register(String.class, new StringConverter<String>() { 036 public String convert(String in) { 037 return in; 038 } 039 }); 040 041 register(Integer.class, new StringConverter<Integer>() { 042 public Integer convert(String in) { 043 return in == null ? 0 : Integer.valueOf(in); 044 } 045 }); 046 047 register(Long.class, new StringConverter<Long>() { 048 public Long convert(String in) { 049 return in == null ? (long) 0 : Long.valueOf(in); 050 } 051 }); 052 053 register(Boolean.class, new StringConverter<Boolean>() { 054 public Boolean convert(String in) { 055 if (in == null || in.length() == 0) { 056 return Boolean.FALSE; 057 } 058 char c = in.toLowerCase().charAt(0); 059 return c == '1' || c == 'y' || c == 't' ? Boolean.TRUE : Boolean.FALSE; 060 } 061 }); 062 } 063 064 public Object convertTo(Class<?> desiredClass, String inputString) { 065 StringConverter<?> converter = converters.get(desiredClass); 066 if (converter == null) { 067 throw new InvalidConversionException("Cannot convert to type " + desiredClass.getName()); 068 } 069 return converter.convert(inputString); 070 } 071 072 public void register(Class<?> type, StringConverter<?> converter) { 073 converters.put(type, converter); 074 } 075 }