/*! * 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) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.layout.output; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.reporting.engine.classic.core.event.ReportProgressEvent; import org.pentaho.reporting.engine.classic.core.event.ReportProgressListener; import org.pentaho.reporting.libraries.base.util.MemoryUsageMessage; import org.pentaho.reporting.libraries.formatting.FastMessageFormat; public class PerformanceProgressLogger implements ReportProgressListener { private static final Log logger = LogFactory.getLog( PerformanceProgressLogger.class ); private static final int ROW_PROGRESS = 5000; private int lastPage; private int lastRow; private int lastStage; private int lastActivity; private long startTime; private int rowCount; private boolean logPageProgress; private boolean logLevelProgress; private boolean logRowProgress; public PerformanceProgressLogger() { this( true, true, true ); } public PerformanceProgressLogger( final boolean logLevelProgress, final boolean logPageProgress, final boolean logRowProgress ) { this.logLevelProgress = logLevelProgress; this.logPageProgress = logPageProgress; this.logRowProgress = logRowProgress; } /** * Receives a notification that the report processing has started. * * @param event * the start event. */ public void reportProcessingStarted( final ReportProgressEvent event ) { if ( logger.isInfoEnabled() == false ) { return; } rowCount = -1; startTime = System.currentTimeMillis(); logger.info( new MemoryUsageMessage( "[" + Thread.currentThread().getName() + "] Report Processing started. " ) ); } /** * Receives a notification that the report processing made some progress. * * @param event * the update event. */ public void reportProcessingUpdate( final ReportProgressEvent event ) { if ( logger.isInfoEnabled() == false ) { return; } rowCount = event.getMaximumRow(); boolean print = false; if ( lastStage != event.getLevel() || lastActivity != event.getActivity() ) { lastStage = event.getLevel(); lastActivity = event.getActivity(); lastRow = 0; if ( logLevelProgress ) { print = true; } } if ( lastPage != event.getPage() ) { lastPage = event.getPage(); if ( logPageProgress ) { print = true; } } final int modRow = ( event.getRow() - lastRow ); if ( modRow > ROW_PROGRESS ) { lastRow = ( event.getRow() / ROW_PROGRESS ) * ROW_PROGRESS; if ( logRowProgress ) { print = true; } } if ( print ) { logger.info( new MemoryUsageMessage( "[" + Thread.currentThread().getName() + "] Activity: " + event.getActivity() + " Level: " + +lastStage + " Processing page: " + lastPage + " Row: " + lastRow + " Time: " + ( System.currentTimeMillis() - startTime ) + "ms " ) ); } } /** * Receives a notification that the report processing was finished. * * @param event * the finish event. */ public void reportProcessingFinished( final ReportProgressEvent event ) { if ( logger.isInfoEnabled() == false ) { return; } final FastMessageFormat messageFormat = new FastMessageFormat( "[{0}] Report Processing Finished: {1}ms - {2,number,0.000} rows/sec - " ); final long processTime = System.currentTimeMillis() - startTime; final double rowsPerSecond = rowCount * 1000.0f / ( processTime ); logger.info( new MemoryUsageMessage( messageFormat.format( new Object[] { Thread.currentThread().getName(), new Long( processTime ), new Double( rowsPerSecond ) } ) ) ); } }