You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by lu...@apache.org on 2002/10/22 05:00:20 UTC

cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler JspDocumentParser.java Node.java SmapUtil.java

luehe       2002/10/21 20:00:20

  Modified:    jasper2/src/share/org/apache/jasper/compiler
                        JspDocumentParser.java Node.java SmapUtil.java
  Log:
  Added support for prelude and coda to JSP documents
  
  Revision  Changes    Path
  1.20      +79 -31    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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- JspDocumentParser.java	17 Oct 2002 20:43:06 -0000	1.19
  +++ JspDocumentParser.java	22 Oct 2002 03:00:20 -0000	1.20
  @@ -61,7 +61,7 @@
   package org.apache.jasper.compiler;
   
   import java.io.*;
  -import java.util.Hashtable;
  +import java.util.*;
   import javax.servlet.jsp.tagext.*;
   import javax.xml.parsers.SAXParserFactory;
   import javax.xml.parsers.ParserConfigurationException;
  @@ -92,19 +92,26 @@
   
       private ParserController parserController;
       private JspCompilationContext ctxt;    
  +    private PageInfo pageInfo;
  +
       // XML document source
       private InputSource inputSource;
  +
       private String path;
  +
       // Node representing the XML element currently being parsed
       private Node current;
  +
       // Document locator
       private Locator locator;
  +
       private Hashtable taglibs;
  +
       // Flag indicating whether we are inside DTD declarations
       private boolean inDTD;
  +
       private ErrorDispatcher err;
       private boolean isTagFile;
  -    private boolean rootSeen;
   
       /*
        * Constructor
  @@ -115,7 +122,8 @@
   			     boolean isTagFile) {
   	this.parserController = pc;
   	this.ctxt = pc.getJspCompilationContext();
  -	this.taglibs = pc.getCompiler().getPageInfo().getTagLibraries();
  +	this.pageInfo = pc.getCompiler().getPageInfo();
  +	this.taglibs = this.pageInfo.getTagLibraries();
   	this.err = pc.getCompiler().getErrorDispatcher();
   	this.path = path;
   	this.inputSource = new InputSource(reader);
  @@ -125,19 +133,32 @@
       /*
        * Parses a JSP document by responding to SAX events.
        *
  -     * @throws JasperException XXX
  +     * @throws JasperException
        */
       public static Node.Nodes parse(ParserController pc,
   				   String path,
   				   InputStreamReader reader,
   				   Node parent,
   				   boolean isTagFile) throws JasperException {
  +
   	JspDocumentParser handler = new JspDocumentParser(pc, path, reader,
   							  isTagFile);
  -	handler.current = parent;
   	Node.Nodes pageNodes = null;
  +	Node.JspRoot jspRoot = null;
   
   	try {
  +	    if (parent == null) {
  +		// create dummy <jsp:root> element
  +		AttributesImpl rootAttrs = new AttributesImpl();
  +		rootAttrs.addAttribute("", "", "version", "CDATA", "2.0");
  +		jspRoot = new Node.JspRoot(rootAttrs, null, null);
  +		handler.current = jspRoot;
  +		handler.addInclude(jspRoot,
  +				   handler.pageInfo.getIncludePrelude());
  +	    } else {
  +		handler.current = parent;
  +	    }
  +
   	    // Use the default (non-validating) parser
   	    SAXParserFactory factory = SAXParserFactory.newInstance();
   
  @@ -151,8 +172,9 @@
   	    saxParser.parse(handler.inputSource, handler);
   
   	    if (parent == null) {
  -		// Add the jsp:root element to the parse result
  -		pageNodes = new Node.Nodes((Node.JspRoot) handler.current);
  +		handler.addInclude(jspRoot, handler.pageInfo.getIncludeCoda());
  +		// Create Node.Nodes from dummy (top-level) <jsp:root>
  +		pageNodes = new Node.Nodes(jspRoot);
   	    } else {
   		pageNodes = parent.getBody();
   	    }
  @@ -179,15 +201,6 @@
   
   	Node node = null;
   
  -	if (!qName.equals(JSP_ROOT) && !rootSeen) {
  -	    // create dummy <jsp:root> element
  -	    AttributesImpl rootAttrs = new AttributesImpl();
  -	    rootAttrs.addAttribute("", "", "version", "CDATA", "2.0");
  -	    node = new Node.JspRoot(rootAttrs, null, current, true);
  -	    current = node;
  -            rootSeen = true;
  -	}
  -
           // XXX - As of JSP 2.0, xmlns: can appear in any node (not just
           // <jsp:root>).  The spec still needs clarification here.
           // What we implement is that it can appear in any node and
  @@ -205,8 +218,7 @@
               // give the <jsp:root> element the original attributes set
               // (attrs) instead of the copy without the xmlns: elements 
               // (attrsCopy)
  -	    node = new Node.JspRoot(new AttributesImpl( attrs ), start, 
  -                current, false);
  +	    node = new Node.JspRoot(new AttributesImpl(attrs), start, current);
   	} else if (qName.equals(JSP_PAGE_DIRECTIVE)) {
   	    if (isTagFile) {
   		throw new SAXParseException(
  @@ -221,16 +233,7 @@
   	    }
   	} else if (qName.equals(JSP_INCLUDE_DIRECTIVE)) {
   	    node = new Node.IncludeDirective(attrsCopy, start, current);
  -	    String file = attrsCopy.getValue("file");
  -	    try {
  -		parserController.parse(file, node);
  -	    } catch (FileNotFoundException fnfe) {
  -		throw new SAXParseException(
  -                    err.getString("jsp.error.file.not.found", file),
  -		    locator, fnfe);
  -	    } catch (Exception e) {
  -		throw new SAXException(e);
  -	    }
  +	    processIncludeDirective(attrsCopy.getValue("file"), node);
   	} else if (qName.equals(JSP_DECLARATION)) {
   	    node = new Node.Declaration(start, current);
   	} else if (qName.equals(JSP_SCRIPTLET)) {
  @@ -589,6 +592,51 @@
   		    throw new SAXException(msg);
   		}
   	    }
  +	}
  +    }
  +
  +    /*
  +     * Processes the given list of included files.
  +     *
  +     * This is used to implement the include-prelude and include-coda
  +     * subelements of the jsp-config element in web.xml
  +     */
  +    private void addInclude(Node parent, List files) throws SAXException {
  +        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 includeDir = new Node.IncludeDirective(attrs, 
  +							    null, // XXX
  +							    parent);
  +                processIncludeDirective(file, includeDir);
  +            }
  +        }
  +    }
  +
  +    /*
  +     * Parses the given file that is being specified in the given include
  +     * directive.
  +     */
  +    private void processIncludeDirective(String fname, Node includeDir) 
  +		throws SAXException {
  +
  +	if (fname == null) {
  +	    return;
  +	}
  +
  +	try {
  +	    parserController.parse(fname, includeDir);
  +	} catch (FileNotFoundException fnfe) {
  +	    throw new SAXParseException(err.getString(
  +                                            "jsp.error.file.not.found", fname),
  +					locator, fnfe);
  +	} catch (Exception e) {
  +	    throw new SAXException(e);
   	}
       }
   }
  
  
  
  1.36      +13 -12    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.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- Node.java	17 Oct 2002 21:38:56 -0000	1.35
  +++ Node.java	22 Oct 2002 03:00:20 -0000	1.36
  @@ -87,6 +87,8 @@
       protected Node parent;
       protected Nodes namedAttributeNodes; // cached for performance
   
  +    private boolean isDummy;
  +
       /**
        * Constructor.
        * @param start The location of the jsp page
  @@ -94,6 +96,7 @@
        */
       public Node(Mark start, Node parent) {
   	this.startMark = start;
  +	this.isDummy = (start == null);
   	addToParent(parent);
       }
   
  @@ -106,6 +109,7 @@
       public Node(Attributes attrs, Mark start, Node parent) {
   	this.attrs = attrs;
   	this.startMark = start;
  +	this.isDummy = (start == null);
   	addToParent(parent);
       }
   
  @@ -118,6 +122,7 @@
       public Node(char[] text, Mark start, Node parent) {
   	this.text = text;
   	this.startMark = start;
  +	this.isDummy = (start == null);
   	addToParent(parent);
       }
   
  @@ -268,6 +273,10 @@
   	endJavaLine = end;
       }
   
  +    public boolean isDummy() {
  +	return isDummy;
  +    }
  +
       /**
        * @return true if the current page is in xml syntax, false otherwise.
        */
  @@ -352,12 +361,8 @@
        */
       public static class JspRoot extends Root {
   
  -	private boolean isDummy;
  -
  -	public JspRoot(Attributes attrs, Mark start, Node parent,
  -		       boolean isDummy) {
  +	public JspRoot(Attributes attrs, Mark start, Node parent) {
   	    super(attrs, start, parent);
  -	    this.isDummy = isDummy;
   	}
   
   	public void accept(Visitor v) throws JasperException {
  @@ -366,10 +371,6 @@
   
   	public boolean isXmlSyntax() {
   	    return true;
  -	}
  -
  -	public boolean isDummy() {
  -	    return isDummy;
   	}
       }
   
  
  
  
  1.6       +1 -2      jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/SmapUtil.java
  
  Index: SmapUtil.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/SmapUtil.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SmapUtil.java	22 Aug 2002 23:41:37 -0000	1.5
  +++ SmapUtil.java	22 Oct 2002 03:00:20 -0000	1.6
  @@ -471,8 +471,7 @@
               int numChildNodes = nodes.size();
               for( int i = 0; i < numChildNodes; i++ ) {
                   Node n = nodes.getNode( i );
  -		if (!(n instanceof Node.JspRoot)
  -		        || !((Node.JspRoot) n).isDummy()) {
  +		if (!n.isDummy()) {
   		    Mark mark = n.getStart();
   
   		    if (verbose) {
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>