001: /*
002: * ============================================================================
003: * GNU Lesser General Public License
004: * ============================================================================
005: *
006: * JasperReports - Free Java report-generating library.
007: * Copyright (C) 2001-2006 JasperSoft Corporation http://www.jaspersoft.com
008: *
009: * This library is free software; you can redistribute it and/or
010: * modify it under the terms of the GNU Lesser General Public
011: * License as published by the Free Software Foundation; either
012: * version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: * Lesser General Public License for more details.
018: *
019: * You should have received a copy of the GNU Lesser General Public
020: * License along with this library; if not, write to the Free Software
021: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
022: *
023: * JasperSoft Corporation
024: * 303 Second Street, Suite 450 North
025: * San Francisco, CA 94107
026: * http://www.jaspersoft.com
027: */
028: package net.sf.jasperreports.engine.data;
029:
030: import org.apache.commons.beanutils.PropertyUtils;
031:
032: import net.sf.jasperreports.engine.JRException;
033: import net.sf.jasperreports.engine.JRField;
034: import net.sf.jasperreports.engine.JRRewindableDataSource;
035:
036: /**
037: * @author Teodor Danciu (teodord@users.sourceforge.net)
038: * @version $Id: JRAbstractBeanDataSource.java 1772 2007-06-26 08:31:29Z lucianc $
039: */
040: public abstract class JRAbstractBeanDataSource implements
041: JRRewindableDataSource {
042:
043: /**
044: * Field mapping that produces the current bean.
045: * <p/>
046: * If the field name/description matches this constant (the case is important),
047: * the data source will return the current bean as the field value.
048: */
049: public static final String CURRENT_BEAN_MAPPING = "_THIS";
050:
051: /**
052: *
053: */
054: protected PropertyNameProvider propertyNameProvider = null;
055:
056: protected static final PropertyNameProvider FIELD_NAME_PROPERTY_NAME_PROVIDER = new PropertyNameProvider() {
057: public String getPropertyName(JRField field) {
058: return field.getName();
059: }
060: };
061:
062: protected static final PropertyNameProvider FIELD_DESCRIPTION_PROPERTY_NAME_PROVIDER = new PropertyNameProvider() {
063: public String getPropertyName(JRField field) {
064: if (field.getDescription() == null) {
065: return field.getName();
066: }
067: return field.getDescription();
068: }
069: };
070:
071: /**
072: *
073: */
074: public JRAbstractBeanDataSource(boolean isUseFieldDescription) {
075: propertyNameProvider = isUseFieldDescription ? FIELD_DESCRIPTION_PROPERTY_NAME_PROVIDER
076: : FIELD_NAME_PROPERTY_NAME_PROVIDER;
077: }
078:
079: /**
080: *
081: */
082: interface PropertyNameProvider {
083: public String getPropertyName(JRField field);
084: }
085:
086: protected Object getFieldValue(Object bean, JRField field)
087: throws JRException {
088: return getBeanProperty(bean, getPropertyName(field));
089: }
090:
091: protected static Object getBeanProperty(Object bean,
092: String propertyName) throws JRException {
093: Object value = null;
094:
095: if (isCurrentBeanMapping(propertyName)) {
096: value = bean;
097: } else if (bean != null) {
098: try {
099: value = PropertyUtils.getProperty(bean, propertyName);
100: } catch (java.lang.IllegalAccessException e) {
101: throw new JRException(
102: "Error retrieving field value from bean : "
103: + propertyName, e);
104: } catch (java.lang.reflect.InvocationTargetException e) {
105: throw new JRException(
106: "Error retrieving field value from bean : "
107: + propertyName, e);
108: } catch (java.lang.NoSuchMethodException e) {
109: throw new JRException(
110: "Error retrieving field value from bean : "
111: + propertyName, e);
112: } catch (IllegalArgumentException e) {
113: //FIXME replace with NestedNullException when upgrading to BeanUtils 1.7
114: if (!e.getMessage().startsWith(
115: "Null property value for ")) {
116: throw e;
117: }
118: }
119: }
120:
121: return value;
122: }
123:
124: protected static boolean isCurrentBeanMapping(String propertyName) {
125: return CURRENT_BEAN_MAPPING.equals(propertyName);
126: }
127:
128: protected String getPropertyName(JRField field) {
129: return propertyNameProvider.getPropertyName(field);
130: }
131: }
|