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: AbstractReportProcessor.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    
032    package org.jfree.report.flow;
033    
034    import org.jfree.formula.DefaultFormulaContext;
035    import org.jfree.report.DataSourceException;
036    import org.jfree.report.ReportDataFactoryException;
037    import org.jfree.report.ReportProcessingException;
038    import org.jfree.report.data.ReportContextImpl;
039    import org.jfree.report.flow.layoutprocessor.DefaultLayoutControllerFactory;
040    import org.jfree.report.flow.layoutprocessor.LayoutController;
041    import org.jfree.report.flow.layoutprocessor.LayoutControllerFactory;
042    
043    /**
044     * Creation-Date: 10.11.2006, 16:07:26
045     *
046     * @author Thomas Morgner
047     */
048    public abstract class AbstractReportProcessor implements ReportProcessor
049    {
050      protected AbstractReportProcessor()
051      {
052      }
053    
054      protected void processReportRun
055          (final ReportJob job,
056           final ReportTarget target)
057          throws ReportDataFactoryException,
058          DataSourceException, ReportProcessingException
059      {
060        synchronized (job)
061        {
062          final ReportContext context = createReportContext(job, target);
063          final LayoutControllerFactory layoutFactory =
064              context.getLayoutControllerFactory();
065          // we have the data and we have our position inside the report.
066          // lets generate something ...
067          final FlowController flowController = createFlowControler(context, job);
068    
069          LayoutController layoutController =
070              layoutFactory.create(flowController, job.getReportStructureRoot(), null);
071    
072          while (layoutController.isAdvanceable())
073          {
074            layoutController = layoutController.advance(target);
075            while (layoutController.isAdvanceable() == false &&
076                   layoutController.getParent() != null)
077            {
078              final LayoutController parent = layoutController.getParent();
079              target.commit();
080              layoutController = parent.join(layoutController.getFlowController());
081            }
082          }
083          target.commit();
084        }
085      }
086    
087      protected ReportContext createReportContext (final ReportJob job,
088                                                   final ReportTarget target)
089      {
090        final ReportContextImpl context = new ReportContextImpl();
091        context.setExportDescriptor(target.getExportDescriptor());
092        final DefaultLayoutControllerFactory lcf = new DefaultLayoutControllerFactory();
093        lcf.initialize(job);
094        context.setLayoutControllerFactory(lcf);
095    
096        final DefaultFormulaContext formulaContext = new DefaultFormulaContext();
097        context.setFormulaContext(formulaContext);
098        context.setResourceBundleFactory(job.getResourceBundleFactory());
099        context.setReportStructureRoot(job.getReportStructureRoot());
100        return context;
101      }
102    
103      protected FlowController createFlowControler(final ReportContext context,
104                                                   final ReportJob job)
105              throws DataSourceException
106      {
107        return new DefaultFlowController(context, job);
108      }
109    
110    }