/* * JasperReports - Free Java Reporting Library. * Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved. * http://www.jaspersoft.com * * Unless you have purchased a commercial license agreement from Jaspersoft, * the following license terms apply: * * This program is part of JasperReports. * * JasperReports is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JasperReports is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with JasperReports. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.jasperreports.engine.data; import java.beans.BeanInfo; import java.beans.IndexedPropertyDescriptor; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.util.ArrayList; import net.sf.jasperreports.engine.JRDataSourceProvider; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRField; import net.sf.jasperreports.engine.JRRuntimeException; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.design.JRDesignField; /** * The base implementation for JRBeanXXXDataSource providers. It provides a common * implementation for bean properties introspection. * * @author Peter Severin (peter_s@sourceforge.net, contact@jasperassistant.com) * @version $Id: JRAbstractBeanDataSourceProvider.java 3716 2010-04-08 19:57:14Z teodord $ */ public abstract class JRAbstractBeanDataSourceProvider implements JRDataSourceProvider { /** The introspected bean class */ private Class beanClass; /** * Creates the provider. Superclasses must pass a valid class that will be * used to introspect the available bean fields. * @param beanClass the bean class to be introspected. */ public JRAbstractBeanDataSourceProvider(Class beanClass) { if (beanClass == null) { throw new JRRuntimeException("beanClass must not be null"); } this.beanClass = beanClass; } /** * @see net.sf.jasperreports.engine.JRDataSourceProvider#supportsGetFieldsOperation() */ public boolean supportsGetFieldsOperation() { return true; } /** * @see net.sf.jasperreports.engine.JRDataSourceProvider#getFields(net.sf.jasperreports.engine.JasperReport) */ public JRField[] getFields(JasperReport report) throws JRException { BeanInfo beanInfo = null; try { beanInfo = Introspector.getBeanInfo(beanClass); } catch (IntrospectionException e) { throw new JRException(e); } PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); if(descriptors != null) { ArrayList fields = new ArrayList(descriptors.length); for (int i = 0; i < descriptors.length; i++) { PropertyDescriptor descriptor = descriptors[i]; if (!(descriptor instanceof IndexedPropertyDescriptor) && descriptor.getReadMethod() != null) { JRDesignField field = new JRDesignField(); field.setValueClassName(normalizeClass(descriptor.getPropertyType()).getName()); field.setName(descriptor.getName()); fields.add(field); } } return (JRField[]) fields.toArray(new JRField[fields.size()]); } return new JRField[0]; } /** * Converts a primitive class to its object counterpart */ private static Class normalizeClass(Class clazz) { if(clazz.isPrimitive()) { if(clazz == boolean.class) { return Boolean.class; } if(clazz == byte.class) { return Byte.class; } if(clazz == char.class) { return Character.class; } if(clazz == short.class) { return Short.class; } if(clazz == int.class) { return Integer.class; } if(clazz == long.class) { return Long.class; } if(clazz == float.class) { return Float.class; } if(clazz == double.class) { return Double.class; } } return clazz; } }