kinman 2003/10/28 15:04:11 Modified: jasper2/src/share/org/apache/jasper/compiler Compiler.java Node.java Parser.java Added: jasper2/src/share/org/apache/jasper/compiler TextOptimizer.java Log: - Concatenate text strings of adjecent TemplateText nodes. This may reduce code size and improve performance. - Remove previous implementation for "mappedfile" options from Parser, since this functionality works for free now. Revision Changes Path 1.73 +3 -0 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.72 retrieving revision 1.73 diff -u -r1.72 -r1.73 --- Compiler.java 28 Oct 2003 19:18:53 -0000 1.72 +++ Compiler.java 28 Oct 2003 23:04:11 -0000 1.73 @@ -267,6 +267,9 @@ TagPluginManager tagPluginManager = options.getTagPluginManager(); tagPluginManager.apply(pageNodes, errDispatcher, pageInfo); + // Optimization: concatenate contiguous template texts. + TextOptimizer.concatenate(pageNodes); + // Generate static function mapper codes. ELFunctionMapper.map(this, pageNodes); 1.78 +7 -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.77 retrieving revision 1.78 diff -u -r1.77 -r1.78 --- Node.java 16 Sep 2003 17:46:43 -0000 1.77 +++ Node.java 28 Oct 2003 23:04:11 -0000 1.78 @@ -1943,6 +1943,10 @@ text = text.substring(index); } + public void setText(String text) { + this.text = text; + } + /** * Trim all whitespace from the right of the template text */ 1.83 +5 -44 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java Index: Parser.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java,v retrieving revision 1.82 retrieving revision 1.83 diff -u -r1.82 -r1.83 --- Parser.java 23 Sep 2003 20:47:23 -0000 1.82 +++ Parser.java 28 Oct 2003 23:04:11 -0000 1.83 @@ -101,7 +101,6 @@ private boolean directivesOnly; private URL jarFileUrl; private PageInfo pageInfo; - private boolean mappedFile; // Virtual body content types, to make parsing a little easier. // These are not accessible from outside the parser. @@ -128,7 +127,6 @@ this.directivesOnly = directivesOnly; this.jarFileUrl = jarFileUrl; start = reader.mark(); - mappedFile = ctxt.getOptions().getMappedFile(); } /** @@ -1409,44 +1407,9 @@ return true; } - /** - * Determines whether the current text is template text - * or not. Assumes the reader is at the character - * following the "<". - */ - private boolean isTemplateText() throws JasperException { - - Mark m = reader.mark(); - int ch = reader.peekChar(); - if (ch == '/') { - reader.nextChar(); - } - String tagIdentifier = reader.parseToken(false); - reader.reset(m); - - if (tagIdentifier.startsWith("%")) { - return false; - } - if (tagIdentifier.startsWith("jsp:")) { - return false; - } - - // Check if this is a user-defined tag. - int i = tagIdentifier.indexOf(':'); - if (i == -1) { - return true; - } - String prefix = tagIdentifier.substring(0, i); - String uri = pageInfo.getURI(prefix); - if (uri == null) { - return true; - } - - return false; - } - /* - * + * Parse for a template text string until '<' or "${" is encountered, + * recognizing escape sequences "\%" and "\$". */ private void parseTemplateText(Node parent) throws JasperException { @@ -1461,11 +1424,9 @@ while (reader.hasMoreInput()) { ch = reader.nextChar(); if (ch == '<') { - if (!mappedFile || !isTemplateText()) { reader.pushChar(); break; } - } else if( ch == '$' ) { if (!reader.hasMoreInput()) { ttext.write('$'); 1.1 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TextOptimizer.java Index: TextOptimizer.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TextOptimizer.java,v 1.1 2003/10/28 23:04:11 kinman Exp $ * $Revision: 1.1 $ * $Date: 2003/10/28 23:04:11 $ * * ==================================================================== * * 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; /** */ public class TextOptimizer { /** * A visitor to concatenate contiguous template texts. */ static class TextCatVisitor extends Node.Visitor { private int textNodeCount = 0; private Node.TemplateText firstTextNode = null; private StringBuffer textBuffer; private final String emptyText = new String(""); public void doVisit(Node n) throws JasperException { collectText(); } /* * The following directis are ignored in text concatenation */ public void visit(Node.PageDirective n) throws JasperException { } public void visit(Node.TagDirective n) throws JasperException { } public void visit(Node.TaglibDirective n) throws JasperException { } public void visit(Node.AttributeDirective n) throws JasperException { } public void visit(Node.VariableDirective n) throws JasperException { } public void visit(Node.Comment n) throws JasperException { } /* * Don't concatenate text across body boundaries */ public void visitBody(Node n) throws JasperException { super.visitBody(n); collectText(); } public void visit(Node.TemplateText n) throws JasperException { if (textNodeCount++ == 0) { firstTextNode = n; textBuffer = new StringBuffer(n.getText()); } else { // Append text to text buffer textBuffer.append(n.getText()); n.setText(emptyText); } } /** * This method breaks concatenation mode. As a side effect it copies * the concatenated string to the first text node */ private void collectText() { if (textNodeCount > 1) { // Copy the text in buffer into the first template text node. firstTextNode.setText(textBuffer.toString()); } textNodeCount = 0; } } public static void concatenate(Node.Nodes page) throws JasperException { TextCatVisitor v = new TextCatVisitor(); page.visit(v); // Cleanup, in case the page ends with a template text v.collectText(); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]