luehe       2002/07/24 18:05:22

  Modified:    jasper2/src/share/org/apache/jasper/compiler Generator.java
  Log:
  First shot at tag handler code generation for tag files
  
  Revision  Changes    Path
  1.44      +247 -6    
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.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- Generator.java    19 Jul 2002 17:12:57 -0000      1.43
  +++ Generator.java    25 Jul 2002 01:05:22 -0000      1.44
  @@ -865,7 +865,12 @@
               
               // If any of the params have their values specified by
               // jsp:attribute, prepare those values first.
  -            prepareParams( findJspBody( n ) );
  +         Node jspBody = findJspBody(n);
  +         if (jspBody != null) {
  +             prepareParams(jspBody);
  +         } else {
  +             prepareParams(n);
  +         }
               
               out.printin("JspRuntimeLibrary.include(request, response, " +
                   pageParam );
  @@ -951,7 +956,12 @@
               
               // If any of the params have their values specified by
               // jsp:attribute, prepare those values first.
  -            prepareParams( findJspBody( n ) );
  +         Node jspBody = findJspBody(n);
  +         if (jspBody != null) {
  +             prepareParams(jspBody);
  +         } else {
  +             prepareParams(n);
  +         }
               
            out.printin("pageContext.forward(");
            out.print( pageParam );
  @@ -1684,6 +1694,87 @@
            }
        }
   
  +        public void visit(Node.InvokeAction n) throws JasperException {
  +
  +         /**
  +          * A visitor to handle <jsp:param> in a <jsp:invoke>
  +          */
  +         class ParamVisitor extends Node.Visitor {
  +
  +                public void visit(Node.ParamAction n) throws JasperException {
  +                 out.printin("params.put(");
  +                 out.print(n.getAttributeValue("name"));
  +                 out.print(", ");
  +                 out.print(attributeValue(n.getValue(), false,
  +                                          String.class, "null"));
  +                 out.println(");");
  +             }
  +         }
  +
  +         // Assemble parameter map
  +         out.printil("params = new java.util.HashMap();");
  +         if (n.getBody() != null) {
  +             prepareParams(n);
  +             n.getBody().visit(new ParamVisitor());
  +         }
  +         
  +         // Invoke fragment with parameter map
  +         String getterMethodName
  +             = getAccessorMethodName(n.getAttributeValue("fragment"),
  +                                     true);
  +         String varReader = n.getAttributeValue("varReader");
  +         if (varReader != null) {
  +             out.printil("sout = new java.io.StringWriter();");
  +             out.printin(getterMethodName);
  +             out.println("().invoke(sout, params);");
  +         } else {
  +             out.printin(getterMethodName);
  +             out.println("().invoke(null, params);");
  +         }
  +         if (varReader != null) {
  +             out.printin("jspContext.setAttribute(\"");
  +             out.print(varReader);
  +             out.print("\", new java.io.StringReader(sout.toString()));");
  +             // XXX evaluate scope
  +         }
  +     }
  +
  +        public void visit(Node.DoBodyAction n) throws JasperException {
  +
  +         /**
  +          * A visitor to handle <jsp:param> in a <jsp:doBody>
  +          */
  +         class ParamVisitor extends Node.Visitor {
  +
  +                public void visit(Node.ParamAction n) throws JasperException {
  +                 out.printin("params.put(");
  +                 out.print(n.getAttributeValue("name"));
  +                 out.print(", ");
  +                 out.print(attributeValue(n.getValue(), false,
  +                                          String.class, "null"));
  +                 out.println(");");
  +             }
  +         }
  +
  +         // Assemble parameter map
  +         out.printil("params = new java.util.HashMap();");
  +         if (n.getBody() != null) {
  +             prepareParams(n);
  +             n.getBody().visit(new ParamVisitor());
  +         }
  +
  +         // XXX Add scripting variables to parameter map
  +
  +         // Invoke body with parameter map
  +         String varReader = n.getAttributeValue("varReader");
  +         if (varReader != null) {
  +             out.printil("sout = new java.io.StringWriter();");
  +             out.printil("getJspBody().invoke(sout, params);");
  +         } else {
  +             out.printil("getJspBody().invoke(null, params);");
  +         }
  +     }
  +
        private void generateCustomStart(Node.CustomTag n,
                                         TagHandlerInfo handlerInfo,
                                         String tagHandlerVar,
  @@ -2546,8 +2637,158 @@
        gen.generatePreamble(page);
        gen.fragmentHelperClass.generatePreamble();
        page.visit(gen.new GenerateVisitor(out, gen.methodsBuffer, 
  -            gen.fragmentHelperClass));
  +                                        gen.fragmentHelperClass));
        gen.generatePostamble(page);
  +    }
  +
  +    /**
  +     * XXX
  +     */
  +    public static void generateTagHandler(ServletWriter out,
  +                                       Compiler compiler,
  +                                       Node.Nodes page)
  +                     throws JasperException {
  +     Generator gen = new Generator(out, compiler);
  +     gen.generateTagHandlerPreamble(page);
  +     page.visit(gen.new GenerateVisitor(out, gen.methodsBuffer, null));
  +     gen.generateTagHandlerPostamble(page);
  +    }
  +
  +    /*
  +     * XXX
  +     */
  +    private void generateTagHandlerPreamble(Node.Nodes page)
  +         throws JasperException {
  +
  +     // Generate class declaration
  +     out.printin("public class ");
  +     out.print("XXX");
  +     out.print(" extends javax.servlet.jsp.tagext.SimpleTagSupport {");
  +     out.pushIndent();
  +     
  +     // Class body begins here
  +     MethodsBuffer accessorsBuf = new MethodsBuffer();
  +     MethodsBuffer setAttributeBuf = new MethodsBuffer();
  +     generateTagHandlerDeclarations(page, accessorsBuf, setAttributeBuf);
  +     out.printMultiLn(accessorsBuf.toString());
  +     out.printil("public int doTag() throws JspException {");
  +     out.printil("javax.servlet.jsp.JspWriter out = jspContext.getOut();");
  +     out.printil("jspContext.pushPageScope();");
  +     // create page-scope attributes for each tag attribute
  +     out.printMultiLn(setAttributeBuf.toString());
  +     out.printil("try {");
  +     out.pushIndent();
  +    }
  +
  +    private void generateTagHandlerPostamble(Node.Nodes page) {
  +        out.popIndent();
  +        out.printil("} finally {");
  +        out.pushIndent();
  +        out.printil("jspContext.popPageScope();");
  +        out.popIndent();
  +     out.printil("}");
  +     out.println();
  +     out.printil("return EVAL_PAGE;");
  +    }
  +
  +    /**
  +     * Generates declarations for tag handler attributes.
  +     */
  +    private void generateTagHandlerDeclarations(Node.Nodes page,
  +                                             MethodsBuffer accessorsBuf,
  +                                             MethodsBuffer setAttributeBuf)
  +             throws JasperException {
  +
  +     class DeclarationVisitor extends Node.Visitor {
  +
  +         private MethodsBuffer accessorsBuf;
  +         private MethodsBuffer setAttributeBuf;
  +
  +         public DeclarationVisitor(MethodsBuffer accessorsBuf,
  +                                   MethodsBuffer setAttributeBuf) {
  +             this.accessorsBuf = accessorsBuf;
  +             this.setAttributeBuf = setAttributeBuf;
  +         }
  +
  +         public void visit(Node.AttributeDirective n)
  +                 throws JasperException {
  +
  +             boolean isFragment
  +                 = "true".equalsIgnoreCase(n.getAttributeValue("fragment"));
  +             if (isFragment)
  +                 out.printin("private javax.servlet.jsp.tagext.JspFragment ");
  +             else
  +                 out.printin("private String ");
  +             String attrName = n.getAttributeValue("name");
  +             out.print(attrName);
  +             out.println(";");
  +
  +             // generate getter and setter methods
  +             ServletWriter outSave = out;
  +             out = accessorsBuf.getOut();
  +             if (isFragment)
  +                 out.printin("public javax.servlet.jsp.tagext.JspFragment get");
  +             else
  +                 out.printin("public String get");
  +             String getterMethodName = getAccessorMethodName(attrName,
  +                                                             true);
  +             out.print(getterMethodName);
  +             out.println("() {");
  +             out.pushIndent();
  +             out.printin("return this.");
  +             out.print(attrName);
  +             out.println(";");
  +             out.popIndent();
  +             out.printil("}");
  +             out.println();
  +             out.printin("public void set");
  +             out.print(getAccessorMethodName(attrName, false));
  +             if (isFragment)
  +                 out.printin("javax.servlet.jsp.tagext.JspFragment ");
  +             else
  +                 out.printin("String ");
  +             out.print(attrName);
  +             out.println(") {");
  +             out.pushIndent();
  +             out.printin("this.");
  +             out.print(attrName);
  +             out.print(" = ");
  +             out.print(attrName);
  +             out.println(";");
  +             out.popIndent();
  +             out.printil("}");
  +
  +             // set attribute in JspContext
  +             out = setAttributeBuf.getOut();
  +             out.printin("this.jspContext.setAttribute(\"");
  +             out.print(attrName);
  +             out.print("\", ");
  +             out.print(getterMethodName);
  +             out.println("());");
  +
  +             out = outSave;
  +         }
  +     }
  +
  +     out.println();
  +
  +     // Parameter map for fragment/body invocation
  +     out.println("java.util.Map params = null;");
  +
  +     // Used for storing result of fragment/body invocation if 'varReader'
  +     // attribute is specified
  +     out.println("java.io.Writer sout = null;");
  +
  +     page.visit(new DeclarationVisitor(accessorsBuf, setAttributeBuf));
  +    }
  +
  +    private String getAccessorMethodName(String attrName, boolean getter) {
  +     char[] attrChars = attrName.toCharArray();
  +     attrChars[0] = Character.toUpperCase(attrChars[0]);
  +     if (getter)
  +         return "get" + new String(attrChars);
  +     else
  +         return "set" + new String(attrChars);
       }
   
       /**
  
  
  

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

Reply via email to