All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.jasperreports.engine.data.JRAbstractBeanDataSource Maven / Gradle / Ivy

There is a newer version: 6.21.3
Show newest version
/*
 * JasperReports - Free Java Reporting Library.
 * Copyright (C) 2001 - 2022 TIBCO Software Inc. 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 .
 */
package net.sf.jasperreports.engine.data;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.NestedNullException;
import org.apache.commons.beanutils.PropertyUtils;

import net.sf.jasperreports.annotations.properties.Property;
import net.sf.jasperreports.annotations.properties.PropertyScope;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
import net.sf.jasperreports.engine.JRPropertiesUtil;
import net.sf.jasperreports.engine.JRRewindableDataSource;
import net.sf.jasperreports.engine.query.JRHibernateQueryExecuterFactory;
import net.sf.jasperreports.engine.query.JRJpaQueryExecuterFactory;
import net.sf.jasperreports.properties.PropertyConstants;


/**
 * @author Teodor Danciu ([email protected])
 */
public abstract class JRAbstractBeanDataSource implements JRRewindableDataSource
{
	
	public static final String EXCEPTION_MESSAGE_KEY_BEAN_FIELD_VALUE_NOT_RETRIEVED = "data.bean.field.value.not.retrieved";

	/**
	 * Property specifying the JavaBean property name for the dataset field.
	 */
	@Property (
			category = PropertyConstants.CATEGORY_DATA_SOURCE,
			scopes = {PropertyScope.FIELD},
			scopeQualifications = {JRHibernateQueryExecuterFactory.QUERY_EXECUTER_NAME, 
					JRJpaQueryExecuterFactory.QUERY_EXECUTER_NAME},
			sinceVersion = PropertyConstants.VERSION_6_3_1
	)
	public static final String PROPERTY_JAVABEAN_FIELD_PROPERTY = JRPropertiesUtil.PROPERTY_PREFIX + "javabean.field.property";
	
	/**
	 * Field mapping that produces the current bean.
	 * 

* If the field name/description matches this constant (the case is important), * the data source will return the current bean as the field value. */ public static final String CURRENT_BEAN_MAPPING = "_THIS"; /** * */ protected PropertyNameProvider propertyNameProvider; protected static class DefaultPropertyNameProvider implements PropertyNameProvider { private boolean isUseFieldDescription; private Map fieldPropertyNames = new HashMap<>(); public DefaultPropertyNameProvider(boolean isUseFieldDescription) { this.isUseFieldDescription = isUseFieldDescription; } @Override public String getPropertyName(JRField field) { String fieldPropertyName = null; if (fieldPropertyNames.containsKey(field.getName())) { fieldPropertyName = fieldPropertyNames.get(field.getName()); } else { if (field.hasProperties()) { fieldPropertyName = field.getPropertiesMap().getProperty(PROPERTY_JAVABEAN_FIELD_PROPERTY); } if (fieldPropertyName == null) { if (isUseFieldDescription && field.getDescription() != null) { fieldPropertyName = field.getDescription(); } else { fieldPropertyName = field.getName(); } } fieldPropertyNames.put(field.getName(), fieldPropertyName); } return fieldPropertyName; } } /** * */ public JRAbstractBeanDataSource(boolean isUseFieldDescription) { propertyNameProvider = new DefaultPropertyNameProvider(isUseFieldDescription); } /** * */ interface PropertyNameProvider { public String getPropertyName(JRField field); } protected Object getFieldValue(Object bean, JRField field) throws JRException { return getBeanProperty(bean, getPropertyName(field)); } protected static Object getBeanProperty(Object bean, String propertyName) throws JRException { Object value = null; if (isCurrentBeanMapping(propertyName)) { value = bean; } else if (bean != null) { try { value = PropertyUtils.getProperty(bean, propertyName); } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { throw new JRException( EXCEPTION_MESSAGE_KEY_BEAN_FIELD_VALUE_NOT_RETRIEVED, new Object[]{propertyName}, e); } catch (NestedNullException e) { // deliberately to be ignored } } return value; } protected static boolean isCurrentBeanMapping(String propertyName) { return CURRENT_BEAN_MAPPING.equals(propertyName); } protected String getPropertyName(JRField field) { return propertyNameProvider.getPropertyName(field); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy