org.pentaho.reporting.engine.classic.core.states.datarow.ProcessingDataSchemaCompiler.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.reporting.engine.classic.core.states.datarow.ProcessingDataSchemaCompiler.java

Source

/*
 * 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, Hitachi Vantara 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;
    }
}