@ -43,6 +43,12 @@ public class OperatorMatches extends Operator {
@@ -43,6 +43,12 @@ public class OperatorMatches extends Operator {
private static final int PATTERN_ACCESS_THRESHOLD = 1000000 ;
/ * *
* Maximum number of characters permitted in a regular expression .
* @since 5 . 3 . 26
* /
private static final int MAX_REGEX_LENGTH = 256 ;
private final ConcurrentMap < String , Pattern > patternCache ;
@ -78,26 +84,28 @@ public class OperatorMatches extends Operator {
@@ -78,26 +84,28 @@ public class OperatorMatches extends Operator {
public BooleanTypedValue getValueInternal ( ExpressionState state ) throws EvaluationException {
SpelNodeImpl leftOp = getLeftOperand ( ) ;
SpelNodeImpl rightOp = getRightOperand ( ) ;
String left = leftOp . getValue ( state , String . class ) ;
Object right = rightOp . getValue ( state ) ;
if ( left = = null ) {
String input = leftOp . getValue ( state , String . class ) ;
if ( input = = null ) {
throw new SpelEvaluationException ( leftOp . getStartPosition ( ) ,
SpelMessage . INVALID_FIRST_OPERAND_FOR_MATCHES_OPERATOR , ( Object ) null ) ;
}
Object right = rightOp . getValue ( state ) ;
if ( ! ( right instanceof String ) ) {
throw new SpelEvaluationException ( rightOp . getStartPosition ( ) ,
SpelMessage . INVALID_SECOND_OPERAND_FOR_MATCHES_OPERATOR , right ) ;
}
String regex = ( String ) right ;
try {
String rightString = ( String ) right ;
Pattern pattern = this . patternCache . get ( rightString ) ;
Pattern pattern = this . patternCache . get ( regex ) ;
if ( pattern = = null ) {
pattern = Pattern . compile ( rightString ) ;
this . patternCache . putIfAbsent ( rightString , pattern ) ;
checkRegexLength ( regex ) ;
pattern = Pattern . compile ( regex ) ;
this . patternCache . putIfAbsent ( regex , pattern ) ;
}
Matcher matcher = pattern . matcher ( new MatcherInput ( lef t, new AccessCount ( ) ) ) ;
Matcher matcher = pattern . matcher ( new MatcherInput ( inpu t, new AccessCount ( ) ) ) ;
return BooleanTypedValue . forValue ( matcher . matches ( ) ) ;
}
catch ( PatternSyntaxException ex ) {
@ -110,6 +118,13 @@ public class OperatorMatches extends Operator {
@@ -110,6 +118,13 @@ public class OperatorMatches extends Operator {
}
}
private void checkRegexLength ( String regex ) {
if ( regex . length ( ) > MAX_REGEX_LENGTH ) {
throw new SpelEvaluationException ( getStartPosition ( ) ,
SpelMessage . MAX_REGEX_LENGTH_EXCEEDED , MAX_REGEX_LENGTH ) ;
}
}
private static class AccessCount {
@ -127,7 +142,7 @@ public class OperatorMatches extends Operator {
@@ -127,7 +142,7 @@ public class OperatorMatches extends Operator {
private final CharSequence value ;
private AccessCount access ;
private final AccessCount access ;
public MatcherInput ( CharSequence value , AccessCount access ) {
this . value = value ;