tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kin...@apache.org
Subject cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/tagplugin TagPlugin.java TagPluginContext.java TagPluginFactory.java
Date Wed, 04 Dec 2002 00:48:43 GMT
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:tomcat-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:tomcat-dev-help@jakarta.apache.org>


Mime
View raw message