Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
8.0.0-M1, 7.4.0, 6.24.0
-
None
-
None
Description
A property expression having a '[' character inside squar brackets like "bean.map[code[foo]" will fail because PropertyResolver replaces all '[' charaters by '.['
example:
@Test public void shouldAllowMapKeysWithSpecialCharacters() throws Exception { String code = "[!@#$%^&*()_+-=[{}|]"; String expression = "[" + code + "]"; Map<String, Integer> integerMap = new HashMap<String, Integer>(); PropertyResolver.setValue(expression, integerMap, AN_INTEGER, CONVERTER); assertThat(PropertyResolver.getValue(expression, integerMap), is(AN_INTEGER)); assertThat(integerMap.get(code), is(AN_INTEGER)); }
Plus a property expression having a ']' followed by a dot will fail because the dot will be taken as a token separator by PropertyResolver#getNextDotIndex
@Test public void shouldAllowMapKeysWithADotAfterAClosingSquarBraket() throws Exception { String code = "]."; String expression = "[" + code + "]"; Map<String, Integer> integerMap = new HashMap<String, Integer>(); PropertyResolver.setValue(expression, integerMap, AN_INTEGER, CONVERTER); assertThat(PropertyResolver.getValue(expression, integerMap), is(AN_INTEGER)); assertThat(integerMap.get(code), is(AN_INTEGER)); }
A possible solution is to use escape characters and there is a proposal to change the property expression syntax with such escape logic at: http://wicket-dev.markmail.org/thread/unwdqpxulw7tcd5l
If we take the lack of support for valid index characters (a map key can contain '[', ']' and '.' characters) as a missing feature by design, we should update our wiki topic [1] to make it clear.
1 - https://cwiki.apache.org/confluence/display/WICKET/Property+Expression+Language