package org.springframework.webflow.expression; import java.security.Principal; import java.util.Locale; import junit.framework.TestCase; import org.springframework.binding.expression.Expression; import org.springframework.binding.expression.support.FluentParserContext; import org.springframework.context.support.StaticApplicationContext; import org.springframework.webflow.TestBean; import org.springframework.webflow.action.FormAction; import org.springframework.webflow.core.collection.AttributeMap; import org.springframework.webflow.core.collection.LocalAttributeMap; import org.springframework.webflow.core.collection.MutableAttributeMap; import org.springframework.webflow.engine.StubViewFactory; import org.springframework.webflow.engine.ViewState; import org.springframework.webflow.execution.AnnotatedAction; import org.springframework.webflow.execution.Event; import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.execution.TestAction; import org.springframework.webflow.test.MockRequestContext; import org.springframework.webflow.test.MockRequestControlContext; public class WebFlowOgnlExpressionParserTests extends TestCase { private WebFlowOgnlExpressionParser parser = new WebFlowOgnlExpressionParser(); public void testResolveMap() { LocalAttributeMap<Object> map = new LocalAttributeMap<Object>(); map.put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(AttributeMap.class)); Expression exp2 = parser.parseExpression("bogus", new FluentParserContext().evaluate(AttributeMap.class)); assertEquals("bar", exp.getValue(map)); assertEquals(null, exp2.getValue(map)); } public void testSetMap() { LocalAttributeMap<Object> map = new LocalAttributeMap<Object>(); map.put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(MutableAttributeMap.class)); Expression exp2 = parser .parseExpression("bogus", new FluentParserContext().evaluate(MutableAttributeMap.class)); exp.setValue(map, "baz"); exp2.setValue(map, "new"); assertEquals("baz", exp.getValue(map)); assertEquals("new", exp2.getValue(map)); } public void testResolveFlowRequestContext() { MockRequestContext context = new MockRequestContext(); Expression exp = parser.parseExpression("flowRequestContext", new FluentParserContext().evaluate(RequestContext.class)); assertSame(context, exp.getValue(context)); } public void testResolveCurrentUser() { MockRequestContext context = new MockRequestContext(); context.getMockExternalContext().setCurrentUser("Keith"); Expression exp = parser .parseExpression("currentUser", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("Keith", ((Principal) exp.getValue(context)).getName()); } public void testResolveRequestScope() { MockRequestContext context = new MockRequestContext(); context.getRequestScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("bar", exp.getValue(context)); } public void testSetRequestScope() { MockRequestContext context = new MockRequestContext(); context.getRequestScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); exp.setValue(context, "baz"); assertEquals("baz", exp.getValue(context)); } public void testResolveFlashScope() { MockRequestContext context = new MockRequestContext(); context.getFlashScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("bar", exp.getValue(context)); } public void testSetFlashScope() { MockRequestContext context = new MockRequestContext(); context.getFlashScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); exp.setValue(context, "baz"); assertEquals("baz", exp.getValue(context)); } public void testResolveViewScope() { MockRequestControlContext context = new MockRequestControlContext(); ViewState state = new ViewState(context.getRootFlow(), "view", new StubViewFactory()); context.setCurrentState(state); context.getViewScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("bar", exp.getValue(context)); } public void testSetViewScope() { MockRequestControlContext context = new MockRequestControlContext(); ViewState state = new ViewState(context.getRootFlow(), "view", new StubViewFactory()); context.setCurrentState(state); context.getViewScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); exp.setValue(context, "baz"); assertEquals("baz", exp.getValue(context)); } public void testResolveFlowScope() { MockRequestContext context = new MockRequestContext(); context.getFlowScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("bar", exp.getValue(context)); } public void testSetFlowScope() { MockRequestContext context = new MockRequestContext(); context.getFlowScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); exp.setValue(context, "baz"); assertEquals("baz", exp.getValue(context)); } public void testResolveConversationScope() { MockRequestContext context = new MockRequestContext(); context.getConversationScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("bar", exp.getValue(context)); } public void testSetConversationScope() { MockRequestContext context = new MockRequestContext(); context.getConversationScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); exp.setValue(context, "baz"); assertEquals("baz", exp.getValue(context)); } public void testResolveSpringBean() { MockRequestContext context = new MockRequestContext(); StaticApplicationContext ac = new StaticApplicationContext(); ac.getBeanFactory().registerSingleton("testBean", new TestBean()); ac.getBeanFactory().registerSingleton("action", new TestAction()); ac.getBeanFactory().registerSingleton("multiAction", new FormAction(TestBean.class)); context.getRootFlow().setApplicationContext(ac); context.getConversationScope().put("foo", "bar"); Expression exp = parser.parseExpression("foo", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("bar", exp.getValue(context)); } public void testResolveAction() { MockRequestContext context = new MockRequestContext(); StaticApplicationContext ac = new StaticApplicationContext(); ac.getBeanFactory().registerSingleton("testBean", new TestBean()); ac.getBeanFactory().registerSingleton("action", new TestAction()); context.getRootFlow().setApplicationContext(ac); Expression exp = parser.parseExpression("action", new FluentParserContext().evaluate(RequestContext.class)); assertSame(ac.getBean("action"), exp.getValue(context)); } public void testResolveMultiAction() { MockRequestContext context = new MockRequestContext(); StaticApplicationContext ac = new StaticApplicationContext(); ac.getBeanFactory().registerSingleton("multiAction", new FormAction()); context.getRootFlow().setApplicationContext(ac); Expression exp = parser.parseExpression("multiAction.setupForm", new FluentParserContext().evaluate(RequestContext.class)); AnnotatedAction action = (AnnotatedAction) exp.getValue(context); assertSame(ac.getBean("multiAction"), action.getTargetAction()); assertEquals("setupForm", action.getMethod()); } public void testResolveEventAttributes() { MockRequestContext context = new MockRequestContext(); LocalAttributeMap<Object> attributes = new LocalAttributeMap<Object>(); attributes.put("foo", "bar"); context.setCurrentEvent(new Event(this, "event", attributes)); Expression exp = parser.parseExpression("currentEvent.attributes.foo", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("bar", exp.getValue(context)); } public void testResolveMessage() { MockRequestContext context = new MockRequestContext(); StaticApplicationContext ac = new StaticApplicationContext(); ac.getStaticMessageSource().addMessage("foo", Locale.FRANCE, "bar"); ac.refresh(); context.getRootFlow().setApplicationContext(ac); context.getMockExternalContext().setLocale(Locale.FRANCE); Expression exp = parser.parseExpression("resourceBundle.foo", new FluentParserContext().evaluate(RequestContext.class)); assertEquals("bar", exp.getValue(context)); } }