This is an automated email from the ASF dual-hosted git repository. benweidig pushed a commit to branch property-expression-parser in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
commit ea7095720414ea9e3bf7fd1a8d040e0cc49ed049 Author: Ben Weidig <[email protected]> AuthorDate: Sun Oct 25 11:58:45 2026 +0100 TAP5-2806: Parse property expressions independent of the default charset Expressions went through getBytes() and back with the platform default charset. On a JVM without a UTF-8 default, every non-ASCII character turned into '?' before the lexer saw it. The lexer now reads the String directly. The expected node types in two code generator errors now include MAP, which both switches already handle. --- .../services/PropertyConduitSourceImpl.java | 23 ++++------------------ .../tapestry5/beanmodel/DefaultCharsetTest.java | 3 --- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java b/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java index ad26631df..ae3971359 100644 --- a/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java +++ b/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java @@ -31,9 +31,6 @@ import static org.apache.tapestry5.beanmodel.internal.antlr.PropertyExpressionPa import static org.apache.tapestry5.beanmodel.internal.antlr.PropertyExpressionParser.TRUE; import org.apache.tapestry5.ioc.annotations.ComponentLayer; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Member; @@ -48,7 +45,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import org.antlr.runtime.ANTLRInputStream; +import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.tree.Tree; import org.apache.tapestry5.beanmodel.PropertyConduit; @@ -508,7 +505,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource return; default: - throw unexpectedNodeType(node, IDENTIFIER, INVOKE, RANGEOP, LIST, NOT); + throw unexpectedNodeType(node, IDENTIFIER, INVOKE, RANGEOP, LIST, MAP, NOT); } } @@ -885,7 +882,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource default: throw unexpectedNodeType(node, TRUE, FALSE, INTEGER, DECIMAL, STRING, DEREF, SAFEDEREF, - IDENTIFIER, INVOKE, LIST, NOT, THIS, NULL); + IDENTIFIER, INVOKE, LIST, MAP, NOT, THIS, NULL); } } } @@ -1572,19 +1569,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource private Tree parse(String expression) { - InputStream is = new ByteArrayInputStream(expression.getBytes()); - - ANTLRInputStream ais; - - try - { - ais = new ANTLRInputStream(is); - } catch (IOException ex) - { - throw new RuntimeException(ex); - } - - PropertyExpressionLexer lexer = new PropertyExpressionLexer(ais); + PropertyExpressionLexer lexer = new PropertyExpressionLexer(new ANTLRStringStream(expression)); CommonTokenStream tokens = new CommonTokenStream(lexer); diff --git a/beanmodel/src/test/java/org/apache/tapestry5/beanmodel/DefaultCharsetTest.java b/beanmodel/src/test/java/org/apache/tapestry5/beanmodel/DefaultCharsetTest.java index f5a3d6a4e..b7a4af38d 100644 --- a/beanmodel/src/test/java/org/apache/tapestry5/beanmodel/DefaultCharsetTest.java +++ b/beanmodel/src/test/java/org/apache/tapestry5/beanmodel/DefaultCharsetTest.java @@ -19,7 +19,6 @@ import java.nio.charset.StandardCharsets; import org.apache.tapestry5.beanmodel.services.PropertyConduitSource; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -44,14 +43,12 @@ public class DefaultCharsetTest assertEquals(StandardCharsets.US_ASCII, Charset.defaultCharset()); } - @Disabled("The parser round-trips the expression through the default charset") @Test void non_ascii_identifier_is_parsed() { assertEquals(Chinese.class, source.create(Root.class, "中文").get(new Root()).getClass()); } - @Disabled("The parser round-trips the expression through the default charset") @Test void non_ascii_identifier_heads_a_chain() {
