luehe       2003/01/16 16:51:35

  Modified:    jasper2/src/share/org/apache/jasper/compiler Generator.java
  Log:
  Fixed 16181: JspWriter not restored properly when exception thrown in a tag's body 
content
  
  Revision  Changes    Path
  1.149     +48 -7     
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.148
  retrieving revision 1.149
  diff -u -r1.148 -r1.149
  --- Generator.java    15 Jan 2003 22:46:29 -0000      1.148
  +++ Generator.java    17 Jan 2003 00:51:34 -0000      1.149
  @@ -706,6 +706,7 @@
   
        private Hashtable tagVarNumbers;
        private String parent;
  +     private String pushBodyCount;
        private String simpleTagHandlerVar;
        private boolean isSimpleTagHandler;
        private boolean isFragment;
  @@ -1489,6 +1490,7 @@
                                              n.getShortName());
            String tagEvalVar = "_jspx_eval_" + baseVar;
            String tagHandlerVar = "_jspx_th_" + baseVar;
  +         String tagPushBodyCountVar = "_jspx_push_body_count_" + baseVar;
   
            // If the tag contains no scripting element, generate its codes
            // to a method.
  @@ -1551,18 +1553,30 @@
                 * Classic tag handler: Generate code for start element, body,
                 * and end element
                 */
  -             generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar);
  +             generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar,
  +                                 tagPushBodyCountVar);
   
                // visit body
                String tmpParent = parent;
                parent = tagHandlerVar;
  +             String tmpPushBodyCount = null;
  +             if (n.implementsTryCatchFinally()) {
  +                 tmpPushBodyCount = pushBodyCount;
  +                 pushBodyCount = tagPushBodyCountVar;
  +             }
                boolean tmpIsSimpleTagHandler = isSimpleTagHandler;
                isSimpleTagHandler = false;
  +
                visitBody(n);
  +
                parent = tmpParent;
  +             if (n.implementsTryCatchFinally()) {
  +                 pushBodyCount = tmpPushBodyCount;
  +             }
                isSimpleTagHandler = tmpIsSimpleTagHandler;
   
  -             generateCustomEnd(n, tagHandlerVar, tagEvalVar);
  +             generateCustomEnd(n, tagHandlerVar, tagEvalVar,
  +                               tagPushBodyCountVar);
            }
   
            if (ci.isScriptless() && !ci.hasScriptingVars()) {
  @@ -1911,7 +1925,8 @@
        private void generateCustomStart(Node.CustomTag n,
                                         TagHandlerInfo handlerInfo,
                                         String tagHandlerVar,
  -                                      String tagEvalVar)
  +                                      String tagEvalVar,
  +                                      String tagPushBodyCountVar)
                            throws JasperException {
   
            Class tagHandlerClass = handlerInfo.getTagHandlerClass();
  @@ -1946,6 +1961,9 @@
            generateSetters(n, tagHandlerVar, handlerInfo, false);
            
               if (n.implementsTryCatchFinally()) {
  +             out.printin("int ");
  +             out.print(tagPushBodyCountVar);
  +             out.println(" = 0;");
                   out.printil("try {");
                   out.pushIndent();
               }
  @@ -1977,6 +1995,13 @@
                    // Assume EVAL_BODY_BUFFERED
                    out.pushIndent();
                    out.printil("out = pageContext.pushBody();");
  +                 if (n.implementsTryCatchFinally()) {
  +                     out.printin(tagPushBodyCountVar);
  +                     out.println("++;");
  +                 } else if (pushBodyCount != null) {
  +                     out.printin(pushBodyCount);
  +                     out.println("++;");
  +                 }
                    out.printin(tagHandlerVar);
                    
out.println(".setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);");
                    out.printin(tagHandlerVar);
  @@ -2003,7 +2028,8 @@
        
        private void generateCustomEnd(Node.CustomTag n,
                                       String tagHandlerVar,
  -                                    String tagEvalVar) {
  +                                    String tagEvalVar,
  +                                    String tagPushBodyCountVar) {
   
            if (!n.hasEmptyBody()) {
                if (n.implementsIterationTag()) {
  @@ -2032,6 +2058,13 @@
                    out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)");
                    out.pushIndent();
                       out.printil("out = pageContext.popBody();");
  +                 if (n.implementsTryCatchFinally()) {
  +                     out.printin(tagPushBodyCountVar);
  +                     out.println("--;");
  +                 } else if (pushBodyCount != null) {
  +                     out.printin(pushBodyCount);
  +                     out.println("--;");
  +                 }
                    out.popIndent();
                }
   
  @@ -2058,6 +2091,14 @@
                   out.popIndent(); // try
                out.printil("} catch (Throwable _jspx_exception) {");
                out.pushIndent();
  +
  +             out.printin("while (");
  +             out.print(tagPushBodyCountVar);
  +             out.println("-- > 0)");
  +             out.pushIndent();
  +             out.printil("out = pageContext.popBody();");
  +             out.popIndent();
  +
                out.printin(tagHandlerVar);
                out.println(".doCatch(_jspx_exception);");
                out.popIndent();
  
  
  

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

Reply via email to