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