/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.states.datarow;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.reporting.engine.classic.core.MetaAttributeNames;
import org.pentaho.reporting.engine.classic.core.MetaTableModel;
import org.pentaho.reporting.engine.classic.core.ParameterDataRow;
import org.pentaho.reporting.engine.classic.core.ReportDataFactoryException;
import org.pentaho.reporting.engine.classic.core.ReportEnvironment;
import org.pentaho.reporting.engine.classic.core.function.Expression;
import org.pentaho.reporting.engine.classic.core.wizard.DataAttributeContext;
import org.pentaho.reporting.engine.classic.core.wizard.DataAttributes;
import org.pentaho.reporting.engine.classic.core.wizard.DataSchema;
import org.pentaho.reporting.engine.classic.core.wizard.DataSchemaCompiler;
import org.pentaho.reporting.engine.classic.core.wizard.DataSchemaDefinition;
import org.pentaho.reporting.engine.classic.core.wizard.DefaultDataAttributes;
import org.pentaho.reporting.engine.classic.core.wizard.DefaultDataSchema;
import org.pentaho.reporting.engine.classic.core.wizard.DirectFieldSelectorRule;
import org.pentaho.reporting.engine.classic.core.wizard.EmptyDataAttributes;
import org.pentaho.reporting.engine.classic.core.wizard.MetaSelectorRule;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;
import javax.swing.table.TableModel;
public class ProcessingDataSchemaCompiler extends DataSchemaCompiler {
private static final Log logger = LogFactory.getLog( ProcessingDataSchemaCompiler.class );
private ResourceManager resourceManager;
private DataSchemaDefinition globalDefaults;
public ProcessingDataSchemaCompiler( final DataSchemaDefinition reportSchemaDefinition,
final DataAttributeContext context, final ResourceManager resourceManager,
final DataSchemaDefinition globalDefaults ) {
super( reportSchemaDefinition, context, resourceManager );
this.resourceManager = resourceManager;
this.globalDefaults = globalDefaults;
}
protected DataSchemaDefinition parseGlobalDefaults( final ResourceManager resourceManager ) {
if ( globalDefaults == null ) {
globalDefaults = super.parseGlobalDefaults( resourceManager );
}
return globalDefaults;
}
public DataSchemaDefinition getGlobalDefaults() {
return globalDefaults;
}
public DataSchema compile( final MasterDataRow masterRow, final ReportEnvironment reportEnvironment )
throws ReportDataFactoryException {
if ( masterRow == null ) {
throw new NullPointerException();
}
if ( isInitialized() == false ) {
init();
}
final DefaultDataAttributes globalAttributes = getGlobalAttributes();
final MetaSelectorRule[] indirectRules = getIndirectRules();
final DirectFieldSelectorRule[] directRules = getDirectRules();
final DataAttributeContext context = getContext();
final ParameterDataRow parameters = masterRow.getParameterDataRow();
final ExpressionDataRow expressionsRow = masterRow.getExpressionDataRow();
final ReportDataRow massDataRow = masterRow.getReportDataRow();
// imported data has been compiled in the subreport ...
final ImportedVariablesDataRow importedDataRow = masterRow.getImportedDataRow();
final DefaultDataSchema defaultDataSchema = new DefaultDataSchema();
if ( parameters != null ) {
final MasterDataRow parentRow = masterRow.getParentDataRow();
if ( parentRow == null ) {
processParameters( parameters, null, reportEnvironment, globalAttributes, indirectRules, directRules,
defaultDataSchema );
} else {
// import the parameters that have been computed already ..
final String[] parameterNames = parameters.getParentNames();
final String[] innerNames = parameters.getColumnNames();
for ( int i = 0; i < parameterNames.length; i++ ) {
final String name = parameterNames[i];
final DataAttributes attributes = parentRow.getDataSchema().getAttributes( name );
defaultDataSchema.setAttributes( innerNames[i], attributes );
}
}
}
// expressions
final Expression[] expressions = expressionsRow.getExpressions();
for ( int i = 0; i < expressions.length; i++ ) {
final Expression expression = expressions[i];
final String name = expression.getName();
if ( name == null ) {
continue;
}
final DefaultDataAttributes computedParameterDataAttributes = new DefaultDataAttributes();
computedParameterDataAttributes.merge( globalAttributes, context );
computedParameterDataAttributes.merge( new ExpressionsDataAttributes( expression ), context );
applyRules( indirectRules, directRules, computedParameterDataAttributes );
defaultDataSchema.setAttributes( name, computedParameterDataAttributes );
}
// massdata
if ( massDataRow != null ) {
final GenericDataAttributes parameterDataAttributes = getTableDataAttributes();
final TableModel data = massDataRow.getReportData();
if ( data instanceof MetaTableModel == false ) {
final int count = data.getColumnCount();
for ( int i = 0; i < count; i++ ) {
final String colName = data.getColumnName( i );
parameterDataAttributes.setup( colName, data.getColumnClass( i ), MetaAttributeNames.Core.SOURCE_VALUE_TABLE,
colName, globalAttributes );
final DefaultDataAttributes computedParameterDataAttributes = new DefaultDataAttributes();
computedParameterDataAttributes.merge( parameterDataAttributes, context );
applyRules( indirectRules, directRules, computedParameterDataAttributes );
defaultDataSchema.setAttributes( colName, computedParameterDataAttributes );
}
} else {
final MetaTableModel mt = (MetaTableModel) data;
final DefaultDataAttributes tableGlobalAttributes = new DefaultDataAttributes();
tableGlobalAttributes.merge( globalAttributes, context );
tableGlobalAttributes.merge( mt.getTableAttributes(), context );
try {
defaultDataSchema.setTableAttributes( tableGlobalAttributes );
} catch ( CloneNotSupportedException e ) {
logger.warn( "Unable to copy global data-attributes", e );
}
final int count = data.getColumnCount();
for ( int i = 0; i < count; i++ ) {
final String colName = data.getColumnName( i );
final DefaultDataAttributes computedParameterDataAttributes = new DefaultDataAttributes();
computedParameterDataAttributes.merge( tableGlobalAttributes, context );
computedParameterDataAttributes.merge( mt.getColumnAttributes( i ), context );
parameterDataAttributes.setup( colName, data.getColumnClass( i ), MetaAttributeNames.Core.SOURCE_VALUE_TABLE,
null, EmptyDataAttributes.INSTANCE );
computedParameterDataAttributes.merge( parameterDataAttributes, context );
applyRules( indirectRules, directRules, computedParameterDataAttributes );
defaultDataSchema.setAttributes( colName, computedParameterDataAttributes );
}
}
}
// imported values ...
if ( importedDataRow != null ) {
final String[] columnNames = importedDataRow.getColumnNames();
for ( int i = 0; i < columnNames.length; i++ ) {
final String columnName = columnNames[i];
defaultDataSchema.setAttributes( columnName, importedDataRow.getAttributes( columnName ) );
}
}
return defaultDataSchema;
}
public ResourceManager getResourceManager() {
return resourceManager;
}
}