package org.springframework.webflow.expression.el; import java.security.Principal; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.el.ELResolver; import javax.el.PropertyNotWritableException; import org.springframework.binding.message.MessageContext; import org.springframework.util.ClassUtils; import org.springframework.webflow.context.ExternalContext; import org.springframework.webflow.core.collection.MutableAttributeMap; import org.springframework.webflow.core.collection.ParameterMap; import org.springframework.webflow.execution.Event; import org.springframework.webflow.execution.FlowExecutionContext; import org.springframework.webflow.execution.RequestContextHolder; import org.springframework.webflow.test.MockExternalContext; import org.springframework.webflow.test.MockFlowExecutionContext; import org.springframework.webflow.test.MockFlowExecutionKey; import org.springframework.webflow.test.MockRequestContext; public class ImplicitFlowVariableELResolverTests extends FlowDependentELResolverTestCase { private static final List<String> vars = new ArrayList<String>(); { vars.add("requestParameters"); vars.add("requestScope"); vars.add("flashScope"); vars.add("viewScope"); vars.add("flowScope"); vars.add("conversationScope"); vars.add("messageContext"); vars.add("externalContext"); vars.add("flowExecutionContext"); vars.add("flowExecutionUrl"); vars.add("currentUser"); vars.add("currentEvent"); }; public void testGetType_RequestParameters() { RequestContextHolder.setRequestContext(new MockRequestContext()); assertTrue(ClassUtils.isAssignable(ParameterMap.class, context.getELResolver().getType(context, null, "requestParameters"))); assertTrue(context.isPropertyResolved()); } public void testGetType_RequestScope() { RequestContextHolder.setRequestContext(new MockRequestContext()); assertTrue(ClassUtils.isAssignable(MutableAttributeMap.class, context.getELResolver().getType(context, null, "requestScope"))); assertTrue(context.isPropertyResolved()); } public void testGetType_FlashScope() { RequestContextHolder.setRequestContext(new MockRequestContext()); assertTrue(ClassUtils.isAssignable(MutableAttributeMap.class, context.getELResolver().getType(context, null, "flashScope"))); assertTrue(context.isPropertyResolved()); } public void testGetType_ViewScope() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); initView(requestContext); assertTrue(ClassUtils.isAssignable(MutableAttributeMap.class, context.getELResolver().getType(context, null, "viewScope"))); assertTrue(context.isPropertyResolved()); } public void testGetType_FlowScope() { RequestContextHolder.setRequestContext(new MockRequestContext()); assertTrue(ClassUtils.isAssignable(MutableAttributeMap.class, context.getELResolver().getType(context, null, "flowScope"))); assertTrue(context.isPropertyResolved()); } public void testGetType_ConversationScope() { RequestContextHolder.setRequestContext(new MockRequestContext()); assertTrue(ClassUtils.isAssignable(MutableAttributeMap.class, context.getELResolver().getType(context, null, "conversationScope"))); assertTrue(context.isPropertyResolved()); } public void testGetType_MessageContext() { RequestContextHolder.setRequestContext(new MockRequestContext()); assertTrue(ClassUtils.isAssignable(MessageContext.class, context.getELResolver().getType(context, null, "messageContext"))); assertTrue(context.isPropertyResolved()); } public void testGetType_ExternalContext() { RequestContextHolder.setRequestContext(new MockRequestContext()); assertTrue(ClassUtils.isAssignable(ExternalContext.class, context.getELResolver().getType(context, null, "externalContext"))); assertTrue(context.isPropertyResolved()); } public void testGetType_FlowExecutionContext() { RequestContextHolder.setRequestContext(new MockRequestContext()); assertTrue(ClassUtils.isAssignable(FlowExecutionContext.class, context.getELResolver().getType(context, null, "flowExecutionContext"))); assertTrue(context.isPropertyResolved()); } public void testGetType_FlowExecutionUrl() { MockRequestContext requestContext = new MockRequestContext(); ((MockFlowExecutionContext) requestContext.getFlowExecutionContext()).setKey(new MockFlowExecutionKey("e1s1")); RequestContextHolder.setRequestContext(requestContext); assertTrue(ClassUtils.isAssignable(String.class, context.getELResolver().getType(context, null, "flowExecutionUrl"))); assertTrue(context.isPropertyResolved()); } public void testGetType_CurrentUser() { MockRequestContext requestContext = new MockRequestContext(); ((MockExternalContext) requestContext.getExternalContext()).setCurrentUser("jjg"); RequestContextHolder.setRequestContext(requestContext); assertTrue(ClassUtils.isAssignable(Principal.class, context.getELResolver().getType(context, null, "currentUser"))); assertTrue(context.isPropertyResolved()); } public void testGetType_CurrentEvent() { MockRequestContext requestContext = new MockRequestContext(); requestContext.setCurrentEvent(new Event(this, "foo")); RequestContextHolder.setRequestContext(requestContext); assertTrue(ClassUtils.isAssignable(Event.class, context.getELResolver().getType(context, null, "currentEvent"))); assertTrue(context.isPropertyResolved()); } public void testGetValue_RequestParameters() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getRequestParameters(), context.getELResolver().getValue(context, null, "requestParameters")); assertTrue(context.isPropertyResolved()); } public void testGetValue_RequestScope() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getRequestScope(), context.getELResolver().getValue(context, null, "requestScope")); assertTrue(context.isPropertyResolved()); } public void testGetValue_FlashScope() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getFlashScope(), context.getELResolver().getValue(context, null, "flashScope")); assertTrue(context.isPropertyResolved()); } public void testGetValue_ViewScope() { MockRequestContext requestContext = new MockRequestContext(); initView(requestContext); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getViewScope(), context.getELResolver().getValue(context, null, "viewScope")); assertTrue(context.isPropertyResolved()); } public void testGetValue_FlowScope() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getFlowScope(), context.getELResolver().getValue(context, null, "flowScope")); assertTrue(context.isPropertyResolved()); } public void testGetValue_ConversationScope() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getConversationScope(), context.getELResolver().getValue(context, null, "conversationScope")); assertTrue(context.isPropertyResolved()); } public void testGetValue_MessageContext() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getMessageContext(), context.getELResolver() .getValue(context, null, "messageContext")); assertTrue(context.isPropertyResolved()); } public void testGetValue_ExternalContext() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getExternalContext(), context.getELResolver().getValue(context, null, "externalContext")); assertTrue(context.isPropertyResolved()); } public void testGetValue_FlowExecutionContext() { MockRequestContext requestContext = new MockRequestContext(); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getFlowExecutionContext(), context.getELResolver().getValue(context, null, "flowExecutionContext")); assertTrue(context.isPropertyResolved()); } public void testGetValue_FlowExecutionUrl() { MockRequestContext requestContext = new MockRequestContext(); ((MockFlowExecutionContext) requestContext.getFlowExecutionContext()).setKey(new MockFlowExecutionKey("e1s1")); RequestContextHolder.setRequestContext(requestContext); assertEquals(requestContext.getFlowExecutionUrl(), context.getELResolver().getValue(context, null, "flowExecutionUrl")); assertTrue(context.isPropertyResolved()); } public void testGetValue_CurrentUser() { MockRequestContext requestContext = new MockRequestContext(); ((MockExternalContext) requestContext.getExternalContext()).setCurrentUser("jjg"); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getExternalContext().getCurrentUser(), context.getELResolver().getValue(context, null, "currentUser")); assertTrue(context.isPropertyResolved()); } public void testGetValue_CurrentEvent() { MockRequestContext requestContext = new MockRequestContext(); requestContext.setCurrentEvent(new Event(this, "foo")); RequestContextHolder.setRequestContext(requestContext); assertSame(requestContext.getCurrentEvent(), context.getELResolver().getValue(context, null, "currentEvent")); assertTrue(context.isPropertyResolved()); } public void testIsReadOnly_AllVars() { RequestContextHolder.setRequestContext(new MockRequestContext()); Iterator<String> i = vars.iterator(); while (i.hasNext()) { String var = i.next(); assertTrue(context.getELResolver().isReadOnly(context, null, var)); } } public void testSetValue_AllVars() { RequestContextHolder.setRequestContext(new MockRequestContext()); Iterator<String> i = vars.iterator(); while (i.hasNext()) { String var = i.next(); try { context.getELResolver().setValue(context, null, var, new Object()); fail("setValue should not be allowed"); } catch (PropertyNotWritableException ex) { assertTrue(context.isPropertyResolved()); } } } protected String getBaseVariable() { return "flowScope"; } protected List<ELResolver> getCustomResolvers() { List<ELResolver> resolvers = new ArrayList<ELResolver>(); resolvers.add(new ImplicitFlowVariableELResolver()); return resolvers; } }