You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by pi...@locus.apache.org on 2000/10/04 22:01:07 UTC

cvs commit: jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler UninterpretedTagBeginGenerator.java UninterpretedTagEndGenerator.java BaseJspListener.java DelegatingListener.java JspParseEventListener.java ParseEventListener.java ParserXJspSaxHandler.java

pierred     00/10/04 13:01:07

  Modified:    jasper/src/share/org/apache/jasper/compiler
                        BaseJspListener.java DelegatingListener.java
                        JspParseEventListener.java ParseEventListener.java
                        ParserXJspSaxHandler.java
  Added:       jasper/src/share/org/apache/jasper/compiler
                        UninterpretedTagBeginGenerator.java
                        UninterpretedTagEndGenerator.java
  Log:
  Well formed XML fragments can appear where #PCDATA can appear
  in an XJSP (JSP page as an XML document) page.
  No need to wrap these XML fragments inside CDATA sections
  anymore in the XJSP page.
  
  ParseXJspSaxHandler
    - startElement now makes the distiction between a custom tag
      and an 'uninterpreted' tag
    - processCustomTagBegin() adjusted given that some code has
      been moved in startElement() so we know immediately if we
      deal with a custom tag or not.
    - Node class now has internal state telling whether a node
      is an 'uninterpreted' tag or not.
    - characters encountered while in an 'uninterpreted tag'
      are simply passed through as char data.
      (just like for body content of jsp:root)
  
  JspParseEventListener
    - Two new methods to handle the 'uninterpreted' tags:
      handleUninterpretedTagBegin() and handleUninterpretedTagEnd()
  
  ParseEventListener
  BaseJspListener
  DelegatingListener
    - Added the two new methods required in JspParseEventListener
      (these classes are pretty much no-ops... should do some
       cleanup and get rid of them eventually)
  
  UninterpretedTagBeginGenerator
  UninterpretedTagEndGenerator
     - New Generators to handle uninterpreted tags
  
  Revision  Changes    Path
  1.3       +11 -3     jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/BaseJspListener.java
  
  Index: BaseJspListener.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/BaseJspListener.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- BaseJspListener.java	2000/09/19 19:23:31	1.2
  +++ BaseJspListener.java	2000/10/04 20:01:05	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/BaseJspListener.java,v 1.2 2000/09/19 19:23:31 pierred Exp $
  - * $Revision: 1.2 $
  - * $Date: 2000/09/19 19:23:31 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/BaseJspListener.java,v 1.3 2000/10/04 20:01:05 pierred Exp $
  + * $Revision: 1.3 $
  + * $Date: 2000/10/04 20:01:05 $
    *
    * ====================================================================
    * 
  @@ -187,4 +187,12 @@
   
       public void handleRootBegin(Hashtable attrs) {};
       public void handleRootEnd() {};
  +
  +    public void handleUninterpretedTagBegin(Mark start, Mark stop,
  +					    String rawName, Hashtable attrs)
  +	throws JasperException {}
  +
  +    public void handleUninterpretedTagEnd(Mark start, Mark stop,
  +					  String rawName)
  +	throws JasperException {}
   }
  
  
  
  1.3       +11 -3     jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/DelegatingListener.java
  
  Index: DelegatingListener.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/DelegatingListener.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DelegatingListener.java	2000/09/19 19:23:32	1.2
  +++ DelegatingListener.java	2000/10/04 20:01:05	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/DelegatingListener.java,v 1.2 2000/09/19 19:23:32 pierred Exp $
  - * $Revision: 1.2 $
  - * $Date: 2000/09/19 19:23:32 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/DelegatingListener.java,v 1.3 2000/10/04 20:01:05 pierred Exp $
  + * $Revision: 1.3 $
  + * $Date: 2000/10/04 20:01:05 $
    *
    * ====================================================================
    * 
  @@ -213,5 +213,13 @@
   
       public void handleRootBegin(Hashtable attrs) {};
       public void handleRootEnd() {};
  +
  +    public void handleUninterpretedTagBegin(Mark start, Mark stop,
  +					    String rawName, Hashtable attrs)
  +	throws JasperException {}
  +
  +    public void handleUninterpretedTagEnd(Mark start, Mark stop,
  +					  String rawName)
  +	throws JasperException {}
   }
   
  
  
  
  1.4       +25 -3     jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspParseEventListener.java
  
  Index: JspParseEventListener.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspParseEventListener.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JspParseEventListener.java	2000/10/04 05:10:50	1.3
  +++ JspParseEventListener.java	2000/10/04 20:01:05	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspParseEventListener.java,v 1.3 2000/10/04 05:10:50 pierred Exp $
  - * $Revision: 1.3 $
  - * $Date: 2000/10/04 05:10:50 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspParseEventListener.java,v 1.4 2000/10/04 20:01:05 pierred Exp $
  + * $Revision: 1.4 $
  + * $Date: 2000/10/04 20:01:05 $
    *
    * ====================================================================
    *
  @@ -961,6 +961,28 @@
           xo.addRootAttrs(attrs);
       }
       
  +    public void handleUninterpretedTagBegin(Mark start, Mark stop,
  +					    String rawName, Hashtable attrs) 
  +	throws JasperException
  +    {
  +        UninterpretedTagBeginGenerator gen = 
  +	    new UninterpretedTagBeginGenerator(rawName, attrs);
  +        Generator genWrapper = new GeneratorWrapper(gen, start, stop);
  +	addGenerator(genWrapper);
  +        xo.append(rawName, attrs);
  +    }
  +
  +    public void handleUninterpretedTagEnd(Mark start, Mark stop,
  +					  String rawName)
  +	throws JasperException
  +    {
  +        UninterpretedTagEndGenerator gen = 
  +	    new UninterpretedTagEndGenerator(rawName);
  +        Generator genWrapper = new GeneratorWrapper(gen, start, stop);
  +	addGenerator(genWrapper);
  +        xo.append(rawName);
  +    }
  +
       /**
        * validate the XML stream of the JSP document against the
        * libraries used by the document.
  
  
  
  1.3       +9 -3      jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/ParseEventListener.java
  
  Index: ParseEventListener.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/ParseEventListener.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ParseEventListener.java	2000/09/19 19:23:31	1.2
  +++ ParseEventListener.java	2000/10/04 20:01:05	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/ParseEventListener.java,v 1.2 2000/09/19 19:23:31 pierred Exp $
  - * $Revision: 1.2 $
  - * $Date: 2000/09/19 19:23:31 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/ParseEventListener.java,v 1.3 2000/10/04 20:01:05 pierred Exp $
  + * $Revision: 1.3 $
  + * $Date: 2000/10/04 20:01:05 $
    *
    * ====================================================================
    * 
  @@ -133,5 +133,11 @@
       public void handleRootBegin(Hashtable attrs);
       public void handleRootEnd();
   
  +    public void handleUninterpretedTagBegin(Mark start, Mark stop,
  +					    String rawName, Hashtable attrs)
  +	throws JasperException;
  +    public void handleUninterpretedTagEnd(Mark start, Mark stop,
  +					  String rawName)
  +	throws JasperException;
   }
   
  
  
  
  1.2       +42 -22    jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/ParserXJspSaxHandler.java
  
  Index: ParserXJspSaxHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/ParserXJspSaxHandler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ParserXJspSaxHandler.java	2000/09/19 19:19:21	1.1
  +++ ParserXJspSaxHandler.java	2000/10/04 20:01:06	1.2
  @@ -177,7 +177,7 @@
   	//p("|" + String.valueOf(ch, start, length) + "|");
   
   	Node node = (Node)stack.peek();
  -	if (node.isRoot()) {
  +	if (node.isRoot() || node.isUninterpretedTag()) {
   	    // template data in <jsp:root>.
   	    //p("these chars are added directly in jsp:root");
   	    try {
  @@ -258,9 +258,28 @@
   	    } else if (name.equals("jsp:useBean")) {
   		jspHandler.handleBean(
   				      node.start, node.start, attrsToHashtable(node.attrs));
  -	    } else if (name.length()<4 || !name.substring(0,4).equals("jsp:")) {
  -		// custom tag
  -		processCustomTagBegin();
  +	    } else if (name.length()<4 || 
  +		       !name.substring(0,4).equals("jsp:")) {
  +		// custom tag or 'uninterpreted' tag
  +		int i = name.indexOf(':');
  +		boolean isCustomTag = false;
  +		if (i != -1) {
  +		    String prefix = name.substring(0, i);
  +		    String shortTagName = name.substring(i+1);
  +		    TagLibraries libraries = jspHandler.getTagLibraries();
  +		    if (libraries.isUserDefinedTag(prefix, shortTagName)) {
  +			// custom tag
  +			isCustomTag = true;
  +			processCustomTagBegin(prefix, shortTagName);
  +		    }
  +		}
  +		if (!isCustomTag) {
  +		    // uninterpreted tag
  +		    node.setUninterpreted(true);
  +		    jspHandler.handleUninterpretedTagBegin(
  +				node.start, node.start, 
  +				node.rawName, attrsToHashtable(node.attrs));
  +		}
   	    }
   	} catch (Exception ex) {
   	    throw new SAXException(ex);
  @@ -377,11 +396,13 @@
   		jspHandler.handlePlugin(
   		    node.start, stop, attrsToHashtable(node.attrs), params, fallback);
   	    } else {
  -		// Ought to be a custom tag
  -		//p("should be nodetag");
  -		//p(node);
  -		//p("class is: " + node.getClass().getName());
  -		processCustomTagEnd((NodeTag)node, stop);
  +		if (node.isUninterpretedTag()) {
  +		    // this is an 'uninterpreted' tag
  +		    jspHandler.handleUninterpretedTagEnd(stop, stop, rawName);
  +		} else {
  +		    // this is a custom tag
  +		    processCustomTagEnd((NodeTag)node, stop);
  +		}
   	    }
   	} catch (Exception ex) {
   	    ex.printStackTrace();
  @@ -389,23 +410,12 @@
   	}
       }
   
  -    private void processCustomTagBegin() 
  +    private void processCustomTagBegin(String prefix, String shortTagName) 
   	throws ParseException, JasperException 
       {
   	Node node = (Node)stack.pop();
  -	String tag = node.rawName;
  -	int i = tag.indexOf(':');
  -	if (i == -1) throw new ParseException("unknown tag: " + tag);
  -	
  -	String prefix = tag.substring(0, i);
  -	String shortTagName = tag.substring(i+1);
  -	
   	TagLibraries libraries = jspHandler.getTagLibraries();
   	
  -	if (!libraries.isUserDefinedTag(prefix, shortTagName)) {
  -	    throw new ParseException(node.start, "invalid tag: " + node.rawName);
  -	}
  -
   	if (shortTagName == null) {
   	    throw new ParseException(node.start, "Nothing after the :");
   	}
  @@ -414,7 +424,8 @@
   	TagInfo ti = tli.getTag(shortTagName);
               
   	if (ti == null) {
  -	    throw new ParseException(node.start, "Unable to locate TagInfo for "+tag);
  +	    throw new ParseException(node.start, 
  +	       "Unable to locate TagInfo for " + prefix + ":" + shortTagName);
   	}
   	node = new NodeTag(node, prefix, shortTagName, tli, ti);
   	stack.push(node);
  @@ -593,6 +604,7 @@
   	Mark start;
   
   	boolean isRoot;
  +	boolean isUninterpretedTag = false;
   	StringBuffer text = null;
   
   	Node(Node node) {
  @@ -619,6 +631,14 @@
   
   	boolean isRoot() {
   	    return isRoot;
  +	}
  +
  +	void setUninterpreted(boolean isUninterpretedTag) {
  +	    this.isUninterpretedTag = isUninterpretedTag;
  +	}
  +
  +	boolean isUninterpretedTag() {
  +	    return isUninterpretedTag;
   	}
   
   	void validate(boolean canHaveAttributes,
  
  
  
  1.1                  jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/UninterpretedTagBeginGenerator.java
  
  Index: UninterpretedTagBeginGenerator.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/UninterpretedTagBeginGenerator.java,v 1.1 2000/10/04 20:01:06 pierred Exp $
   * $Revision: 1.1 $
   * $Date: 2000/10/04 20:01:06 $
   *
   * ====================================================================
   * 
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */ 
  
  package org.apache.jasper.compiler;
  
  import java.util.Hashtable;
  import java.util.Enumeration;
  
  /**
   * Generates the start element of an uninterpreted tag.
   *
   * @author Pierre Delisle
   */
  public class UninterpretedTagBeginGenerator
      extends GeneratorBase
      implements ServiceMethodPhase
  {
      private static final String singleQuote = "'";
      private static final String doubleQuote = "\\\"";
  
      private String tag;
      private Hashtable attrs;
  
      public UninterpretedTagBeginGenerator(String tag, Hashtable attrs) {
  	this.tag = tag;
  	this.attrs = attrs;
      }
  
      public void generate(ServletWriter writer, Class phase) {
  	writer.indent();
      	writer.print("out.write(\"");
  
  	StringBuffer sb = new StringBuffer();
          sb.append("<").append(tag);
          if (attrs == null) {
              sb.append(">");
          } else {
              sb.append(" ");
              Enumeration enum = attrs.keys();
              while (enum.hasMoreElements()) {
  		String quote = doubleQuote;
                  String name = (String)enum.nextElement();
                  String value = (String)attrs.get(name);
  		if (value.indexOf('"') != -1) quote = singleQuote;
                  sb.append("  ").append(name).append("=").append(quote);
  		sb.append(value).append(quote);
              }
              sb.append(">");
          }
  	writer.print(sb.toString());
  	writer.print("\");\n");
      }
  }
  
  
  
  1.1                  jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/UninterpretedTagEndGenerator.java
  
  Index: UninterpretedTagEndGenerator.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/UninterpretedTagEndGenerator.java,v 1.1 2000/10/04 20:01:06 pierred Exp $
   * $Revision: 1.1 $
   * $Date: 2000/10/04 20:01:06 $
   *
   * ====================================================================
   * 
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */ 
  
  package org.apache.jasper.compiler;
  
  /**
   * Generates the start element of an uninterpreted tag.
   *
   * @author Pierre Delisle
   */
  public class UninterpretedTagEndGenerator
      extends GeneratorBase
      implements ServiceMethodPhase
  {
      private String tag;
  
      public UninterpretedTagEndGenerator(String tag) {
  	this.tag = tag;
      }
  
      public void generate(ServletWriter writer, Class phase) {
  	StringBuffer sb = new StringBuffer();
  	writer.indent();
      	writer.print("out.write(\"");
          sb.append("</").append(tag).append(">");
  	writer.print(sb.toString());
  	writer.print("\");\n");
      }
  }