Skip to content

Commit 6ae28a1

Browse files
yrodieregsmet
authored andcommitted
HV-1774 Do not interpret '$\A{1+1}' in message templates
1 parent 438a0fc commit 6ae28a1

File tree

2 files changed

+25
-2
lines changed
  • engine/src
    • main/java/org/hibernate/validator/internal/engine/messageinterpolation/parser
    • test/java/org/hibernate/validator/test/internal/engine/messageinterpolation

2 files changed

+25
-2
lines changed

Diff for: engine/src/main/java/org/hibernate/validator/internal/engine/messageinterpolation/parser/ELState.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ public void handleEndTerm(char character, TokenCollector tokenCollector) throws
5656
@Override
5757
public void handleEscapeCharacter(char character, TokenCollector tokenCollector)
5858
throws MessageDescriptorFormatException {
59-
tokenCollector.transitionState( new EscapedState( this ) );
59+
tokenCollector.appendToToken( EL_DESIGNATOR );
60+
tokenCollector.appendToToken( character );
61+
// Do not go back to this state after the escape: $\ is not the start of an EL expression
62+
ParserState stateAfterEscape = new MessageState();
63+
tokenCollector.transitionState( new EscapedState( stateAfterEscape ) );
6064
}
6165

6266
@Override

Diff for: engine/src/test/java/org/hibernate/validator/test/internal/engine/messageinterpolation/TokenCollectorTest.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@
88

99
import org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTermType;
1010
import org.hibernate.validator.internal.engine.messageinterpolation.parser.MessageDescriptorFormatException;
11+
import org.hibernate.validator.internal.engine.messageinterpolation.parser.Token;
1112
import org.hibernate.validator.internal.engine.messageinterpolation.parser.TokenCollector;
13+
14+
import org.assertj.core.api.Assertions;
15+
import org.assertj.core.api.ListAssert;
1216
import org.testng.annotations.Test;
1317

1418
/**
@@ -29,10 +33,25 @@ public void testParameterWithoutOpeningBraceThrowsException() throws Exception {
2933
}
3034

3135
@Test(expectedExceptions = MessageDescriptorFormatException.class, expectedExceptionsMessageRegExp = "HV000168.*")
32-
public void testELExpressionWithoutOpeningBraceThrowsException() throws Exception {
36+
public void testELExpressionDollarThenClosingBraceThrowsException() throws Exception {
3337
new TokenCollector( "$}", InterpolationTermType.EL );
3438
}
3539

40+
@Test
41+
public void testELExpressionDollarThenEscapeInterpretedAsLiterals() {
42+
ListAssert<Token> assertion = Assertions.assertThat(
43+
new TokenCollector( "$\\A{1+1}", InterpolationTermType.EL )
44+
.getTokenList()
45+
)
46+
.hasSize( 2 );
47+
assertion.element( 0 )
48+
.returns( "$\\A", Token::getTokenValue )
49+
.returns( false, Token::isParameter );
50+
assertion.element( 1 )
51+
.returns( "{1+1}", Token::getTokenValue )
52+
.returns( false, Token::isParameter );
53+
}
54+
3655
@Test(expectedExceptions = MessageDescriptorFormatException.class, expectedExceptionsMessageRegExp = "HV000168.*")
3756
public void testTermWithoutClosingBraceThrowsException() throws Exception {
3857
new TokenCollector( "{foo", InterpolationTermType.PARAMETER );

0 commit comments

Comments
 (0)