morten      01/08/14 02:16:45

  Modified:    java/src/org/apache/xalan/xsltc/cmdline Transform.java
               java/src/org/apache/xalan/xsltc/compiler Output.java
               java/src/org/apache/xalan/xsltc/runtime DefaultRun.java
                        DefaultSAXOutputHandler.java TextOutput.java
               java/src/org/apache/xalan/xsltc/trax TransformerImpl.java
  Log:
  Implemented support for the doctype-system and doctype-public attributes
  of the <xsl:output/> element. The translet post-processor (TextOutput) can
  now be instanciated with a ContentHandler and an optional LexicalHandler.
  The LexicalHandler will receive notofications of the DOCTYPE declaration.
  The default SAX output handler now implements both ContentHandler and
  LexicalHandler. The LexicalHandler only handles the startDTD() method,
  by outputting the DOCTYPE declaration, and all other methods are empty.
  The trax.Transformer implementation has also been updated to use the
  LexicalHandler, but I still have not found any way in which a SAX client
  can set the LexicalHandler.
  PR:           bugzilla 1504
  Obtained from:        n/a
  Submitted by: [EMAIL PROTECTED]
  Reviewed by:  [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.4       +11 -5     
xml-xalan/java/src/org/apache/xalan/xsltc/cmdline/Transform.java
  
  Index: Transform.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/cmdline/Transform.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Transform.java    2001/07/20 18:52:09     1.3
  +++ Transform.java    2001/08/14 09:16:45     1.4
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: Transform.java,v 1.3 2001/07/20 18:52:09 amiro Exp $
  + * @(#)$Id: Transform.java,v 1.4 2001/08/14 09:16:45 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -77,6 +77,8 @@
   
   import org.xml.sax.XMLReader;
   import org.xml.sax.SAXException;
  +import org.xml.sax.ContentHandler;
  +import org.xml.sax.ext.LexicalHandler;
   
   import org.apache.xalan.xsltc.DOM;
   import org.apache.xalan.xsltc.Translet;
  @@ -169,10 +171,14 @@
            // Transform the document
            String encoding = _translet._encoding;
   
  -         //TextOutput textOutput = new TextOutput(System.out, encoding);
  -         DefaultSAXOutputHandler saxHandler = new 
  -             DefaultSAXOutputHandler(System.out, encoding);
  -         TextOutput textOutput = new TextOutput(saxHandler);
  +         // Create our default SAX/DTD handler
  +         DefaultSAXOutputHandler saxHandler =
  +             new DefaultSAXOutputHandler(System.out, encoding);
  +         // Create a translet output handler and plug in the SAX/DTD handler
  +         TextOutput textOutput =
  +             new TextOutput((ContentHandler)saxHandler,
  +                            (LexicalHandler)saxHandler, encoding);
  +         // Transform and pass output to the translet output handler
            translet.transform(dom, textOutput);
   
            if (_debug) {
  
  
  
  1.6       +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Output.java
  
  Index: Output.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Output.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Output.java       2001/07/18 15:36:01     1.5
  +++ Output.java       2001/08/14 09:16:45     1.6
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: Output.java,v 1.5 2001/07/18 15:36:01 morten Exp $
  + * @(#)$Id: Output.java,v 1.6 2001/08/14 09:16:45 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -233,7 +233,7 @@
        }
   
        // Set system/public doctype only if both are set
  -     if ((_doctypePublic != null) && (_doctypeSystem != null)) {
  +     if (_doctypeSystem != null) {
            field = cpg.addFieldref(TRANSLET_CLASS,"_doctypeSystem",STRING_SIG);
            il.append(DUP);
            il.append(new PUSH(cpg, _doctypeSystem));
  
  
  
  1.12      +8 -4      
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/DefaultRun.java
  
  Index: DefaultRun.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/DefaultRun.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- DefaultRun.java   2001/07/20 18:52:09     1.11
  +++ DefaultRun.java   2001/08/14 09:16:45     1.12
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: DefaultRun.java,v 1.11 2001/07/20 18:52:09 amiro Exp $
  + * @(#)$Id: DefaultRun.java,v 1.12 2001/08/14 09:16:45 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -77,6 +77,8 @@
   
   import org.xml.sax.XMLReader;
   import org.xml.sax.SAXException;
  +import org.xml.sax.ContentHandler;
  +import org.xml.sax.ext.LexicalHandler;
   
   import org.apache.xalan.xsltc.*;
   import org.apache.xalan.xsltc.dom.DOMImpl;
  @@ -167,9 +169,11 @@
            // Transform the document
            String encoding = _translet._encoding;
   
  -         DefaultSAXOutputHandler saxHandler = new 
  -             DefaultSAXOutputHandler(System.out, encoding);
  -         TextOutput textOutput = new TextOutput(saxHandler);
  +         DefaultSAXOutputHandler saxHandler =
  +             new DefaultSAXOutputHandler(System.out, encoding);
  +         TextOutput textOutput =
  +             new TextOutput((ContentHandler)saxHandler,
  +                            (LexicalHandler)saxHandler, encoding);
            translet.transform(dom, textOutput);
   
            if (_debug) {
  
  
  
  1.13      +41 -18    
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/DefaultSAXOutputHandler.java
  
  Index: DefaultSAXOutputHandler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/DefaultSAXOutputHandler.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- DefaultSAXOutputHandler.java      2001/08/13 15:25:56     1.12
  +++ DefaultSAXOutputHandler.java      2001/08/14 09:16:45     1.13
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: DefaultSAXOutputHandler.java,v 1.12 2001/08/13 15:25:56 morten 
Exp $
  + * @(#)$Id: DefaultSAXOutputHandler.java,v 1.13 2001/08/14 09:16:45 morten 
Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -74,9 +74,9 @@
   import org.xml.sax.Locator;
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
  -import org.xml.sax.ext.DeclHandler;
  +import org.xml.sax.ext.LexicalHandler;
   
  -public class DefaultSAXOutputHandler implements ContentHandler, DeclHandler {
  +public class DefaultSAXOutputHandler implements ContentHandler, 
LexicalHandler {
   
       // The output writer
       private Writer _writer;
  @@ -425,22 +425,45 @@
        // Do nothing
       }
   
  -    public void attributeDecl(java.lang.String eName, java.lang.String 
aName, java.lang.String type, java.lang.String valueDefault, java.lang.String 
value) {
  -
  -    }
  -
  -    public void elementDecl(java.lang.String name, java.lang.String model) {
  -
  -    }
  -
  -    public void externalEntityDecl(java.lang.String name, java.lang.String 
publicId, java.lang.String systemId) {
  -
  -    }
  -
  -    public void internalEntityDecl(java.lang.String name, java.lang.String 
value) {
  -
  +    // The above are ignored methods of the org.xml.sax.ext.LexicalHandler 
intf.
  +    public void startCDATA() { }
  +    public void endCDATA() { }
  +    public void comment(char[] ch, int start, int length) { }
  +    public void startEntity(java.lang.String name) { }
  +    public void endDTD() { }
  +    public void endEntity(String name) { }
  +
  +    /**
  +     * This method is part of the LexicalHandler interface. It is only used 
to
  +     * pass DOCTYPE declarations (based on the doctype-system/public 
attributes
  +     * in the <xsl:output> element) to the output handler.
  +     * @param name     The document type name (name of first element)
  +     * @param publicId <xsl:output doctype-public="..."/>
  +     * @param systemId <xsl:output doctype-system="..."/>
  +     * @throws SAXException Whenever
  +     */
  +    public void startDTD(String name, String publicId, String systemId)
  +     throws SAXException {
  +     try {
  +         StringBuffer buf = new StringBuffer("<!DOCTYPE ");
  +         buf.append(name);
  +         if (publicId == null) {
  +             buf.append(" SYSTEM ");
  +         }
  +         else {
  +             buf.append(" PUBLIC \"");
  +             buf.append(publicId);
  +             buf.append("\" ");
  +         }
  +         buf.append('\"');
  +         buf.append(systemId);
  +         buf.append("\">\n");
  +         _writer.write(buf.toString());
  +     }
  +        catch (IOException e) {
  +            throw new SAXException(e);
  +        }
       }
  -    
   
       /**
        * Adds a newline in the output stream and indents to correct level
  
  
  
  1.19      +8 -9      
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/TextOutput.java
  
  Index: TextOutput.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/TextOutput.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- TextOutput.java   2001/08/13 15:25:56     1.18
  +++ TextOutput.java   2001/08/14 09:16:45     1.19
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: TextOutput.java,v 1.18 2001/08/13 15:25:56 morten Exp $
  + * @(#)$Id: TextOutput.java,v 1.19 2001/08/14 09:16:45 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -69,7 +69,7 @@
   
   import org.xml.sax.ContentHandler;
   import org.xml.sax.SAXException;
  -import org.xml.sax.ext.DeclHandler;
  +import org.xml.sax.ext.LexicalHandler;
   
   import org.apache.xalan.xsltc.*;
   
  @@ -136,7 +136,7 @@
   
       // Reference to the SAX2 handler that consumes this handler's output
       private ContentHandler _saxHandler;
  -    private DeclHandler    _declHandler;
  +    private LexicalHandler _lexHandler;
   
       /**
        * Creates a new translet output post-processor
  @@ -170,11 +170,10 @@
        * @param encoding The default encoding to use (set in <xsl:output>)
        * @throws IOException
        */
  -    public TextOutput(ContentHandler saxHandler, DeclHandler declHandler,
  -                   String encoding)
  +    public TextOutput(ContentHandler sax, LexicalHandler lex, String 
encoding)
        throws IOException {
  -        _saxHandler = saxHandler;
  -     _declHandler = declHandler;
  +        _saxHandler = sax;
  +     _lexHandler = lex;
           init();
        _encoding = encoding;
       }
  @@ -479,8 +478,8 @@
            }
   
            // Handle document type declaration (for first element only)
  -         if ((_doctypeSystem != null) && (_declHandler != null)) {
  -             // _declHandler.something(something);
  +         if ((_doctypeSystem != null) && (_lexHandler != null)) {
  +             _lexHandler.startDTD(elementName,_doctypePublic,_doctypeSystem);
                _doctypeSystem = null;
            }
   
  
  
  
  1.13      +21 -10    
xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java
  
  Index: TransformerImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- TransformerImpl.java      2001/08/02 13:25:11     1.12
  +++ TransformerImpl.java      2001/08/14 09:16:45     1.13
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: TransformerImpl.java,v 1.12 2001/08/02 13:25:11 morten Exp $
  + * @(#)$Id: TransformerImpl.java,v 1.13 2001/08/14 09:16:45 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -70,11 +70,13 @@
   import java.io.OutputStream;
   import java.io.FileOutputStream;
   import java.io.FileNotFoundException;
  +import java.io.IOException;
   
   import java.net.URL;
   import java.net.URLConnection;
   import java.net.MalformedURLException;
   import java.net.UnknownHostException;
  +import java.net.UnknownServiceException;
   
   import java.lang.IllegalArgumentException;
   import java.util.Enumeration;
  @@ -83,6 +85,7 @@
   import org.xml.sax.XMLReader;
   import org.xml.sax.ContentHandler;
   import org.xml.sax.InputSource;
  +import org.xml.sax.ext.LexicalHandler;
   
   import org.w3c.dom.Document;
   
  @@ -237,7 +240,7 @@
            }
        }
        // If we cannot write to the location specified by the SystemId
  -     catch (java.net.UnknownServiceException e) {
  +     catch (UnknownServiceException e) {
            throw new TransformerException(e);
        }
        // If we cannot create a SAX2DOM adapter
  @@ -246,7 +249,7 @@
                "SAX2DOM adapter could not be created, " + e.getMessage());
        }
        // If we cannot create the file specified by the SystemId
  -     catch (java.io.IOException e) {
  +     catch (IOException e) {
            throw new TransformerException(e);
        }
       }
  @@ -367,15 +370,24 @@
       /**
        * Internal transformation method - uses the internal APIs of XSLTC
        */
  -    private void transform(Source src, ContentHandler handler, String 
encoding)
  +    private void transform(Source src, ContentHandler sax, String encoding)
        throws TransformerException {
        try {
            // Build an iternal DOMImpl from the TrAX Source
            DOMImpl dom = getDOM(src, 0);
  +
            // Pass output properties to the translet
            setOutputProperties(_translet, _properties);
  -         // Transform the document
  -         _translet.transform(dom, new TextOutput(handler, _encoding));
  +         
  +         // This handler will post-process the translet output
  +         TextOutput handler;
  +
  +         // Check if the ContentHandler also implements LexicalHandler
  +         if (sax instanceof LexicalHandler)
  +             handler = new TextOutput(sax, (LexicalHandler)sax, encoding);
  +         else
  +             handler = new TextOutput(sax, encoding);
  +         _translet.transform(dom, handler);
        }
        catch (TransletException e) {
            if (_errorListener != null)
  @@ -496,12 +508,11 @@
   
        String value = null;
   
  -     // First check if the property is overridden in this Transformer
  +     // Level1: Check if the property is overridden in this Transformer
        if (_properties != null) value = _properties.getProperty(name);
   
  -     // Then check if it is set in the translet
  +     // Level2: Check if the property value is set in the translet
        if ((value == null) && (_translet != null)) {
  -         // TODO: get propertie value from translet
            if (name.equals(OutputKeys.ENCODING))
                value = _translet._encoding;
            else if (name.equals(OutputKeys.METHOD))
  @@ -524,7 +535,7 @@
                value = _translet._version;
        }
   
  -     // Then return the default values
  +     // Level3: Return the default property value
        if (value == null) {
            if (name.equals(OutputKeys.ENCODING))
                value = "utf-8";
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to