net.sf.jasperreports.properties.PropertiesMetadataUtil Maven / Gradle / Ivy
/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2016 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.properties;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import net.sf.jasperreports.annotations.properties.PropertyScope;
import net.sf.jasperreports.components.table.Cell;
import net.sf.jasperreports.crosstabs.JRCellContents;
import net.sf.jasperreports.crosstabs.JRCrosstab;
import net.sf.jasperreports.data.DataAdapter;
import net.sf.jasperreports.data.DataAdapterService;
import net.sf.jasperreports.data.DataAdapterServiceUtil;
import net.sf.jasperreports.data.DataFile;
import net.sf.jasperreports.data.DataFileServiceFactory;
import net.sf.jasperreports.data.FileDataAdapter;
import net.sf.jasperreports.engine.JRBand;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRComponentElement;
import net.sf.jasperreports.engine.JRDataset;
import net.sf.jasperreports.engine.JRElement;
import net.sf.jasperreports.engine.JRElementGroup;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRFrame;
import net.sf.jasperreports.engine.JRImage;
import net.sf.jasperreports.engine.JRReport;
import net.sf.jasperreports.engine.JRSubreport;
import net.sf.jasperreports.engine.JRTextElement;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.ParameterContributorContext;
import net.sf.jasperreports.engine.component.ComponentKey;
import net.sf.jasperreports.engine.query.QueryExecuterFactory;
import net.sf.jasperreports.engine.util.Designated;
import net.sf.jasperreports.engine.util.Designator;
import net.sf.jasperreports.engine.util.JRQueryExecuterUtils;
/**
*
* @author Lucian Chirita ([email protected])
*/
public class PropertiesMetadataUtil
{
public static PropertiesMetadataUtil getInstance(JasperReportsContext context)
{
return new PropertiesMetadataUtil(context, Locale.getDefault());
}
public static PropertiesMetadataUtil getInstance(JasperReportsContext context, Locale locale)
{
return new PropertiesMetadataUtil(context, locale);
}
private JasperReportsContext context;
private Locale locale;
private volatile Map loadedProperties;
protected PropertiesMetadataUtil(JasperReportsContext context, Locale locale)
{
this.context = context;
this.locale = locale;
}
protected Collection allProperties()
{
Map allProperties = loadedProperties;
if (allProperties == null)
{
loadedProperties = allProperties = ResourcePropertiesMetadataReader.instance().readProperties(context, locale);
}
return allProperties.values();
}
public List getProperties()
{
Collection allProperties = allProperties();
return new ArrayList<>(allProperties);
}
public List getQueryExecuterFieldProperties(String queryLanguage) throws JRException
{
String qualification = queryExecuterQualification(queryLanguage);
if (qualification == null)
{
return Collections.emptyList();
}
List properties = filterQualifiedProperties(PropertyScope.FIELD, qualification);
return properties;
}
protected String queryExecuterQualification(String queryLanguage) throws JRException
{
QueryExecuterFactory queryExecuterFactory = JRQueryExecuterUtils.getInstance(context).getExecuterFactory(queryLanguage);
if (!(queryExecuterFactory instanceof Designated))
{
return null;
}
String queryExecuterName = ((Designated) queryExecuterFactory).getDesignation();
return queryExecuterName;
}
protected List filterQualifiedProperties(PropertyScope primaryScope, String qualificationName)
{
List properties = new ArrayList<>();
Collection allProperties = allProperties();
for (PropertyMetadata property : allProperties)
{
if (property.getScopes().contains(primaryScope)
&& property.getScopeQualifications().contains(qualificationName))
{
properties.add(property);
}
}
return properties;
}
public List getParameterProperties(DataAdapter dataAdapter)
{
String qualification = dataFileQualification(dataAdapter);
if (qualification == null)
{
return Collections.emptyList();
}
List properties = filterQualifiedProperties(PropertyScope.PARAMETER, qualification);
return properties;
}
@SuppressWarnings("unchecked")
protected String dataFileQualification(DataAdapter dataAdapter)
{
if (!(dataAdapter instanceof FileDataAdapter))
{
return null;
}
DataFile dataFile = ((FileDataAdapter) dataAdapter).getDataFile();
String name = null;
List factories = context.getExtensions(DataFileServiceFactory.class);
if (factories != null)
{
for (DataFileServiceFactory factory : factories)
{
if (factory instanceof Designator)
{
name = ((Designator) factory).getName(dataFile);
if (name != null)
{
break;
}
}
}
}
return name;
}
public List getElementProperties(JRElement element)
{
Collection allProperties = allProperties();
List elementProperties = new ArrayList();
for (PropertyMetadata propertyMetadata : allProperties)
{
if (inScope(propertyMetadata, element))
{
elementProperties.add(propertyMetadata);
}
}
return elementProperties;
}
protected boolean inScope(PropertyMetadata property, JRElement element)
{
List scopes = property.getScopes();
if (scopes.contains(PropertyScope.ELEMENT))
{
return true;
}
if (element instanceof JRTextElement && scopes.contains(PropertyScope.TEXT_ELEMENT))
{
return true;
}
if (element instanceof JRImage && scopes.contains(PropertyScope.IMAGE_ELEMENT))
{
return true;
}
if (element instanceof JRChart && scopes.contains(PropertyScope.CHART_ELEMENT))
{
return true;
}
if (element instanceof JRCrosstab && scopes.contains(PropertyScope.CROSSTAB))
{
return true;
}
if (element instanceof JRFrame && scopes.contains(PropertyScope.FRAME))
{
return true;
}
if (element instanceof JRSubreport && scopes.contains(PropertyScope.SUBREPORT))
{
return true;
}
//TODO lucianc generic element
if (element instanceof JRComponentElement && scopes.contains(PropertyScope.COMPONENT))
{
List qualifications = property.getScopeQualifications();
if (qualifications == null || qualifications.isEmpty())
{
//assuming all components
return true;
}
JRComponentElement componentElement = (JRComponentElement) element;
String qualification;
if (componentElement.getComponent() instanceof Designated)
{
qualification = ((Designated) componentElement.getComponent()).getDesignation();
}
else
{
ComponentKey key = componentElement.getComponentKey();
if (key == null || key.getNamespace() == null || key.getName() == null)
{
//key is missing
qualification = null;
}
else
{
qualification = key.getNamespace()
+ PropertyConstants.COMPONENT_KEY_QUALIFICATION_SEPARATOR
+ key.getName();
}
}
return qualification != null && qualifications.contains(qualification);
}
return false;
}
public List getReportProperties(JRReport report)
{
Collection allProperties = allProperties();
List reportProperties = new ArrayList();
for (PropertyMetadata propertyMetadata : allProperties)
{
List scopes = propertyMetadata.getScopes();
if (scopes != null && scopes.contains(PropertyScope.REPORT))
{
reportProperties.add(propertyMetadata);
}
}
return reportProperties;
}
protected String dataAdapterQualification(JRDataset dataset, DataAdapter dataAdapter)
{
ParameterContributorContext contributorContext = new ParameterContributorContext(context,
dataset, Collections.emptyMap());
DataAdapterServiceUtil serviceUtil = DataAdapterServiceUtil.getInstance(contributorContext);
DataAdapterService service = serviceUtil.getService(dataAdapter);
return service instanceof Designated ? ((Designated) service).getDesignation() : null;
}
public List getDatasetProperties(JRDataset dataset, DataAdapter dataAdapter) throws JRException
{
String queryLanguage = dataset.getQuery() == null ? null : dataset.getQuery().getLanguage();
String queryQualification = queryLanguage == null ? null : queryExecuterQualification(queryLanguage);
String dataAdapterQualification = dataAdapter == null ? null : dataAdapterQualification(dataset, dataAdapter);
String dataFileQualification = dataAdapter == null ? null : dataFileQualification(dataAdapter);
Collection allProperties = allProperties();
List reportProperties = new ArrayList();
for (PropertyMetadata propertyMetadata : allProperties)
{
List scopes = propertyMetadata.getScopes();
if (scopes != null && scopes.contains(PropertyScope.DATASET))
{
boolean matches;
List qualifications = propertyMetadata.getScopeQualifications();
if (qualifications == null || qualifications.isEmpty())
{
matches = true;
}
else
{
matches = queryQualification != null && qualifications.contains(queryQualification)
|| dataAdapterQualification != null && qualifications.contains(dataAdapterQualification)
|| dataFileQualification != null && qualifications.contains(dataFileQualification);
}
if (matches)
{
reportProperties.add(propertyMetadata);
}
}
}
return reportProperties;
}
public List getContainerProperties(JRElementGroup container)
{
Collection allProperties = allProperties();
List containerProperties = new ArrayList();
for (PropertyMetadata propertyMetadata : allProperties)
{
if (inScope(propertyMetadata, container))
{
containerProperties.add(propertyMetadata);
}
}
return containerProperties;
}
protected boolean inScope(PropertyMetadata propertyMetadata, JRElementGroup container)
{
if (container instanceof JRFrame)
{
return inScope(propertyMetadata, (JRElement) container);
}
List scopes = propertyMetadata.getScopes();
if (container instanceof JRBand)
{
return scopes.contains(PropertyScope.BAND);
}
if (container instanceof Cell)
{
return scopes.contains(PropertyScope.TABLE_CELL);
}
if (container instanceof JRCellContents)
{
return scopes.contains(PropertyScope.CROSSTAB_CELL);
}
return false;
}
}