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 2003/03/01 03:07:53 UTC

cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler FunctionMapperImpl.java JspDocumentParser.java Node.java PageInfo.java Parser.java Validator.java

luehe       2003/02/28 18:07:53

  Modified:    jasper2/src/share/org/apache/jasper/compiler
                        FunctionMapperImpl.java JspDocumentParser.java
                        Node.java PageInfo.java Parser.java Validator.java
  Log:
  Use taglib URI instead of prefix as the key in taglib map
  
  Revision  Changes    Path
  1.2       +7 -6      jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/FunctionMapperImpl.java
  
  Index: FunctionMapperImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/FunctionMapperImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FunctionMapperImpl.java	26 Feb 2003 00:11:38 -0000	1.1
  +++ FunctionMapperImpl.java	1 Mar 2003 02:07:52 -0000	1.2
  @@ -98,8 +98,8 @@
   	Iterator iter = taglibs.keySet().iterator();
   	ClassLoader loader = compiler.getCompilationContext().getClassLoader();
   	while (iter.hasNext()) {
  -	    String prefix = (String) iter.next();
  -	    TagLibraryInfo tli = (TagLibraryInfo) taglibs.get(prefix);
  +	    String uri = (String) iter.next();
  +	    TagLibraryInfo tli = (TagLibraryInfo) taglibs.get(uri);
   	    FunctionInfo[] fnInfos = tli.getFunctions();
   	    for (int i = 0; fnInfos != null && i < fnInfos.length; i++) {
   		FunctionSignature fnSig = 
  @@ -114,7 +114,8 @@
   		    err.jspError(e);
   		}
   
  -		String key = prefix + ":" + fnInfos[i].getName();
  +		String key = tli.getPrefixString() + ":"
  +		    + fnInfos[i].getName();
   		this.fnMap.put(key, method);
   		this.fnSigMap.put(key, fnSig);
   		this.fnInfoMap.put(key, fnInfos[i]);
  
  
  
  1.46      +30 -34    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.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- JspDocumentParser.java	26 Feb 2003 17:58:07 -0000	1.45
  +++ JspDocumentParser.java	1 Mar 2003 02:07:52 -0000	1.46
  @@ -637,14 +637,8 @@
   				   Mark start,
   				   Node parent) throws SAXException {
   
  -	String prefix = "";
  -	int colon = qName.indexOf(':');
  -	if (colon != -1) {
  -	    prefix = qName.substring(0, colon);
  -	}
  -
   	// Check if this is a user-defined (custom) tag
  -        TagLibraryInfo tagLibInfo = (TagLibraryInfo) taglibs.get(prefix);
  +        TagLibraryInfo tagLibInfo = (TagLibraryInfo) taglibs.get(uri);
           if (tagLibInfo == null) {
               return null;
   	}
  @@ -668,10 +662,16 @@
   	} else {
               tagInfo = tagFileInfo.getTagInfo();
           }
  +
  +	String prefix = "";
  +	int colon = qName.indexOf(':');
  +	if (colon != -1) {
  +	    prefix = qName.substring(0, colon);
  +	}
          
  -	return new Node.CustomTag(qName, prefix, localName, attrs, xmlnsAttrs,
  -				  start, parent, tagInfo, tagFileInfo,
  -				  tagHandlerClass);
  +	return new Node.CustomTag(qName, prefix, localName, uri, attrs,
  +				  xmlnsAttrs, start, parent, tagInfo,
  +				  tagFileInfo, tagHandlerClass);
       }
   
       /*
  @@ -726,39 +726,35 @@
   		continue;
   	    }
   
  -	    // Get the prefix
  -	    String prefix = "";
  -	    int colon = qName.indexOf(':');
  -	    if (colon != -1) {
  -		prefix = qName.substring(colon + 1);
  -	    }
  -	    if (taglibs.containsKey(prefix)) {
  -		// Prefix already in taglib map.
  -		throw new JasperException(
  -		        Localizer.getMessage(
  -                                "jsp.error.xmlns.redefinition.notimplemented",
  -				prefix));
  +	    String uri = xmlnsAttrs.getValue(i);
  +	    if (!taglibs.containsKey(uri)) {
  +		TagLibraryInfo tagLibInfo = getTaglibInfo(qName, uri);
  +		taglibs.put(uri, tagLibInfo);
   	    }
  -
  -	    TagLibraryInfo tagLibInfo = getTaglibInfo(xmlnsAttrs.getValue(i),
  -						      prefix);
  -	    taglibs.put(prefix, tagLibInfo);
   	}
       }
   
       /*
  -     * Gets the tag library associated with the given uri namespace to which
  -     * the given prefix is bound.
  +     * Creates the tag library associated with the given uri namespace, and
  +     * returns it.
        *
  -     * @param uri The uri namespace 
  -     * @param prefix The prefix that is bound to the uri namespace
  +     * @param qName The qualified name of the xmlns attribute
  +     * (of the form 'xmlns:<prefix>')
  +     * @param uri The uri namespace (value of the xmlns attribute)
        *
        * @return The tag library associated with the given uri namespace
        */
  -    private TagLibraryInfo getTaglibInfo(String uri, String prefix)
  +    private TagLibraryInfo getTaglibInfo(String qName, String uri)
                   throws JasperException {
   
   	TagLibraryInfo result = null;
  +
  +	// Get the prefix
  +	String prefix = "";
  +	int colon = qName.indexOf(':');
  +	if (colon != -1) {
  +	    prefix = qName.substring(colon + 1);
  +	}
   
   	if (uri.startsWith(URN_JSPTAGDIR)) {
   	    // uri (of the form "urn:jsptagdir:path") references tag file dir
  
  
  
  1.65      +19 -9     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.64
  retrieving revision 1.65
  diff -u -r1.64 -r1.65
  --- Node.java	26 Feb 2003 22:58:15 -0000	1.64
  +++ Node.java	1 Mar 2003 02:07:52 -0000	1.65
  @@ -1168,6 +1168,7 @@
        */
       public static class CustomTag extends Node {
   
  +	private String uri;
   	private String prefix;
   	private JspAttribute[] jspAttrs;
   	private TagData tagData;
  @@ -1202,19 +1203,21 @@
   	private Nodes atETag;
   
   	public CustomTag(String qName, String prefix, String localName,
  -			 Attributes attrs, Mark start, Node parent,
  +			 String uri, Attributes attrs, Mark start, Node parent,
   			 TagInfo tagInfo, TagFileInfo tagFileInfo,
   			 Class tagHandlerClass) {
  -	    this(qName, prefix, localName, attrs, null, start, parent, tagInfo,
  -		 tagFileInfo, tagHandlerClass);
  +
  +	    this(qName, prefix, localName, uri, attrs, null, start, parent,
  +		 tagInfo, tagFileInfo, tagHandlerClass);
   	}
   
   	public CustomTag(String qName, String prefix, String localName,
  -			 Attributes attrs, Attributes xmlnsAttrs, Mark start,
  -			 Node parent, TagInfo tagInfo, TagFileInfo tagFileInfo,
  -			 Class tagHandlerClass) {
  +			 String uri, Attributes attrs, Attributes xmlnsAttrs,
  +			 Mark start, Node parent, TagInfo tagInfo,
  +			 TagFileInfo tagFileInfo, Class tagHandlerClass) {
   
   	    super(qName, localName, attrs, xmlnsAttrs, start, parent);
  +	    this.uri = uri;
   	    this.prefix = prefix;
   	    this.tagInfo = tagInfo;
   	    this.tagFileInfo = tagFileInfo;
  @@ -1246,6 +1249,13 @@
   
   	public void accept(Visitor v) throws JasperException {
   	    v.visit(this);
  +	}
  +
  +	/**
  +	 * @return The URI namespace that this custom action belongs to
  +	 */
  +	public String getURI() {
  +	    return this.uri;
   	}
   
   	/**
  
  
  
  1.24      +12 -3     jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/PageInfo.java
  
  Index: PageInfo.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/PageInfo.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- PageInfo.java	26 Feb 2003 22:58:16 -0000	1.23
  +++ PageInfo.java	1 Mar 2003 02:07:52 -0000	1.24
  @@ -77,6 +77,7 @@
   
       private BeanRepository beanRepository;
       private Hashtable tagLibraries;
  +    private Hashtable prefixMapper;
       private FunctionMapperImpl funcMap;
   
       private String language = "java";
  @@ -126,6 +127,7 @@
       PageInfo(BeanRepository beanRepository) {
   	this.beanRepository = beanRepository;
   	this.tagLibraries = new Hashtable();
  +	this.prefixMapper = new Hashtable();
   	this.imports = new Vector();
           this.dependants = new Vector();
   	this.includePrelude = new Vector();
  @@ -176,6 +178,13 @@
   
       public Hashtable getTagLibraries() {
   	return tagLibraries;
  +    }
  +
  +    /*
  +     * Returns the prefix-to-URI mapper.
  +     */
  +    public Hashtable getPrefixMapper() {
  +	return prefixMapper;
       }
   
       public String getLanguage() {
  
  
  
  1.68      +31 -27    jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java
  
  Index: Parser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java,v
  retrieving revision 1.67
  retrieving revision 1.68
  diff -u -r1.67 -r1.68
  --- Parser.java	28 Feb 2003 20:12:26 -0000	1.67
  +++ Parser.java	1 Mar 2003 02:07:52 -0000	1.68
  @@ -95,6 +95,7 @@
       private String currentFile;
       private Mark start;
       private Hashtable taglibs;
  +    private Hashtable prefixMapper;
       private ErrorDispatcher err;
       private int scriptlessCount;
       private boolean isTagFile;
  @@ -118,6 +119,7 @@
   	this.parserController = pc;
   	this.ctxt = pc.getJspCompilationContext();
   	this.taglibs = pc.getCompiler().getPageInfo().getTagLibraries();
  +	this.prefixMapper = pc.getCompiler().getPageInfo().getPrefixMapper();
   	this.err = pc.getCompiler().getErrorDispatcher();
   	this.reader = reader;
   	this.currentFile = reader.mark().getFile();
  @@ -218,12 +220,11 @@
   	int index = qName.indexOf(':');
   	if (index != -1) {
   	    String prefix = qName.substring(0, index);
  -	    TagLibraryInfo tagLibInfo = (TagLibraryInfo) taglibs.get(prefix);
  -	    if (tagLibInfo == null) {
  +	    uri = (String) prefixMapper.get(prefix);
  +	    if (uri == null) {
   		err.jspError(reader.mark(),
   			     "jsp.error.attribute.invalidPrefix", prefix);
   	    }
  -	    uri = tagLibInfo.getURI();
   	    localName = qName.substring(index+1);
   	}
   
  @@ -441,26 +442,27 @@
   	String uri = attrs.getValue("uri");
   	String prefix = attrs.getValue("prefix");
   	if (prefix != null) {
  -	    TagLibraryInfo tagLibInfo = null;
   	    if (uri != null) {
   		// Errors to be checked in Validator
   		String[] location = ctxt.getTldLocation(uri);
  -		tagLibInfo = new TagLibraryInfoImpl(ctxt, parserController,
  -						    prefix, uri, location,
  -						    err);
  +		taglibs.put(uri,
  +			    new TagLibraryInfoImpl(ctxt, parserController,
  +						   prefix, uri, location,
  +						   err));
  +		prefixMapper.put(prefix, uri);
   	    } else {
   		String tagdir = attrs.getValue("tagdir");
   		if (tagdir != null) {
  -		    tagLibInfo = new ImplicitTagLibraryInfo(ctxt,
  -							    parserController,
  -							    prefix, 
  -							    tagdir,
  -							    err);
  +		    String urnTagdir = URN_JSPTAGDIR + tagdir;
  +		    taglibs.put(urnTagdir,
  +				new ImplicitTagLibraryInfo(ctxt,
  +							   parserController,
  +							   prefix, 
  +							   tagdir,
  +							   err));
  +		    prefixMapper.put(prefix, urnTagdir);
   		}
   	    }
  -	    if (tagLibInfo != null) {
  -		taglibs.put(prefix, tagLibInfo);
  -	    }
   	}
   
   	new Node.TaglibDirective(attrs, start, parent);
  @@ -1314,11 +1316,13 @@
   	String shortTagName = tagName.substring(i+1);
   
   	// Check if this is a user-defined tag.
  -        TagLibraryInfo tagLibInfo = (TagLibraryInfo) taglibs.get(prefix);
  -        if (tagLibInfo == null) {
  +	String uri = (String) prefixMapper.get(prefix);
  +        if (uri == null) {
   	    reader.reset(start);
   	    return false;
   	}
  +
  +        TagLibraryInfo tagLibInfo = (TagLibraryInfo) taglibs.get(uri);
   	TagInfo tagInfo = tagLibInfo.getTag(shortTagName);
   	TagFileInfo tagFileInfo = tagLibInfo.getTagFile(shortTagName);
   	if (tagInfo == null && tagFileInfo == null) {
  @@ -1349,8 +1353,9 @@
   	
           // Parse 'CustomActionEnd' production:
   	if (reader.matches("/>")) {
  -	    new Node.CustomTag(tagName, prefix, shortTagName, attrs, start,
  -			       parent, tagInfo, tagFileInfo, tagHandlerClass);
  +	    new Node.CustomTag(tagName, prefix, shortTagName, uri, attrs,
  +			       start, parent, tagInfo, tagFileInfo,
  +			       tagHandlerClass);
   	    return true;
   	}
   	
  @@ -1361,17 +1366,16 @@
   	// Looking for a body, it still can be empty; but if there is a
   	// a tag body, its syntax would be dependent on the type of
   	// body content declared in TLD.
  -	TagLibraryInfo taglib = (TagLibraryInfo)taglibs.get(prefix);
   	String bc;
  -	if (taglib.getTag(shortTagName) != null) {
  -	    bc = taglib.getTag(shortTagName).getBodyContent();
  -	} else if (taglib.getTagFile(shortTagName) != null) {
  +	if (tagInfo != null) {
  +	    bc = tagInfo.getBodyContent();
  +	} else if (tagFileInfo != null) {
   	    bc = TagInfo.BODY_CONTENT_SCRIPTLESS;
   	} else {
   	    bc = TagInfo.BODY_CONTENT_EMPTY;
   	}
   
  -	Node tagNode = new Node.CustomTag(tagName, prefix, shortTagName,
  +	Node tagNode = new Node.CustomTag(tagName, prefix, shortTagName, uri,
   					  attrs, start, parent, tagInfo,
   					  tagFileInfo, tagHandlerClass);
   	parseOptionalBody( tagNode, tagName, bc );
  
  
  
  1.86      +16 -21    jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java
  
  Index: Validator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Validator.java,v
  retrieving revision 1.85
  retrieving revision 1.86
  diff -u -r1.85 -r1.86
  --- Validator.java	26 Feb 2003 22:58:16 -0000	1.85
  +++ Validator.java	1 Mar 2003 02:07:52 -0000	1.86
  @@ -686,11 +686,6 @@
   			     n.getQName());
   	    }
   
  -	    // Get custom actions's namespace, which is used to validate the
  -	    // namespaces of any custom action attributes with qualified names
  -	    String customActionUri =
  -		((TagLibraryInfo) taglibs.get(n.getPrefix())).getURI();
  -		
   	    /*
   	     * Make sure all required attributes are present, either as
                * attributes or named attributes (<jsp:attribute>).
  @@ -698,6 +693,7 @@
   	     * both attributes or named attributes.
   	     */
   	    TagAttributeInfo[] tldAttrs = tagInfo.getAttributes();
  +	    String customActionUri = n.getURI();
   	    Attributes attrs = n.getAttributes();
   	    for (int i=0; i<tldAttrs.length; i++) {
   		String attr = attrs.getValue(tldAttrs[i].getName());
  @@ -828,22 +824,21 @@
   	    for (int i=0; i<namedAttributeNodes.size(); i++) {
                   Node.NamedAttribute na = 
                       (Node.NamedAttribute)namedAttributeNodes.getNode( i );
  -		String uri = "";
  -		if (na.getPrefix() != null) {
  -		    TagLibraryInfo tagLibInfo =
  -			(TagLibraryInfo) taglibs.get(na.getPrefix());
  -		    if (tagLibInfo == null) {
  -			err.jspError(n, "jsp.error.attribute.invalidPrefix",
  -				     na.getPrefix());
  -		    }
  -		    uri = tagLibInfo.getURI();
  -		}
   		boolean found = false;
   		for (int j=0; j<tldAttrs.length; j++) {
  -		    // See above comment about namespace matches
  +		    /*
  +		     * See above comment about namespace matches. For named
  +		     * attributes, we use the prefix instead of URI as the
  +		     * match criterion, because in the case of a JSP document,
  +		     * we'd have to keep track of which namespaces are in scope
  +		     * when parsing a named attribute, in order to determine
  +		     * the URI that the prefix of the named attribute's name
  +		     * matches to.
  +		     */
  +		    String attrPrefix = na.getPrefix();
   		    if (na.getLocalName().equals(tldAttrs[j].getName())
  -			    && (uri == null || uri.length() == 0
  -				|| uri == customActionUri)) {
  +			    && (attrPrefix == null || attrPrefix.length() == 0
  +				|| attrPrefix == n.getPrefix())) {
   			jspAttrs[attrs.getLength() + i]
   			    = new Node.JspAttribute(na, false);
   			NamedAttributeVisitor nav = null;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org