Author: musachy Date: Wed Nov 4 00:00:08 2009 New Revision: 832624 URL: http://svn.apache.org/viewvc?rev=832624&view=rev Log: use beanutils for reflection
Added: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ReflectionProviderTest.java struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestObject.java Modified: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UelReflectionProvider.java struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UelValueStack.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/UelTest.java Modified: struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UelReflectionProvider.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UelReflectionProvider.java?rev=832624&r1=832623&r2=832624&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UelReflectionProvider.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UelReflectionProvider.java Wed Nov 4 00:00:08 2009 @@ -1,6 +1,7 @@ package org.apache.struts2.uelplugin; import java.util.Map; +import java.lang.reflect.InvocationTargetException; import javax.el.ELContext; import javax.el.ExpressionFactory; @@ -11,6 +12,9 @@ import com.opensymphony.xwork2.ognl.OgnlReflectionProvider; import com.opensymphony.xwork2.util.CompoundRoot; import com.opensymphony.xwork2.util.reflection.ReflectionException; +import org.apache.commons.lang.xwork.StringUtils; +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; /** * A OgnlReflectionProvider based on Unified EL. @@ -24,35 +28,41 @@ this.xworkConverter = conv; } - public void initExpressionFactory() { - if (factory == null) { - factory = ExpressionFactoryHolder.getExpressionFactory(); - } - } + @Override public Object getValue(String expr, Map context, Object root) throws ReflectionException { - initExpressionFactory(); - CompoundRoot compoundRoot = new CompoundRoot(); - compoundRoot.add(root); - ELContext elContext = new CompoundRootELContext(); - elContext.putContext(XWorkConverter.class, xworkConverter); - // parse our expression - ValueExpression valueExpr = factory.createValueExpression(elContext, - expr, String.class); - return (String) valueExpr.getValue(elContext); + try { + return PropertyUtils.getProperty(root, expr); + } catch (IllegalAccessException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } catch (InvocationTargetException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } catch (NoSuchMethodException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + + return null; } @Override public void setValue(String expr, Map context, Object root, Object value) throws ReflectionException { - initExpressionFactory(); - CompoundRoot compoundRoot = new CompoundRoot(); - compoundRoot.add(root); - ELContext elContext = new CompoundRootELContext(); - elContext.putContext(XWorkConverter.class, xworkConverter); - // parse our expression - ValueExpression valueExpr = factory.createValueExpression(elContext, - expr, String.class); - valueExpr.setValue(elContext, value); + try { + BeanUtils.setProperty(root, expr, value); + } catch (IllegalAccessException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } catch (InvocationTargetException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + } + + protected String wrap(String expr) { + if (!StringUtils.startsWith(expr, "${") && !StringUtils.startsWith(expr, "#{")) { + StringBuilder sb = new StringBuilder("${"); + sb.append(expr); + sb.append("}"); + return sb.toString(); + } else + return expr; } } Modified: 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=832624&r1=832623&r2=832624&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UelValueStack.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/UelValueStack.java Wed Nov 4 00:00:08 2009 @@ -27,21 +27,18 @@ private ELContext elContext; - public UelValueStack(ExpressionFactory factory, - XWorkConverter xworkConverter) { + public UelValueStack(ExpressionFactory factory, XWorkConverter xworkConverter) { this(factory, xworkConverter, new CompoundRoot()); } - public UelValueStack(ExpressionFactory factory, - XWorkConverter xworkConverter, ValueStack vs) { + public UelValueStack(ExpressionFactory factory, XWorkConverter xworkConverter, ValueStack vs) { this(factory, xworkConverter, new CompoundRoot(vs.getRoot())); } - public UelValueStack(ExpressionFactory factory, - XWorkConverter xworkConverter, CompoundRoot root) { + public UelValueStack(ExpressionFactory factory, XWorkConverter xworkConverter, CompoundRoot root) { this.xworkConverter = xworkConverter; this.factory = factory; - setRoot(new CompoundRoot()); + setRoot(new CompoundRoot(root)); } public String findString(String expr, boolean throwException) { @@ -52,7 +49,7 @@ return findString(expr, false); } - public Object findValue(String expr) { + public Object findValue(String expr) { return findValue(expr, Object.class, false); } @@ -86,15 +83,13 @@ // replace %{ with ${ expr = "#" + expr.substring(1); } - if (expr != null && !expr.startsWith("${") - && !expr.startsWith("#{")) { + if (expr != null && !expr.startsWith("${") && !expr.startsWith("#{")) { expr = "#{" + expr + "}"; } elContext.putContext(XWorkConverter.class, xworkConverter); elContext.putContext(CompoundRoot.class, root); // parse our expression - ValueExpression valueExpr = factory.createValueExpression( - elContext, expr, Object.class); + ValueExpression valueExpr = factory.createValueExpression(elContext, expr, Object.class); Object retVal = valueExpr.getValue(elContext); if (!Object.class.equals(asType)) { retVal = xworkConverter.convertValue(null, retVal, asType); @@ -156,18 +151,15 @@ setValue(expr, value, false); } - public void setValue(String expr, Object value, - boolean throwExceptionOnFailure) { + public void setValue(String expr, Object value, boolean throwExceptionOnFailure) { try { - if (expr != null && !expr.startsWith("${") - && !expr.startsWith("#{")) { + if (expr != null && !expr.startsWith("${") && !expr.startsWith("#{")) { expr = "#{" + expr + "}"; } elContext.putContext(XWorkConverter.class, xworkConverter); elContext.putContext(CompoundRoot.class, root); // parse our expression - ValueExpression valueExpr = factory.createValueExpression( - elContext, expr, Object.class); + ValueExpression valueExpr = factory.createValueExpression(elContext, expr, Object.class); valueExpr.setValue(elContext, value); } catch (ELException e) { if (throwExceptionOnFailure) { 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=832624&r1=832623&r2=832624&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 Wed Nov 4 00:00:08 2009 @@ -32,7 +32,7 @@ <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*</param> - <param name="setAcceptParamNames">[[\p{Graph}\s]&&[^,:=]]*</param> + <param name="acceptParamNames">[[\p{Graph}\s]&&[^:=]]*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> Added: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ReflectionProviderTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ReflectionProviderTest.java?rev=832624&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ReflectionProviderTest.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/ReflectionProviderTest.java Wed Nov 4 00:00:08 2009 @@ -0,0 +1,28 @@ +package org.apache.struts2.uelplugin; + +import com.opensymphony.xwork2.XWorkTestCase; +import com.opensymphony.xwork2.util.reflection.ReflectionProvider; + +import java.util.HashMap; + +public class ReflectionProviderTest extends XWorkTestCase { + private ReflectionProvider reflectionProvider; + + public void testGetSimple() { + TestObject obj = new TestObject(); + TestObject obj2 = new TestObject(); + obj2.setAge(100); + obj.setInner(obj2); + + assertSame(obj2, reflectionProvider.getValue("inner", new HashMap(), obj)); + assertEquals(100, reflectionProvider.getValue("inner.age", new HashMap(), obj)); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + + reflectionProvider = new UelReflectionProvider(); + container.inject(reflectionProvider); + } +} Added: 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=832624&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestObject.java (added) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/TestObject.java Wed Nov 4 00:00:08 2009 @@ -0,0 +1,53 @@ +package org.apache.struts2.uelplugin; + +import java.util.Date; +import java.util.Map; + + +public class TestObject { + private String value; + private int age; + private Date date; + private TestObject inner; + private Map parameters; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public TestObject getInner() { + return inner; + } + + public void setInner(TestObject inner) { + this.inner = inner; + } + + public Map getParameters() { + return parameters; + } + + public void setParameters(Map parameters) { + this.parameters = parameters; + } + } Modified: struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UelTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UelTest.java?rev=832624&r1=832623&r2=832624&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UelTest.java (original) +++ struts/sandbox/trunk/struts2-uel-plugin/src/test/java/org/apache/struts2/uelplugin/UelTest.java Wed Nov 4 00:00:08 2009 @@ -59,8 +59,24 @@ assertEquals("Hello World", value); stack.setValue("${age}", "56"); - String age = stack.findString("${age}"); - assertEquals("56", age); + Integer age = (Integer) stack.findValue("${age}"); + assertEquals(56, (int)age); + } + + public void testNestedFind() throws IllegalAccessException, + InvocationTargetException, NoSuchMethodException { + CompoundRoot root = new CompoundRoot(); + TestObject obj = new TestObject(); + TestObject obj2 = new TestObject(); + obj2.setAge(100); + obj.setInner(obj2); + root.add(obj); + + UelValueStack stack = new UelValueStack(factory, converter); + stack.setRoot(root); + + assertSame(obj2, stack.findValue("${inner}")); + assertEquals(100, stack.findValue("${inner.age}")); } public void testSetStringArray() throws IllegalAccessException, @@ -166,52 +182,4 @@ value = stack.findString("VALUENOTHERE"); assertNull(value); } - - public class TestObject { - private String value; - private int age; - private Date date; - private TestObject inner; - private Map parameters; - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } - - public TestObject getInner() { - return inner; - } - - public void setInner(TestObject inner) { - this.inner = inner; - } - - public Map getParameters() { - return parameters; - } - - public void setParameters(Map parameters) { - this.parameters = parameters; - } - } }