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 04:23:03 UTC
cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler Validator.java
luehe 2003/02/28 19:23:03
Modified: jasper2/src/share/org/apache/jasper/compiler Validator.java
Log:
code refactoring
Revision Changes Path
1.87 +186 -156 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.86
retrieving revision 1.87
diff -u -r1.86 -r1.87
--- Validator.java 1 Mar 2003 02:07:52 -0000 1.86
+++ Validator.java 1 Mar 2003 03:23:03 -0000 1.87
@@ -670,6 +670,7 @@
}
public void visit(Node.CustomTag n) throws JasperException {
+
TagInfo tagInfo = n.getTagInfo();
if (tagInfo == null) {
err.jspError(n, "jsp.error.missing.tagInfo", n.getQName());
@@ -701,171 +702,26 @@
attr = attrs.getValue(customActionUri,
tldAttrs[i].getName());
}
- Node.NamedAttribute jspAttr =
+ Node.NamedAttribute na =
n.getNamedAttributeNode(tldAttrs[i].getName());
- if (tldAttrs[i].isRequired() &&
- attr == null && jspAttr == null) {
+ if (tldAttrs[i].isRequired() && attr == null && na == null) {
err.jspError(n, "jsp.error.missing_attribute",
tldAttrs[i].getName(), n.getLocalName());
}
- if (attr != null && jspAttr != null) {
+ if (attr != null && na != null) {
err.jspError(n, "jsp.error.duplicate.name.jspattribute",
tldAttrs[i].getName());
}
}
- /*
- * Make sure there are no invalid attributes
- */
- Node.Nodes namedAttributeNodes = n.getNamedAttributeNodes();
+ Node.Nodes naNodes = n.getNamedAttributeNodes();
Node.JspAttribute[] jspAttrs
- = new Node.JspAttribute[attrs.getLength()
- + namedAttributeNodes.size()];
+ = new Node.JspAttribute[attrs.getLength() + naNodes.size()];
Hashtable tagDataAttrs = new Hashtable(attrs.getLength());
- for (int i=0; i<attrs.getLength(); i++) {
- boolean found = false;
- for (int j=0; tldAttrs != null && j<tldAttrs.length; j++) {
- /*
- * A custom action and its declared attributes always
- * belong to the same namespace, which is identified by
- * the prefix name of the custom tag invocation.
- * For example, in this invocation:
- * <my:test a="1" b="2" c="3"/>, the action
- * "test" and its attributes "a", "b", and "c" all belong
- * to the namespace identified by the prefix "my".
- * The above invocation would be equivalent to:
- * <my:test my:a="1" my:b="2" my:c="3"/>
- * An action attribute may have a prefix different from
- * that of the action invocation only if the underlying
- * tag handler supports dynamic attributes, in which case
- * the attribute with the different prefix is considered a
- * dynamic attribute.
- */
- if (attrs.getLocalName(i).equals(tldAttrs[j].getName())
- && (attrs.getURI(i) == null
- || attrs.getURI(i).length() == 0
- || attrs.getURI(i) == customActionUri)) {
- if (tldAttrs[j].canBeRequestTime()) {
- Class expectedType = String.class;
- try {
- String typeStr = tldAttrs[j].getTypeName();
- if( tldAttrs[j].isFragment() ) {
- expectedType = JspFragment.class;
- }
- else if( typeStr != null ) {
- expectedType = JspUtil.toClass(typeStr,
- loader);
- }
- jspAttrs[i]
- = getJspAttribute(attrs.getQName(i),
- attrs.getURI(i),
- attrs.getLocalName(i),
- attrs.getValue(i),
- expectedType,
- n.getPrefix(),
- n,
- false);
- }
- catch( ClassNotFoundException e ) {
- err.jspError(n,
- "jsp.error.unknown_attribute_type",
- tldAttrs[j].getName(),
- tldAttrs[j].getTypeName() );
- }
- } else {
- // Attribute does not accept any expressions.
- // Make sure its value does not contain any.
- if (isExpression(n, attrs.getValue(i))) {
- err.jspError(n,
- "jsp.error.attribute.custom.non_rt_with_expr",
- tldAttrs[j].getName());
- }
- jspAttrs[i]
- = new Node.JspAttribute(attrs.getQName(i),
- attrs.getURI(i),
- attrs.getLocalName(i),
- attrs.getValue(i),
- false,
- false,
- false);
- }
- if (jspAttrs[i].isExpression()) {
- tagDataAttrs.put(attrs.getQName(i),
- TagData.REQUEST_TIME_VALUE);
- } else {
- tagDataAttrs.put(attrs.getQName(i),
- attrs.getValue(i));
- }
- found = true;
- break;
- }
- }
- if (!found) {
- if (tagInfo.hasDynamicAttributes()) {
- jspAttrs[i] = getJspAttribute(attrs.getQName(i),
- attrs.getURI(i),
- attrs.getLocalName(i),
- attrs.getValue(i),
- java.lang.Object.class,
- n.getPrefix(),
- n,
- true);
- } else {
- err.jspError(n, "jsp.error.bad_attribute",
- attrs.getQName(i), n.getLocalName());
- }
- }
- }
-
- /*
- * Make sure there are no invalid named attributes
- */
- for (int i=0; i<namedAttributeNodes.size(); i++) {
- Node.NamedAttribute na =
- (Node.NamedAttribute)namedAttributeNodes.getNode( i );
- boolean found = false;
- for (int j=0; j<tldAttrs.length; j++) {
- /*
- * 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())
- && (attrPrefix == null || attrPrefix.length() == 0
- || attrPrefix == n.getPrefix())) {
- jspAttrs[attrs.getLength() + i]
- = new Node.JspAttribute(na, false);
- NamedAttributeVisitor nav = null;
- if (na.getBody() != null) {
- nav = new NamedAttributeVisitor();
- na.getBody().visit(nav);
- }
- if (nav != null && nav.hasDynamicContent()) {
- tagDataAttrs.put(na.getName(),
- TagData.REQUEST_TIME_VALUE);
- } else {
- tagDataAttrs.put(na.getName(), na.getText());
- }
- found = true;
- break;
- }
- }
- if (!found) {
- if (tagInfo.hasDynamicAttributes()) {
- jspAttrs[attrs.getLength() + i]
- = new Node.JspAttribute(na, true);
- } else {
- err.jspError(n, "jsp.error.bad_attribute",
- na.getName(), n.getLocalName());
- }
- }
- }
+
+ checkXmlAttributes(n, jspAttrs, tagDataAttrs);
+ checkNamedAttributes(n, jspAttrs, attrs.getLength(), tagDataAttrs);
TagData tagData = new TagData(tagDataAttrs);
@@ -989,6 +845,180 @@
}
if (var != null && varReader != null) {
err.jspError(n, "jsp.error.var_and_varReader");
+ }
+ }
+
+ /*
+ * Make sure the given custom action does not have any invalid
+ * attributes.
+ *
+ * A custom action and its declared attributes always belong to the
+ * same namespace, which is identified by the prefix name of the
+ * custom tag invocation. For example, in this invocation:
+ *
+ * <my:test a="1" b="2" c="3"/>, the action
+ *
+ * "test" and its attributes "a", "b", and "c" all belong to the
+ * namespace identified by the prefix "my". The above invocation would
+ * be equivalent to:
+ *
+ * <my:test my:a="1" my:b="2" my:c="3"/>
+ *
+ * An action attribute may have a prefix different from that of the
+ * action invocation only if the underlying tag handler supports
+ * dynamic attributes, in which case the attribute with the different
+ * prefix is considered a dynamic attribute.
+ */
+ private void checkXmlAttributes(Node.CustomTag n,
+ Node.JspAttribute[] jspAttrs,
+ Hashtable tagDataAttrs)
+ throws JasperException {
+
+ TagInfo tagInfo = n.getTagInfo();
+ if (tagInfo == null) {
+ err.jspError(n, "jsp.error.missing.tagInfo", n.getQName());
+ }
+ TagAttributeInfo[] tldAttrs = tagInfo.getAttributes();
+ Attributes attrs = n.getAttributes();
+
+ for (int i=0; i<attrs.getLength(); i++) {
+ boolean found = false;
+ for (int j=0; tldAttrs != null && j<tldAttrs.length; j++) {
+ if (attrs.getLocalName(i).equals(tldAttrs[j].getName())
+ && (attrs.getURI(i) == null
+ || attrs.getURI(i).length() == 0
+ || attrs.getURI(i) == n.getURI())) {
+ if (tldAttrs[j].canBeRequestTime()) {
+ Class expectedType = String.class;
+ try {
+ String typeStr = tldAttrs[j].getTypeName();
+ if( tldAttrs[j].isFragment() ) {
+ expectedType = JspFragment.class;
+ }
+ else if( typeStr != null ) {
+ expectedType = JspUtil.toClass(typeStr,
+ loader);
+ }
+ jspAttrs[i]
+ = getJspAttribute(attrs.getQName(i),
+ attrs.getURI(i),
+ attrs.getLocalName(i),
+ attrs.getValue(i),
+ expectedType,
+ n.getPrefix(),
+ n,
+ false);
+ } catch (ClassNotFoundException e) {
+ err.jspError(n,
+ "jsp.error.unknown_attribute_type",
+ tldAttrs[j].getName(),
+ tldAttrs[j].getTypeName() );
+ }
+ } else {
+ // Attribute does not accept any expressions.
+ // Make sure its value does not contain any.
+ if (isExpression(n, attrs.getValue(i))) {
+ err.jspError(n,
+ "jsp.error.attribute.custom.non_rt_with_expr",
+ tldAttrs[j].getName());
+ }
+ jspAttrs[i]
+ = new Node.JspAttribute(attrs.getQName(i),
+ attrs.getURI(i),
+ attrs.getLocalName(i),
+ attrs.getValue(i),
+ false,
+ false,
+ false);
+ }
+ if (jspAttrs[i].isExpression()) {
+ tagDataAttrs.put(attrs.getQName(i),
+ TagData.REQUEST_TIME_VALUE);
+ } else {
+ tagDataAttrs.put(attrs.getQName(i),
+ attrs.getValue(i));
+ }
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ if (tagInfo.hasDynamicAttributes()) {
+ jspAttrs[i] = getJspAttribute(attrs.getQName(i),
+ attrs.getURI(i),
+ attrs.getLocalName(i),
+ attrs.getValue(i),
+ java.lang.Object.class,
+ n.getPrefix(),
+ n,
+ true);
+ } else {
+ err.jspError(n, "jsp.error.bad_attribute",
+ attrs.getQName(i), n.getLocalName());
+ }
+ }
+ }
+ }
+
+ /*
+ * Make sure the given custom action does not have any invalid named
+ * attributes
+ */
+ private void checkNamedAttributes(Node.CustomTag n,
+ Node.JspAttribute[] jspAttrs,
+ int start,
+ Hashtable tagDataAttrs)
+ throws JasperException {
+
+ TagInfo tagInfo = n.getTagInfo();
+ if (tagInfo == null) {
+ err.jspError(n, "jsp.error.missing.tagInfo", n.getQName());
+ }
+ TagAttributeInfo[] tldAttrs = tagInfo.getAttributes();
+ Node.Nodes naNodes = n.getNamedAttributeNodes();
+
+ for (int i=0; i<naNodes.size(); i++) {
+ Node.NamedAttribute na = (Node.NamedAttribute)
+ naNodes.getNode(i);
+ boolean found = false;
+ for (int j=0; j<tldAttrs.length; j++) {
+ /*
+ * 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())
+ && (attrPrefix == null || attrPrefix.length() == 0
+ || attrPrefix == n.getPrefix())) {
+ jspAttrs[start + i] = new Node.JspAttribute(na, false);
+ NamedAttributeVisitor nav = null;
+ if (na.getBody() != null) {
+ nav = new NamedAttributeVisitor();
+ na.getBody().visit(nav);
+ }
+ if (nav != null && nav.hasDynamicContent()) {
+ tagDataAttrs.put(na.getName(),
+ TagData.REQUEST_TIME_VALUE);
+ } else {
+ tagDataAttrs.put(na.getName(), na.getText());
+ }
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ if (tagInfo.hasDynamicAttributes()) {
+ jspAttrs[start + i] = new Node.JspAttribute(na, true);
+ } else {
+ err.jspError(n, "jsp.error.bad_attribute",
+ na.getName(), n.getLocalName());
+ }
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org