kinman      2004/04/16 16:22:30

  Modified:    jasper2/src/share/org/apache/jasper/compiler
                        JspDocumentParser.java
  Log:
  - Fix a bug where a custom tag with tagdependent body type is not
    handled correctly in XML syntax.  The fix would have been trivial if not
    for the cases where <jsp:attribute> and/or <jsp:body> is present.
  
  Revision  Changes    Path
  1.79      +97 -10    
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.78
  retrieving revision 1.79
  diff -u -r1.78 -r1.79
  --- JspDocumentParser.java    13 Apr 2004 22:55:50 -0000      1.78
  +++ JspDocumentParser.java    16 Apr 2004 23:22:30 -0000      1.79
  @@ -102,13 +102,18 @@
       private boolean directivesOnly;
       private boolean isTop;
   
  +    // Nesting level of Tag dependent bodies
  +    private int tagDependentNesting = 0;
  +    // Flag set to delay incrmenting tagDependentNesting until jsp:body
  +    // is first encountered
  +    private boolean tagDependentPending = false;
  +
       /*
        * Constructor
        */
       public JspDocumentParser(
           ParserController pc,
           String path,
  -        JarFile jarFile,
           boolean isTagFile,
           boolean directivesOnly) {
           this.parserController = pc;
  @@ -139,7 +144,7 @@
           throws JasperException {
   
           JspDocumentParser jspDocParser =
  -            new JspDocumentParser(pc, path, jarFile, isTagFile, directivesOnly);
  +            new JspDocumentParser(pc, path, isTagFile, directivesOnly);
           Node.Nodes pageNodes = null;
   
           try {
  @@ -324,7 +329,52 @@
   
           Node node = null;
   
  -        if (JSP_URI.equals(uri)) {
  +        if (tagDependentPending && JSP_URI.equals(uri) &&
  +                     localName.equals(BODY_ACTION)) {
  +            tagDependentNesting++;
  +            current =
  +                parseStandardAction(
  +                    qName,
  +                    localName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    startMark,
  +                    current);
  +            tagDependentPending = false;
  +            return;
  +        }
  +
  +        if (tagDependentPending && JSP_URI.equals(uri) &&
  +                     localName.equals(ATTRIBUTE_ACTION)) {
  +            current =
  +                parseStandardAction(
  +                    qName,
  +                    localName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    startMark,
  +                    current);
  +            return;
  +        }
  +
  +        if (tagDependentPending) {
  +            tagDependentPending = false;
  +            tagDependentNesting++;
  +        }
  +
  +        if (tagDependentNesting > 0) {
  +            node =
  +                new Node.UninterpretedTag(
  +                    qName,
  +                    localName,
  +                    nonTaglibAttrs,
  +                    nonTaglibXmlnsAttrs,
  +                    taglibAttrs,
  +                    startMark,
  +                    current);
  +        } else if (JSP_URI.equals(uri)) {
               node =
                   parseStandardAction(
                       qName,
  @@ -357,17 +407,15 @@
                           current);
               } else {
                   // custom action
  -                Node.CustomTag custom = (Node.CustomTag) node;
  -             String bodyType;
  -             if (custom.getTagInfo() != null) {
  -                 bodyType = custom.getTagInfo().getBodyContent();
  -             } else {
  -                 bodyType = custom.getTagFileInfo().getTagInfo().getBodyContent();
  -             }
  +             String bodyType = getBodyType((Node.CustomTag) node);
  +
                   if (scriptlessBodyNode == null
                           && 
bodyType.equalsIgnoreCase(TagInfo.BODY_CONTENT_SCRIPTLESS)) {
                       scriptlessBodyNode = node;
                   }
  +                else if 
(TagInfo.BODY_CONTENT_TAG_DEPENDENT.equalsIgnoreCase(bodyType)) {
  +                    tagDependentPending = true;
  +                }
               }
           }
   
  @@ -425,6 +473,22 @@
                   }
               }
           }
  +
  +        if (!isAllSpace && tagDependentPending) {
  +            tagDependentPending = false;
  +            tagDependentNesting++;
  +        }
  +
  +        if (tagDependentNesting > 0) {
  +            if (charBuffer.length() > 0) {
  +                new Node.TemplateText(charBuffer.toString(), startMark, current);
  +            }
  +            startMark = new Mark(path, locator.getLineNumber(),
  +                                 locator.getColumnNumber());
  +            charBuffer = null;
  +            return;
  +        }
  +
           if ((current instanceof Node.JspText)
               || (current instanceof Node.NamedAttribute)
               || !isAllSpace) {
  @@ -571,6 +635,10 @@
               checkScriptingBody((Node.ScriptingElement)current);
           }
   
  +        if ( isTagDependent(current)) {
  +            tagDependentNesting--;
  +        }
  +
           if (current.getParent() != null) {
               current = current.getParent();
               if (scriptlessBodyNode != null
  @@ -1333,5 +1401,24 @@
           EnableDTDValidationException(String message, Locator loc) {
               super(message, loc);
           }
  +    }
  +
  +    private static String getBodyType(Node.CustomTag custom) {
  +
  +        if (custom.getTagInfo() != null) {
  +            return custom.getTagInfo().getBodyContent();
  +        }
  +
  +        return custom.getTagFileInfo().getTagInfo().getBodyContent();
  +    }
  +
  +    private boolean isTagDependent(Node n) {
  +
  +        if (n instanceof Node.CustomTag) {
  +            String bodyType = getBodyType((Node.CustomTag) n);
  +            return
  +                TagInfo.BODY_CONTENT_TAG_DEPENDENT.equalsIgnoreCase(bodyType);
  +        }
  +        return false;
       }
   }
  
  
  

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

Reply via email to