Author: musachy
Date: Wed Nov 4 00:00:08 2009
New Revision: 832624
URL:
http://svn.apache.org/viewvc?rev=832624&view=revLog:
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;
- }
- }
}