Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2019 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.analytics.dataset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Map.Entry;
import net.sf.jasperreports.crosstabs.fill.calculation.BucketDefinition;
import net.sf.jasperreports.crosstabs.fill.calculation.BucketDefinition.Bucket;
import net.sf.jasperreports.crosstabs.fill.calculation.BucketingService;
import net.sf.jasperreports.crosstabs.fill.calculation.BucketingService.BucketMap;
import net.sf.jasperreports.crosstabs.fill.calculation.BucketingServiceContext;
import net.sf.jasperreports.crosstabs.fill.calculation.MeasureDefinition;
import net.sf.jasperreports.crosstabs.fill.calculation.MeasureDefinition.MeasureValue;
import net.sf.jasperreports.crosstabs.type.CrosstabTotalPositionEnum;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.analytics.data.Axis;
import net.sf.jasperreports.engine.analytics.data.AxisLevel;
import net.sf.jasperreports.engine.analytics.data.AxisLevel.Type;
import net.sf.jasperreports.engine.analytics.data.AxisLevelNode;
import net.sf.jasperreports.engine.analytics.data.MappedPropertyValues;
import net.sf.jasperreports.engine.analytics.data.Measure;
import net.sf.jasperreports.engine.analytics.data.MultiAxisDataSource;
import net.sf.jasperreports.engine.analytics.data.PropertyValues;
import net.sf.jasperreports.engine.analytics.data.StandardAxisLevel;
import net.sf.jasperreports.engine.analytics.data.StandardMeasure;
import net.sf.jasperreports.engine.analytics.data.StandardMeasureValue;
import net.sf.jasperreports.engine.fill.JRCalculator;
import net.sf.jasperreports.engine.fill.JRDefaultIncrementerFactory;
import net.sf.jasperreports.engine.fill.JRExpressionEvalException;
import net.sf.jasperreports.engine.fill.JRExtendedIncrementerFactory;
import net.sf.jasperreports.engine.fill.JRFillExpressionEvaluator;
import net.sf.jasperreports.engine.fill.JRIncrementerFactoryCache;
import net.sf.jasperreports.engine.util.SingleValue;
import net.sf.jasperreports.engine.util.ValuePropertiesWrapper;
import net.sf.jasperreports.engine.util.ValuePropertiesWrapperComparator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Lucian Chirita ([email protected])
*/
public class MultiAxisDataService
{
protected static final Log log = LogFactory.getLog(MultiAxisDataService.class);
public static final String EXCEPTION_MESSAGE_KEY_INCREMENT_BIDIMENSIONAL_DATASET_ERROR = "engine.analytics.dataset.increment.bidimensional.dataset.error";
private final BucketingServiceContext serviceContext;
private final MultiAxisData data;
private final MultiAxisBucketingService bucketingService;
private final Map> axisLevelBucketPropertyIndexes =
new HashMap>();
private final List> axisLevels;
private final Bucket[] axisRoots;
private final List measures;
private final Object[] bucketValues;
private final Object[] measureValues;
public MultiAxisDataService(JasperReportsContext jasperReportsContext,
JRFillExpressionEvaluator expressionEvaluator,
MultiAxisData data, byte evaluation) throws JRException
{
this.serviceContext = new ServiceContext(jasperReportsContext, expressionEvaluator);
this.data = data;
if (log.isDebugEnabled())
{
log.debug("creating multi axis data service for " + data);
}
this.axisLevels = new ArrayList>(Axis.axisCount());
this.axisLevels.addAll(Collections.>nCopies(Axis.axisCount(), null));
List> axisBuckets = new ArrayList>(Axis.axisCount());
axisBuckets.addAll(Collections.>nCopies(Axis.axisCount(), null));
this.axisRoots = new Bucket[Axis.axisCount()];
for (Axis axis : Axis.values())
{
DataAxis dataAxis = data.getDataAxis(axis);
List dataLevels = dataAxis == null ? Collections.emptyList()
: dataAxis.getLevels();
int levelCount = axisLevels.size();
List levels = new ArrayList(levelCount + 1);
levels.add(createRootLevel(axis));
List buckets = new ArrayList(levelCount + 1);
BucketDefinition rowRootBucket = createRootBucket();
buckets.add(rowRootBucket);
axisRoots[axis.ordinal()] = rowRootBucket.create(SingleValue.VALUE);
for (DataAxisLevel dataLevel : dataLevels)
{
// create the data source level
AxisLevel level = createLevel(axis, dataLevel, evaluation, levels.size());
levels.add(level);
// create the bucket
buckets.add(createServiceBucket(dataLevel, evaluation));
if (log.isDebugEnabled())
{
log.debug("created level " + level);
}
}
this.axisLevels.set(axis.ordinal(), levels);
axisBuckets.set(axis.ordinal(), buckets);
}
List dataMeasures = data.getMeasures();
this.measures = new ArrayList(dataMeasures.size());
List measureList = new ArrayList(dataMeasures.size());
for (DataMeasure dataMeasure : dataMeasures)
{
// create the data source measure
Measure measure = createMeasure(dataMeasure, evaluation);
this.measures.add(measure);
// create the bucketing measure
measureList.add(createServiceMeasure(dataMeasure));
if (log.isDebugEnabled())
{
log.debug("created measure " + measure);
}
}
// compute all totals
List rowBuckets = axisBuckets.get(Axis.ROWS.ordinal());
if (rowBuckets.size() > 1)
{
rowBuckets.get(1).setComputeTotal();
}
List colBuckets = axisBuckets.get(Axis.COLUMNS.ordinal());
colBuckets.get(0).setComputeTotal();
bucketValues = new Object[rowBuckets.size() + colBuckets.size()];
measureValues = new Object[dataMeasures.size()];
// all false
boolean[][] retrieveTotal = new boolean[rowBuckets.size() + 1][colBuckets.size() + 2];
bucketingService = new MultiAxisBucketingService(
rowBuckets, colBuckets, measureList, retrieveTotal);
}
protected AxisLevel createRootLevel(Axis axis) throws JRException
{
StandardAxisLevel level = new StandardAxisLevel();
level.setAxis(axis);
level.setType(Type.ROOT);
level.setName(StandardAxisLevel.ROOT_LEVEL_NAME);
level.setLabel(StandardAxisLevel.ROOT_LEVEL_NAME);
level.setValueType(SingleValue.class);
level.setDepth(0);
return level;
}
protected BucketDefinition createRootBucket() throws JRException
{
return new BucketDefinition(SingleValue.class,
null, null, BucketOrder.ASCENDING,
CrosstabTotalPositionEnum.START);
}
protected AxisLevel createLevel(Axis axis, DataAxisLevel dataLevel, byte evaluation, int depth) throws JRException
{
StandardAxisLevel level = new StandardAxisLevel();
level.setAxis(axis);
level.setName(dataLevel.getName());
String label = (String) serviceContext.getExpressionEvaluator().evaluate(
dataLevel.getLabelExpression(), evaluation);
level.setLabel(label);
level.setValueType(dataLevel.getBucket().getValueClass());
level.setDepth(depth);
return level;
}
protected BucketDefinition createServiceBucket(DataAxisLevel level, byte evaluation) throws JRException
{
DataLevelBucket bucket = level.getBucket();
Class valueClass = bucket.getValueClass();
Comparator