StringBuilder buf = new StringBuilder();
ELexpr = new ELNode.Nodes();
curToken = null;
prevToken = null; int openBraces = 0; while (hasNext()) {
curToken = nextToken(); if (curToken instanceofChar) { if (curToken.toChar() == '}') {
openBraces--; if (openBraces < 0) { break;
}
} elseif (curToken.toChar() == '{') {
openBraces++;
}
buf.append(curToken.toString());
} else { // Output whatever is in buffer if (buf.length() > 0) {
ELexpr.add(new ELNode.ELText(buf.toString()));
buf.setLength(0);
} if (!parseFunction()) {
ELexpr.add(new ELNode.ELText(curToken.toString()));
}
}
} if (curToken != null) {
buf.append(curToken.getWhiteSpace());
} if (buf.length() > 0) {
ELexpr.add(new ELNode.ELText(buf.toString()));
}
return ELexpr;
}
/** *ParseforafunctionFunctionInvocation::=(identifier':')?identifier *'('(Expression(,Expression)*)?')'Note:currentlywedon'tparse *arguments
*/ privateboolean parseFunction() { if (!(curToken instanceof Id) || isELReserved(curToken.toTrimmedString()) ||
prevToken instanceofChar && prevToken.toChar() == '.') { returnfalse;
}
String s1 = null; // Function prefix
String s2 = curToken.toTrimmedString(); // Function name int start = index - curToken.toString().length();
Token original = curToken; if (hasNext()) { int mark = getIndex() - whiteSpace.length();
curToken = nextToken(); if (curToken.toChar() == ':') { if (hasNext()) {
Token t2 = nextToken(); if (t2 instanceof Id) {
s1 = s2;
s2 = t2.toTrimmedString(); if (hasNext()) {
curToken = nextToken();
}
}
}
} if (curToken.toChar() == '(') {
ELexpr.add(new ELNode.Function(s1, s2, expression.substring(start, index - 1))); returntrue;
}
curToken = original;
setIndex(mark);
} returnfalse;
}
/** *TestifanidisareservedwordinEL
*/ privateboolean isELReserved(String id) { int i = 0; int j = reservedWords.length; while (i < j) { int k = (i + j) >>> 1; int result = reservedWords[k].compareTo(id); if (result == 0) { returntrue;
} if (result < 0) {
i = k + 1;
} else {
j = k;
}
} returnfalse;
}
/** *SkipuntilanELexpression('${'||'#{')isreached,allowingescape *sequences'\$'and'\#'. * *@returnThetextstringuptotheELexpression
*/ private String skipUntilEL() {
StringBuilder buf = new StringBuilder(); while (hasNextChar()) { char ch = nextChar(); if (ch == '\\') { // Is this the start of a "\$" or "\#" escape sequence? char p0 = peek(0); if (p0 == '$' || (p0 == '#' && !isDeferredSyntaxAllowedAsLiteral)) {
buf.append(nextChar());
} else {
buf.append(ch);
}
} elseif ((ch == '$' || (ch == '#' && !isDeferredSyntaxAllowedAsLiteral)) &&
peek(0) == '{') { this.type = ch;
nextChar(); break;
} else {
buf.append(ch);
}
} return buf.toString();
}
/** *Escape'$'and'#',invertingtheunescapingperformedin *{@link#skipUntilEL()}butonlyfor${and#{sequencessinceescaping *for$and#isoptional. * *@paraminputNon-ELinputtobeescaped *@paramisDeferredSyntaxAllowedAsLiteralFlagthatindicatesifdeferred *syntax(#{)isallowedasaliteral.\ * *@returnTheescapedversionoftheinput
*/ static String escapeLiteralExpression(String input, boolean isDeferredSyntaxAllowedAsLiteral) { int len = input.length(); int lastAppend = 0;
StringBuilder output = null; for (int i = 0; i < len; i++) { char ch = input.charAt(i); if (ch =='$' || (!isDeferredSyntaxAllowedAsLiteral && ch == '#')) { if (i + 1 < len && input.charAt(i + 1) == '{') { if (output == null) {
output = new StringBuilder(len + 20);
}
output.append(input.substring(lastAppend, i));
lastAppend = i + 1;
output.append('\\');
output.append(ch);
}
}
} if (output == null) { return input;
} else {
output.append(input.substring(lastAppend, len)); return output.toString();
}
}
/** *Escape'\\','\''and'\"',invertingtheunescapingperformedin *{@link#skipUntilEL()}. * *@paraminputNon-ELinputtobeescaped * *@returnTheescapedversionoftheinput
*/ privatestatic String escapeELText(String input) { int len = input.length(); char quote = 0; int lastAppend = 0; int start = 0; int end = len;
// Look to see if the value is quoted
String trimmed = input.trim(); int trimmedLen = trimmed.length(); if (trimmedLen > 1) { // Might be quoted
quote = trimmed.charAt(0); if (quote == '\'' || quote == '\"') { if (trimmed.charAt(trimmedLen - 1) != quote) { thrownew IllegalArgumentException(Localizer.getMessage( "org.apache.jasper.compiler.ELParser.invalidQuotesForStringLiteral",
input));
}
start = input.indexOf(quote) + 1;
end = start + trimmedLen - 2;
} else {
quote = 0;
}
}
StringBuilder output = null; for (int i = start; i < end; i++) { char ch = input.charAt(i); if (ch == '\\' || ch == quote) { if (output == null) {
output = new StringBuilder(len + 20);
}
output.append(input.substring(lastAppend, i));
lastAppend = i + 1;
output.append('\\');
output.append(ch);
}
} if (output == null) { return input;
} else {
output.append(input.substring(lastAppend, len)); return output.toString();
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.