You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ke...@apache.org on 2001/03/01 08:15:07 UTC

cvs commit: xml-fop/src/org/apache/fop/apps TraxInputHandler.java XSLTInputHandler.java

kellyc      01/02/28 23:15:07

  Modified:    src/org/apache/fop/apps XSLTInputHandler.java
  Added:       src/org/apache/fop/apps TraxInputHandler.java
  Log:
  Added support for Xalan1 back in. Extraced Xalan2 TRAX usage
  into TraxInputHandler
  
  Revision  Changes    Path
  1.2       +82 -65    xml-fop/src/org/apache/fop/apps/XSLTInputHandler.java
  
  Index: XSLTInputHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/apps/XSLTInputHandler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XSLTInputHandler.java	2001/02/21 01:06:51	1.1
  +++ XSLTInputHandler.java	2001/03/01 07:15:06	1.2
  @@ -7,28 +7,20 @@
   
   package org.apache.fop.apps;
   
  +import java.lang.reflect.*;
   
  -// Imported TraX classes
  -import javax.xml.transform.TransformerFactory;
  -import javax.xml.transform.stream.StreamSource;
  -import javax.xml.transform.sax.SAXResult;
  -import javax.xml.transform.sax.SAXSource;
  -import javax.xml.transform.sax.SAXTransformerFactory;
   
   // Imported SAX classes
   import org.xml.sax.InputSource;
   import org.xml.sax.SAXException;
   import org.xml.sax.XMLReader;
  -import org.xml.sax.XMLFilter;
   
  -
   // Imported java.io classes
  -import java.io.InputStream;
  -import java.io.IOException;
  -import java.io.File;
  +import java.io.*;
   
   // FOP
   import org.apache.fop.messaging.MessageHandler;
  +import org.apache.fop.tools.xslt.XSLTransform;
   
   /**
    * XSLTInputHandler basically takes an xmlfile and transforms it with an xsltfile
  @@ -36,76 +28,101 @@
    */
   
   public class XSLTInputHandler extends InputHandler {
  -
  -	File xmlfile, xsltfile;
   
  +    File xmlfile, xsltfile;
  +    boolean useOldTransform = false;
  +    
       public XSLTInputHandler (File xmlfile, File xsltfile ) {
           this.xmlfile = xmlfile;
  -		this.xsltfile = xsltfile;
  +	this.xsltfile = xsltfile;
       }
   
       /**
         *  overwrites the method of the super class to return the xmlfile
         */
       public InputSource getInputSource () {
  -        return fileInputSource(xmlfile);
  +	if (useOldTransform) {
  +	    try {
  +		java.io.Writer writer;
  +		java.io.Reader reader;
  +		File tmpFile = null;
  +	 
  +		// create a Writer
  +		// the following is an ugly hack to allow processing of larger files
  +		// if xml file size is larger than 500 kb write the fo:file to disk
  +		if ((xmlfile.length()) > 500000) {
  +		    tmpFile = new File(xmlfile.getName()+".fo.tmp");
  +		    writer = new FileWriter(tmpFile);
  +		} else {
  +		    writer = new StringWriter();
  +		}
  +
  +		XSLTransform.transform(xmlfile.getCanonicalPath(), xsltfile.getCanonicalPath(), writer);
  +
  +		writer.flush();
  +		writer.close();
  +
  +		if (tmpFile != null) {
  +		    reader = new FileReader(tmpFile);
  +		} else {
  +		    // create a input source containing the xsl:fo file which can be fed to Fop		    
  +		    reader = new StringReader(writer.toString());
  +		}
  +		return new InputSource(reader);
  +	    }
  +	    catch (Exception ex) {
  +		ex.printStackTrace();
  +		return null;
  +	    }
  +	}
  +	else {
  +	    return fileInputSource(xmlfile);
  +	}
  +	
       }
   
       /**
  -      *  overwrites this method of the super class and returns an XMLFilter instead of a
  -      *  simple XMLReader which allows chaining of transformations
  +      * This looks to see if the Trax api is supported and uses that to 
  +      * get an XMLFilter. Otherwise, it falls back to using DOM documents 
         *
         */
       public XMLReader getParser() {
  -        return this.getXMLFilter(xmlfile,xsltfile);
  +	XMLReader result = null;
  +	try {
  +	    // try trax first
  +	    Class transformer = Class.forName("javax.xml.transform.Transformer");
  +	    transformer = Class.forName("org.apache.fop.apps.TraxInputHandler");
  +	    Class[] argTypes = 	{ File.class, File.class };
  +	    Method getFilterMethod = transformer.getMethod("getXMLFilter",argTypes);
  +	    File[] args = {xmlfile, xsltfile};
  +	    Object obj = getFilterMethod.invoke(null,args);
  +	    if (obj instanceof XMLReader) {
  +		result = (XMLReader)obj;
  +		System.out.println("result OK = "+result);
  +		
  +	    }
  +	}
  +	catch (ClassNotFoundException ex){
  +	}
  +	catch (InvocationTargetException ex) {
  +	    ex.printStackTrace();
  +	}
  +	catch (IllegalAccessException ex) {
  +	    ex.printStackTrace();
  +	}
  +	catch (NoSuchMethodException ex) {
  +	    ex.printStackTrace();
  +	}
  +	// otherwise, use DOM documents via our XSLTransform tool class old style
  +	if (result == null) {
  +	    useOldTransform = true;
  +	    result = createParser();
  +	}
  +	return result;
  +	        
       }
   
  -    /**
  -      * Creates from the transformer an instance of an XMLFilter which
  -      * then can be used in a chain with the XMLReader passed to Driver. This way
  -      * during the conversion of the xml file + xslt stylesheet the resulting
  -      * data is fed into Fop. This should help to avoid memory problems
  -      * @param xmlfile The xmlfile containing the text data
  -      * @param xsltfile An xslt stylesheet
  -      * @return XMLFilter an XMLFilter which can be chained together with other XMLReaders or XMLFilters
  -      */
  -    private XMLFilter getXMLFilter (File xmlfile, File xsltfile) {
  -        try {
  -            // Instantiate  a TransformerFactory.
  -            TransformerFactory tFactory = TransformerFactory.newInstance();
  -            // Determine whether the TransformerFactory supports The use uf SAXSource
  -            // and SAXResult
  -            if (tFactory.getFeature(SAXSource.FEATURE) &&
  -                    tFactory.getFeature(SAXResult.FEATURE)) {
  -                // Cast the TransformerFactory to SAXTransformerFactory.
  -                SAXTransformerFactory saxTFactory =
  -                  ((SAXTransformerFactory) tFactory);
  -                // Create an XMLFilter for each stylesheet.
  -                XMLFilter xmlfilter = saxTFactory.newXMLFilter(
  -                                        new StreamSource(xsltfile));
  -
  -                // Create an XMLReader.
  -                XMLReader parser = super.createParser();
  -                if (parser == null) {
  -                    MessageHandler.errorln("ERROR: Unable to create SAX parser");
  -                    System.exit(1);
  -                }
  -
  -                // xmlFilter1 uses the XMLReader as its reader.
  -                xmlfilter.setParent(parser);
  -                return xmlfilter;
  -            } else {
  -                MessageHandler.errorln(
  -                  "Your parser doesn't support the features SAXSource and SAXResult." +
  -                  "\nMake sure you are using a xsl parser which supports TrAX");
  -                System.exit(1);
  -                return null;
  -            }
  -        }
  -        catch (Exception ex) {
  -            MessageHandler.errorln(ex.toString());
  -            return null;
  -        }
  -    }
  + 
  +    
   }
   
  
  
  
  1.1                  xml-fop/src/org/apache/fop/apps/TraxInputHandler.java
  
  Index: TraxInputHandler.java
  ===================================================================
  /* 
   * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
   * For details on use and redistribution please refer to the 
   * LICENSE file included with these sources."
   */
  
  
  package org.apache.fop.apps;
  
  
  // Imported TraX classes
  import javax.xml.transform.TransformerFactory;
  import javax.xml.transform.stream.StreamSource;
  import javax.xml.transform.sax.SAXResult;
  import javax.xml.transform.sax.SAXSource;
  import javax.xml.transform.sax.SAXTransformerFactory;
  
  
  // Imported SAX classes
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  import org.xml.sax.XMLReader;
  import org.xml.sax.XMLFilter;
  
  
  
  // Imported java.io classes
  import java.io.InputStream;
  import java.io.IOException;
  import java.io.File;
  
  // FOP
  import org.apache.fop.messaging.MessageHandler;
  
  /**
   * XSLTInputHandler basically takes an xmlfile and transforms it with an xsltfile
   * and the resulting xsl:fo document is input for Fop.
   */
  
  public class TraxInputHandler extends InputHandler {
  
  	File xmlfile, xsltfile;
  
      public TraxInputHandler (File xmlfile, File xsltfile ) {
          this.xmlfile = xmlfile;
  		this.xsltfile = xsltfile;
      }
  
      /**
        *  overwrites the method of the super class to return the xmlfile
        */
      public InputSource getInputSource () {
          return fileInputSource(xmlfile);
      }
  
      /**
        *  overwrites this method of the super class and returns an XMLFilter instead of a
        *  simple XMLReader which allows chaining of transformations
        *
        */
      public XMLReader getParser() {
          return this.getXMLFilter(xmlfile,xsltfile);
      }
  
      /**
        * Creates from the transformer an instance of an XMLFilter which
        * then can be used in a chain with the XMLReader passed to Driver. This way
        * during the conversion of the xml file + xslt stylesheet the resulting
        * data is fed into Fop. This should help to avoid memory problems
        * @param xmlfile The xmlfile containing the text data
        * @param xsltfile An xslt stylesheet
        * @return XMLFilter an XMLFilter which can be chained together with other XMLReaders or XMLFilters
        */
      public static XMLFilter getXMLFilter (File xmlfile, File xsltfile) {
          try {
              // Instantiate  a TransformerFactory.
              TransformerFactory tFactory = TransformerFactory.newInstance();
              // Determine whether the TransformerFactory supports The use uf SAXSource
              // and SAXResult
              if (tFactory.getFeature(SAXSource.FEATURE) &&
                      tFactory.getFeature(SAXResult.FEATURE)) {
                  // Cast the TransformerFactory to SAXTransformerFactory.
                  SAXTransformerFactory saxTFactory =
                    ((SAXTransformerFactory) tFactory);
                  // Create an XMLFilter for each stylesheet.
                  XMLFilter xmlfilter = saxTFactory.newXMLFilter(
                                          new StreamSource(xsltfile));
  
                  // Create an XMLReader.
                  XMLReader parser = createParser();
                  if (parser == null) {
                      MessageHandler.errorln("ERROR: Unable to create SAX parser");
                      System.exit(1);
                  }
  
                  // xmlFilter1 uses the XMLReader as its reader.
                  xmlfilter.setParent(parser);
                  return xmlfilter;
              } else {
                  MessageHandler.errorln(
                    "Your parser doesn't support the features SAXSource and SAXResult." +
                    "\nMake sure you are using a xsl parser which supports TrAX");
                  System.exit(1);
                  return null;
              }
          }
          catch (Exception ex) {
              MessageHandler.errorln(ex.toString());
              return null;
          }
      }
  }