kinman      2002/08/20 08:50:23

  Modified:    jasper2/src/share/org/apache/jasper JspC.java
               jasper2/src/share/org/apache/jasper/compiler Generator.java
                        ImplicitTagLibraryInfo.java Parser.java
                        ParserController.java TagFileProcessor.java
               jasper2/src/share/org/apache/jasper/resources
                        messages.properties
  Log:
  - Submitted by Mark Roth:
  
      - Implemented the value attribute of jsp:doBody for classic
        tag handlers.
      - Stubbed out JspC with getJspConfig() so it compiles.
      - Added null check for addInclude() to handle the case where there
        are no preludes or codas.
      - Now accepts /WEB-INF/tags as well as /WEB-INF/tags/ for tag file
        default directory.
      - ParserController now uses path name to determine if the given
        element is a tag file instead of searching for tag directive.
      - In a tag file, an attribute directive with a fragment attribute
        must not allow a rtexprvalue attribute, and must fix its value
        to "true".  Fixed implementation to comply with spec.
      - Fixed preamble and postamble generator for Tag Files.  Was not
        generating declarations, tag handler pools, methods buffer,
        helper fragment, etc.  Generator now shares code between servlet
        and tag handler pre and post ambles.
      - Even though spec is not clear that they're required,
        added implicit objects to doTag() so they are available in
        tag files.
  
  Revision  Changes    Path
  1.13      +13 -3     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspC.java
  
  Index: JspC.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspC.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- JspC.java 26 Jun 2002 16:50:38 -0000      1.12
  +++ JspC.java 20 Aug 2002 15:50:22 -0000      1.13
  @@ -75,6 +75,7 @@
   
   import org.apache.jasper.logging.Logger;
   import org.apache.jasper.logging.JasperLogger;
  +import org.apache.jasper.compiler.JspConfig;
   
   /**
    * Shell for the jspc compiler.  Handles all options associated with the 
  @@ -912,6 +913,15 @@
           
           Constants.jasperLog.setVerbosityLevel(verbosityLevel);
       }
  +    
  +    /** 
  +     * Obtain JSP configuration informantion specified in web.xml.
  +     */
  +    public JspConfig getJspConfig() {
  +        // XXX - Stubbed out so Jasper compiles.
  +        initServletContext();
  +        return new JspConfig( context );
  +    }    
   
   }
   
  
  
  
  1.72      +240 -97   
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.71
  retrieving revision 1.72
  diff -u -r1.71 -r1.72
  --- Generator.java    20 Aug 2002 01:42:38 -0000      1.71
  +++ Generator.java    20 Aug 2002 15:50:22 -0000      1.72
  @@ -170,6 +170,7 @@
   
        out.println();
        page.visit(new DeclarationVisitor());
  +     out.println();
       }
   
       /**
  @@ -329,23 +330,25 @@
       }
   
       /**
  -     * Generates the beginning of the static portion of the servelet.
  +     * Generate preamble package name
  +     * (shared by servlet and tag handler preamble generation)
        */
  -    private void generatePreamble(Node.Nodes page) throws JasperException {
  -
  -     String servletPackageName = ctxt.getServletPackageName();
  -     String servletClassName = ctxt.getServletClassName();
  -     String serviceMethodName = Constants.SERVICE_METHOD_NAME;
  -
  -     // First the package name:
  -
  -     if (! "".equals(servletPackageName) && servletPackageName != null) {
  -         out.printil("package " + servletPackageName + ";");
  +    private void genPreamblePackage( String packageName ) 
  +        throws JasperException
  +    {
  +     if (! "".equals(packageName) && packageName != null) {
  +         out.printil("package " + packageName + ";");
            out.println();
           }
  -
  -     // Generate imports
  -
  +    }
  +    
  +    /**
  +     * Generate preamble imports
  +     * (shared by servlet and tag handler preamble generation)
  +     */
  +    private void genPreambleImports() 
  +        throws JasperException
  +    {
        Iterator iter = pageInfo.getImports().iterator();
        while (iter.hasNext()) {
            out.printin("import ");
  @@ -353,31 +356,21 @@
            out.println(";");
        }
        out.println();
  +    }
   
  -     // Generate class declaration
  -
  -     out.printin("public class ");
  -     out.print  (servletClassName);
  -     out.print  (" extends ");
  -     out.print  (pageInfo.getExtends());
  -     if (!pageInfo.isThreadSafe()) {
  -         out.print("implements SingleThreadModel");
  -     }
  -     out.println(" {");
  -     out.pushIndent();
  -
  -     // Class body begins here
  -
  -     generateDeclarations(page);
  -     out.println();
  -
  -     // Static initializations here
  -
  +    /**
  +     * Generation of static initializers in preamble.
  +     * For example, include list, el function map, prefix map.
  +     * (shared by servlet and tag handler preamble generation)
  +     */
  +    private void genPreambleStaticInitializers() 
  +        throws JasperException
  +    {
           // Static data for getIncludes()
           out.printil("private static java.util.Vector _jspx_includes;");
           out.println();
           List includes = pageInfo.getIncludes();
  -        iter = includes.iterator();
  +        Iterator iter = includes.iterator();
           if( !includes.isEmpty() ) {
               out.printil("static {");
               out.pushIndent();
  @@ -397,13 +390,16 @@
           // Static data for EL function and prefix maps:
           generateELFunctionMap();
        generatePrefixMap();
  +    }
   
  -     // Class variable declarations
  -             
  -     /*
  -      * Declare tag handler pools (tags of the same type and with the same
  -      * attribute set share the same tag handler pool)
  -      */
  +    /**
  +     * Declare tag handler pools (tags of the same type and with the same
  +     * attribute set share the same tag handler pool)
  +     * (shared by servlet and tag handler preamble generation)
  +     */
  +    private void genPreambleClassVariableDeclarations( String className ) 
  +        throws JasperException
  +    {
        if (ctxt.getOptions().isPoolingEnabled()
                && !tagHandlerPoolNames.isEmpty()) {
            for (int i=0; i<tagHandlerPoolNames.size(); i++) {
  @@ -416,11 +412,17 @@
        // Constructor
        if (ctxt.getOptions().isPoolingEnabled()
                && !tagHandlerPoolNames.isEmpty()) {
  -         generateServletConstructor(servletClassName);
  +         generateConstructor(className);
        }
  - 
  -     // Methods here
  +    }
   
  +    /**
  +     * Declare general-purpose methods
  +     * (shared by servlet and tag handler preamble generation)
  +     */
  +    private void genPreambleMethods() 
  +        throws JasperException
  +    {
        // Method used to get compile time include file dependencies
           out.printil("public java.util.List getIncludes() {");
           out.pushIndent();
  @@ -433,6 +435,45 @@
                && !tagHandlerPoolNames.isEmpty()) {
            generateDestroy();
        }
  +    }
  +    
  +    /**
  +     * Generates the beginning of the static portion of the servelet.
  +     */
  +    private void generatePreamble(Node.Nodes page) throws JasperException {
  +
  +     String servletPackageName = ctxt.getServletPackageName();
  +     String servletClassName = ctxt.getServletClassName();
  +     String serviceMethodName = Constants.SERVICE_METHOD_NAME;
  +
  +     // First the package name:
  +        genPreamblePackage( servletPackageName );
  +
  +     // Generate imports
  +        genPreambleImports();
  +
  +     // Generate class declaration
  +     out.printin("public class ");
  +     out.print  (servletClassName);
  +     out.print  (" extends ");
  +     out.print  (pageInfo.getExtends());
  +     if (!pageInfo.isThreadSafe()) {
  +         out.print("implements SingleThreadModel");
  +     }
  +     out.println(" {");
  +     out.pushIndent();
  +
  +     // Class body begins here
  +     generateDeclarations(page);
  +
  +     // Static initializations here
  +        genPreambleStaticInitializers();
  +
  +     // Class variable declarations
  +        genPreambleClassVariableDeclarations( servletClassName );
  + 
  +     // Methods here
  +        genPreambleMethods();
    
        // Now the service method
        out.printin("public void ");
  @@ -668,10 +709,11 @@
       }
   
       /*
  -     * Generates the servlet constructor.
  +     * Generates the constructor.
  +     * (shared by servlet and tag handler preamble generation)
        */
  -    private void generateServletConstructor(String servletClassName) {
  -     out.printil("public " + servletClassName + "() {");
  +    private void generateConstructor(String className) {
  +     out.printil("public " + className + "() {");
        out.pushIndent();
        for (int i=0; i<tagHandlerPoolNames.size(); i++) {
            out.printin((String) tagHandlerPoolNames.elementAt(i));
  @@ -1699,11 +1741,11 @@
        }
   
        public void visit(Node.JspBody n) throws JasperException {
  +            Node.JspAttribute value = n.getValue();
            if (isSimpleTagHandler) {
                out.printin(simpleTagHandlerVar);
                out.print(".setJspBody(");
   
  -             Node.JspAttribute value = n.getValue();
                if (value != null) {
                    out.print(attributeValue(value, false, JspFragment.class,
                           "null" ));
  @@ -1712,7 +1754,63 @@
                }
                out.println(");");
            } else {
  -             visitBody(n);
  +                Node parent = n.getParent();
  +                if( (parent instanceof Node.CustomTag) && (value != null) ) {
  +                    Node.CustomTag customTag = (Node.CustomTag)parent;
  +                    
  +                    // Classic tag handler invoked with <jsp:body value="...">
  +                    // Generate a tag body that evaluates the given
  +                    // fragment.
  +                    
  +                    // First, generate a Map with all the AT_BEGIN and 
  +                    // NESTED variables so the body can access them.
  +                    VariableInfo[] varInfos = customTag.getVariableInfos();
  +                    TagVariableInfo[] tagVarInfos = 
  +                        customTag.getTagVariableInfos();
  +                    
  +                    String var = JspUtil.nextTemporaryVariableName();
  +                    out.printil( "java.util.HashMap " + var + 
  +                        " = new java.util.HashMap();" );
  +                    
  +                    if( varInfos != null ) {
  +                        for( int i = 0; i < varInfos.length; i++ ) {
  +                            if( (varInfos[i].getScope() == 
  +                                    VariableInfo.AT_BEGIN) ||
  +                                (varInfos[i].getScope() == 
  +                                    VariableInfo.NESTED) ) 
  +                            {
  +                                out.printil( var + ".put( \"" + 
  +                                    varInfos[i].getVarName() + "\", " +
  +                                    varInfos[i].getVarName() + " );" );
  +                            }
  +                        }
  +                    }
  +
  +                    if( tagVarInfos != null ) {
  +                        for( int i = 0; i < tagVarInfos.length; i++ ) {
  +                            if( (tagVarInfos[i].getScope() == 
  +                                    VariableInfo.AT_BEGIN) || 
  +                                (tagVarInfos[i].getScope() ==
  +                                    VariableInfo.NESTED) )
  +                            {
  +                                out.printin( var + ".put( \"" );
  +                                String name = tagVarInfos[i].getNameGiven();
  +                                if( name == null ) {
  +                                    name = customTag.getTagData().
  +                                        getAttributeString(
  +                                        tagVarInfos[i].getNameFromAttribute());
  +                                }
  +                                out.println( name + "\", " + name + " );" );
  +                            }
  +                        }
  +                    }
  +                    
  +                    out.printil("(" + 
  +                        attributeValue(value, false, JspFragment.class,
  +                        "null" ) + ").invoke( out, " + var + " );" );
  +             } else {
  +                    visitBody(n);
  +             }
            }
        }
   
  @@ -2675,6 +2773,29 @@
       }
       
       /**
  +     * Common part of postamble, shared by both servlets and tag files.
  +     */
  +    private void genCommonPostamble() {
  +     // Append any methods that were generated
  +     out.print(methodsBuffer.toString());
  +        
  +        // Append the helper class
  +        if( fragmentHelperClass.isUsed() ) {
  +            fragmentHelperClass.generatePostamble();
  +            out.printMultiLn(fragmentHelperClass.toString());
  +        }
  +
  +     // generate class definition for JspxState
  +        if (maxTagNesting > 0) {
  +         generateJspState();
  +     }
  +
  +        // Close the class definition
  +        out.popIndent();
  +        out.printil("}");
  +    }
  +        
  +    /**
        * Generates the ending part of the static portion of the servlet.
        */
       private void generatePostamble(Node.Nodes page) {
  @@ -2703,23 +2824,8 @@
           out.popIndent();
           out.printil("}");
   
  -     // Append any methods that were generated
  -     out.print(methodsBuffer.toString());
  -        
  -        // Append the helper class
  -        if( fragmentHelperClass.isUsed() ) {
  -            fragmentHelperClass.generatePostamble();
  -            out.printMultiLn(fragmentHelperClass.toString());
  -        }
  -
  -     // generate class definition for JspxState
  -        if (maxTagNesting > 0) {
  -         generateJspState();
  -     }
  -
  -        // Close the class definition
  -        out.popIndent();
  -        out.printil("}");
  +        // Generated methods, helper classes, etc.
  +        genCommonPostamble();
       }
   
       /**
  @@ -2751,17 +2857,17 @@
   
        Generator gen = new Generator(out, compiler);
   
  +        if (gen.ctxt.getOptions().isPoolingEnabled()) {
  +            gen.compileTagHandlerPoolList(page);
  +        }
        if (gen.ctxt.isTagFile()) {
            TagInfo tagInfo = gen.ctxt.getTagInfo();
  -         gen.generateTagHandlerPreamble(tagInfo);
  +         gen.generateTagHandlerPreamble(tagInfo, page);
            page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out,
                                               gen.methodsBuffer, null,
                                               tagInfo));
            gen.generateTagHandlerPostamble();
        } else {
  -         if (gen.ctxt.getOptions().isPoolingEnabled()) {
  -             gen.compileTagHandlerPoolList(page);
  -         }
            gen.generatePreamble(page);
            gen.fragmentHelperClass.generatePreamble();
            page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out,
  @@ -2774,28 +2880,20 @@
       /*
        * XXX
        */
  -    private void generateTagHandlerPreamble(TagInfo tagInfo)
  -         throws JasperException {
  +    private void generateTagHandlerPreamble(TagInfo tagInfo, Node.Nodes tag )
  +        throws JasperException 
  +    {
   
        // Generate package declaration
        String className = tagInfo.getTagClassName();
        if (className.indexOf('.') != -1) {
            String pkgName
                = className.substring(0, className.lastIndexOf("."));
  -         out.printin("package ");
  -         out.print(pkgName);
  -         out.println(";");
  -         out.println();
  +            genPreamblePackage( pkgName );
        }
   
        // Generate imports
  -     Iterator iter = pageInfo.getImports().iterator();
  -     while (iter.hasNext()) {
  -         out.printin("import ");
  -         out.print  ((String)iter.next());
  -         out.println(";");
  -     }
  -     out.println();
  +        genPreambleImports();
   
        // Generate class declaration
        out.printin("public class ");
  @@ -2808,19 +2906,45 @@
        out.pushIndent();
        
        // Class body begins here
  +     generateDeclarations(tag);
   
  -        // Static data for EL function and prefix maps:
  -        generateELFunctionMap();
  -     generatePrefixMap();
  +     // Static initializations here
  +        genPreambleStaticInitializers();
   
  +     // Class variable declarations
  +        genPreambleClassVariableDeclarations( tagInfo.getTagName() );
  +        
  +        // Tag-handler specific declarations:
        generateTagHandlerDeclarations(tagInfo);
   
        if (tagInfo.hasDynamicAttributes())
            generateSetDynamicAttribute();
   
  +     // Methods here
  +        genPreambleMethods();
  +        
  +        // Now the doTag() method
        out.printil("public void doTag() throws javax.servlet.jsp.JspException {");
        out.pushIndent();
        out.printil("PageContext pageContext = new 
JspContextWrapper(getJspContext());");
  +        
  +        // Declare implicit objects.  
  +        // XXX - Note that the current JSP 2.0 PFD 
  +        // spec is unclear about whether these are required
  +        // XXX - Optimization: Check scriptlets and expressions for the
  +        // use of any of these.  They're not likely to be used.  If they're
  +        // not used, get rid of them.
  +        out.printil( "javax.servlet.ServletRequest request = " +
  +            "pageContext.getRequest();" );
  +        out.printil( "javax.servlet.ServletResponse response = " +
  +            "pageContext.getResponse();" );
  +        out.printil( "javax.servlet.http.HttpSession session = " +
  +            "pageContext.getSession();" );
  +        out.printil( "javax.servlet.ServletContext application = " +
  +            "pageContext.getServletContext();" );
  +     out.printil("javax.servlet.ServletConfig config = " +
  +            "pageContext.getServletConfig();");
  +        
        // Declare parameter map for fragment/body invocation
        out.printil("java.util.Map _jspx_params = null;");
   
  @@ -2830,21 +2954,40 @@
   
        out.printil("javax.servlet.jsp.JspWriter out = pageContext.getOut();");
        generatePageScopedVariables(tagInfo);
  +        
  +             // Number of tag object that need to be popped
  +     // XXX TODO: use a better criteria
  +     maxTagNesting = pageInfo.getMaxTagNesting();
  +        
  +     declareTemporaryScriptingVars(tag);
  +     out.println();
  +        
        out.printil("try {");
        out.pushIndent();
       }
   
       private void generateTagHandlerPostamble() {
           out.popIndent();
  -        out.printil("} catch (java.io.IOException ioe) {");
  -     out.pushIndent();
  -     out.printil("throw new javax.servlet.jsp.JspException(ioe);");
  -     out.popIndent();
  -     out.printil("}");
  -     out.popIndent();
  -     out.printil("}");
  -     out.popIndent();
  -     out.printil("}");
  +        //out.printil("} catch (java.io.IOException ioe) {");
  +     //out.pushIndent();
  +     //out.printil("throw new javax.servlet.jsp.JspException(ioe);");
  +     //out.popIndent();
  +     //out.printil("}");
  +        
  +        // Have to catch Throwable because a classic tag handler
  +        // helper method is declared to throw Throwable.
  +        out.printil( "} catch( Throwable t ) {" );
  +        out.pushIndent();
  +        out.printil("throw new javax.servlet.jsp.JspException(t);" );
  +        out.popIndent();
  +        out.printil( "}" );
  +        
  +        // Close the doTag method
  +        out.popIndent();
  +        out.printil("}");
  +
  +        // Generated methods, helper classes, etc.
  +        genCommonPostamble();
       }
   
       /**
  
  
  
  1.7       +7 -5      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java
  
  Index: ImplicitTagLibraryInfo.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ImplicitTagLibraryInfo.java       19 Aug 2002 23:06:01 -0000      1.6
  +++ ImplicitTagLibraryInfo.java       20 Aug 2002 15:50:22 -0000      1.7
  @@ -76,7 +76,7 @@
    */
   public class ImplicitTagLibraryInfo extends TagLibraryInfo {
   
  -    private static final String WEB_INF_TAGS = "/WEB-INF/tags/";
  +    private static final String WEB_INF_TAGS = "/WEB-INF/tags";
       private static final String TAG_FILE_SUFFIX = ".tag";
       private static final String TAGS_SHORTNAME = "tags";
       private static final String TLIB_VERSION = "1.0";
  @@ -101,7 +101,9 @@
        
        // Determine the value of the <short-name> subelement of the
        // "imaginary" <taglib> element
  -     if (tagdir.equals(WEB_INF_TAGS)) {
  +     if (tagdir.equals(WEB_INF_TAGS) || 
  +            tagdir.equals( WEB_INF_TAGS + "/" ) ) 
  +        {
            shortname = TAGS_SHORTNAME;
        } else {
            shortname = tagdir.substring(WEB_INF_TAGS.length());
  
  
  
  1.23      +16 -14    
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.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- Parser.java       20 Aug 2002 03:52:18 -0000      1.22
  +++ Parser.java       20 Aug 2002 15:50:22 -0000      1.23
  @@ -372,17 +372,19 @@
        * and include-coda of jsp-config element in web.xml
        */
       private void addInclude(Node parent, List files) throws JasperException {
  -     Iterator iter = files.iterator();
  -     while (iter.hasNext()) {
  -         String file = (String) iter.next();
  -         AttributesImpl attrs = new AttributesImpl();
  -         attrs.addAttribute("", "file", "file", "CDATA", file);
  +        if( files != null ) {
  +            Iterator iter = files.iterator();
  +            while (iter.hasNext()) {
  +                String file = (String) iter.next();
  +                AttributesImpl attrs = new AttributesImpl();
  +                attrs.addAttribute("", "file", "file", "CDATA", file);
   
  -         // Create a dummy Include directive node
  -         Node includeNode = new Node.IncludeDirective(attrs, reader.mark(),
  -                                                      parent);
  -         processIncludeDirective(file, includeNode);
  -     }
  +                // Create a dummy Include directive node
  +                Node includeNode = new Node.IncludeDirective(attrs, 
  +                    reader.mark(), parent);
  +                processIncludeDirective(file, includeNode);
  +            }
  +        }
       }
   
       /*
  
  
  
  1.12      +8 -5      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ParserController.java
  
  Index: ParserController.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ParserController.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ParserController.java     20 Aug 2002 03:52:18 -0000      1.11
  +++ ParserController.java     20 Aug 2002 15:50:22 -0000      1.12
  @@ -278,12 +278,15 @@
        // FIXME: We assume xml parser will take care of
           // encoding for page in XML syntax. Correct?
        if (!isXml) {
  -            jspReader.reset(startMark);
  -            while (jspReader.skipUntil("<%@") != null) {
  +            // Note: this currently assumes there is no XML syntax for tag 
  +            // files (as of PFD of the JSP 2.0 spec there is an XML view, 
  +            // but no XML syntax).
  +            isTagFile = file.startsWith( "/WEB-INF/tags" ) ||
  +                file.startsWith( "/META-INF/tags" );
  +         jspReader.reset(startMark);
  +         while (jspReader.skipUntil("<%@") != null) {
                jspReader.skipSpaces();
  -             boolean tIsTagFile = jspReader.matches("tag ");
  -             if (tIsTagFile || jspReader.matches("page")) {
  -                 isTagFile = tIsTagFile;
  +             if (jspReader.matches( "tag " ) || jspReader.matches("page")) {
                    jspReader.skipSpaces();
                    Attributes attrs = Parser.parseAttributes(this, jspReader);
                    String attribute = "pageEncoding";
  
  
  
  1.14      +12 -4     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java
  
  Index: TagFileProcessor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- TagFileProcessor.java     19 Aug 2002 23:06:01 -0000      1.13
  +++ TagFileProcessor.java     20 Aug 2002 15:50:22 -0000      1.14
  @@ -181,15 +181,23 @@
               String attrName = n.getAttributeValue("name");
               boolean required = JspUtil.booleanValue(
                                        n.getAttributeValue("required"));
  -            boolean rtexprvalue = JspUtil.booleanValue(
  -                                     n.getAttributeValue("rtexprvalue"));
  +            String rtexprvalueString = n.getAttributeValue("rtexprvalue");
  +            boolean rtexprvalue = JspUtil.booleanValue( rtexprvalueString );
               boolean fragment = JspUtil.booleanValue(
                                        n.getAttributeValue("fragment"));
            String type = n.getAttributeValue("type");
               if (fragment) {
                   fragmentAttributesMap.put(attrName, n);
  +                // type is fixed to "JspFragment" and a translation error
  +                // must occur if specified.
                   if (type != null) {
                       err.jspError("jsp.error.fragmentwithtype");
  +                }
  +                // rtexprvalue is fixed to "true" and a translation error
  +                // must occur if specified.
  +                rtexprvalue = true;
  +                if( rtexprvalueString != null ) {
  +                    err.jspError("jsp.error.frgmentwithrtexprvalue" );
                   }
               } else {
                   if (type == null)
  
  
  
  1.25      +3 -2      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties
  
  Index: messages.properties
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- messages.properties       20 Aug 2002 03:52:18 -0000      1.24
  +++ messages.properties       20 Aug 2002 15:50:23 -0000      1.25
  @@ -281,6 +281,7 @@
   jsp.error.attribute.noquote=quote symbol expected
   jsp.error.attribute.unterminated=attribute for {0} is not properly terminated
   jsp.error.missing.tagInfo=TagInfo object for {0} is missing from TLD
  -jsp.error.fragmentwithtype=Both 'fragment' and 'type' attributes specified in tag 
directive
  +jsp.error.fragmentwithtype=Cannot specify both 'fragment' and 'type' attributes.  
If 'fragment' is present, 'type' is fixed as 'javax.servlet.jsp.tagext.JspFragment'
  +jsp.error.fragmentwithrtexprvalue=Cannot specify both 'fragment' and 'rtexprvalue' 
attributes.  If 'fragment' is present, 'rtexprvalue' is fixed as 'true'
   jsp.error.fragmentWithDeclareOrScope=Both 'fragment' and 'declare' or 'scope' 
attributes specified in variable directive
   jsp.warning.bad.urlpattern.propertygroup=Bad value {0} in the url-pattern 
subelement in web.xml
  
  
  

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

Reply via email to