1 15 package org.apache.tapestry.coerce; 16 17 import java.beans.PropertyEditor ; 18 import java.beans.PropertyEditorManager ; 19 import java.util.HashMap ; 20 import java.util.Iterator ; 21 import java.util.List ; 22 import java.util.Map ; 23 24 import org.apache.hivemind.ApplicationRuntimeException; 25 import org.apache.hivemind.util.ConstructorUtils; 26 import org.apache.hivemind.util.Defense; 27 28 35 public class ValueConverterImpl implements ValueConverter 36 { 37 private Map _converterMap = new HashMap (); 38 39 40 41 public List _contributions; 42 43 private Map _primitiveToWrapper = new HashMap (); 44 45 private Map _wrapperToPrimitive = new HashMap (); 46 47 { 48 store(boolean.class, Boolean .class); 49 store(byte.class, Byte .class); 50 store(short.class, Short .class); 51 store(char.class, Character .class); 52 store(int.class, Integer .class); 53 store(long.class, Long .class); 54 store(float.class, Float .class); 55 store(double.class, Double .class); 56 } 57 58 private void store(Class primitive, Class wrapper) 59 { 60 _primitiveToWrapper.put(primitive, wrapper); 61 62 _wrapperToPrimitive.put(wrapper, primitive); 63 } 64 65 public void initializeService() 66 { 67 Iterator i = _contributions.iterator(); 68 while (i.hasNext()) 69 { 70 TypeConverterContribution c = (TypeConverterContribution) i.next(); 71 72 _converterMap.put(c.getSubjectClass(), c.getConverter()); 73 } 74 } 75 76 public Object coerceValue(Object value, Class desiredType) 77 { 78 Defense.notNull(desiredType, "desiredType"); 79 80 Class effectiveType = convertType(desiredType); 81 82 84 if (value != null && effectiveType.isAssignableFrom(value.getClass())) 85 return value; 86 87 Object result = convertNumberToNumber(value, effectiveType); 88 89 if (result != null) 90 return result; 91 92 result = convertUsingPropertyEditor(value, effectiveType); 93 94 if (result != null) 95 return result; 96 97 TypeConverter converter = (TypeConverter) _converterMap.get(effectiveType); 98 99 101 if (value == null && converter == null) 102 return null; 103 104 if (converter == null) 105 throw new ApplicationRuntimeException(CoerceMessages.noConverter(effectiveType)); 106 107 return converter.convertValue(value); 108 } 109 110 119 120 private Number convertUsingPropertyEditor(Object value, Class targetType) 121 { 122 126 if (value == null || value.getClass() != String .class 127 || !Number .class.isAssignableFrom(targetType)) 128 return null; 129 130 Class primitiveType = (Class ) _wrapperToPrimitive.get(targetType); 131 132 134 if (primitiveType == null) 135 return null; 136 137 139 PropertyEditor editor = PropertyEditorManager.findEditor(primitiveType); 140 141 144 if (editor == null) 145 return null; 146 147 String text = (String ) value; 148 149 try 150 { 151 editor.setAsText(text); 152 153 return (Number ) editor.getValue(); 154 } 155 catch (Exception ex) 156 { 157 throw new ApplicationRuntimeException(CoerceMessages.stringToNumberConversionError( 158 text, 159 targetType, 160 ex), ex); 161 } 162 163 } 164 165 private Number convertNumberToNumber(Object value, Class targetType) 166 { 167 if (value == null || !Number .class.isAssignableFrom(value.getClass()) 168 || !Number .class.isAssignableFrom(targetType)) 169 return null; 170 171 String valueAsString = value.toString(); 172 173 return (Number ) ConstructorUtils.invokeConstructor(targetType, new Object [] 174 { valueAsString }); 175 } 176 177 private Class convertType(Class possiblePrimitiveType) 178 { 179 Class wrapperType = (Class ) _primitiveToWrapper.get(possiblePrimitiveType); 180 181 return wrapperType == null ? possiblePrimitiveType : wrapperType; 182 } 183 184 public void setContributions(List contributions) 185 { 186 _contributions = contributions; 187 } 188 } | Popular Tags |