/* * 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) 2006 - 2009 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.sorting; import org.pentaho.reporting.engine.classic.core.AbstractReportDefinition; import org.pentaho.reporting.engine.classic.core.AbstractReportPreProcessor; import org.pentaho.reporting.engine.classic.core.AttributeNames; import org.pentaho.reporting.engine.classic.core.Group; import org.pentaho.reporting.engine.classic.core.GroupBody; import org.pentaho.reporting.engine.classic.core.MasterReport; import org.pentaho.reporting.engine.classic.core.ReportProcessingException; import org.pentaho.reporting.engine.classic.core.SubReport; import org.pentaho.reporting.engine.classic.core.states.datarow.DefaultFlowController; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SortOrderReportPreProcessor extends AbstractReportPreProcessor { public SortOrderReportPreProcessor() { } public MasterReport performPreDataProcessing( final MasterReport definition, final DefaultFlowController flowController ) throws ReportProcessingException { return performInternalPreDataProcessing( definition ); } public SubReport performPreDataProcessing( final SubReport definition, final DefaultFlowController flowController ) throws ReportProcessingException { return performInternalPreDataProcessing( definition ); } protected <T extends AbstractReportDefinition> T performInternalPreDataProcessing( final T report ) { Object attribute = report.getAutoSort(); if ( !Boolean.TRUE.equals( attribute ) ) { return report; } final List<SortConstraint> sort = computeSortConstraints( report ); report.setAttribute( AttributeNames.Internal.NAMESPACE, AttributeNames.Internal.COMPUTED_SORT_CONSTRAINTS, Collections.unmodifiableList( sort ) ); return report; } public List<SortConstraint> computeSortConstraints( final AbstractReportDefinition report ) { return collectSortData( report.getRootGroup(), new ArrayList<SortConstraint>() ); } private List<SortConstraint> collectSortData( final Group rootGroup, final ArrayList<SortConstraint> sorts ) { sorts.addAll( rootGroup.getSortingConstraint() ); GroupBody body = rootGroup.getBody(); Group group = body.getGroup(); if ( group == null ) { // todo: Allow additional sorting based on item/detail data? return sorts; } return collectSortData( group, sorts ); } }