001    /**
002     * ========================================
003     * JFreeReport : a free Java report library
004     * ========================================
005     *
006     * Project Info:  http://reporting.pentaho.org/
007     *
008     * (C) Copyright 2000-2007, by Object Refinery Limited, Pentaho Corporation and Contributors.
009     *
010     * This library is free software; you can redistribute it and/or modify it under the terms
011     * of the GNU Lesser General Public License as published by the Free Software Foundation;
012     * either version 2.1 of the License, or (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015     * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016     * See the GNU Lesser General Public License for more details.
017     *
018     * You should have received a copy of the GNU Lesser General Public License along with this
019     * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020     * Boston, MA 02111-1307, USA.
021     *
022     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023     * in the United States and other countries.]
024     *
025     * ------------
026     * $Id: FlowReportProcessor.java 3048 2007-07-28 18:02:42Z tmorgner $
027     * ------------
028     * (C) Copyright 2000-2005, by Object Refinery Limited.
029     * (C) Copyright 2005-2007, by Pentaho Corporation.
030     */
031    package org.jfree.report.flow.flowing;
032    
033    import org.jfree.layouting.ChainingLayoutProcess;
034    import org.jfree.layouting.DefaultLayoutProcess;
035    import org.jfree.layouting.LayoutProcess;
036    import org.jfree.layouting.output.OutputProcessor;
037    import org.jfree.report.DataSourceException;
038    import org.jfree.report.ReportDataFactoryException;
039    import org.jfree.report.ReportProcessingException;
040    import org.jfree.report.flow.AbstractReportProcessor;
041    import org.jfree.report.flow.LibLayoutReportTarget;
042    import org.jfree.report.flow.ReportJob;
043    import org.jfree.resourceloader.ResourceKey;
044    import org.jfree.resourceloader.ResourceManager;
045    
046    /**
047     * This is written to use LibLayout. It will never work with other report
048     * targets.
049     *
050     * @author Thomas Morgner
051     */
052    public class FlowReportProcessor extends AbstractReportProcessor
053    {
054      private OutputProcessor outputProcessor;
055    
056      public FlowReportProcessor()
057      {
058      }
059    
060      public OutputProcessor getOutputProcessor()
061      {
062        return outputProcessor;
063      }
064    
065      public void setOutputProcessor(final OutputProcessor outputProcessor)
066      {
067        this.outputProcessor = outputProcessor;
068      }
069    
070      protected LibLayoutReportTarget createTarget(final ReportJob job)
071      {
072        if (outputProcessor == null)
073        {
074          throw new IllegalStateException(
075                  "OutputProcessor is invalid.");
076        }
077        final LayoutProcess layoutProcess =
078                new ChainingLayoutProcess(new DefaultLayoutProcess(outputProcessor));
079        final ResourceManager resourceManager = job.getReportStructureRoot().getResourceManager();
080        final ResourceKey resourceKey = job.getReportStructureRoot().getBaseResource();
081    
082        return new LibLayoutReportTarget
083                (job, resourceKey, resourceManager, layoutProcess);
084      }
085    
086      /**
087       * Bootstraps the local report processing. This way of executing the report
088       * must be supported by *all* report processor implementations. It should
089       * fully process the complete report.
090       *
091       * @param job
092       * @throws ReportDataFactoryException
093       */
094      public void processReport (final ReportJob job)
095              throws ReportDataFactoryException, DataSourceException,
096              ReportProcessingException
097      {
098        if (job == null)
099        {
100          throw new NullPointerException();
101        }
102    
103        synchronized (job)
104        {
105          // first, compute the globals
106          processReportRun(job, createTarget(job));
107          // second, paginate (this splits the stream into flows)
108          processReportRun(job, createTarget(job));
109          // third, generate the content.
110          processReportRun(job, createTarget(job));
111        }
112      }
113    
114    }