net.sf.jasperreports.crosstabs.fill.calculation.OrderByColumnOrderer.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jasperreports.crosstabs.fill.calculation.OrderByColumnOrderer.java

Source

/*
 * 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 <http://www.gnu.org/licenses/>.
 */
package net.sf.jasperreports.crosstabs.fill.calculation;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import net.sf.jasperreports.crosstabs.fill.BucketOrderer;
import net.sf.jasperreports.crosstabs.fill.calculation.BucketDefinition.Bucket;
import net.sf.jasperreports.crosstabs.fill.calculation.BucketingService.BucketMap;
import net.sf.jasperreports.crosstabs.fill.calculation.MeasureDefinition.MeasureValue;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.type.SortOrderEnum;
import net.sf.jasperreports.engine.util.JRValueStringUtils;

/**
 * @author Lucian Chirita (lucianc@users.sourceforge.net)
 */
public class OrderByColumnOrderer implements BucketOrderer {

    private static final Log log = LogFactory.getLog(OrderByColumnOrderer.class);

    private final OrderByColumnInfo orderInfo;
    private BucketingData bucketingData;
    private List<Bucket> bucketValues;

    public OrderByColumnOrderer(OrderByColumnInfo orderInfo) {
        this.orderInfo = orderInfo;
    }

    @Override
    public void init(BucketingData bucketingData) {
        this.bucketingData = bucketingData;

        initBucketValues();
    }

    private void initBucketValues() {
        List<ColumnValueInfo> columnValues = orderInfo.getColumnValues();
        bucketValues = new ArrayList<Bucket>(columnValues.size());

        // TODO lucianc handle cases when the values no longer match the groups
        for (ListIterator<ColumnValueInfo> it = columnValues.listIterator(); it.hasNext();) {
            Bucket bucketValue;
            ColumnValueInfo columnValue = it.next();
            if (columnValue.isTotal()) {
                bucketValue = bucketingData.getColumnTotalBucket(it.previousIndex());
            } else {
                Object value;
                if (columnValue.getValue() == null) {
                    value = null;
                } else {
                    value = JRValueStringUtils.deserialize(columnValue.getValueType(), columnValue.getValue());
                }

                // TODO lucianc check against column group value type?
                bucketValue = bucketingData.getColumnBucket(it.previousIndex(), value);
            }

            bucketValues.add(bucketValue);
        }
    }

    @Override
    public Object getOrderValue(BucketMap bucketMap, Bucket bucketValue) throws JRException {
        MeasureValue[] measureValues = bucketingData.getMeasureValues(bucketMap, bucketValue, bucketValues);
        return measureValues[orderInfo.getMeasureIndex()].getValue();
    }

    @Override
    public int compareOrderValues(Object orderValue, Object orderValue2) {
        int order;
        if (orderValue == null) {
            if (orderValue2 == null) {
                order = 0;
            } else {
                // by convention nulls come before
                order = -1;
            }
        } else {
            if (orderValue2 == null) {
                order = 1;
            } else {
                // assuming natural ordering
                order = ((Comparable) orderValue).compareTo(orderValue2);
            }
        }
        return orderInfo.getOrder() == SortOrderEnum.DESCENDING ? -order : order;
    }

    public List<Bucket> getBucketValues() {
        return bucketValues;
    }

}