kinman      2003/02/11 18:22:51

  Modified:    jasper2/src/share/org/apache/jasper/compiler Compiler.java
                        PageInfo.java TagPluginManager.java
               jasper2/src/share/org/apache/jasper/compiler/tagplugin
                        TagPluginContext.java
               jasper2/src/share/org/apache/jasper/tagplugins/jstl
                        ForEach.java
  Log:
  - More work on optimizing jstl's forEach.  Now it handles Collection.
    Array would be next.
  - Add couple of method to TagPluginContext interface
  
  Revision  Changes    Path
  1.51      +1 -1      
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.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- Compiler.java     7 Feb 2003 19:19:25 -0000       1.50
  +++ Compiler.java     12 Feb 2003 02:22:51 -0000      1.51
  @@ -270,7 +270,7 @@
   
        // Optimizations by Tag Plugins
        TagPluginManager tagPluginManager = options.getTagPluginManager();
  -     tagPluginManager.apply(pageNodes, errDispatcher);
  +     tagPluginManager.apply(pageNodes, errDispatcher, pageInfo);
   
        // generate servlet .java file
        Generator.generate(writer, this, pageNodes);
  
  
  
  1.18      +7 -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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- PageInfo.java     27 Jan 2003 18:10:47 -0000      1.17
  +++ PageInfo.java     12 Feb 2003 02:22:51 -0000      1.18
  @@ -125,6 +125,10 @@
        this.imports.addAll(imports);
       }
   
  +    public void addImport(String imp) {
  +     this.imports.add(imp);
  +    }
  +
       public List getImports() {
        return imports;
       }
  
  
  
  1.11      +15 -6     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagPluginManager.java
  
  Index: TagPluginManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagPluginManager.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- TagPluginManager.java     11 Jan 2003 00:11:06 -0000      1.10
  +++ TagPluginManager.java     12 Feb 2003 02:22:51 -0000      1.11
  @@ -84,12 +84,13 @@
       private boolean initialized = false;
       private Hashtable tagPlugins = null;
       private ServletContext ctxt;
  +    private PageInfo pageInfo;
   
       public TagPluginManager(ServletContext ctxt) {
        this.ctxt = ctxt;
       }
   
  -    public void apply(Node.Nodes page, ErrorDispatcher err)
  +    public void apply(Node.Nodes page, ErrorDispatcher err, PageInfo pageInfo)
            throws JasperException {
   
        init(err);
  @@ -97,6 +98,8 @@
            return;
        }
   
  +     this.pageInfo = pageInfo;
  +
           page.visit(new Node.Visitor() {
               public void visit(Node.CustomTag n)
                       throws JasperException {
  @@ -171,16 +174,18 @@
            return;
        }
   
  -     TagPluginContext tagPluginContext = new TagPluginContextImpl(n);
  +     TagPluginContext tagPluginContext = new TagPluginContextImpl(n, pageInfo);
        tagPlugin.doTag(tagPluginContext);
       }
   
       static class TagPluginContextImpl implements TagPluginContext {
        Node.CustomTag node;
        Node.Nodes curNodes;
  +     PageInfo pageInfo;
   
  -     TagPluginContextImpl(Node.CustomTag n) {
  +     TagPluginContextImpl(Node.CustomTag n, PageInfo pageInfo) {
            this.node = n;
  +         this.pageInfo = pageInfo;
            curNodes = new Node.Nodes();
            n.setAtETag(curNodes);
            curNodes = new Node.Nodes();
  @@ -198,6 +203,10 @@
   
        public String getTemporaryVariableName() {
            return JspUtil.nextTemporaryVariableName();
  +     }
  +
  +     public void generateImport(String imp) {
  +         pageInfo.addImport(imp);
        }
   
        public void generateJavaSource(String sourceCode) {
  
  
  
  1.7       +17 -4     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/tagplugin/TagPluginContext.java
  
  Index: TagPluginContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/tagplugin/TagPluginContext.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- TagPluginContext.java     5 Dec 2002 19:32:52 -0000       1.6
  +++ TagPluginContext.java     12 Feb 2003 02:22:51 -0000      1.7
  @@ -87,12 +87,25 @@
       String getTemporaryVariableName();
   
       /**
  +     * Generate an import statement
  +     * @param importName Name of the import class, '*' allowed.
  +     */
  +    void generateImport(String s);
  +
  +    /**
        * Generate Java source codes
        */
       void generateJavaSource(String s);
   
       /**
  -     * Generate Attribute value of a attribute in the custom tag
  +     * @return true if the attribute is specified and its value is a
  +     *         translation-time constant.
  +     */
  +    boolean isConstantAttribute(String attribute);
  +
  +    /**
  +     * Generate codesto evaluate value of a attribute in the custom tag
  +     * The codes is a Java expression.
        * NOTE: Currently cannot handle attributes that are fragments.
        * @param attribute The specified attribute
        */
  
  
  
  1.4       +95 -8     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/tagplugins/jstl/ForEach.java
  
  Index: ForEach.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/tagplugins/jstl/ForEach.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ForEach.java      22 Jan 2003 11:44:01 -0000      1.3
  +++ ForEach.java      12 Feb 2003 02:22:51 -0000      1.4
  @@ -77,7 +77,7 @@
   
        boolean hasItems = ctxt.isAttributeSpecified("items");
        if (hasItems) {
  -         // optimizations stubbed out for now
  +         doCollection(ctxt);
            return;
        }
   
  @@ -89,12 +89,9 @@
        // We must have a begin and end attributes
        index = ctxt.getTemporaryVariableName();
        ctxt.generateJavaSource("for (int " + index + " = ");
  -     ctxt.generateJavaSource("Integer.parseInt(");
        ctxt.generateAttribute("begin");
  -     ctxt.generateJavaSource("); " + index + " <= ");
  -     ctxt.generateJavaSource("Integer.parseInt(");
  +     ctxt.generateJavaSource("; " + index + " <= ");
        ctxt.generateAttribute("end");
  -     ctxt.generateJavaSource(")");
        if (hasStep) {
            ctxt.generateJavaSource("; " + index + "+=");
            ctxt.generateAttribute("step");
  @@ -113,5 +110,95 @@
        }
        ctxt.generateBody();
        ctxt.generateJavaSource("}");
  +    }
  +
  +    /**
  +     * Generate codes for Collections
  +     * The pseudo code is:
  +     */
  +    private void doCollection(TagPluginContext ctxt) {
  +     boolean hasVar = ctxt.isAttributeSpecified("var");
  +     boolean hasBegin = ctxt.isAttributeSpecified("begin");
  +     boolean hasEnd = ctxt.isAttributeSpecified("end");
  +     boolean hasStep = ctxt.isAttributeSpecified("step");
  +
  +     ctxt.generateImport("java.util.*");
  +
  +        String itemsV = ctxt.getTemporaryVariableName();
  +        ctxt.generateJavaSource("Object " + itemsV + "= ");
  +        ctxt.generateAttribute("items");
  +        ctxt.generateJavaSource(";");
  +     
  +     String indexV=null, beginV=null, endV=null, stepV=null;
  +     if (hasBegin) {
  +         beginV = ctxt.getTemporaryVariableName();
  +         ctxt.generateJavaSource("int " + beginV + " = ");
  +         ctxt.generateAttribute("begin");
  +         ctxt.generateJavaSource(";");
  +     }
  +     if (hasEnd) {
  +         indexV = ctxt.getTemporaryVariableName();
  +         ctxt.generateJavaSource("int " + indexV + " = 0;");
  +         endV = ctxt.getTemporaryVariableName();
  +         ctxt.generateJavaSource("int " + endV + " = ");
  +         ctxt.generateAttribute("end");
  +         ctxt.generateJavaSource(";");
  +     }
  +     if (hasStep) {
  +         stepV = ctxt.getTemporaryVariableName();
  +         ctxt.generateJavaSource("int " + stepV + " = ");
  +         ctxt.generateAttribute("step");
  +         ctxt.generateJavaSource(";");
  +     }
  +
  +        ctxt.generateJavaSource("if (" + itemsV + " instanceof Collection) {");
  +        String iterV = ctxt.getTemporaryVariableName();
  +        ctxt.generateJavaSource("Iterator " + iterV + " = ");
  +     ctxt.generateJavaSource("((Collection)" + itemsV + ").iterator();");
  +
  +     if (hasBegin) {
  +            String tV = ctxt.getTemporaryVariableName();
  +         ctxt.generateJavaSource("for (int " + tV + "=" + beginV + ";" +
  +                     tV + ">0 && " + iterV + ".hasNext(); " +
  +                     tV + "--)");
  +         ctxt.generateJavaSource(iterV + ".next();");
  +     }
  +
  +     ctxt.generateJavaSource("while (" + iterV + ".hasNext()){");
  +        String nextV = ctxt.getTemporaryVariableName();
  +     ctxt.generateJavaSource("Object " + nextV + " = " + iterV + ".next();");
  +     if (hasVar) {
  +         ctxt.generateJavaSource("pageContext.setAttribute(");
  +         ctxt.generateAttribute("var");
  +         ctxt.generateJavaSource(", " + nextV + ");");
  +     }
  +
  +     ctxt.generateBody();
  +
  +     if (hasStep) {
  +         String tV = ctxt.getTemporaryVariableName();
  +         ctxt.generateJavaSource("for (int " + tV + "=" + stepV + "-1;" +
  +                     tV + ">0 && " + iterV + ".hasNext(); " +
  +                     tV + "--)");
  +         ctxt.generateJavaSource(iterV + ".next();");
  +     }
  +     if (hasEnd) {
  +         if (hasStep) {
  +             ctxt.generateJavaSource(indexV + "+=" + stepV + ";");
  +         }
  +         else {
  +             ctxt.generateJavaSource(indexV + "++;");
  +         }
  +         if (hasBegin) {
  +             ctxt.generateJavaSource("if(" + beginV + "+" + indexV +
  +                     ">"+ endV + ")");
  +         }
  +         else {
  +             ctxt.generateJavaSource("if(" + indexV + ">" + endV + ")");
  +         }
  +         ctxt.generateJavaSource("break;");
  +     }
  +     ctxt.generateJavaSource("}");   // while
  +     ctxt.generateJavaSource("}");   // if
       }
   }
  
  
  

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

Reply via email to