You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ec...@apache.org on 2003/09/01 02:17:35 UTC

cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler JspDocumentParser.java

ecarmich    2003/08/31 17:17:35

  Modified:    jasper2/src/share/org/apache/jasper/compiler
                        JspDocumentParser.java
  Log:
  Expand wildcard imports
  Remove unused imports
  Remove tabs
  
  Revision  Changes    Path
  1.69      +874 -644  jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspDocumentParser.java
  
  Index: JspDocumentParser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspDocumentParser.java,v
  retrieving revision 1.68
  retrieving revision 1.69
  diff -u -r1.68 -r1.69
  --- JspDocumentParser.java	29 Aug 2003 19:31:22 -0000	1.68
  +++ JspDocumentParser.java	1 Sep 2003 00:17:35 -0000	1.69
  @@ -57,22 +57,33 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - */ 
  + */
   package org.apache.jasper.compiler;
   
  -import java.io.*;
  -import java.util.*;
  +import java.io.CharArrayWriter;
  +import java.io.FileNotFoundException;
  +import java.io.IOException;
  +import java.util.Iterator;
  +import java.util.List;
   import java.util.jar.JarFile;
  -import javax.servlet.jsp.tagext.*;
  -import javax.xml.parsers.SAXParserFactory;
  -import javax.xml.parsers.ParserConfigurationException;
  +
  +import javax.servlet.jsp.tagext.TagFileInfo;
  +import javax.servlet.jsp.tagext.TagInfo;
  +import javax.servlet.jsp.tagext.TagLibraryInfo;
   import javax.xml.parsers.SAXParser;
  -import org.xml.sax.*;
  -import org.xml.sax.ext.LexicalHandler;
  -import org.xml.sax.helpers.DefaultHandler;
  -import org.xml.sax.helpers.AttributesImpl;
  +import javax.xml.parsers.SAXParserFactory;
  +
   import org.apache.jasper.JasperException;
   import org.apache.jasper.JspCompilationContext;
  +import org.xml.sax.Attributes;
  +import org.xml.sax.InputSource;
  +import org.xml.sax.Locator;
  +import org.xml.sax.SAXException;
  +import org.xml.sax.SAXParseException;
  +import org.xml.sax.XMLReader;
  +import org.xml.sax.ext.LexicalHandler;
  +import org.xml.sax.helpers.AttributesImpl;
  +import org.xml.sax.helpers.DefaultHandler;
   
   /**
    * Class implementing a parser for a JSP document, that is, a JSP page in XML
  @@ -81,19 +92,21 @@
    * @author Jan Luehe
    */
   
  -class JspDocumentParser extends DefaultHandler
  -            implements LexicalHandler, TagConstants {
  +class JspDocumentParser
  +    extends DefaultHandler
  +    implements LexicalHandler, TagConstants {
   
       private static final String JSP_VERSION = "version";
  -    private static final String LEXICAL_HANDLER_PROPERTY
  -	= "http://xml.org/sax/properties/lexical-handler";
  +    private static final String LEXICAL_HANDLER_PROPERTY =
  +        "http://xml.org/sax/properties/lexical-handler";
   
  -    private static final EnableDTDValidationException ENABLE_DTD_VALIDATION_EXCEPTION
  -        = new EnableDTDValidationException("jsp.error.enable_dtd_validation",
  -                                           null);
  +    private static final EnableDTDValidationException ENABLE_DTD_VALIDATION_EXCEPTION =
  +        new EnableDTDValidationException(
  +            "jsp.error.enable_dtd_validation",
  +            null);
   
       private ParserController parserController;
  -    private JspCompilationContext ctxt;    
  +    private JspCompilationContext ctxt;
       private PageInfo pageInfo;
       private String path;
   
  @@ -115,11 +128,12 @@
       /*
        * Constructor
        */
  -    public JspDocumentParser(ParserController pc,
  -			     String path,
  -			     JarFile jarFile,
  -			     boolean isTagFile,
  -			     boolean directivesOnly) {
  +    public JspDocumentParser(
  +        ParserController pc,
  +        String path,
  +        JarFile jarFile,
  +        boolean isTagFile,
  +        boolean directivesOnly) {
           this.parserController = pc;
           this.ctxt = pc.getJspCompilationContext();
           this.pageInfo = pc.getCompiler().getPageInfo();
  @@ -135,77 +149,82 @@
        *
        * @throws JasperException
        */
  -    public static Node.Nodes parse(ParserController pc,
  -				   String path,
  -				   JarFile jarFile,
  -				   Node parent,
  -				   boolean isTagFile,
  -				   boolean directivesOnly,
  -				   String pageEnc,
  -				   String jspConfigPageEnc,
  -				   boolean isEncodingSpecifiedInProlog)
  -	        throws JasperException {
  -
  -	JspDocumentParser jspDocParser = new JspDocumentParser(pc,
  -                                                               path,
  -							       jarFile,
  -							       isTagFile,
  -							       directivesOnly);
  -	Node.Nodes pageNodes = null;
  -
  -	try {
  -
  -	    // Create dummy root and initialize it with given page encodings
  -	    Node.Root dummyRoot = new Node.Root(null, parent, true);
  -	    dummyRoot.setPageEncoding(pageEnc);
  -	    dummyRoot.setJspConfigPageEncoding(jspConfigPageEnc);
  -	    dummyRoot.setIsEncodingSpecifiedInProlog(isEncodingSpecifiedInProlog);
  -	    jspDocParser.current = dummyRoot;
  -	    if (parent == null) {
  -		jspDocParser.addInclude(dummyRoot,
  -			jspDocParser.pageInfo.getIncludePrelude());
  -	    } else {
  -		jspDocParser.isTop = false;
  -	    }
  +    public static Node.Nodes parse(
  +        ParserController pc,
  +        String path,
  +        JarFile jarFile,
  +        Node parent,
  +        boolean isTagFile,
  +        boolean directivesOnly,
  +        String pageEnc,
  +        String jspConfigPageEnc,
  +        boolean isEncodingSpecifiedInProlog)
  +        throws JasperException {
  +
  +        JspDocumentParser jspDocParser =
  +            new JspDocumentParser(pc, path, jarFile, isTagFile, directivesOnly);
  +        Node.Nodes pageNodes = null;
  +
  +        try {
  +
  +            // Create dummy root and initialize it with given page encodings
  +            Node.Root dummyRoot = new Node.Root(null, parent, true);
  +            dummyRoot.setPageEncoding(pageEnc);
  +            dummyRoot.setJspConfigPageEncoding(jspConfigPageEnc);
  +            dummyRoot.setIsEncodingSpecifiedInProlog(
  +                isEncodingSpecifiedInProlog);
  +            jspDocParser.current = dummyRoot;
  +            if (parent == null) {
  +                jspDocParser.addInclude(
  +                    dummyRoot,
  +                    jspDocParser.pageInfo.getIncludePrelude());
  +            } else {
  +                jspDocParser.isTop = false;
  +            }
   
  -	    // Parse the input
  +            // Parse the input
               SAXParser saxParser = getSAXParser(false, jspDocParser);
               try {
  -                saxParser.parse(jspDocParser.getInputSource(
  -                                                        path,
  -                                                        jarFile,
  -                                                        jspDocParser.ctxt,
  -                                                        jspDocParser.err),
  -                                jspDocParser);
  +                saxParser.parse(
  +                    jspDocParser.getInputSource(
  +                        path,
  +                        jarFile,
  +                        jspDocParser.ctxt,
  +                        jspDocParser.err),
  +                    jspDocParser);
               } catch (EnableDTDValidationException e) {
                   saxParser = getSAXParser(true, jspDocParser);
                   jspDocParser.isValidating = true;
  -                saxParser.parse(jspDocParser.getInputSource(
  -                                                        path,
  -                                                        jarFile,
  -                                                        jspDocParser.ctxt,
  -                                                        jspDocParser.err),
  -                                jspDocParser);
  -            }
  -
  -	    if (parent == null) {
  -		jspDocParser.addInclude(dummyRoot,
  -			jspDocParser.pageInfo.getIncludeCoda());
  -	    }
  -
  -	    // Create Node.Nodes from dummy root
  -	    pageNodes = new Node.Nodes(dummyRoot);
  -
  -	} catch (IOException ioe) {
  -	    jspDocParser.err.jspError("jsp.error.data.file.read", path, ioe);
  -	} catch (Exception e) {
  -	    jspDocParser.err.jspError(
  -                new Mark(path, ((SAXParseException) e).getLineNumber(),
  -                         ((SAXParseException) e).getColumnNumber()),
  +                saxParser.parse(
  +                    jspDocParser.getInputSource(
  +                        path,
  +                        jarFile,
  +                        jspDocParser.ctxt,
  +                        jspDocParser.err),
  +                    jspDocParser);
  +            }
  +
  +            if (parent == null) {
  +                jspDocParser.addInclude(
  +                    dummyRoot,
  +                    jspDocParser.pageInfo.getIncludeCoda());
  +            }
  +
  +            // Create Node.Nodes from dummy root
  +            pageNodes = new Node.Nodes(dummyRoot);
  +
  +        } catch (IOException ioe) {
  +            jspDocParser.err.jspError("jsp.error.data.file.read", path, ioe);
  +        } catch (Exception e) {
  +            jspDocParser.err.jspError(
  +                new Mark(
  +                    path,
  +                    ((SAXParseException)e).getLineNumber(),
  +                    ((SAXParseException)e).getColumnNumber()),
                   e.getMessage());
  -	}
  +        }
   
  -	return pageNodes;
  +        return pageNodes;
       }
   
       /*
  @@ -215,20 +234,20 @@
        * subelements of the jsp-config element in web.xml
        */
       private void addInclude(Node parent, List files) throws SAXException {
  -	if (files != null) {
  -	    Iterator iter = files.iterator();
  -	    while (iter.hasNext()) {
  -		String file = (String) iter.next();
  -		AttributesImpl attrs = new AttributesImpl();
  -		attrs.addAttribute("", "file", "file", "CDATA", file);
  -
  -		// Create a dummy Include directive node
  -		Node includeDir = new Node.IncludeDirective(attrs, 
  -							   null, // XXX
  -							   parent);
  -		processIncludeDirective(file, includeDir);
  -	    }
  -	}
  +        if (files != null) {
  +            Iterator iter = files.iterator();
  +            while (iter.hasNext()) {
  +                String file = (String)iter.next();
  +                AttributesImpl attrs = new AttributesImpl();
  +                attrs.addAttribute("", "file", "file", "CDATA", file);
  +
  +                // Create a dummy Include directive node
  +                    Node includeDir =
  +                        new Node.IncludeDirective(attrs, null, // XXX
  +    parent);
  +                processIncludeDirective(file, includeDir);
  +            }
  +        }
       }
   
       /*
  @@ -244,100 +263,123 @@
        * corresponding TagLibraryInfo object is added to the set of custom
        * tag libraries.
        */
  -    public void startElement(String uri,
  -			     String localName,
  -			     String qName,
  -			     Attributes attrs) throws SAXException {
  -
  -	AttributesImpl taglibAttrs = null;
  -	AttributesImpl nonTaglibAttrs = null;
  -	AttributesImpl nonTaglibXmlnsAttrs = null;
  -
  -	checkPrefixes(uri, qName, attrs);
  -
  -	if (directivesOnly && !localName.startsWith(DIRECTIVE_ACTION)) {
  -	    return;
  -	}
  -
  -	// jsp:text must not have any subelements
  -	if (TEXT_ACTION.equals(current.getLocalName())) {
  -	    throw new SAXParseException(
  -	            Localizer.getMessage("jsp.error.text.has_subelement"),
  -		    locator);
  -	}
  -
  -	Mark start = new Mark(path, locator.getLineNumber(),
  -			      locator.getColumnNumber());
  -
  -	if (attrs != null) {
  -	    /*
  -	     * Notice that due to a bug in the underlying SAX parser, the
  -	     * attributes must be enumerated in descending order. 
  -	     */
  -	    boolean isTaglib = false;
  -	    for (int i=attrs.getLength()-1; i>=0; i--) {
  -		isTaglib = false;
  -		String attrQName = attrs.getQName(i);
  -		if (!attrQName.startsWith("xmlns")) {
  -		    if (nonTaglibAttrs == null) {
  -			nonTaglibAttrs = new AttributesImpl();
  -		    }
  -		    nonTaglibAttrs.addAttribute(attrs.getURI(i),
  -						attrs.getLocalName(i),
  -						attrs.getQName(i),
  -						attrs.getType(i),
  -						attrs.getValue(i));
  -		} else {
  -		    if (attrQName.startsWith("xmlns:jsp")) {
  -			isTaglib = true;
  -		    } else {
  -			String attrUri = attrs.getValue(i);
  -			// TaglibInfo for this uri already established in
  -			// startPrefixMapping
  -			isTaglib = pageInfo.hasTaglib(attrUri);
  -		    }
  -		    if (isTaglib) {
  -			if (taglibAttrs == null) {
  -			    taglibAttrs = new AttributesImpl();
  -			}
  -			taglibAttrs.addAttribute(attrs.getURI(i),
  -						 attrs.getLocalName(i),
  -						 attrs.getQName(i),
  -						 attrs.getType(i),
  -						 attrs.getValue(i));
  -		    } else {
  -			if (nonTaglibXmlnsAttrs == null) {
  -			    nonTaglibXmlnsAttrs = new AttributesImpl();
  -			}
  -			nonTaglibXmlnsAttrs.addAttribute(attrs.getURI(i),
  -							 attrs.getLocalName(i),
  -							 attrs.getQName(i),
  -							 attrs.getType(i),
  -							 attrs.getValue(i));
  -		    }
  -		}
  -	    }
  -	}
  -
  -	Node node = null;
  -
  -	if ("http://java.sun.com/JSP/Page".equals(uri)) {
  -	    node = parseStandardAction(qName, localName, nonTaglibAttrs,
  -				       nonTaglibXmlnsAttrs, taglibAttrs,
  -				       start, current);
  -	} else {
  -	    node = parseCustomAction(qName, localName, uri, nonTaglibAttrs,
  -				     nonTaglibXmlnsAttrs, taglibAttrs, start,
  -				     current);
  -	    if (node == null) {
  -		node = new Node.UninterpretedTag(qName, localName,
  -						 nonTaglibAttrs,
  -						 nonTaglibXmlnsAttrs,
  -						 taglibAttrs, start, current);
  -	    }
  -	}
  +    public void startElement(
  +        String uri,
  +        String localName,
  +        String qName,
  +        Attributes attrs)
  +        throws SAXException {
  +
  +        AttributesImpl taglibAttrs = null;
  +        AttributesImpl nonTaglibAttrs = null;
  +        AttributesImpl nonTaglibXmlnsAttrs = null;
  +
  +        checkPrefixes(uri, qName, attrs);
  +
  +        if (directivesOnly && !localName.startsWith(DIRECTIVE_ACTION)) {
  +            return;
  +        }
  +
  +        // jsp:text must not have any subelements
  +        if (TEXT_ACTION.equals(current.getLocalName())) {
  +            throw new SAXParseException(
  +                Localizer.getMessage("jsp.error.text.has_subelement"),
  +                locator);
  +        }
  +
  +        Mark start =
  +            new Mark(path, locator.getLineNumber(), locator.getColumnNumber());
  +
  +        if (attrs != null) {
  +            /*
  +             * Notice that due to a bug in the underlying SAX parser, the
  +             * attributes must be enumerated in descending order. 
  +             */
  +            boolean isTaglib = false;
  +            for (int i = attrs.getLength() - 1; i >= 0; i--) {
  +                isTaglib = false;
  +                String attrQName = attrs.getQName(i);
  +                if (!attrQName.startsWith("xmlns")) {
  +                    if (nonTaglibAttrs == null) {
  +                        nonTaglibAttrs = new AttributesImpl();
  +                    }
  +                    nonTaglibAttrs.addAttribute(
  +                        attrs.getURI(i),
  +                        attrs.getLocalName(i),
  +                        attrs.getQName(i),
  +                        attrs.getType(i),
  +                        attrs.getValue(i));
  +                } else {
  +                    if (attrQName.startsWith("xmlns:jsp")) {
  +                        isTaglib = true;
  +                    } else {
  +                        String attrUri = attrs.getValue(i);
  +                        // TaglibInfo for this uri already established in
  +                        // startPrefixMapping
  +                        isTaglib = pageInfo.hasTaglib(attrUri);
  +                    }
  +                    if (isTaglib) {
  +                        if (taglibAttrs == null) {
  +                            taglibAttrs = new AttributesImpl();
  +                        }
  +                        taglibAttrs.addAttribute(
  +                            attrs.getURI(i),
  +                            attrs.getLocalName(i),
  +                            attrs.getQName(i),
  +                            attrs.getType(i),
  +                            attrs.getValue(i));
  +                    } else {
  +                        if (nonTaglibXmlnsAttrs == null) {
  +                            nonTaglibXmlnsAttrs = new AttributesImpl();
  +                        }
  +                        nonTaglibXmlnsAttrs.addAttribute(
  +                            attrs.getURI(i),
  +                            attrs.getLocalName(i),
  +                            attrs.getQName(i),
  +                            attrs.getType(i),
  +                            attrs.getValue(i));
  +                    }
  +                }
  +            }
  +        }
  +
  +        Node node = null;
  +
  +        if ("http://java.sun.com/JSP/Page".equals(uri)) {
  +            node =
  +                parseStandardAction(
  +                    qName,
  +                    localName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else {
  +            node =
  +                parseCustomAction(
  +                    qName,
  +                    localName,
  +                    uri,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +            if (node == null) {
  +                node =
  +                    new Node.UninterpretedTag(
  +                        qName,
  +                        localName,
  +                        nonTaglibAttrs,
  +                        nonTaglibXmlnsAttrs,
  +                        taglibAttrs,
  +                        start,
  +                        current);
  +            }
  +        }
   
  -	current = node;
  +        current = node;
       }
   
       /*
  @@ -349,145 +391,151 @@
        *
        * @throws SAXException
        */
  -    public void characters(char[] buf,
  -			   int offset,
  -			   int len) throws SAXException {
  -	/*
  -	 * JSP.6.1.1: All textual nodes that have only white space are to be
  -	 * dropped from the document, except for nodes in a jsp:text element,
  -	 * and any leading and trailing white-space-only textual nodes in a
  -	 * jsp:attribute whose 'trim' attribute is set to FALSE, which are to
  -	 * be kept verbatim.
  -	 * JSP.6.2.3 defines white space characters.
  -	 */
  -	boolean isAllSpace = true;
  -	if (!(current instanceof Node.JspText)
  -	        && !(current instanceof Node.NamedAttribute)) {
  -	    for (int i=offset; i<offset+len; i++) {
  -		if (!(buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\r' ||
  -			buf[i] == '\t' )) {
  -		    isAllSpace = false;
  -		    break;
  -		}
  -	    }
  -	}
  -	if ((current instanceof Node.JspText)
  -	        || (current instanceof Node.NamedAttribute) || !isAllSpace) {
  -	    Mark start = new Mark(path, locator.getLineNumber(),
  -				  locator.getColumnNumber());
  -
  -	    CharArrayWriter ttext = new CharArrayWriter();
  -	    int limit = offset + len;
  -	    int lastCh = 0;
  -	    for (int i = offset; i < limit; i++) {
  -		int ch = buf[i];
  -		if (lastCh == '$' && ch == '{') {
  -		    if (ttext.size() > 0) {
  -			new Node.TemplateText(ttext.toString(), start,
  -					      current);
  -		        ttext = new CharArrayWriter();
  -		    }
  -		    // following "${" to first unquoted "}"
  -		    i++;
  -		    boolean singleQ = false;
  -		    boolean doubleQ = false;
  -		    lastCh = 0;
  -		    for (; ; i++) {
  -			if (i >= limit) {
  -			    throw new SAXParseException(
  -				Localizer.getMessage("jsp.error.unterminated",
  -						     "${"),
  -				locator);
  -
  -			}
  -			ch = buf[i];
  -			if (lastCh == '\\' && (singleQ || doubleQ)) {
  -			    ttext.write(ch);
  -			    lastCh = 0;
  -			    continue;
  -			}
  -			if (ch == '}') {
  -			    new Node.ELExpression(ttext.toString(), start,
  -						  current);
  -			    ttext = new CharArrayWriter();
  -			    break;
  -			}
  -			if (ch == '"')
  -			    doubleQ = !doubleQ;
  -			else if (ch == '\'')
  -			    singleQ = !singleQ;
  -
  -			ttext.write(ch);
  -			lastCh = ch;
  -		    }
  -		} else {
  -		    if( (lastCh == '$') && (ch != '{') ) {
  -                        ttext.write( '$' );
  +    public void characters(char[] buf, int offset, int len)
  +        throws SAXException {
  +        /*
  +         * JSP.6.1.1: All textual nodes that have only white space are to be
  +         * dropped from the document, except for nodes in a jsp:text element,
  +         * and any leading and trailing white-space-only textual nodes in a
  +         * jsp:attribute whose 'trim' attribute is set to FALSE, which are to
  +         * be kept verbatim.
  +         * JSP.6.2.3 defines white space characters.
  +         */
  +        boolean isAllSpace = true;
  +        if (!(current instanceof Node.JspText)
  +            && !(current instanceof Node.NamedAttribute)) {
  +            for (int i = offset; i < offset + len; i++) {
  +                if (!(buf[i] == ' '
  +                    || buf[i] == '\n'
  +                    || buf[i] == '\r'
  +                    || buf[i] == '\t')) {
  +                    isAllSpace = false;
  +                    break;
  +                }
  +            }
  +        }
  +        if ((current instanceof Node.JspText)
  +            || (current instanceof Node.NamedAttribute)
  +            || !isAllSpace) {
  +            Mark start =
  +                new Mark(
  +                    path,
  +                    locator.getLineNumber(),
  +                    locator.getColumnNumber());
  +
  +            CharArrayWriter ttext = new CharArrayWriter();
  +            int limit = offset + len;
  +            int lastCh = 0;
  +            for (int i = offset; i < limit; i++) {
  +                int ch = buf[i];
  +                if (lastCh == '$' && ch == '{') {
  +                    if (ttext.size() > 0) {
  +                        new Node.TemplateText(ttext.toString(), start, current);
  +                        ttext = new CharArrayWriter();
  +                    }
  +                    // following "${" to first unquoted "}"
  +                    i++;
  +                    boolean singleQ = false;
  +                    boolean doubleQ = false;
  +                    lastCh = 0;
  +                    for (;; i++) {
  +                        if (i >= limit) {
  +                            throw new SAXParseException(
  +                                Localizer.getMessage(
  +                                    "jsp.error.unterminated",
  +                                    "${"),
  +                                locator);
  +
  +                        }
  +                        ch = buf[i];
  +                        if (lastCh == '\\' && (singleQ || doubleQ)) {
  +                            ttext.write(ch);
  +                            lastCh = 0;
  +                            continue;
  +                        }
  +                        if (ch == '}') {
  +                            new Node.ELExpression(
  +                                ttext.toString(),
  +                                start,
  +                                current);
  +                            ttext = new CharArrayWriter();
  +                            break;
  +                        }
  +                        if (ch == '"')
  +                            doubleQ = !doubleQ;
  +                        else if (ch == '\'')
  +                            singleQ = !singleQ;
  +
  +                        ttext.write(ch);
  +                        lastCh = ch;
                       }
  -                    if( ch != '$' ) {
  -                        ttext.write( ch );
  +                } else {
  +                    if ((lastCh == '$') && (ch != '{')) {
  +                        ttext.write('$');
  +                    }
  +                    if (ch != '$') {
  +                        ttext.write(ch);
                       }
                   }
                   lastCh = ch;
  -	    }
  -	    if (lastCh == '$') {
  -		ttext.write('$');
  -	    }
  -	    if (ttext.size() > 0) {
  -		new Node.TemplateText(ttext.toString(), start, current);
  -	    }
  -	}
  +            }
  +            if (lastCh == '$') {
  +                ttext.write('$');
  +            }
  +            if (ttext.size() > 0) {
  +                new Node.TemplateText(ttext.toString(), start, current);
  +            }
  +        }
       }
   
       /*
        * Receives notification of the end of an element.
        */
  -    public void endElement(String uri,
  -			   String localName,
  -			   String qName) throws SAXException {
  -
  -	if (directivesOnly && !localName.startsWith(DIRECTIVE_ACTION)) {
  -	    return;
  -	}
  -
  -	if (current instanceof Node.NamedAttribute) {
  -	    boolean isTrim = ((Node.NamedAttribute) current).isTrim();
  -	    Node.Nodes subElems = ((Node.NamedAttribute) current).getBody();
  -	    for (int i=0; subElems != null && i<subElems.size(); i++) {
  -		Node subElem = subElems.getNode(i);
  -		if (!(subElem instanceof Node.TemplateText)) {
  -		    continue;
  -		}
  -		// Ignore any whitespace (including spaces, carriage returns,
  -		// line feeds, and tabs, that appear at the beginning and at
  -		// the end of the body of the <jsp:attribute> action, if the
  -		// action's 'trim' attribute is set to TRUE (default).
  -		// In addition, any textual nodes in the <jsp:attribute> that
  -		// have only white space are dropped from the document, with
  -		// the exception of leading and trailing white-space-only
  -		// textual nodes in a <jsp:attribute> whose 'trim' attribute
  -		// is set to FALSE, which must be kept verbatim.
  -		if (i == 0) {
  -		    if (isTrim) {
  -			((Node.TemplateText) subElem).ltrim();
  -		    }
  -		} else if (i == subElems.size()-1) {
  -		    if (isTrim) {
  -			((Node.TemplateText) subElem).rtrim();
  -		    }
  -		} else {
  -		    if (((Node.TemplateText) subElem).isAllSpace()) {
  -			subElems.remove(subElem);
  -		    }
  -		}
  -	    }
  -	} else if (current instanceof Node.ScriptingElement) {
  -	    checkScriptingBody((Node.ScriptingElement) current);
  -	}
  -
  -	if (current.getParent() != null) {
  -	    current = current.getParent();
  -	}
  +    public void endElement(String uri, String localName, String qName)
  +        throws SAXException {
  +
  +        if (directivesOnly && !localName.startsWith(DIRECTIVE_ACTION)) {
  +            return;
  +        }
  +
  +        if (current instanceof Node.NamedAttribute) {
  +            boolean isTrim = ((Node.NamedAttribute)current).isTrim();
  +            Node.Nodes subElems = ((Node.NamedAttribute)current).getBody();
  +            for (int i = 0; subElems != null && i < subElems.size(); i++) {
  +                Node subElem = subElems.getNode(i);
  +                if (!(subElem instanceof Node.TemplateText)) {
  +                    continue;
  +                }
  +                // Ignore any whitespace (including spaces, carriage returns,
  +                // line feeds, and tabs, that appear at the beginning and at
  +                // the end of the body of the <jsp:attribute> action, if the
  +                // action's 'trim' attribute is set to TRUE (default).
  +                // In addition, any textual nodes in the <jsp:attribute> that
  +                // have only white space are dropped from the document, with
  +                // the exception of leading and trailing white-space-only
  +                // textual nodes in a <jsp:attribute> whose 'trim' attribute
  +                // is set to FALSE, which must be kept verbatim.
  +                if (i == 0) {
  +                    if (isTrim) {
  +                        ((Node.TemplateText)subElem).ltrim();
  +                    }
  +                } else if (i == subElems.size() - 1) {
  +                    if (isTrim) {
  +                        ((Node.TemplateText)subElem).rtrim();
  +                    }
  +                } else {
  +                    if (((Node.TemplateText)subElem).isAllSpace()) {
  +                        subElems.remove(subElem);
  +                    }
  +                }
  +            }
  +        } else if (current instanceof Node.ScriptingElement) {
  +            checkScriptingBody((Node.ScriptingElement)current);
  +        }
  +
  +        if (current.getParent() != null) {
  +            current = current.getParent();
  +        }
       }
   
       /*
  @@ -496,66 +544,69 @@
        * @param locator the document locator
        */
       public void setDocumentLocator(Locator locator) {
  -	this.locator = locator;
  +        this.locator = locator;
       }
   
       /*
        * See org.xml.sax.ext.LexicalHandler.
        */
       public void comment(char[] buf, int offset, int len) throws SAXException {
  -	// ignore comments in the DTD
  -	if (!inDTD) {
  -	    Mark start = new Mark(path, locator.getLineNumber(),
  -				  locator.getColumnNumber());
  -	    new Node.Comment(new String(buf, offset, len), start, current);
  -	}
  +        // ignore comments in the DTD
  +        if (!inDTD) {
  +            Mark start =
  +                new Mark(
  +                    path,
  +                    locator.getLineNumber(),
  +                    locator.getColumnNumber());
  +            new Node.Comment(new String(buf, offset, len), start, current);
  +        }
       }
   
       /*
        * See org.xml.sax.ext.LexicalHandler.
        */
       public void startCDATA() throws SAXException {
  -	// do nothing
  +        // do nothing
       }
   
       /*
        * See org.xml.sax.ext.LexicalHandler.
        */
       public void endCDATA() throws SAXException {
  -	// do nothing
  +        // do nothing
       }
   
       /*
        * See org.xml.sax.ext.LexicalHandler.
        */
       public void startEntity(String name) throws SAXException {
  -	// do nothing
  +        // do nothing
       }
   
       /*
        * See org.xml.sax.ext.LexicalHandler.
        */
       public void endEntity(String name) throws SAXException {
  -	// do nothing
  +        // do nothing
       }
   
       /*
        * See org.xml.sax.ext.LexicalHandler.
        */
  -    public void startDTD(String name, String publicId,
  -			 String systemId) throws SAXException {
  +    public void startDTD(String name, String publicId, String systemId)
  +        throws SAXException {
           if (!isValidating) {
               fatalError(ENABLE_DTD_VALIDATION_EXCEPTION);
           }
  - 
  -	inDTD = true;
  +
  +        inDTD = true;
       }
  -          
  +
       /*
        * See org.xml.sax.ext.LexicalHandler.
        */
       public void endDTD() throws SAXException {
  -	inDTD = false;
  +        inDTD = false;
       }
   
       /*
  @@ -576,14 +627,15 @@
        * Receives notification of the start of a Namespace mapping. 
        */
       public void startPrefixMapping(String prefix, String uri)
  -	     throws SAXException {
  +        throws SAXException {
           TagLibraryInfo taglibInfo;
           try {
               taglibInfo = getTaglibInfo(prefix, uri);
           } catch (JasperException je) {
               throw new SAXParseException(
                   Localizer.getMessage("jsp.error.could.not.add.taglibraries"),
  -                locator, je);
  +                locator,
  +                je);
           }
   
           if (taglibInfo != null) {
  @@ -592,239 +644,399 @@
           } else {
               pageInfo.pushPrefixMapping(prefix, null);
           }
  -     }
  +    }
   
  -     /*
  -      * Receives notification of the end of a Namespace mapping. 
  -      */
  +    /*
  +     * Receives notification of the end of a Namespace mapping. 
  +     */
       public void endPrefixMapping(String prefix) throws SAXException {
           pageInfo.popPrefixMapping(prefix);
       }
   
  -
       //*********************************************************************
       // Private utility methods
   
  -    private Node parseStandardAction(String qName, String localName,
  -				     Attributes nonTaglibAttrs,
  -				     Attributes nonTaglibXmlnsAttrs,
  -				     Attributes taglibAttrs,
  -				     Mark start, Node parent)
  -	        throws SAXException {
  +    private Node parseStandardAction(
  +        String qName,
  +        String localName,
  +        Attributes nonTaglibAttrs,
  +        Attributes nonTaglibXmlnsAttrs,
  +        Attributes taglibAttrs,
  +        Mark start,
  +        Node parent)
  +        throws SAXException {
   
  -	Node node = null;
  +        Node node = null;
   
  -	if (localName.equals(ROOT_ACTION)) {
  +        if (localName.equals(ROOT_ACTION)) {
               if (!(current instanceof Node.Root)) {
                   throw new SAXParseException(
                       Localizer.getMessage("jsp.error.nested_jsproot"),
                       locator);
               }
  -            node = new Node.JspRoot(qName, nonTaglibAttrs, nonTaglibXmlnsAttrs,
  -				    taglibAttrs, start, current);
  -	    if (isTop) {
  -		pageInfo.setHasJspRoot(true);
  -	    }
  -	} else if (localName.equals(PAGE_DIRECTIVE_ACTION)) {
  -	    if (isTagFile) {
  -		throw new SAXParseException(
  -		    Localizer.getMessage("jsp.error.action.istagfile",
  -					 localName),
  -		    locator);
  -	    }
  -	    node = new Node.PageDirective(qName, nonTaglibAttrs,
  -					  nonTaglibXmlnsAttrs, taglibAttrs,
  -					  start, current);
  -	    String imports = nonTaglibAttrs.getValue("import");
  -	    // There can only be one 'import' attribute per page directive
  -	    if (imports != null) {
  -		((Node.PageDirective) node).addImport(imports);
  -	    }
  -	} else if (localName.equals(INCLUDE_DIRECTIVE_ACTION)) {
  -	    node = new Node.IncludeDirective(qName, nonTaglibAttrs,
  -					     nonTaglibXmlnsAttrs, taglibAttrs,
  -					     start, current);
  -	    processIncludeDirective(nonTaglibAttrs.getValue("file"), node);
  -	} else if (localName.equals(DECLARATION_ACTION)) {
  -	    node = new Node.Declaration(qName, nonTaglibXmlnsAttrs,
  -					taglibAttrs, start, current);
  -	} else if (localName.equals(SCRIPTLET_ACTION)) {
  -	    node = new Node.Scriptlet(qName, nonTaglibXmlnsAttrs, taglibAttrs,
  -				      start, current);
  -	} else if (localName.equals(EXPRESSION_ACTION)) {
  -	    node = new Node.Expression(qName, nonTaglibXmlnsAttrs, taglibAttrs,
  -				       start, current);
  -	} else if (localName.equals(USE_BEAN_ACTION)) {
  -	    node = new Node.UseBean(qName, nonTaglibAttrs, nonTaglibXmlnsAttrs,
  -				    taglibAttrs, start, current);
  -	} else if (localName.equals(SET_PROPERTY_ACTION)) {
  -	    node = new Node.SetProperty(qName, nonTaglibAttrs,
  -					nonTaglibXmlnsAttrs, taglibAttrs,
  -					start, current);
  -	} else if (localName.equals(GET_PROPERTY_ACTION)) {
  -	    node = new Node.GetProperty(qName, nonTaglibAttrs,
  -					nonTaglibXmlnsAttrs, taglibAttrs,
  -					start, current);
  -	} else if (localName.equals(INCLUDE_ACTION)) {
  -	    node = new Node.IncludeAction(qName, nonTaglibAttrs,
  -					  nonTaglibXmlnsAttrs, taglibAttrs,
  -					  start, current);
  -	} else if (localName.equals(FORWARD_ACTION)) {
  -	    node = new Node.ForwardAction(qName, nonTaglibAttrs,
  -					  nonTaglibXmlnsAttrs, taglibAttrs,
  -					  start, current);
  -	} else if (localName.equals(PARAM_ACTION)) {
  -	    node = new Node.ParamAction(qName, nonTaglibAttrs,
  -					nonTaglibXmlnsAttrs, taglibAttrs,
  -					start, current);
  -	} else if (localName.equals(PARAMS_ACTION)) {
  -	    node = new Node.ParamsAction(qName, nonTaglibXmlnsAttrs,
  -					 taglibAttrs, start, current);
  -	} else if (localName.equals(PLUGIN_ACTION)) {
  -	    node = new Node.PlugIn(qName, nonTaglibAttrs, nonTaglibXmlnsAttrs,
  -				   taglibAttrs, start, current);
  -	} else if (localName.equals(TEXT_ACTION)) {
  -	    node = new Node.JspText(qName, nonTaglibXmlnsAttrs, taglibAttrs,
  -				    start, current);
  -	} else if (localName.equals(BODY_ACTION)) {
  -	    node = new Node.JspBody(qName, nonTaglibXmlnsAttrs, taglibAttrs,
  -				    start, current);
  -	} else if (localName.equals(ATTRIBUTE_ACTION)) {
  -	    node = new Node.NamedAttribute(qName, nonTaglibAttrs,
  -					   nonTaglibXmlnsAttrs, taglibAttrs,
  -					   start, current);
  -	} else if (localName.equals(OUTPUT_ACTION)) {
  -	    node = new Node.JspOutput(qName, nonTaglibAttrs,
  -				      nonTaglibXmlnsAttrs, taglibAttrs,
  -				      start, current);
  -	} else if (localName.equals(TAG_DIRECTIVE_ACTION)) {
  -	    if (!isTagFile) {
  -		throw new SAXParseException(
  -		    Localizer.getMessage("jsp.error.action.isnottagfile",
  -					 localName),
  -		    locator);
  -	    }
  -	    node = new Node.TagDirective(qName, nonTaglibAttrs,
  -					 nonTaglibXmlnsAttrs, taglibAttrs,
  -					 start, current);
  -	    String imports = nonTaglibAttrs.getValue("import");
  -	    // There can only be one 'import' attribute per tag directive
  -	    if (imports != null) {
  -		((Node.TagDirective) node).addImport(imports);
  -	    }
  -	} else if (localName.equals(ATTRIBUTE_DIRECTIVE_ACTION)) {
  -	    if (!isTagFile) {
  -		throw new SAXParseException(
  -		    Localizer.getMessage("jsp.error.action.isnottagfile",
  -					 localName),
  -		    locator);
  -	    }
  -	    node = new Node.AttributeDirective(qName, nonTaglibAttrs,
  -					       nonTaglibXmlnsAttrs,
  -					       taglibAttrs, start, current);
  -	} else if (localName.equals(VARIABLE_DIRECTIVE_ACTION)) {
  -	    if (!isTagFile) {
  -		throw new SAXParseException(
  -		    Localizer.getMessage("jsp.error.action.isnottagfile",
  -					 localName),
  -		    locator);
  -	    }
  -	    node = new Node.VariableDirective(qName, nonTaglibAttrs,
  -					      nonTaglibXmlnsAttrs,
  -					      taglibAttrs, start, current);
  -	} else if (localName.equals(INVOKE_ACTION)) {
  -	    if (!isTagFile) {
  -		throw new SAXParseException(
  -		    Localizer.getMessage("jsp.error.action.isnottagfile",
  -					 localName),
  -		    locator);
  -	    }
  -	    node = new Node.InvokeAction(qName, nonTaglibAttrs,
  -					 nonTaglibXmlnsAttrs, taglibAttrs,
  -					 start, current);
  -	} else if (localName.equals(DOBODY_ACTION)) {
  -	    if (!isTagFile) {
  -		throw new SAXParseException(
  -		    Localizer.getMessage("jsp.error.action.isnottagfile",
  -					 localName),
  -		    locator);
  -	    }
  -	    node = new Node.DoBodyAction(qName, nonTaglibAttrs,
  -					 nonTaglibXmlnsAttrs, taglibAttrs,
  -					 start, current);
  -	} else if (localName.equals(ELEMENT_ACTION)) {
  -	    node = new Node.JspElement(qName, nonTaglibAttrs,
  -				       nonTaglibXmlnsAttrs, taglibAttrs,
  -				       start, current);
  -	} else if (localName.equals(FALLBACK_ACTION)) {
  -	    node = new Node.FallBackAction(qName, nonTaglibXmlnsAttrs,
  -					   taglibAttrs, start, current);
  -	} else {
  -	    throw new SAXParseException(
  -		    Localizer.getMessage("jsp.error.xml.badStandardAction",
  -					 localName),
  -		    locator);
  -	}
  +            node =
  +                new Node.JspRoot(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +            if (isTop) {
  +                pageInfo.setHasJspRoot(true);
  +            }
  +        } else if (localName.equals(PAGE_DIRECTIVE_ACTION)) {
  +            if (isTagFile) {
  +                throw new SAXParseException(
  +                    Localizer.getMessage(
  +                        "jsp.error.action.istagfile",
  +                        localName),
  +                    locator);
  +            }
  +            node =
  +                new Node.PageDirective(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +            String imports = nonTaglibAttrs.getValue("import");
  +            // There can only be one 'import' attribute per page directive
  +            if (imports != null) {
  +                ((Node.PageDirective)node).addImport(imports);
  +            }
  +        } else if (localName.equals(INCLUDE_DIRECTIVE_ACTION)) {
  +            node =
  +                new Node.IncludeDirective(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +            processIncludeDirective(nonTaglibAttrs.getValue("file"), node);
  +        } else if (localName.equals(DECLARATION_ACTION)) {
  +            node =
  +                new Node.Declaration(
  +                    qName,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(SCRIPTLET_ACTION)) {
  +            node =
  +                new Node.Scriptlet(
  +                    qName,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(EXPRESSION_ACTION)) {
  +            node =
  +                new Node.Expression(
  +                    qName,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(USE_BEAN_ACTION)) {
  +            node =
  +                new Node.UseBean(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(SET_PROPERTY_ACTION)) {
  +            node =
  +                new Node.SetProperty(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(GET_PROPERTY_ACTION)) {
  +            node =
  +                new Node.GetProperty(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(INCLUDE_ACTION)) {
  +            node =
  +                new Node.IncludeAction(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(FORWARD_ACTION)) {
  +            node =
  +                new Node.ForwardAction(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(PARAM_ACTION)) {
  +            node =
  +                new Node.ParamAction(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(PARAMS_ACTION)) {
  +            node =
  +                new Node.ParamsAction(
  +                    qName,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(PLUGIN_ACTION)) {
  +            node =
  +                new Node.PlugIn(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(TEXT_ACTION)) {
  +            node =
  +                new Node.JspText(
  +                    qName,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(BODY_ACTION)) {
  +            node =
  +                new Node.JspBody(
  +                    qName,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(ATTRIBUTE_ACTION)) {
  +            node =
  +                new Node.NamedAttribute(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(OUTPUT_ACTION)) {
  +            node =
  +                new Node.JspOutput(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(TAG_DIRECTIVE_ACTION)) {
  +            if (!isTagFile) {
  +                throw new SAXParseException(
  +                    Localizer.getMessage(
  +                        "jsp.error.action.isnottagfile",
  +                        localName),
  +                    locator);
  +            }
  +            node =
  +                new Node.TagDirective(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +            String imports = nonTaglibAttrs.getValue("import");
  +            // There can only be one 'import' attribute per tag directive
  +            if (imports != null) {
  +                ((Node.TagDirective)node).addImport(imports);
  +            }
  +        } else if (localName.equals(ATTRIBUTE_DIRECTIVE_ACTION)) {
  +            if (!isTagFile) {
  +                throw new SAXParseException(
  +                    Localizer.getMessage(
  +                        "jsp.error.action.isnottagfile",
  +                        localName),
  +                    locator);
  +            }
  +            node =
  +                new Node.AttributeDirective(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(VARIABLE_DIRECTIVE_ACTION)) {
  +            if (!isTagFile) {
  +                throw new SAXParseException(
  +                    Localizer.getMessage(
  +                        "jsp.error.action.isnottagfile",
  +                        localName),
  +                    locator);
  +            }
  +            node =
  +                new Node.VariableDirective(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(INVOKE_ACTION)) {
  +            if (!isTagFile) {
  +                throw new SAXParseException(
  +                    Localizer.getMessage(
  +                        "jsp.error.action.isnottagfile",
  +                        localName),
  +                    locator);
  +            }
  +            node =
  +                new Node.InvokeAction(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(DOBODY_ACTION)) {
  +            if (!isTagFile) {
  +                throw new SAXParseException(
  +                    Localizer.getMessage(
  +                        "jsp.error.action.isnottagfile",
  +                        localName),
  +                    locator);
  +            }
  +            node =
  +                new Node.DoBodyAction(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(ELEMENT_ACTION)) {
  +            node =
  +                new Node.JspElement(
  +                    qName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else if (localName.equals(FALLBACK_ACTION)) {
  +            node =
  +                new Node.FallBackAction(
  +                    qName,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    current);
  +        } else {
  +            throw new SAXParseException(
  +                Localizer.getMessage(
  +                    "jsp.error.xml.badStandardAction",
  +                    localName),
  +                locator);
  +        }
   
  -	return node;
  +        return node;
       }
   
       /*
        * Checks if the XML element with the given tag name is a custom action,
        * and returns the corresponding Node object.
        */
  -    private Node parseCustomAction(String qName,
  -				   String localName,
  -				   String uri,
  -				   Attributes nonTaglibAttrs,
  -				   Attributes nonTaglibXmlnsAttrs,
  -				   Attributes taglibAttrs,
  -				   Mark start,
  -				   Node parent) throws SAXException {
  +    private Node parseCustomAction(
  +        String qName,
  +        String localName,
  +        String uri,
  +        Attributes nonTaglibAttrs,
  +        Attributes nonTaglibXmlnsAttrs,
  +        Attributes taglibAttrs,
  +        Mark start,
  +        Node parent)
  +        throws SAXException {
   
  -	// Check if this is a user-defined (custom) tag
  +        // Check if this is a user-defined (custom) tag
           TagLibraryInfo tagLibInfo = pageInfo.getTaglib(uri);
           if (tagLibInfo == null) {
               return null;
  -	}
  +        }
   
  -	TagInfo tagInfo = tagLibInfo.getTag(localName);
  +        TagInfo tagInfo = tagLibInfo.getTag(localName);
           TagFileInfo tagFileInfo = tagLibInfo.getTagFile(localName);
  -	if (tagInfo == null && tagFileInfo == null) {
  -	    throw new SAXException(Localizer.getMessage("jsp.error.xml.bad_tag",
  -							localName, uri));
  -	}
  -	Class tagHandlerClass = null;
  -	if (tagInfo != null) {
  -	    String handlerClassName = tagInfo.getTagClassName();
  -	    try {
  -	        tagHandlerClass = ctxt.getClassLoader().loadClass(handlerClassName);
  -	    } catch (Exception e) {
  -	        throw new SAXException(
  -		        Localizer.getMessage("jsp.error.loadclass.taghandler",
  -					     handlerClassName, qName));
  -	    }
  -	}
  -
  -	String prefix = "";
  -	int colon = qName.indexOf(':');
  -	if (colon != -1) {
  -	    prefix = qName.substring(0, colon);
  -	}
  -       
  -	Node.CustomTag ret = null;
  -	if (tagInfo != null) {
  -	    ret = new Node.CustomTag(qName, prefix, localName, uri,
  -				     nonTaglibAttrs, nonTaglibXmlnsAttrs,
  -				     taglibAttrs, start, parent, tagInfo,
  -				     tagHandlerClass);
  -	} else {
  -	    ret = new Node.CustomTag(qName, prefix, localName, uri,
  -				     nonTaglibAttrs, nonTaglibXmlnsAttrs,
  -				     taglibAttrs, start, parent, tagFileInfo);
  -	}
  +        if (tagInfo == null && tagFileInfo == null) {
  +            throw new SAXException(
  +                Localizer.getMessage("jsp.error.xml.bad_tag", localName, uri));
  +        }
  +        Class tagHandlerClass = null;
  +        if (tagInfo != null) {
  +            String handlerClassName = tagInfo.getTagClassName();
  +            try {
  +                tagHandlerClass =
  +                    ctxt.getClassLoader().loadClass(handlerClassName);
  +            } catch (Exception e) {
  +                throw new SAXException(
  +                    Localizer.getMessage(
  +                        "jsp.error.loadclass.taghandler",
  +                        handlerClassName,
  +                        qName));
  +            }
  +        }
  +
  +        String prefix = "";
  +        int colon = qName.indexOf(':');
  +        if (colon != -1) {
  +            prefix = qName.substring(0, colon);
  +        }
  +
  +        Node.CustomTag ret = null;
  +        if (tagInfo != null) {
  +            ret =
  +                new Node.CustomTag(
  +                    qName,
  +                    prefix,
  +                    localName,
  +                    uri,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    parent,
  +                    tagInfo,
  +                    tagHandlerClass);
  +        } else {
  +            ret =
  +                new Node.CustomTag(
  +                    qName,
  +                    prefix,
  +                    localName,
  +                    uri,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    start,
  +                    parent,
  +                    tagFileInfo);
  +        }
   
  -	return ret;
  +        return ret;
       }
   
       /*
  @@ -837,39 +1049,50 @@
        * @return The tag library associated with the given uri namespace
        */
       private TagLibraryInfo getTaglibInfo(String prefix, String uri)
  -                throws JasperException {
  +        throws JasperException {
   
  -	TagLibraryInfo result = null;
  +        TagLibraryInfo result = null;
   
  -	if (uri.startsWith(URN_JSPTAGDIR)) {
  -	    // uri (of the form "urn:jsptagdir:path") references tag file dir
  -	    String tagdir = uri.substring(URN_JSPTAGDIR.length());
  -	    result = new ImplicitTagLibraryInfo(ctxt, parserController, prefix,
  -						tagdir, err);
  -	} else {
  -	    // uri references TLD file
  -	    boolean isPlainUri = false;
  -	    if (uri.startsWith(URN_JSPTLD)) {
  -		// uri is of the form "urn:jsptld:path"
  -		uri = uri.substring(URN_JSPTLD.length());
  -	    } else {
  -		isPlainUri = true;
  -	    }
  -
  -	    String[] location = ctxt.getTldLocation(uri);
  -	    if (location != null || !isPlainUri) {
  -		/*
  -		 * If the uri value is a plain uri, a translation error must
  -		 * not be generated if the uri is not found in the taglib map.
  -		 * Instead, any actions in the namespace defined by the uri
  -		 * value must be treated as uninterpreted.
  -		 */
  -		result = new TagLibraryInfoImpl(ctxt, parserController, prefix,
  -						uri, location, err);
  -	    }
  -	}
  +        if (uri.startsWith(URN_JSPTAGDIR)) {
  +            // uri (of the form "urn:jsptagdir:path") references tag file dir
  +            String tagdir = uri.substring(URN_JSPTAGDIR.length());
  +            result =
  +                new ImplicitTagLibraryInfo(
  +                    ctxt,
  +                    parserController,
  +                    prefix,
  +                    tagdir,
  +                    err);
  +        } else {
  +            // uri references TLD file
  +            boolean isPlainUri = false;
  +            if (uri.startsWith(URN_JSPTLD)) {
  +                // uri is of the form "urn:jsptld:path"
  +                uri = uri.substring(URN_JSPTLD.length());
  +            } else {
  +                isPlainUri = true;
  +            }
   
  -	return result;
  +            String[] location = ctxt.getTldLocation(uri);
  +            if (location != null || !isPlainUri) {
  +                /*
  +                 * If the uri value is a plain uri, a translation error must
  +                 * not be generated if the uri is not found in the taglib map.
  +                 * Instead, any actions in the namespace defined by the uri
  +                 * value must be treated as uninterpreted.
  +                 */
  +                result =
  +                    new TagLibraryInfoImpl(
  +                        ctxt,
  +                        parserController,
  +                        prefix,
  +                        uri,
  +                        location,
  +                        err);
  +            }
  +        }
  +
  +        return result;
       }
   
       /*
  @@ -881,25 +1104,26 @@
        * scripting element has been reached.
        */
       private void checkScriptingBody(Node.ScriptingElement scriptingElem)
  -	                    throws SAXException {
  -	Node.Nodes body = scriptingElem.getBody();
  -	if (body != null) {
  -	    int size = body.size();
  -	    for (int i=0; i<size; i++) {
  -		Node n = body.getNode(i);
  -		if (!(n instanceof Node.TemplateText)) {
  -		    String elemType = SCRIPTLET_ACTION;
  -		    if (scriptingElem instanceof Node.Declaration)
  -			elemType = DECLARATION_ACTION;
  -		    if (scriptingElem instanceof Node.Expression)
  -			elemType = EXPRESSION_ACTION;
  -		    String msg = Localizer.getMessage(
  -                        "jsp.error.parse.xml.scripting.invalid.body",
  -			elemType);
  -		    throw new SAXException(msg);
  -		}
  -	    }
  -	}
  +        throws SAXException {
  +        Node.Nodes body = scriptingElem.getBody();
  +        if (body != null) {
  +            int size = body.size();
  +            for (int i = 0; i < size; i++) {
  +                Node n = body.getNode(i);
  +                if (!(n instanceof Node.TemplateText)) {
  +                    String elemType = SCRIPTLET_ACTION;
  +                    if (scriptingElem instanceof Node.Declaration)
  +                        elemType = DECLARATION_ACTION;
  +                    if (scriptingElem instanceof Node.Expression)
  +                        elemType = EXPRESSION_ACTION;
  +                    String msg =
  +                        Localizer.getMessage(
  +                            "jsp.error.parse.xml.scripting.invalid.body",
  +                            elemType);
  +                    throw new SAXException(msg);
  +                }
  +            }
  +        }
       }
   
       /*
  @@ -909,22 +1133,23 @@
        * 'file' attribute of the include directive
        * @param parent The Node representing the include directive
        */
  -    private void processIncludeDirective(String fname, Node parent) 
  -		throws SAXException {
  +    private void processIncludeDirective(String fname, Node parent)
  +        throws SAXException {
   
  -	if (fname == null) {
  -	    return;
  -	}
  -
  -	try {
  -	    parserController.parse(fname, parent, null);
  -	} catch (FileNotFoundException fnfe) {
  -	    throw new SAXParseException(
  -                    Localizer.getMessage("jsp.error.file.not.found", fname),
  -		    locator, fnfe);
  -	} catch (Exception e) {
  -	    throw new SAXException(e);
  -	}
  +        if (fname == null) {
  +            return;
  +        }
  +
  +        try {
  +            parserController.parse(fname, parent, null);
  +        } catch (FileNotFoundException fnfe) {
  +            throw new SAXParseException(
  +                Localizer.getMessage("jsp.error.file.not.found", fname),
  +                locator,
  +                fnfe);
  +        } catch (Exception e) {
  +            throw new SAXException(e);
  +        }
       }
   
       /*
  @@ -937,13 +1162,13 @@
        * @param attrs The element's attributes
        */
       private void checkPrefixes(String uri, String qName, Attributes attrs) {
  -	
  -	checkPrefix(uri, qName);
   
  -	int len = attrs.getLength();
  -	for (int i=0; i<len; i++) {
  -	    checkPrefix(attrs.getURI(i), attrs.getQName(i));
  -	}
  +        checkPrefix(uri, qName);
  +
  +        int len = attrs.getLength();
  +        for (int i = 0; i < len; i++) {
  +            checkPrefix(attrs.getURI(i), attrs.getQName(i));
  +        }
       }
   
       /*
  @@ -956,14 +1181,14 @@
        */
       private void checkPrefix(String uri, String qName) {
   
  -	int index = qName.indexOf(':');
  -	if (index != -1) {
  -	    String prefix = qName.substring(0, index);
  -	    pageInfo.addPrefix(prefix);
  -	    if ("jsp".equals(prefix) && !JSP_URI.equals(uri)) {
  -		pageInfo.setIsJspPrefixHijacked(true);
  -	    }
  -	}
  +        int index = qName.indexOf(':');
  +        if (index != -1) {
  +            String prefix = qName.substring(0, index);
  +            pageInfo.addPrefix(prefix);
  +            if ("jsp".equals(prefix) && !JSP_URI.equals(uri)) {
  +                pageInfo.setIsJspPrefixHijacked(true);
  +            }
  +        }
       }
   
       /*
  @@ -975,18 +1200,21 @@
        *
        * @return The SAXParser
        */
  -    private static SAXParser getSAXParser(boolean validating,
  -                                          JspDocumentParser jspDocParser)
  -            throws Exception {
  -          
  +    private static SAXParser getSAXParser(
  +        boolean validating,
  +        JspDocumentParser jspDocParser)
  +        throws Exception {
  +
           SAXParserFactory factory = SAXParserFactory.newInstance();
           factory.setNamespaceAware(true);
   
           // Preserve xmlns attributes
  -        factory.setFeature("http://xml.org/sax/features/namespace-prefixes",
  -                           true);
  -        factory.setFeature("http://xml.org/sax/features/validation",
  -                           validating);
  +        factory.setFeature(
  +            "http://xml.org/sax/features/namespace-prefixes",
  +            true);
  +        factory.setFeature(
  +            "http://xml.org/sax/features/validation",
  +            validating);
   
           // Configure the parser
           SAXParser saxParser = factory.newSAXParser();
  @@ -1009,24 +1237,26 @@
        *
        * @return An InputSource to the requested JSP document or tag file
        */
  -    private InputSource getInputSource(String path,
  -                                       JarFile jarFile,
  -                                       JspCompilationContext ctxt,
  -                                       ErrorDispatcher err)
  -            throws Exception {
  +    private InputSource getInputSource(
  +        String path,
  +        JarFile jarFile,
  +        JspCompilationContext ctxt,
  +        ErrorDispatcher err)
  +        throws Exception {
   
  -	return new InputSource(JspUtil.getInputStream(path, jarFile, ctxt,
  -						      err));
  +        return new InputSource(
  +            JspUtil.getInputStream(path, jarFile, ctxt, err));
       }
   
       /*
        * Exception indicating that a DOCTYPE declaration is present, but
        * validation is turned off.
        */
  -    private static class EnableDTDValidationException extends SAXParseException {
  +    private static class EnableDTDValidationException
  +        extends SAXParseException {
   
           EnableDTDValidationException(String message, Locator loc) {
               super(message, loc);
           }
  -    }  
  +    }
   }