cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspDocumentParser.java Node.java Parser.java
luehe 2003/02/13 10:15:46 Modified:jasper2/src/share/org/apache/jasper/compiler Tag: tomcat_4_branch Generator.java JspDocumentParser.java Node.java Parser.java Log: Added support for to XML syntax Revision ChangesPath No revision No revision 1.35.2.19 +5 -11 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.35.2.18 retrieving revision 1.35.2.19 diff -u -r1.35.2.18 -r1.35.2.19 --- Generator.java10 Feb 2003 17:06:11 - 1.35.2.18 +++ Generator.java13 Feb 2003 18:15:45 - 1.35.2.19 @@ -1069,14 +1069,8 @@ * Fallback */ if (n.getBody() != null) { - n.getBody().visit(new Node.Visitor() { - public void visit(Node.FallBackAction n) { - n.setBeginJavaLine(out.getJavaLine()); - out.printil("out.println(" + - quote(new String(n.getText())) + ");"); - n.setEndJavaLine(out.getJavaLine()); - } - }); + visitBody(n); + out.printil("out.write(\"\\n\");"); } out.printil("out.println(" + quote("") + ");"); 1.4.2.3 +5 -3 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspDocumentParser.java Index: JspDocumentParser.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspDocumentParser.java,v retrieving revision 1.4.2.2 retrieving revision 1.4.2.3 diff -u -r1.4.2.2 -r1.4.2.3 --- JspDocumentParser.java17 Aug 2002 00:14:23 - 1.4.2.2 +++ JspDocumentParser.java13 Feb 2003 18:15:45 - 1.4.2.3 @@ -233,6 +233,8 @@ node = new Node.PlugIn(attrsCopy, start, current); } else if (qName.equals(JSP_TEXT_TAG)) { node = new Node.JspText(start, current); + } else if (qName.equals(JSP_FALLBACK_TAG)) { + node = new Node.FallBackAction(start, current); } else { node = getCustomTag(qName, attrsCopy, start, current); if (node == null) { 1.15.2.5 +5 -5 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.15.2.4 retrieving revision 1.15.2.5 diff -u -r1.15.2.4 -r1.15.2.5 --- Node.java 6 Nov 2002 23:43:51 - 1.15.2.4 +++ Node.java 13 Feb 2003 18:15:45 - 1.15.2.5 @@ -482,8 +482,8 @@ */ public static class FallBackAction extends Node { - public FallBackAction(Mark start, char[] text, Node parent) { - super(text, start, parent); + public FallBackAction(Mark start, Node parent) { + super(start, parent); } public void accept(Visitor v) throws JasperException { 1.7.2.4 +5 -10 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.7.2.3 retrieving revision 1.7.2.4 diff -u -r1.7.2.3 -r1.7.2.4 --- Parser.java 8 Oct 2002 23:42:06 - 1.7.2.3 +++ Parser.java 13 Feb 2003 18:15:45 - 1.7.2.4 @@ -610,13 +610,8 @@ err.jspError(reader.mark(), "jsp.error.fallback.notclosed"); } - Mark bodyStart = reader.mark(); -Mark bodyEnd = reader.skipUntilETag("jsp:fallback"); -if (bodyEnd == null) { -err.jspError(start, "jsp.error.unterminated", ""); - } - char[] text = reader.getText(bodyStart, bodyEnd); -new Node.FallBackAction(start, text, parent); +Node.FallBackAction fallback = new Node.FallBackAction(start, parent); + parseBodyText(fallback, "jsp:fallback"); } /* - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspDocumentParser.java Node.java Parser.java
luehe 2002/12/11 19:30:59 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspDocumentParser.java Node.java Parser.java Log: - Allow empty body, and treat it as "". - In a JSP document (XML syntax), preserve any leading and trailing white-space-only textual nodes in a whose 'trim' attribute is set to FALSE (these nodes are dropped otherwise). Revision ChangesPath 1.140 +30 -25 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.139 retrieving revision 1.140 diff -u -r1.139 -r1.140 --- Generator.java11 Dec 2002 19:40:45 - 1.139 +++ Generator.java12 Dec 2002 03:30:58 - 1.140 @@ -2687,8 +2687,8 @@ * @return The name of the temporary variable the result is stored in. */ public String generateNamedAttributeValue( Node.NamedAttribute n ) -throws JasperException -{ +throws JasperException { + String varName = n.getTemporaryVariableName(); // If the only body element for this named attribute node is @@ -2696,29 +2696,34 @@ // pushBody and popBody. Maybe we can further optimize // here by getting rid of the temporary variable, but in // reality it looks like javac does this for us. -boolean templateTextOptimization = false; Node.Nodes body = n.getBody(); -if( body.size() == 1 ) { -Node bodyElement = body.getNode( 0 ); -if( bodyElement instanceof Node.TemplateText ) { -templateTextOptimization = true; -out.printil( "String " + varName + " = " + -quote( new String( -((Node.TemplateText)bodyElement).getText() ) ) + ";" ); -} -} + if (body != null) { + boolean templateTextOptimization = false; + if( body.size() == 1 ) { + Node bodyElement = body.getNode( 0 ); + if( bodyElement instanceof Node.TemplateText ) { + templateTextOptimization = true; + out.printil("String " + varName + " = " + + quote(new String(((Node.TemplateText)bodyElement).getText())) + + ";"); + } + } -// XXX - Another possible optimization would be for -// lone EL expressions (no need to pushBody here either). + // XXX - Another possible optimization would be for + // lone EL expressions (no need to pushBody here either). -if( !templateTextOptimization ) { -out.printil( "out = pageContext.pushBody();" ); -visitBody( n ); -out.printil( "String " + varName + " = " + - "((javax.servlet.jsp.tagext.BodyContent)" + - "out).getString();" ); -out.printil( "out = pageContext.popBody();" ); -} + if( !templateTextOptimization ) { + out.printil( "out = pageContext.pushBody();" ); + visitBody( n ); + out.printil( "String " + varName + " = " + + "((javax.servlet.jsp.tagext.BodyContent)" + + "out).getString();" ); + out.printil( "out = pageContext.popBody();" ); + } + } else { + // Empty body must be treated as "" + out.printil("String " + varName + " = \"\";"); + } return varName; } 1.33 +38 -24 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspDocumentParser.java Index: JspDocumentParser.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspDocumentParser.java,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- JspDocumentParser.java10 Dec 2002 21:33:35 - 1.32 +++ JspDocumentParser.java12 Dec 2002 03:30:58 - 1.33 @@ -349,12 +349,15 @@ int offset, int len) throws SAXException { /* - * All textual nodes that have only white space are to be dropped from - * the document, except for nodes in a jsp:text element, which are - * kept verbatim (JSP 5.2.1). +
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspDocumentParser.java Node.java Parser.java
luehe 2002/07/17 13:06:59 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspDocumentParser.java Node.java Parser.java Log: Do not declare tag handler pools for SimpleTag handlers. Revision ChangesPath 1.40 +43 -72 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- Generator.java17 Jul 2002 00:35:30 - 1.39 +++ Generator.java17 Jul 2002 20:06:58 - 1.40 @@ -196,15 +196,16 @@ * already contained in it. */ public void visit(Node.CustomTag n) throws JasperException { - - String name = createTagHandlerPoolName(n.getPrefix(), -n.getShortName(), -n.getAttributes()); - n.setTagHandlerPoolName(name); - if (!names.contains(name)) { - names.add(name); - } + if (!n.implementsSimpleTag()) { + String name = createTagHandlerPoolName(n.getPrefix(), +n.getShortName(), +n.getAttributes()); + n.setTagHandlerPoolName(name); + if (!names.contains(name)) { + names.add(name); + } + } visitBody(n); } @@ -1453,11 +1454,9 @@ TagHandlerInfo handlerInfo = (TagHandlerInfo) handlerInfosByShortName.get(n.getShortName()); if (handlerInfo == null) { - handlerInfo = new TagHandlerInfo( - n, - n.getTagInfo().getTagClassName(), - ctxt.getClassLoader(), - err); + handlerInfo = new TagHandlerInfo(n, + n.getTagHandlerClass(), + err); handlerInfosByShortName.put(n.getShortName(), handlerInfo); } @@ -1467,22 +1466,14 @@ String tagEvalVar = "_jspx_eval_" + baseVar; String tagHandlerVar = "_jspx_th_" + baseVar; - Class tagHandlerClass = handlerInfo.getTagHandlerClass(); - boolean implementsIterationTag = - IterationTag.class.isAssignableFrom(tagHandlerClass); - boolean implementsBodyTag = - BodyTag.class.isAssignableFrom(tagHandlerClass); - boolean implementsTryCatchFinally = - TryCatchFinally.class.isAssignableFrom(tagHandlerClass); - boolean implementsSimpleTag = - SimpleTag.class.isAssignableFrom(tagHandlerClass); + Class tagHandlerClass = n.getTagHandlerClass(); // If the tag contains no scripting element, generate its codes // to a method. ServletWriter outSave = null; MethodsBuffer methodsBufferSave = null; Node.ChildInfo ci = n.getChildInfo(); - if (implementsSimpleTag + if (n.implementsSimpleTag() || (ci.isScriptless() && !ci.hasScriptingVars())) { // The tag handler and its body code can reside in a separate // method if it is scriptless and does not have any scripting @@ -1532,17 +1523,14 @@ generateLocalVariables( out, n ); } - if (implementsSimpleTag) { - generateCustomDoTag(n, handlerInfo, tagHandlerVar, - implementsTryCatchFinally); + if (n.implementsSimpleTag()) { + generateCustomDoTag(n, handlerInfo, tagHandlerVar); } else { /* * Classic tag handler: Generate code for start element, body, * and end element */ - generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar, - implementsIterationTag, implementsBodyTag, - implementsTryCatchFinally); + generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar); // visit body String tmpParent = parent; @@ -1553,12 +1541,10 @@ parent = tmpParent; isSimpleTagHandler = tmpIsSimpleTagHandler; - generateCustomEnd(n, tagHandlerVar, tagEvalVar, -
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Generator.java JspDocumentParser.java Node.java Parser.java
kinman 2002/06/13 11:56:18 Modified:jasper2/src/share/org/apache/jasper/compiler Generator.java JspDocumentParser.java Node.java Parser.java Log: - Patch by Jan Luehe, to fix 2 problems related to scripting variables. 1. AT_BEGIN and AT_END variables are not accessible after tag end. 2. Tags within the same tag cuases Javac compilation errors. Revision ChangesPath 1.29 +351 -64 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java === RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- Generator.java12 Jun 2002 23:17:36 - 1.28 +++ Generator.java13 Jun 2002 18:56:18 - 1.29 @@ -185,12 +185,13 @@ public void visit(Node.CustomTag n) throws JasperException { String name = createTagHandlerPoolName(n.getPrefix(), - n.getShortName(), - n.getAttributes()); +n.getShortName(), +n.getAttributes()); n.setTagHandlerPoolName(name); if (!names.contains(name)) { names.add(name); } + visitBody(n); } @@ -234,6 +235,80 @@ page.visit(new TagHandlerPoolVisitor(tagHandlerPoolNames)); } + +/* + * For every custom tag, declares its scripting variables with AT_BEGIN + * and AT_END scopes. + */ +private void declareAtBeginAtEndScriptingVariables(Node.Nodes page) + throws JasperException { + + class ScriptingVariableDeclarationVisitor extends Node.Visitor { + + /* + * Vector keeping track of which scripting variables have already + * been declared + */ + private Vector scriptVars; + + /* + * Constructor. + */ + public ScriptingVariableDeclarationVisitor() { + scriptVars = new Vector(); + } + + public void visit(Node.CustomTag n) throws JasperException { + + TagVariableInfo[] tagVarInfos = n.getTagVariableInfos(); + VariableInfo[] varInfos = n.getVariableInfos(); + + if ((varInfos == null) && (tagVarInfos == null)) { + visitBody(n); + } + + if (varInfos != null) { + for (int i=0; i 0) { out.printil("return false;"); @@ -1213,23 +1298,33 @@ } private void generateCustomStart(Node.CustomTag n, - VariableInfo[] varInfos, - TagVariableInfo[] tagVarInfos, TagHandlerInfo handlerInfo, String tagHandlerVar, String tagEvalVar) throws JasperException { + Class tagHandlerClass = handlerInfo.getTagHandlerClass(); + n.setBeginJavaLine(out.getJavaLine()); out.printin("/* "); out.print(n.getName()); out.println(" */"); - Class tagHandlerClass = handlerInfo.getTagHandlerClass(); - boolean implementsTryCatchFinally = TryCatchFinally.class.isAssignableFrom(tagHandlerClass); + /* + * Declare variables where current contents of scripting variables + * will be temporarily saved + */ + declareTemporaryScriptingVariables(n); + + // Declare scripting variables with NESTED scope + declareNestedScriptingVariables(n); + + // Save current value of scripting variables if required + saveScriptingVariables(n); + out.printin(tagHandlerClass.getName()); out.print(" "); out.print(tagHandlerVar); @@ -1256,10 +1351,9 @@ boolean isBodyTag = BodyTag.class.isAssignableFrom(tagHandlerClass); - // Declare and synchronize AT_BEGIN scripting variables - syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(), -VariableInfo.AT_BEGIN, true); - + // Synchronize AT_BEGIN scripting variables + syncScriptingVariables(n, VariableInfo.AT_BEGIN); + if (n.getBody() != null) { out.printin("if ("); out.print(tagEvalVar); @@ -1291,23 +1385,21 @@ } }