You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by jb...@apache.org on 2013/11/16 23:47:58 UTC
svn commit: r1542606 - in /tomcat/trunk/java/org/apache:
jasper/compiler/ImplicitTagLibraryInfo.java
tomcat/util/descriptor/tld/ImplicitTldRuleSet.java
tomcat/util/descriptor/tld/TldParser.java
Author: jboynes
Date: Sat Nov 16 22:47:58 2013
New Revision: 1542606
URL: http://svn.apache.org/r1542606
Log:
Use Digester to load implicit.tld taglib descriptors
Added:
tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java
- copied, changed from r1542562, tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java
Modified:
tomcat/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java
tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldParser.java
Modified: tomcat/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java?rev=1542606&r1=1542605&r2=1542606&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java (original)
+++ tomcat/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java Sat Nov 16 22:47:58 2013
@@ -17,10 +17,10 @@
package org.apache.jasper.compiler;
-import java.io.InputStream;
+import java.io.IOException;
+import java.net.URL;
import java.util.Collection;
import java.util.Hashtable;
-import java.util.Iterator;
import java.util.Set;
import java.util.Vector;
@@ -31,9 +31,11 @@ import javax.servlet.jsp.tagext.TagLibra
import org.apache.jasper.JasperException;
import org.apache.jasper.JspCompilationContext;
-import org.apache.jasper.util.ExceptionUtils;
-import org.apache.jasper.xmlparser.ParserUtils;
-import org.apache.jasper.xmlparser.TreeNode;
+import org.apache.tomcat.util.descriptor.tld.ImplicitTldRuleSet;
+import org.apache.tomcat.util.descriptor.tld.TaglibXml;
+import org.apache.tomcat.util.descriptor.tld.TldParser;
+import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
+import org.xml.sax.SAXException;
/**
* Class responsible for generating an implicit tag library containing tag
@@ -97,9 +99,7 @@ class ImplicitTagLibraryInfo extends Tag
// Populate mapping of tag names to tag file paths
Set<String> dirList = ctxt.getResourcePaths(tagdir);
if (dirList != null) {
- Iterator<String> it = dirList.iterator();
- while (it.hasNext()) {
- String path = it.next();
+ for (String path : dirList) {
if (path.endsWith(TAG_FILE_SUFFIX)
|| path.endsWith(TAGX_FILE_SUFFIX)) {
/*
@@ -114,60 +114,32 @@ class ImplicitTagLibraryInfo extends Tag
tagName.lastIndexOf(suffix));
tagFileMap.put(tagName, path);
} else if (path.endsWith(IMPLICIT_TLD)) {
- InputStream in = null;
+ TaglibXml taglibXml;
try {
- in = ctxt.getResourceAsStream(path);
- if (in != null) {
-
- // Add implicit TLD to dependency list
- if (pi != null) {
- pi.addDependant(path, ctxt.getLastModified(path));
- }
-
- ParserUtils pu = new ParserUtils();
- TreeNode tld = pu.parseXMLDocument(uri, in);
-
- if (tld.findAttribute("version") != null) {
- this.jspversion = tld.findAttribute("version");
- }
-
- // Process each child element of our <taglib> element
- Iterator<TreeNode> list = tld.findChildren();
-
- while (list.hasNext()) {
- TreeNode element = list.next();
- String tname = element.getName();
-
- if ("tlibversion".equals(tname) // JSP 1.1
- || "tlib-version".equals(tname)) { // JSP 1.2
- this.tlibversion = element.getBody();
- } else if ("jspversion".equals(tname)
- || "jsp-version".equals(tname)) {
- this.jspversion = element.getBody();
- } else if ("shortname".equals(tname) || "short-name".equals(tname)) {
- // Ignore
- } else {
- // All other elements are invalid
- err.jspError("jsp.error.invalid.implicit", path);
- }
- }
- try {
- double version = Double.parseDouble(this.jspversion);
- if (version < 2.0) {
- err.jspError("jsp.error.invalid.implicit.version", path);
- }
- } catch (NumberFormatException e) {
- err.jspError("jsp.error.invalid.implicit.version", path);
- }
- }
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (Throwable t) {
- ExceptionUtils.handleThrowable(t);
- }
+ URL url = ctxt.getResource(path);
+ TldResourcePath resourcePath = new TldResourcePath(url, path);
+ // TODO enable validation
+ TldParser parser = new TldParser(true, false, new ImplicitTldRuleSet());
+ taglibXml = parser.parse(resourcePath);
+ } catch (IOException | SAXException e) {
+ err.jspError(e);
+ // unreached
+ throw new JasperException(e);
+ }
+ this.tlibversion = taglibXml.getTlibVersion();
+ this.jspversion = taglibXml.getJspVersion();
+ try {
+ double version = Double.parseDouble(this.jspversion);
+ if (version < 2.0) {
+ err.jspError("jsp.error.invalid.implicit.version", path);
}
+ } catch (NumberFormatException e) {
+ err.jspError("jsp.error.invalid.implicit.version", path);
+ }
+
+ // Add implicit TLD to dependency list
+ if (pi != null) {
+ pi.addDependant(path, ctxt.getLastModified(path));
}
}
}
Copied: tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java (from r1542562, tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java)
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java?p2=tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java&p1=tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java&r1=1542562&r2=1542606&rev=1542606&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java Sat Nov 16 22:47:58 2013
@@ -16,26 +16,18 @@
*/
package org.apache.tomcat.util.descriptor.tld;
-import java.lang.reflect.Method;
-
-import javax.servlet.jsp.tagext.TagAttributeInfo;
-import javax.servlet.jsp.tagext.TagVariableInfo;
-import javax.servlet.jsp.tagext.VariableInfo;
-
import org.apache.tomcat.util.digester.Digester;
import org.apache.tomcat.util.digester.Rule;
import org.apache.tomcat.util.digester.RuleSetBase;
import org.xml.sax.Attributes;
/**
- * RulesSet for digesting TLD files.
+ * RulesSet for digesting implicit.tld files.
+ *
+ * Only version information used and short names are allowed.
*/
-public class TldRuleSet extends RuleSetBase {
+public class ImplicitTldRuleSet extends RuleSetBase {
private static final String PREFIX = "taglib";
- private static final String VALIDATOR_PREFIX = PREFIX + "/validator";
- private static final String TAG_PREFIX = PREFIX + "/tag";
- private static final String TAGFILE_PREFIX = PREFIX + "/tag-file";
- private static final String FUNCTION_PREFIX = PREFIX + "/function";
@Override
public void addRuleInstances(Digester digester) {
@@ -55,305 +47,5 @@ public class TldRuleSet extends RuleSetB
digester.addCallMethod(PREFIX + "/shortname", "setShortName", 0);
digester.addCallMethod(PREFIX + "/short-name", "setShortName", 0);
- // common rules
- digester.addCallMethod(PREFIX + "/uri", "setUri", 0);
- digester.addCallMethod(PREFIX + "/info", "setInfo", 0);
- digester.addCallMethod(PREFIX + "/description", "setInfo", 0);
- digester.addCallMethod(PREFIX + "/listener/listener-class", "addListener", 0);
-
- // validator
- digester.addObjectCreate(VALIDATOR_PREFIX, ValidatorXml.class.getName());
- digester.addCallMethod(VALIDATOR_PREFIX + "/validator-class", "setValidatorClass", 0);
- digester.addCallMethod(VALIDATOR_PREFIX + "/init-param", "addInitParam", 2);
- digester.addCallParam(VALIDATOR_PREFIX + "/init-param/param-name", 0);
- digester.addCallParam(VALIDATOR_PREFIX + "/init-param/param-value", 1);
- digester.addSetNext(VALIDATOR_PREFIX, "setValidator", ValidatorXml.class.getName());
-
-
- // tag
- digester.addObjectCreate(TAG_PREFIX, TagXml.class.getName());
- addDescriptionGroup(digester, TAG_PREFIX);
- digester.addCallMethod(TAG_PREFIX + "/name", "setName", 0);
- digester.addCallMethod(TAG_PREFIX + "/tagclass", "setTagClass", 0);
- digester.addCallMethod(TAG_PREFIX + "/tag-class", "setTagClass", 0);
- digester.addCallMethod(TAG_PREFIX + "/teiclass", "setTeiClass", 0);
- digester.addCallMethod(TAG_PREFIX + "/tei-class", "setTeiClass", 0);
- digester.addCallMethod(TAG_PREFIX + "/bodycontent", "setBodyContent", 0);
- digester.addCallMethod(TAG_PREFIX + "/body-content", "setBodyContent", 0);
-
- digester.addRule(TAG_PREFIX + "/variable", new ScriptVariableRule());
- digester.addCallMethod(TAG_PREFIX + "/variable/name-given", "setNameGiven", 0);
- digester.addCallMethod(TAG_PREFIX + "/variable/name-from-attribute",
- "setNameFromAttribute", 0);
- digester.addCallMethod(TAG_PREFIX + "/variable/variable-class", "setClassName", 0);
- digester.addRule(TAG_PREFIX + "/variable/declare",
- new GenericBooleanRule(Variable.class, "setDeclare"));
- digester.addCallMethod(TAG_PREFIX + "/variable/scope", "setScope", 0);
-
- digester.addRule(TAG_PREFIX + "/attribute", new TagAttributeRule());
- digester.addCallMethod(TAG_PREFIX + "/attribute/description", "setDescription", 0);
- digester.addCallMethod(TAG_PREFIX + "/attribute/name", "setName", 0);
- digester.addRule(TAG_PREFIX + "/attribute/required",
- new GenericBooleanRule(Attribute.class, "setRequired"));
- digester.addRule(TAG_PREFIX + "/attribute/rtexprvalue",
- new GenericBooleanRule(Attribute.class, "setRequestTime"));
- digester.addCallMethod(TAG_PREFIX + "/attribute/type", "setType", 0);
- digester.addCallMethod(TAG_PREFIX + "/attribute/deferred-value", "setDeferredValue");
- digester.addCallMethod(TAG_PREFIX + "/attribute/deferred-value/type",
- "setExpectedTypeName", 0);
- digester.addCallMethod(TAG_PREFIX + "/attribute/deferred-method", "setDeferredMethod");
- digester.addCallMethod(TAG_PREFIX + "/attribute/deferred-method/method-signature",
- "setMethodSignature", 0);
- digester.addRule(TAG_PREFIX + "/attribute/fragment",
- new GenericBooleanRule(Attribute.class, "setFragment"));
-
- digester.addRule(TAG_PREFIX + "/dynamic-attributes",
- new GenericBooleanRule(TagXml.class, "setDynamicAttributes"));
- digester.addSetNext(TAG_PREFIX, "addTag", TagXml.class.getName());
-
- // tag-file
- digester.addObjectCreate(TAGFILE_PREFIX, TagFileXml.class.getName());
- addDescriptionGroup(digester, TAGFILE_PREFIX);
- digester.addCallMethod(TAGFILE_PREFIX + "/name", "setName", 0);
- digester.addCallMethod(TAGFILE_PREFIX + "/path", "setPath", 0);
- digester.addSetNext(TAGFILE_PREFIX, "addTagFile", TagFileXml.class.getName());
-
- // function
- digester.addCallMethod(FUNCTION_PREFIX, "addFunction", 3);
- digester.addCallParam(FUNCTION_PREFIX + "/name", 0);
- digester.addCallParam(FUNCTION_PREFIX + "/function-class", 1);
- digester.addCallParam(FUNCTION_PREFIX + "/function-signature", 2);
- }
-
- private void addDescriptionGroup(Digester digester, String prefix) {
- digester.addCallMethod(prefix + "/info", "setInfo", 0);
- digester.addCallMethod(prefix + "small-icon", "setSmallIcon", 0);
- digester.addCallMethod(prefix + "large-icon", "setLargeIcon", 0);
-
- digester.addCallMethod(prefix + "/description", "setInfo", 0);
- digester.addCallMethod(prefix + "/display-name", "setDisplayName", 0);
- digester.addCallMethod(prefix + "/icon/small-icon", "setSmallIcon", 0);
- digester.addCallMethod(prefix + "/icon/large-icon", "setLargeIcon", 0);
- }
-
- private static class TagAttributeRule extends Rule {
- @Override
- public void begin(String namespace, String name, Attributes attributes) throws Exception {
- TaglibXml taglibXml = (TaglibXml) digester.peek(digester.getCount() - 1);
- digester.push(new Attribute("1.2".equals(taglibXml.getJspVersion())));
- }
-
- @Override
- public void end(String namespace, String name) throws Exception {
- Attribute attribute = (Attribute) digester.pop();
- TagXml tag = (TagXml) digester.peek();
- tag.getAttributes().add(attribute.toTagAttributeInfo());
- }
- }
-
- public static class Attribute {
- private final boolean allowShortNames;
- private String name;
- private boolean required;
- private String type;
- private boolean requestTime;
- private boolean fragment;
- private String description;
- private boolean deferredValue;
- private boolean deferredMethod;
- private String expectedTypeName;
- private String methodSignature;
-
- private Attribute(boolean allowShortNames) {
- this.allowShortNames = allowShortNames;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setRequired(boolean required) {
- this.required = required;
- }
-
- public void setType(String type) {
- if (allowShortNames) {
- switch (type) {
- case "Boolean":
- this.type = "java.lang.Boolean";
- break;
- case "Character":
- this.type = "java.lang.Character";
- break;
- case "Byte":
- this.type = "java.lang.Byte";
- break;
- case "Short":
- this.type = "java.lang.Short";
- break;
- case "Integer":
- this.type = "java.lang.Integer";
- break;
- case "Long":
- this.type = "java.lang.Long";
- break;
- case "Float":
- this.type = "java.lang.Float";
- break;
- case "Double":
- this.type = "java.lang.Double";
- break;
- case "String":
- this.type = "java.lang.String";
- break;
- case "Object":
- this.type = "java.lang.Object";
- break;
- default:
- this.type = type;
- break;
- }
- } else {
- this.type = type;
- }
- }
-
- public void setRequestTime(boolean requestTime) {
- this.requestTime = requestTime;
- }
-
- public void setFragment(boolean fragment) {
- this.fragment = fragment;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public void setDeferredValue() {
- this.deferredValue = true;
- }
-
- public void setDeferredMethod() {
- this.deferredMethod = true;
- }
-
- public void setExpectedTypeName(String expectedTypeName) {
- this.expectedTypeName = expectedTypeName;
- }
-
- public void setMethodSignature(String methodSignature) {
- this.methodSignature = methodSignature;
- }
-
- public TagAttributeInfo toTagAttributeInfo() {
- if (fragment) {
- // JSP8.5.2: for a fragment type is fixed and rexprvalue is true
- type = "javax.servlet.jsp.tagext.JspFragment";
- requestTime = true;
- } else if (deferredValue) {
- type = "javax.el.ValueExpression";
- if (expectedTypeName == null) {
- expectedTypeName = "java.lang.Object";
- }
- } else if (deferredMethod) {
- type = "javax.el.MethodExpression";
- if (methodSignature == null) {
- methodSignature = "java.lang.Object method()";
- }
- }
-
- // According to JSP spec, for static values (those determined at
- // translation time) the type is fixed at java.lang.String.
- if (!requestTime && type == null) {
- type = "java.lang.String";
- }
-
- return new TagAttributeInfo(
- name,
- required,
- type,
- requestTime,
- fragment,
- description,
- deferredValue,
- deferredMethod,
- expectedTypeName,
- methodSignature);
- }
- }
-
- private static class ScriptVariableRule extends Rule {
- @Override
- public void begin(String namespace, String name, Attributes attributes) throws Exception {
- digester.push(new Variable());
- }
-
- @Override
- public void end(String namespace, String name) throws Exception {
- Variable variable = (Variable) digester.pop();
- TagXml tag = (TagXml) digester.peek();
- tag.getVariables().add(variable.toTagVariableInfo());
- }
- }
-
- public static class Variable {
- private String nameGiven;
- private String nameFromAttribute;
- private String className = "java.lang.String";
- private boolean declare;
- private int scope = VariableInfo.NESTED;
-
- public void setNameGiven(String nameGiven) {
- this.nameGiven = nameGiven;
- }
-
- public void setNameFromAttribute(String nameFromAttribute) {
- this.nameFromAttribute = nameFromAttribute;
- }
-
- public void setClassName(String className) {
- this.className = className;
- }
-
- public void setDeclare(boolean declare) {
- this.declare = declare;
- }
-
- public void setScope(String scopeName) {
- switch (scopeName) {
- case "NESTED":
- scope = VariableInfo.NESTED;
- break;
- case "AT_BEGIN":
- scope = VariableInfo.AT_BEGIN;
- break;
- case "AT_END":
- scope = VariableInfo.AT_END;
- break;
- }
- }
-
- public TagVariableInfo toTagVariableInfo() {
- return new TagVariableInfo(nameGiven, nameFromAttribute, className, declare, scope);
- }
- }
-
- private static class GenericBooleanRule extends Rule {
- private final Method setter;
-
- private GenericBooleanRule(Class<?> type, String setterName) {
- try {
- this.setter = type.getMethod(setterName, Boolean.TYPE);
- } catch (NoSuchMethodException e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- @Override
- public void body(String namespace, String name, String text) throws Exception {
- boolean value = "true".equalsIgnoreCase(text) || "yes".equalsIgnoreCase(text);
- setter.invoke(digester.peek(), Boolean.valueOf(value));
- }
}
}
Modified: tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldParser.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldParser.java?rev=1542606&r1=1542605&r2=1542606&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldParser.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/descriptor/tld/TldParser.java Sat Nov 16 22:47:58 2013
@@ -24,6 +24,7 @@ import org.apache.juli.logging.LogFactor
import org.apache.tomcat.util.descriptor.DigesterFactory;
import org.apache.tomcat.util.descriptor.XmlErrorHandler;
import org.apache.tomcat.util.digester.Digester;
+import org.apache.tomcat.util.digester.RuleSet;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -35,7 +36,10 @@ public class TldParser {
private final Digester digester;
public TldParser(boolean namespaceAware, boolean validation) {
- TldRuleSet ruleSet = new TldRuleSet();
+ this(namespaceAware, validation, new TldRuleSet());
+ }
+
+ public TldParser(boolean namespaceAware, boolean validation, RuleSet ruleSet) {
digester = DigesterFactory.newDigester(validation, namespaceAware, ruleSet);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org