From 79b4a2cbedc5500d8b26ebb189a9c4f7e6c2a10a Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Tue, 7 Jul 2009 16:32:56 +0000 Subject: [PATCH] SPR-5847: require quotes for dotted map key names, eg. map['a.b.c'] git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@1483 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../expression/spel/ast/Indexer.java | 11 ++++++++-- .../expression/spel/SpringEL300Tests.java | 20 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java index 7640ae573db..7717a21b932 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java @@ -57,8 +57,15 @@ public class Indexer extends SpelNodeImpl { index = reference.getName(); indexValue = new TypedValue(index,CommonTypeDescriptors.STRING_TYPE_DESCRIPTOR); } else { - indexValue = children[0].getValueInternal(state); - index = indexValue.getValue(); + // In case the map key is unqualified, we want it evaluated against the root object so + // temporarily push that on whilst evaluating the key + try { + state.pushActiveContextObject(state.getRootContextObject()); + indexValue = children[0].getValueInternal(state); + index = indexValue.getValue(); + } finally { + state.popActiveContextObject(); + } } // Indexing into a Map diff --git a/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java b/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java index 21a4c67f8e3..1524571ea0d 100644 --- a/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java +++ b/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java @@ -152,17 +152,35 @@ public class SpringEL300Tests extends ExpressionTestCase { name = expr.getValue(eContext,String.class); Assert.assertEquals("Dave",name); + // MapAccessor required for this to work expr = new SpelExpressionParser().parse("jdbcProperties.username"); eContext.addPropertyAccessor(new MapAccessor()); name = expr.getValue(eContext,String.class); Assert.assertEquals("Dave",name); + + // --- dotted property names + + // lookup foo on the root, then bar on that, then use that as the key into jdbcProperties + expr = new SpelExpressionParser().parse("jdbcProperties[foo.bar]"); + eContext.addPropertyAccessor(new MapAccessor()); + name = expr.getValue(eContext,String.class); + Assert.assertEquals("Dave2",name); + + // key is foo.bar + expr = new SpelExpressionParser().parse("jdbcProperties['foo.bar']"); + eContext.addPropertyAccessor(new MapAccessor()); + name = expr.getValue(eContext,String.class); + Assert.assertEquals("Elephant",name); } static class TestProperties { public Properties jdbcProperties = new Properties(); + public Properties foo = new Properties(); TestProperties() { jdbcProperties.put("username","Dave"); - jdbcProperties.put("foo.bar","Dave"); + jdbcProperties.put("alias","Dave2"); + jdbcProperties.put("foo.bar","Elephant"); + foo.put("bar","alias"); } }