@Nullable protected String createContent(InstanceEvent event, Instance instance) { Map<String, Object> root = new HashMap<>(); root.put("event", event); root.put("instance", instance); root.put("lastStatus", getLastStatus(event.getInstance())); StandardEvaluationContext context = new StandardEvaluationContext(root); context.addPropertyAccessor(new MapAccessor()); return message.getValue(context, String.class); }
@Nullable protected String getMessage(InstanceEvent event, Instance instance) { Map<String, Object> root = new HashMap<>(); root.put("event", event); root.put("instance", instance); root.put("lastStatus", getLastStatus(event.getInstance())); StandardEvaluationContext context = new StandardEvaluationContext(root); context.addPropertyAccessor(new MapAccessor()); return description.getValue(context, String.class); }
@Nullable protected String getText(InstanceEvent event, Instance instance) { Map<String, Object> root = new HashMap<>(); root.put("event", event); root.put("instance", instance); root.put("lastStatus", getLastStatus(event.getInstance())); StandardEvaluationContext context = new StandardEvaluationContext(root); context.addPropertyAccessor(new MapAccessor()); return message.getValue(context, String.class); }
@Nullable protected String getDescription(InstanceEvent event, Instance instance) { Map<String, Object> root = new HashMap<>(); root.put("event", event); root.put("instance", instance); root.put("lastStatus", getLastStatus(event.getInstance())); StandardEvaluationContext context = new StandardEvaluationContext(root); context.addPropertyAccessor(new MapAccessor()); return description.getValue(context, String.class); }
@Nullable protected String getMessage(InstanceEvent event, Instance instance) { Map<String, Object> root = new HashMap<>(); root.put("event", event); root.put("instance", instance); root.put("lastStatus", getLastStatus(event.getInstance())); StandardEvaluationContext context = new StandardEvaluationContext(root); context.addPropertyAccessor(new MapAccessor()); return description.getValue(context, String.class); }
@Nullable protected String getText(InstanceEvent event, Instance instance) { Map<String, Object> root = new HashMap<>(); root.put("event", event); root.put("instance", instance); root.put("lastStatus", getLastStatus(event.getInstance())); StandardEvaluationContext context = new StandardEvaluationContext(root); context.addPropertyAccessor(new MapAccessor()); return message.getValue(context, String.class); }
@Nullable protected String getText(InstanceEvent event, Instance instance) { Map<String, Object> root = new HashMap<>(); root.put("event", event); root.put("instance", instance); root.put("lastStatus", getLastStatus(event.getInstance())); StandardEvaluationContext context = new StandardEvaluationContext(root); context.addPropertyAccessor(new MapAccessor()); return message.getValue(context, String.class); }
private EvaluationContext createEvaluationContext(PageContext pageContext) { StandardEvaluationContext context = new StandardEvaluationContext(); context.addPropertyAccessor(new JspPropertyAccessor(pageContext)); context.addPropertyAccessor(new MapAccessor()); context.addPropertyAccessor(new EnvironmentAccessor()); context.setBeanResolver(new BeanFactoryResolver(getRequestContext().getWebApplicationContext())); ConversionService conversionService = getConversionService(pageContext); if (conversionService != null) { context.setTypeConverter(new StandardTypeConverter(conversionService)); } return context; }
@Test public void shouldAlwaysUsePropertyAccessorFromEvaluationContext() { SpelExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression("name"); StandardEvaluationContext context = new StandardEvaluationContext(); context.addPropertyAccessor(new ConfigurablePropertyAccessor(Collections.singletonMap("name", "Ollie"))); assertEquals("Ollie", expression.getValue(context)); context = new StandardEvaluationContext(); context.addPropertyAccessor(new ConfigurablePropertyAccessor(Collections.singletonMap("name", "Jens"))); assertEquals("Jens", expression.getValue(context)); }
/** * We add property accessors in the order: * First, Second, Third, Fourth. * They are not utilized in this order; preventing a priority or order of operations * in evaluation of SPEL expressions for a given context. */ @Test public void propertyAccessorOrder_SPR8211() { ExpressionParser expressionParser = new SpelExpressionParser(); StandardEvaluationContext evaluationContext = new StandardEvaluationContext(new ContextObject()); evaluationContext.addPropertyAccessor(new TestPropertyAccessor("firstContext")); evaluationContext.addPropertyAccessor(new TestPropertyAccessor("secondContext")); evaluationContext.addPropertyAccessor(new TestPropertyAccessor("thirdContext")); evaluationContext.addPropertyAccessor(new TestPropertyAccessor("fourthContext")); assertEquals("first", expressionParser.parseExpression("shouldBeFirst").getValue(evaluationContext)); assertEquals("second", expressionParser.parseExpression("shouldBeSecond").getValue(evaluationContext)); assertEquals("third", expressionParser.parseExpression("shouldBeThird").getValue(evaluationContext)); assertEquals("fourth", expressionParser.parseExpression("shouldBeFourth").getValue(evaluationContext)); }
@Test public void testCustomMapAccessor() throws Exception { ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext ctx = TestScenarioCreator.getTestEvaluationContext(); ctx.addPropertyAccessor(new MapAccessor()); Expression expr = parser.parseExpression("testMap.monday"); Object value = expr.getValue(ctx, String.class); assertEquals("montag", value); }
@Test public void SPR5804() { Map<String, String> m = new HashMap<>(); m.put("foo", "bar"); StandardEvaluationContext context = new StandardEvaluationContext(m); // root is a map instance context.addPropertyAccessor(new MapAccessor()); Expression expr = new SpelExpressionParser().parseRaw("['foo']"); assertEquals("bar", expr.getValue(context)); }
@Test public void SPR11609() { StandardEvaluationContext sec = new StandardEvaluationContext(); sec.addPropertyAccessor(new MapAccessor()); Expression exp = new SpelExpressionParser().parseExpression( "T(org.springframework.expression.spel.SpelReproTests$MapWithConstant).X"); assertEquals(1, exp.getValue(sec)); }
@Test public void indexIntoGenericPropertyContainingMapObject() { Map<String, Map<String, String>> property = new HashMap<>(); Map<String, String> map = new HashMap<>(); map.put("foo", "bar"); property.put("property", map); SpelExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext context = new StandardEvaluationContext(); context.addPropertyAccessor(new MapAccessor()); context.setRootObject(property); Expression expression = parser.parseExpression("property"); assertEquals("java.util.HashMap<?, ?>", expression.getValueTypeDescriptor(context).toString()); assertEquals(map, expression.getValue(context)); assertEquals(map, expression.getValue(context, Map.class)); expression = parser.parseExpression("property['foo']"); assertEquals("bar", expression.getValue(context)); }
@Test public void variantGetter() throws Exception { Payload2Holder holder = new Payload2Holder(); StandardEvaluationContext ctx = new StandardEvaluationContext(); ctx.addPropertyAccessor(new MyAccessor()); expression = parser.parseExpression("payload2.var1"); Object v = expression.getValue(ctx,holder); assertEquals("abc", v); // // time it interpreted // long stime = System.currentTimeMillis(); // for (int i = 0; i < 100000; i++) { // v = expression.getValue(ctx,holder); // } // System.out.println((System.currentTimeMillis() - stime)); assertCanCompile(expression); v = expression.getValue(ctx,holder); assertEquals("abc", v); // // time it compiled // stime = System.currentTimeMillis(); // for (int i = 0; i < 100000; i++) { // v = expression.getValue(ctx,holder); // } // System.out.println((System.currentTimeMillis() - stime)); }
@Test public void testAddingRemovingAccessors() { StandardEvaluationContext ctx = new StandardEvaluationContext(); // reflective property accessor is the only one by default List<PropertyAccessor> propertyAccessors = ctx.getPropertyAccessors(); assertEquals(1,propertyAccessors.size()); StringyPropertyAccessor spa = new StringyPropertyAccessor(); ctx.addPropertyAccessor(spa); assertEquals(2,ctx.getPropertyAccessors().size()); List<PropertyAccessor> copy = new ArrayList<>(); copy.addAll(ctx.getPropertyAccessors()); assertTrue(ctx.removePropertyAccessor(spa)); assertFalse(ctx.removePropertyAccessor(spa)); assertEquals(1,ctx.getPropertyAccessors().size()); ctx.setPropertyAccessors(copy); assertEquals(2,ctx.getPropertyAccessors().size()); }
@Test public void SPR5847() { StandardEvaluationContext context = new StandardEvaluationContext(new TestProperties()); String name = null; Expression expr = null; expr = new SpelExpressionParser().parseRaw("jdbcProperties['username']"); name = expr.getValue(context, String.class); assertEquals("Dave", name); expr = new SpelExpressionParser().parseRaw("jdbcProperties[username]"); name = expr.getValue(context, String.class); assertEquals("Dave", name); // MapAccessor required for this to work expr = new SpelExpressionParser().parseRaw("jdbcProperties.username"); context.addPropertyAccessor(new MapAccessor()); name = expr.getValue(context, String.class); 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().parseRaw("jdbcProperties[foo.bar]"); context.addPropertyAccessor(new MapAccessor()); name = expr.getValue(context, String.class); assertEquals("Dave2", name); // key is foo.bar expr = new SpelExpressionParser().parseRaw("jdbcProperties['foo.bar']"); context.addPropertyAccessor(new MapAccessor()); name = expr.getValue(context, String.class); assertEquals("Elephant", name); }
@Test public void testScenario_AddingYourOwnPropertyResolvers_2() throws Exception { // Create a parser SpelExpressionParser parser = new SpelExpressionParser(); // Use the standard evaluation context StandardEvaluationContext ctx = new StandardEvaluationContext(); ctx.addPropertyAccessor(new VegetableColourAccessor()); Expression expr = parser.parseRaw("pea"); Object value = expr.getValue(ctx); assertEquals(Color.green, value); try { expr.setValue(ctx, Color.blue); fail("Should not be allowed to set peas to be blue !"); } catch (SpelEvaluationException ee) { assertEquals(SpelMessage.PROPERTY_OR_FIELD_NOT_WRITABLE_ON_NULL, ee.getMessageCode()); } }
@Test public void mapAccessorCompilable() { Map<String, Object> testMap = getSimpleTestMap(); StandardEvaluationContext sec = new StandardEvaluationContext(); sec.addPropertyAccessor(new MapAccessor()); SpelExpressionParser sep = new SpelExpressionParser(); // basic Expression ex = sep.parseExpression("foo"); assertEquals("bar",ex.getValue(sec,testMap)); assertTrue(SpelCompiler.compile(ex)); assertEquals("bar",ex.getValue(sec,testMap)); // compound expression ex = sep.parseExpression("foo.toUpperCase()"); assertEquals("BAR",ex.getValue(sec,testMap)); assertTrue(SpelCompiler.compile(ex)); assertEquals("BAR",ex.getValue(sec,testMap)); // nested map Map<String,Map<String,Object>> nestedMap = getNestedTestMap(); ex = sep.parseExpression("aaa.foo.toUpperCase()"); assertEquals("BAR",ex.getValue(sec,nestedMap)); assertTrue(SpelCompiler.compile(ex)); assertEquals("BAR",ex.getValue(sec,nestedMap)); // avoiding inserting checkcast because first part of expression returns a Map ex = sep.parseExpression("getMap().foo"); MapGetter mapGetter = new MapGetter(); assertEquals("bar",ex.getValue(sec,mapGetter)); assertTrue(SpelCompiler.compile(ex)); assertEquals("bar",ex.getValue(sec,mapGetter)); }
/** * Scenario: add a property resolver that will get called in the resolver chain, this one only supports reading. */ @Test public void testScenario_AddingYourOwnPropertyResolvers_1() throws Exception { // Create a parser SpelExpressionParser parser = new SpelExpressionParser(); // Use the standard evaluation context StandardEvaluationContext ctx = new StandardEvaluationContext(); ctx.addPropertyAccessor(new FruitColourAccessor()); Expression expr = parser.parseRaw("orange"); Object value = expr.getValue(ctx); assertEquals(Color.orange, value); try { expr.setValue(ctx, Color.blue); fail("Should not be allowed to set oranges to be blue !"); } catch (SpelEvaluationException ee) { assertEquals(SpelMessage.PROPERTY_OR_FIELD_NOT_WRITABLE_ON_NULL, ee.getMessageCode()); } }