tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From r...@apache.org
Subject svn commit: r379417 [2/7] - in /tomcat/jasper/tc6.0.x/src/share/org/apache: el/lang/ el/parser/ el/util/ jasper/compiler/ jasper/el/ jasper/resources/ jasper/runtime/
Date Tue, 21 Feb 2006 10:57:38 GMT
Modified: tomcat/jasper/tc6.0.x/src/share/org/apache/jasper/compiler/Node.java
URL: http://svn.apache.org/viewcvs/tomcat/jasper/tc6.0.x/src/share/org/apache/jasper/compiler/Node.java?rev=379417&r1=379416&r2=379417&view=diff
==============================================================================
--- tomcat/jasper/tc6.0.x/src/share/org/apache/jasper/compiler/Node.java (original)
+++ tomcat/jasper/tc6.0.x/src/share/org/apache/jasper/compiler/Node.java Tue Feb 21 02:57:35 2006
@@ -21,6 +21,10 @@
 import java.util.Vector;
 import java.util.ArrayList;
 
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
 import javax.servlet.jsp.tagext.BodyTag;
 import javax.servlet.jsp.tagext.DynamicAttributes;
 import javax.servlet.jsp.tagext.IterationTag;
@@ -37,11 +41,10 @@
 import org.apache.jasper.compiler.tagplugin.TagPluginContext;
 import org.xml.sax.Attributes;
 
-
 /**
- * An internal data representation of a JSP page or a JSP docuement (XML).
- * Also included here is a visitor class for tranversing nodes.
- *
+ * An internal data representation of a JSP page or a JSP docuement (XML). Also
+ * included here is a visitor class for tranversing nodes.
+ * 
  * @author Kin-man Chung
  * @author Jan Luehe
  * @author Shawn Bayern
@@ -50,33 +53,41 @@
 
 abstract class Node implements TagConstants {
 
-    private static final VariableInfo[] ZERO_VARIABLE_INFO = { };
-    
+    private static final VariableInfo[] ZERO_VARIABLE_INFO = {};
+
     protected Attributes attrs;
 
     // xmlns attributes that represent tag libraries (only in XML syntax)
     protected Attributes taglibAttrs;
 
     /*
-     * xmlns attributes that do not represent tag libraries
-     * (only in XML syntax)
+     * xmlns attributes that do not represent tag libraries (only in XML syntax)
      */
     protected Attributes nonTaglibXmlnsAttrs;
 
     protected Nodes body;
+
     protected String text;
+
     protected Mark startMark;
+
     protected int beginJavaLine;
+
     protected int endJavaLine;
+
     protected Node parent;
+
     protected Nodes namedAttributeNodes; // cached for performance
+
     protected String qName;
+
     protected String localName;
+
     /*
-     * The name of the inner class to which the codes for this node and
-     * its body are generated.  For instance, for <jsp:body> in foo.jsp,
-     * this is "foo_jspHelper".  This is primarily used for communicating
-     * such info from Generator to Smap generator.
+     * The name of the inner class to which the codes for this node and its body
+     * are generated. For instance, for <jsp:body> in foo.jsp, this is
+     * "foo_jspHelper". This is primarily used for communicating such info from
+     * Generator to Smap generator.
      */
     protected String innerClassName;
 
@@ -86,129 +97,143 @@
      * Zero-arg Constructor.
      */
     public Node() {
-	this.isDummy = true;
+        this.isDummy = true;
     }
 
     /**
      * Constructor.
-     *
-     * @param start The location of the jsp page
-     * @param parent The enclosing node
+     * 
+     * @param start
+     *            The location of the jsp page
+     * @param parent
+     *            The enclosing node
      */
     public Node(Mark start, Node parent) {
-	this.startMark = start;
-	this.isDummy = (start == null);
-	addToParent(parent);
+        this.startMark = start;
+        this.isDummy = (start == null);
+        addToParent(parent);
     }
 
     /**
      * Constructor.
-     *
-     * @param qName The action's qualified name
-     * @param localName The action's local name
-     * @param start The location of the jsp page
-     * @param parent The enclosing node
+     * 
+     * @param qName
+     *            The action's qualified name
+     * @param localName
+     *            The action's local name
+     * @param start
+     *            The location of the jsp page
+     * @param parent
+     *            The enclosing node
      */
     public Node(String qName, String localName, Mark start, Node parent) {
-	this.qName = qName;
-	this.localName = localName;
-	this.startMark = start;
-	this.isDummy = (start == null);
-	addToParent(parent);
+        this.qName = qName;
+        this.localName = localName;
+        this.startMark = start;
+        this.isDummy = (start == null);
+        addToParent(parent);
     }
 
     /**
      * Constructor for Nodes parsed from standard syntax.
-     *
-     * @param qName The action's qualified name
-     * @param localName The action's local name
-     * @param attrs The attributes for this node
-     * @param start The location of the jsp page
-     * @param parent The enclosing node
+     * 
+     * @param qName
+     *            The action's qualified name
+     * @param localName
+     *            The action's local name
+     * @param attrs
+     *            The attributes for this node
+     * @param start
+     *            The location of the jsp page
+     * @param parent
+     *            The enclosing node
      */
     public Node(String qName, String localName, Attributes attrs, Mark start,
-		Node parent) {
-	this.qName = qName;
-	this.localName = localName;
-	this.attrs = attrs;
-	this.startMark = start;
-	this.isDummy = (start == null);
-	addToParent(parent);
+            Node parent) {
+        this.qName = qName;
+        this.localName = localName;
+        this.attrs = attrs;
+        this.startMark = start;
+        this.isDummy = (start == null);
+        addToParent(parent);
     }
 
     /**
      * Constructor for Nodes parsed from XML syntax.
-     *
-     * @param qName The action's qualified name
-     * @param localName The action's local name
-     * @param attrs The action's attributes whose name does not start with
-     * xmlns
-     * @param nonTaglibXmlnsAttrs The action's xmlns attributes that do not
-     * represent tag libraries
-     * @param taglibAttrs The action's xmlns attributes that represent tag
-     * libraries
-     * @param start The location of the jsp page
-     * @param parent The enclosing node
+     * 
+     * @param qName
+     *            The action's qualified name
+     * @param localName
+     *            The action's local name
+     * @param attrs
+     *            The action's attributes whose name does not start with xmlns
+     * @param nonTaglibXmlnsAttrs
+     *            The action's xmlns attributes that do not represent tag
+     *            libraries
+     * @param taglibAttrs
+     *            The action's xmlns attributes that represent tag libraries
+     * @param start
+     *            The location of the jsp page
+     * @param parent
+     *            The enclosing node
      */
     public Node(String qName, String localName, Attributes attrs,
-		Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
-		Mark start, Node parent) {
-	this.qName = qName;
-	this.localName = localName;
-	this.attrs = attrs;
-	this.nonTaglibXmlnsAttrs = nonTaglibXmlnsAttrs;
-	this.taglibAttrs = taglibAttrs;
-	this.startMark = start;
-	this.isDummy = (start == null);
-	addToParent(parent);
+            Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs, Mark start,
+            Node parent) {
+        this.qName = qName;
+        this.localName = localName;
+        this.attrs = attrs;
+        this.nonTaglibXmlnsAttrs = nonTaglibXmlnsAttrs;
+        this.taglibAttrs = taglibAttrs;
+        this.startMark = start;
+        this.isDummy = (start == null);
+        addToParent(parent);
     }
 
     /*
      * Constructor.
-     *
-     * @param qName The action's qualified name
-     * @param localName The action's local name
-     * @param text The text associated with this node
-     * @param start The location of the jsp page
-     * @param parent The enclosing node
+     * 
+     * @param qName The action's qualified name @param localName The action's
+     * local name @param text The text associated with this node @param start
+     * The location of the jsp page @param parent The enclosing node
      */
     public Node(String qName, String localName, String text, Mark start,
-		Node parent) {
-	this.qName = qName;
-	this.localName = localName;
-	this.text = text;
-	this.startMark = start;
-	this.isDummy = (start == null);
-	addToParent(parent);
+            Node parent) {
+        this.qName = qName;
+        this.localName = localName;
+        this.text = text;
+        this.startMark = start;
+        this.isDummy = (start == null);
+        addToParent(parent);
     }
 
     public String getQName() {
-	return this.qName;
+        return this.qName;
     }
 
     public String getLocalName() {
-	return this.localName;
+        return this.localName;
     }
 
     /*
      * Gets this Node's attributes.
-     *
+     * 
      * In the case of a Node parsed from standard syntax, this method returns
      * all the Node's attributes.
-     *
+     * 
      * In the case of a Node parsed from XML syntax, this method returns only
      * those attributes whose name does not start with xmlns.
      */
     public Attributes getAttributes() {
-	return this.attrs;
+        return this.attrs;
     }
 
     /*
-     * Gets this Node's xmlns attributes that represent tag libraries
-     * (only meaningful for Nodes parsed from XML syntax)
+     * Gets this Node's xmlns attributes that represent tag libraries (only
+     * meaningful for Nodes parsed from XML syntax)
      */
     public Attributes getTaglibAttributes() {
-	return this.taglibAttrs;
+        return this.taglibAttrs;
     }
 
     /*
@@ -216,94 +241,93 @@
      * (only meaningful for Nodes parsed from XML syntax)
      */
     public Attributes getNonTaglibXmlnsAttributes() {
-	return this.nonTaglibXmlnsAttrs;
+        return this.nonTaglibXmlnsAttrs;
     }
 
     public void setAttributes(Attributes attrs) {
-	this.attrs = attrs;
+        this.attrs = attrs;
     }
 
     public String getAttributeValue(String name) {
-	return (attrs == null) ? null : attrs.getValue(name);
+        return (attrs == null) ? null : attrs.getValue(name);
     }
 
     /**
-     * Get the attribute that is non request time expression, either
-     * from the attribute of the node, or from a jsp:attrbute 
+     * Get the attribute that is non request time expression, either from the
+     * attribute of the node, or from a jsp:attrbute
      */
     public String getTextAttribute(String name) {
 
-	String attr = getAttributeValue(name);
-	if (attr != null) {
-	    return attr;
-	}
+        String attr = getAttributeValue(name);
+        if (attr != null) {
+            return attr;
+        }
 
-	NamedAttribute namedAttribute = getNamedAttributeNode(name);
-	if (namedAttribute == null) {
-	    return null;
-	}
+        NamedAttribute namedAttribute = getNamedAttributeNode(name);
+        if (namedAttribute == null) {
+            return null;
+        }
 
-	return namedAttribute.getText();
+        return namedAttribute.getText();
     }
 
     /**
-     * Searches all subnodes of this node for jsp:attribute standard
-     * actions with the given name, and returns the NamedAttribute node
-     * of the matching named attribute, nor null if no such node is found.
+     * Searches all subnodes of this node for jsp:attribute standard actions
+     * with the given name, and returns the NamedAttribute node of the matching
+     * named attribute, nor null if no such node is found.
      * <p>
-     * This should always be called and only be called for nodes that
-     * accept dynamic runtime attribute expressions.
+     * This should always be called and only be called for nodes that accept
+     * dynamic runtime attribute expressions.
      */
-    public NamedAttribute getNamedAttributeNode( String name ) {
+    public NamedAttribute getNamedAttributeNode(String name) {
         NamedAttribute result = null;
-        
+
         // Look for the attribute in NamedAttribute children
         Nodes nodes = getNamedAttributeNodes();
         int numChildNodes = nodes.size();
-        for( int i = 0; i < numChildNodes; i++ ) {
-            NamedAttribute na = (NamedAttribute)nodes.getNode( i );
-	    boolean found = false;
-	    int index = name.indexOf(':');
-	    if (index != -1) {
-		// qualified name
-		found = na.getName().equals(name);
-	    } else {
-		found = na.getLocalName().equals(name);
-	    }
-	    if (found) {
+        for (int i = 0; i < numChildNodes; i++) {
+            NamedAttribute na = (NamedAttribute) nodes.getNode(i);
+            boolean found = false;
+            int index = name.indexOf(':');
+            if (index != -1) {
+                // qualified name
+                found = na.getName().equals(name);
+            } else {
+                found = na.getLocalName().equals(name);
+            }
+            if (found) {
                 result = na;
                 break;
             }
         }
-        
+
         return result;
     }
 
     /**
-     * Searches all subnodes of this node for jsp:attribute standard
-     * actions, and returns that set of nodes as a Node.Nodes object.
-     *
+     * Searches all subnodes of this node for jsp:attribute standard actions,
+     * and returns that set of nodes as a Node.Nodes object.
+     * 
      * @return Possibly empty Node.Nodes object containing any jsp:attribute
-     * subnodes of this Node
+     *         subnodes of this Node
      */
     public Node.Nodes getNamedAttributeNodes() {
 
-	if (namedAttributeNodes != null) {
-	    return namedAttributeNodes;
-	}
+        if (namedAttributeNodes != null) {
+            return namedAttributeNodes;
+        }
 
         Node.Nodes result = new Node.Nodes();
-        
+
         // Look for the attribute in NamedAttribute children
         Nodes nodes = getBody();
-        if( nodes != null ) {
+        if (nodes != null) {
             int numChildNodes = nodes.size();
-            for( int i = 0; i < numChildNodes; i++ ) {
-                Node n = nodes.getNode( i );
-                if( n instanceof NamedAttribute ) {
-                    result.add( n );
-                }
-                else if (! (n instanceof Comment)) {
+            for (int i = 0; i < numChildNodes; i++) {
+                Node n = nodes.getNode(i);
+                if (n instanceof NamedAttribute) {
+                    result.add(n);
+                } else if (!(n instanceof Comment)) {
                     // Nothing can come before jsp:attribute, and only
                     // jsp:body can come after it.
                     break;
@@ -311,56 +335,56 @@
             }
         }
 
-	namedAttributeNodes = result;
+        namedAttributeNodes = result;
         return result;
     }
-    
+
     public Nodes getBody() {
-	return body;
+        return body;
     }
 
     public void setBody(Nodes body) {
-	this.body = body;
+        this.body = body;
     }
 
     public String getText() {
-	return text;
+        return text;
     }
 
     public Mark getStart() {
-	return startMark;
+        return startMark;
     }
 
     public Node getParent() {
-	return parent;
+        return parent;
     }
 
     public int getBeginJavaLine() {
-	return beginJavaLine;
+        return beginJavaLine;
     }
 
     public void setBeginJavaLine(int begin) {
-	beginJavaLine = begin;
+        beginJavaLine = begin;
     }
 
     public int getEndJavaLine() {
-	return endJavaLine;
+        return endJavaLine;
     }
 
     public void setEndJavaLine(int end) {
-	endJavaLine = end;
+        endJavaLine = end;
     }
 
     public boolean isDummy() {
-	return isDummy;
+        return isDummy;
     }
 
     public Node.Root getRoot() {
-	Node n = this;
-	while (!(n instanceof Node.Root)) {
-	    n = n.getParent();
-	}
-	return (Node.Root) n;
+        Node n = this;
+        while (!(n instanceof Node.Root)) {
+            n = n.getParent();
+        }
+        return (Node.Root) n;
     }
 
     public String getInnerClassName() {
@@ -372,158 +396,159 @@
     }
 
     /**
-     * Selects and invokes a method in the visitor class based on the node
-     * type.  This is abstract and should be overrode by the extending classes.
-     * @param v The visitor class
+     * Selects and invokes a method in the visitor class based on the node type.
+     * This is abstract and should be overrode by the extending classes.
+     * 
+     * @param v
+     *            The visitor class
      */
     abstract void accept(Visitor v) throws JasperException;
 
-
-    //*********************************************************************
+    // *********************************************************************
     // Private utility methods
 
     /*
      * Adds this Node to the body of the given parent.
      */
     private void addToParent(Node parent) {
-	if (parent != null) {
-	    this.parent = parent;
-	    Nodes parentBody = parent.getBody();
-	    if (parentBody == null) {
-		parentBody = new Nodes();
-		parent.setBody(parentBody);
-	    }
-	    parentBody.add(this);
-	}
+        if (parent != null) {
+            this.parent = parent;
+            Nodes parentBody = parent.getBody();
+            if (parentBody == null) {
+                parentBody = new Nodes();
+                parent.setBody(parentBody);
+            }
+            parentBody.add(this);
+        }
     }
 
-
-    /*********************************************************************
+    /***************************************************************************
      * Child classes
      */
-    
+
     /**
      * Represents the root of a Jsp page or Jsp document
      */
     public static class Root extends Node {
 
-	private Root parentRoot;
-	private boolean isXmlSyntax;
+        private Root parentRoot;
+
+        private boolean isXmlSyntax;
+
+        // Source encoding of the page containing this Root
+        private String pageEnc;
+
+        // Page encoding specified in JSP config element
+        private String jspConfigPageEnc;
+
+        /*
+         * Flag indicating if the default page encoding is being used (only
+         * applicable with standard syntax).
+         * 
+         * True if the page does not provide a page directive with a
+         * 'contentType' attribute (or the 'contentType' attribute doesn't have
+         * a CHARSET value), the page does not provide a page directive with a
+         * 'pageEncoding' attribute, and there is no JSP configuration element
+         * page-encoding whose URL pattern matches the page.
+         */
+        private boolean isDefaultPageEncoding;
+
+        /*
+         * Indicates whether an encoding has been explicitly specified in the
+         * page's XML prolog (only used for pages in XML syntax). This
+         * information is used to decide whether a translation error must be
+         * reported for encoding conflicts.
+         */
+        private boolean isEncodingSpecifiedInProlog;
+
+        /*
+         * Constructor.
+         */
+        Root(Mark start, Node parent, boolean isXmlSyntax) {
+            super(start, parent);
+            this.isXmlSyntax = isXmlSyntax;
+            this.qName = JSP_ROOT_ACTION;
+            this.localName = ROOT_ACTION;
+
+            // Figure out and set the parent root
+            Node r = parent;
+            while ((r != null) && !(r instanceof Node.Root))
+                r = r.getParent();
+            parentRoot = (Node.Root) r;
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public boolean isXmlSyntax() {
+            return isXmlSyntax;
+        }
+
+        /*
+         * Sets the encoding specified in the JSP config element whose URL
+         * pattern matches the page containing this Root.
+         */
+        public void setJspConfigPageEncoding(String enc) {
+            jspConfigPageEnc = enc;
+        }
+
+        /*
+         * Gets the encoding specified in the JSP config element whose URL
+         * pattern matches the page containing this Root.
+         */
+        public String getJspConfigPageEncoding() {
+            return jspConfigPageEnc;
+        }
+
+        public void setPageEncoding(String enc) {
+            pageEnc = enc;
+        }
+
+        public String getPageEncoding() {
+            return pageEnc;
+        }
+
+        public void setIsDefaultPageEncoding(boolean isDefault) {
+            isDefaultPageEncoding = isDefault;
+        }
+
+        public boolean isDefaultPageEncoding() {
+            return isDefaultPageEncoding;
+        }
+
+        public void setIsEncodingSpecifiedInProlog(boolean isSpecified) {
+            isEncodingSpecifiedInProlog = isSpecified;
+        }
+
+        public boolean isEncodingSpecifiedInProlog() {
+            return isEncodingSpecifiedInProlog;
+        }
 
-	// Source encoding of the page containing this Root
-	private String pageEnc;
-	
-	// Page encoding specified in JSP config element
-	private String jspConfigPageEnc;
-
-	/*
-	 * Flag indicating if the default page encoding is being used (only
-	 * applicable with standard syntax).
-	 *
-	 * True if the page does not provide a page directive with a
-	 * 'contentType' attribute (or the 'contentType' attribute doesn't
-	 * have a CHARSET value), the page does not provide a page directive
-	 * with a 'pageEncoding' attribute, and there is no JSP configuration
-	 * element page-encoding whose URL pattern matches the page.
-	 */
-	private boolean isDefaultPageEncoding;
-
-	/*
-	 * Indicates whether an encoding has been explicitly specified in the
-	 * page's XML prolog (only used for pages in XML syntax).
-	 * This information is used to decide whether a translation error must
-	 * be reported for encoding conflicts.
-	 */
-	private boolean isEncodingSpecifiedInProlog;
-
-	/*
-	 * Constructor.
-	 */
-	Root(Mark start, Node parent, boolean isXmlSyntax) {
-	    super(start, parent);
-	    this.isXmlSyntax = isXmlSyntax;
-	    this.qName = JSP_ROOT_ACTION;
-	    this.localName = ROOT_ACTION;
-
-	    // Figure out and set the parent root
-	    Node r = parent;
-	    while ((r != null) && !(r instanceof Node.Root))
-		r = r.getParent();
-	    parentRoot = (Node.Root) r;
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public boolean isXmlSyntax() {
-	    return isXmlSyntax;
-	}
-
-	/*
-	 * Sets the encoding specified in the JSP config element whose URL
-	 * pattern matches the page containing this Root.
-	 */
-	public void setJspConfigPageEncoding(String enc) {
-	    jspConfigPageEnc = enc;
-	}
-
-	/*
-	 * Gets the encoding specified in the JSP config element whose URL
-	 * pattern matches the page containing this Root.
-	 */
-	public String getJspConfigPageEncoding() {
-	    return jspConfigPageEnc;
-	}
-
-	public void setPageEncoding(String enc) {
-	    pageEnc = enc;
-	}
-
-	public String getPageEncoding() {
-	    return pageEnc;
-	}
-
-	public void setIsDefaultPageEncoding(boolean isDefault) {
-	    isDefaultPageEncoding = isDefault;
-	}
-
-	public boolean isDefaultPageEncoding() {
-	    return isDefaultPageEncoding;
-	}
-	
-	public void setIsEncodingSpecifiedInProlog(boolean isSpecified) {
-	    isEncodingSpecifiedInProlog = isSpecified;
-	}
-
-	public boolean isEncodingSpecifiedInProlog() {
-	    return isEncodingSpecifiedInProlog;
-	}
-
-	/**
-	 * @return The enclosing root to this Root. Usually represents the
-	 * page that includes this one.
-	 */
-	public Root getParentRoot() {
-	    return parentRoot;
-	}
+        /**
+         * @return The enclosing root to this Root. Usually represents the page
+         *         that includes this one.
+         */
+        public Root getParentRoot() {
+            return parentRoot;
+        }
     }
-    
+
     /**
      * Represents the root of a Jsp document (XML syntax)
      */
     public static class JspRoot extends Node {
 
-	public JspRoot(String qName, Attributes attrs,
-		       Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
-		       Mark start, Node parent) {
-	    super(qName, ROOT_ACTION, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public JspRoot(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, ROOT_ACTION, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -531,48 +556,50 @@
      */
     public static class PageDirective extends Node {
 
-	private Vector imports;
+        private Vector imports;
+
+        public PageDirective(Attributes attrs, Mark start, Node parent) {
+            this(JSP_PAGE_DIRECTIVE_ACTION, attrs, null, null, start, parent);
+        }
+
+        public PageDirective(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, PAGE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+            imports = new Vector();
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        /**
+         * Parses the comma-separated list of class or package names in the
+         * given attribute value and adds each component to this PageDirective's
+         * vector of imported classes and packages.
+         * 
+         * @param value
+         *            A comma-separated string of imports.
+         */
+        public void addImport(String value) {
+            int start = 0;
+            int index;
+            while ((index = value.indexOf(',', start)) != -1) {
+                imports.add(value.substring(start, index).trim());
+                start = index + 1;
+            }
+            if (start == 0) {
+                // No comma found
+                imports.add(value.trim());
+            } else {
+                imports.add(value.substring(start).trim());
+            }
+        }
 
-	public PageDirective(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_PAGE_DIRECTIVE_ACTION, attrs, null, null, start, parent);
-	}
-
-	public PageDirective(String qName, Attributes attrs,
-			     Attributes nonTaglibXmlnsAttrs,
-			     Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, PAGE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	    imports = new Vector();
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	/**
-	 * Parses the comma-separated list of class or package names in the
-	 * given attribute value and adds each component to this
-	 * PageDirective's vector of imported classes and packages.
-	 * @param value A comma-separated string of imports.
-	 */
-	public void addImport(String value) {
-	    int start = 0;
-	    int index;
-	    while ((index = value.indexOf(',', start)) != -1) {
-		imports.add(value.substring(start, index).trim());
-		start = index + 1;
-	    }
-	    if (start == 0) {
-		// No comma found
-		imports.add(value.trim());
-	    } else {
-		imports.add(value.substring(start).trim());
-	    }
-	}
-
-	public List getImports() {
-	    return imports;
-	}
+        public List getImports() {
+            return imports;
+        }
     }
 
     /**
@@ -580,22 +607,20 @@
      */
     public static class IncludeDirective extends Node {
 
-	public IncludeDirective(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_INCLUDE_DIRECTIVE_ACTION, attrs, null, null, start,
-		 parent);
-	}
-
-	public IncludeDirective(String qName, Attributes attrs,
-				Attributes nonTaglibXmlnsAttrs,
-				Attributes taglibAttrs, Mark start,
-				Node parent) {
-	    super(qName, INCLUDE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public IncludeDirective(Attributes attrs, Mark start, Node parent) {
+            this(JSP_INCLUDE_DIRECTIVE_ACTION, attrs, null, null, start, parent);
+        }
+
+        public IncludeDirective(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, INCLUDE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -603,14 +628,14 @@
      */
     public static class TaglibDirective extends Node {
 
-	public TaglibDirective(Attributes attrs, Mark start, Node parent) {
-	    super(JSP_TAGLIB_DIRECTIVE_ACTION, TAGLIB_DIRECTIVE_ACTION, attrs,
-		  start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public TaglibDirective(Attributes attrs, Mark start, Node parent) {
+            super(JSP_TAGLIB_DIRECTIVE_ACTION, TAGLIB_DIRECTIVE_ACTION, attrs,
+                    start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -619,27 +644,29 @@
     public static class TagDirective extends Node {
         private Vector imports;
 
-	public TagDirective(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_TAG_DIRECTIVE_ACTION, attrs, null, null, start, parent);
-	}
-
-	public TagDirective(String qName, Attributes attrs,
-			    Attributes nonTaglibXmlnsAttrs,
-			    Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, TAG_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
+        public TagDirective(Attributes attrs, Mark start, Node parent) {
+            this(JSP_TAG_DIRECTIVE_ACTION, attrs, null, null, start, parent);
+        }
+
+        public TagDirective(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, TAG_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
             imports = new Vector();
-	}
+        }
 
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
         }
- 
+
         /**
          * Parses the comma-separated list of class or package names in the
-         * given attribute value and adds each component to this
-         * PageDirective's vector of imported classes and packages.
-         * @param value A comma-separated string of imports.
+         * given attribute value and adds each component to this PageDirective's
+         * vector of imported classes and packages.
+         * 
+         * @param value
+         *            A comma-separated string of imports.
          */
         public void addImport(String value) {
             int start = 0;
@@ -655,10 +682,10 @@
                 imports.add(value.substring(start).trim());
             }
         }
- 
+
         public List getImports() {
             return imports;
-	}
+        }
     }
 
     /**
@@ -666,22 +693,21 @@
      */
     public static class AttributeDirective extends Node {
 
-	public AttributeDirective(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_ATTRIBUTE_DIRECTIVE_ACTION, attrs, null, null, start,
-		 parent);
-	}
-
-	public AttributeDirective(String qName, Attributes attrs,
-				  Attributes nonTaglibXmlnsAttrs,
-				  Attributes taglibAttrs, Mark start,
-				  Node parent) {
-	    super(qName, ATTRIBUTE_DIRECTIVE_ACTION, attrs,
-		  nonTaglibXmlnsAttrs, taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public AttributeDirective(Attributes attrs, Mark start, Node parent) {
+            this(JSP_ATTRIBUTE_DIRECTIVE_ACTION, attrs, null, null, start,
+                    parent);
+        }
+
+        public AttributeDirective(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, ATTRIBUTE_DIRECTIVE_ACTION, attrs,
+                    nonTaglibXmlnsAttrs, taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -689,22 +715,21 @@
      */
     public static class VariableDirective extends Node {
 
-	public VariableDirective(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_VARIABLE_DIRECTIVE_ACTION, attrs, null, null, start,
-		 parent);
-	}
-
-	public VariableDirective(String qName, Attributes attrs,
-				 Attributes nonTaglibXmlnsAttrs,
-				 Attributes taglibAttrs,
-				 Mark start, Node parent) {
-	    super(qName, VARIABLE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public VariableDirective(Attributes attrs, Mark start, Node parent) {
+            this(JSP_VARIABLE_DIRECTIVE_ACTION, attrs, null, null, start,
+                    parent);
+        }
+
+        public VariableDirective(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, VARIABLE_DIRECTIVE_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -712,20 +737,20 @@
      */
     public static class InvokeAction extends Node {
 
-	public InvokeAction(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_INVOKE_ACTION, attrs, null, null, start, parent);
-	}
-
-	public InvokeAction(String qName, Attributes attrs,
-			    Attributes nonTaglibXmlnsAttrs,
-			    Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, INVOKE_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public InvokeAction(Attributes attrs, Mark start, Node parent) {
+            this(JSP_INVOKE_ACTION, attrs, null, null, start, parent);
+        }
+
+        public InvokeAction(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, INVOKE_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -733,35 +758,34 @@
      */
     public static class DoBodyAction extends Node {
 
-	public DoBodyAction(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_DOBODY_ACTION, attrs, null, null, start, parent);
-	}
+        public DoBodyAction(Attributes attrs, Mark start, Node parent) {
+            this(JSP_DOBODY_ACTION, attrs, null, null, start, parent);
+        }
 
-	public DoBodyAction(String qName, Attributes attrs,
-			    Attributes nonTaglibXmlnsAttrs,
-			    Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, DOBODY_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
+        public DoBodyAction(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, DOBODY_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
 
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
-     * Represents a Jsp comment
-     * Comments are kept for completeness.
+     * Represents a Jsp comment Comments are kept for completeness.
      */
     public static class Comment extends Node {
 
-	public Comment(String text, Mark start, Node parent) {
-	    super(null, null, text, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public Comment(String text, Mark start, Node parent) {
+            super(null, null, text, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -769,37 +793,37 @@
      */
     public static abstract class ScriptingElement extends Node {
 
-	public ScriptingElement(String qName, String localName, String text,
-				Mark start, Node parent) {
-	    super(qName, localName, text, start, parent);
-	}
-
-	public ScriptingElement(String qName, String localName,
-				Attributes nonTaglibXmlnsAttrs,
-				Attributes taglibAttrs, Mark start,
-				Node parent) {
-	    super(qName, localName, null, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-	}
-
-	/**
-	 * When this node was created from a JSP page in JSP syntax, its text
-	 * was stored as a String in the "text" field, whereas when this node
-	 * was created from a JSP document, its text was stored as one or more
-	 * TemplateText nodes in its body. This method handles either case.
-	 * @return The text string
-	 */
-	public String getText() {
-	    String ret = text;
-	    if ((ret == null) && (body != null)) {
-		StringBuffer buf = new StringBuffer();
-		for (int i=0; i<body.size(); i++) {
-		    buf.append(body.getNode(i).getText());
-		}
-		ret = buf.toString();
-	    }
-	    return ret;
-	}
+        public ScriptingElement(String qName, String localName, String text,
+                Mark start, Node parent) {
+            super(qName, localName, text, start, parent);
+        }
+
+        public ScriptingElement(String qName, String localName,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, localName, null, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
+
+        /**
+         * When this node was created from a JSP page in JSP syntax, its text
+         * was stored as a String in the "text" field, whereas when this node
+         * was created from a JSP document, its text was stored as one or more
+         * TemplateText nodes in its body. This method handles either case.
+         * 
+         * @return The text string
+         */
+        public String getText() {
+            String ret = text;
+            if ((ret == null) && (body != null)) {
+                StringBuffer buf = new StringBuffer();
+                for (int i = 0; i < body.size(); i++) {
+                    buf.append(body.getNode(i).getText());
+                }
+                ret = buf.toString();
+            }
+            return ret;
+        }
 
         /**
          * For the same reason as above, the source line information in the
@@ -819,44 +843,41 @@
      */
     public static class Declaration extends ScriptingElement {
 
-	public Declaration(String text, Mark start, Node parent) {
-	    super(JSP_DECLARATION_ACTION, DECLARATION_ACTION, text, start,
-		  parent);
-	}
-
-	public Declaration(String qName, Attributes nonTaglibXmlnsAttrs,
-			   Attributes taglibAttrs, Mark start,
-			   Node parent) {
-	    super(qName, DECLARATION_ACTION, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public Declaration(String text, Mark start, Node parent) {
+            super(JSP_DECLARATION_ACTION, DECLARATION_ACTION, text, start,
+                    parent);
+        }
+
+        public Declaration(String qName, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent) {
+            super(qName, DECLARATION_ACTION, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
-     * Represents an expression.  Expressions in attributes are embedded
-     * in the attribute string and not here.
+     * Represents an expression. Expressions in attributes are embedded in the
+     * attribute string and not here.
      */
     public static class Expression extends ScriptingElement {
 
-	public Expression(String text, Mark start, Node parent) {
-	    super(JSP_EXPRESSION_ACTION, EXPRESSION_ACTION, text, start,
-		  parent);
-	}
-
-	public Expression(String qName, Attributes nonTaglibXmlnsAttrs,
-			  Attributes taglibAttrs, Mark start,
-			  Node parent) {
-	    super(qName, EXPRESSION_ACTION, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public Expression(String text, Mark start, Node parent) {
+            super(JSP_EXPRESSION_ACTION, EXPRESSION_ACTION, text, start, parent);
+        }
+
+        public Expression(String qName, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent) {
+            super(qName, EXPRESSION_ACTION, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -864,45 +885,51 @@
      */
     public static class Scriptlet extends ScriptingElement {
 
-	public Scriptlet(String text, Mark start, Node parent) {
-	    super(JSP_SCRIPTLET_ACTION, SCRIPTLET_ACTION, text, start, parent);
-	}
+        public Scriptlet(String text, Mark start, Node parent) {
+            super(JSP_SCRIPTLET_ACTION, SCRIPTLET_ACTION, text, start, parent);
+        }
 
-	public Scriptlet(String qName, Attributes nonTaglibXmlnsAttrs,
-			 Attributes taglibAttrs, Mark start,
-			 Node parent) {
-	    super(qName, SCRIPTLET_ACTION, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-	}
+        public Scriptlet(String qName, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent) {
+            super(qName, SCRIPTLET_ACTION, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
 
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
-     * Represents an EL expression.  Expressions in attributes are embedded
-     * in the attribute string and not here.
+     * Represents an EL expression. Expressions in attributes are embedded in
+     * the attribute string and not here.
      */
     public static class ELExpression extends Node {
 
-	private ELNode.Nodes el;
+        private ELNode.Nodes el;
+        
+        private final char type;
 
-        public ELExpression(String text, Mark start, Node parent) {
+        public ELExpression(char type, String text, Mark start, Node parent) {
             super(null, null, text, start, parent);
+            this.type = type;
         }
 
         public void accept(Visitor v) throws JasperException {
             v.visit(this);
         }
 
-	public void setEL(ELNode.Nodes el) {
-	    this.el = el;
-	}
-
-	public ELNode.Nodes getEL() {
-	    return el;
-	}
+        public void setEL(ELNode.Nodes el) {
+            this.el = el;
+        }
+
+        public ELNode.Nodes getEL() {
+            return el;
+        }
+        
+        public char getType() {
+            return this.type;
+        }
     }
 
     /**
@@ -910,30 +937,30 @@
      */
     public static class ParamAction extends Node {
 
-	JspAttribute value;
+        JspAttribute value;
 
-	public ParamAction(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_PARAM_ACTION, attrs, null, null, start, parent);
-	}
-
-	public ParamAction(String qName, Attributes attrs,
-			   Attributes nonTaglibXmlnsAttrs,
-			   Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, PARAM_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public void setValue(JspAttribute value) {
-	    this.value = value;
-	}
-
-	public JspAttribute getValue() {
-	    return value;
-	}
+        public ParamAction(Attributes attrs, Mark start, Node parent) {
+            this(JSP_PARAM_ACTION, attrs, null, null, start, parent);
+        }
+
+        public ParamAction(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, PARAM_ACTION, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public void setValue(JspAttribute value) {
+            this.value = value;
+        }
+
+        public JspAttribute getValue() {
+            return value;
+        }
     }
 
     /**
@@ -941,21 +968,19 @@
      */
     public static class ParamsAction extends Node {
 
-	public ParamsAction(Mark start, Node parent) {
-	    this(JSP_PARAMS_ACTION, null, null, start, parent);
-	}
-
-	public ParamsAction(String qName,
-			    Attributes nonTaglibXmlnsAttrs,
-			    Attributes taglibAttrs,
-			    Mark start, Node parent) {
-	    super(qName, PARAMS_ACTION, null, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public ParamsAction(Mark start, Node parent) {
+            this(JSP_PARAMS_ACTION, null, null, start, parent);
+        }
+
+        public ParamsAction(String qName, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent) {
+            super(qName, PARAMS_ACTION, null, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -963,21 +988,19 @@
      */
     public static class FallBackAction extends Node {
 
-	public FallBackAction(Mark start, Node parent) {
-	    this(JSP_FALLBACK_ACTION, null, null, start, parent);
-	}
-
-	public FallBackAction(String qName,
-			      Attributes nonTaglibXmlnsAttrs,
-			      Attributes taglibAttrs, Mark start,
-			      Node parent) {
-	    super(qName, FALLBACK_ACTION, null, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public FallBackAction(Mark start, Node parent) {
+            this(JSP_FALLBACK_ACTION, null, null, start, parent);
+        }
+
+        public FallBackAction(String qName, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent) {
+            super(qName, FALLBACK_ACTION, null, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -985,30 +1008,30 @@
      */
     public static class IncludeAction extends Node {
 
-	private JspAttribute page;
+        private JspAttribute page;
+
+        public IncludeAction(Attributes attrs, Mark start, Node parent) {
+            this(JSP_INCLUDE_ACTION, attrs, null, null, start, parent);
+        }
+
+        public IncludeAction(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, INCLUDE_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public void setPage(JspAttribute page) {
+            this.page = page;
+        }
 
-	public IncludeAction(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_INCLUDE_ACTION, attrs, null, null, start, parent);
-	}
-
-	public IncludeAction(String qName, Attributes attrs,
-			     Attributes nonTaglibXmlnsAttrs,
-			     Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, INCLUDE_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public void setPage(JspAttribute page) {
-	    this.page = page;
-	}
-
-	public JspAttribute getPage() {
-	    return page;
-	}
+        public JspAttribute getPage() {
+            return page;
+        }
     }
 
     /**
@@ -1016,30 +1039,30 @@
      */
     public static class ForwardAction extends Node {
 
-	private JspAttribute page;
+        private JspAttribute page;
+
+        public ForwardAction(Attributes attrs, Mark start, Node parent) {
+            this(JSP_FORWARD_ACTION, attrs, null, null, start, parent);
+        }
+
+        public ForwardAction(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, FORWARD_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public void setPage(JspAttribute page) {
+            this.page = page;
+        }
 
-	public ForwardAction(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_FORWARD_ACTION, attrs, null, null, start, parent);
-	}
-
-	public ForwardAction(String qName, Attributes attrs,
-			     Attributes nonTaglibXmlnsAttrs,
-			     Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, FORWARD_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public void setPage(JspAttribute page) {
-	    this.page = page;
-	}
-
-	public JspAttribute getPage() {
-	    return page;
-	}
+        public JspAttribute getPage() {
+            return page;
+        }
     }
 
     /**
@@ -1047,20 +1070,20 @@
      */
     public static class GetProperty extends Node {
 
-	public GetProperty(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_GET_PROPERTY_ACTION, attrs, null, null, start, parent);
-	}
-
-	public GetProperty(String qName, Attributes attrs,
-			   Attributes nonTaglibXmlnsAttrs,
-			   Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, GET_PROPERTY_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start,  parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public GetProperty(Attributes attrs, Mark start, Node parent) {
+            this(JSP_GET_PROPERTY_ACTION, attrs, null, null, start, parent);
+        }
+
+        public GetProperty(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, GET_PROPERTY_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -1068,61 +1091,61 @@
      */
     public static class SetProperty extends Node {
 
-	private JspAttribute value;
+        private JspAttribute value;
 
-	public SetProperty(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_SET_PROPERTY_ACTION, attrs, null, null, start, parent);
-	}
-
-	public SetProperty(String qName, Attributes attrs,
-			   Attributes nonTaglibXmlnsAttrs,
-			   Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, SET_PROPERTY_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public void setValue(JspAttribute value) {
-	    this.value = value;
-	}
-
-	public JspAttribute getValue() {
-	    return value;
-	}
-    }
+        public SetProperty(Attributes attrs, Mark start, Node parent) {
+            this(JSP_SET_PROPERTY_ACTION, attrs, null, null, start, parent);
+        }
 
-    /**
-     * Represents a useBean action
-     */
-    public static class UseBean extends Node {
+        public SetProperty(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, SET_PROPERTY_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
 
-	JspAttribute beanName;
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
 
-	public UseBean(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_USE_BEAN_ACTION, attrs, null, null, start, parent);
-	}
-
-	public UseBean(String qName, Attributes attrs,
-		       Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
-		       Mark start, Node parent) {
-	    super(qName, USE_BEAN_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public void setBeanName(JspAttribute beanName) {
-	    this.beanName = beanName;
-	}
-
-	public JspAttribute getBeanName() {
-	    return beanName;
-	}
+        public void setValue(JspAttribute value) {
+            this.value = value;
+        }
+
+        public JspAttribute getValue() {
+            return value;
+        }
+    }
+
+    /**
+     * Represents a useBean action
+     */
+    public static class UseBean extends Node {
+
+        JspAttribute beanName;
+
+        public UseBean(Attributes attrs, Mark start, Node parent) {
+            this(JSP_USE_BEAN_ACTION, attrs, null, null, start, parent);
+        }
+
+        public UseBean(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, USE_BEAN_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public void setBeanName(JspAttribute beanName) {
+            this.beanName = beanName;
+        }
+
+        public JspAttribute getBeanName() {
+            return beanName;
+        }
     }
 
     /**
@@ -1131,38 +1154,39 @@
     public static class PlugIn extends Node {
 
         private JspAttribute width;
+
         private JspAttribute height;
-        
-	public PlugIn(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_PLUGIN_ACTION, attrs, null, null, start, parent);
-	}
-
-	public PlugIn(String qName, Attributes attrs,
-		      Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
-		      Mark start, Node parent) {
-	    super(qName, PLUGIN_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public void setHeight(JspAttribute height) {
-	    this.height = height;
-	}
-
-	public void setWidth(JspAttribute width) {
-	    this.width = width;
-	}
-
-	public JspAttribute getHeight() {
-	    return height;
-	}
-
-	public JspAttribute getWidth() {
-	    return width;
-	}
+
+        public PlugIn(Attributes attrs, Mark start, Node parent) {
+            this(JSP_PLUGIN_ACTION, attrs, null, null, start, parent);
+        }
+
+        public PlugIn(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, PLUGIN_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public void setHeight(JspAttribute height) {
+            this.height = height;
+        }
+
+        public void setWidth(JspAttribute width) {
+            this.width = width;
+        }
+
+        public JspAttribute getHeight() {
+            return height;
+        }
+
+        public JspAttribute getWidth() {
+            return width;
+        }
     }
 
     /**
@@ -1170,74 +1194,73 @@
      */
     public static class UninterpretedTag extends Node {
 
-	private JspAttribute[] jspAttrs;
+        private JspAttribute[] jspAttrs;
+
+        public UninterpretedTag(String qName, String localName,
+                Attributes attrs, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent) {
+            super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public void setJspAttributes(JspAttribute[] jspAttrs) {
+            this.jspAttrs = jspAttrs;
+        }
 
-	public UninterpretedTag(String qName, String localName,
-				Attributes attrs,
-				Attributes nonTaglibXmlnsAttrs,
-				Attributes taglibAttrs,
-				Mark start, Node parent) {
-	    super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public void setJspAttributes(JspAttribute[] jspAttrs) {
-	    this.jspAttrs = jspAttrs;
-	}
-
-	public JspAttribute[] getJspAttributes() {
-	    return jspAttrs;
-	}
+        public JspAttribute[] getJspAttributes() {
+            return jspAttrs;
+        }
     }
-    
+
     /**
      * Represents a <jsp:element>.
      */
     public static class JspElement extends Node {
 
-	private JspAttribute[] jspAttrs;
-	private JspAttribute nameAttr;
+        private JspAttribute[] jspAttrs;
+
+        private JspAttribute nameAttr;
+
+        public JspElement(Attributes attrs, Mark start, Node parent) {
+            this(JSP_ELEMENT_ACTION, attrs, null, null, start, parent);
+        }
+
+        public JspElement(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, ELEMENT_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public void setJspAttributes(JspAttribute[] jspAttrs) {
+            this.jspAttrs = jspAttrs;
+        }
 
-	public JspElement(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_ELEMENT_ACTION, attrs, null, null, start, parent);
-	}
-
-	public JspElement(String qName, Attributes attrs,
-			  Attributes nonTaglibXmlnsAttrs,
-			  Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, ELEMENT_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public void setJspAttributes(JspAttribute[] jspAttrs) {
-	    this.jspAttrs = jspAttrs;
-	}
-
-	public JspAttribute[] getJspAttributes() {
-	    return jspAttrs;
-	}
-
-	/*
-	 * Sets the XML-style 'name' attribute
-	 */
-	public void setNameAttribute(JspAttribute nameAttr) {
-	    this.nameAttr = nameAttr;
-	}
-
-	/*
-	 * Gets the XML-style 'name' attribute
-	 */
-	public JspAttribute getNameAttribute() {
-	    return this.nameAttr;
-	}
+        public JspAttribute[] getJspAttributes() {
+            return jspAttrs;
+        }
+
+        /*
+         * Sets the XML-style 'name' attribute
+         */
+        public void setNameAttribute(JspAttribute nameAttr) {
+            this.nameAttr = nameAttr;
+        }
+
+        /*
+         * Gets the XML-style 'name' attribute
+         */
+        public JspAttribute getNameAttribute() {
+            return this.nameAttr;
+        }
     }
 
     /**
@@ -1245,80 +1268,83 @@
      */
     public static class JspOutput extends Node {
 
-	public JspOutput(String qName, Attributes attrs,
-			 Attributes nonTaglibXmlnsAttrs,
-			 Attributes taglibAttrs,
-			 Mark start, Node parent) {
-	    super(qName, OUTPUT_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public JspOutput(String qName, Attributes attrs,
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
+            super(qName, OUTPUT_ACTION, attrs, nonTaglibXmlnsAttrs,
+                    taglibAttrs, start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
-     * Collected information about child elements.  Used by nodes like
-     * CustomTag, JspBody, and NamedAttribute.  The information is 
-     * set in the Collector.
+     * Collected information about child elements. Used by nodes like CustomTag,
+     * JspBody, and NamedAttribute. The information is set in the Collector.
      */
     public static class ChildInfo {
-	private boolean scriptless;	// true if the tag and its body
-					// contain no scripting elements.
-	private boolean hasUseBean;
-	private boolean hasIncludeAction;
-	private boolean hasParamAction;
-	private boolean hasSetProperty;
-	private boolean hasScriptingVars;
-
-	public void setScriptless(boolean s) {
-	    scriptless = s;
-	}
-
-	public boolean isScriptless() {
-	    return scriptless;
-	}
-
-	public void setHasUseBean(boolean u) {
-	    hasUseBean = u;
-	}
-
-	public boolean hasUseBean() {
-	    return hasUseBean;
-	}
-
-	public void setHasIncludeAction(boolean i) {
-	    hasIncludeAction = i;
-	}
-
-	public boolean hasIncludeAction() {
-	    return hasIncludeAction;
-	}
-
-	public void setHasParamAction(boolean i) {
-	    hasParamAction = i;
-	}
-
-	public boolean hasParamAction() {
-	    return hasParamAction;
-	}
-
-	public void setHasSetProperty(boolean s) {
-	    hasSetProperty = s;
-	}
-
-	public boolean hasSetProperty() {
-	    return hasSetProperty;
-	}
-        
-	public void setHasScriptingVars(boolean s) {
-	    hasScriptingVars = s;
-	}
-
-	public boolean hasScriptingVars() {
-	    return hasScriptingVars;
-	}
+        private boolean scriptless; // true if the tag and its body
+
+        // contain no scripting elements.
+        private boolean hasUseBean;
+
+        private boolean hasIncludeAction;
+
+        private boolean hasParamAction;
+
+        private boolean hasSetProperty;
+
+        private boolean hasScriptingVars;
+
+        public void setScriptless(boolean s) {
+            scriptless = s;
+        }
+
+        public boolean isScriptless() {
+            return scriptless;
+        }
+
+        public void setHasUseBean(boolean u) {
+            hasUseBean = u;
+        }
+
+        public boolean hasUseBean() {
+            return hasUseBean;
+        }
+
+        public void setHasIncludeAction(boolean i) {
+            hasIncludeAction = i;
+        }
+
+        public boolean hasIncludeAction() {
+            return hasIncludeAction;
+        }
+
+        public void setHasParamAction(boolean i) {
+            hasParamAction = i;
+        }
+
+        public boolean hasParamAction() {
+            return hasParamAction;
+        }
+
+        public void setHasSetProperty(boolean s) {
+            hasSetProperty = s;
+        }
+
+        public boolean hasSetProperty() {
+            return hasSetProperty;
+        }
+
+        public void setHasScriptingVars(boolean s) {
+            hasScriptingVars = s;
+        }
+
+        public boolean hasScriptingVars() {
+            return hasScriptingVars;
+        }
     }
 
     /**
@@ -1326,396 +1352,402 @@
      */
     public static class CustomTag extends Node {
 
-	private String uri;
-	private String prefix;
-	private JspAttribute[] jspAttrs;
-	private TagData tagData;
-	private String tagHandlerPoolName;
-	private TagInfo tagInfo;
-	private TagFileInfo tagFileInfo;
-	private Class tagHandlerClass;
-	private VariableInfo[] varInfos;
-	private int customNestingLevel;
+        private String uri;
+
+        private String prefix;
+
+        private JspAttribute[] jspAttrs;
+
+        private TagData tagData;
+
+        private String tagHandlerPoolName;
+
+        private TagInfo tagInfo;
+
+        private TagFileInfo tagFileInfo;
+
+        private Class tagHandlerClass;
+
+        private VariableInfo[] varInfos;
+
+        private int customNestingLevel;
+
         private ChildInfo childInfo;
-	private boolean implementsIterationTag;
-	private boolean implementsBodyTag;
-	private boolean implementsTryCatchFinally;
-	private boolean implementsSimpleTag;
-	private boolean implementsDynamicAttributes;
-	private Vector atBeginScriptingVars;
-	private Vector atEndScriptingVars;
-	private Vector nestedScriptingVars;
-	private Node.CustomTag customTagParent;
-	private Integer numCount;
-	private boolean useTagPlugin;
-	private TagPluginContext tagPluginContext;
-
-	/**
-	 * The following two fields are used for holding the Java
-	 * scriptlets that the tag plugins may generate.  Meaningful
-	 * only if useTagPlugin is true;
-	 * Could move them into TagPluginContextImpl, but we'll need
-	 * to cast tagPluginContext to TagPluginContextImpl all the time...
-	 */
-	private Nodes atSTag;
-	private Nodes atETag;
-
-	/*
-	 * Constructor for custom action implemented by tag handler.
-	 */
-	public CustomTag(String qName, String prefix, String localName,
-			 String uri, Attributes attrs, Mark start, Node parent,
-			 TagInfo tagInfo, Class tagHandlerClass) {
-	    this(qName, prefix, localName, uri, attrs, null, null, start,
-		 parent, tagInfo, tagHandlerClass);
-	}
-
-	/*
-	 * Constructor for custom action implemented by tag handler.
-	 */
-	public CustomTag(String qName, String prefix, String localName,
-			 String uri, Attributes attrs,
-			 Attributes nonTaglibXmlnsAttrs,
-			 Attributes taglibAttrs,
-			 Mark start, Node parent, TagInfo tagInfo,
-			 Class tagHandlerClass) {
-	    super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-
-	    this.uri = uri;
-	    this.prefix = prefix;
-	    this.tagInfo = tagInfo;
-	    this.tagHandlerClass = tagHandlerClass;
-	    this.customNestingLevel = makeCustomNestingLevel();
+
+        private boolean implementsIterationTag;
+
+        private boolean implementsBodyTag;
+
+        private boolean implementsTryCatchFinally;
+
+        private boolean implementsSimpleTag;
+
+        private boolean implementsDynamicAttributes;
+
+        private Vector atBeginScriptingVars;
+
+        private Vector atEndScriptingVars;
+
+        private Vector nestedScriptingVars;
+
+        private Node.CustomTag customTagParent;
+
+        private Integer numCount;
+
+        private boolean useTagPlugin;
+
+        private TagPluginContext tagPluginContext;
+
+        /**
+         * The following two fields are used for holding the Java scriptlets
+         * that the tag plugins may generate. Meaningful only if useTagPlugin is
+         * true; Could move them into TagPluginContextImpl, but we'll need to
+         * cast tagPluginContext to TagPluginContextImpl all the time...
+         */
+        private Nodes atSTag;
+
+        private Nodes atETag;
+
+        /*
+         * Constructor for custom action implemented by tag handler.
+         */
+        public CustomTag(String qName, String prefix, String localName,
+                String uri, Attributes attrs, Mark start, Node parent,
+                TagInfo tagInfo, Class tagHandlerClass) {
+            this(qName, prefix, localName, uri, attrs, null, null, start,
+                    parent, tagInfo, tagHandlerClass);
+        }
+
+        /*
+         * Constructor for custom action implemented by tag handler.
+         */
+        public CustomTag(String qName, String prefix, String localName,
+                String uri, Attributes attrs, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent,
+                TagInfo tagInfo, Class tagHandlerClass) {
+            super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+
+            this.uri = uri;
+            this.prefix = prefix;
+            this.tagInfo = tagInfo;
+            this.tagHandlerClass = tagHandlerClass;
+            this.customNestingLevel = makeCustomNestingLevel();
             this.childInfo = new ChildInfo();
 
-	    this.implementsIterationTag = 
-		IterationTag.class.isAssignableFrom(tagHandlerClass);
-	    this.implementsBodyTag =
-		BodyTag.class.isAssignableFrom(tagHandlerClass);
-	    this.implementsTryCatchFinally = 
-		TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
-	    this.implementsSimpleTag = 
-		SimpleTag.class.isAssignableFrom(tagHandlerClass);
-	    this.implementsDynamicAttributes = 
-		DynamicAttributes.class.isAssignableFrom(tagHandlerClass);
-	}
-
-	/*
-	 * Constructor for custom action implemented by tag file.
-	 */
-	public CustomTag(String qName, String prefix, String localName,
-			 String uri, Attributes attrs, Mark start, Node parent,
-			 TagFileInfo tagFileInfo) {
-	    this(qName, prefix, localName, uri, attrs, null, null, start,
-		 parent, tagFileInfo);
-	}
-
-	/*
-	 * Constructor for custom action implemented by tag file.
-	 */
-	public CustomTag(String qName, String prefix, String localName,
-			 String uri, Attributes attrs,
-			 Attributes nonTaglibXmlnsAttrs,
-			 Attributes taglibAttrs,
-			 Mark start, Node parent, TagFileInfo tagFileInfo) {
-
-	    super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-
-	    this.uri = uri;
-	    this.prefix = prefix;
-	    this.tagFileInfo = tagFileInfo;
-	    this.tagInfo = tagFileInfo.getTagInfo();
-	    this.customNestingLevel = makeCustomNestingLevel();
+            this.implementsIterationTag = IterationTag.class
+                    .isAssignableFrom(tagHandlerClass);
+            this.implementsBodyTag = BodyTag.class
+                    .isAssignableFrom(tagHandlerClass);
+            this.implementsTryCatchFinally = TryCatchFinally.class
+                    .isAssignableFrom(tagHandlerClass);
+            this.implementsSimpleTag = SimpleTag.class
+                    .isAssignableFrom(tagHandlerClass);
+            this.implementsDynamicAttributes = DynamicAttributes.class
+                    .isAssignableFrom(tagHandlerClass);
+        }
+
+        /*
+         * Constructor for custom action implemented by tag file.
+         */
+        public CustomTag(String qName, String prefix, String localName,
+                String uri, Attributes attrs, Mark start, Node parent,
+                TagFileInfo tagFileInfo) {
+            this(qName, prefix, localName, uri, attrs, null, null, start,
+                    parent, tagFileInfo);
+        }
+
+        /*
+         * Constructor for custom action implemented by tag file.
+         */
+        public CustomTag(String qName, String prefix, String localName,
+                String uri, Attributes attrs, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent,
+                TagFileInfo tagFileInfo) {
+
+            super(qName, localName, attrs, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+
+            this.uri = uri;
+            this.prefix = prefix;
+            this.tagFileInfo = tagFileInfo;
+            this.tagInfo = tagFileInfo.getTagInfo();
+            this.customNestingLevel = makeCustomNestingLevel();
             this.childInfo = new ChildInfo();
 
-	    this.implementsIterationTag = false;
-	    this.implementsBodyTag = false;
-	    this.implementsTryCatchFinally = false;
-	    this.implementsSimpleTag = true;
-	    this.implementsDynamicAttributes = tagInfo.hasDynamicAttributes();
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	/**
-	 * @return The URI namespace that this custom action belongs to
-	 */
-	public String getURI() {
-	    return this.uri;
-	}
-
-	/**
-	 * @return The tag prefix
-	 */
-	public String getPrefix() {
-	    return prefix;
-	}
-
-	public void setJspAttributes(JspAttribute[] jspAttrs) {
-	    this.jspAttrs = jspAttrs;
-	}
-
-	public JspAttribute[] getJspAttributes() {
-	    return jspAttrs;
-	}
-        
+            this.implementsIterationTag = false;
+            this.implementsBodyTag = false;
+            this.implementsTryCatchFinally = false;
+            this.implementsSimpleTag = true;
+            this.implementsDynamicAttributes = tagInfo.hasDynamicAttributes();
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        /**
+         * @return The URI namespace that this custom action belongs to
+         */
+        public String getURI() {
+            return this.uri;
+        }
+
+        /**
+         * @return The tag prefix
+         */
+        public String getPrefix() {
+            return prefix;
+        }
+
+        public void setJspAttributes(JspAttribute[] jspAttrs) {
+            this.jspAttrs = jspAttrs;
+        }
+
+        public JspAttribute[] getJspAttributes() {
+            return jspAttrs;
+        }
+
         public ChildInfo getChildInfo() {
             return childInfo;
         }
-	
-	public void setTagData(TagData tagData) {
-	    this.tagData = tagData;
-	    this.varInfos = tagInfo.getVariableInfo(tagData);
-	    if (this.varInfos == null) {
-		this.varInfos = ZERO_VARIABLE_INFO;
-	    }
-	}
-
-	public TagData getTagData() {
-	    return tagData;
-	}
-
-	public void setTagHandlerPoolName(String s) {
-	    tagHandlerPoolName = s;
-	}
-
-	public String getTagHandlerPoolName() {
-	    return tagHandlerPoolName;
-	}
-
-	public TagInfo getTagInfo() {
-	    return tagInfo;
-	}
-
-	public TagFileInfo getTagFileInfo() {
-	    return tagFileInfo;
-	}
-
-	/*
-	 * @return true if this custom action is supported by a tag file,
-	 * false otherwise
-	 */
-	public boolean isTagFile() {
-	    return tagFileInfo != null;
-	}
-
-	public Class getTagHandlerClass() {
-	    return tagHandlerClass;
-	}
-
-	public void setTagHandlerClass(Class hc) {
-	    tagHandlerClass = hc;
-	}
-
-	public boolean implementsIterationTag() {
-	    return implementsIterationTag;
-	}
-
-	public boolean implementsBodyTag() {
-	    return implementsBodyTag;
-	}
-
-	public boolean implementsTryCatchFinally() {
-	    return implementsTryCatchFinally;
-	}
-
-	public boolean implementsSimpleTag() {
-	    return implementsSimpleTag;
-	}
-
-	public boolean implementsDynamicAttributes() {
-	    return implementsDynamicAttributes;
-	}
-
-	public TagVariableInfo[] getTagVariableInfos() {
-	    return tagInfo.getTagVariableInfos();
- 	}
- 
-	public VariableInfo[] getVariableInfos() {
-	    return varInfos;
-	}
-
-	public void setCustomTagParent(Node.CustomTag n) {
-	    this.customTagParent = n;
-	}
-
-	public Node.CustomTag getCustomTagParent() {
-	    return this.customTagParent;
-	}
-
-	public void setNumCount(Integer count) {
-	    this.numCount = count;
-	}
-
-	public Integer getNumCount() {
-	    return this.numCount;
-	}
-
-	public void setScriptingVars(Vector vec, int scope) {
-	    switch (scope) {
-	    case VariableInfo.AT_BEGIN:
-		this.atBeginScriptingVars = vec;
-		break;
-	    case VariableInfo.AT_END:
-		this.atEndScriptingVars = vec;
-		break;
-	    case VariableInfo.NESTED:
-		this.nestedScriptingVars = vec;
-		break;
-	    }
-	}
-
-	/*
-	 * Gets the scripting variables for the given scope that need to be
-	 * declared.
-	 */
-	public Vector getScriptingVars(int scope) {
-	    Vector vec = null;
-
-	    switch (scope) {
-	    case VariableInfo.AT_BEGIN:
-		vec = this.atBeginScriptingVars;
-		break;
-	    case VariableInfo.AT_END:
-		vec = this.atEndScriptingVars;
-		break;
-	    case VariableInfo.NESTED:
-		vec = this.nestedScriptingVars;
-		break;
-	    }
-
-	    return vec;
-	}
-
-	/*
-	 * Gets this custom tag's custom nesting level, which is given as
-	 * the number of times this custom tag is nested inside itself.
-	 */
-	public int getCustomNestingLevel() {
-	    return customNestingLevel;
-	}
+
+        public void setTagData(TagData tagData) {
+            this.tagData = tagData;
+            this.varInfos = tagInfo.getVariableInfo(tagData);
+            if (this.varInfos == null) {
+                this.varInfos = ZERO_VARIABLE_INFO;
+            }
+        }
+
+        public TagData getTagData() {
+            return tagData;
+        }
+
+        public void setTagHandlerPoolName(String s) {
+            tagHandlerPoolName = s;
+        }
+
+        public String getTagHandlerPoolName() {
+            return tagHandlerPoolName;
+        }
+
+        public TagInfo getTagInfo() {
+            return tagInfo;
+        }
+
+        public TagFileInfo getTagFileInfo() {
+            return tagFileInfo;
+        }
+
+        /*
+         * @return true if this custom action is supported by a tag file, false
+         * otherwise
+         */
+        public boolean isTagFile() {
+            return tagFileInfo != null;
+        }
+
+        public Class getTagHandlerClass() {
+            return tagHandlerClass;
+        }
+
+        public void setTagHandlerClass(Class hc) {
+            tagHandlerClass = hc;
+        }
+
+        public boolean implementsIterationTag() {
+            return implementsIterationTag;
+        }
+
+        public boolean implementsBodyTag() {
+            return implementsBodyTag;
+        }
+
+        public boolean implementsTryCatchFinally() {
+            return implementsTryCatchFinally;
+        }
+
+        public boolean implementsSimpleTag() {
+            return implementsSimpleTag;
+        }
+
+        public boolean implementsDynamicAttributes() {
+            return implementsDynamicAttributes;
+        }
+
+        public TagVariableInfo[] getTagVariableInfos() {
+            return tagInfo.getTagVariableInfos();
+        }
+
+        public VariableInfo[] getVariableInfos() {
+            return varInfos;
+        }
+
+        public void setCustomTagParent(Node.CustomTag n) {
+            this.customTagParent = n;
+        }
+
+        public Node.CustomTag getCustomTagParent() {
+            return this.customTagParent;
+        }
+
+        public void setNumCount(Integer count) {
+            this.numCount = count;
+        }
+
+        public Integer getNumCount() {
+            return this.numCount;
+        }
+
+        public void setScriptingVars(Vector vec, int scope) {
+            switch (scope) {
+            case VariableInfo.AT_BEGIN:
+                this.atBeginScriptingVars = vec;
+                break;
+            case VariableInfo.AT_END:
+                this.atEndScriptingVars = vec;
+                break;
+            case VariableInfo.NESTED:
+                this.nestedScriptingVars = vec;
+                break;
+            }
+        }
+
+        /*
+         * Gets the scripting variables for the given scope that need to be
+         * declared.
+         */
+        public Vector getScriptingVars(int scope) {
+            Vector vec = null;
+
+            switch (scope) {
+            case VariableInfo.AT_BEGIN:
+                vec = this.atBeginScriptingVars;
+                break;
+            case VariableInfo.AT_END:
+                vec = this.atEndScriptingVars;
+                break;
+            case VariableInfo.NESTED:
+                vec = this.nestedScriptingVars;
+                break;
+            }
+
+            return vec;
+        }
+
+        /*
+         * Gets this custom tag's custom nesting level, which is given as the
+         * number of times this custom tag is nested inside itself.
+         */
+        public int getCustomNestingLevel() {
+            return customNestingLevel;
+        }
 
         /**
          * Checks to see if the attribute of the given name is of type
-	 * JspFragment.
+         * JspFragment.
          */
-        public boolean checkIfAttributeIsJspFragment( String name ) {
+        public boolean checkIfAttributeIsJspFragment(String name) {
             boolean result = false;
 
-	    TagAttributeInfo[] attributes = tagInfo.getAttributes();
-	    for (int i = 0; i < attributes.length; i++) {
-		if (attributes[i].getName().equals(name) &&
-		            attributes[i].isFragment()) {
-		    result = true;
-		    break;
-		}
-	    }
-            
+            TagAttributeInfo[] attributes = tagInfo.getAttributes();
+            for (int i = 0; i < attributes.length; i++) {
+                if (attributes[i].getName().equals(name)
+                        && attributes[i].isFragment()) {
+                    result = true;
+                    break;
+                }
+            }
+
             return result;
         }
 
-	public void setUseTagPlugin(boolean use) {
-	    useTagPlugin = use;
-	}
-
-	public boolean useTagPlugin() {
-	    return useTagPlugin;
-	}
-
-	public void setTagPluginContext(TagPluginContext tagPluginContext) {
-	    this.tagPluginContext = tagPluginContext;
-	}
-
-	public TagPluginContext getTagPluginContext() {
-	    return tagPluginContext;
-	}
-
-	public void setAtSTag(Nodes sTag) {
-	    atSTag = sTag;
-	}
-
-	public Nodes getAtSTag() {
-	    return atSTag;
-	}
-        
-	public void setAtETag(Nodes eTag) {
-	    atETag = eTag;
-	}
-
-	public Nodes getAtETag() {
-	    return atETag;
-	}
-        
-	/*
-	 * Computes this custom tag's custom nesting level, which corresponds
-	 * to the number of times this custom tag is nested inside itself.
-	 *
-	 * Example:
-	 * 
-	 *  <g:h>
-	 *    <a:b> -- nesting level 0
-	 *      <c:d>
-	 *        <e:f>
-	 *          <a:b> -- nesting level 1
-	 *            <a:b> -- nesting level 2
-	 *            </a:b>
-	 *          </a:b>
-	 *          <a:b> -- nesting level 1
-	 *          </a:b>
-	 *        </e:f>
-	 *      </c:d>
-	 *    </a:b>
-	 *  </g:h>
-	 * 
-	 * @return Custom tag's nesting level
-	 */
-	private int makeCustomNestingLevel() {
-	    int n = 0;
-	    Node p = parent;
-	    while (p != null) {
-		if ((p instanceof Node.CustomTag)
-		        && qName.equals(((Node.CustomTag) p).qName)) {
-		    n++;
-		}
-		p = p.parent;
-	    }
-	    return n;
-	}
-
-	/**
-	 * Returns true if this custom action has an empty body, and false
-	 * otherwise.
-	 *
-	 * A custom action is considered to have an empty body if the 
-	 * following holds true:
-	 * - getBody() returns null, or
-	 * - all immediate children are jsp:attribute actions, or
-	 * - the action's jsp:body is empty.
-	 */
-	 public boolean hasEmptyBody() {
-	     boolean hasEmptyBody = true;
-	     Nodes nodes = getBody();
-	     if (nodes != null) {
-		 int numChildNodes = nodes.size();
-		 for (int i=0; i<numChildNodes; i++) {
-		     Node n = nodes.getNode(i);
-		     if (!(n instanceof NamedAttribute)) {
-			 if (n instanceof JspBody) {
-			     hasEmptyBody = (n.getBody() == null);
-			 } else {
-			     hasEmptyBody = false;
-			 }
-			 break;
-		     }
-		 }
-	     }
+        public void setUseTagPlugin(boolean use) {
+            useTagPlugin = use;
+        }
+
+        public boolean useTagPlugin() {
+            return useTagPlugin;
+        }
+
+        public void setTagPluginContext(TagPluginContext tagPluginContext) {
+            this.tagPluginContext = tagPluginContext;
+        }
+
+        public TagPluginContext getTagPluginContext() {
+            return tagPluginContext;
+        }
+
+        public void setAtSTag(Nodes sTag) {
+            atSTag = sTag;
+        }
+
+        public Nodes getAtSTag() {
+            return atSTag;
+        }
+
+        public void setAtETag(Nodes eTag) {
+            atETag = eTag;
+        }
+
+        public Nodes getAtETag() {
+            return atETag;
+        }
 
-	     return hasEmptyBody;
-	 }
+        /*
+         * Computes this custom tag's custom nesting level, which corresponds to
+         * the number of times this custom tag is nested inside itself.
+         * 
+         * Example:
+         * 
+         * <g:h> <a:b> -- nesting level 0 <c:d> <e:f> <a:b> -- nesting level 1
+         * <a:b> -- nesting level 2 </a:b> </a:b> <a:b> -- nesting level 1
+         * </a:b> </e:f> </c:d> </a:b> </g:h>
+         * 
+         * @return Custom tag's nesting level
+         */
+        private int makeCustomNestingLevel() {
+            int n = 0;
+            Node p = parent;
+            while (p != null) {
+                if ((p instanceof Node.CustomTag)
+                        && qName.equals(((Node.CustomTag) p).qName)) {
+                    n++;
+                }
+                p = p.parent;
+            }
+            return n;
+        }
+
+        /**
+         * Returns true if this custom action has an empty body, and false
+         * otherwise.
+         * 
+         * A custom action is considered to have an empty body if the following
+         * holds true: - getBody() returns null, or - all immediate children are
+         * jsp:attribute actions, or - the action's jsp:body is empty.
+         */
+        public boolean hasEmptyBody() {
+            boolean hasEmptyBody = true;
+            Nodes nodes = getBody();
+            if (nodes != null) {
+                int numChildNodes = nodes.size();
+                for (int i = 0; i < numChildNodes; i++) {
+                    Node n = nodes.getNode(i);
+                    if (!(n instanceof NamedAttribute)) {
+                        if (n instanceof JspBody) {
+                            hasEmptyBody = (n.getBody() == null);
+                        } else {
+                            hasEmptyBody = false;
+                        }
+                        break;
+                    }
+                }
+            }
+
+            return hasEmptyBody;
+        }
     }
 
     /**
@@ -1723,26 +1755,27 @@
      * attribute (used by the tag plugin machinery only).
      */
     public static class AttributeGenerator extends Node {
-	String name;	// name of the attribute
-	CustomTag tag;	// The tag this attribute belongs to
+        String name; // name of the attribute
+
+        CustomTag tag; // The tag this attribute belongs to
+
+        public AttributeGenerator(Mark start, String name, CustomTag tag) {
+            super(start, null);
+            this.name = name;
+            this.tag = tag;
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
+
+        public String getName() {
+            return name;
+        }
 
-	public AttributeGenerator(Mark start, String name, CustomTag tag) {
-	    super(start, null);
-	    this.name = name;
-	    this.tag = tag;
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
-
-	public String getName() {
-	    return name;
-	}
-
-	public CustomTag getTag() {
-	    return tag;
-	}
+        public CustomTag getTag() {
+            return tag;
+        }
     }
 
     /**
@@ -1750,15 +1783,15 @@
      */
     public static class JspText extends Node {
 
-	public JspText(String qName, Attributes nonTaglibXmlnsAttrs,
-		       Attributes taglibAttrs, Mark start, Node parent) {
-	    super(qName, TEXT_ACTION, null, nonTaglibXmlnsAttrs, taglibAttrs,
-		  start, parent);
-	}
-
-	public void accept(Visitor v) throws JasperException {
-	    v.visit(this);
-	}
+        public JspText(String qName, Attributes nonTaglibXmlnsAttrs,
+                Attributes taglibAttrs, Mark start, Node parent) {
+            super(qName, TEXT_ACTION, null, nonTaglibXmlnsAttrs, taglibAttrs,
+                    start, parent);
+        }
+
+        public void accept(Visitor v) throws JasperException {
+            v.visit(this);
+        }
     }
 
     /**
@@ -1771,39 +1804,41 @@
 
         // True if this node is to be trimmed, or false otherwise
         private boolean trim = true;
-        
+
         private ChildInfo childInfo;
-	private String name;
-	private String localName;
-	private String prefix;
+
+        private String name;
+
+        private String localName;
+
+        private String prefix;
 
         public NamedAttribute(Attributes attrs, Mark start, Node parent) {
-	    this(JSP_ATTRIBUTE_ACTION, attrs, null, null, start, parent);
-	}
+            this(JSP_ATTRIBUTE_ACTION, attrs, null, null, start, parent);
+        }
 
         public NamedAttribute(String qName, Attributes attrs,
-			      Attributes nonTaglibXmlnsAttrs,
-			      Attributes taglibAttrs,
-			      Mark start, Node parent) {
+                Attributes nonTaglibXmlnsAttrs, Attributes taglibAttrs,
+                Mark start, Node parent) {
 
             super(qName, ATTRIBUTE_ACTION, attrs, nonTaglibXmlnsAttrs,
-		  taglibAttrs, start, parent);
+                    taglibAttrs, start, parent);

[... 920 lines stripped ...]


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message