1 32 33 package it.businesslogic.ireport.connection; 34 35 36 import java.util.*; 37 38 39 44 public class JRExtendedBeanDataSource implements net.sf.jasperreports.engine.JRDataSource { 45 46 private Object [] beans = null; 47 private int index = -1; 48 49 public JRExtendedBeanDataSource(Vector beans) 50 { 51 this.beans = beans.toArray(); 52 } 53 54 public JRExtendedBeanDataSource(Object [] beans) 55 { 56 this.beans = beans; 57 } 58 59 public Object getFieldValue(net.sf.jasperreports.engine.JRField jRField) throws net.sf.jasperreports.engine.JRException { 60 61 String path = jRField.getDescription(); 62 63 Object val = getPathValue(beans[index], path); 64 65 if (val == null) return null; 66 if (val.getClass().isAssignableFrom( jRField.getValueClass() )) return val; 67 return null; 68 69 } 70 71 public boolean next() throws net.sf.jasperreports.engine.JRException { 72 73 index++; 74 if (index >= beans.length) return false; 75 return true; 76 } 77 78 79 private Object getPathValue(Object bean, String path) 80 { 81 System.out.println("Looking for " + path + " in " + bean); 82 83 if (path == null || bean == null || path.trim().length() == 0) 84 { 85 return bean; 86 } 87 if (path.startsWith(".")) path = path.substring(1); 88 if (path.trim().length() == 0) return bean; 89 90 path = path.trim(); 91 String attr_name = getNextNodeName(path ); 92 93 94 129 Class clazz = null; 130 try { 131 clazz = org.apache.commons.beanutils.PropertyUtils.getPropertyType(bean,attr_name); 132 } catch (Exception ex){ return null; } 133 134 if (clazz == null) { 136 return null; 137 } 138 else if ( clazz.isArray() ) 139 { 140 try { 141 return new JRExtendedBeanDataSource( (Object [])org.apache.commons.beanutils.PropertyUtils.getProperty(bean, attr_name) ); 142 } catch (Exception ex){ return null; } 143 } 144 else 145 { 146 if (path.equals(attr_name)) 147 { 148 try { 149 return org.apache.commons.beanutils.PropertyUtils.getProperty(bean, attr_name); 150 } catch (Exception ex){ return null; } 151 } 152 else 153 { 154 Object child_bean = null; 155 try { 156 child_bean = org.apache.commons.beanutils.PropertyUtils.getProperty(bean, attr_name); 157 } catch (Exception ex){ return null; } 158 path = path.substring(attr_name.length()); 159 return getPathValue(child_bean, path ); 160 } 161 } 162 } 163 164 private static String getNextNodeName( String path) 165 { 166 167 if (path == null || path.length() ==0) return ""; 168 if (path.startsWith(".")) path = path.substring(1); 169 170 String childToTake = path; 171 if (path.indexOf(".") >= 0) 172 { 173 childToTake = path.substring(0,path.indexOf(".")); 174 } 175 176 return childToTake; 177 } 178 } 179 | Popular Tags |