made ognl work like el - unit tests

This commit is contained in:
Keith Donald
2008-03-10 18:29:58 +00:00
parent 7f75bd48c8
commit 866d34c2d0
8 changed files with 420 additions and 1 deletions

View File

@@ -17,10 +17,14 @@ package org.springframework.webflow.expression;
import java.util.Map;
import javax.el.PropertyNotWritableException;
import ognl.ObjectPropertyAccessor;
import ognl.OgnlException;
import ognl.PropertyAccessor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.StaticListableBeanFactory;
import org.springframework.binding.collection.MapAdaptable;
@@ -39,6 +43,8 @@ import org.springframework.webflow.execution.RequestContext;
*/
public class WebFlowOgnlExpressionParser extends OgnlExpressionParser {
private static final Log logger = LogFactory.getLog(WebFlowOgnlExpressionParser.class);
/**
* Creates a webflow-specific ognl expression parser.
*/
@@ -83,9 +89,15 @@ public class WebFlowOgnlExpressionParser extends OgnlExpressionParser {
String property = name.toString();
RequestContext requestContext = (RequestContext) target;
if (property.equals("flowRequestContext")) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved the current RequestContext under variable '" + property + "'");
}
return requestContext;
}
if (securityPresent && property.equals("currentUser")) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved implicit flow variable '" + property + "'");
}
if (SecurityContextHolder.getContext() != null) {
return SecurityContextHolder.getContext().getAuthentication();
} else {
@@ -93,23 +105,68 @@ public class WebFlowOgnlExpressionParser extends OgnlExpressionParser {
}
}
if (requestContext.getRequestScope().contains(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved request scoped variable '" + property + "'");
}
return requestContext.getRequestScope().get(property);
} else if (requestContext.getFlashScope().contains(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved flash scoped variable '" + property + "'");
}
return requestContext.getFlashScope().get(property);
} else if (requestContext.getFlowScope().contains(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved flow scoped variable '" + property + "'");
}
return requestContext.getFlowScope().get(property);
} else if (requestContext.getConversationScope().contains(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved conversation scoped variable '" + property + "'");
}
return requestContext.getConversationScope().get(property);
}
BeanFactory bf = getBeanFactory(requestContext);
if (bf.containsBean(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved variable '" + property + "' in Spring BeanFactory");
}
return bf.getBean(property);
}
return delegate.getProperty(context, target, name);
}
public void setProperty(Map context, Object target, Object name, Object value) throws OgnlException {
delegate.setProperty(context, target, name, value);
String property = name.toString();
RequestContext requestContext = (RequestContext) target;
if (property.equals("flowRequestContext")) {
throw new PropertyNotWritableException("The 'flowRequestContext' variable is not writeable");
}
if (securityPresent && property.equals("currentUser")) {
throw new PropertyNotWritableException("The 'currentUser' variable is not writeable");
}
if (requestContext.getRequestScope().contains(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved request scoped variable '" + property + "'");
}
requestContext.getRequestScope().put(property, value);
} else if (requestContext.getFlashScope().contains(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved flash scoped variable '" + property + "'");
}
requestContext.getFlashScope().put(property, value);
} else if (requestContext.getFlowScope().contains(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved flow scoped variable '" + property + "'");
}
requestContext.getFlowScope().put(property, value);
} else if (requestContext.getConversationScope().contains(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved conversation scoped variable '" + property + "'");
}
requestContext.getConversationScope().put(property, value);
} else {
delegate.setProperty(context, target, name, value);
}
}
private BeanFactory getBeanFactory(RequestContext requestContext) {

View File

@@ -6,6 +6,8 @@ import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.PropertyNotWritableException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.webflow.engine.AnnotatedAction;
import org.springframework.webflow.execution.Action;
@@ -18,6 +20,8 @@ import org.springframework.webflow.execution.Action;
*/
public class ActionMethodELResolver extends ELResolver {
private static final Log logger = LogFactory.getLog(ActionMethodELResolver.class);
public Class getCommonPropertyType(ELContext elContext, Object base) {
return Action.class;
}

View File

@@ -9,11 +9,15 @@ import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.PropertyNotWritableException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.execution.RequestContextHolder;
public class ImplicitFlowVariableELResolver extends ELResolver {
private static final Log logger = LogFactory.getLog(ImplicitFlowVariableELResolver.class);
private RequestContext requestContext;
public ImplicitFlowVariableELResolver() {
@@ -50,6 +54,9 @@ public class ImplicitFlowVariableELResolver extends ELResolver {
return null;
}
if (ImplicitVariables.matches(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved implicit flow variable '" + property + "'");
}
context.setPropertyResolved(true);
return ImplicitVariables.value(context, requestContext, property);
} else {

View File

@@ -6,6 +6,8 @@ import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.PropertyNotWritableException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.execution.RequestContextHolder;
@@ -21,6 +23,8 @@ public class RequestContextELResolver extends ELResolver {
*/
public static final String REQUEST_CONTEXT_VARIABLE_NAME = "flowRequestContext";
private static final Log logger = LogFactory.getLog(RequestContextELResolver.class);
private RequestContext context;
public RequestContextELResolver() {
@@ -49,6 +53,9 @@ public class RequestContextELResolver extends ELResolver {
public Object getValue(ELContext elContext, Object base, Object property) {
if (base == null && REQUEST_CONTEXT_VARIABLE_NAME.equals(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved the current RequestContext under variable '" + property + "'");
}
elContext.setPropertyResolved(true);
return getRequestContext();
} else {

View File

@@ -5,6 +5,8 @@ import java.util.Iterator;
import javax.el.ELContext;
import javax.el.ELResolver;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.execution.RequestContextHolder;
@@ -19,6 +21,8 @@ import org.springframework.webflow.execution.RequestContextHolder;
*/
public class ScopeSearchingELResolver extends ELResolver {
private static final Log logger = LogFactory.getLog(ScopeSearchingELResolver.class);
private RequestContext requestContext;
public ScopeSearchingELResolver() {
@@ -66,15 +70,27 @@ public class ScopeSearchingELResolver extends ELResolver {
}
String attributeName = property.toString();
if (requestContext.getRequestScope().contains(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved request scoped variable '" + property + "'");
}
elContext.setPropertyResolved(true);
return requestContext.getRequestScope().get(attributeName);
} else if (requestContext.getFlashScope().contains(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved flash scoped variable '" + property + "'");
}
elContext.setPropertyResolved(true);
return requestContext.getFlashScope().get(attributeName);
} else if (requestContext.getFlowScope().contains(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved flow scoped variable '" + property + "'");
}
elContext.setPropertyResolved(true);
return requestContext.getFlowScope().get(attributeName);
} else if (requestContext.getConversationScope().contains(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved conversation scoped variable '" + property + "'");
}
elContext.setPropertyResolved(true);
return requestContext.getConversationScope().get(attributeName);
} else {
@@ -112,15 +128,27 @@ public class ScopeSearchingELResolver extends ELResolver {
}
String attributeName = property.toString();
if (requestContext.getRequestScope().contains(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved request scoped variable '" + property + "'");
}
elContext.setPropertyResolved(true);
requestContext.getRequestScope().put(attributeName, value);
} else if (requestContext.getFlashScope().contains(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved flash scoped variable '" + property + "'");
}
elContext.setPropertyResolved(true);
requestContext.getFlashScope().put(attributeName, value);
} else if (requestContext.getFlowScope().contains(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved flow scoped variable '" + property + "'");
}
elContext.setPropertyResolved(true);
requestContext.getFlowScope().put(attributeName, value);
} else if (requestContext.getConversationScope().contains(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved conversation scoped variable '" + property + "'");
}
elContext.setPropertyResolved(true);
requestContext.getConversationScope().put(attributeName, value);
}

View File

@@ -6,6 +6,8 @@ import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.PropertyNotWritableException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.Authentication;
import org.springframework.security.context.SecurityContextHolder;
@@ -17,6 +19,8 @@ import org.springframework.security.context.SecurityContextHolder;
*/
public class SpringSecurityELResolver extends ELResolver {
private static final Log logger = LogFactory.getLog(SpringSecurityELResolver.class);
/**
* Name of the security principal variable.
*/
@@ -41,6 +45,9 @@ public class SpringSecurityELResolver extends ELResolver {
public Object getValue(ELContext elContext, Object base, Object property) {
if (base == null && SECURITY_PRINCIPAL_VARIABLE_NAME.equals(property)) {
if (logger.isDebugEnabled()) {
logger.debug("Successfully resolved implicit flow variable '" + property + "'");
}
elContext.setPropertyResolved(true);
if (SecurityContextHolder.getContext() != null) {
return SecurityContextHolder.getContext().getAuthentication();

View File

@@ -0,0 +1,155 @@
package org.springframework.webflow.expression;
import junit.framework.TestCase;
import org.springframework.beans.factory.support.StaticListableBeanFactory;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.support.ParserContextImpl;
import org.springframework.security.Authentication;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.context.SecurityContextImpl;
import org.springframework.security.providers.TestingAuthenticationToken;
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.AnnotatedAction;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.execution.TestAction;
import org.springframework.webflow.test.MockRequestContext;
public class WebFlowOgnlExpressionParserTests extends TestCase {
private WebFlowOgnlExpressionParser parser = new WebFlowOgnlExpressionParser();
public void testResolveMap() {
LocalAttributeMap map = new LocalAttributeMap();
map.put("foo", "bar");
Expression exp = parser.parseExpression("foo", new ParserContextImpl().eval(AttributeMap.class));
Expression exp2 = parser.parseExpression("bogus", new ParserContextImpl().eval(AttributeMap.class));
assertEquals("bar", exp.getValue(map));
assertEquals(null, exp2.getValue(map));
}
public void testSetMap() {
LocalAttributeMap map = new LocalAttributeMap();
map.put("foo", "bar");
Expression exp = parser.parseExpression("foo", new ParserContextImpl().eval(MutableAttributeMap.class));
Expression exp2 = parser.parseExpression("bogus", new ParserContextImpl().eval(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 ParserContextImpl()
.eval(RequestContext.class));
assertSame(context, exp.getValue(context));
}
public void testResolveCurrentUser() {
SecurityContextImpl security = new SecurityContextImpl();
Authentication auth = new TestingAuthenticationToken("user", "password", null);
security.setAuthentication(auth);
SecurityContextHolder.setContext(security);
MockRequestContext context = new MockRequestContext();
Expression exp = parser.parseExpression("currentUser", new ParserContextImpl().eval(RequestContext.class));
assertSame(auth, exp.getValue(context));
}
public void testResolveRequestScope() {
MockRequestContext context = new MockRequestContext();
context.getRequestScope().put("foo", "bar");
Expression exp = parser.parseExpression("foo", new ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(RequestContext.class));
exp.setValue(context, "baz");
assertEquals("baz", exp.getValue(context));
}
public void testResolveSpringBean() {
MockRequestContext context = new MockRequestContext();
StaticListableBeanFactory beanFactory = new StaticListableBeanFactory();
beanFactory.addBean("testBean", new TestBean());
beanFactory.addBean("action", new TestAction());
beanFactory.addBean("multiAction", new FormAction(TestBean.class));
context.getRootFlow().setBeanFactory(beanFactory);
context.getConversationScope().put("foo", "bar");
Expression exp = parser.parseExpression("foo", new ParserContextImpl().eval(RequestContext.class));
assertEquals("bar", exp.getValue(context));
}
public void testResolveAction() {
MockRequestContext context = new MockRequestContext();
StaticListableBeanFactory beanFactory = new StaticListableBeanFactory();
beanFactory.addBean("action", new TestAction());
context.getRootFlow().setBeanFactory(beanFactory);
Expression exp = parser.parseExpression("action", new ParserContextImpl().eval(RequestContext.class));
assertSame(beanFactory.getBean("action"), exp.getValue(context));
}
public void testResolveMultiAction() {
MockRequestContext context = new MockRequestContext();
StaticListableBeanFactory beanFactory = new StaticListableBeanFactory();
beanFactory.addBean("multiAction", new FormAction());
context.getRootFlow().setBeanFactory(beanFactory);
Expression exp = parser.parseExpression("multiAction.setupForm", new ParserContextImpl()
.eval(RequestContext.class));
AnnotatedAction action = (AnnotatedAction) exp.getValue(context);
assertSame(beanFactory.getBean("multiAction"), action.getTargetAction());
assertEquals("setupForm", action.getMethod());
}
}

View File

@@ -0,0 +1,154 @@
package org.springframework.webflow.expression.el;
import junit.framework.TestCase;
import org.springframework.beans.factory.support.StaticListableBeanFactory;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.el.DefaultExpressionFactoryUtils;
import org.springframework.binding.expression.support.ParserContextImpl;
import org.springframework.security.Authentication;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.context.SecurityContextImpl;
import org.springframework.security.providers.TestingAuthenticationToken;
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.AnnotatedAction;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.execution.TestAction;
import org.springframework.webflow.test.MockRequestContext;
public class WebFlowELExpressionParserTests extends TestCase {
private WebFlowELExpressionParser parser = new WebFlowELExpressionParser(DefaultExpressionFactoryUtils
.createExpressionFactory());
public void testResolveMap() {
LocalAttributeMap map = new LocalAttributeMap();
map.put("foo", "bar");
Expression exp = parser.parseExpression("foo", new ParserContextImpl().eval(AttributeMap.class));
Expression exp2 = parser.parseExpression("bogus", new ParserContextImpl().eval(AttributeMap.class));
assertEquals("bar", exp.getValue(map));
assertEquals(null, exp2.getValue(map));
}
public void testSetMap() {
LocalAttributeMap map = new LocalAttributeMap();
map.put("foo", "bar");
Expression exp = parser.parseExpression("foo", new ParserContextImpl().eval(MutableAttributeMap.class));
Expression exp2 = parser.parseExpression("bogus", new ParserContextImpl().eval(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 ParserContextImpl()
.eval(RequestContext.class));
assertSame(context, exp.getValue(context));
}
public void testResolveCurrentUser() {
SecurityContextImpl security = new SecurityContextImpl();
Authentication auth = new TestingAuthenticationToken("user", "password", null);
security.setAuthentication(auth);
SecurityContextHolder.setContext(security);
MockRequestContext context = new MockRequestContext();
Expression exp = parser.parseExpression("currentUser", new ParserContextImpl().eval(RequestContext.class));
assertSame(auth, exp.getValue(context));
}
public void testResolveRequestScope() {
MockRequestContext context = new MockRequestContext();
context.getRequestScope().put("foo", "bar");
Expression exp = parser.parseExpression("foo", new ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(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 ParserContextImpl().eval(RequestContext.class));
exp.setValue(context, "baz");
assertEquals("baz", exp.getValue(context));
}
public void testResolveSpringBean() {
MockRequestContext context = new MockRequestContext();
StaticListableBeanFactory beanFactory = new StaticListableBeanFactory();
beanFactory.addBean("testBean", new TestBean());
context.getRootFlow().setBeanFactory(beanFactory);
Expression exp = parser.parseExpression("testBean", new ParserContextImpl().eval(RequestContext.class));
assertSame(beanFactory.getBean("testBean"), exp.getValue(context));
}
public void testResolveAction() {
MockRequestContext context = new MockRequestContext();
StaticListableBeanFactory beanFactory = new StaticListableBeanFactory();
beanFactory.addBean("action", new TestAction());
context.getRootFlow().setBeanFactory(beanFactory);
Expression exp = parser.parseExpression("action", new ParserContextImpl().eval(RequestContext.class));
assertSame(beanFactory.getBean("action"), exp.getValue(context));
}
public void testResolveMultiAction() {
MockRequestContext context = new MockRequestContext();
StaticListableBeanFactory beanFactory = new StaticListableBeanFactory();
beanFactory.addBean("multiAction", new FormAction());
context.getRootFlow().setBeanFactory(beanFactory);
Expression exp = parser.parseExpression("multiAction.setupForm", new ParserContextImpl()
.eval(RequestContext.class));
AnnotatedAction action = (AnnotatedAction) exp.getValue(context);
assertSame(beanFactory.getBean("multiAction"), action.getTargetAction());
assertEquals("setupForm", action.getMethod());
}
}