You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ki...@apache.org on 2003/10/29 00:04:11 UTC
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler TextOptimizer.java Compiler.java Node.java Parser.java
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 apache@apache.org.
*
* 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: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org