kinman      2002/06/05 15:01:34

  Modified:    jasper2/src/share/org/apache/jasper/compiler Compiler.java
                        Generator.java Node.java PageInfo.java
                        Validator.java
  Added:       jasper2/src/share/org/apache/jasper/compiler Collector.java
  Log:
  - Generate code for a tag to a out-of-line method if it does not contain
    any scripting elements or scripting variables.
  
  - Add Collector to collect info on a page.
  
  Revision  Changes    Path
  1.12      +6 -3      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java
  
  Index: Compiler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Compiler.java     2 Jun 2002 21:36:45 -0000       1.11
  +++ Compiler.java     5 Jun 2002 22:01:33 -0000       1.12
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v
 1.11 2002/06/02 21:36:45 remm Exp $
  - * $Revision: 1.11 $
  - * $Date: 2002/06/02 21:36:45 $
  + * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v
 1.12 2002/06/05 22:01:33 kinman Exp $
  + * $Revision: 1.12 $
  + * $Date: 2002/06/05 22:01:33 $
    *
    * ====================================================================
    * 
  @@ -193,6 +193,9 @@
   
        // Dump out the page (for debugging)
        // Dumper.dump(pageNodes);
  +
  +     // Collect page info
  +     Collector.collect(this, pageNodes);
   
        // generate servlet .java file
        Generator.generate(writer, this, pageNodes);
  
  
  
  1.17      +186 -62   
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java
  
  Index: Generator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- Generator.java    24 May 2002 23:57:42 -0000      1.16
  +++ Generator.java    5 Jun 2002 22:01:33 -0000       1.17
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v
 1.16 2002/05/24 23:57:42 kinman Exp $
  - * $Revision: 1.16 $
  - * $Date: 2002/05/24 23:57:42 $
  + * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v
 1.17 2002/06/05 22:01:33 kinman Exp $
  + * $Revision: 1.17 $
  + * $Date: 2002/06/05 22:01:33 $
    *
    * ====================================================================
    * 
  @@ -89,6 +89,7 @@
   public class Generator {
   
       private ServletWriter out;
  +    private MethodsBuffer methodsBuffer;
       private ErrorDispatcher err;
       private BeanRepository beanInfo;
       private JspCompilationContext ctxt;
  @@ -192,10 +193,10 @@
            out.print("implements SingleThreadModel");
        }
        out.println(" {");
  +     out.pushIndent();
   
        // Class body begins here
   
  -     out.pushIndent();
        generateDeclarations(page);
        out.println();
   
  @@ -227,14 +228,6 @@
   
        // Class fields declarations
                
  -        maxTagNesting = pageInfo.getMaxTagNesting();
  -        if (maxTagNesting >= 0) {
  -            out.printil("private static final int RELEASE_ACTION         = 0;");
  -            out.printil("private static final int POP_AND_RELEASE_ACTION = 1;");
  -            out.println();
  -            out.println();
  -        }
  -
        // Constructor (empty so far) here
   
        // Methods here
  @@ -271,17 +264,11 @@
        out.printil("JspWriter out = null;");
        out.printil("Object page = this;");
   
  -             // pseudo "Finally" state stack objects
  -        if (maxTagNesting >= 0) {
  -            String depth = Integer.toString(maxTagNesting + 1);
  -            out.printil("int   tagStackIndex = -1;");
  -            out.printin("int[] tagStackActions = new int[");
  -            out.print(depth);
  -            out.println("];");
  -            out.printin("javax.servlet.jsp.tagext.Tag[] tagStack = new 
javax.servlet.jsp.tagext.Tag[");
  -            out.print(depth);
  -            out.println("];");
  -            out.println();
  +             // Number of tag object that need to be popped
  +     // XXX TODO: use a better criteria
  +     maxTagNesting = pageInfo.getMaxTagNesting();
  +        if (maxTagNesting > 0) {
  +         out.printil("JspxState _jspxState = new JspxState();");
           }
   
        out.printil("try {");
  @@ -312,6 +299,25 @@
       }
   
       /**
  +     * Generate codes defining the classes used in the servlet.
  +     * 1. Servlet state object, used to pass servlet info round methods.
  +     */
  +    private void generateJspState() {
  +     out.println();
  +     out.printil("static final class JspxState {");
  +     out.pushIndent();
  +     out.printil("public int tagCount;");
  +     out.println();
  +     out.printil("public JspxState() {");
  +     out.pushIndent();
  +     out.printil("tagCount = 0;");
  +     out.popIndent();
  +     out.printil("}");
  +     out.popIndent();
  +     out.printil("}");
  +    }
  +
  +    /**
        * A visitor that generates codes for the elements in the page.
        */
       class GenerateVisitor extends Node.Visitor {
  @@ -329,10 +335,15 @@
        private Hashtable tagVarNumbers;
        private String parent;
   
  +     private ServletWriter out;
  +     private MethodsBuffer methodsBuffer;
  +
        /**
         * Constructor.
         */
  -     public GenerateVisitor() {
  +     public GenerateVisitor(ServletWriter out, MethodsBuffer methodsBuffer) {
  +         this.out = out;
  +         this.methodsBuffer = methodsBuffer;
            handlerInfos = new Hashtable();
            tagVarNumbers = new Hashtable();
        }
  @@ -347,6 +358,9 @@
         */
        private String attributeValue(Node.JspAttribute attr, boolean encode) {
            String v = attr.getValue();
  +         if (v == null)
  +             return "";
  +
            if (attr.isExpression()) {
                if (encode) {
                    return "java.net.URLEncoder.encode(" + v + ")";
  @@ -700,18 +714,22 @@
            // First compose the runtime output string 
            String s0 = "<OBJECT classid=\"" + ctxt.getOptions().getIeClassId()+
                        "\"" + makeAttr("name", name);
  -         String s1, s2;
  -         if (width.isExpression()) {
  -             s1 = quote(s0 + " width=\"") + " + " + width.getValue() +
  +         String s1="", s2="";
  +         if (width != null) {
  +             if (width.isExpression()) {
  +                 s1 = quote(s0 + " width=\"") + " + " + width.getValue() +
                        " + " + quote("\"");
  -         } else {
  -             s1 = quote(s0 + makeAttr("width", width.getValue()));
  +             } else {
  +                 s1 = quote(s0 + makeAttr("width", width.getValue()));
  +             }
            }
  -         if (height.isExpression()) {
  -             s2 = quote(" height=\"") + " + " + height.getValue() +
  +         if (height != null) {
  +             if (height.isExpression()) {
  +                 s2 = quote(" height=\"") + " + " + height.getValue() +
                        " + " + quote("\"");
  -         } else {
  -             s2 = quote(makeAttr("height", height.getValue()));
  +             } else {
  +                 s2 = quote(makeAttr("height", height.getValue()));
  +             }
            }
            String s3 = quote(makeAttr("hspace", hspace) +
                                makeAttr("vspace", vspace) +
  @@ -762,18 +780,28 @@
                 makeAttr("type", "application/x-java-" + type + ";" +
                          ((jreversion==null)? "": "version=" + jreversion)) +
                 makeAttr("name", name);
  -         if (width.isExpression()) {
  -             s1 = quote(s0 + " width=\"") + " + " + width.getValue() +
  +
  +         if (width != null) {
  +             if (width.isExpression()) {
  +                 s1 = quote(s0 + " width=\"") + " + " + width.getValue() +
                        " + " + quote("\"");
  +             } else {
  +                 s1 = quote(s0 + makeAttr("width", width.getValue()));
  +             }
            } else {
  -             s1 = quote(s0 + makeAttr("width", width.getValue()));
  +             s1 = quote(s0);
            }
  -         if (height.isExpression()) {
  -             s2 = quote(" height=\"") + " + " + height.getValue() +
  -                     " + " + quote("\"");
  +         if (height != null) {
  +             if (height.isExpression()) {
  +                 s2 = quote(" height=\"") + " + " + height.getValue() +
  +                    " + " + quote("\"");
  +             } else {
  +                 s2 = quote(makeAttr("height", height.getValue()));
  +             }
            } else {
  -             s2 = quote(makeAttr("height", height.getValue()));
  +             s2 = "";
            }
  +
            s3 = quote(makeAttr("hspace", hspace) +
                         makeAttr("vspace", vspace) +
                         makeAttr("align", align) +
  @@ -844,16 +872,93 @@
            String tagEvalVar = "_jspx_eval_" + baseVar;
            String tagHandlerVar = "_jspx_th_" + baseVar;
   
  +         // If the tag contains no scripting element, generate its codes
  +         // to a method.
  +         ServletWriter outSave = null;
  +         MethodsBuffer methodsBufferSave = null;
  +         if (n.isScriptless() && varInfos == null &&
  +                     (tagVarInfos == null || tagVarInfos.length == 0)) {
  +             // The tag handler and its body code can reside in a separate
  +             // method if it is scriptless and does not have any scripting
  +             // variable defined.
  +             // For some reason, varInfos is null when var is not defined
  +             // in TEI, but tagVarInfos is empty array when var is not
  +             // defined in tld.
  +
  +             String tagMethod = "_jspx_meth_" + baseVar;
  +
  +             // Generate a call to this method
  +             out.printin(tagMethod);
  +             out.print("(");
  +             if (parent != null) {
  +                 out.print(parent);
  +                 out.print(", ");
  +             }
  +             out.println("pageContext, _jspxState);");
  +
  +             // Set up new buffer for the method
  +             outSave = out;
  +             out = methodsBuffer.getOut();
  +             methodsBufferSave = methodsBuffer;
  +             methodsBuffer = new MethodsBuffer();
  +
  +             // Generate code for method declaration
  +             out.println();
  +             out.pushIndent();
  +             out.printin("private void ");
  +             out.print(tagMethod);
  +             out.print("(");
  +             if (parent != null) {
  +                 out.print("javax.servlet.jsp.tagext.Tag ");
  +                 out.print(parent);
  +                 out.print(", ");
  +             }
  +             out.println("PageContext pageContext, JspxState _jspxState)");
  +             out.printil("        throws java.io.IOException, 
javax.servlet.jsp.JspException {");
  +             out.pushIndent();
  +
  +             // Initilaize local variables used in this method.
  +             out.printil("JspWriter out = pageContext.getOut();");
  +             if (n.isHasUsebean()) {
  +                 out.println("HttpSession session = pageContext.getSession();");
  +                 out.println("ServletContext application = 
pageContext.getServletContext();");
  +             }
  +             if (n.isHasUsebean() || n.isHasIncludeAction() || 
n.isHasSetProperty()) {
  +                 out.println("HttpServletRequest request = 
pageContext.getRequest();");
  +             }
  +             if (n.isHasIncludeAction()) {
  +                 out.println("ServletResponse response = 
pageContext.getResponse();");
  +             }
  +         }
  +
            // Generate code for start tag, body, and end tag
            generateCustomStart(n, varInfos, tagVarInfos, handlerInfo,
                                tagHandlerVar, tagEvalVar);
  +
            String tmpParent = parent;
            parent = tagHandlerVar;
            visitBody(n);
  +
            parent = tmpParent;
            generateCustomEnd(n, varInfos, tagVarInfos,
                              handlerInfo.getTagHandlerClass(), tagHandlerVar,
                              tagEvalVar);
  +
  +         if (n.isScriptless() && varInfos == null &&
  +                     (tagVarInfos == null || tagVarInfos.length == 0)) {
  +             // Generate end of method
  +             out.popIndent();
  +             out.printil("}");
  +             out.popIndent();
  +
  +             // Append any methods that got generated in the body to the
  +             // current buffer
  +             out.print(methodsBuffer.toString());
  +
  +             // restore previous buffer
  +             methodsBuffer = methodsBufferSave;
  +             out = outSave;
  +         }
           }
   
        private static final String SINGLE_QUOTE = "'";
  @@ -984,11 +1089,6 @@
               if (implementsTryCatchFinally) {
                   out.printil("try {");
                   out.pushIndent();
  -            } else {
  -                out.printil("tagStackActions[++tagStackIndex] = RELEASE_ACTION;");
  -                out.printin("tagStack[tagStackIndex] = ");
  -                out.print(tagHandlerVar);
  -                out.println(";");
               }
            out.printin("int ");
            out.print(tagEvalVar);
  @@ -1018,8 +1118,7 @@
                    
                    out.printil("out = pageContext.pushBody();");
                       if (!implementsTryCatchFinally) {
  -                        out.printil("tagStackActions[tagStackIndex]" +
  -                                     " = POP_AND_RELEASE_ACTION;");
  +                        out.printil("_jspxState.tagCount++;");
                    }
                    out.printin(tagHandlerVar);
                    
out.println(".setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);");
  @@ -1078,7 +1177,7 @@
                    out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)");
                    out.pushIndent();
                       if (!implementsTryCatchFinally) {
  -                        out.printil("tagStackActions[tagStackIndex] = 
RELEASE_ACTION;");
  +                        out.printil("_jspxState.tagCount--;");
                    }
                    out.printil("out = pageContext.popBody();");
                    out.popIndent();
  @@ -1112,7 +1211,6 @@
                   out.popIndent();
                   out.printil("}");
               } else {
  -                out.printil("tagStackIndex--;");
                   out.printin(tagHandlerVar);
                   out.println(".release();");
            }
  @@ -1157,13 +1255,13 @@
                        if (declare && tagVarInfos[i].getDeclare()) {
                            out.printin(tagVarInfos[i].getClassName() + " ");
                        }
  +                     out.printin(name);
  +                     out.print(" = (");
  +                     out.print(tagVarInfos[i].getClassName());
  +                     out.print(") pageContext.findAttribute(");
  +                     out.print(quote(name));
  +                     out.println(");");
                    }
  -                 out.printin(name);
  -                 out.print(" = (");
  -                 out.print(tagVarInfos[i].getClassName());
  -                 out.print(") pageContext.findAttribute(");
  -                 out.print(quote(name));
  -                 out.println(");");
                }
            }
        }
  @@ -1342,25 +1440,23 @@
           out.popIndent();
           out.printil("} catch (Throwable t) {");
           out.pushIndent();
  +/*
           out.printil("if (out != null && out.getBufferSize() != 0)");
           out.pushIndent();
           out.printil("out.clearBuffer();");
           out.popIndent();
  +*/
           out.printil("if (pageContext != null) pageContext.handlePageException(t);");
           out.popIndent();
           out.printil("} finally {");
           out.pushIndent();
   
        // Cleanup the tags on the stack
  -        if (maxTagNesting >= 0) {
  -            out.printil("while (tagStackIndex >= 0) {");
  -            out.pushIndent();
  -            out.printil("if (POP_AND_RELEASE_ACTION == 
tagStackActions[tagStackIndex])");
  +        if (maxTagNesting > 0) {
  +            out.printil("while (_jspxState.tagCount-- > 0) {");
               out.pushIndent();
               out.printil("out = pageContext.popBody();");
               out.popIndent();
  -            out.printil("tagStack[tagStackIndex--].release();");
  -            out.popIndent();
               out.printil("}");
           }
   
  @@ -1373,6 +1469,14 @@
           out.popIndent();
           out.printil("}");
   
  +     // Append any methods that were generated
  +     out.print(methodsBuffer.toString());
  +
  +     // generate class definition for JspxState
  +        if (maxTagNesting > 0) {
  +         generateJspState();
  +     }
  +
           // Close the class definition
           out.popIndent();
           out.printil("}");
  @@ -1383,6 +1487,7 @@
        */
       Generator(ServletWriter out, Compiler compiler) {
        this.out = out;
  +     methodsBuffer = new MethodsBuffer();
        err = compiler.getErrorDispatcher();
        ctxt = compiler.getCompilationContext();
        pageInfo = compiler.getPageInfo();
  @@ -1401,7 +1506,7 @@
        Generator gen = new Generator(out, compiler);
   
        gen.generatePreamble(page);
  -     page.visit(gen.new GenerateVisitor());
  +     page.visit(gen.new GenerateVisitor(out, gen.methodsBuffer));
        gen.generatePostamble(page);
       }
   
  @@ -1480,6 +1585,25 @@
         */
        public Class getTagHandlerClass() {
            return tagHandlerClass;
  +     }
  +    }
  +
  +    private static class MethodsBuffer {
  +
  +     private java.io.CharArrayWriter charWriter;
  +     private ServletWriter out;
  +
  +     MethodsBuffer() {
  +         charWriter = new java.io.CharArrayWriter();
  +         out = new ServletWriter(new java.io.PrintWriter(charWriter));
  +     }
  +
  +     public ServletWriter getOut() {
  +         return out;
  +     }
  +
  +     public String toString() {
  +         return charWriter.toString();
        }
       }
   }
  
  
  
  1.10      +40 -3     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java
  
  Index: Node.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Node.java 23 May 2002 21:29:38 -0000      1.9
  +++ Node.java 5 Jun 2002 22:01:33 -0000       1.10
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java,v
 1.9 2002/05/23 21:29:38 kinman Exp $
  - * $Revision: 1.9 $
  - * $Date: 2002/05/23 21:29:38 $
  + * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Node.java,v
 1.10 2002/06/05 22:01:33 kinman Exp $
  + * $Revision: 1.10 $
  + * $Date: 2002/06/05 22:01:33 $
    *
    * ====================================================================
    * 
  @@ -664,6 +664,11 @@
        private String shortName;
        private JspAttribute[] jspAttrs;
        private TagData tagData;
  +     private boolean scriptless;     // true if the tag and its body
  +                                     // contians no scripting elements.
  +     private boolean hasUsebean;
  +     private boolean hasIncludeAction;
  +     private boolean hasSetProperty;
   
        public CustomTag(Attributes attrs, Mark start, String name,
                         String prefix, String shortName, Node parent) {
  @@ -712,6 +717,38 @@
   
        public TagData getTagData() {
            return tagData;
  +     }
  +
  +     public void setScriptless(boolean s) {
  +         scriptless = s;
  +     }
  +
  +     public boolean isScriptless() {
  +         return scriptless;
  +     }
  +
  +     public void setHasUsebean(boolean u) {
  +         hasUsebean = u;
  +     }
  +
  +     public boolean isHasUsebean() {
  +         return hasUsebean;
  +     }
  +
  +     public void setHasIncludeAction(boolean i) {
  +         hasIncludeAction = i;
  +     }
  +
  +     public boolean isHasIncludeAction() {
  +         return hasIncludeAction;
  +     }
  +
  +     public void setHasSetProperty(boolean s) {
  +         hasSetProperty = s;
  +     }
  +
  +     public boolean isHasSetProperty() {
  +         return hasSetProperty;
        }
       }
   
  
  
  
  1.5       +13 -3     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/PageInfo.java
  
  Index: PageInfo.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/PageInfo.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PageInfo.java     18 May 2002 00:29:24 -0000      1.4
  +++ PageInfo.java     5 Jun 2002 22:01:33 -0000       1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/PageInfo.java,v
 1.4 2002/05/18 00:29:24 kinman Exp $
  - * $Revision: 1.4 $
  - * $Date: 2002/05/18 00:29:24 $
  + * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/PageInfo.java,v
 1.5 2002/06/05 22:01:33 kinman Exp $
  + * $Revision: 1.5 $
  + * $Date: 2002/06/05 22:01:33 $
    *
    * ====================================================================
    * 
  @@ -89,6 +89,7 @@
       private String errorPage = null;
       private String pageEncoding = null;
       private int maxTagNesting = 0;
  +    private boolean scriptless = false;
   
       PageInfo(BeanRepository beanRepository) {
        this.beanRepository = beanRepository;
  @@ -212,4 +213,13 @@
       public void setMaxTagNesting(int maxTagNesting) {
           this.maxTagNesting = maxTagNesting;
       }
  +
  +    public void setScriptless(boolean s) {
  +     scriptless = s;
  +    }
  +
  +    public boolean isScriptless() {
  +     return scriptless;
  +    }
  +
   }
  
  
  
  1.9       +3 -33     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java
  
  Index: Validator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- Validator.java    23 May 2002 21:29:38 -0000      1.8
  +++ Validator.java    5 Jun 2002 22:01:33 -0000       1.9
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java,v
 1.8 2002/05/23 21:29:38 kinman Exp $
  - * $Revision: 1.8 $
  - * $Date: 2002/05/23 21:29:38 $
  + * $Header: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java,v
 1.9 2002/06/05 22:01:33 kinman Exp $
  + * $Revision: 1.9 $
  + * $Date: 2002/06/05 22:01:33 $
    *
    * ====================================================================
    * 
  @@ -571,30 +571,6 @@
        }
       }
   
  -    /**
  -     * A visitor for collection info on the page
  -     */
  -    static class CollectVisitor extends Node.Visitor {
  -
  -        private int maxTagNesting = 0;
  -        private int curTagNesting = 0;
  -
  -        public void visit(Node.CustomTag n) throws JasperException {
  -
  -            if (curTagNesting > maxTagNesting) {
  -                maxTagNesting = curTagNesting;
  -            }
  -
  -            curTagNesting++;
  -            visitBody(n);
  -            curTagNesting--;
  -        }
  -
  -        public void updatePageInfo(PageInfo pageInfo) {
  -         pageInfo.setMaxTagNesting(maxTagNesting);
  -        }
  -    }
  -
       public static void validate(Compiler compiler,
                                Node.Nodes page) throws JasperException {
   
  @@ -636,12 +612,6 @@
         */
        page.visit(new TagExtraInfoVisitor(compiler));
   
  -        /*
  -         * Collect information about the page and update pageInfo object.
  -         */
  -        CollectVisitor collectVisitor = new CollectVisitor();
  -        page.visit(collectVisitor);
  -        collectVisitor.updatePageInfo(compiler.getPageInfo());
       }
   
   
  
  
  
  1.1                  
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Collector.java
  
  Index: Collector.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/
  compiler/Generator.java,v 1.16 2002/05/24 23:57:42 kinman Exp $
   * $Revision: 1.1 $
   * $Date: 2002/06/05 22:01:33 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.jasper.compiler;
  
  import org.apache.jasper.JasperException;
  
  /**
   * Collect info about the page and nodes, and make them availabe through
   * the PageInfo object.
   *
   * @author Kin-man Chung
   */
  
  public class Collector {
  
      /**
       * A visitor for collection info on the page
       * Info collected so far:
       *   Maximum tag nestings.
       *   Whether a page or a tag element (and its body) contains any scripting
       *       elements.
       */
      static class CollectVisitor extends Node.Visitor {
  
          private int maxTagNesting = 0;
          private int curTagNesting = 0;
        private boolean scriptingElementSeen = false;
        private boolean usebeanSeen = false;
        private boolean includeActionSeen = false;
        private boolean setPropertySeen = false;
  
        public void visit(Node.ParamAction n) throws JasperException {
            if (n.getValue().isExpression()) {
                scriptingElementSeen = true;
            }
        }
  
        public void visit(Node.IncludeAction n) throws JasperException {
            if (n.getPage().isExpression()) {
                scriptingElementSeen = true;
            }
            includeActionSeen = true;
              visitBody(n);
        }
  
        public void visit(Node.ForwardAction n) throws JasperException {
            if (n.getPage().isExpression()) {
                scriptingElementSeen = true;
            }
              visitBody(n);
        }
  
        public void visit(Node.SetProperty n) throws JasperException {
            if (n.getValue() != null && n.getValue().isExpression()) {
                scriptingElementSeen = true;
            }
            setPropertySeen = true;
        }
  
        public void visit(Node.UseBean n) throws JasperException {
            if (n.getBeanName() != null && n.getBeanName().isExpression()) {
                scriptingElementSeen = true;
            }
            usebeanSeen = true;
              visitBody(n);
        }
  
        public void visit(Node.PlugIn n) throws JasperException {
            if (n.getHeight() != null && n.getHeight().isExpression()) {
                scriptingElementSeen = true;
            }
            if (n.getWidth() != null && n.getWidth().isExpression()) {
                scriptingElementSeen = true;
            }
              visitBody(n);
        }
  
          public void visit(Node.CustomTag n) throws JasperException {
  
              curTagNesting++;
              if (curTagNesting > maxTagNesting) {
                  maxTagNesting = curTagNesting;
              }
  
            // save values collected so far
            boolean scriptingElementSeenSave = scriptingElementSeen;
            scriptingElementSeen = false;
            boolean usebeanSeenSave = usebeanSeen;
            usebeanSeen = false;
            boolean includeActionSeenSave = includeActionSeen;
            includeActionSeen = false;
            boolean setPropertySeenSave = setPropertySeen;
            setPropertySeen = false;
  
            // Scan attribute list for expressions
            Node.JspAttribute[] attrs = n.getJspAttributes();
            for (int i = 0; i < attrs.length; i++) {
                if (attrs[i].isExpression()) {
                    scriptingElementSeen = true;
                    break;
                }
            }
  
              visitBody(n);
  
            // Record if the tag element and its body contains any scriptlet.
            n.setScriptless(! scriptingElementSeen);
            n.setHasUsebean(usebeanSeen);
            n.setHasIncludeAction(includeActionSeen);
            n.setHasSetProperty(setPropertySeen);
  
            // Propagate value of scriptingElementSeen up.
            scriptingElementSeen = scriptingElementSeen || scriptingElementSeenSave;
            usebeanSeen = usebeanSeen || usebeanSeenSave;
            setPropertySeen = setPropertySeen || setPropertySeenSave;
            includeActionSeen = includeActionSeen || includeActionSeenSave;
  
              curTagNesting--;
          }
  
        public void visit(Node.Declaration n) throws JasperException {
            scriptingElementSeen = true;
        }
  
        public void visit(Node.Expression n) throws JasperException {
            scriptingElementSeen = true;
        }
  
        public void visit(Node.Scriptlet n) throws JasperException {
            scriptingElementSeen = true;
        }
  
          public void updatePageInfo(PageInfo pageInfo) {
              pageInfo.setMaxTagNesting(maxTagNesting);
            pageInfo.setScriptless(! scriptingElementSeen);
          }
      }
  
      public static void collect(Compiler compiler, Node.Nodes page)
                throws JasperException {
  
        CollectVisitor collectVisitor = new CollectVisitor();
          page.visit(collectVisitor);
          collectVisitor.updatePageInfo(compiler.getPageInfo());
  
      }
  }
  
  
  
  

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

Reply via email to