mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			677 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			677 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Java
		
	
	
	
/* SAXNullTransformerFactory.java --
 | 
						|
   Copyright (C) 2001 Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation; either version 2, or (at your option)
 | 
						|
any later version.
 | 
						|
 | 
						|
GNU Classpath 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
 | 
						|
General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
02110-1301 USA.
 | 
						|
 | 
						|
Linking this library statically or dynamically with other modules is
 | 
						|
making a combined work based on this library.  Thus, the terms and
 | 
						|
conditions of the GNU General Public License cover the whole
 | 
						|
combination.
 | 
						|
 | 
						|
As a special exception, the copyright holders of this library give you
 | 
						|
permission to link this library with independent modules to produce an
 | 
						|
executable, regardless of the license terms of these independent
 | 
						|
modules, and to copy and distribute the resulting executable under
 | 
						|
terms of your choice, provided that you also meet, for each linked
 | 
						|
independent module, the terms and conditions of the license of that
 | 
						|
module.  An independent module is a module which is not derived from
 | 
						|
or based on this library.  If you modify this library, you may extend
 | 
						|
this exception to your version of the library, but you are not
 | 
						|
obligated to do so.  If you do not wish to do so, delete this
 | 
						|
exception statement from your version. */
 | 
						|
 | 
						|
package gnu.xml.util;
 | 
						|
 | 
						|
import java.io.FileOutputStream;
 | 
						|
import java.io.IOException;
 | 
						|
import java.io.OutputStream;
 | 
						|
import java.net.URL;
 | 
						|
import java.net.URLConnection;
 | 
						|
import java.util.Hashtable;
 | 
						|
import java.util.Properties;
 | 
						|
 | 
						|
import gnu.xml.dom.Consumer;
 | 
						|
import gnu.xml.dom.DomDocument;
 | 
						|
import gnu.xml.pipeline.DomConsumer;
 | 
						|
import gnu.xml.pipeline.EventFilter;
 | 
						|
 | 
						|
import javax.xml.transform.*;
 | 
						|
import javax.xml.transform.dom.*;
 | 
						|
import javax.xml.transform.sax.*;
 | 
						|
import javax.xml.transform.stream.*;
 | 
						|
 | 
						|
import org.xml.sax.*;
 | 
						|
import org.xml.sax.helpers.XMLReaderFactory;
 | 
						|
import org.xml.sax.helpers.LocatorImpl;
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Implements null transforms. XSLT stylesheets are not supported.
 | 
						|
 * This class provides a way to translate three representations of
 | 
						|
 * XML data (SAX event stream, DOM tree, and XML text) into each other.
 | 
						|
 * In essence it's a thinnish wrapper around basic SAX event
 | 
						|
 * <a href="../pipeline/package-summary.html">pipeline</a> facilities, which
 | 
						|
 * exposes only limited functionality.  The <em>javax.xml.transform</em>
 | 
						|
 * functionality is implemented as follows: <ul>
 | 
						|
 *
 | 
						|
 * <li>The {@link javax.xml.transform.sax.SAXSource SAXSource} class
 | 
						|
 * just wraps an {@link XMLReader} and {@link InputSource}, while the
 | 
						|
 * {@link javax.xml.transform.sax.SAXResult SAXResult} class is less
 | 
						|
 * functional than a {@link gnu.xml.pipeline.EventConsumer EventConsumer}.
 | 
						|
 * (Notably, it drops all but one declaration from any DTD.)</li>
 | 
						|
 *
 | 
						|
 * <li>The {@link javax.xml.transform.dom.DOMSource DOMSource} class
 | 
						|
 * corresponds to special SAX parsers like {@link DomParser}, and the
 | 
						|
 * {@link javax.xml.transform.dom.DOMResult DOMResult} class corresponds
 | 
						|
 * to a {@link gnu.xml.pipeline.DomConsumer DomConsumer}.</li>
 | 
						|
 *
 | 
						|
 * <li>The {@link javax.xml.transform.stream.StreamSource StreamSource}
 | 
						|
 * class corresponds to a SAX {@link InputSource}, and the
 | 
						|
 * {@link javax.xml.transform.stream.StreamResult StreamResult} class
 | 
						|
 * corresponds to a {@link gnu.xml.pipeline.TextConsumer TextConsumer}.</li>
 | 
						|
 *
 | 
						|
 * </ul>
 | 
						|
 *
 | 
						|
 * <p><em>This implementation is preliminary.</em>
 | 
						|
 *
 | 
						|
 * @see gnu.xml.pipeline.XsltFilter
 | 
						|
 *
 | 
						|
 * @author David Brownell
 | 
						|
 */
 | 
						|
public class SAXNullTransformerFactory extends SAXTransformerFactory
 | 
						|
{
 | 
						|
 | 
						|
  private ErrorListener errListener;
 | 
						|
  private URIResolver           uriResolver;
 | 
						|
 | 
						|
  /** Default constructor */
 | 
						|
  public SAXNullTransformerFactory () { }
 | 
						|
 | 
						|
  //
 | 
						|
  // only has stuff that makes sense with null transforms
 | 
						|
  //
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns true if the requested feature is supported.
 | 
						|
   * All three kinds of input and output are accepted:
 | 
						|
   * XML text, SAX events, and DOM nodes.
 | 
						|
   */
 | 
						|
  public boolean getFeature (String feature)
 | 
						|
  {
 | 
						|
    return SAXTransformerFactory.FEATURE.equals (feature)
 | 
						|
      || SAXResult.FEATURE.equals (feature)
 | 
						|
      || SAXSource.FEATURE.equals (feature)
 | 
						|
      || DOMResult.FEATURE.equals (feature)
 | 
						|
      || DOMSource.FEATURE.equals (feature)
 | 
						|
      || StreamResult.FEATURE.equals (feature)
 | 
						|
      || StreamSource.FEATURE.equals (feature)
 | 
						|
      ;
 | 
						|
  }
 | 
						|
 | 
						|
  public void setFeature(String name, boolean value)
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    throw new TransformerConfigurationException(name);
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  /** Throws an exception (no implementation attributes are supported) */
 | 
						|
  public void setAttribute (String key, Object value)
 | 
						|
  {
 | 
						|
    throw new IllegalArgumentException ();
 | 
						|
  }
 | 
						|
 | 
						|
  /** Throws an exception (no implementation attributes are supported) */
 | 
						|
  public Object getAttribute (String key)
 | 
						|
  {
 | 
						|
    throw new IllegalArgumentException ();
 | 
						|
  }
 | 
						|
 | 
						|
  /** (not yet implemented) */
 | 
						|
  public Source getAssociatedStylesheet (Source source,
 | 
						|
                                         String media,
 | 
						|
                                         String title,
 | 
						|
                                         String charset)
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    // parse, and find the appropriate xsl-stylesheet PI contents
 | 
						|
    throw new IllegalArgumentException ();
 | 
						|
  }
 | 
						|
 | 
						|
  public Transformer newTransformer ()
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    return new NullTransformer ();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns a TransformerHandler that knows how to generate output
 | 
						|
   * in all three standard formats.  Output text is generated using
 | 
						|
   * {@link XMLWriter}, and the GNU implementation of
 | 
						|
   * {@link DomDocument DOM} is used.
 | 
						|
   *
 | 
						|
   * @see SAXResult
 | 
						|
   * @see StreamResult
 | 
						|
   * @see DOMResult
 | 
						|
   */
 | 
						|
  public TransformerHandler newTransformerHandler ()
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    NullTransformer     transformer = new NullTransformer ();
 | 
						|
    return transformer.handler;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Stuff that depends on XSLT support, which we don't provide
 | 
						|
  //
 | 
						|
  private static final String           noXSLT = "No XSLT support";
 | 
						|
 | 
						|
  /** Throws an exception (XSLT is not supported). */
 | 
						|
  public Transformer newTransformer (Source stylesheet)
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    throw new TransformerConfigurationException (noXSLT);
 | 
						|
  }
 | 
						|
 | 
						|
  /** Throws an exception (XSLT is not supported). */
 | 
						|
  public Templates newTemplates (Source stylesheet)
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    throw new TransformerConfigurationException (noXSLT);
 | 
						|
  }
 | 
						|
 | 
						|
  /** Throws an exception (XSLT is not supported). */
 | 
						|
  public TemplatesHandler newTemplatesHandler ()
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    throw new TransformerConfigurationException (noXSLT);
 | 
						|
  }
 | 
						|
 | 
						|
  /** Throws an exception (XSLT is not supported). */
 | 
						|
  public TransformerHandler newTransformerHandler (Source stylesheet)
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    throw new TransformerConfigurationException (noXSLT);
 | 
						|
  }
 | 
						|
 | 
						|
  /** Throws an exception (XSLT is not supported). */
 | 
						|
  public TransformerHandler newTransformerHandler (Templates stylesheet)
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    throw new TransformerConfigurationException (noXSLT);
 | 
						|
  }
 | 
						|
 | 
						|
  /** Throws an exception (XSLT is not supported). */
 | 
						|
  public XMLFilter newXMLFilter (Source stylesheet)
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    throw new TransformerConfigurationException (noXSLT);
 | 
						|
  }
 | 
						|
 | 
						|
  /** Throws an exception (XSLT is not supported). */
 | 
						|
  public XMLFilter newXMLFilter (Templates stylesheet)
 | 
						|
    throws TransformerConfigurationException
 | 
						|
  {
 | 
						|
    throw new TransformerConfigurationException (noXSLT);
 | 
						|
  }
 | 
						|
 | 
						|
  /** Returns the value assigned by {@link #setErrorListener}.  */
 | 
						|
  public ErrorListener getErrorListener ()
 | 
						|
  {
 | 
						|
    return errListener;
 | 
						|
  }
 | 
						|
 | 
						|
  /** Assigns a value that would be used when parsing stylesheets */
 | 
						|
  public void setErrorListener (ErrorListener e)
 | 
						|
  {
 | 
						|
    errListener = e;
 | 
						|
  }
 | 
						|
 | 
						|
  /** Returns the value assigned by {@link #setURIResolver}.  */
 | 
						|
  public URIResolver getURIResolver ()
 | 
						|
  {
 | 
						|
    return uriResolver;
 | 
						|
  }
 | 
						|
 | 
						|
  /** Assigns a value that would be used when parsing stylesheets */
 | 
						|
  public void setURIResolver (URIResolver u)
 | 
						|
  {
 | 
						|
    uriResolver = u;
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  //
 | 
						|
  // Helper classes.  These might in theory be subclassed
 | 
						|
  // by an XSLT implementation, if they were exported.
 | 
						|
  //
 | 
						|
 | 
						|
  static class DomTerminus
 | 
						|
    extends DomConsumer
 | 
						|
  {
 | 
						|
 | 
						|
    DomTerminus (DOMResult result)
 | 
						|
      throws SAXException
 | 
						|
    {
 | 
						|
      // won't really throw SAXException
 | 
						|
      super (DomDocument.class);
 | 
						|
      setHandler (new DomHandler (this, result));
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  static class DomHandler
 | 
						|
    extends Consumer.Backdoor
 | 
						|
  {
 | 
						|
 | 
						|
    private DOMResult   result;
 | 
						|
 | 
						|
    DomHandler (DomConsumer c, DOMResult r)
 | 
						|
      throws SAXException
 | 
						|
    {
 | 
						|
      // won't really throw SAXException
 | 
						|
      super (c);
 | 
						|
      result = r;
 | 
						|
    }
 | 
						|
 | 
						|
    public void endDocument ()
 | 
						|
      throws SAXException
 | 
						|
    {
 | 
						|
      super.endDocument ();
 | 
						|
      result.setNode (getDocument ());
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  private static OutputStream getOutputStream (String uri)
 | 
						|
    throws IOException
 | 
						|
  {
 | 
						|
    // JDK stupidity:  file "protocol does not support output" ...
 | 
						|
    if (uri.startsWith ("file:"))
 | 
						|
      return new FileOutputStream (uri.substring (5));
 | 
						|
 | 
						|
    // Otherwise ...
 | 
						|
    URL         url = new URL (uri);
 | 
						|
    URLConnection       conn = url.openConnection ();
 | 
						|
 | 
						|
    conn.setDoOutput (true);
 | 
						|
    return conn.getOutputStream ();
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  static class NullHandler
 | 
						|
    extends EventFilter
 | 
						|
    implements TransformerHandler
 | 
						|
  {
 | 
						|
 | 
						|
    private String              systemId;
 | 
						|
    private Transformer transformer;
 | 
						|
 | 
						|
    NullHandler (Transformer t)
 | 
						|
    {
 | 
						|
      transformer = t;
 | 
						|
    }
 | 
						|
 | 
						|
    public Transformer getTransformer ()
 | 
						|
    {
 | 
						|
      return transformer;
 | 
						|
    }
 | 
						|
 | 
						|
    public String getSystemId ()
 | 
						|
    {
 | 
						|
      return systemId;
 | 
						|
    }
 | 
						|
 | 
						|
    public void setSystemId (String id)
 | 
						|
    {
 | 
						|
      systemId = id;
 | 
						|
    }
 | 
						|
 | 
						|
    public void setResult (Result result)
 | 
						|
    {
 | 
						|
      if (result.getSystemId () != null)
 | 
						|
        systemId = result.getSystemId ();
 | 
						|
 | 
						|
      try
 | 
						|
        {
 | 
						|
 | 
						|
          // output to partial SAX event stream?
 | 
						|
          if (result instanceof SAXResult)
 | 
						|
            {
 | 
						|
              SAXResult         r = (SAXResult) result;
 | 
						|
 | 
						|
              setContentHandler (r.getHandler ());
 | 
						|
              setProperty (LEXICAL_HANDLER, r.getLexicalHandler ());
 | 
						|
              // DTD info is filtered out by javax.transform
 | 
						|
 | 
						|
              // output to DOM tree?
 | 
						|
            }
 | 
						|
          else if (result instanceof DOMResult)
 | 
						|
            {
 | 
						|
              DomTerminus       out = new DomTerminus ((DOMResult) result);
 | 
						|
 | 
						|
              setContentHandler (out.getContentHandler ());
 | 
						|
              setProperty (LEXICAL_HANDLER,
 | 
						|
                           out.getProperty (LEXICAL_HANDLER));
 | 
						|
              // save DTD-derived info, if any.
 | 
						|
              setDTDHandler (out.getDTDHandler ());
 | 
						|
              setProperty (DECL_HANDLER,
 | 
						|
                           out.getProperty (DECL_HANDLER));
 | 
						|
 | 
						|
              // node is saved into result on endDocument()
 | 
						|
 | 
						|
              // output to (XML) text?
 | 
						|
            }
 | 
						|
          else if (result instanceof StreamResult)
 | 
						|
            {
 | 
						|
              StreamResult      r = (StreamResult) result;
 | 
						|
              XMLWriter         out;
 | 
						|
 | 
						|
              // FIXME:  when do output properties take effect?
 | 
						|
              // encoding, standalone decl, xml/xhtml/... ...
 | 
						|
 | 
						|
              // FIXME:  maybe put nsfix filter up front
 | 
						|
 | 
						|
              try
 | 
						|
                {
 | 
						|
                  if (r.getWriter () != null)
 | 
						|
                    out = new XMLWriter (r.getWriter ());
 | 
						|
                  else if (r.getOutputStream () != null)
 | 
						|
                    out = new XMLWriter (r.getOutputStream ());
 | 
						|
                  else if (r.getSystemId () != null)
 | 
						|
                    out = new XMLWriter (
 | 
						|
                                         getOutputStream (r.getSystemId ()));
 | 
						|
                  else
 | 
						|
                    throw new IllegalArgumentException (
 | 
						|
                                                        "bad StreamResult");
 | 
						|
                }
 | 
						|
              catch (IOException e)
 | 
						|
                {
 | 
						|
                  e.printStackTrace ();
 | 
						|
                  // on jdk 1.4, pass the root cause ...
 | 
						|
                  throw new IllegalArgumentException (e.getMessage ());
 | 
						|
                }
 | 
						|
 | 
						|
              // out.setExpandingEntities (true);
 | 
						|
              // out.setPrettyPrinting (true);
 | 
						|
              // out.setXhtml (true);
 | 
						|
 | 
						|
              setContentHandler (out);
 | 
						|
              setProperty (LEXICAL_HANDLER, out);
 | 
						|
              // save DTD info, if any; why not?
 | 
						|
              setDTDHandler (out);
 | 
						|
              setProperty (DECL_HANDLER, out);
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
      catch (SAXException e)
 | 
						|
        {
 | 
						|
          // SAXNotSupportedException or SAXNotRecognizedException:
 | 
						|
          // "can't happen" ... but SAXException for DOM build probs
 | 
						|
          // could happen, so ...
 | 
						|
          // on jdk 1.4, pass the root cause ...
 | 
						|
          throw new IllegalArgumentException (e.getMessage ());
 | 
						|
        }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  // an interface that adds no value
 | 
						|
  static class LocatorAdapter
 | 
						|
    extends LocatorImpl
 | 
						|
    implements SourceLocator
 | 
						|
  {
 | 
						|
 | 
						|
    LocatorAdapter (SAXParseException e)
 | 
						|
    {
 | 
						|
      setSystemId (e.getSystemId ());
 | 
						|
      setPublicId (e.getPublicId ());
 | 
						|
      setLineNumber (e.getLineNumber ());
 | 
						|
      setColumnNumber (e.getColumnNumber ());
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  // another interface that adds no value
 | 
						|
  static class ListenerAdapter
 | 
						|
    implements ErrorHandler
 | 
						|
  {
 | 
						|
 | 
						|
    NullTransformer     transformer;
 | 
						|
 | 
						|
    ListenerAdapter (NullTransformer t)
 | 
						|
    {
 | 
						|
      transformer = t;
 | 
						|
    }
 | 
						|
 | 
						|
    private TransformerException map (SAXParseException e)
 | 
						|
    {
 | 
						|
      return new TransformerException (
 | 
						|
                                       e.getMessage (),
 | 
						|
                                       new LocatorAdapter (e),
 | 
						|
                                       e);
 | 
						|
    }
 | 
						|
 | 
						|
    public void error (SAXParseException e)
 | 
						|
      throws SAXParseException
 | 
						|
    {
 | 
						|
      try
 | 
						|
        {
 | 
						|
          if (transformer.errListener != null)
 | 
						|
            transformer.errListener.error (map (e));
 | 
						|
        }
 | 
						|
      catch (TransformerException ex)
 | 
						|
        {
 | 
						|
          transformer.ex = ex;
 | 
						|
          throw e;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public void fatalError (SAXParseException e)
 | 
						|
      throws SAXParseException
 | 
						|
    {
 | 
						|
      try
 | 
						|
        {
 | 
						|
          if (transformer.errListener != null)
 | 
						|
            transformer.errListener.fatalError (map (e));
 | 
						|
          else
 | 
						|
            throw map (e);
 | 
						|
        } catch (TransformerException ex) {
 | 
						|
          transformer.ex = ex;
 | 
						|
          throw e;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public void warning (SAXParseException e)
 | 
						|
      throws SAXParseException
 | 
						|
    {
 | 
						|
      try
 | 
						|
        {
 | 
						|
          if (transformer.errListener != null)
 | 
						|
            transformer.errListener.warning (map (e));
 | 
						|
        }
 | 
						|
      catch (TransformerException ex)
 | 
						|
        {
 | 
						|
          transformer.ex = ex;
 | 
						|
          throw e;
 | 
						|
        }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  static class NullTransformer
 | 
						|
    extends Transformer
 | 
						|
  {
 | 
						|
 | 
						|
    private URIResolver         uriResolver;
 | 
						|
    private Properties          props = new Properties ();
 | 
						|
    private Hashtable           params = new Hashtable (7);
 | 
						|
 | 
						|
    ErrorListener                       errListener = null;
 | 
						|
    TransformerException                ex = null;
 | 
						|
    NullHandler                 handler;
 | 
						|
 | 
						|
    NullTransformer ()
 | 
						|
    {
 | 
						|
      super ();
 | 
						|
      handler = new NullHandler (this);
 | 
						|
    }
 | 
						|
 | 
						|
    public ErrorListener getErrorListener ()
 | 
						|
    {
 | 
						|
      return errListener;
 | 
						|
    }
 | 
						|
 | 
						|
    public void setErrorListener (ErrorListener e)
 | 
						|
    {
 | 
						|
      errListener = e;
 | 
						|
    }
 | 
						|
 | 
						|
    public URIResolver getURIResolver ()
 | 
						|
    {
 | 
						|
      return uriResolver;
 | 
						|
    }
 | 
						|
 | 
						|
    public void setURIResolver (URIResolver u)
 | 
						|
    {
 | 
						|
      uriResolver = u;
 | 
						|
    }
 | 
						|
 | 
						|
    public void setOutputProperties (Properties p)
 | 
						|
    {
 | 
						|
      props = (Properties) p.clone ();
 | 
						|
    }
 | 
						|
 | 
						|
    public Properties getOutputProperties ()
 | 
						|
    {
 | 
						|
      return (Properties) props.clone ();
 | 
						|
    }
 | 
						|
 | 
						|
    public void setOutputProperty (String name, String value)
 | 
						|
    {
 | 
						|
      props.setProperty (name, value);
 | 
						|
    }
 | 
						|
 | 
						|
    public String getOutputProperty (String name)
 | 
						|
    {
 | 
						|
      return props.getProperty (name);
 | 
						|
    }
 | 
						|
 | 
						|
    public void clearParameters ()
 | 
						|
    {
 | 
						|
      params.clear ();
 | 
						|
    }
 | 
						|
 | 
						|
    public void setParameter (String name, Object value)
 | 
						|
    {
 | 
						|
      props.put (name, value);
 | 
						|
    }
 | 
						|
 | 
						|
    public Object getParameter (String name)
 | 
						|
    {
 | 
						|
      return props.get (name);
 | 
						|
    }
 | 
						|
 | 
						|
    public void transform (Source in, Result out)
 | 
						|
      throws TransformerException
 | 
						|
    {
 | 
						|
      try
 | 
						|
        {
 | 
						|
          XMLReader             producer;
 | 
						|
          InputSource           input;
 | 
						|
 | 
						|
          // Input from DOM?
 | 
						|
          if (in instanceof DOMSource)
 | 
						|
            {
 | 
						|
              DOMSource source = (DOMSource) in;
 | 
						|
 | 
						|
              if (source.getNode () == null)
 | 
						|
                throw new IllegalArgumentException ("no DOM node");
 | 
						|
              producer = new DomParser (source.getNode ());
 | 
						|
              input = null;
 | 
						|
 | 
						|
              // Input from SAX?
 | 
						|
            }
 | 
						|
          else if (in instanceof SAXSource)
 | 
						|
            {
 | 
						|
              SAXSource source = (SAXSource) in;
 | 
						|
 | 
						|
              producer = source.getXMLReader ();
 | 
						|
              if (producer == null)
 | 
						|
                producer = XMLReaderFactory.createXMLReader ();
 | 
						|
 | 
						|
              input = source.getInputSource ();
 | 
						|
              if (input == null)
 | 
						|
                {
 | 
						|
                  if (source.getSystemId () != null)
 | 
						|
                    input = new InputSource (source.getSystemId ());
 | 
						|
                  else
 | 
						|
                    throw new IllegalArgumentException (
 | 
						|
                                                        "missing SAX input");
 | 
						|
                }
 | 
						|
 | 
						|
              // Input from a stream or something?
 | 
						|
            }
 | 
						|
          else
 | 
						|
            {
 | 
						|
              producer = XMLReaderFactory.createXMLReader ();
 | 
						|
              input = SAXSource.sourceToInputSource (in);
 | 
						|
              if (input == null)
 | 
						|
                throw new IllegalArgumentException ("missing input");
 | 
						|
            }
 | 
						|
 | 
						|
          // preserve original namespace prefixes
 | 
						|
          try
 | 
						|
            {
 | 
						|
              producer.setFeature(EventFilter.FEATURE_URI +
 | 
						|
                                  "namespace-prefixes",
 | 
						|
                                  true);
 | 
						|
            }
 | 
						|
          catch (Exception e)
 | 
						|
            {
 | 
						|
              /* ignore */
 | 
						|
              // FIXME if we couldn't, "NsFix" stage before the output ..
 | 
						|
            }
 | 
						|
 | 
						|
          // arrange the output
 | 
						|
          handler.setResult (out);
 | 
						|
          EventFilter.bind (producer, handler);
 | 
						|
 | 
						|
          // then parse ... single element pipeline
 | 
						|
          producer.parse (input);
 | 
						|
 | 
						|
        }
 | 
						|
      catch (IOException e)
 | 
						|
        {
 | 
						|
          throw new TransformerException ("transform failed", e);
 | 
						|
 | 
						|
        }
 | 
						|
      catch (SAXException e)
 | 
						|
        {
 | 
						|
          if (ex == null && ex.getCause () == e)
 | 
						|
            throw ex;
 | 
						|
          else
 | 
						|
            throw new TransformerException ("transform failed", e);
 | 
						|
 | 
						|
        }
 | 
						|
      finally
 | 
						|
        {
 | 
						|
          ex = null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
}
 |