Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   /*
    * Licensed to the Apache Software Foundation (ASF) under one or more
    * contributor license agreements.  See the NOTICE file distributed with
    * this work for additional information regarding copyright ownership.
    * The ASF licenses this file to You under the Apache License, Version 2.0
    * (the "License"); you may not use this file except in compliance with
    * the License.  You may obtain a copy of the License at
    * 
    *      http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.jasper.compiler;
  
  import java.util.List;
  import java.util.Vector;
  
  
An internal data representation of a JSP page or a JSP docuement (XML). Also included here is a visitor class for tranversing nodes.

Author(s):
Kin-man Chung
Jan Luehe
Shawn Bayern
Mark Roth
  
  
  abstract class Node implements TagConstants {
  
      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)
       */
      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.
       */
      protected String innerClassName;
  
      private boolean isDummy;

    
Zero-arg Constructor.
 
     public Node() {
         this. = true;
     }

    
Constructor.

Parameters:
start The location of the jsp page
parent The enclosing node
 
     public Node(Mark startNode parent) {
         this. = start;
         this. = (start == null);
         addToParent(parent);
     }

    
Constructor.

Parameters:
qName The action's qualified name
localName The action's local name
start The location of the jsp page
parent The enclosing node
 
     public Node(String qNameString localNameMark startNode parent) {
         this. = qName;
         this. = localName;
         this. = start;
         this. = (start == null);
         addToParent(parent);
     }

    
Constructor for Nodes parsed from standard syntax.

Parameters:
qName The action's qualified name
localName The action's local name
attrs The attributes for this node
start The location of the jsp page
parent The enclosing node
 
     public Node(String qNameString localNameAttributes attrsMark start,
             Node parent) {
         this. = qName;
         this. = localName;
         this. = attrs;
         this. = start;
         this. = (start == null);
         addToParent(parent);
     }

    
Constructor for Nodes parsed from XML syntax.

Parameters:
qName The action's qualified name
localName The action's local name
attrs The action's attributes whose name does not start with xmlns
nonTaglibXmlnsAttrs The action's xmlns attributes that do not represent tag libraries
taglibAttrs The action's xmlns attributes that represent tag libraries
start The location of the jsp page
parent The enclosing node
 
     public Node(String qNameString localNameAttributes attrs,
             Attributes nonTaglibXmlnsAttrsAttributes taglibAttrsMark start,
             Node parent) {
         this. = qName;
         this. = localName;
         this. = attrs;
         this. = nonTaglibXmlnsAttrs;
         this. = taglibAttrs;
         this. = start;
         this. = (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
      */
     public Node(String qNameString localNameString textMark start,
             Node parent) {
         this. = qName;
         this. = localName;
         this. = text;
         this. = start;
         this. = (start == null);
         addToParent(parent);
     }
 
     public String getQName() {
         return this.;
     }
 
     public String getLocalName() {
         return this.;
     }
 
     /*
      * 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.;
     }
 
     /*
      * Gets this Node's xmlns attributes that represent tag libraries (only
      * meaningful for Nodes parsed from XML syntax)
      */
     public Attributes getTaglibAttributes() {
         return this.;
     }
 
     /*
      * Gets this Node's xmlns attributes that do not represent tag libraries
      * (only meaningful for Nodes parsed from XML syntax)
      */
         return this.;
     }
 
     public void setAttributes(Attributes attrs) {
         this. = attrs;
     }
 
     public String getAttributeValue(String name) {
         return ( == null) ? null : .getValue(name);
     }

    
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;
         }
 
         NamedAttribute namedAttribute = getNamedAttributeNode(name);
         if (namedAttribute == null) {
             return null;
         }
 
         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.

This should always be called and only be called for nodes that accept dynamic runtime attribute expressions.

 
     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 < numChildNodesi++) {
             NamedAttribute na = (NamedAttributenodes.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.

Returns:
Possibly empty Node.Nodes object containing any jsp:attribute subnodes of this Node
 
     public Node.Nodes getNamedAttributeNodes() {
 
         if ( != null) {
             return ;
         }
 
         Node.Nodes result = new Node.Nodes();
 
         // Look for the attribute in NamedAttribute children
         Nodes nodes = getBody();
         if (nodes != null) {
             int numChildNodes = nodes.size();
             for (int i = 0; i < numChildNodesi++) {
                 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;
                 }
             }
         }
 
          = result;
         return result;
     }
 
     public Nodes getBody() {
         return ;
     }
 
     public void setBody(Nodes body) {
         this. = body;
     }
 
     public String getText() {
         return ;
     }
 
     public Mark getStart() {
         return ;
     }
 
     public Node getParent() {
         return ;
     }
 
     public int getBeginJavaLine() {
         return ;
     }
 
     public void setBeginJavaLine(int begin) {
          = begin;
     }
 
     public int getEndJavaLine() {
         return ;
     }
 
     public void setEndJavaLine(int end) {
          = end;
     }
 
     public boolean isDummy() {
         return ;
     }
 
     public Node.Root getRoot() {
         Node n = this;
         while (!(n instanceof Node.Root)) {
             n = n.getParent();
         }
         return (Node.Rootn;
     }
 
     public String getInnerClassName() {
         return ;
     }
 
     public void setInnerClassName(String icn) {
          = icn;
     }

    
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.

Parameters:
v The visitor class
 
     abstract void accept(Visitor vthrows JasperException;
 
     // *********************************************************************
     // Private utility methods
 
     /*
      * Adds this Node to the body of the given parent.
      */
     private void addToParent(Node parent) {
         if (parent != null) {
             this. = 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;
 
         // 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;
 
         /*
          * Indicates whether an encoding has been explicitly specified in the
          * page's bom.
          */
         private boolean isBomPresent;
 
         /*
          * Sequence number for temporary variables.
          */
         private int tempSequenceNumber = 0;
 
         /*
          * Constructor.
          */
         Root(Mark startNode parentboolean isXmlSyntax) {
             super(startparent);
             this. = isXmlSyntax;
             this. = ;
             this. = ;
 
             // Figure out and set the parent root
             Node r = parent;
             while ((r != null) && !(r instanceof Node.Root))
                 r = r.getParent();
              = (Node.Rootr;
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
 
         public boolean isXmlSyntax() {
             return ;
         }
 
         /*
          * Sets the encoding specified in the JSP config element whose URL
          * pattern matches the page containing this Root.
          */
         public void setJspConfigPageEncoding(String enc) {
              = enc;
         }
 
         /*
          * Gets the encoding specified in the JSP config element whose URL
          * pattern matches the page containing this Root.
          */
         public String getJspConfigPageEncoding() {
             return ;
         }
 
         public void setPageEncoding(String enc) {
              = enc;
         }
 
         public String getPageEncoding() {
             return ;
         }
 
         public void setIsDefaultPageEncoding(boolean isDefault) {
              = isDefault;
         }
 
         public boolean isDefaultPageEncoding() {
             return ;
         }
 
         public void setIsEncodingSpecifiedInProlog(boolean isSpecified) {
              = isSpecified;
         }
 
         public boolean isEncodingSpecifiedInProlog() {
             return ;
         }
 
         public void setIsBomPresent(boolean isBom) {
              = isBom;
         }
 
         public boolean isBomPresent() {
             return ;
         }

        

Returns:
The enclosing root to this Root. Usually represents the page that includes this one.
 
         public Root getParentRoot() {
             return ;
         }

        
Generates a new temporary variable name.
 
         public String nextTemporaryVariableName() {
             if ( == null) {
                 return . + (++);
             } else {
                 return .nextTemporaryVariableName();
             }
             
         }
     }

    
Represents the root of a Jsp document (XML syntax)
 
     public static class JspRoot extends Node {
 
         public JspRoot(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrsnonTaglibXmlnsAttrstaglibAttrs,
                     startparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents a page directive
 
     public static class PageDirective extends Node {
 
         private Vector imports;
 
         public PageDirective(Attributes attrsMark startNode parent) {
             this(attrsnullnullstartparent);
         }
 
         public PageDirective(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrsnonTaglibXmlnsAttrs,
                     taglibAttrsstartparent);
              = new Vector();
         }
 
         public void accept(Visitor vthrows 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.

Parameters:
value A comma-separated string of imports.
 
         public void addImport(String value) {
             int start = 0;
             int index;
             while ((index = value.indexOf(','start)) != -1) {
                 .add(value.substring(startindex).trim());
                 start = index + 1;
             }
             if (start == 0) {
                 // No comma found
                 .add(value.trim());
             } else {
                 .add(value.substring(start).trim());
             }
         }
 
         public List getImports() {
             return ;
         }
     }

    
Represents an include directive
 
     public static class IncludeDirective extends Node {
 
         public IncludeDirective(Attributes attrsMark startNode parent) {
             this(attrsnullnullstartparent);
         }
 
         public IncludeDirective(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrsnonTaglibXmlnsAttrs,
                     taglibAttrsstartparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents a custom taglib directive
 
     public static class TaglibDirective extends Node {
 
         public TaglibDirective(Attributes attrsMark startNode parent) {
             super(attrs,
                     startparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents a tag directive
 
     public static class TagDirective extends Node {
         private Vector imports;
 
         public TagDirective(Attributes attrsMark startNode parent) {
             this(attrsnullnullstartparent);
         }
 
         public TagDirective(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrsnonTaglibXmlnsAttrs,
                     taglibAttrsstartparent);
              = new Vector();
         }
 
         public void accept(Visitor vthrows 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.

Parameters:
value A comma-separated string of imports.
 
         public void addImport(String value) {
             int start = 0;
             int index;
             while ((index = value.indexOf(','start)) != -1) {
                 .add(value.substring(startindex).trim());
                 start = index + 1;
             }
             if (start == 0) {
                 // No comma found
                 .add(value.trim());
             } else {
                 .add(value.substring(start).trim());
             }
         }
 
         public List getImports() {
             return ;
         }
     }

    
Represents an attribute directive
 
     public static class AttributeDirective extends Node {
 
         public AttributeDirective(Attributes attrsMark startNode parent) {
             this(attrsnullnullstart,
                     parent);
         }
 
         public AttributeDirective(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrs,
                     nonTaglibXmlnsAttrstaglibAttrsstartparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents a variable directive
 
     public static class VariableDirective extends Node {
 
         public VariableDirective(Attributes attrsMark startNode parent) {
             this(attrsnullnullstart,
                     parent);
         }
 
         public VariableDirective(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrsnonTaglibXmlnsAttrs,
                     taglibAttrsstartparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents a <jsp:invoke> tag file action
 
     public static class InvokeAction extends Node {
 
         public InvokeAction(Attributes attrsMark startNode parent) {
             this(attrsnullnullstartparent);
         }
 
         public InvokeAction(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrsnonTaglibXmlnsAttrs,
                     taglibAttrsstartparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents a <jsp:doBody> tag file action
 
     public static class DoBodyAction extends Node {
 
         public DoBodyAction(Attributes attrsMark startNode parent) {
             this(attrsnullnullstartparent);
         }
 
         public DoBodyAction(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrsnonTaglibXmlnsAttrs,
                     taglibAttrsstartparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents a Jsp comment Comments are kept for completeness.
 
     public static class Comment extends Node {
 
         public Comment(String textMark startNode parent) {
             super(nullnulltextstartparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents an expression, declaration, or scriptlet
 
     public static abstract class ScriptingElement extends Node {
 
         public ScriptingElement(String qNameString localNameString text,
                 Mark startNode parent) {
             super(qNamelocalNametextstartparent);
         }
 
         public ScriptingElement(String qNameString localName,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNamelocalNamenullnonTaglibXmlnsAttrstaglibAttrs,
                     startparent);
         }

        
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.

Returns:
The text string
 
         public String getText() {
             String ret = ;
             if (ret == null) {
                 if ( != null) {
                     StringBuilder buf = new StringBuilder();
                     for (int i = 0; i < .size(); i++) {
                         buf.append(.getNode(i).getText());
                     }
                     ret = buf.toString();
                 } else {
                     // Nulls cause NPEs further down the line
                     ret = "";
                 }
             }
             return ret;
         }

        
For the same reason as above, the source line information in the contained TemplateText node should be used.
 
         public Mark getStart() {
             if ( == null &&  != null && .size() > 0) {
                 return .getNode(0).getStart();
             } else {
                 return super.getStart();
             }
         }
     }

    
Represents a declaration
 
     public static class Declaration extends ScriptingElement {
 
         public Declaration(String textMark startNode parent) {
             super(textstart,
                     parent);
         }
 
         public Declaration(String qNameAttributes nonTaglibXmlnsAttrs,
                 Attributes taglibAttrsMark startNode parent) {
             super(qNamenonTaglibXmlnsAttrstaglibAttrs,
                     startparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents an expression. Expressions in attributes are embedded in the attribute string and not here.
 
     public static class Expression extends ScriptingElement {
 
         public Expression(String textMark startNode parent) {
             super(textstartparent);
         }
 
         public Expression(String qNameAttributes nonTaglibXmlnsAttrs,
                 Attributes taglibAttrsMark startNode parent) {
             super(qNamenonTaglibXmlnsAttrstaglibAttrs,
                     startparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
Represents a scriptlet
 
     public static class Scriptlet extends ScriptingElement {
 
         public Scriptlet(String textMark startNode parent) {
             super(textstartparent);
         }
 
         public Scriptlet(String qNameAttributes nonTaglibXmlnsAttrs,
                 Attributes taglibAttrsMark startNode parent) {
             super(qNamenonTaglibXmlnsAttrstaglibAttrs,
                     startparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
     }

    
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 final char type;
 
         public ELExpression(char typeString textMark startNode parent) {
             super(nullnulltextstartparent);
             this. = type;
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
 
         public void setEL(ELNode.Nodes el) {
             this. = el;
         }
 
         public ELNode.Nodes getEL() {
             return ;
         }
 
         public char getType() {
             return this.;
         }
     }

    
Represents a param action
 
     public static class ParamAction extends Node {
 
         JspAttribute value;
 
         public ParamAction(Attributes attrsMark startNode parent) {
             this(attrsnullnullstartparent);
         }
 
         public ParamAction(String qNameAttributes attrs,
                 Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                 Mark startNode parent) {
             super(qNameattrsnonTaglibXmlnsAttrstaglibAttrs,
                     startparent);
         }
 
         public void accept(Visitor vthrows JasperException {
             v.visit(this);
         }
 
         public void setValue(JspAttribute value) {
             this. = value;
         }
 
        public JspAttribute getValue() {
            return ;
        }
    }

    
Represents a params action
    public static class ParamsAction extends Node {
        public ParamsAction(Mark startNode parent) {
            this(nullnullstartparent);
        }
        public ParamsAction(String qNameAttributes nonTaglibXmlnsAttrs,
                Attributes taglibAttrsMark startNode parent) {
            super(qNamenullnonTaglibXmlnsAttrstaglibAttrs,
                    startparent);
        }
        public void accept(Visitor vthrows JasperException {
            v.visit(this);
        }
    }

    
Represents a fallback action
    public static class FallBackAction extends Node {
        public FallBackAction(Mark startNode parent) {
            this(nullnullstartparent);
        }
        public FallBackAction(String qNameAttributes nonTaglibXmlnsAttrs,
                Attributes taglibAttrsMark startNode parent) {
            super(qNamenullnonTaglibXmlnsAttrs,
                    taglibAttrsstartparent);
        }
        public void accept(Visitor vthrows JasperException {
            v.visit(this);
        }
    }

    
Represents an include action
    public static class IncludeAction extends Node {
        private JspAttribute page;
        public IncludeAction(Attributes attrsMark startNode parent) {
            this(attrsnullnullstartparent);
        }
        public IncludeAction(String qNameAttributes attrs,
                Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                Mark startNode parent) {
            super(qNameattrsnonTaglibXmlnsAttrs,
                    taglibAttrsstartparent);
        }
        public void accept(Visitor vthrows JasperException {
            v.visit(this);
        }
        public void setPage(JspAttribute page) {
            this. = page;
        }
        public JspAttribute getPage() {
            return ;
        }
    }

    
Represents a forward action
    public static class ForwardAction extends Node {
        private JspAttribute page;
        public ForwardAction(Attributes attrsMark startNode parent) {
            this(attrsnullnullstartparent);
        }
        public ForwardAction(String qNameAttributes attrs,
                Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                Mark startNode parent) {
            super(qNameattrsnonTaglibXmlnsAttrs,
                    taglibAttrsstartparent);
        }
        public void accept(Visitor vthrows JasperException {
            v.visit(this);
        }
        public void setPage(JspAttribute page) {
            this. = page;
        }
        public JspAttribute getPage() {
            return ;
        }
    }

    
Represents a getProperty action
    public static class GetProperty extends Node {
        public GetProperty(Attributes attrsMark startNode parent) {
            this(attrsnullnullstartparent);
        }
        public GetProperty(String qNameAttributes attrs,
                Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                Mark startNode parent) {
            super(qNameattrsnonTaglibXmlnsAttrs,
                    taglibAttrsstartparent);
        }
        public void accept(Visitor vthrows JasperException {
            v.visit(this);
        }
    }

    
Represents a setProperty action
    public static class SetProperty extends Node {
        private JspAttribute value;
        public SetProperty(Attributes attrsMark startNode parent) {
            this(attrsnullnullstartparent);
        }
        public SetProperty(String qNameAttributes attrs,
                Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                Mark startNode parent) {
            super(qNameattrsnonTaglibXmlnsAttrs,
                    taglibAttrsstartparent);
        }
        public void accept(Visitor vthrows JasperException {
            v.visit(this);
        }
        public void setValue(JspAttribute value) {
            this. = value;
        }
        public JspAttribute getValue() {
            return ;
        }
    }

    
Represents a useBean action
    public static class UseBean extends Node {
        JspAttribute beanName;
        public UseBean(Attributes attrsMark startNode parent) {
            this(attrsnullnullstartparent);
        }
        public UseBean(String qNameAttributes attrs,
                Attributes nonTaglibXmlnsAttrsAttributes taglibAttrs,
                Mark startNode parent) {
            super(qNameattrsnonTaglibXmlnsAttrs,
                    taglibAttrsstartparent);
        }
        public void accept(Visitor vthrows JasperException {
            v.visit(this);
        }
        public void setBeanName(JspAttribute beanName) {
            this. = beanName;
        }
        public JspAttribute getBeanName() {
            return ;
        }
    }

    
Represents a plugin action
    public static class PlugIn extends Node {
        private JspAttribute width;
        private JspAttribute height;
        public PlugIn(Attributes attrsMark startNode parent) {
            this(attrsnullnullstartparent);
        }