Index: 
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v
retrieving revision 1.6
diff -u -r1.6 Generator.java
--- jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java  
 25 Apr 2002 18:16:06 -0000      1.6
+++ jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java  
+ 28 Apr 2002 14:50:16 -0000
@@ -63,6 +63,8 @@
 import java.util.*;
 import java.beans.*;
 import java.net.URLEncoder;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.lang.reflect.Method;
 import javax.servlet.jsp.tagext.*;
 import org.xml.sax.Attributes;
@@ -91,6 +93,9 @@
     private JspCompilationContext ctxt;
     private boolean breakAtLF;
     private PageInfo pageInfo;
+    private FinallyApplyer finallies;
+    private int tryBit;
+    private Stack tryStack;
 
     /**
      * @param s the input string
@@ -176,6 +181,8 @@
            out.print  ((String)iter.next());
            out.println(";");
        }
+       out.printil("import java.util.Vector;");
+       out.printil("import java.util.BitSet;");
        out.println();
 
        // Generate class declaration
@@ -199,6 +206,17 @@
 
        // Constructor (empty so far) here
        // Other methods here
+       out.printil("private void addTagToVector(Vector tags, int index, 
+javax.servlet.jsp.tagext.Tag tag) {");
+       out.pushIndent();
+       out.printil("if (index + 1 > tags.size())");
+       out.pushIndent();
+       out.printil("tags.setSize(index + 1);");
+       out.popIndent();
+       out.printil("tags.setElementAt(tag, index);");
+       out.popIndent();
+       out.printil("}");
+       out.println();
+       out.println();
 
        // Now the service method
        out.printin("public void ");
@@ -222,6 +240,8 @@
        out.printil("ServletConfig config = null;");
        out.printil("JspWriter out = null;");
        out.printil("Object page = this;");
+       out.printil("BitSet bitmask = new BitSet();");
+       out.printil("Vector tags = new Vector();");
 
        out.printil("try {");
        out.pushIndent();
@@ -882,6 +902,10 @@
            out.println(" ---- */");
 
            Class tagHandlerClass = handlerInfo.getTagHandlerClass();
+
+           boolean implementsTryCatchFinally =
+                   TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
+
            out.printin(tagHandlerClass.getName());
            out.print(" ");
            out.print(tagHandlerVar);
@@ -895,8 +919,22 @@
            declareTagVariableInfos(tagVarInfos, n.getTagData(),
                                    VariableInfo.AT_BEGIN);
            
-           out.printil("try {");
-           out.pushIndent();
+           if (implementsTryCatchFinally) {
+               out.printil("try {");
+               out.pushIndent();
+           } else {
+               out.printil("// try {");
+               out.printin("bitmask.set(");
+               Integer tryBitVal = new Integer(tryBit++);
+               tryStack.push(tryBitVal);
+               out.print(tryBitVal.toString());
+               out.println(");");
+               out.printin("addTagToVector(tags, ");
+               out.print(tryBitVal.toString());
+               out.print(", ");
+               out.print(tagHandlerVar);
+               out.println(");");
+           }
            out.printin("int ");
            out.print(tagEvalVar);
            out.print(" = ");
@@ -918,8 +956,12 @@
                out.pushIndent();
                
                if (isBodyTag) {
-                   out.printil("try {");
-                   out.pushIndent();
+                   out.printil("// try {");
+                   out.printin("bitmask.set(");
+                   Integer tryBitVal = new Integer(tryBit++);
+                   tryStack.push(tryBitVal);
+                   out.print(tryBitVal.toString());
+                   out.println(");");
                    out.printin("if (");
                    out.print(tagEvalVar);
                    out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) 
{");
@@ -981,19 +1023,35 @@
 
            if (n.getBody() != null) {
                if (implementsBodyTag) {
-                   out.popIndent(); // try
+                   Integer tryBitVal = (Integer)tryStack.pop();
+                   out.printil("// } finally {");
+                   out.printin("bitmask.clear(");
+                   out.print(tryBitVal.toString());
+                   out.println(");");
+
+                   out.printin("addTagToVector(tags, ");
+                   out.print(tryBitVal.toString());
+                   out.print(", ");
+                   out.print(tagHandlerVar);
+                   out.println(");");
 
-                   out.printil("} finally {");
-                   out.pushIndent();
                    out.printin("if (");
                    out.print(tagEvalVar);
                    out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)");
                    out.pushIndent();
                    out.printil("out = pageContext.popBody();");
                    out.popIndent();
+
+                   finallies.beginPartMethod(tryBitVal.intValue());
+                   finallies.print("      if (");
+                   
+finallies.print("((javax.servlet.jsp.tagext.BodyTag)tags.elementAt(");
+                   finallies.print(tryBitVal.toString());
+                   finallies.print(")).doAfterBody()");
+                   finallies.println(" != 
+javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)");
+                   finallies.println("        out = pageContext.popBody();");
                    
-                   out.popIndent();
-                   out.printil("}");
+                   finallies.endPartMethod();
+                   out.printil("// }");
                }
                
                out.popIndent(); // EVAL_BODY
@@ -1007,26 +1065,39 @@
            out.printil("return;");
            out.popIndent();
 
-           out.popIndent(); // try
-
            // TryCatchFinally
            if (implementsTryCatchFinally) {
+               out.popIndent(); // try
+
                out.printil("} catch (Throwable _jspx_exception) {");
                out.pushIndent();
                out.printin(tagHandlerVar);
                out.println(".doCatch(_jspx_exception);");
                out.popIndent();
-           }
-           out.printil("} finally {");
-           out.pushIndent();
-           if (implementsTryCatchFinally) {
+               out.printil("} finally {");
+               out.pushIndent();
                out.printin(tagHandlerVar);
                out.println(".doFinally();");
+               out.printin(tagHandlerVar);
+               out.println(".release();");
+               out.popIndent();
+               out.printil("}");
+           } else {
+               Integer tryBitVal = (Integer)tryStack.pop();
+               out.printil("// } finally {");
+               out.printin("bitmask.clear(");
+               out.print(tryBitVal.toString());
+               out.println(");");
+               out.printin(tagHandlerVar);
+               out.println(".release();");
+               out.printil("// }");
+               finallies.beginPartMethod(tryBitVal.intValue());
+               finallies.printin("((javax.servlet.jsp.tagext.Tag)tags.elementAt(");
+               finallies.print(tryBitVal.toString());
+               finallies.print("))");
+               finallies.println(".release();");
+               finallies.endPartMethod();
            }
-           out.printin(tagHandlerVar);
-           out.println(".release();");
-           out.popIndent();
-           out.printil("}");
 
            // Declare and update AT_END variables
            updateVariableInfos(varInfos, VariableInfo.AT_END, true);
@@ -1302,7 +1373,18 @@
         out.pushIndent();
 
         // Do stuff here for finally actions...
+
+        out.printil("try {");
+        out.pushIndent();
+        out.printil("finallies(bitmask, out, tags);");
+        out.popIndent();
+        out.printil("} catch (javax.servlet.jsp.JspException e) {");
+        out.pushIndent();
+        out.printil("if (pageContext != null) pageContext.handlePageException(e);");
+        out.popIndent();
+        out.printil("}");
         out.printil("if (_jspxFactory != null) 
_jspxFactory.releasePageContext(pageContext);");
+
         out.popIndent();
         out.printil("}");
 
@@ -1310,6 +1392,10 @@
         out.popIndent();
         out.printil("}");
 
+        // Call the final method
+        finallies.done();
+        out.printil(finallies.toString());
+
         // Close the class definition
         out.popIndent();
         out.printil("}");
@@ -1325,6 +1411,8 @@
        pageInfo = compiler.getPageInfo();
        beanInfo = pageInfo.getBeanRepository();
        breakAtLF = ctxt.getOptions().getMappedFile();
+       finallies = new FinallyApplyer();
+       tryStack = new Stack();
     }
 
     /**
@@ -1417,6 +1505,55 @@
         */
        public Class getTagHandlerClass() {
            return tagHandlerClass;
+       }
+    }
+  
+    private static class FinallyApplyer {
+       private PrintStream finalOutput;
+       private ByteArrayOutputStream rawOutput;
+
+       FinallyApplyer() {
+           rawOutput = new ByteArrayOutputStream();
+           finalOutput = new PrintStream(rawOutput, true);
+
+           finalOutput.println();
+           finalOutput.println("  private void finallies(BitSet bitmask, JspWriter 
+out, Vector tags)");
+           finalOutput.println("  throws javax.servlet.jsp.JspException {");
+       }
+
+       public void done() {
+           finalOutput.println("  }");
+       }
+
+       public void beginPartMethod(int bit) {
+           finalOutput.print("    if (bitmask.get(");
+           finalOutput.print(bit);
+           finalOutput.println(")) {");
+       }
+
+       public void endPartMethod() {
+           finalOutput.println("    }");
+           finalOutput.println();
+       }
+
+       public void println(String aLine) {
+           if (null != aLine) {
+               finalOutput.print(aLine);
+           }
+           finalOutput.println();
+       }
+
+       public void printin(String partLine) {
+           finalOutput.print("      ");
+           finalOutput.print(partLine);
+       }
+
+       public void print(String partLine) {
+           finalOutput.print(partLine);
+       }
+
+       public String toString() {
+           return rawOutput.toString();
        }
     }
 }


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

Reply via email to