luehe       2002/09/09 17:36:24

  Modified:    jasper2/src/share/org/apache/jasper/compiler Tag:
                        tomcat_4_branch Generator.java Node.java
                        ScriptingVariabler.java
  Log:
  Fixed 12432: Can't compile JSP with nested custom tags that have VariableInfo
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.35.2.8  +73 -94    
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.7
  retrieving revision 1.35.2.8
  diff -u -r1.35.2.7 -r1.35.2.8
  --- Generator.java    9 Sep 2002 17:30:00 -0000       1.35.2.7
  +++ Generator.java    10 Sep 2002 00:36:23 -0000      1.35.2.8
  @@ -1144,27 +1144,15 @@
                }
            }
   
  -         Class tagHandlerClass = handlerInfo.getTagHandlerClass();
  -         boolean implementsIterationTag = 
  -             IterationTag.class.isAssignableFrom(tagHandlerClass);
  -         boolean implementsBodyTag = 
  -             BodyTag.class.isAssignableFrom(tagHandlerClass);
  -         boolean implementsTryCatchFinally = 
  -             TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
  -
            // Generate code for start tag, body, and end tag
  -         generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar,
  -                           implementsIterationTag, implementsBodyTag,
  -                           implementsTryCatchFinally);
  +         generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar);
   
            String tmpParent = parent;
            parent = tagHandlerVar;
            visitBody(n);
   
            parent = tmpParent;
  -         generateCustomEnd(n, tagHandlerVar, tagEvalVar,
  -                           implementsIterationTag, implementsBodyTag,
  -                           implementsTryCatchFinally);
  +         generateCustomEnd(n, tagHandlerVar, tagEvalVar);
   
            if (n.isScriptless() && !n.hasScriptingVars()) {
                // Generate end of method
  @@ -1289,10 +1277,7 @@
        private void generateCustomStart(Node.CustomTag n,
                                         TagHandlerInfo handlerInfo,
                                         String tagHandlerVar,
  -                                      String tagEvalVar,
  -                                      boolean implementsIterationTag,
  -                                      boolean implementsBodyTag,
  -                                      boolean implementsTryCatchFinally)
  +                                      String tagEvalVar)
                            throws JasperException {
   
            Class tagHandlerClass = handlerInfo.getTagHandlerClass();
  @@ -1304,13 +1289,7 @@
   
            // Declare AT_BEGIN scripting variables
            declareScriptingVars(n, VariableInfo.AT_BEGIN);
  -
  -         /*
  -          * Save current values of scripting variables, so that the 
  -          * scripting variables may be synchronized without affecting their
  -          * original values
  -          */
  -         saveScriptingVars(n);
  +         saveScriptingVars(n, VariableInfo.AT_BEGIN);
   
            out.printin(tagHandlerClass.getName());
            out.print(" ");
  @@ -1332,7 +1311,7 @@
   
            generateSetters(n, tagHandlerVar, handlerInfo);
            
  -            if (implementsTryCatchFinally) {
  +            if (n.implementsTryCatchFinally()) {
                   out.printil("try {");
                   out.pushIndent();
               }
  @@ -1342,12 +1321,9 @@
            out.print(tagHandlerVar);
            out.println(".doStartTag();");
   
  -         if (!implementsIterationTag) {
  +         if (!n.implementsBodyTag()) {
                // Synchronize AT_BEGIN scripting variables
                syncScriptingVars(n, VariableInfo.AT_BEGIN);
  -             // Declare and synchronize NESTED scripting variables
  -             declareScriptingVars(n, VariableInfo.NESTED);
  -             syncScriptingVars(n, VariableInfo.NESTED);
            }
   
            if (n.getBody() != null) {
  @@ -1356,37 +1332,37 @@
                out.println(" != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {");
                out.pushIndent();
                
  -             if (implementsIterationTag) {
  -                 // Declare NESTED scripting variables
  -                 declareScriptingVars(n, VariableInfo.NESTED);
  -
  -                 if (n.implementsBodyTag()) {
  -                     out.printin("if (");
  -                     out.print(tagEvalVar);
  -                     out.println(" != 
javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {");
  -                     // Assume EVAL_BODY_BUFFERED
  -                     out.pushIndent();
  -                     out.printil("javax.servlet.jsp.tagext.BodyContent _bc = 
pageContext.pushBody();");
  -                     out.printil("_bc.clear();");
  -                     out.printil("out = _bc;");
  -
  -                     out.printin(tagHandlerVar);
  -                     out.println(".setBodyContent(_bc);");
  -                     out.printin(tagHandlerVar);
  -                     out.println(".doInitBody();");
  -
  -                     // Synchronize AT_BEGIN and NESTED scripting variables
  -                     syncScriptingVars(n, VariableInfo.AT_BEGIN);
  -                     syncScriptingVars(n, VariableInfo.NESTED);
  +             // Declare NESTED scripting variables
  +             declareScriptingVars(n, VariableInfo.NESTED);
  +             saveScriptingVars(n, VariableInfo.NESTED);
  +
  +             if (n.implementsBodyTag()) {
  +                 out.printin("if (");
  +                 out.print(tagEvalVar);
  +                 out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) 
{");
  +                 // Assume EVAL_BODY_BUFFERED
  +                 out.pushIndent();
  +                 out.printil("javax.servlet.jsp.tagext.BodyContent _bc = 
pageContext.pushBody();");
  +                 out.printil("_bc.clear();");
  +                 out.printil("out = _bc;");
  +
  +                 out.printin(tagHandlerVar);
  +                 out.println(".setBodyContent(_bc);");
  +                 out.printin(tagHandlerVar);
  +                 out.println(".doInitBody();");
  +
  +                 // Synchronize AT_BEGIN and NESTED scripting variables
  +                 syncScriptingVars(n, VariableInfo.AT_BEGIN);
  +                 syncScriptingVars(n, VariableInfo.NESTED);
                        
  -                     out.popIndent();
  -                     out.printil("}");
  -                 } else {
  -                     // Synchronize AT_BEGIN and NESTED scripting variables
  -                     syncScriptingVars(n, VariableInfo.AT_BEGIN);
  -                     syncScriptingVars(n, VariableInfo.NESTED);
  -                 }
  +                 out.popIndent();
  +                 out.printil("}");
  +             } else {
  +                 // Synchronize NESTED scripting variables
  +                 syncScriptingVars(n, VariableInfo.NESTED);
  +             }
   
  +             if (n.implementsIterationTag()) {
                    out.printil("do {");
                    out.pushIndent();
                }
  @@ -1395,34 +1371,33 @@
        
        private void generateCustomEnd(Node.CustomTag n,
                                       String tagHandlerVar,
  -                                    String tagEvalVar,
  -                                    boolean implementsIterationTag,
  -                                    boolean implementsBodyTag,
  -                                    boolean implementsTryCatchFinally) {
  +                                    String tagEvalVar) {
   
            VariableInfo[] varInfos = n.getVariableInfos();
            TagVariableInfo[] tagVarInfos = n.getTagVariableInfos();
   
  -         if ((n.getBody() != null) && implementsIterationTag) {
  -             out.printin("int evalDoAfterBody = ");
  -             out.print(tagHandlerVar);
  -             out.println(".doAfterBody();");
  -
  -             // Synchronize AT_BEGIN and NESTED scripting variables
  -             syncScriptingVars(n, VariableInfo.AT_BEGIN);
  -             syncScriptingVars(n, VariableInfo.NESTED);
  +         if (n.getBody() != null) {
  +             if (n.implementsIterationTag()) {
  +                 out.printin("int evalDoAfterBody = ");
  +                 out.print(tagHandlerVar);
  +                 out.println(".doAfterBody();");
  +
  +                 // Synchronize AT_BEGIN and NESTED scripting variables
  +                 syncScriptingVars(n, VariableInfo.AT_BEGIN);
  +                 syncScriptingVars(n, VariableInfo.NESTED);
   
  -             out.printil("if (evalDoAfterBody != 
javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)");
  -             out.pushIndent();
  -             out.printil("break;");
  -             out.popIndent();
  +                 out.printil("if (evalDoAfterBody != 
javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)");
  +                 out.pushIndent();
  +                 out.printil("break;");
  +                 out.popIndent();
   
  -             out.popIndent();
  -             out.printil("} while (true);");
  -         }
  +                 out.popIndent();
  +                 out.printil("} while (true);");
  +             }
  +             
  +             restoreScriptingVars(n, VariableInfo.NESTED);
   
  -         if (n.getBody() != null) {
  -             if (implementsBodyTag) {
  +             if (n.implementsBodyTag()) {
                    out.printin("if (");
                    out.print(tagEvalVar);
                    out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)");
  @@ -1450,7 +1425,7 @@
            syncScriptingVars(n, VariableInfo.AT_END);
   
            // TryCatchFinally
  -         if (implementsTryCatchFinally) {
  +         if (n.implementsTryCatchFinally()) {
                   out.popIndent(); // try
                out.printil("} catch (Throwable _jspx_exception) {");
                out.pushIndent();
  @@ -1470,12 +1445,12 @@
                out.println(");");
            }
   
  -         if (implementsTryCatchFinally) {
  +         if (n.implementsTryCatchFinally()) {
                   out.popIndent();
                   out.println("}");
            }
   
  -         restoreScriptingVars(n);
  +         restoreScriptingVars(n, VariableInfo.AT_BEGIN);
   
            n.setEndJavaLine(out.getJavaLine());
        }
  @@ -1517,7 +1492,7 @@
         * end element. This way, the scripting variables may be synchronized
         * by the given tag without affecting their original values.
         */
  -     private void saveScriptingVars(Node.CustomTag n) {
  +     private void saveScriptingVars(Node.CustomTag n, int scope) {
            if (n.getCustomNestingLevel() == 0) {
                return;
            }
  @@ -1530,18 +1505,20 @@
   
            if (varInfos != null) {
                for (int i=0; i<varInfos.length; i++) {
  +                 if (varInfos[i].getScope() != scope)
  +                     continue;
                    String varName = varInfos[i].getVarName();
                    String tmpVarName = "_jspx_" + varName + "_"
                        + n.getCustomNestingLevel();
  -                 out.printin(varInfos[i].getClassName());
  -                 out.print(" ");
  -                 out.print(tmpVarName);
  +                 out.printin(tmpVarName);
                    out.print(" = ");
                    out.print(varName);
                    out.println(";");
                }
            } else {
                for (int i=0; i<tagVarInfos.length; i++) {
  +                 if (tagVarInfos[i].getScope() != scope)
  +                     continue;
                    String varName = tagVarInfos[i].getNameGiven();
                    if (varName == null) {
                        varName = n.getTagData().getAttributeString(
  @@ -1549,9 +1526,7 @@
                    }
                    String tmpVarName = "_jspx_" + varName + "_"
                        + n.getCustomNestingLevel();
  -                 out.printin(tagVarInfos[i].getClassName());
  -                 out.print(" ");
  -                 out.print(tmpVarName);
  +                 out.printin(tmpVarName);
                    out.print(" = ");
                    out.print(varName);
                    out.println(";");
  @@ -1566,7 +1541,7 @@
         * restore its scripting variables to their original values that were
         * saved in the tag's start element.
         */
  -     private void restoreScriptingVars(Node.CustomTag n) {
  +     private void restoreScriptingVars(Node.CustomTag n, int scope) {
            if (n.getCustomNestingLevel() == 0) {
                return;
            }
  @@ -1579,6 +1554,8 @@
   
            if (varInfos != null) {
                for (int i=0; i<varInfos.length; i++) {
  +                 if (varInfos[i].getScope() != scope)
  +                     continue;
                    String varName = varInfos[i].getVarName();
                    String tmpVarName = "_jspx_" + varName + "_"
                        + n.getCustomNestingLevel();
  @@ -1589,6 +1566,8 @@
                }
            } else {
                for (int i=0; i<tagVarInfos.length; i++) {
  +                 if (tagVarInfos[i].getScope() != scope)
  +                     continue;
                    String varName = tagVarInfos[i].getNameGiven();
                    if (varName == null) {
                        varName = n.getTagData().getAttributeString(
  
  
  
  1.15.2.3  +17 -3     
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.2
  retrieving revision 1.15.2.3
  diff -u -r1.15.2.2 -r1.15.2.3
  --- Node.java 17 Aug 2002 00:14:23 -0000      1.15.2.2
  +++ Node.java 10 Sep 2002 00:36:23 -0000      1.15.2.3
  @@ -675,7 +675,9 @@
        private Class tagHandlerClass;
        private VariableInfo[] varInfos;
        private int customNestingLevel;
  +     private boolean implementsIterationTag;
        private boolean implementsBodyTag;
  +     private boolean implementsTryCatchFinally;
        private Vector atBeginScriptingVars;
        private Vector atEndScriptingVars;
        private Vector nestedScriptingVars;
  @@ -693,8 +695,12 @@
            this.customNestingLevel = makeCustomNestingLevel();
   
            this.tagHandlerClass = tagHandlerClass;
  +         this.implementsIterationTag = 
  +             IterationTag.class.isAssignableFrom(tagHandlerClass);
            this.implementsBodyTag =
                BodyTag.class.isAssignableFrom(tagHandlerClass);
  +         this.implementsTryCatchFinally = 
  +             TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
        }
   
        public void accept(Visitor v) throws JasperException {
  @@ -795,8 +801,16 @@
            return tagHandlerClass;
        }
   
  +     public boolean implementsIterationTag() {
  +         return implementsIterationTag;
  +     }
  +
        public boolean implementsBodyTag() {
            return implementsBodyTag;
  +     }
  +
  +     public boolean implementsTryCatchFinally() {
  +         return implementsTryCatchFinally;
        }
   
        public TagVariableInfo[] getTagVariableInfos() {
  
  
  
  1.1.2.3   +24 -40    
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ScriptingVariabler.java
  
  Index: ScriptingVariabler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ScriptingVariabler.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- ScriptingVariabler.java   19 Aug 2002 21:16:46 -0000      1.1.2.2
  +++ ScriptingVariabler.java   10 Sep 2002 00:36:24 -0000      1.1.2.3
  @@ -124,11 +124,17 @@
            Vector vec = new Vector();
   
            Integer ownRange = null;
  -         Node.CustomTag parent = n.getCustomTagParent();
  -         if (parent == null)
  -             ownRange = MAX_SCOPE;
  -         else
  -             ownRange = parent.getNumCount();
  +         if (scope == VariableInfo.AT_BEGIN 
  +                 || scope == VariableInfo.AT_END) {
  +             Node.CustomTag parent = n.getCustomTagParent();
  +             if (parent == null)
  +                 ownRange = MAX_SCOPE;
  +             else
  +                 ownRange = parent.getNumCount();
  +         } else {
  +             // NESTED
  +             ownRange = n.getNumCount();
  +         }
   
            if (varInfos != null) {
                for (int i=0; i<varInfos.length; i++) {
  @@ -138,22 +144,11 @@
                    }
                    String varName = varInfos[i].getVarName();
                    
  -                 if (scope == VariableInfo.AT_BEGIN 
  -                         || scope == VariableInfo.AT_END
  -                         || (scope == VariableInfo.NESTED
  -                             && !n.implementsBodyTag())) {
  -                     Integer currentRange =
  -                         (Integer) scriptVars.get(varName);
  -                     if (currentRange == null
  -                             || ownRange.compareTo(currentRange) > 0) {
  -                         scriptVars.put(varName, ownRange);
  -                         vec.add(varInfos[i]);
  -                     }
  -                 } else {
  -                     // scope equals NESTED AND node implements BodyTag
  -                     if (n.getCustomNestingLevel() == 0) {
  -                         vec.add(varInfos[i]);
  -                     }
  +                 Integer currentRange = (Integer) scriptVars.get(varName);
  +                 if (currentRange == null
  +                         || ownRange.compareTo(currentRange) > 0) {
  +                     scriptVars.put(varName, ownRange);
  +                     vec.add(varInfos[i]);
                    }
                }
            } else {
  @@ -168,22 +163,11 @@
                                        tagVarInfos[i].getNameFromAttribute());
                    }
   
  -                 if (scope == VariableInfo.AT_BEGIN 
  -                         || scope == VariableInfo.AT_END
  -                         || (scope == VariableInfo.NESTED
  -                             && !n.implementsBodyTag())) {
  -                     Integer currentRange =
  -                         (Integer) scriptVars.get(varName);
  -                     if (currentRange == null
  -                             || ownRange.compareTo(currentRange) > 0) {
  -                         scriptVars.put(varName, ownRange);
  -                         vec.add(tagVarInfos[i]);
  -                     }
  -                 } else {
  -                     // scope equals NESTED AND node implements BodyTag
  -                     if (n.getCustomNestingLevel() == 0) {
  -                         vec.add(tagVarInfos[i]);
  -                     }
  +                 Integer currentRange = (Integer) scriptVars.get(varName);
  +                 if (currentRange == null
  +                         || ownRange.compareTo(currentRange) > 0) {
  +                     scriptVars.put(varName, ownRange);
  +                     vec.add(tagVarInfos[i]);
                    }
                }
            }
  
  
  

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

Reply via email to