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]

Reply via email to