📄 expressionevaluatorimpl.java
字号:
}
else {
// This should never be reached
return null;
}
}
//-------------------------------------
/**
*
* Gets the parsed form of the given expression string. If the
* parsed form is cached (and caching is not bypassed), return the
* cached form, otherwise parse and cache the value. Returns either
* a String, Expression, or ExpressionString.
**/
public Object parseExpressionString (String pExpressionString)
throws ELException
{
// See if it's an empty String
if (pExpressionString.length () == 0) {
return "";
}
// See if it's in the cache
Object ret =
mBypassCache ?
null :
sCachedExpressionStrings.get (pExpressionString);
if (ret == null) {
// Parse the expression
Reader r = new StringReader (pExpressionString);
ELParser parser = new ELParser (r);
try {
ret = parser.ExpressionString ();
sCachedExpressionStrings.put (pExpressionString, ret);
}
catch (ParseException exc) {
throw new ELException
(formatParseException (pExpressionString,
exc));
}
catch (ELTokenMgrError exc) {
// Note - this should never be reached, since the parser is
// constructed to tokenize any input (illegal inputs get
// parsed to <BADLY_ESCAPED_STRING_LITERAL> or
// <ILLEGAL_CHARACTER>
throw new ELException (exc.getMessage ());
}
}
return ret;
}
//-------------------------------------
/**
*
* Converts the given value to the specified expected type.
**/
Object convertToExpectedType (Object pValue,
Class pExpectedType,
Logger pLogger)
throws ELException
{
return Coercions.coerce (pValue,
pExpectedType,
pLogger);
}
//-------------------------------------
/**
*
* Converts the given String, specified as a static expression
* string, to the given expected type. The conversion is cached.
**/
Object convertStaticValueToExpectedType (String pValue,
Class pExpectedType,
Logger pLogger)
throws ELException
{
// See if the value is already of the expected type
if (pExpectedType == String.class ||
pExpectedType == Object.class) {
return pValue;
}
// Find the cached value
Map valueByString = getOrCreateExpectedTypeMap (pExpectedType);
if (!mBypassCache &&
valueByString.containsKey (pValue)) {
return valueByString.get (pValue);
}
else {
// Convert from a String
Object ret = Coercions.coerce (pValue, pExpectedType, pLogger);
valueByString.put (pValue, ret);
return ret;
}
}
//-------------------------------------
/**
*
* Creates or returns the Map that maps string literals to parsed
* values for the specified expected type.
**/
static Map getOrCreateExpectedTypeMap (Class pExpectedType)
{
synchronized (sCachedExpectedTypes) {
Map ret = (Map) sCachedExpectedTypes.get (pExpectedType);
if (ret == null) {
ret = Collections.synchronizedMap (new HashMap ());
sCachedExpectedTypes.put (pExpectedType, ret);
}
return ret;
}
}
//-------------------------------------
// Formatting ParseException
//-------------------------------------
/**
*
* Formats a ParseException into an error message suitable for
* displaying on a web page
**/
static String formatParseException (String pExpressionString,
ParseException pExc)
{
// Generate the String of expected tokens
StringBuffer expectedBuf = new StringBuffer ();
int maxSize = 0;
boolean printedOne = false;
if (pExc.expectedTokenSequences == null)
return pExc.toString();
for (int i = 0; i < pExc.expectedTokenSequences.length; i++) {
if (maxSize < pExc.expectedTokenSequences [i].length) {
maxSize = pExc.expectedTokenSequences [i].length;
}
for (int j = 0; j < pExc.expectedTokenSequences [i].length; j++) {
if (printedOne) {
expectedBuf.append (", ");
}
expectedBuf.append
(pExc.tokenImage [pExc.expectedTokenSequences [i] [j]]);
printedOne = true;
}
}
String expected = expectedBuf.toString ();
// Generate the String of encountered tokens
StringBuffer encounteredBuf = new StringBuffer ();
ELToken tok = pExc.currentToken.next;
for (int i = 0; i < maxSize; i++) {
if (i != 0) encounteredBuf.append (" ");
if (tok.kind == 0) {
encounteredBuf.append (pExc.tokenImage [0]);
break;
}
encounteredBuf.append (addEscapes (tok.image));
tok = tok.next;
}
String encountered = encounteredBuf.toString ();
// Format the error message
return MessageFormat.format
(Constants.PARSE_EXCEPTION,
new Object [] {
expected,
encountered,
});
}
//-------------------------------------
/**
*
* Used to convert raw characters to their escaped version when
* these raw version cannot be used as part of an ASCII string
* literal.
**/
static String addEscapes (String str)
{
StringBuffer retval = new StringBuffer ();
char ch;
for (int i = 0; i < str.length (); i++) {
switch (str.charAt (i)) {
case 0 :
continue;
case '\b':
retval.append ("\\b");
continue;
case '\t':
retval.append ("\\t");
continue;
case '\n':
retval.append ("\\n");
continue;
case '\f':
retval.append ("\\f");
continue;
case '\r':
retval.append ("\\r");
continue;
default:
if ((ch = str.charAt (i)) < 0x20 || ch > 0x7e) {
String s = "0000" + Integer.toString (ch, 16);
retval.append ("\\u" + s.substring (s.length () - 4, s.length ()));
}
else {
retval.append (ch);
}
continue;
}
}
return retval.toString ();
}
//-------------------------------------
// Testing methods
//-------------------------------------
/**
*
* Parses the given expression string, then converts it back to a
* String in its canonical form. This is used to test parsing.
**/
public String parseAndRender (String pExpressionString)
throws ELException
{
Object val = parseExpressionString (pExpressionString);
if (val instanceof String) {
return (String) val;
}
else if (val instanceof Expression) {
return "${" + ((Expression) val).getExpressionString () + "}";
}
else if (val instanceof ExpressionString) {
return ((ExpressionString) val).getExpressionString ();
}
else {
return "";
}
}
/**
* An object that encapsulates an expression to be evaluated by
* the JSTL evaluator.
*/
private class JSTLExpression
extends org.jbpm.jpdl.el.Expression
{
private ExpressionEvaluatorImpl evaluator;
private String expression;
private Class expectedType;
private FunctionMapper fMapper;
public JSTLExpression(ExpressionEvaluatorImpl evaluator, String expression,
Class expectedType, FunctionMapper fMapper)
{
this.evaluator = evaluator;
this.expression = expression;
this.expectedType = expectedType;
this.fMapper = fMapper;
}
public Object evaluate( VariableResolver vResolver )
throws ELException
{
return evaluator.evaluate(this.expression,
this.expectedType,
vResolver,
this.fMapper);
}
}
//-------------------------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -