Author: musachy Date: Sat Nov 7 23:14:32 2009 New Revision: 833776 URL: http://svn.apache.org/viewvc?rev=833776&view=rev Log: rename classes, add more tests
Added: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELReflectionContextFactory.java struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELServletContextListener.java struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStack.java struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStackFactory.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUELTest.java - copied, changed from r833650, struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUelBaseTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ChildTestAction.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELMethodInvocationTest.java - copied, changed from r833650, struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/JuelMethodInvocationTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackReadValueTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackSetValueTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELValueStackOtherTests.java Removed: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/contextlistener/ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUelBaseTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/JuelMethodInvocationTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ParametersTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UelTest.java Modified: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/CompoundRootELResolver.java struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/XWorkBeanELResolver.java struts/sandbox/trunk/struts2-uel-plugin/src/main/resources/struts-plugin.xml struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/BuiltinFunctionsTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestAction.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestObject.java Added: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELReflectionContextFactory.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELReflectionContextFactory.java?rev=833776&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELReflectionContextFactory.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELReflectionContextFactory.java Sat Nov 7 23:14:32 2009 @@ -0,0 +1,15 @@ +package org.apache.struts2.uelplugin; + +import com.opensymphony.xwork2.util.reflection.ReflectionContextFactory; + +import java.util.HashMap; +import java.util.Map; + +/** + * ReflectionContextFactory for Unified EL. + */ +public class UELReflectionContextFactory implements ReflectionContextFactory { + public Map createDefaultContext(Object root) { + return new HashMap(); + } +} Added: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELServletContextListener.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELServletContextListener.java?rev=833776&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELServletContextListener.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELServletContextListener.java Sat Nov 7 23:14:32 2009 @@ -0,0 +1,33 @@ +package org.apache.struts2.uelplugin; + +import de.odysseus.el.ExpressionFactoryImpl; +import de.odysseus.el.tree.TreeBuilder; + +import javax.el.ExpressionFactory; +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import java.util.Properties; + +import org.apache.struts2.uelplugin.ExpressionFactoryHolder; + +/** + * Responsible for creating the ExpressionFactory that will be used by the + * UelValueStack + */ +public class UELServletContextListener implements ServletContextListener { + public void contextInitialized(ServletContextEvent contextEvent) { + Properties juelProperties = new Properties(); + juelProperties.setProperty("javax.el.methodInvocations", "true"); + + //custom parser + juelProperties.setProperty(TreeBuilder.class.getName(), JUELExtensionBuilder.class.getName()); + + ExpressionFactory factory = new ExpressionFactoryImpl(juelProperties); + + ExpressionFactoryHolder.setExpressionFactory(factory); + } + + public void contextDestroyed(ServletContextEvent contextEvent) { + } +} Added: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStack.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStack.java?rev=833776&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStack.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStack.java Sat Nov 7 23:14:32 2009 @@ -0,0 +1,229 @@ +package org.apache.struts2.uelplugin; + +import com.opensymphony.xwork2.XWorkException; +import com.opensymphony.xwork2.conversion.impl.XWorkConverter; +import com.opensymphony.xwork2.inject.Container; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.ClearableValueStack; +import com.opensymphony.xwork2.util.CompoundRoot; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; +import org.apache.struts2.uelplugin.elresolvers.AccessorsContextKey; + +import javax.el.ELContext; +import javax.el.ExpressionFactory; +import javax.el.PropertyNotFoundException; +import javax.el.ValueExpression; +import java.util.Map; +import java.util.TreeMap; +import java.io.Serializable; + +/** + * A ValueStack that uses Unified EL as the underlying Expression Language. + */ +public class UELValueStack implements ValueStack, ClearableValueStack, Serializable { + private static final Logger LOG = LoggerFactory.getLogger(UELValueStack.class); + + private CompoundRoot root = new CompoundRoot(); + private transient Map context; + private Class defaultType; + private Map overrides; + + private ELContext elContext; + private Container container; + private XWorkConverter xworkConverter; + + private boolean logMissingProperties; + private boolean devMode; + + public UELValueStack(Container container) { + this(container, new CompoundRoot()); + } + + public UELValueStack(Container container, ValueStack vs) { + this(container, new CompoundRoot(vs.getRoot())); + } + + public UELValueStack(Container container, CompoundRoot root) { + this.container = container; + this.xworkConverter = container.getInstance(XWorkConverter.class); + setRoot(new CompoundRoot(root)); + } + + @Inject("devMode") + public void setDevMode(String mode) { + devMode = "true".equalsIgnoreCase(mode); + } + + @Inject(value = "logMissingProperties", required = false) + public void setLogMissingProperties(String logMissingProperties) { + this.logMissingProperties = "true".equalsIgnoreCase(logMissingProperties); + } + + public String findString(String expr, boolean throwException) { + return (String) findValue(expr, String.class); + } + + public String findString(String expr) { + return findString(expr, false); + } + + public Object findValue(String expr) { + return findValue(expr, Object.class, false); + } + + public Object findValue(String expr, boolean throwException) { + return findValue(expr, Object.class, throwException); + } + + public Object findValue(String expr, Class asType) { + return findValue(expr, asType, false); + } + + public Object findValue(String expr, Class asType, boolean throwException) { + String originalExpression = expr; + try { + if ((overrides != null) && overrides.containsKey(expr)) { + expr = (String) overrides.get(expr); + } + if (expr != null && expr.startsWith("%{")) { + // replace %{ with ${ + expr = "#" + expr.substring(1); + } + if (expr != null && !expr.startsWith("${") && !expr.startsWith("#{")) { + expr = "#{" + expr + "}"; + } + + elContext.putContext(AccessorsContextKey.class, context); + elContext.putContext(XWorkConverter.class, xworkConverter); + elContext.putContext(CompoundRoot.class, root); + + // parse our expression + ExpressionFactory factory = getExpressionFactory(); + ValueExpression valueExpr = factory.createValueExpression(elContext, expr, Object.class); + Object retVal = valueExpr.getValue(elContext); + if (!Object.class.equals(asType)) { + retVal = xworkConverter.convertValue(context, root, null, null, retVal, asType); + } + return retVal; + } catch (Exception e) { + return handleException(e, originalExpression, throwException); + } + } + + private Object handleException(Exception exception, String expression, boolean throwException) { + Object ret = context.get(expression); + + if (ret != null) + return ret; + else { + if (exception instanceof PropertyNotFoundException && devMode && logMissingProperties) + LOG.warn(exception.getMessage()); + + if (throwException) + throw new XWorkException(exception); + else + return null; + } + + } + + protected ExpressionFactory getExpressionFactory() { + ExpressionFactory factory = ExpressionFactoryHolder.getExpressionFactory(); + if (factory == null) { + String message = "********** FATAL ERROR STARTING UP STRUTS-UEL INTEGRATION **********\n" + + "Looks like the UEL listener was not configured for your web app! \n" + + "Nothing will work until UELServletContextListener is added as a listener in web.xml.\n" + + "You might need to add the following to web.xml: \n" + + " <listener>\n" + + " <listener-class>org.apache.struts2.uelplugin.UELServletContextListener</listener-class>\n" + + " </listener>"; + LOG.fatal(message); + throw new IllegalStateException("Unable to find ExpressionFactory instance. Make sure that 'UELServletContextListener' " + + "is configured in web.xml as a listener"); + } else + return factory; + } + + public Map getContext() { + return context; + } + + public Map getExprOverrides() { + return overrides; + } + + public CompoundRoot getRoot() { + return root; + } + + public Object peek() { + return root.peek(); + } + + public Object pop() { + return root.pop(); + } + + public void push(Object o) { + root.push(o); + } + + public void setDefaultType(Class defaultType) { + this.defaultType = defaultType; + } + + public void setExprOverrides(Map overrides) { + if (this.overrides == null) { + this.overrides = overrides; + } else { + this.overrides.putAll(overrides); + } + } + + public void set(String key, Object o) { + overrides.put(key, o); + } + + public void setValue(String expr, Object value) { + setValue(expr, value, false); + } + + public void setValue(String expr, Object value, boolean throwExceptionOnFailure) { + try { + if (expr != null && !expr.startsWith("${") && !expr.startsWith("#{")) { + expr = "#{" + expr + "}"; + } + elContext.putContext(AccessorsContextKey.class, context); + elContext.putContext(XWorkConverter.class, xworkConverter); + elContext.putContext(CompoundRoot.class, root); + + // parse our expression + ExpressionFactory factory = getExpressionFactory(); + ValueExpression valueExpr = factory.createValueExpression(elContext, expr, Object.class); + valueExpr.setValue(elContext, value); + } catch (Exception e) { + if (e instanceof PropertyNotFoundException && devMode && logMissingProperties) + LOG.warn("Could not find property [" + ((PropertyNotFoundException) e).getMessage() + "]"); + + if (throwExceptionOnFailure) + throw new XWorkException(e); + } + } + + public int size() { + return root.size(); + } + + protected void setRoot(CompoundRoot root) { + this.context = new TreeMap(); + context.put(VALUE_STACK, this); + this.root = root; + elContext = new CompoundRootELContext(container); + } + + public void clearContextValues() { + getContext().clear(); + } +} Added: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStackFactory.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStackFactory.java?rev=833776&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStackFactory.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UELValueStackFactory.java Sat Nov 7 23:14:32 2009 @@ -0,0 +1,45 @@ +package org.apache.struts2.uelplugin; + +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.conversion.impl.XWorkConverter; +import com.opensymphony.xwork2.inject.Container; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.ValueStackFactory; + +import javax.el.ExpressionFactory; + +/** + * Creates UelValueStacks. + */ +public class UELValueStackFactory implements ValueStackFactory { + private ExpressionFactory factory; + + private XWorkConverter xworkConverter; + + private Container container; + + @Inject + public void setXWorkConverter(XWorkConverter conv) { + this.xworkConverter = conv; + } + + @Inject + public void setContainer(Container container) throws ClassNotFoundException { + this.container = container; + } + + + public ValueStack createValueStack() { + ValueStack results = new UELValueStack(container); + results.getContext().put(ActionContext.CONTAINER, container); + return results; + } + + public ValueStack createValueStack(ValueStack stack) { + ValueStack results = new UELValueStack(container, stack); + container.inject(results); + results.getContext().put(ActionContext.CONTAINER, container); + return results; + } +} Modified: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/CompoundRootELResolver.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/CompoundRootELResolver.java?rev=833776&r1=833775&r2=833776&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/CompoundRootELResolver.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/CompoundRootELResolver.java Sat Nov 7 23:14:32 2009 @@ -1,7 +1,6 @@ package org.apache.struts2.uelplugin.elresolvers; import com.opensymphony.xwork2.conversion.impl.XWorkConverter; -import com.opensymphony.xwork2.conversion.NullHandler; import com.opensymphony.xwork2.util.CompoundRoot; import com.opensymphony.xwork2.util.reflection.ReflectionContextState; import com.opensymphony.xwork2.inject.Container; @@ -10,14 +9,7 @@ import org.apache.commons.lang.xwork.StringUtils; import javax.el.ELContext; -import javax.el.ELResolver; -import java.beans.BeanInfo; -import java.beans.FeatureDescriptor; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Iterator; import java.util.Map; /** @@ -31,8 +23,8 @@ } @Override - public Object getValue(ELContext context, Object base, Object property) { - if (context == null) { + public Object getValue(ELContext elContext, Object base, Object property) { + if (elContext == null) { throw new IllegalArgumentException("ElContext cannot be null"); } @@ -46,16 +38,17 @@ return null; } - CompoundRoot root = (CompoundRoot) context.getContext(CompoundRoot.class); + CompoundRoot root = (CompoundRoot) elContext.getContext(CompoundRoot.class); if (root == null) { return null; } if ("top".equals(propertyName) && root.size() > 0) { + elContext.setPropertyResolved(true); return root.get(0); } - Map<String, Object> reflectionContext = (Map) context.getContext(AccessorsContextKey.class); + Map<String, Object> reflectionContext = (Map) elContext.getContext(AccessorsContextKey.class); Object bean = findObjectForProperty(root, propertyName); if (bean != null) { @@ -70,10 +63,10 @@ reflectionProvider.setValue(propertyName, reflectionContext, bean, retVal); } - context.setPropertyResolved(true); + elContext.setPropertyResolved(true); return retVal; } - + return null; } @@ -93,15 +86,20 @@ } CompoundRoot root = (CompoundRoot) context.getContext(CompoundRoot.class); + Map<String, Object> reflectionContext = (Map) context.getContext(AccessorsContextKey.class); String propertyName = (String) property; try { if (base == null && property != null && root != null) { Object bean = findObjectForProperty(root, propertyName); if (bean != null) { + reflectionContext.put(XWorkConverter.LAST_BEAN_CLASS_ACCESSED, bean.getClass()); + reflectionContext.put(XWorkConverter.LAST_BEAN_PROPERTY_ACCESSED, propertyName); + + XWorkConverter converter = (XWorkConverter) context.getContext(XWorkConverter.class); if (converter != null && root != null) { Class propType = determineType(bean, propertyName); - value = converter.convertValue(null, value, propType); + value = converter.convertValue(reflectionContext, bean, null, propertyName, value, propType); } BeanUtils.setProperty(bean, propertyName, value); context.setPropertyResolved(true); Modified: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/XWorkBeanELResolver.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/XWorkBeanELResolver.java?rev=833776&r1=833775&r2=833776&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/XWorkBeanELResolver.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/XWorkBeanELResolver.java Sat Nov 7 23:14:32 2009 @@ -18,14 +18,15 @@ if (target != null && property != null) { Map<String, Object> reflectionContext = (Map<String, Object>) elContext.getContext(AccessorsContextKey.class); String propertyName = property.toString(); + Class targetType = target.getClass(); //only handle this if there is such a property if (PropertyUtils.isReadable(target, propertyName)) { try { Object obj = reflectionProvider.getValue(propertyName, reflectionContext, target); - reflectionContext.put(XWorkConverter.LAST_BEAN_CLASS_ACCESSED, target.getClass()); - reflectionContext.put(XWorkConverter.LAST_BEAN_PROPERTY_ACCESSED, property.toString()); + reflectionContext.put(XWorkConverter.LAST_BEAN_CLASS_ACCESSED, targetType); + reflectionContext.put(XWorkConverter.LAST_BEAN_PROPERTY_ACCESSED, propertyName); //if object is null, and create objects is enabled, lets do it if (obj == null && ReflectionContextState.isCreatingNullObjects(reflectionContext)) { Modified: struts/sandbox/trunk/struts2-uel-plugin/src/main/resources/struts-plugin.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/resources/struts-plugin.xml?rev=833776&r1=833775&r2=833776&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/resources/struts-plugin.xml (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/resources/struts-plugin.xml Sat Nov 7 23:14:32 2009 @@ -6,11 +6,11 @@ <struts> <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="uel" - class="org.apache.struts2.uelplugin.UelValueStackFactory"/> + class="org.apache.struts2.uelplugin.UELValueStackFactory"/> <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="uel" class="org.apache.struts2.uelplugin.reflection.GenericReflectionProvider"/> <bean type="com.opensymphony.xwork2.util.reflection.ReflectionContextFactory" name="uel" - class="org.apache.struts2.uelplugin.UelReflectionContextFactory"/> + class="org.apache.struts2.uelplugin.UELReflectionContextFactory"/> <constant name="struts.valueStackFactory" value="uel"/> <constant name="struts.reflectionProvider" value="uel"/> Copied: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUELTest.java (from r833650, struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUelBaseTest.java) URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUELTest.java?p2=struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUELTest.java&p1=struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUelBaseTest.java&r1=833650&r2=833776&rev=833776&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUelBaseTest.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/AbstractUELTest.java Sat Nov 7 23:14:32 2009 @@ -2,19 +2,12 @@ import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.inject.ContainerBuilder; -import com.opensymphony.xwork2.inject.Factory; -import com.opensymphony.xwork2.inject.Context; -import com.opensymphony.xwork2.inject.Scope; import com.opensymphony.xwork2.test.StubConfigurationProvider; -import com.opensymphony.xwork2.config.ConfigurationManager; -import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationException; import com.opensymphony.xwork2.util.CompoundRoot; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.location.LocatableProperties; import com.opensymphony.xwork2.util.reflection.ReflectionProvider; import com.opensymphony.xwork2.conversion.impl.XWorkConverter; @@ -22,7 +15,6 @@ import org.apache.struts2.ServletActionContext; import org.apache.struts2.uelplugin.reflection.GenericReflectionProvider; import org.apache.struts2.util.StrutsTypeConverter; -import org.apache.commons.beanutils.converters.DateConverter; import javax.servlet.ServletContextEvent; import javax.el.ExpressionFactory; @@ -31,11 +23,11 @@ import java.text.DateFormat; -public abstract class AbstractUelBaseTest extends XWorkTestCase { +public abstract class AbstractUELTest extends XWorkTestCase { private ExpressionFactory factory = ExpressionFactory.newInstance(); protected XWorkConverter converter; protected CompoundRoot root; - protected UelValueStack stack; + protected UELValueStack stack; protected DateFormat format = DateFormat.getDateInstance(); protected ReflectionProvider reflectionProvider; @@ -63,8 +55,8 @@ loadConfigurationProviders(new StubConfigurationProvider() { public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException { - builder.factory(ValueStack.class, UelValueStack.class); - builder.factory(ValueStackFactory.class, UelValueStackFactory.class); + builder.factory(ValueStack.class, UELValueStack.class); + builder.factory(ValueStackFactory.class, UELValueStackFactory.class); builder.factory(ReflectionProvider.class, GenericReflectionProvider.class); //builder.factory(StrutsTypeConverter) } @@ -74,7 +66,7 @@ reflectionProvider = container.getInstance(ReflectionProvider.class); converter.registerConverter("java.util.Date", new DateConverter()); this.root = new CompoundRoot(); - this.stack = new UelValueStack(container); + this.stack = new UELValueStack(container); stack.setRoot(root); stack.getContext().put(ActionContext.CONTAINER, container); @@ -84,7 +76,7 @@ ServletActionContext.setServletContext(servletContext); //simulate start up - UelServletContextListener listener = new UelServletContextListener(); + UELServletContextListener listener = new UELServletContextListener(); listener.contextInitialized(new ServletContextEvent(servletContext)); } } Modified: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/BuiltinFunctionsTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/BuiltinFunctionsTest.java?rev=833776&r1=833775&r2=833776&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/BuiltinFunctionsTest.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/BuiltinFunctionsTest.java Sat Nov 7 23:14:32 2009 @@ -1,21 +1,11 @@ package org.apache.struts2.uelplugin; -import com.opensymphony.xwork2.XWorkTestCase; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.util.CompoundRoot; -import com.opensymphony.xwork2.conversion.impl.XWorkConverter; - import java.lang.reflect.InvocationTargetException; -import org.springframework.mock.web.MockServletContext; -import org.apache.struts2.ServletActionContext; import org.apache.struts2.views.util.ContextUtil; -import org.apache.struts2.uelplugin.UelServletContextListener; - -import javax.servlet.ServletContextEvent; -public class BuiltinFunctionsTest extends AbstractUelBaseTest { +public class BuiltinFunctionsTest extends AbstractUELTest { public void testGetText() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { TestAction action = new TestAction(); stack.push(action); Added: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ChildTestAction.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ChildTestAction.java?rev=833776&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ChildTestAction.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ChildTestAction.java Sat Nov 7 23:14:32 2009 @@ -0,0 +1,4 @@ +package org.apache.struts2.uelplugin; + +public class ChildTestAction extends TestAction { +} Modified: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestAction.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestAction.java?rev=833776&r1=833775&r2=833776&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestAction.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestAction.java Sat Nov 7 23:14:32 2009 @@ -8,10 +8,18 @@ @Conversion public class TestAction extends ActionSupport { private TestObject object; + private int bar; + + public int getBar() { + return bar; + } + + public void setBar(int bar) { + this.bar = bar; + } private String converted; - @TypeConversion(type = ConversionType.APPLICATION, converter = "org.apache.struts2.uelplugin.DummyTypeConverter") public String getConverted() { return converted; } Modified: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestObject.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestObject.java?rev=833776&r1=833775&r2=833776&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestObject.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestObject.java Sat Nov 7 23:14:32 2009 @@ -18,9 +18,32 @@ private Map map; private Map<Integer, TestObject> typedMap; private Object[] objectArray; - private Integer[] typedArray; + private int[] typedArray; + private TestObject[] typedArray2; private Set set; + private ChildTestAction childTestAction; + + public ChildTestAction getChildTestAction() { + return childTestAction; + } + + public void setChildTestAction(ChildTestAction childTestAction) { + this.childTestAction = childTestAction; + } + + public Object getFail() { + throw new RuntimeException("kaboom"); + } + + public TestObject[] getTypedArray2() { + return typedArray2; + } + + public void setTypedArray2(TestObject[] typedArray2) { + this.typedArray2 = typedArray2; + } + public Set getSet() { return set; } @@ -37,11 +60,11 @@ this.objectArray = objectArray; } - public Integer[] getTypedArray() { + public int[] getTypedArray() { return typedArray; } - public void setTypedArray(Integer[] typedArray) { + public void setTypedArray(int[] typedArray) { this.typedArray = typedArray; } Copied: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELMethodInvocationTest.java (from r833650, struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/JuelMethodInvocationTest.java) URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELMethodInvocationTest.java?p2=struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELMethodInvocationTest.java&p1=struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/JuelMethodInvocationTest.java&r1=833650&r2=833776&rev=833776&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/JuelMethodInvocationTest.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELMethodInvocationTest.java Sat Nov 7 23:14:32 2009 @@ -1,19 +1,9 @@ package org.apache.struts2.uelplugin; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.XWorkTestCase; -import com.opensymphony.xwork2.conversion.impl.XWorkConverter; -import com.opensymphony.xwork2.util.CompoundRoot; -import org.apache.struts2.ServletActionContext; -import org.apache.struts2.uelplugin.UelServletContextListener; -import org.springframework.mock.web.MockServletContext; - -import javax.servlet.ServletContextEvent; import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -public class JuelMethodInvocationTest extends AbstractUelBaseTest { +public class UELMethodInvocationTest extends AbstractUELTest { public void testBasicMethods() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { assertEquals("text", stack.findValue("${' text '.trim()}")); assertEquals(3, stack.findValue("${'123'.length()}")); @@ -29,4 +19,14 @@ stack.getContext().put("s1", "Luthor"); assertEquals("Lex Luthor", stack.findValue("${#s0.concat(' ').concat(#s1)}")); } + + public void testCallMethodsOnCompundRoot() { + //this shuld not fail as the property is defined on a parent class + TestObject obj = new TestObject(); + root.push(obj); + ChildTestAction childTestAction = new ChildTestAction(); + obj.setChildTestAction(childTestAction); + + assertSame(childTestAction, stack.findValue("top.getChildTestAction()", true)); + } } Added: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackReadValueTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackReadValueTest.java?rev=833776&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackReadValueTest.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackReadValueTest.java Sat Nov 7 23:14:32 2009 @@ -0,0 +1,198 @@ +package org.apache.struts2.uelplugin; + +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +public class UELStackReadValueTest extends AbstractUELTest { + + public void testTop() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + obj.setValue("0"); + root.push(obj); + + obj = new TestObject(); + obj.setValue("1"); + root.push(obj); + + assertEquals("1", stack.findValue("top.value")); + } + + public void testReadList() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + root.push(obj); + + //list + List someList = new ArrayList(3); + obj.setObject(someList); + someList.add(10); + assertEquals(10, stack.findValue("object[0]")); + } + + public void testReadArray() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + int[] ints = {10, 20}; + obj.setTypedArray(ints); + root.push(obj); + + //list + assertEquals(20, stack.findValue("typedArray[1]")); + } + + + public void testReadMap() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + HashMap map = new HashMap(); + map.put("nameValue", "Lex"); + TestObject obj = new TestObject(); + obj.setParameters(map); + root.add(obj); + + assertEquals("Lex", stack.findValue("parameters.nameValue")); + assertEquals("Lex", stack.findValue("parameters['nameValue']")); + } + + + public void testContextReferencesWithSameObjectInStack() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + //if there as object in the stack with the property "X" and there is an object in the + //stack context under the key "X" then: + //${X} : should return the value of X from object in stack + //${#X} : should return object from the stack context + + TestObject obj = new TestObject(); + obj.setValue("ref"); + stack.push(obj); + + TestObject obj2 = new TestObject(); + stack.getContext().put("value", obj2); + + //simple + assertEquals("ref", stack.findValue("value")); + assertSame(obj2, stack.findValue("#value")); + + } + + public void testExpressionSyntax() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + obj.setValue("val"); + obj.setAge(1); + stack.getContext().put("obj", obj); + + assertEquals("val", stack.findValue("${#obj.value}")); + assertEquals("val", stack.findValue("%{#obj.value}")); + assertEquals("val", stack.findValue("#{#obj.value}")); + } + + public void testSuperNested() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj0 = new TestObject("0"); + root.push(obj0); + + TestObject obj1 = new TestObject("1"); + obj0.setInner(obj1); + + TestObject obj2 = new TestObject("2"); + Map map = new HashMap(); + map.put("key0", obj2); + obj1.setParameters(map); + + TestObject obj3 = new TestObject("3"); + List list = new ArrayList(); + list.add(obj3); + obj2.setObject(obj3); + + TestObject obj4 = new TestObject("4"); + TestObject[] array = new TestObject[]{obj4}; + obj3.setObject(array); + + stack.getContext().put("obj", obj0); + + assertEquals("4", stack.findValue("${inner.parameters['key0'].object.object[0].value}")); + } + + public void testContextReferences() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + obj.setValue("val"); + obj.setAge(1); + stack.getContext().put("obj", obj); + + //simple + assertSame(obj, stack.findValue("#obj")); + assertEquals("val", stack.findValue("#obj.value")); + + //more expressions + TestObject obj2 = new TestObject(); + obj2.setValue("val2"); + obj2.setAge(2); + stack.getContext().put("obj2", obj2); + + //addition + assertSame(3L, stack.findValue("#obj.age + #obj2.age")); + + //string addition + assertEquals("valval2", stack.findValue("#obj.value + #obj2.value")); + assertEquals("1val2", stack.findValue("#obj.age + #obj2.value")); + + //map + Map someMap = new HashMap(); + obj.setInner(obj2); + someMap.put("val", obj); + stack.getContext().put("map", someMap); + assertEquals("val", stack.findValue("#map[#obj.value].value")); + + //list + List someList = new ArrayList(3); + obj.setAge(0); + someList.add(obj); + stack.getContext().put("list", someList); + assertEquals("val", stack.findValue("#list[#obj.age].value")); + } + + public void testBasicFind() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + root.add(obj); + stack.setValue("${value}", "Hello World"); + String value = stack.findString("${value}"); + assertEquals("Hello World", value); + + stack.setValue("${age}", "56"); + Integer age = (Integer) stack.findValue("${age}"); + assertEquals(56, (int) age); + } + + public void testNestedFind() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + TestObject obj2 = new TestObject(); + obj2.setAge(100); + obj.setInner(obj2); + root.add(obj); + + assertSame(obj2, stack.findValue("${inner}")); + assertEquals(100, stack.findValue("${inner.age}")); + } + + public void testDeferredFind() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + root.add(obj); + + stack.setValue("#{value}", "Hello World"); + String value = stack.findString("#{value}"); + assertEquals("Hello World", value); + + stack.setValue("#{age}", "56"); + String age = stack.findString("#{age}"); + assertEquals("56", age); + + stack.setValue("#{date}", new Date()); + assertEquals(stack.findString("#{date}"), format.format(obj.getDate())); + } + + public void testNotFound() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + root.add(obj); + + stack.setValue("${value}", "Hello World"); + String value = stack.findString("${VALUENOTHERE}"); + assertNull(value); + + value = stack.findString("VALUENOTHERE"); + assertNull(value); + } +} Added: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackSetValueTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackSetValueTest.java?rev=833776&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackSetValueTest.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELStackSetValueTest.java Sat Nov 7 23:14:32 2009 @@ -0,0 +1,159 @@ +package org.apache.struts2.uelplugin; + +import com.opensymphony.xwork2.util.reflection.ReflectionContextState; + +import java.util.*; +import java.lang.reflect.InvocationTargetException; + + +public class UELStackSetValueTest extends AbstractUELTest { + public void testSuperNested() { + TestObject obj = new TestObject(); + root.push(obj); + + stack.setValue("inner.typedMap[10].inner.typedList[2].typedMap[1].value", "whoa"); + assertEquals("whoa", obj.getInner().getTypedMap().get(10).getInner().getTypedList().get(2).getTypedMap().get(1).getValue()); + } + + + public void testWriteList() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + //not null + List list = new ArrayList(); + TestObject obj = new TestObject(); + obj.setList(list); + assertNotNull(obj.getList()); + root.push(obj); + + stack.setValue("list[0]", "val"); + assertEquals(1, list.size()); + assertEquals("val", list.get(0)); + + //null list + obj.setList(null); + assertNull(obj.getList()); + stack.setValue("list[0]", "val"); + assertNotNull(obj.getList()); + assertEquals("val", stack.findValue("list[0]")); + + //test out of index + obj.setList(null); + stack.setValue("list[3]", "val"); + assertEquals(4, obj.getList().size()); + assertEquals("val", obj.getList().get(3)); + + //test type determiner + obj.setTypedList(null); + stack.setValue("typedList[1].value", "val"); + assertEquals(2, obj.getTypedList().size()); + assertEquals("val", obj.getTypedList().get(1).getValue()); + } + + public void testWriteArray() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + //not null + TestObject[] array = new TestObject[2]; + TestObject obj = new TestObject(); + obj.setTypedArray2(array); + assertNotNull(obj.getTypedArray2()); + root.push(obj); + + stack.setValue("typedArray2[0].value", "val"); + assertNotNull(array[0]); + assertEquals("val", ((TestObject) array[0]).getValue()); + } + + public void testWriteMap() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + //not null + Map map = new HashMap(); + TestObject obj = new TestObject(); + obj.setMap(map); + assertNotNull(obj.getMap()); + root.push(obj); + + stack.setValue("map['str']", "val"); + assertEquals(1, map.size()); + assertEquals("val", map.get("str")); + + //null list + obj.setMap(null); + assertNull(obj.getMap()); + stack.setValue("map['str']", "val"); + assertNotNull(obj.getMap()); + assertEquals("val", stack.findValue("map['str']")); + + //test type determiner + obj.setTypedMap(null); + stack.setValue("typedMap[1].value", "val"); + assertEquals(1, obj.getTypedMap().size()); + assertEquals("val", obj.getTypedMap().get(1).getValue()); + } + + public void testSetPropertiesOnNestedNullObject() { + TestObject obj = new TestObject(); + assertNull(obj.getInner()); + root.push(obj); + + //inner is null, it will be catched bye the CompoundRoolELResolver + stack.setValue("inner.value", "val"); + assertNotNull(obj.getInner()); + assertEquals("val", obj.getInner().getValue()); + + + //second nested property null + stack.setValue("inner.inner.value", "val"); + assertNotNull(obj.getInner().getInner()); + assertEquals("val", obj.getInner().getInner().getValue()); + } + + public void testSetStringArray() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + root.add(obj); + + stack.setValue("${value}", new String[]{"Hello World"}); + String value = stack.findString("${value}"); + assertEquals("Hello World", value); + + stack.setValue("${age}", new String[]{"67"}); + assertEquals(new Integer(67), stack.findValue("${age}")); + } + + public void test2LevelSet() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + TestObject nestedObj = new TestObject(); + obj.setInner(nestedObj); + root.add(obj); + + stack.setValue("${inner.age}", "66"); + assertEquals(66, obj.getInner().getAge()); + } + + public void testTypeConversion() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + TestObject obj = new TestObject(); + TestObject inner = new TestObject(); + obj.setInner(inner); + root.add(obj); + + stack.setValue("${age}", "22"); + assertEquals(stack.findValue("${age}"), obj.getAge()); + + stack.setValue("${inner.value}", "George"); + assertEquals(stack.findValue("${inner.value}"), obj.getInner().getValue()); + + stack.setValue("${inner.age}", "44"); + assertEquals(stack.findValue("${inner.age}"), obj.getInner().getAge()); + + stack.setValue("${date}", new Date()); + assertEquals(stack.findString("${date}"), format.format(obj.getDate())); + } + + + @Override + protected void setUp() throws Exception { + super.setUp(); + + Map context = stack.getContext(); + + ReflectionContextState.setCreatingNullObjects(context, true); + ReflectionContextState.setDenyMethodExecution(context, true); + ReflectionContextState.setReportingConversionErrors(context, true); + } +} Added: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELValueStackOtherTests.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELValueStackOtherTests.java?rev=833776&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELValueStackOtherTests.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UELValueStackOtherTests.java Sat Nov 7 23:14:32 2009 @@ -0,0 +1,159 @@ +package org.apache.struts2.uelplugin; + +import com.opensymphony.xwork2.conversion.impl.XWorkConverter; +import com.opensymphony.xwork2.ActionContext; + +import java.util.Map; +import java.util.LinkedHashMap; + + +public class UELValueStackOtherTests extends AbstractUELTest { + + public void testExpOverridesCanStackExpUp() throws Exception { + Map expr1 = new LinkedHashMap(); + expr1.put("expr1", "'expr1value'"); + + stack.setExprOverrides(expr1); + + assertEquals(stack.findValue("expr1"), "expr1value"); + + Map expr2 = new LinkedHashMap(); + expr2.put("expr2", "'expr2value'"); + expr2.put("expr3", "'expr3value'"); + stack.setExprOverrides(expr2); + + assertEquals(stack.findValue("expr2"), "expr2value"); + assertEquals(stack.findValue("expr3"), "expr3value"); + } + + public void testArrayAsString() { + TestObject obj = new TestObject(); + obj.setTypedArray(new int[]{1, 2}); + root.push(obj); + + assertEquals("1, 2", stack.findValue("typedArray", String.class)); + } + + public void testFailsOnExceptionWithThrowException() { + TestObject obj = new TestObject(); + root.push(obj); + try { + stack.findValue("fail", true); + fail("Failed to throw exception on EL error"); + } catch (Exception ex) { + //ok + } + } + + public void testFailsOnMissingPropertyWithThrowException() { + TestObject obj = new TestObject(); + root.push(obj); + try { + stack.findValue("someprop12", true); + fail("Failed to throw exception on EL error"); + } catch (Exception ex) { + //ok + } + } + + public void testFailsOnMissingNestedPropertyWithThrowException() { + TestObject obj = new TestObject(); + root.push(obj); + try { + stack.findValue("top.someprop12", true); + fail("Failed to throw exception on EL error"); + } catch (Exception ex) { + //ok + } + } + + public void testFailsOnMissingMethodWithThrowException() { + TestObject obj = new TestObject(); + root.push(obj); + try { + stack.findValue("top.somethingweird()", true); + fail("Failed to throw exception on EL error"); + } catch (Exception ex) { + //ok + } + } + + public void testDoesNotFailOnExceptionWithoutThrowException() { + TestObject obj = new TestObject(); + root.push(obj); + stack.findValue("fail", false); + stack.findValue("fail"); + } + + public void testDoesNotFailOnInheritedPropertiesWithThrowException() { + //this shuld not fail as the property is defined on a parent class + TestObject obj = new TestObject(); + root.push(obj); + ChildTestAction childTestAction = new ChildTestAction(); + obj.setChildTestAction(childTestAction); + + assertNull(childTestAction.getConverted()); + stack.findValue("childTestAction.converted", true); + } + + public void testDoesNotFailOnInheritedMethodsWithThrowException() { + //this shuld not fail as the property is defined on a parent class + TestObject obj = new TestObject(); + root.push(obj); + ChildTestAction childTestAction = new ChildTestAction(); + obj.setChildTestAction(childTestAction); + + assertNull(childTestAction.getConverted()); + stack.findValue("top.getChildTestAction().converted", true); + } + + public void testFailsOnInheritedMethodsWithThrowException() { + //this shuld not fail as the property is defined on a parent class + TestObject obj = new TestObject(); + root.push(obj); + ChildTestAction childTestAction = new ChildTestAction(); + obj.setChildTestAction(childTestAction); + + assertNull(childTestAction.getConverted()); + + try { + stack.findValue("top.getChildTestAction().converted2", true); + fail("should have failed because of missing property"); + } catch (Exception e) { + } + } + + public void testPrimitiveSettingWithInvalidValueAddsFieldErrorInNonDevMode() { + TestAction action = new TestAction(); + stack.getContext().put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE); + stack.setDevMode("false"); + stack.push(action); + stack.setValue("bar", "3x"); + + Map conversionErrors = (Map) stack.getContext().get(ActionContext.CONVERSION_ERRORS); + assertTrue(conversionErrors.containsKey("bar")); + } + + public void testPrimitiveSettingWithInvalidValueAddsFieldErrorInDevMode() { + TestAction action = new TestAction(); + stack.getContext().put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE); + stack.setDevMode("true"); + stack.push(action); + stack.setValue("bar", "3x"); + + Map conversionErrors = (Map) stack.getContext().get(ActionContext.CONVERSION_ERRORS); + assertTrue(conversionErrors.containsKey("bar")); + } + + public void testObjectSettingWithInvalidValueDoesNotCauseSetCalledWithNull() { + TestObject obj = new TestObject(); + root.push(obj); + ChildTestAction obj2 = new ChildTestAction(); + obj.setChildTestAction(obj2); + + stack.setValue("childTestAction", "whoa"); + assertNotNull(obj.getChildTestAction()); + assertSame(obj2, obj.getChildTestAction()); + } + +}