You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2006/11/25 00:14:51 UTC
svn commit: r479047 [2/2] -
/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java
Modified: tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java
URL: http://svn.apache.org/viewvc/tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java?view=diff&rev=479047&r1=479046&r2=479047
==============================================================================
--- tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java (original)
+++ tomcat/jasper/tc5.5.x/src/share/org/apache/jasper/compiler/Validator.java Fri Nov 24 15:14:50 2006
@@ -56,36 +56,36 @@
*/
static class DirectiveVisitor extends Node.Visitor {
- private PageInfo pageInfo;
- private ErrorDispatcher err;
+ private PageInfo pageInfo;
+ private ErrorDispatcher err;
- private static final JspUtil.ValidAttribute[] pageDirectiveAttrs = {
- new JspUtil.ValidAttribute("language"),
- new JspUtil.ValidAttribute("extends"),
- new JspUtil.ValidAttribute("import"),
- new JspUtil.ValidAttribute("session"),
- new JspUtil.ValidAttribute("buffer"),
- new JspUtil.ValidAttribute("autoFlush"),
- new JspUtil.ValidAttribute("isThreadSafe"),
- new JspUtil.ValidAttribute("info"),
- new JspUtil.ValidAttribute("errorPage"),
- new JspUtil.ValidAttribute("isErrorPage"),
- new JspUtil.ValidAttribute("contentType"),
- new JspUtil.ValidAttribute("pageEncoding"),
- new JspUtil.ValidAttribute("isELIgnored")
- };
-
- private boolean pageEncodingSeen = false;
-
- /*
- * Constructor
- */
- DirectiveVisitor(Compiler compiler) throws JasperException {
- this.pageInfo = compiler.getPageInfo();
- this.err = compiler.getErrorDispatcher();
- }
+ private static final JspUtil.ValidAttribute[] pageDirectiveAttrs = {
+ new JspUtil.ValidAttribute("language"),
+ new JspUtil.ValidAttribute("extends"),
+ new JspUtil.ValidAttribute("import"),
+ new JspUtil.ValidAttribute("session"),
+ new JspUtil.ValidAttribute("buffer"),
+ new JspUtil.ValidAttribute("autoFlush"),
+ new JspUtil.ValidAttribute("isThreadSafe"),
+ new JspUtil.ValidAttribute("info"),
+ new JspUtil.ValidAttribute("errorPage"),
+ new JspUtil.ValidAttribute("isErrorPage"),
+ new JspUtil.ValidAttribute("contentType"),
+ new JspUtil.ValidAttribute("pageEncoding"),
+ new JspUtil.ValidAttribute("isELIgnored")
+ };
+
+ private boolean pageEncodingSeen = false;
- public void visit(Node.IncludeDirective n) throws JasperException {
+ /*
+ * Constructor
+ */
+ DirectiveVisitor(Compiler compiler) throws JasperException {
+ this.pageInfo = compiler.getPageInfo();
+ this.err = compiler.getErrorDispatcher();
+ }
+
+ public void visit(Node.IncludeDirective n) throws JasperException {
// Since pageDirectiveSeen flag only applies to the Current page
// save it here and restore it after the file is included.
boolean pageEncodingSeenSave = pageEncodingSeen;
@@ -94,162 +94,162 @@
pageEncodingSeen = pageEncodingSeenSave;
}
- public void visit(Node.PageDirective n) throws JasperException {
+ public void visit(Node.PageDirective n) throws JasperException {
JspUtil.checkAttributes("Page directive", n,
pageDirectiveAttrs, err);
- // JSP.2.10.1
- Attributes attrs = n.getAttributes();
- for (int i = 0; attrs != null && i < attrs.getLength(); i++) {
- String attr = attrs.getQName(i);
- String value = attrs.getValue(i);
-
- if ("language".equals(attr)) {
- if (pageInfo.getLanguage(false) == null) {
- pageInfo.setLanguage(value, n, err, true);
- } else if (!pageInfo.getLanguage(false).equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.language",
- pageInfo.getLanguage(false), value);
- }
- } else if ("extends".equals(attr)) {
- if (pageInfo.getExtends(false) == null) {
- pageInfo.setExtends(value, n);
- } else if (!pageInfo.getExtends(false).equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.extends",
- pageInfo.getExtends(false), value);
- }
- } else if ("contentType".equals(attr)) {
- if (pageInfo.getContentType() == null) {
- pageInfo.setContentType(value);
- } else if (!pageInfo.getContentType().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.contenttype",
- pageInfo.getContentType(), value);
- }
- } else if ("session".equals(attr)) {
- if (pageInfo.getSession() == null) {
- pageInfo.setSession(value, n, err);
- } else if (!pageInfo.getSession().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.session",
- pageInfo.getSession(), value);
- }
- } else if ("buffer".equals(attr)) {
- if (pageInfo.getBufferValue() == null) {
- pageInfo.setBufferValue(value, n, err);
- } else if (!pageInfo.getBufferValue().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.buffer",
- pageInfo.getBufferValue(), value);
- }
- } else if ("autoFlush".equals(attr)) {
- if (pageInfo.getAutoFlush() == null) {
- pageInfo.setAutoFlush(value, n, err);
- } else if (!pageInfo.getAutoFlush().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.autoflush",
- pageInfo.getAutoFlush(), value);
- }
- } else if ("isThreadSafe".equals(attr)) {
- if (pageInfo.getIsThreadSafe() == null) {
- pageInfo.setIsThreadSafe(value, n, err);
- } else if (!pageInfo.getIsThreadSafe().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.isthreadsafe",
- pageInfo.getIsThreadSafe(), value);
- }
- } else if ("isELIgnored".equals(attr)) {
- if (pageInfo.getIsELIgnored() == null) {
+ // JSP.2.10.1
+ Attributes attrs = n.getAttributes();
+ for (int i = 0; attrs != null && i < attrs.getLength(); i++) {
+ String attr = attrs.getQName(i);
+ String value = attrs.getValue(i);
+
+ if ("language".equals(attr)) {
+ if (pageInfo.getLanguage(false) == null) {
+ pageInfo.setLanguage(value, n, err, true);
+ } else if (!pageInfo.getLanguage(false).equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.language",
+ pageInfo.getLanguage(false), value);
+ }
+ } else if ("extends".equals(attr)) {
+ if (pageInfo.getExtends(false) == null) {
+ pageInfo.setExtends(value, n);
+ } else if (!pageInfo.getExtends(false).equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.extends",
+ pageInfo.getExtends(false), value);
+ }
+ } else if ("contentType".equals(attr)) {
+ if (pageInfo.getContentType() == null) {
+ pageInfo.setContentType(value);
+ } else if (!pageInfo.getContentType().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.contenttype",
+ pageInfo.getContentType(), value);
+ }
+ } else if ("session".equals(attr)) {
+ if (pageInfo.getSession() == null) {
+ pageInfo.setSession(value, n, err);
+ } else if (!pageInfo.getSession().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.session",
+ pageInfo.getSession(), value);
+ }
+ } else if ("buffer".equals(attr)) {
+ if (pageInfo.getBufferValue() == null) {
+ pageInfo.setBufferValue(value, n, err);
+ } else if (!pageInfo.getBufferValue().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.buffer",
+ pageInfo.getBufferValue(), value);
+ }
+ } else if ("autoFlush".equals(attr)) {
+ if (pageInfo.getAutoFlush() == null) {
+ pageInfo.setAutoFlush(value, n, err);
+ } else if (!pageInfo.getAutoFlush().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.autoflush",
+ pageInfo.getAutoFlush(), value);
+ }
+ } else if ("isThreadSafe".equals(attr)) {
+ if (pageInfo.getIsThreadSafe() == null) {
+ pageInfo.setIsThreadSafe(value, n, err);
+ } else if (!pageInfo.getIsThreadSafe().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.isthreadsafe",
+ pageInfo.getIsThreadSafe(), value);
+ }
+ } else if ("isELIgnored".equals(attr)) {
+ if (pageInfo.getIsELIgnored() == null) {
pageInfo.setIsELIgnored(value, n, err, true);
- } else if (!pageInfo.getIsELIgnored().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.iselignored",
- pageInfo.getIsELIgnored(), value);
- }
- } else if ("isErrorPage".equals(attr)) {
- if (pageInfo.getIsErrorPage() == null) {
- pageInfo.setIsErrorPage(value, n, err);
- } else if (!pageInfo.getIsErrorPage().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.iserrorpage",
- pageInfo.getIsErrorPage(), value);
- }
- } else if ("errorPage".equals(attr)) {
- if (pageInfo.getErrorPage() == null) {
- pageInfo.setErrorPage(value);
- } else if (!pageInfo.getErrorPage().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.errorpage",
- pageInfo.getErrorPage(), value);
- }
- } else if ("info".equals(attr)) {
- if (pageInfo.getInfo() == null) {
- pageInfo.setInfo(value);
- } else if (!pageInfo.getInfo().equals(value)) {
- err.jspError(n, "jsp.error.page.conflict.info",
- pageInfo.getInfo(), value);
- }
- } else if ("pageEncoding".equals(attr)) {
- if (pageEncodingSeen)
- err.jspError(n, "jsp.error.page.multi.pageencoding");
- // 'pageEncoding' can occur at most once per file
- pageEncodingSeen = true;
- comparePageEncodings(value, n);
- }
- }
-
- // Check for bad combinations
- if (pageInfo.getBuffer() == 0 && !pageInfo.isAutoFlush())
- err.jspError(n, "jsp.error.page.badCombo");
-
- // Attributes for imports for this node have been processed by
- // the parsers, just add them to pageInfo.
- pageInfo.addImports(n.getImports());
- }
+ } else if (!pageInfo.getIsELIgnored().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.iselignored",
+ pageInfo.getIsELIgnored(), value);
+ }
+ } else if ("isErrorPage".equals(attr)) {
+ if (pageInfo.getIsErrorPage() == null) {
+ pageInfo.setIsErrorPage(value, n, err);
+ } else if (!pageInfo.getIsErrorPage().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.iserrorpage",
+ pageInfo.getIsErrorPage(), value);
+ }
+ } else if ("errorPage".equals(attr)) {
+ if (pageInfo.getErrorPage() == null) {
+ pageInfo.setErrorPage(value);
+ } else if (!pageInfo.getErrorPage().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.errorpage",
+ pageInfo.getErrorPage(), value);
+ }
+ } else if ("info".equals(attr)) {
+ if (pageInfo.getInfo() == null) {
+ pageInfo.setInfo(value);
+ } else if (!pageInfo.getInfo().equals(value)) {
+ err.jspError(n, "jsp.error.page.conflict.info",
+ pageInfo.getInfo(), value);
+ }
+ } else if ("pageEncoding".equals(attr)) {
+ if (pageEncodingSeen)
+ err.jspError(n, "jsp.error.page.multi.pageencoding");
+ // 'pageEncoding' can occur at most once per file
+ pageEncodingSeen = true;
+ comparePageEncodings(value, n);
+ }
+ }
+
+ // Check for bad combinations
+ if (pageInfo.getBuffer() == 0 && !pageInfo.isAutoFlush())
+ err.jspError(n, "jsp.error.page.badCombo");
+
+ // Attributes for imports for this node have been processed by
+ // the parsers, just add them to pageInfo.
+ pageInfo.addImports(n.getImports());
+ }
- public void visit(Node.TagDirective n) throws JasperException {
+ public void visit(Node.TagDirective n) throws JasperException {
// Note: Most of the validation is done in TagFileProcessor
// when it created a TagInfo object from the
// tag file in which the directive appeared.
// This method does additional processing to collect page info
- Attributes attrs = n.getAttributes();
- for (int i = 0; attrs != null && i < attrs.getLength(); i++) {
- String attr = attrs.getQName(i);
- String value = attrs.getValue(i);
-
- if ("language".equals(attr)) {
- if (pageInfo.getLanguage(false) == null) {
- pageInfo.setLanguage(value, n, err, false);
- } else if (!pageInfo.getLanguage(false).equals(value)) {
- err.jspError(n, "jsp.error.tag.conflict.language",
- pageInfo.getLanguage(false), value);
- }
- } else if ("isELIgnored".equals(attr)) {
- if (pageInfo.getIsELIgnored() == null) {
+ Attributes attrs = n.getAttributes();
+ for (int i = 0; attrs != null && i < attrs.getLength(); i++) {
+ String attr = attrs.getQName(i);
+ String value = attrs.getValue(i);
+
+ if ("language".equals(attr)) {
+ if (pageInfo.getLanguage(false) == null) {
+ pageInfo.setLanguage(value, n, err, false);
+ } else if (!pageInfo.getLanguage(false).equals(value)) {
+ err.jspError(n, "jsp.error.tag.conflict.language",
+ pageInfo.getLanguage(false), value);
+ }
+ } else if ("isELIgnored".equals(attr)) {
+ if (pageInfo.getIsELIgnored() == null) {
pageInfo.setIsELIgnored(value, n, err, false);
- } else if (!pageInfo.getIsELIgnored().equals(value)) {
- err.jspError(n, "jsp.error.tag.conflict.iselignored",
- pageInfo.getIsELIgnored(), value);
- }
- } else if ("pageEncoding".equals(attr)) {
- if (pageEncodingSeen)
- err.jspError(n, "jsp.error.tag.multi.pageencoding");
- pageEncodingSeen = true;
- n.getRoot().setPageEncoding(value);
- }
- }
-
- // Attributes for imports for this node have been processed by
- // the parsers, just add them to pageInfo.
- pageInfo.addImports(n.getImports());
- }
-
- public void visit(Node.AttributeDirective n) throws JasperException {
- // Do nothing, since this attribute directive has already been
- // validated by TagFileProcessor when it created a TagInfo object
- // from the tag file in which the directive appeared
- }
-
- public void visit(Node.VariableDirective n) throws JasperException {
- // Do nothing, since this variable directive has already been
- // validated by TagFileProcessor when it created a TagInfo object
- // from the tag file in which the directive appeared
- }
+ } else if (!pageInfo.getIsELIgnored().equals(value)) {
+ err.jspError(n, "jsp.error.tag.conflict.iselignored",
+ pageInfo.getIsELIgnored(), value);
+ }
+ } else if ("pageEncoding".equals(attr)) {
+ if (pageEncodingSeen)
+ err.jspError(n, "jsp.error.tag.multi.pageencoding");
+ pageEncodingSeen = true;
+ n.getRoot().setPageEncoding(value);
+ }
+ }
+
+ // Attributes for imports for this node have been processed by
+ // the parsers, just add them to pageInfo.
+ pageInfo.addImports(n.getImports());
+ }
+
+ public void visit(Node.AttributeDirective n) throws JasperException {
+ // Do nothing, since this attribute directive has already been
+ // validated by TagFileProcessor when it created a TagInfo object
+ // from the tag file in which the directive appeared
+ }
+
+ public void visit(Node.VariableDirective n) throws JasperException {
+ // Do nothing, since this variable directive has already been
+ // validated by TagFileProcessor when it created a TagInfo object
+ // from the tag file in which the directive appeared
+ }
/*
* Compares page encodings specified in various places, and throws
@@ -289,8 +289,8 @@
* declaration).
* Treat "UTF-16", "UTF-16BE", and "UTF-16LE" as identical.
*/
- if (root.isXmlSyntax() && root.isEncodingSpecifiedInProlog()) {
- String pageEnc = root.getPageEncoding();
+ if (root.isXmlSyntax() && root.isEncodingSpecifiedInProlog()) {
+ String pageEnc = root.getPageEncoding();
if (!pageDirEnc.equals(pageEnc)
&& (!pageDirEnc.startsWith("UTF-16")
|| !pageEnc.startsWith("UTF-16"))) {
@@ -307,64 +307,64 @@
*/
static class ValidateVisitor extends Node.Visitor {
- private PageInfo pageInfo;
- private ErrorDispatcher err;
+ private PageInfo pageInfo;
+ private ErrorDispatcher err;
private ClassLoader loader;
- private static final JspUtil.ValidAttribute[] jspRootAttrs = {
+ private static final JspUtil.ValidAttribute[] jspRootAttrs = {
new JspUtil.ValidAttribute("xsi:schemaLocation"),
- new JspUtil.ValidAttribute("version", true) };
+ new JspUtil.ValidAttribute("version", true) };
+
+ private static final JspUtil.ValidAttribute[] includeDirectiveAttrs = {
+ new JspUtil.ValidAttribute("file", true) };
+
+ private static final JspUtil.ValidAttribute[] taglibDirectiveAttrs = {
+ new JspUtil.ValidAttribute("uri"),
+ new JspUtil.ValidAttribute("tagdir"),
+ new JspUtil.ValidAttribute("prefix", true) };
+
+ private static final JspUtil.ValidAttribute[] includeActionAttrs = {
+ new JspUtil.ValidAttribute("page", true, true),
+ new JspUtil.ValidAttribute("flush") };
+
+ private static final JspUtil.ValidAttribute[] paramActionAttrs = {
+ new JspUtil.ValidAttribute("name", true),
+ new JspUtil.ValidAttribute("value", true, true) };
+
+ private static final JspUtil.ValidAttribute[] forwardActionAttrs = {
+ new JspUtil.ValidAttribute("page", true, true) };
- private static final JspUtil.ValidAttribute[] includeDirectiveAttrs = {
- new JspUtil.ValidAttribute("file", true) };
+ private static final JspUtil.ValidAttribute[] getPropertyAttrs = {
+ new JspUtil.ValidAttribute("name", true),
+ new JspUtil.ValidAttribute("property", true) };
- private static final JspUtil.ValidAttribute[] taglibDirectiveAttrs = {
- new JspUtil.ValidAttribute("uri"),
- new JspUtil.ValidAttribute("tagdir"),
- new JspUtil.ValidAttribute("prefix", true) };
-
- private static final JspUtil.ValidAttribute[] includeActionAttrs = {
- new JspUtil.ValidAttribute("page", true, true),
- new JspUtil.ValidAttribute("flush") };
-
- private static final JspUtil.ValidAttribute[] paramActionAttrs = {
- new JspUtil.ValidAttribute("name", true),
- new JspUtil.ValidAttribute("value", true, true) };
-
- private static final JspUtil.ValidAttribute[] forwardActionAttrs = {
- new JspUtil.ValidAttribute("page", true, true) };
-
- private static final JspUtil.ValidAttribute[] getPropertyAttrs = {
- new JspUtil.ValidAttribute("name", true),
- new JspUtil.ValidAttribute("property", true) };
-
- private static final JspUtil.ValidAttribute[] setPropertyAttrs = {
- new JspUtil.ValidAttribute("name", true),
- new JspUtil.ValidAttribute("property", true),
- new JspUtil.ValidAttribute("value", false, true),
- new JspUtil.ValidAttribute("param") };
-
- private static final JspUtil.ValidAttribute[] useBeanAttrs = {
- new JspUtil.ValidAttribute("id", true),
- new JspUtil.ValidAttribute("scope"),
- new JspUtil.ValidAttribute("class"),
- new JspUtil.ValidAttribute("type"),
- new JspUtil.ValidAttribute("beanName", false, true) };
-
- private static final JspUtil.ValidAttribute[] plugInAttrs = {
- new JspUtil.ValidAttribute("type",true),
- new JspUtil.ValidAttribute("code", true),
- new JspUtil.ValidAttribute("codebase"),
- new JspUtil.ValidAttribute("align"),
- new JspUtil.ValidAttribute("archive"),
- new JspUtil.ValidAttribute("height", false, true),
- new JspUtil.ValidAttribute("hspace"),
- new JspUtil.ValidAttribute("jreversion"),
- new JspUtil.ValidAttribute("name"),
- new JspUtil.ValidAttribute("vspace"),
- new JspUtil.ValidAttribute("width", false, true),
- new JspUtil.ValidAttribute("nspluginurl"),
- new JspUtil.ValidAttribute("iepluginurl") };
+ private static final JspUtil.ValidAttribute[] setPropertyAttrs = {
+ new JspUtil.ValidAttribute("name", true),
+ new JspUtil.ValidAttribute("property", true),
+ new JspUtil.ValidAttribute("value", false, true),
+ new JspUtil.ValidAttribute("param") };
+
+ private static final JspUtil.ValidAttribute[] useBeanAttrs = {
+ new JspUtil.ValidAttribute("id", true),
+ new JspUtil.ValidAttribute("scope"),
+ new JspUtil.ValidAttribute("class"),
+ new JspUtil.ValidAttribute("type"),
+ new JspUtil.ValidAttribute("beanName", false, true) };
+
+ private static final JspUtil.ValidAttribute[] plugInAttrs = {
+ new JspUtil.ValidAttribute("type",true),
+ new JspUtil.ValidAttribute("code", true),
+ new JspUtil.ValidAttribute("codebase"),
+ new JspUtil.ValidAttribute("align"),
+ new JspUtil.ValidAttribute("archive"),
+ new JspUtil.ValidAttribute("height", false, true),
+ new JspUtil.ValidAttribute("hspace"),
+ new JspUtil.ValidAttribute("jreversion"),
+ new JspUtil.ValidAttribute("name"),
+ new JspUtil.ValidAttribute("vspace"),
+ new JspUtil.ValidAttribute("width", false, true),
+ new JspUtil.ValidAttribute("nspluginurl"),
+ new JspUtil.ValidAttribute("iepluginurl") };
private static final JspUtil.ValidAttribute[] attributeAttrs = {
new JspUtil.ValidAttribute("name", true),
@@ -372,554 +372,555 @@
private static final JspUtil.ValidAttribute[] invokeAttrs = {
new JspUtil.ValidAttribute("fragment", true),
- new JspUtil.ValidAttribute("var"),
- new JspUtil.ValidAttribute("varReader"),
- new JspUtil.ValidAttribute("scope") };
+ new JspUtil.ValidAttribute("var"),
+ new JspUtil.ValidAttribute("varReader"),
+ new JspUtil.ValidAttribute("scope") };
private static final JspUtil.ValidAttribute[] doBodyAttrs = {
new JspUtil.ValidAttribute("var"),
- new JspUtil.ValidAttribute("varReader"),
- new JspUtil.ValidAttribute("scope") };
+ new JspUtil.ValidAttribute("varReader"),
+ new JspUtil.ValidAttribute("scope") };
+
+ private static final JspUtil.ValidAttribute[] jspOutputAttrs = {
+ new JspUtil.ValidAttribute("omit-xml-declaration"),
+ new JspUtil.ValidAttribute("doctype-root-element"),
+ new JspUtil.ValidAttribute("doctype-public"),
+ new JspUtil.ValidAttribute("doctype-system") };
+
+ /*
+ * Constructor
+ */
+ ValidateVisitor(Compiler compiler) {
+ this.pageInfo = compiler.getPageInfo();
+ this.err = compiler.getErrorDispatcher();
+ this.loader = compiler.getCompilationContext().getClassLoader();
+ }
- private static final JspUtil.ValidAttribute[] jspOutputAttrs = {
- new JspUtil.ValidAttribute("omit-xml-declaration"),
- new JspUtil.ValidAttribute("doctype-root-element"),
- new JspUtil.ValidAttribute("doctype-public"),
- new JspUtil.ValidAttribute("doctype-system") };
-
- /*
- * Constructor
- */
- ValidateVisitor(Compiler compiler) {
- this.pageInfo = compiler.getPageInfo();
- this.err = compiler.getErrorDispatcher();
- this.loader = compiler.getCompilationContext().getClassLoader();
- }
-
- public void visit(Node.JspRoot n) throws JasperException {
- JspUtil.checkAttributes("Jsp:root", n,
- jspRootAttrs, err);
- String version = n.getTextAttribute("version");
- if (!version.equals("1.2") && !version.equals("2.0")) {
- err.jspError(n, "jsp.error.jsproot.version.invalid", version);
- }
- visitBody(n);
- }
+ public void visit(Node.JspRoot n) throws JasperException {
+ JspUtil.checkAttributes("Jsp:root", n,
+ jspRootAttrs, err);
+ String version = n.getTextAttribute("version");
+ if (!version.equals("1.2") && !version.equals("2.0")) {
+ err.jspError(n, "jsp.error.jsproot.version.invalid", version);
+ }
+ visitBody(n);
+ }
- public void visit(Node.IncludeDirective n) throws JasperException {
+ public void visit(Node.IncludeDirective n) throws JasperException {
JspUtil.checkAttributes("Include directive", n,
includeDirectiveAttrs, err);
- visitBody(n);
- }
+ visitBody(n);
+ }
- public void visit(Node.TaglibDirective n) throws JasperException {
+ public void visit(Node.TaglibDirective n) throws JasperException {
JspUtil.checkAttributes("Taglib directive", n,
taglibDirectiveAttrs, err);
- // Either 'uri' or 'tagdir' attribute must be specified
- String uri = n.getAttributeValue("uri");
- String tagdir = n.getAttributeValue("tagdir");
- if (uri == null && tagdir == null) {
- err.jspError(n, "jsp.error.taglibDirective.missing.location");
- }
- if (uri != null && tagdir != null) {
- err.jspError(n, "jsp.error.taglibDirective.both_uri_and_tagdir");
- }
- }
+ // Either 'uri' or 'tagdir' attribute must be specified
+ String uri = n.getAttributeValue("uri");
+ String tagdir = n.getAttributeValue("tagdir");
+ if (uri == null && tagdir == null) {
+ err.jspError(n, "jsp.error.taglibDirective.missing.location");
+ }
+ if (uri != null && tagdir != null) {
+ err.jspError(n, "jsp.error.taglibDirective.both_uri_and_tagdir");
+ }
+ }
- public void visit(Node.ParamAction n) throws JasperException {
+ public void visit(Node.ParamAction n) throws JasperException {
JspUtil.checkAttributes("Param action", n,
paramActionAttrs, err);
- // make sure the value of the 'name' attribute is not a
- // request-time expression
- throwErrorIfExpression(n, "name", "jsp:param");
- n.setValue(getJspAttribute("value", null, null,
- n.getAttributeValue("value"),
+ // make sure the value of the 'name' attribute is not a
+ // request-time expression
+ throwErrorIfExpression(n, "name", "jsp:param");
+ n.setValue(getJspAttribute("value", null, null,
+ n.getAttributeValue("value"),
java.lang.String.class,
- n, false));
+ n, false));
visitBody(n);
- }
+ }
- public void visit(Node.ParamsAction n) throws JasperException {
- // Make sure we've got at least one nested jsp:param
+ public void visit(Node.ParamsAction n) throws JasperException {
+ // Make sure we've got at least one nested jsp:param
Node.Nodes subElems = n.getBody();
if (subElems == null) {
- err.jspError(n, "jsp.error.params.emptyBody");
- }
+ err.jspError(n, "jsp.error.params.emptyBody");
+ }
visitBody(n);
- }
+ }
- public void visit(Node.IncludeAction n) throws JasperException {
+ public void visit(Node.IncludeAction n) throws JasperException {
JspUtil.checkAttributes("Include action", n,
includeActionAttrs, err);
- n.setPage(getJspAttribute("page", null, null,
- n.getAttributeValue("page"),
+ n.setPage(getJspAttribute("page", null, null,
+ n.getAttributeValue("page"),
java.lang.String.class, n, false));
- visitBody(n);
+ visitBody(n);
};
- public void visit(Node.ForwardAction n) throws JasperException {
+ public void visit(Node.ForwardAction n) throws JasperException {
JspUtil.checkAttributes("Forward", n,
forwardActionAttrs, err);
- n.setPage(getJspAttribute("page", null, null,
- n.getAttributeValue("page"),
+ n.setPage(getJspAttribute("page", null, null,
+ n.getAttributeValue("page"),
java.lang.String.class, n, false));
- visitBody(n);
- }
+ visitBody(n);
+ }
- public void visit(Node.GetProperty n) throws JasperException {
+ public void visit(Node.GetProperty n) throws JasperException {
JspUtil.checkAttributes("GetProperty", n,
getPropertyAttrs, err);
- }
+ }
- public void visit(Node.SetProperty n) throws JasperException {
+ public void visit(Node.SetProperty n) throws JasperException {
JspUtil.checkAttributes("SetProperty", n,
setPropertyAttrs, err);
- String property = n.getTextAttribute("property");
- String param = n.getTextAttribute("param");
- String value = n.getAttributeValue("value");
+ String property = n.getTextAttribute("property");
+ String param = n.getTextAttribute("param");
+ String value = n.getAttributeValue("value");
n.setValue(getJspAttribute("value", null, null, value,
java.lang.Object.class, n, false));
boolean valueSpecified = n.getValue() != null;
- if ("*".equals(property)) {
+ if ("*".equals(property)) {
if (param != null || valueSpecified)
- err.jspError(n, "jsp.error.setProperty.invalid");
-
+ err.jspError(n, "jsp.error.setProperty.invalid");
+
} else if (param != null && valueSpecified) {
- err.jspError(n, "jsp.error.setProperty.invalid");
- }
+ err.jspError(n, "jsp.error.setProperty.invalid");
+ }
visitBody(n);
- }
+ }
- public void visit(Node.UseBean n) throws JasperException {
+ public void visit(Node.UseBean n) throws JasperException {
JspUtil.checkAttributes("UseBean", n,
useBeanAttrs, err);
- String name = n.getTextAttribute ("id");
- String scope = n.getTextAttribute ("scope");
- JspUtil.checkScope(scope, n, err);
- String className = n.getTextAttribute ("class");
- String type = n.getTextAttribute ("type");
- BeanRepository beanInfo = pageInfo.getBeanRepository();
-
- if (className == null && type == null)
- err.jspError(n, "jsp.error.usebean.missingType");
-
- if (beanInfo.checkVariable(name))
- err.jspError(n, "jsp.error.usebean.duplicate");
-
- if ("session".equals(scope) && !pageInfo.isSession())
- err.jspError(n, "jsp.error.usebean.noSession");
-
- Node.JspAttribute jattr
- = getJspAttribute("beanName", null, null,
- n.getAttributeValue("beanName"),
- java.lang.String.class, n, false);
- n.setBeanName(jattr);
- if (className != null && jattr != null)
- err.jspError(n, "jsp.error.usebean.notBoth");
-
- if (className == null)
- className = type;
+ String name = n.getTextAttribute ("id");
+ String scope = n.getTextAttribute ("scope");
+ JspUtil.checkScope(scope, n, err);
+ String className = n.getTextAttribute ("class");
+ String type = n.getTextAttribute ("type");
+ BeanRepository beanInfo = pageInfo.getBeanRepository();
+
+ if (className == null && type == null)
+ err.jspError(n, "jsp.error.usebean.missingType");
+
+ if (beanInfo.checkVariable(name))
+ err.jspError(n, "jsp.error.usebean.duplicate");
+
+ if ("session".equals(scope) && !pageInfo.isSession())
+ err.jspError(n, "jsp.error.usebean.noSession");
+
+ Node.JspAttribute jattr
+ = getJspAttribute("beanName", null, null,
+ n.getAttributeValue("beanName"),
+ java.lang.String.class, n, false);
+ n.setBeanName(jattr);
+ if (className != null && jattr != null)
+ err.jspError(n, "jsp.error.usebean.notBoth");
+
+ if (className == null)
+ className = type;
- beanInfo.addBean(n, name, className, scope);
+ beanInfo.addBean(n, name, className, scope);
- visitBody(n);
- }
+ visitBody(n);
+ }
- public void visit(Node.PlugIn n) throws JasperException {
+ public void visit(Node.PlugIn n) throws JasperException {
JspUtil.checkAttributes("Plugin", n, plugInAttrs, err);
- throwErrorIfExpression(n, "type", "jsp:plugin");
- throwErrorIfExpression(n, "code", "jsp:plugin");
- throwErrorIfExpression(n, "codebase", "jsp:plugin");
- throwErrorIfExpression(n, "align", "jsp:plugin");
- throwErrorIfExpression(n, "archive", "jsp:plugin");
- throwErrorIfExpression(n, "hspace", "jsp:plugin");
- throwErrorIfExpression(n, "jreversion", "jsp:plugin");
- throwErrorIfExpression(n, "name", "jsp:plugin");
- throwErrorIfExpression(n, "vspace", "jsp:plugin");
- throwErrorIfExpression(n, "nspluginurl", "jsp:plugin");
- throwErrorIfExpression(n, "iepluginurl", "jsp:plugin");
-
- String type = n.getTextAttribute("type");
- if (type == null)
- err.jspError(n, "jsp.error.plugin.notype");
- if (!type.equals("bean") && !type.equals("applet"))
- err.jspError(n, "jsp.error.plugin.badtype");
- if (n.getTextAttribute("code") == null)
- err.jspError(n, "jsp.error.plugin.nocode");
+ throwErrorIfExpression(n, "type", "jsp:plugin");
+ throwErrorIfExpression(n, "code", "jsp:plugin");
+ throwErrorIfExpression(n, "codebase", "jsp:plugin");
+ throwErrorIfExpression(n, "align", "jsp:plugin");
+ throwErrorIfExpression(n, "archive", "jsp:plugin");
+ throwErrorIfExpression(n, "hspace", "jsp:plugin");
+ throwErrorIfExpression(n, "jreversion", "jsp:plugin");
+ throwErrorIfExpression(n, "name", "jsp:plugin");
+ throwErrorIfExpression(n, "vspace", "jsp:plugin");
+ throwErrorIfExpression(n, "nspluginurl", "jsp:plugin");
+ throwErrorIfExpression(n, "iepluginurl", "jsp:plugin");
+
+ String type = n.getTextAttribute("type");
+ if (type == null)
+ err.jspError(n, "jsp.error.plugin.notype");
+ if (!type.equals("bean") && !type.equals("applet"))
+ err.jspError(n, "jsp.error.plugin.badtype");
+ if (n.getTextAttribute("code") == null)
+ err.jspError(n, "jsp.error.plugin.nocode");
- Node.JspAttribute width
- = getJspAttribute("width", null, null,
- n.getAttributeValue("width"),
+ Node.JspAttribute width
+ = getJspAttribute("width", null, null,
+ n.getAttributeValue("width"),
java.lang.String.class, n, false);
- n.setWidth( width );
+ n.setWidth( width );
- Node.JspAttribute height
- = getJspAttribute("height", null, null,
- n.getAttributeValue("height"),
+ Node.JspAttribute height
+ = getJspAttribute("height", null, null,
+ n.getAttributeValue("height"),
java.lang.String.class, n, false);
- n.setHeight( height );
+ n.setHeight( height );
- visitBody(n);
- }
+ visitBody(n);
+ }
- public void visit(Node.NamedAttribute n) throws JasperException {
- JspUtil.checkAttributes("Attribute", n,
- attributeAttrs, err);
+ public void visit(Node.NamedAttribute n) throws JasperException {
+ JspUtil.checkAttributes("Attribute", n,
+ attributeAttrs, err);
visitBody(n);
- }
+ }
- public void visit(Node.JspBody n) throws JasperException {
+ public void visit(Node.JspBody n) throws JasperException {
visitBody(n);
- }
+ }
- public void visit(Node.Declaration n) throws JasperException {
- if (pageInfo.isScriptingInvalid()) {
- err.jspError(n.getStart(), "jsp.error.no.scriptlets");
- }
- }
+ public void visit(Node.Declaration n) throws JasperException {
+ if (pageInfo.isScriptingInvalid()) {
+ err.jspError(n.getStart(), "jsp.error.no.scriptlets");
+ }
+ }
public void visit(Node.Expression n) throws JasperException {
- if (pageInfo.isScriptingInvalid()) {
- err.jspError(n.getStart(), "jsp.error.no.scriptlets");
- }
- }
+ if (pageInfo.isScriptingInvalid()) {
+ err.jspError(n.getStart(), "jsp.error.no.scriptlets");
+ }
+ }
public void visit(Node.Scriptlet n) throws JasperException {
- if (pageInfo.isScriptingInvalid()) {
- err.jspError(n.getStart(), "jsp.error.no.scriptlets");
- }
- }
+ if (pageInfo.isScriptingInvalid()) {
+ err.jspError(n.getStart(), "jsp.error.no.scriptlets");
+ }
+ }
- public void visit(Node.ELExpression n) throws JasperException {
+ public void visit(Node.ELExpression n) throws JasperException {
if ( !pageInfo.isELIgnored() ) {
- String expressions = "${" + new String(n.getText()) + "}";
- ELNode.Nodes el = ELParser.parse(expressions);
- validateFunctions(el, n);
+ String expressions = "${" + new String(n.getText()) + "}";
+ ELNode.Nodes el = ELParser.parse(expressions);
+ validateFunctions(el, n);
JspUtil.validateExpressions(
n.getStart(),
- expressions,
+ expressions,
java.lang.String.class, // XXX - Should template text
// always evaluate to String?
getFunctionMapper(el),
err);
- n.setEL(el);
+ n.setEL(el);
}
}
- public void visit(Node.UninterpretedTag n) throws JasperException {
+ public void visit(Node.UninterpretedTag n) throws JasperException {
if (n.getNamedAttributeNodes().size() != 0) {
- err.jspError(n, "jsp.error.namedAttribute.invalidUse");
+ err.jspError(n, "jsp.error.namedAttribute.invalidUse");
+ }
+
+ Attributes attrs = n.getAttributes();
+ if (attrs != null) {
+ int attrSize = attrs.getLength();
+ Node.JspAttribute[] jspAttrs = new Node.JspAttribute[attrSize];
+ for (int i=0; i < attrSize; i++) {
+ jspAttrs[i] = getJspAttribute(attrs.getQName(i),
+ attrs.getURI(i),
+ attrs.getLocalName(i),
+ attrs.getValue(i),
+ java.lang.Object.class,
+ n,
+ false);
+ }
+ n.setJspAttributes(jspAttrs);
}
- Attributes attrs = n.getAttributes();
- if (attrs != null) {
- int attrSize = attrs.getLength();
- Node.JspAttribute[] jspAttrs = new Node.JspAttribute[attrSize];
- for (int i=0; i < attrSize; i++) {
- jspAttrs[i] = getJspAttribute(attrs.getQName(i),
- attrs.getURI(i),
- attrs.getLocalName(i),
- attrs.getValue(i),
- java.lang.Object.class,
- n,
- false);
- }
- n.setJspAttributes(jspAttrs);
- }
-
- visitBody(n);
- }
-
- public void visit(Node.CustomTag n) throws JasperException {
-
- TagInfo tagInfo = n.getTagInfo();
- if (tagInfo == null) {
- err.jspError(n, "jsp.error.missing.tagInfo", n.getQName());
- }
-
- /*
- * The bodyconet of a SimpleTag cannot be JSP.
- */
- if (n.implementsSimpleTag() &&
+ visitBody(n);
+ }
+
+ public void visit(Node.CustomTag n) throws JasperException {
+
+ TagInfo tagInfo = n.getTagInfo();
+ if (tagInfo == null) {
+ err.jspError(n, "jsp.error.missing.tagInfo", n.getQName());
+ }
+
+ /*
+ * The bodyconet of a SimpleTag cannot be JSP.
+ */
+ if (n.implementsSimpleTag() &&
tagInfo.getBodyContent().equalsIgnoreCase(TagInfo.BODY_CONTENT_JSP)) {
err.jspError(n, "jsp.error.simpletag.badbodycontent",
tagInfo.getTagClassName());
- }
+ }
- /*
- * If the tag handler declares in the TLD that it supports dynamic
- * attributes, it also must implement the DynamicAttributes
- * interface.
- */
- if (tagInfo.hasDynamicAttributes()
- && !n.implementsDynamicAttributes()) {
- err.jspError(n, "jsp.error.dynamic.attributes.not.implemented",
- n.getQName());
- }
+ /*
+ * If the tag handler declares in the TLD that it supports dynamic
+ * attributes, it also must implement the DynamicAttributes
+ * interface.
+ */
+ if (tagInfo.hasDynamicAttributes()
+ && !n.implementsDynamicAttributes()) {
+ err.jspError(n, "jsp.error.dynamic.attributes.not.implemented",
+ n.getQName());
+ }
- /*
- * Make sure all required attributes are present, either as
+ /*
+ * Make sure all required attributes are present, either as
* attributes or named attributes (<jsp:attribute>).
- * Also make sure that the same attribute is not specified in
- * both attributes or named attributes.
- */
- TagAttributeInfo[] tldAttrs = tagInfo.getAttributes();
- String customActionUri = n.getURI();
- Attributes attrs = n.getAttributes();
- int attrsSize = (attrs == null) ? 0 : attrs.getLength();
- for (int i=0; i<tldAttrs.length; i++) {
- String attr = null;
- if (attrs != null) {
- attr = attrs.getValue(tldAttrs[i].getName());
- if (attr == null) {
- attr = attrs.getValue(customActionUri,
- tldAttrs[i].getName());
- }
- }
- Node.NamedAttribute na =
- n.getNamedAttributeNode(tldAttrs[i].getName());
-
- if (tldAttrs[i].isRequired() && attr == null && na == null) {
- err.jspError(n, "jsp.error.missing_attribute",
- tldAttrs[i].getName(), n.getLocalName());
- }
- if (attr != null && na != null) {
- err.jspError(n, "jsp.error.duplicate.name.jspattribute",
- tldAttrs[i].getName());
- }
- }
+ * Also make sure that the same attribute is not specified in
+ * both attributes or named attributes.
+ */
+ TagAttributeInfo[] tldAttrs = tagInfo.getAttributes();
+ String customActionUri = n.getURI();
+ Attributes attrs = n.getAttributes();
+ int attrsSize = (attrs == null) ? 0 : attrs.getLength();
+ for (int i=0; i<tldAttrs.length; i++) {
+ String attr = null;
+ if (attrs != null) {
+ attr = attrs.getValue(tldAttrs[i].getName());
+ if (attr == null) {
+ attr = attrs.getValue(customActionUri,
+ tldAttrs[i].getName());
+ }
+ }
+ Node.NamedAttribute na =
+ n.getNamedAttributeNode(tldAttrs[i].getName());
+
+ if (tldAttrs[i].isRequired() && attr == null && na == null) {
+ err.jspError(n, "jsp.error.missing_attribute",
+ tldAttrs[i].getName(), n.getLocalName());
+ }
+ if (attr != null && na != null) {
+ err.jspError(n, "jsp.error.duplicate.name.jspattribute",
+ tldAttrs[i].getName());
+ }
+ }
Node.Nodes naNodes = n.getNamedAttributeNodes();
- int jspAttrsSize = naNodes.size() + attrsSize;
- Node.JspAttribute[] jspAttrs = null;
- if (jspAttrsSize > 0) {
- jspAttrs = new Node.JspAttribute[jspAttrsSize];
- }
- Hashtable tagDataAttrs = new Hashtable(attrsSize);
+ int jspAttrsSize = naNodes.size() + attrsSize;
+ Node.JspAttribute[] jspAttrs = null;
+ if (jspAttrsSize > 0) {
+ jspAttrs = new Node.JspAttribute[jspAttrsSize];
+ }
+ Hashtable tagDataAttrs = new Hashtable(attrsSize);
- checkXmlAttributes(n, jspAttrs, tagDataAttrs);
+ checkXmlAttributes(n, jspAttrs, tagDataAttrs);
checkNamedAttributes(n, jspAttrs, attrsSize, tagDataAttrs);
- TagData tagData = new TagData(tagDataAttrs);
+ TagData tagData = new TagData(tagDataAttrs);
+
+ // JSP.C1: It is a (translation time) error for an action that
+ // has one or more variable subelements to have a TagExtraInfo
+ // class that returns a non-null object.
+ TagExtraInfo tei = tagInfo.getTagExtraInfo();
+ if (tei != null
+ && tei.getVariableInfo(tagData) != null
+ && tei.getVariableInfo(tagData).length > 0
+ && tagInfo.getTagVariableInfos().length > 0) {
+ err.jspError("jsp.error.non_null_tei_and_var_subelems",
+ n.getQName());
+ }
+
+ n.setTagData(tagData);
+ n.setJspAttributes(jspAttrs);
+
+ visitBody(n);
+ }
+
+ public void visit(Node.JspElement n) throws JasperException {
- // JSP.C1: It is a (translation time) error for an action that
- // has one or more variable subelements to have a TagExtraInfo
- // class that returns a non-null object.
- TagExtraInfo tei = tagInfo.getTagExtraInfo();
- if (tei != null
- && tei.getVariableInfo(tagData) != null
- && tei.getVariableInfo(tagData).length > 0
- && tagInfo.getTagVariableInfos().length > 0) {
- err.jspError("jsp.error.non_null_tei_and_var_subelems",
- n.getQName());
- }
-
- n.setTagData(tagData);
- n.setJspAttributes(jspAttrs);
-
- visitBody(n);
- }
-
- public void visit(Node.JspElement n) throws JasperException {
-
- Attributes attrs = n.getAttributes();
- if (attrs == null) {
- err.jspError(n, "jsp.error.jspelement.missing.name");
- }
- int xmlAttrLen = attrs.getLength();
+ Attributes attrs = n.getAttributes();
+ if (attrs == null) {
+ err.jspError(n, "jsp.error.jspelement.missing.name");
+ }
+ int xmlAttrLen = attrs.getLength();
Node.Nodes namedAttrs = n.getNamedAttributeNodes();
- // XML-style 'name' attribute, which is mandatory, must not be
- // included in JspAttribute array
- int jspAttrSize = xmlAttrLen-1 + namedAttrs.size();
-
- Node.JspAttribute[] jspAttrs = new Node.JspAttribute[jspAttrSize];
- int jspAttrIndex = 0;
-
- // Process XML-style attributes
- for (int i=0; i<xmlAttrLen; i++) {
- if ("name".equals(attrs.getLocalName(i))) {
- n.setNameAttribute(getJspAttribute(attrs.getQName(i),
- attrs.getURI(i),
- attrs.getLocalName(i),
- attrs.getValue(i),
- java.lang.String.class,
- n,
- false));
- } else {
- if (jspAttrIndex<jspAttrSize) {
- jspAttrs[jspAttrIndex++]
- = getJspAttribute(attrs.getQName(i),
- attrs.getURI(i),
- attrs.getLocalName(i),
- attrs.getValue(i),
- java.lang.Object.class,
- n,
- false);
- }
- }
- }
- if (n.getNameAttribute() == null) {
- err.jspError(n, "jsp.error.jspelement.missing.name");
- }
-
- // Process named attributes
- for (int i=0; i<namedAttrs.size(); i++) {
- Node.NamedAttribute na = (Node.NamedAttribute) namedAttrs.getNode(i);
- jspAttrs[jspAttrIndex++] = new Node.JspAttribute(na, false);
- }
+ // XML-style 'name' attribute, which is mandatory, must not be
+ // included in JspAttribute array
+ int jspAttrSize = xmlAttrLen-1 + namedAttrs.size();
+
+ Node.JspAttribute[] jspAttrs = new Node.JspAttribute[jspAttrSize];
+ int jspAttrIndex = 0;
+
+ // Process XML-style attributes
+ for (int i=0; i<xmlAttrLen; i++) {
+ if ("name".equals(attrs.getLocalName(i))) {
+ n.setNameAttribute(getJspAttribute(attrs.getQName(i),
+ attrs.getURI(i),
+ attrs.getLocalName(i),
+ attrs.getValue(i),
+ java.lang.String.class,
+ n,
+ false));
+ } else {
+ if (jspAttrIndex<jspAttrSize) {
+ jspAttrs[jspAttrIndex++]
+ = getJspAttribute(attrs.getQName(i),
+ attrs.getURI(i),
+ attrs.getLocalName(i),
+ attrs.getValue(i),
+ java.lang.Object.class,
+ n,
+ false);
+ }
+ }
+ }
+ if (n.getNameAttribute() == null) {
+ err.jspError(n, "jsp.error.jspelement.missing.name");
+ }
+
+ // Process named attributes
+ for (int i=0; i<namedAttrs.size(); i++) {
+ Node.NamedAttribute na =
+ (Node.NamedAttribute) namedAttrs.getNode(i);
+ jspAttrs[jspAttrIndex++] = new Node.JspAttribute(na, false);
+ }
- n.setJspAttributes(jspAttrs);
+ n.setJspAttributes(jspAttrs);
- visitBody(n);
- }
+ visitBody(n);
+ }
- public void visit(Node.JspOutput n) throws JasperException {
+ public void visit(Node.JspOutput n) throws JasperException {
JspUtil.checkAttributes("jsp:output", n, jspOutputAttrs, err);
- if (n.getBody() != null) {
+ if (n.getBody() != null) {
err.jspError(n, "jsp.error.jspoutput.nonemptybody");
- }
+ }
- String omitXmlDecl = n.getAttributeValue("omit-xml-declaration");
- String doctypeName = n.getAttributeValue("doctype-root-element");
- String doctypePublic = n.getAttributeValue("doctype-public");
- String doctypeSystem = n.getAttributeValue("doctype-system");
-
- String omitXmlDeclOld = pageInfo.getOmitXmlDecl();
- String doctypeNameOld = pageInfo.getDoctypeName();
- String doctypePublicOld = pageInfo.getDoctypePublic();
- String doctypeSystemOld = pageInfo.getDoctypeSystem();
+ String omitXmlDecl = n.getAttributeValue("omit-xml-declaration");
+ String doctypeName = n.getAttributeValue("doctype-root-element");
+ String doctypePublic = n.getAttributeValue("doctype-public");
+ String doctypeSystem = n.getAttributeValue("doctype-system");
+
+ String omitXmlDeclOld = pageInfo.getOmitXmlDecl();
+ String doctypeNameOld = pageInfo.getDoctypeName();
+ String doctypePublicOld = pageInfo.getDoctypePublic();
+ String doctypeSystemOld = pageInfo.getDoctypeSystem();
- if (omitXmlDecl != null && omitXmlDeclOld != null &&
- !omitXmlDecl.equals(omitXmlDeclOld) ) {
+ if (omitXmlDecl != null && omitXmlDeclOld != null &&
+ !omitXmlDecl.equals(omitXmlDeclOld) ) {
err.jspError(n, "jsp.error.jspoutput.conflict",
- "omit-xml-declaration", omitXmlDeclOld, omitXmlDecl);
- }
+ "omit-xml-declaration", omitXmlDeclOld, omitXmlDecl);
+ }
- if (doctypeName != null && doctypeNameOld != null &&
- !doctypeName.equals(doctypeNameOld) ) {
+ if (doctypeName != null && doctypeNameOld != null &&
+ !doctypeName.equals(doctypeNameOld) ) {
err.jspError(n, "jsp.error.jspoutput.conflict",
- "doctype-root-element", doctypeNameOld, doctypeName);
- }
+ "doctype-root-element", doctypeNameOld, doctypeName);
+ }
- if (doctypePublic != null && doctypePublicOld != null &&
- !doctypePublic.equals(doctypePublicOld) ) {
+ if (doctypePublic != null && doctypePublicOld != null &&
+ !doctypePublic.equals(doctypePublicOld) ) {
err.jspError(n, "jsp.error.jspoutput.conflict",
- "doctype-public", doctypePublicOld, doctypePublic);
- }
+ "doctype-public", doctypePublicOld, doctypePublic);
+ }
- if (doctypeSystem != null && doctypeSystemOld != null &&
- !doctypeSystem.equals(doctypeSystemOld) ) {
+ if (doctypeSystem != null && doctypeSystemOld != null &&
+ !doctypeSystem.equals(doctypeSystemOld) ) {
err.jspError(n, "jsp.error.jspoutput.conflict",
- "doctype-system", doctypeSystemOld, doctypeSystem);
- }
+ "doctype-system", doctypeSystemOld, doctypeSystem);
+ }
- if (doctypeName == null && doctypeSystem != null ||
- doctypeName != null && doctypeSystem == null) {
- err.jspError(n, "jsp.error.jspoutput.doctypenamesystem");
- }
-
- if (doctypePublic != null && doctypeSystem == null) {
- err.jspError(n, "jsp.error.jspoutput.doctypepulicsystem");
- }
-
- if (omitXmlDecl != null) {
- pageInfo.setOmitXmlDecl(omitXmlDecl);
- }
- if (doctypeName != null) {
- pageInfo.setDoctypeName(doctypeName);
- }
- if (doctypeSystem != null) {
- pageInfo.setDoctypeSystem(doctypeSystem);
- }
- if (doctypePublic != null) {
- pageInfo.setDoctypePublic(doctypePublic);
- }
- }
+ if (doctypeName == null && doctypeSystem != null ||
+ doctypeName != null && doctypeSystem == null) {
+ err.jspError(n, "jsp.error.jspoutput.doctypenamesystem");
+ }
- public void visit(Node.InvokeAction n) throws JasperException {
+ if (doctypePublic != null && doctypeSystem == null) {
+ err.jspError(n, "jsp.error.jspoutput.doctypepulicsystem");
+ }
+
+ if (omitXmlDecl != null) {
+ pageInfo.setOmitXmlDecl(omitXmlDecl);
+ }
+ if (doctypeName != null) {
+ pageInfo.setDoctypeName(doctypeName);
+ }
+ if (doctypeSystem != null) {
+ pageInfo.setDoctypeSystem(doctypeSystem);
+ }
+ if (doctypePublic != null) {
+ pageInfo.setDoctypePublic(doctypePublic);
+ }
+ }
+
+ public void visit(Node.InvokeAction n) throws JasperException {
JspUtil.checkAttributes("Invoke", n, invokeAttrs, err);
- String scope = n.getTextAttribute ("scope");
- JspUtil.checkScope(scope, n, err);
+ String scope = n.getTextAttribute ("scope");
+ JspUtil.checkScope(scope, n, err);
- String var = n.getTextAttribute("var");
- String varReader = n.getTextAttribute("varReader");
- if (scope != null && var == null && varReader == null) {
- err.jspError(n, "jsp.error.missing_var_or_varReader");
- }
- if (var != null && varReader != null) {
- err.jspError(n, "jsp.error.var_and_varReader");
- }
- }
+ String var = n.getTextAttribute("var");
+ String varReader = n.getTextAttribute("varReader");
+ if (scope != null && var == null && varReader == null) {
+ err.jspError(n, "jsp.error.missing_var_or_varReader");
+ }
+ if (var != null && varReader != null) {
+ err.jspError(n, "jsp.error.var_and_varReader");
+ }
+ }
- public void visit(Node.DoBodyAction n) throws JasperException {
+ public void visit(Node.DoBodyAction n) throws JasperException {
JspUtil.checkAttributes("DoBody", n, doBodyAttrs, err);
- String scope = n.getTextAttribute ("scope");
- JspUtil.checkScope(scope, n, err);
+ String scope = n.getTextAttribute ("scope");
+ JspUtil.checkScope(scope, n, err);
+
+ String var = n.getTextAttribute("var");
+ String varReader = n.getTextAttribute("varReader");
+ if (scope != null && var == null && varReader == null) {
+ err.jspError(n, "jsp.error.missing_var_or_varReader");
+ }
+ 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();
- String var = n.getTextAttribute("var");
- String varReader = n.getTextAttribute("varReader");
- if (scope != null && var == null && varReader == null) {
- err.jspError(n, "jsp.error.missing_var_or_varReader");
- }
- 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; attrs != null && 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).equals(n.getURI()))) {
- if (tldAttrs[j].canBeRequestTime()) {
+ for (int i=0; attrs != null && 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).equals(n.getURI()))) {
+ if (tldAttrs[j].canBeRequestTime()) {
Class expectedType = String.class;
try {
String typeStr = tldAttrs[j].getTypeName();
@@ -928,7 +929,7 @@
}
else if( typeStr != null ) {
expectedType = JspUtil.toClass(typeStr,
- loader);
+ loader);
}
jspAttrs[i]
= getJspAttribute(attrs.getQName(i),
@@ -944,156 +945,156 @@
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))) {
+ } 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,
- null,
- 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,
+ "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,
+ null,
+ 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,
- 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();
+ 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++) {
+ 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.equals(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());
- }
- }
- }
- }
-
- /**
- * Preprocess attributes that can be expressions. Expression
- * delimiters are stripped.
+ 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.equals(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());
+ }
+ }
+ }
+ }
+
+ /**
+ * Preprocess attributes that can be expressions. Expression
+ * delimiters are stripped.
* <p>
* If value is null, checks if there are any
* NamedAttribute subelements in the tree node, and if so,
* constructs a JspAttribute out of a child NamedAttribute node.
- */
- private Node.JspAttribute getJspAttribute(String qName,
- String uri,
- String localName,
- String value,
+ */
+ private Node.JspAttribute getJspAttribute(String qName,
+ String uri,
+ String localName,
+ String value,
Class expectedType,
Node n,
- boolean dynamic)
+ boolean dynamic)
throws JasperException {
Node.JspAttribute result = null;
- // XXX Is it an error to see "%=foo%" in non-Xml page?
- // (We won't see "<%=foo%> in xml page because '<' is not a
- // valid attribute value in xml).
+ // XXX Is it an error to see "%=foo%" in non-Xml page?
+ // (We won't see "<%=foo%> in xml page because '<' is not a
+ // valid attribute value in xml).
if (value != null) {
if (n.getRoot().isXmlSyntax() && value.startsWith("%=")) {
result = new Node.JspAttribute(
qName,
- uri,
- localName,
- value.substring(2, value.length()-1),
- true,
- null,
- dynamic);
+ uri,
+ localName,
+ value.substring(2, value.length()-1),
+ true,
+ null,
+ dynamic);
}
else if(!n.getRoot().isXmlSyntax() && value.startsWith("<%=")) {
result = new Node.JspAttribute(
qName,
- uri,
- localName,
- value.substring(3, value.length()-2),
- true,
- null,
- dynamic);
+ uri,
+ localName,
+ value.substring(3, value.length()-2),
+ true,
+ null,
+ dynamic);
}
else {
// The attribute can contain expressions but is not a
@@ -1104,7 +1105,7 @@
// expression(s)
ELNode.Nodes el = ELParser.parse(value);
if (el.containsEL() && !pageInfo.isELIgnored()) {
- validateFunctions(el, n);
+ validateFunctions(el, n);
JspUtil.validateExpressions(
n.getStart(),
value,
@@ -1114,13 +1115,13 @@
result = new Node.JspAttribute(qName, uri, localName,
- value, false, el,
- dynamic);
+ value, false, el,
+ dynamic);
} else {
- value = value.replace(Constants.HACK_CHAR, '$');
+ value = value.replace(Constants.HACK_CHAR, '$');
result = new Node.JspAttribute(qName, uri, localName,
- value, false, null,
- dynamic);
+ value, false, null,
+ dynamic);
}
}
}
@@ -1133,263 +1134,263 @@
n.getNamedAttributeNode( qName );
if( namedAttributeNode != null ) {
result = new Node.JspAttribute(namedAttributeNode,
- dynamic);
+ dynamic);
}
}
return result;
}
- /*
- * Checks to see if the given attribute value represents a runtime or
- * EL expression.
- */
- private boolean isExpression(Node n, String value) {
- if ((n.getRoot().isXmlSyntax() && value.startsWith("%="))
- || (!n.getRoot().isXmlSyntax() && value.startsWith("<%="))
- || (value.indexOf("${") != -1 && !pageInfo.isELIgnored()))
- return true;
- else
- return false;
- }
-
- /*
- * Throws exception if the value of the attribute with the given
- * name in the given node is given as an RT or EL expression, but the
- * spec requires a static value.
- */
- private void throwErrorIfExpression(Node n, String attrName,
- String actionName)
- throws JasperException {
- if (n.getAttributes() != null
- && n.getAttributes().getValue(attrName) != null
- && isExpression(n, n.getAttributes().getValue(attrName))) {
- err.jspError(n,
- "jsp.error.attribute.standard.non_rt_with_expr",
- attrName, actionName);
- }
- }
-
- private static class NamedAttributeVisitor extends Node.Visitor {
- private boolean hasDynamicContent;
-
- public void doVisit(Node n) throws JasperException {
- if (!(n instanceof Node.JspText)
- && !(n instanceof Node.TemplateText)) {
- hasDynamicContent = true;
- }
- visitBody(n);
- }
-
- public boolean hasDynamicContent() {
- return hasDynamicContent;
- }
- }
-
- private String findUri(String prefix, Node n) {
-
- for (Node p = n; p != null; p = p.getParent()) {
- Attributes attrs = p.getTaglibAttributes();
- if (attrs == null) {
- continue;
- }
- for (int i = 0; i < attrs.getLength(); i++) {
- String name = attrs.getQName(i);
- int k = name.indexOf(':');
- if (prefix == null && k < 0) {
- // prefix not specified and a default ns found
- return attrs.getValue(i);
- }
- if (prefix != null && k >= 0 &&
- prefix.equals(name.substring(k+1))) {
- return attrs.getValue(i);
- }
- }
- }
- return null;
- }
-
- /**
- * Validate functions in EL expressions
- */
- private void validateFunctions(ELNode.Nodes el, Node n)
- throws JasperException {
-
- class FVVisitor extends ELNode.Visitor {
-
- Node n;
-
- FVVisitor(Node n) {
- this.n = n;
- }
-
- public void visit(ELNode.Function func) throws JasperException {
- String prefix = func.getPrefix();
- String function = func.getName();
- String uri = null;
-
- if (n.getRoot().isXmlSyntax()) {
- uri = findUri(prefix, n);
- } else if (prefix != null) {
- uri = pageInfo.getURI(prefix);
- }
-
- if (uri == null) {
- if (prefix == null) {
- err.jspError(n, "jsp.error.noFunctionPrefix",
- function);
- }
- else {
- err.jspError(n,
- "jsp.error.attribute.invalidPrefix", prefix);
- }
- }
- TagLibraryInfo taglib = pageInfo.getTaglib(uri);
- FunctionInfo funcInfo = null;
- if (taglib != null) {
- funcInfo = taglib.getFunction(function);
- }
- if (funcInfo == null) {
- err.jspError(n, "jsp.error.noFunction", function);
- }
- // Skip TLD function uniqueness check. Done by Schema ?
- func.setUri(uri);
- func.setFunctionInfo(funcInfo);
- processSignature(func);
- }
- }
-
- el.visit(new FVVisitor(n));
- }
-
- private void processSignature(ELNode.Function func)
- throws JasperException {
- func.setMethodName(getMethod(func));
- func.setParameters(getParameters(func));
- }
-
- /**
- * Get the method name from the signature.
- */
- private String getMethod(ELNode.Function func)
- throws JasperException {
- FunctionInfo funcInfo = func.getFunctionInfo();
- String signature = funcInfo.getFunctionSignature();
-
- int start = signature.indexOf(' ');
- if (start < 0) {
- err.jspError("jsp.error.tld.fn.invalid.signature",
- func.getPrefix(), func.getName());
- }
- int end = signature.indexOf('(');
- if (end < 0) {
- err.jspError("jsp.error.tld.fn.invalid.signature.parenexpected",
- func.getPrefix(), func.getName());
- }
- return signature.substring(start+1, end).trim();
- }
-
- /**
- * Get the parameters types from the function signature.
- * @return An array of parameter class names
- */
- private String[] getParameters(ELNode.Function func)
- throws JasperException {
- FunctionInfo funcInfo = func.getFunctionInfo();
- String signature = funcInfo.getFunctionSignature();
- ArrayList params = new ArrayList();
- // Signature is of the form
- // <return-type> S <method-name S? '('
- // < <arg-type> ( ',' <arg-type> )* )? ')'
- int start = signature.indexOf('(') + 1;
- boolean lastArg = false;
- while (true) {
- int p = signature.indexOf(',', start);
- if (p < 0) {
- p = signature.indexOf(')', start);
- if (p < 0) {
- err.jspError("jsp.error.tld.fn.invalid.signature",
- func.getPrefix(), func.getName());
- }
- lastArg = true;
- }
+ /*
+ * Checks to see if the given attribute value represents a runtime or
+ * EL expression.
+ */
+ private boolean isExpression(Node n, String value) {
+ if ((n.getRoot().isXmlSyntax() && value.startsWith("%="))
+ || (!n.getRoot().isXmlSyntax() && value.startsWith("<%="))
+ || (value.indexOf("${") != -1 && !pageInfo.isELIgnored()))
+ return true;
+ else
+ return false;
+ }
+
+ /*
+ * Throws exception if the value of the attribute with the given
+ * name in the given node is given as an RT or EL expression, but the
+ * spec requires a static value.
+ */
+ private void throwErrorIfExpression(Node n, String attrName,
+ String actionName)
+ throws JasperException {
+ if (n.getAttributes() != null
+ && n.getAttributes().getValue(attrName) != null
+ && isExpression(n, n.getAttributes().getValue(attrName))) {
+ err.jspError(n,
+ "jsp.error.attribute.standard.non_rt_with_expr",
+ attrName, actionName);
+ }
+ }
+
+ private static class NamedAttributeVisitor extends Node.Visitor {
+ private boolean hasDynamicContent;
+
+ public void doVisit(Node n) throws JasperException {
+ if (!(n instanceof Node.JspText)
+ && !(n instanceof Node.TemplateText)) {
+ hasDynamicContent = true;
+ }
+ visitBody(n);
+ }
+
+ public boolean hasDynamicContent() {
+ return hasDynamicContent;
+ }
+ }
+
+ private String findUri(String prefix, Node n) {
+
+ for (Node p = n; p != null; p = p.getParent()) {
+ Attributes attrs = p.getTaglibAttributes();
+ if (attrs == null) {
+ continue;
+ }
+ for (int i = 0; i < attrs.getLength(); i++) {
+ String name = attrs.getQName(i);
+ int k = name.indexOf(':');
+ if (prefix == null && k < 0) {
+ // prefix not specified and a default ns found
+ return attrs.getValue(i);
+ }
+ if (prefix != null && k >= 0 &&
+ prefix.equals(name.substring(k+1))) {
+ return attrs.getValue(i);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Validate functions in EL expressions
+ */
+ private void validateFunctions(ELNode.Nodes el, Node n)
+ throws JasperException {
+
+ class FVVisitor extends ELNode.Visitor {
+
+ Node n;
+
+ FVVisitor(Node n) {
+ this.n = n;
+ }
+
+ public void visit(ELNode.Function func) throws JasperException {
+ String prefix = func.getPrefix();
+ String function = func.getName();
+ String uri = null;
+
+ if (n.getRoot().isXmlSyntax()) {
+ uri = findUri(prefix, n);
+ } else if (prefix != null) {
+ uri = pageInfo.getURI(prefix);
+ }
+
+ if (uri == null) {
+ if (prefix == null) {
+ err.jspError(n, "jsp.error.noFunctionPrefix",
+ function);
+ }
+ else {
+ err.jspError(n,
+ "jsp.error.attribute.invalidPrefix", prefix);
+ }
+ }
+ TagLibraryInfo taglib = pageInfo.getTaglib(uri);
+ FunctionInfo funcInfo = null;
+ if (taglib != null) {
+ funcInfo = taglib.getFunction(function);
+ }
+ if (funcInfo == null) {
+ err.jspError(n, "jsp.error.noFunction", function);
+ }
+ // Skip TLD function uniqueness check. Done by Schema ?
+ func.setUri(uri);
+ func.setFunctionInfo(funcInfo);
+ processSignature(func);
+ }
+ }
+
+ el.visit(new FVVisitor(n));
+ }
+
+ private void processSignature(ELNode.Function func)
+ throws JasperException {
+ func.setMethodName(getMethod(func));
+ func.setParameters(getParameters(func));
+ }
+
+ /**
+ * Get the method name from the signature.
+ */
+ private String getMethod(ELNode.Function func)
+ throws JasperException {
+ FunctionInfo funcInfo = func.getFunctionInfo();
+ String signature = funcInfo.getFunctionSignature();
+
+ int start = signature.indexOf(' ');
+ if (start < 0) {
+ err.jspError("jsp.error.tld.fn.invalid.signature",
+ func.getPrefix(), func.getName());
+ }
+ int end = signature.indexOf('(');
+ if (end < 0) {
+ err.jspError("jsp.error.tld.fn.invalid.signature.parenexpected",
+ func.getPrefix(), func.getName());
+ }
+ return signature.substring(start+1, end).trim();
+ }
+
+ /**
+ * Get the parameters types from the function signature.
+ * @return An array of parameter class names
+ */
+ private String[] getParameters(ELNode.Function func)
+ throws JasperException {
+ FunctionInfo funcInfo = func.getFunctionInfo();
+ String signature = funcInfo.getFunctionSignature();
+ ArrayList params = new ArrayList();
+ // Signature is of the form
+ // <return-type> S <method-name S? '('
+ // < <arg-type> ( ',' <arg-type> )* )? ')'
+ int start = signature.indexOf('(') + 1;
+ boolean lastArg = false;
+ while (true) {
+ int p = signature.indexOf(',', start);
+ if (p < 0) {
+ p = signature.indexOf(')', start);
+ if (p < 0) {
+ err.jspError("jsp.error.tld.fn.invalid.signature",
+ func.getPrefix(), func.getName());
+ }
+ lastArg = true;
+ }
String arg = signature.substring(start, p).trim();
if (!"".equals(arg)) {
params.add(arg);
}
- if (lastArg) {
- break;
- }
- start = p+1;
- }
- return (String[]) params.toArray(new String[params.size()]);
- }
-
- private FunctionMapper getFunctionMapper(ELNode.Nodes el)
- throws JasperException {
-
[... 388 lines stripped ...]
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org