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]>