parser.java
来自「精通tomcat书籍原代码,希望大家共同学习」· Java 代码 · 共 1,859 行 · 第 1/5 页
JAVA
1,859 行
}
/**
* Add a list of files. This is used for implementing include-prelude
* and include-coda of jsp-config element in web.xml
*/
private void addInclude(Node parent, List files) throws JasperException {
if( files != null ) {
Iterator iter = files.iterator();
while (iter.hasNext()) {
String file = (String) iter.next();
AttributesImpl attrs = new AttributesImpl();
attrs.addAttribute("", "file", "file", "CDATA", file);
// Create a dummy Include directive node
Node includeNode = new Node.IncludeDirective(attrs,
reader.mark(), parent);
processIncludeDirective(file, includeNode);
}
}
}
/*
* Parses a taglib directive with the following syntax:
* Directive ::= ( S Attribute)*
*/
private void parseTaglibDirective(Node parent) throws JasperException {
Attributes attrs = parseAttributes();
String uri = attrs.getValue("uri");
String prefix = attrs.getValue("prefix");
if (prefix != null) {
Mark prevMark = pageInfo.getNonCustomTagPrefix(prefix);
if (prevMark != null) {
err.jspError(reader.mark(), "jsp.error.prefix.use_before_dcl",
prefix, prevMark.getFile(), "" + prevMark.getLineNumber());
}
if (uri != null) {
String uriPrev = pageInfo.getURI(prefix);
if (uriPrev != null && !uriPrev.equals(uri)) {
err.jspError(reader.mark(), "jsp.error.prefix.refined",
prefix, uri, uriPrev);
}
if (pageInfo.getTaglib(uri) == null) {
TagLibraryInfoImpl impl = null;
if (ctxt.getOptions().isCaching()) {
impl = (TagLibraryInfoImpl) ctxt.getOptions().getCache().get(uri);
}
if (impl == null) {
String[] location = ctxt.getTldLocation(uri);
impl = new TagLibraryInfoImpl(ctxt,
parserController,
prefix,
uri,
location,
err);
if (ctxt.getOptions().isCaching()) {
ctxt.getOptions().getCache().put(uri, impl);
}
}
pageInfo.addTaglib(uri, impl);
}
pageInfo.addPrefixMapping(prefix, uri);
} else {
String tagdir = attrs.getValue("tagdir");
if (tagdir != null) {
String urnTagdir = URN_JSPTAGDIR + tagdir;
if (pageInfo.getTaglib(urnTagdir) == null) {
pageInfo.addTaglib(urnTagdir,
new ImplicitTagLibraryInfo(
ctxt,
parserController,
prefix,
tagdir,
err));
}
pageInfo.addPrefixMapping(prefix, urnTagdir);
}
}
}
new Node.TaglibDirective(attrs, start, parent);
}
/*
* Parses a directive with the following syntax:
* Directive ::= S? ( 'page' PageDirective
* | 'include' IncludeDirective
* | 'taglib' TagLibDirective)
* S? '%>'
*
* TagDirective ::= S? ('tag' PageDirective
* | 'include' IncludeDirective
* | 'taglib' TagLibDirective)
* | 'attribute AttributeDirective
* | 'variable VariableDirective
* S? '%>'
*/
private void parseDirective(Node parent) throws JasperException {
reader.skipSpaces();
String directive = null;
if (reader.matches("page")) {
directive = "<%@ page";
if (isTagFile) {
err.jspError(reader.mark(), "jsp.error.directive.istagfile",
directive);
}
parsePageDirective(parent);
} else if (reader.matches("include")) {
directive = "<%@ include";
parseIncludeDirective(parent);
} else if (reader.matches("taglib")) {
if (directivesOnly) {
// No need to get the tagLibInfo objects. This alos suppresses
// parsing of any tag files used in this tag file.
return;
}
directive = "<%@ taglib";
parseTaglibDirective(parent);
} else if (reader.matches("tag")) {
directive = "<%@ tag";
if (!isTagFile) {
err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
directive);
}
parseTagDirective(parent);
} else if (reader.matches("attribute")) {
directive = "<%@ attribute";
if (!isTagFile) {
err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
directive);
}
parseAttributeDirective(parent);
} else if (reader.matches("variable")) {
directive = "<%@ variable";
if (!isTagFile) {
err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
directive);
}
parseVariableDirective(parent);
} else {
err.jspError(reader.mark(), "jsp.error.invalid.directive");
}
reader.skipSpaces();
if (!reader.matches("%>")) {
err.jspError(start, "jsp.error.unterminated", directive);
}
}
/*
* Parses a directive with the following syntax:
*
* XMLJSPDirectiveBody ::= S? ( ( 'page' PageDirectiveAttrList
* S? ( '/>' | ( '>' S? ETag ) )
* | ( 'include' IncludeDirectiveAttrList
* S? ( '/>' | ( '>' S? ETag ) )
* | <TRANSLATION_ERROR>
*
* XMLTagDefDirectiveBody ::= ( ( 'tag' TagDirectiveAttrList
* S? ( '/>' | ( '>' S? ETag ) )
* | ( 'include' IncludeDirectiveAttrList
* S? ( '/>' | ( '>' S? ETag ) )
* | ( 'attribute' AttributeDirectiveAttrList
* S? ( '/>' | ( '>' S? ETag ) )
* | ( 'variable' VariableDirectiveAttrList
* S? ( '/>' | ( '>' S? ETag ) )
* )
* | <TRANSLATION_ERROR>
*/
private void parseXMLDirective(Node parent) throws JasperException {
reader.skipSpaces();
String eTag = null;
if (reader.matches("page")) {
eTag = "jsp:directive.page";
if (isTagFile) {
err.jspError(reader.mark(), "jsp.error.directive.istagfile",
"<" + eTag);
}
parsePageDirective(parent);
} else if (reader.matches("include")) {
eTag = "jsp:directive.include";
parseIncludeDirective(parent);
} else if (reader.matches("tag")) {
eTag = "jsp:directive.tag";
if (!isTagFile) {
err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
"<" + eTag);
}
parseTagDirective(parent);
} else if (reader.matches("attribute")) {
eTag = "jsp:directive.attribute";
if (!isTagFile) {
err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
"<" + eTag);
}
parseAttributeDirective(parent);
} else if (reader.matches("variable")) {
eTag = "jsp:directive.variable";
if (!isTagFile) {
err.jspError(reader.mark(), "jsp.error.directive.isnottagfile",
"<" + eTag);
}
parseVariableDirective(parent);
} else {
err.jspError(reader.mark(), "jsp.error.invalid.directive");
}
reader.skipSpaces();
if( reader.matches( ">" ) ) {
reader.skipSpaces();
if( !reader.matchesETag( eTag ) ) {
err.jspError(start, "jsp.error.unterminated", "<" + eTag );
}
}
else if( !reader.matches( "/>" ) ) {
err.jspError(start, "jsp.error.unterminated", "<" + eTag );
}
}
/*
* Parses a tag directive with the following syntax:
* PageDirective ::= ( S Attribute)*
*/
private void parseTagDirective(Node parent) throws JasperException {
Attributes attrs = parseAttributes();
Node.TagDirective n = new Node.TagDirective(attrs, start, parent);
/*
* A page directive may contain multiple 'import' attributes, each of
* which consists of a comma-separated list of package names.
* Store each list with the node, where it is parsed.
*/
for (int i = 0; i < attrs.getLength(); i++) {
if ("import".equals(attrs.getQName(i))) {
n.addImport(attrs.getValue(i));
}
}
}
/*
* Parses a attribute directive with the following syntax:
* AttributeDirective ::= ( S Attribute)*
*/
private void parseAttributeDirective(Node parent) throws JasperException {
Attributes attrs = parseAttributes();
Node.AttributeDirective n =
new Node.AttributeDirective(attrs, start, parent);
}
/*
* Parses a variable directive with the following syntax:
* PageDirective ::= ( S Attribute)*
*/
private void parseVariableDirective(Node parent) throws JasperException {
Attributes attrs = parseAttributes();
Node.VariableDirective n =
new Node.VariableDirective(attrs, start, parent);
}
/*
* JSPCommentBody ::= (Char* - (Char* '--%>')) '--%>'
*/
private void parseComment(Node parent) throws JasperException {
start = reader.mark();
Mark stop = reader.skipUntil("--%>");
if (stop == null) {
err.jspError(start, "jsp.error.unterminated", "<%--");
}
new Node.Comment(reader.getText(start, stop), start, parent);
}
/*
* DeclarationBody ::= (Char* - (char* '%>')) '%>'
*/
private void parseDeclaration(Node parent) throws JasperException {
start = reader.mark();
Mark stop = reader.skipUntil("%>");
if (stop == null) {
err.jspError(start, "jsp.error.unterminated", "<%!");
}
new Node.Declaration(parseScriptText(reader.getText(start, stop)),
start, parent);
}
/*
* XMLDeclarationBody ::= ( S? '/>' )
* | ( S? '>' (Char* - (char* '<')) CDSect?)* ETag
* | <TRANSLATION_ERROR>
* CDSect ::= CDStart CData CDEnd
* CDStart ::= '<![CDATA['
* CData ::= (Char* - (Char* ']]>' Char*))
* CDEnd ::= ']]>'
*/
private void parseXMLDeclaration(Node parent) throws JasperException {
reader.skipSpaces();
if( !reader.matches( "/>" ) ) {
if( !reader.matches( ">" ) ) {
err.jspError(start, "jsp.error.unterminated",
"<jsp:declaration>");
}
Mark stop;
String text;
while (true) {
start = reader.mark();
stop = reader.skipUntil("<");
if (stop == null) {
err.jspError(start, "jsp.error.unterminated",
"<jsp:declaration>");
}
text = parseScriptText(reader.getText(start, stop));
new Node.Declaration(text, start, parent);
if (reader.matches("![CDATA[")) {
start = reader.mark();
stop = reader.skipUntil("]]>");
if (stop == null) {
err.jspError(start, "jsp.error.unterminated", "CDATA");
}
text = parseScriptText(reader.getText(start, stop));
new Node.Declaration(text, start, parent);
}
else {
break;
}
}
if (!reader.matchesETagWithoutLessThan( "jsp:declaration" ) ) {
err.jspError(start, "jsp.error.unterminated",
"<jsp:declaration>");
}
}
}
/*
* ExpressionBody ::= (Char* - (char* '%>')) '%>'
*/
private void parseExpression(Node parent) throws JasperException {
start = reader.mark();
Mark stop = reader.skipUntil("%>");
if (stop == null) {
err.jspError(start, "jsp.error.unterminated", "<%=");
}
new Node.Expression(parseScriptText(reader.getText(start, stop)),
start, parent);
}
/*
* XMLExpressionBody ::= ( S? '/>' )
* | ( S? '>' (Char* - (char* '<')) CDSect?)* ETag )
* | <TRANSLATION_ERROR>
*/
private void parseXMLExpression(Node parent) throws JasperException {
reader.skipSpaces();
if( !reader.matches( "/>" ) ) {
if( !reader.matches( ">" ) ) {
err.jspError(start, "jsp.error.unterminated",
"<jsp:expression>");
}
Mark stop;
String text;
while (true) {
start = reader.mark();
stop = reader.skipUntil("<");
if (stop == null) {
err.jspError(start, "jsp.error.unterminated",
"<jsp:expression>");
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?