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]