Clover coverage report -
Coverage timestamp: Sat Jul 7 2007 16:41:13 CEST
file stats: LOC: 138   Methods: 3
NCLOC: 100   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
BeanUtilsExtension.java 44.1% 46.6% 100% 47.4%
coverage coverage
 1    /**
 2    * JTRunner is free software; you can redistribute it and/or modify it under the
 3    * terms of the GNU General Public License as published by the Free Software
 4    * Foundation; either version 2, or (at your option) any later version.
 5    */
 6   
 7    package jtr.assigner.util;
 8   
 9    import java.lang.reflect.Field;
 10    import org.apache.commons.beanutils.BeanUtils;
 11    import org.apache.log4j.Logger;
 12   
 13    /**
 14    * This class extends the <code>BeanUtils.setProperty(Object,String,Object)</code> method
 15    * in a way that accessing and writing private fields becomes possible without the need to
 16    * leverage on <code>setter</code> methods.
 17    *
 18    * @author Francesco Russo (frusso@dev.java.net)
 19    * @since 4.0
 20    * @version 3.1
 21    */
 22    public class BeanUtilsExtension {
 23   
 24    /**
 25    * This method sets over the <code>bean</code> instance's property identified by
 26    * <code>name</code>, the provided value <code>value</code>.<br>
 27    * First of all the method tries find the property amongst those defined by the
 28    * class or by its super-class and tries to set it directly (even if the property
 29    * is not <code>public</code>).<br>
 30    * Should this not work, a <code>public</code> setter is searched for and used.
 31    * This method might throw a <code>ParameterException</code> should it be unpossible
 32    * accessing the property.
 33    *
 34    * @param bean The target bean
 35    * @param name The target bean's property
 36    * @param value The value to be set
 37    */
 38  10158 public static void setProperty(Object bean, String name, Object value) {
 39  10158 try {
 40  10158 setField(bean,name,value);
 41    } catch(ParameterException pe) {
 42  0 try {
 43  0 BeanUtils.setProperty(bean,name,value);
 44    } catch (Throwable t) {
 45  0 System.err.println(t);
 46  0 logger.warn(errorMsg,t);
 47  0 throw new ParameterException(errorMsg,t,bean,name,value);
 48    }
 49    }
 50    }
 51   
 52  10158 private static void setField(Object bean, String name, Object value) {
 53  10158 Field field = null;
 54  10158 Class clazz = bean.getClass();
 55  10158 try {
 56  10158 field = clazz.getDeclaredField(name);
 57    } catch(NoSuchFieldException e) {
 58  0 Class ancestor = clazz.getSuperclass();
 59    // deep-search
 60  0 while(field==null && ancestor!=null) {
 61  0 try {
 62  0 field = ancestor.getDeclaredField(name);
 63    } catch(NoSuchFieldException e1) {
 64  0 ancestor = ancestor.getSuperclass();
 65    }
 66    }
 67    }
 68    // have we found the result?
 69  10158 if(field!=null) {
 70  10158 try {
 71  10158 injectValue(field,bean,value);
 72    } catch(IllegalAccessException e) {
 73  0 ParameterException pe = new ParameterException("Property-setting error.",e,bean,name,value);
 74  0 logger.warn(pe);
 75  0 System.err.println(pe);
 76    }
 77    } else {
 78  0 ParameterException pe = new ParameterException("Property-setting error.",null,bean,name,value);
 79  0 logger.warn(pe);
 80  0 System.err.println(pe);
 81    }
 82    }
 83   
 84  10158 private static void injectValue(Field f, Object bean, Object value) throws IllegalAccessException {
 85  10158 f.setAccessible(true);
 86  10158 Class type = f.getType();
 87  10158 if(type.isPrimitive()) {
 88  68 String val = (String)value;
 89  68 if(Boolean.TYPE.equals(type))
 90  0 f.set(bean,Boolean.valueOf(val));
 91    else
 92  68 if(Integer.TYPE.equals(type))
 93  28 f.set(bean,Integer.valueOf(val));
 94    else
 95  40 if(Long.TYPE.equals(type))
 96  0 f.set(bean,Long.valueOf(val));
 97    else
 98  40 if(Double.TYPE.equals(type))
 99  40 f.set(bean,Double.valueOf(val));
 100    else
 101  0 if(Float.TYPE.equals(type))
 102  0 f.set(bean,Float.valueOf(val));
 103    else
 104  0 if(Short.TYPE.equals(type))
 105  0 f.set(bean,Short.valueOf(val));
 106    else
 107  0 if(Byte.TYPE.equals(type))
 108  0 f.set(bean,Byte.valueOf(val));
 109    } else {
 110  10090 if(type.isAssignableFrom(Integer.class))
 111  0 value = Integer.valueOf((String) value);
 112    else
 113  10090 if(type.isAssignableFrom(Long.class))
 114  0 value = Long.valueOf((String)value);
 115    else
 116  10090 if(type.isAssignableFrom(Double.class))
 117  0 value = Double.valueOf((String)value);
 118    else
 119  10089 if(type.isAssignableFrom(Float.class))
 120  0 value = Float.valueOf((String)value);
 121    else
 122  10090 if(type.isAssignableFrom(Short.class))
 123  0 value = Short.valueOf((String)value);
 124    else
 125  10090 if(type.isAssignableFrom(Byte.class))
 126  0 value = Byte.valueOf((String)value);
 127    else
 128  10090 if(type.isAssignableFrom(Boolean.class))
 129  0 value = Boolean.valueOf((String)value);
 130  10090 f.set(bean,value);
 131    }
 132    }
 133   
 134    private static String errorMsg = "Unable to inject configuration property."+
 135    "\nPlease, heck if the property declared in the jtr.xml file is actually present in "+
 136    "the enclosing runner or in any of its super-classes.";
 137    private static Logger logger = Logger.getLogger(BeanUtilsExtension.class);
 138    }