package org.springframework.webflow.expression.el;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.el.ELResolver;
import javax.el.PropertyNotFoundException;
import javax.el.PropertyNotWritableException;
import org.springframework.context.MessageSource;
import org.springframework.context.support.StaticMessageSource;
import org.springframework.web.context.support.StaticWebApplicationContext;
import org.springframework.webflow.engine.Flow;
import org.springframework.webflow.execution.RequestContextHolder;
import org.springframework.webflow.test.MockRequestContext;
public class FlowResourceELResolverTests extends FlowDependentELResolverTestCase {
@Override
public void tearDown() {
RequestContextHolder.setRequestContext(null);
}
public void testGetType_BaseVariable() {
RequestContextHolder.setRequestContext(new MockRequestContext());
assertEquals(getBaseVariable() + " should have a type of MessageSource", MessageSource.class, context
.getELResolver().getType(context, null, getBaseVariable()));
}
public void testGetType_ResolvableCode() {
StaticMessageSource ms = new StaticMessageSource();
ms.addMessage("foo.bar", Locale.getDefault(), "hello");
RequestContextHolder.setRequestContext(new MockRequestContext());
assertEquals("Message should resolve to a type of String", String.class,
context.getELResolver().getType(context, ms, "foo.bar"));
}
public void testGetType_InvalidCode() {
StaticMessageSource ms = new StaticMessageSource();
ms.addMessage("foo.bar", Locale.getDefault(), "hello");
RequestContextHolder.setRequestContext(new MockRequestContext());
try {
context.getELResolver().getType(context, ms, "foo.baz");
fail("Message should not be resolvable");
} catch (PropertyNotFoundException ex) {
// expected
}
}
public void testGetValue_BaseVariable() {
MockRequestContext requestContext = new MockRequestContext();
((Flow) requestContext.getActiveFlow()).setApplicationContext(new StaticWebApplicationContext());
RequestContextHolder.setRequestContext(requestContext);
assertTrue(getBaseVariable() + " should resolve to an instance of MessageSource", context.getELResolver()
.getValue(context, null, getBaseVariable()) instanceof MessageSource);
}
public void testGetValue_ResolvableCode() {
StaticMessageSource ms = new StaticMessageSource();
ms.addMessage("foo.bar", Locale.getDefault(), "hello");
RequestContextHolder.setRequestContext(new MockRequestContext());
assertEquals("Message should resolve to a valid message value", "hello",
context.getELResolver().getValue(context, ms, "foo.bar"));
}
public void testGetValue_InvalidCode() {
StaticMessageSource ms = new StaticMessageSource();
ms.addMessage("foo.bar", Locale.getDefault(), "hello");
RequestContextHolder.setRequestContext(new MockRequestContext());
try {
context.getELResolver().getValue(context, ms, "foo.baz");
fail("Message should not be resolvable");
} catch (PropertyNotFoundException ex) {
// expected
}
}
public void testIsReadOnly_BaseVariable() {
RequestContextHolder.setRequestContext(new MockRequestContext());
assertTrue("isReadOnly should return true for the base variable",
context.getELResolver().isReadOnly(context, null, getBaseVariable()));
}
public void testIsReadOnly_MessageSourceBase() {
StaticMessageSource ms = new StaticMessageSource();
RequestContextHolder.setRequestContext(new MockRequestContext());
assertTrue("isReadOnly should return true when the base is a MessageSource", context.getELResolver()
.isReadOnly(context, ms, "foo"));
}
public void testSetValue_BaseVariable() {
RequestContextHolder.setRequestContext(new MockRequestContext());
try {
context.getELResolver().setValue(context, null, getBaseVariable(), null);
fail("setValue should fail for a base variable of " + getBaseVariable());
} catch (PropertyNotWritableException ex) {
// expected
}
}
public void testSetValue_MessageSourceBase() {
StaticMessageSource ms = new StaticMessageSource();
RequestContextHolder.setRequestContext(new MockRequestContext());
try {
context.getELResolver().setValue(context, ms, "foo", null);
fail("setValue should fail when the base is a MessageSource");
} catch (PropertyNotWritableException ex) {
// expected
}
}
protected String getBaseVariable() {
return FlowResourceELResolver.RESOURCE_BUNDLE_KEY;
}
protected List<ELResolver> getCustomResolvers() {
List<ELResolver> resolvers = new ArrayList<ELResolver>();
resolvers.add(new FlowResourceELResolver());
return resolvers;
}
}