kinman      2002/12/03 16:48:43

  Modified:    jasper2/src/share/org/apache/jasper
                        EmbededServletOptions.java JspC.java Options.java
               jasper2/src/share/org/apache/jasper/compiler Compiler.java
                        Node.java TagPluginManager.java
               jasper2/src/share/org/apache/jasper/compiler/tagplugin
                        TagPlugin.java TagPluginContext.java
  Removed:     jasper2/src/share/org/apache/jasper/compiler/tagplugin
                        TagPluginFactory.java
  Log:
  - First cut in defining the tag plugin interface and an implementation
    of framework in Jasper.
  
    WARNING: This is still experimental and subject to change.
  
  Revision  Changes    Path
  1.14      +15 -3     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/EmbededServletOptions.java
  
  Index: EmbededServletOptions.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/EmbededServletOptions.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- EmbededServletOptions.java        28 Nov 2002 04:18:07 -0000      1.13
  +++ EmbededServletOptions.java        4 Dec 2002 00:48:42 -0000       1.14
  @@ -70,6 +70,7 @@
   
   import org.apache.jasper.compiler.TldLocationsCache;
   import org.apache.jasper.compiler.JspConfig;
  +import org.apache.jasper.compiler.TagPluginManager;
   import org.apache.jasper.xmlparser.ParserUtils;
   
   import java.util.*;
  @@ -175,6 +176,11 @@
       private JspConfig jspConfig = null;
   
       /**
  +     * TagPluginManager
  +     */
  +    private TagPluginManager tagPluginManager = null;
  +
  +    /**
        * Java platform encoding to generate the JSP
        * page servlet.
        */
  @@ -301,6 +307,10 @@
        return jspConfig;
       }
   
  +    public TagPluginManager getTagPluginManager() {
  +     return tagPluginManager;
  +    }
  +
       /**
        * Create an EmbededServletOptions object using data available from
        * ServletConfig and ServletContext. 
  @@ -475,6 +485,8 @@
        // Setup the jsp config info for this web app.
        jspConfig = new JspConfig(context);
   
  +     // Create a Tag plugin instance
  +     tagPluginManager = new TagPluginManager(context);
       }
   
   }
  
  
  
  1.19      +15 -6     
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.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- JspC.java 16 Nov 2002 04:20:09 -0000      1.18
  +++ JspC.java 4 Dec 2002 00:48:42 -0000       1.19
  @@ -74,6 +74,8 @@
   import org.apache.jasper.logging.Logger;
   import org.apache.jasper.logging.JasperLogger;
   import org.apache.jasper.compiler.JspConfig;
  +import org.apache.jasper.compiler.JspConfig;
  +import org.apache.jasper.compiler.TagPluginManager;
   
   /**
    * Shell for the jspc compiler.  Handles all options associated with the 
  @@ -197,6 +199,9 @@
        */
       private TldLocationsCache tldLocationsCache = null;
   
  +    private JspConfig jspConfig = null;
  +    private TagPluginManager tagPluginManager = null;
  +
       private boolean listErrors = false;
       private boolean showSuccess = false;
   
  @@ -737,6 +742,8 @@
           } catch (MalformedURLException me) {
               System.out.println("**" + me);
           }
  +     jspConfig = new JspConfig(context);
  +     tagPluginManager = new TagPluginManager(context);
       }
       
   
  @@ -945,10 +952,12 @@
        * Obtain JSP configuration informantion specified in web.xml.
        */
       public JspConfig getJspConfig() {
  -        // XXX - Stubbed out so Jasper compiles.
  -        initServletContext();
  -        return new JspConfig( context );
  +     return jspConfig;
       }    
  +
  +    public TagPluginManager getTagPluginManager() {
  +        return tagPluginManager;
  +    }
   
   }
   
  
  
  
  1.10      +9 -3      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/Options.java
  
  Index: Options.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/Options.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Options.java      16 Nov 2002 04:20:09 -0000      1.9
  +++ Options.java      4 Dec 2002 00:48:42 -0000       1.10
  @@ -68,6 +68,7 @@
   
   import org.apache.jasper.compiler.TldLocationsCache;
   import org.apache.jasper.compiler.JspConfig;
  +import org.apache.jasper.compiler.TagPluginManager;
   
   /**
    * A class to hold all init parameters specific to the JSP engine. 
  @@ -172,4 +173,9 @@
        * Obtain JSP configuration informantion specified in web.xml.  
        */
       public JspConfig getJspConfig();
  +
  +    /**
  +     * Obtain a Tag Plugin Manager
  +     */
  +    public TagPluginManager getTagPluginManager();
   }
  
  
  
  1.39      +4 -0      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java
  
  Index: Compiler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- Compiler.java     28 Nov 2002 04:18:08 -0000      1.38
  +++ Compiler.java     4 Dec 2002 00:48:42 -0000       1.39
  @@ -289,6 +289,10 @@
        // Determine which custom tag needs to declare which scripting vars
        ScriptingVariabler.set(pageNodes, errDispatcher);
   
  +     // Optimizations by Tag Plugins
  +     TagPluginManager tagPluginManager = options.getTagPluginManager();
  +     tagPluginManager.apply(pageNodes);
  +
        // generate servlet .java file
        Generator.generate(writer, this, pageNodes);
           writer.close();
  
  
  
  1.43      +58 -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.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- Node.java 28 Nov 2002 04:18:08 -0000      1.42
  +++ Node.java 4 Dec 2002 00:48:42 -0000       1.43
  @@ -997,6 +997,14 @@
        private Vector nestedScriptingVars;
        private Node.CustomTag customTagParent;
        private Integer numCount;
  +     private boolean useTagPlugin;
  +     /**
  +      * The following two fields are use for holding the Java
  +      * scriptlets that the tag plugins may generate.  Meaningful
  +      * only if useTagPlugin is true;
  +      */
  +     private Nodes atSTag;
  +     private Nodes atETag;
   
        public CustomTag(Attributes attrs, Mark start, String name,
                         String prefix, String shortName,
  @@ -1213,6 +1221,30 @@
               
               return result;
           }
  +
  +     public void setUseTagPlugin(boolean use) {
  +         useTagPlugin = use;
  +     }
  +
  +     public boolean getUseTagPlugin() {
  +         return useTagPlugin;
  +     }
  +
  +     public void setAtSTag(Nodes sTag) {
  +         atSTag = sTag;
  +     }
  +
  +     public Nodes getAtSTag() {
  +         return atSTag;
  +     }
  +        
  +     public void setAtETag(Nodes eTag) {
  +         atETag = eTag;
  +     }
  +
  +     public Nodes getAtETag() {
  +         return atETag;
  +     }
           
        /*
         * Computes this custom tag's custom nesting level, which corresponds
  @@ -1250,6 +1282,25 @@
            return n;
        }
       }
  +    /**
  +     * Represents a attribute value of a Custom tag.  Used only by tag plugins
  +     * to indicate generated codes for the specified attribute.
  +     */
  +    public static class GenAttribute extends Node {
  +     String attribute;
  +
  +     public GenAttribute(Mark start, String attribute) {
  +         super(start, null);
  +     }
  +
  +     public void accept(Visitor v) throws JasperException {
  +         v.visit(this);
  +     }
  +
  +     public String getAttribute() {
  +         return attribute;
  +     }
  +    }
   
       /**
        * Represents the body of a <jsp:text> element
  @@ -1742,6 +1793,10 @@
        }
   
        public void visit(JspOutput n) throws JasperException {
  +         doVisit(n);
  +     }
  +
  +     public void visit(GenAttribute n) throws JasperException {
            doVisit(n);
        }
       }
  
  
  
  1.3       +67 -27    
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagPluginManager.java
  
  Index: TagPluginManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagPluginManager.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TagPluginManager.java     26 Nov 2002 01:25:29 -0000      1.2
  +++ TagPluginManager.java     4 Dec 2002 00:48:42 -0000       1.3
  @@ -63,12 +63,12 @@
   
   import java.util.*;
   import java.io.*;
  +import javax.servlet.ServletContext;
  +
   import org.apache.jasper.JasperException;
   import org.apache.jasper.xmlparser.ParserUtils;
   import org.apache.jasper.xmlparser.TreeNode;
  -import org.apache.jasper.JspCompilationContext;
   import org.apache.jasper.compiler.tagplugin.TagPlugin;
  -import org.apache.jasper.compiler.tagplugin.TagPluginFactory;
   import org.apache.jasper.compiler.tagplugin.TagPluginContext;
   
   /**
  @@ -81,18 +81,31 @@
       static private final String plugInsXml = "tagPlugins.xml";
       private boolean initialized = false;
       private Hashtable tagPlugins = null;
  -    private JspCompilationContext ctxt;
  -
  +    private ServletContext ctxt;
   
  -    TagPluginManager(JspCompilationContext ctxt) {
  +    public TagPluginManager(ServletContext ctxt) {
        this.ctxt = ctxt;
  -     init();
       }
   
  +    public void apply(Node.Nodes page) throws JasperException {
  +
  +     init();
  +     if (tagPlugins == null || tagPlugins.size() == 0) {
  +         return;
  +     }
  +
  +     page.visit(new Node.Visitor() {
  +            public void visit(Node.CustomTag n) {
  +             invokePlugin(n);
  +            }
  +     });
  +    }
  + 
       private void init() {
        if (initialized)
            return;
   
  +     initialized = true;
        InputStream is = ctxt.getResourceAsStream(plugInsXml);
        if (is == null)
            return;
  @@ -111,6 +124,7 @@
            return;
        }
   
  +     tagPlugins = new Hashtable();
        Iterator pluginList = tagPluginsNode.findChildren("tag-plugin");
        while (pluginList.hasNext()) {
            TreeNode pluginNode = (TreeNode) pluginList.next();
  @@ -142,44 +156,70 @@
        }
       }
   
  -    public TagPlugin getPlugInClass(Node.CustomTag n, ServletWriter out) {
  -
  -     if (tagPlugins == null) {
  -         return null;
  -     }
  -
  -     TagPluginFactory tagPluginFactory = (TagPluginFactory)
  +    /**
  +     * Invoke tag plugin if it exists.  The node n will be modified by
  +     * the plugin if that applies
  +     */
  +    private void invokePlugin(Node.CustomTag n) {
  +     TagPlugin tagPlugin = (TagPlugin)
                tagPlugins.get(n.getTagHandlerClass().getName());
  -     if (tagPluginFactory == null) {
  -         return null;
  +     if (tagPlugin == null) {
  +         return;
        }
   
  -     TagPluginContext tagPluginContext = new TagPluginContextImpl(n, out);
  -     return tagPluginFactory.createTagPlugin(n.getName(), tagPluginContext);
  +     TagPluginContext tagPluginContext = new TagPluginContextImpl(n);
  +     tagPlugin.doTag(tagPluginContext);
       }
   
       static class TagPluginContextImpl implements TagPluginContext {
        Node.CustomTag node;
  -     ServletWriter out;
  +     Node.Nodes curNodes;
   
  -     TagPluginContextImpl(Node.CustomTag n, ServletWriter out) {
  +     TagPluginContextImpl(Node.CustomTag n) {
            this.node = n;
  -         this.out = out;
  +         curNodes = new Node.Nodes();
  +         n.setAtETag(curNodes);
  +         curNodes = new Node.Nodes();
  +         n.setAtSTag(curNodes);
  +         n.setUseTagPlugin(true);
        }
   
  -     public ServletWriter getServletWriter() {
  -         return out;
  +     public String getTagName() {
  +         return node.getName();
        }
   
        public boolean isScriptless() {
            return node.getChildInfo().isScriptless();
        }
   
  -     public String getAttributeValue(String attribute) {
  +     public boolean isAttributeSpecified(String attribute) {
  +         return getAttribute(attribute) != null;
  +     }
  +
  +     public void generateJavaSource(String s) {
  +         curNodes.add(new Node.Scriptlet(node.getStart(), null));
  +     }
  +
  +     public void generateAttribute(String attribute) {
  +         curNodes.add(new Node.GenAttribute(node.getStart(), null));
  +     }
  +
  +     public void dontUseTagPlugin() {
  +         node.setUseTagPlugin(false);
  +     }
  +
  +     public void generateBody() {
  +         // Since we'll generate the body anyway, this is really a nop, 
  +         // except for the fact that it let us put the Java sources the
  +         // plugins produce in the correct order (w.r.t the body).
  +         curNodes = node.getAtETag();
  +     }
  +
  +     private Node.JspAttribute getAttribute(String attribute) {
            Node.JspAttribute[] attrs = node.getJspAttributes();
            for (int i=0; i < attrs.length; i++) {
                if (attrs[i].getName().equals(attribute)) {
  -//               return attrs[i].getProcessedValue();
  +                 return attrs[i];
                }
            }
            return null;
  
  
  
  1.2       +5 -10     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/tagplugin/TagPlugin.java
  
  Index: TagPlugin.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/tagplugin/TagPlugin.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TagPlugin.java    23 Nov 2002 01:36:49 -0000      1.1
  +++ TagPlugin.java    4 Dec 2002 00:48:43 -0000       1.2
  @@ -70,13 +70,8 @@
   public interface TagPlugin {
   
       /**
  -     * Invoked to generate Java codes at the start of a custom tag.
  +     * Invoked to generate codes a custom tag.
        */
  -    void atSTag();
  -
  -    /**
  -     * Invoked to generate Java codes at the end of a custom tag.
  -     */
  -    void atETag();
  +    void doTag(TagPluginContext c);
   }
   
  
  
  
  1.2       +35 -10    
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/tagplugin/TagPluginContext.java
  
  Index: TagPluginContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/tagplugin/TagPluginContext.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TagPluginContext.java     23 Nov 2002 01:36:49 -0000      1.1
  +++ TagPluginContext.java     4 Dec 2002 00:48:43 -0000       1.2
  @@ -65,25 +65,50 @@
   
   /**
    * This interface allows the plugin author to query about the properties
  - * of the current tag, and to use Jasper resources, such as ServletWriter.
  + * of the current tag, and to use Jasper resources to generate more
  + * efficient implementation for the tag handler under some conditions.
    */
   
   public interface TagPluginContext {
       /**
  +     * @return The name for the current tag
  +     */
  +    String getTagName();
  +
  +    /**
         * @return true if the body of the tag is scriptless.
         */
       boolean isScriptless();
   
       /**
  -     * Get the evaluated value of the given attribute for the current tag
  -     * @return null if the attribute is not specified, or a java expression
  -     *              that when evaluateed, represent the attribute value
  +     * @param attribute Name of the attribute
  +     * @return true if the attribute is specified in the tag
  +     */
  +    boolean isAttributeSpecified(String attribute);
  +
  +    /**
  +     * Generate Java source codes
  +     */
  +    void generateJavaSource(String s);
  +
  +    /**
  +     * Generate Attribute value of a attribute in the custom tag
  +     * NOTE: Currently cannot handle attributes that are fragments.
  +     * @param attribute The specified attribute
  +     */
  +    void generateAttribute(String attribute);
  +
  +    /*
  +     * Generate codes for the body of the custom tag
        */
  -    String getAttributeValue(String attribute);
  +    void generateBody();
   
       /**
  -     * Used for outputting Java fragments to the output stream.
  +     * Abandon optimization for this tag handler, and instruct the
  +     * Jaser to generate the tag handler calls, as usual.
  +     * Should be invoked if errors are detected, or that the tag body is
  +     * too compilicated for optimization.
        */
  -    ServletWriter getServletWriter();
  +    void dontUseTagPlugin();
   }
   
  
  
  

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

Reply via email to