Package net.sf.jasperreports.engine

Source Code of net.sf.jasperreports.engine.JasperCompileManager

/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2009 Jaspersoft Corporation. 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.engine;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;

import net.sf.jasperreports.crosstabs.JRCrosstab;
import net.sf.jasperreports.engine.design.JRCompiler;
import net.sf.jasperreports.engine.design.JRJavacCompiler;
import net.sf.jasperreports.engine.design.JRJdk13Compiler;
import net.sf.jasperreports.engine.design.JRJdtCompiler;
import net.sf.jasperreports.engine.design.JRValidationFault;
import net.sf.jasperreports.engine.design.JRVerifier;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.fill.JREvaluator;
import net.sf.jasperreports.engine.util.JRClassLoader;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.util.JRProperties;
import net.sf.jasperreports.engine.util.JRSaver;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.engine.xml.JRXmlWriter;


/**
* Fa�ade class for compiling report designs into the ready-to-fill form
* and for getting the XML representation of report design objects for
* storage or network transfer.
*
* Report compilation using this class is delegated to the
* {@link net.sf.jasperreports.engine.design.JRDefaultCompiler}.
*
* @see net.sf.jasperreports.engine.design.JasperDesign
* @see net.sf.jasperreports.engine.JasperReport
* @see net.sf.jasperreports.engine.design.JRDefaultCompiler
* @see net.sf.jasperreports.engine.design.JRVerifier
* @see net.sf.jasperreports.engine.xml.JRXmlLoader
* @see net.sf.jasperreports.engine.xml.JRXmlWriter
* @see net.sf.jasperreports.engine.util.JRLoader
* @see net.sf.jasperreports.engine.util.JRSaver
* @author Teodor Danciu (teodord@users.sourceforge.net)
* @version $Id: JasperCompileManager.java 3712 2010-04-08 09:53:09Z teodord $
*/
public final class JasperCompileManager
{


  /**
   * Compiles the XML report design file specified by the parameter.
   * The result of this operation is another file that will contain the serialized 
   * {@link net.sf.jasperreports.engine.JasperReport} object representing the compiled report design,
   * having the same name as the report design as declared in the XML plus the <code>*.jasper</code> extension,
   * located in the same directory as the XML source file.
   *
   * @param sourceFileName XML source file name
   * @return resulting file name containing a serialized {@link net.sf.jasperreports.engine.JasperReport} object
   */
  public static String compileReportToFile(String sourceFileName) throws JRException
  {
    File sourceFile = new File(sourceFileName);

    JasperDesign jasperDesign = JRXmlLoader.load(sourceFileName);

    File destFile = new File(sourceFile.getParent(), jasperDesign.getName() + ".jasper");
    String destFileName = destFile.toString();

    compileReportToFile(jasperDesign, destFileName);
   
    return destFileName;
  }


  /**
   * Compiles the XML report design file received as the first parameter, placing the result
   * in the file specified by the second parameter.
   * The resulting file will contain a serialized instance of a
   * {@link net.sf.jasperreports.engine.JasperReport} object representing
   * the compiled report design.
   *
   * @param sourceFileName XML source file name
   * @param destFileName   file name to place the result into
   */
  public static void compileReportToFile(
    String sourceFileName,
    String destFileName
    ) throws JRException
  {
    JasperDesign jasperDesign = JRXmlLoader.load(sourceFileName);

    compileReportToFile(jasperDesign, destFileName);
  }


  /**
   * Compiles the report design object received as the first parameter, placing the result
   * in the file specified by the second parameter.
   * The resulting file will contain a serialized instance of a
   * {@link net.sf.jasperreports.engine.JasperReport} object representing the compiled report design.
   *
   * @param jasperDesign source report design object
   * @param destFileName file name to place the compiled report design into
   */
  public static void compileReportToFile(
    JasperDesign jasperDesign,
    String destFileName
    ) throws JRException
  {
    JasperReport jasperReport = compileReport(jasperDesign);

    JRSaver.saveObject(jasperReport, destFileName);
  }


  /**
   * Compiles the XML report design file received as parameter, and returns
   * the compiled report design object.
   * 
   * @param sourceFileName XML source file name
   * @return compiled report design object
   */
  public static JasperReport compileReport(String sourceFileName) throws JRException
  {
    JasperDesign jasperDesign = JRXmlLoader.load(sourceFileName);

    return compileReport(jasperDesign);
  }


  /**
   * Compiles the XML representation of the report design read from the supplied input stream and
   * writes the generated compiled report design object to the output stream specified
   * by the second parameter.
   *
   * @param inputStream  XML source input stream
   * @param outputStream output stream to write the compiled report design to
   */
  public static void compileReportToStream(
    InputStream inputStream,
    OutputStream outputStream
    ) throws JRException
  {
    JasperDesign jasperDesign = JRXmlLoader.load(inputStream);

    compileReportToStream(jasperDesign, outputStream);
  }


  /**
   * Compiles the report design object represented by the first parameter and
   * writes the generated compiled report design object to the output stream specified
   * by the second parameter.
   *
   * @param jasperDesign source report design object
   * @param outputStream output stream to write the compiled report design to
   */
  public static void compileReportToStream(
    JasperDesign jasperDesign,
    OutputStream outputStream
    ) throws JRException
  {
    JasperReport jasperReport = compileReport(jasperDesign);

    JRSaver.saveObject(jasperReport, outputStream);
  }


  /**
   * Compiles the serialized report design object read from the supplied input stream and
   * returns the generated compiled report design object.
   *
   * @param inputStream XML source input stream
   * @return compiled report design object
   */
  public static JasperReport compileReport(InputStream inputStream) throws JRException
  {
    JasperDesign jasperDesign = JRXmlLoader.load(inputStream);

    return compileReport(jasperDesign);
  }


  /**
   * Compiles the report design object received as parameter and
   * returns the generated compiled report design object.
   *
   * @param jasperDesign source report design object
   * @return compiled report design object
   * @see net.sf.jasperreports.engine.design.JRDefaultCompiler
   */
  public static JasperReport compileReport(JasperDesign jasperDesign) throws JRException
  {
    return getCompiler(jasperDesign).compileReport(jasperDesign);
  }


  /**
   * Verifies the validity and consistency of the report design object.
   * Returns a collection of {@link JRValidationFault errors}, if problems are found in the report design.
   *
   * @param jasperDesign report design object to verify
   * @return collection of {@link JRValidationFault JRValidationFault} if problems are found
   * @see net.sf.jasperreports.engine.design.JRVerifier
   */
  public static Collection verifyDesign(JasperDesign jasperDesign)
  {
    return JRVerifier.verifyDesign(jasperDesign);
  }


  /**
   *
   */
  public static JREvaluator loadEvaluator(JasperReport jasperReport, JRDataset dataset) throws JRException
  {
    JRCompiler compiler = getCompiler(jasperReport);
   
    return compiler.loadEvaluator(jasperReport, dataset);
  }


  /**
   *
   */
  public static JREvaluator loadEvaluator(JasperReport jasperReport, JRCrosstab crosstab) throws JRException
  {
    JRCompiler compiler = getCompiler(jasperReport);
   
    return compiler.loadEvaluator(jasperReport, crosstab);
  }


  /**
   *
   */
  public static JREvaluator loadEvaluator(JasperReport jasperReport) throws JRException
  {
    return loadEvaluator(jasperReport, jasperReport.getMainDataset());
  }

 
  /**
   * Generates the XML representation of the report design loaded from the specified filename.
   * The result of this operation is an "UTF-8" encoded XML file having the same name as
   * the report design, plus the <code>*.jasper.jrxml</code> extension, located in the same directory as
   * the source file.
   *
   * @param sourceFileName source file name containing the report design object
   * @return XML representation of the report design
   */
  public static String writeReportToXmlFile(
    String sourceFileName
    ) throws JRException
  {
    File sourceFile = new File(sourceFileName);

    /* We need the report name. */
    JRReport report = (JRReport)JRLoader.loadObject(sourceFile);

    File destFile = new File(sourceFile.getParent(), report.getName() + ".jasper.jrxml");
    String destFileName = destFile.toString();
   
    writeReportToXmlFile(
      report,
      destFileName
      );
   
    return destFileName;
  }


  /**
   * Generates the XML representation of the report design loaded from the first file parameter
   * and place it in the file specified by the second parameter. The result is "UTF-8" encoded.
   *
   * @param sourceFileName source file name containing the report design object
   * @param destFileName   output file name to write the XML report design representation to
   */
  public static void writeReportToXmlFile(
    String sourceFileName,
    String destFileName
    ) throws JRException
  {
    JRReport report = (JRReport)JRLoader.loadObject(sourceFileName);

    writeReportToXmlFile(
      report,
      destFileName
      );
  }

 
  /**
   * Generates the XML representation of the report design supplied as the first parameter
   * and place it in the file specified by the second parameter. The result is "UTF-8" encoded.
   *
   * @param report       source report design object
   * @param destFileName output file name to write the XML report design representation to
   * @see net.sf.jasperreports.engine.xml.JRXmlWriter
   */
  public static void writeReportToXmlFile(
    JRReport report,
    String destFileName
    ) throws JRException
  {
    JRXmlWriter.writeReport(
      report,
      destFileName,
      "UTF-8"
      );
  }


  /**
   * Generates the XML representation of the serialized report design object read from the supplied
   * input stream abd writes it to the specified output stream, using the "UTF-8" encoding.
   *
   * @param inputStream  source input stream to read the report design object from
   * @param outputStream output stream to write the XML report design representation to
   */
  public static void writeReportToXmlStream(
    InputStream inputStream,
    OutputStream outputStream
    ) throws JRException
  {
    JRReport report = (JRReport)JRLoader.loadObject(inputStream);

    writeReportToXmlStream(report, outputStream);
  }

 
  /**
   * Generates the XML representation of the report design object supplied as parameter
   * and writes it to the specified output stream, using the "UTF-8" encoding.
   *
   * @param report       source report design object
   * @param outputStream output stream to write the XML report design representation to
   * @see net.sf.jasperreports.engine.xml.JRXmlWriter
   */
  public static void writeReportToXmlStream(
    JRReport report,
    OutputStream outputStream
    ) throws JRException
  {
    JRXmlWriter.writeReport(
      report,
      outputStream,
      "UTF-8"
      );
  }


  /**
   * Generates the XML representation of the report design object supplied as parameter
   * using the "UTF-8" enconding.
   *
   * @param report source report design object
   * @return XML representation of the report design
   * @see net.sf.jasperreports.engine.xml.JRXmlWriter
   */
  public static String writeReportToXml(JRReport report)
  {
    return JRXmlWriter.writeReport(report, "UTF-8");
  }


  /**
   *
   */
  private static JRCompiler getJavaCompiler()
  {
    JRCompiler compiler = null;

    try
    {
      JRClassLoader.loadClassForRealName("org.eclipse.jdt.internal.compiler.Compiler");
      compiler = new JRJdtCompiler();
    }
    catch (Exception e)
    {
    }

    if (compiler == null)
    {
      try
      {
        JRClassLoader.loadClassForRealName("com.sun.tools.javac.Main");
        compiler = new JRJdk13Compiler();
      }
      catch (Exception e)
      {
      }
    }

    if (compiler == null)
    {
      compiler = new JRJavacCompiler();
    }
   
    return compiler;
  }


  /**
   *
   */
  private static JRCompiler getCompiler(JasperReport jasperReport) throws JRException
  {
    JRCompiler compiler = null;
   
    String compilerClassName = jasperReport.getCompilerClass();

    Class compilerClass = null;
   
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if (classLoader != null)
    {
      try
      {
        compilerClass = classLoader.loadClass(compilerClassName);
      }
      catch(ClassNotFoundException e)
      {
      }
    }
   
    if (compilerClass == null)
    {
      classLoader = JasperCompileManager.class.getClassLoader();
      try
      {
        if (classLoader == null)
        {
          compilerClass = Class.forName(compilerClassName);
        }
        else
        {
          compilerClass = classLoader.loadClass(compilerClassName);
        }
      }
      catch(ClassNotFoundException e)
      {
        throw new JRException("Report compiler class not found : " + compilerClassName, e);
      }
    }


    try
    {
      compiler = (JRCompiler)compilerClass.newInstance();
    }
    catch (Exception e)
    {
      throw new JRException("Could not instantiate report compiler : " + compilerClassName, e);
    }
    return compiler;
  }

 


  /**
   *
   */
  private static JRCompiler getCompiler(JasperDesign jasperDesign) throws JRException
  {
    JRCompiler compiler = null;

    String compilerClassName = getCompilerClassProperty();
    if (compilerClassName == null || compilerClassName.trim().length() == 0)
    {
      String language = jasperDesign.getLanguage();
      compilerClassName = JRProperties.getProperty(JRCompiler.COMPILER_PREFIX + language);
      if (compilerClassName == null || compilerClassName.trim().length() == 0)
      {
        if (JRReport.LANGUAGE_JAVA.equals(language))
        {
          return getJavaCompiler();
        }
        else
        {
          throw new JRException("No report compiler set for language : " + language);
        }
      }
    }

    try
    {
      Class clazz = JRClassLoader.loadClassForName(compilerClassName);
      compiler = (JRCompiler)clazz.newInstance();
    }
    catch (Exception e)
    {
      throw new JRException("Could not instantiate report compiler : " + compilerClassName, e);
    }
   
    return compiler;
  }

 
  /**
   *
   */
  @SuppressWarnings("deprecation")
  private static String getCompilerClassProperty()
  {
    return JRProperties.getProperty(JRProperties.COMPILER_CLASS);
  }

 
  private JasperCompileManager()
  {
  }
}
TOP

Related Classes of net.sf.jasperreports.engine.JasperCompileManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.