public override bool GetValue(EvalContext ctx) { //common code not refactored to parent class for speed (less virt calls) var lv = LeftOperand.GetValue(ctx); if (ctx.Aborted) { return(false); } var rv = RightOperand.GetValue(ctx); if (ctx.Aborted) { return(false); } return(lv ^ rv); }
public override ITypedValue GetValueInternal(ExpressionState state) { var leftOp = LeftOperand; var rightOp = RightOperand; var left = leftOp.GetValue <string>(state); var right = RightOperand.GetValue(state); if (left == null) { throw new SpelEvaluationException(leftOp.StartPosition, SpelMessage.INVALID_FIRST_OPERAND_FOR_MATCHES_OPERATOR, (object)null); } if (!(right is string)) { throw new SpelEvaluationException(rightOp.StartPosition, SpelMessage.INVALID_SECOND_OPERAND_FOR_MATCHES_OPERATOR, right); } try { var rightString = (string)right; _patternCache.TryGetValue(rightString, out var pattern); if (pattern == null) { pattern = new Regex(rightString, RegexOptions.Compiled, TimeSpan.FromSeconds(1)); _patternCache.TryAdd(rightString, pattern); } return(BooleanTypedValue.ForValue(pattern.IsMatch(left))); } catch (ArgumentException ex) { throw new SpelEvaluationException(rightOp.StartPosition, ex, SpelMessage.INVALID_PATTERN, right); } catch (RegexMatchTimeoutException ex) { throw new SpelEvaluationException(rightOp.StartPosition, ex, SpelMessage.FLAWED_PATTERN, right); } }