Author: musachy
Date: Wed Nov  4 06:55:12 2009
New Revision: 832667

URL: http://svn.apache.org/viewvc?rev=832667&view=rev
Log:
add method el resolver

Added:
    
struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/PublicMethodResolver.java
Modified:
    
struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/CompoundRootELContext.java

Modified: 
struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/CompoundRootELContext.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/CompoundRootELContext.java?rev=832667&r1=832666&r2=832667&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/CompoundRootELContext.java
 (original)
+++ 
struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/CompoundRootELContext.java
 Wed Nov  4 06:55:12 2009
@@ -1,29 +1,23 @@
 package org.apache.struts2.uelplugin;
 
-import javax.el.ArrayELResolver;
-import javax.el.CompositeELResolver;
-import javax.el.ELContext;
-import javax.el.ELResolver;
-import javax.el.FunctionMapper;
-import javax.el.ListELResolver;
-import javax.el.MapELResolver;
-import javax.el.ResourceBundleELResolver;
-import javax.el.VariableMapper;
+import javax.el.*;
 
 import org.apache.struts2.uelplugin.elresolvers.CompoundRootELResolver;
 import org.apache.struts2.uelplugin.elresolvers.XWorkBeanELResolver;
+import org.apache.struts2.uelplugin.elresolvers.PublicMethodResolver;
+import de.odysseus.el.util.SimpleContext;
 
 
 /**
  * An implementation of SimpleContext that knows about the ValueStack's
  * CompoundRoot.
  */
-public class CompoundRootELContext extends ELContext {
-    private ELResolver DEFAULT_RESOLVER_READ_WRITE;
-
+public class CompoundRootELContext extends SimpleContext {
     public CompoundRootELContext() {
-        DEFAULT_RESOLVER_READ_WRITE = new CompositeELResolver() {
+        super(new CompositeELResolver() {
             {
+                add(new BeanELResolver());
+                add(new PublicMethodResolver());
                 add(new CompoundRootELResolver());
                 add(new ArrayELResolver(false));
                 add(new ListELResolver(false));
@@ -31,7 +25,7 @@
                 add(new ResourceBundleELResolver());
                 add(new XWorkBeanELResolver());
             }
-        };
+        });
     }
 
     @Override
@@ -40,11 +34,6 @@
     }
 
     @Override
-    public ELResolver getELResolver() {
-        return DEFAULT_RESOLVER_READ_WRITE;
-    }
-
-    @Override
     public FunctionMapper getFunctionMapper() {
         return null;
     }

Added: 
struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/PublicMethodResolver.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/PublicMethodResolver.java?rev=832667&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/PublicMethodResolver.java
 (added)
+++ 
struts/sandbox/trunk/struts2-uel-plugin/src/main/java/org/apache/struts2/uelplugin/elresolvers/PublicMethodResolver.java
 Wed Nov  4 06:55:12 2009
@@ -0,0 +1,66 @@
+package org.apache.struts2.uelplugin.elresolvers;
+
+import de.odysseus.el.misc.MethodInvocation;
+
+import javax.el.ELResolver;
+import javax.el.ELContext;
+import javax.el.PropertyNotWritableException;
+import java.lang.reflect.Method;
+import java.beans.FeatureDescriptor;
+import java.util.Iterator;
+
+public class PublicMethodResolver extends ELResolver {
+    private boolean match(MethodInvocation call, Method method) {
+        if (method.getName().equals(call.getName()) && method.getReturnType() 
!= void.class) {
+            if (call.getParamCount() == method.getParameterTypes().length) {
+                return true;
+            }
+            if (method.isVarArgs() && call.isVarArgs()) {
+                if (call.getParamCount() >= method.getParameterTypes().length 
- 1) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public Method getValue(ELContext context, Object base, Object prop) {
+        if (base != null && prop instanceof MethodInvocation) {
+            MethodInvocation call = (MethodInvocation) prop;
+            for (Method method : base.getClass().getMethods()) {
+                if (match(call, method)) {
+                    context.setPropertyResolved(true);
+                    return method;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void setValue(ELContext context, Object base, Object property, 
Object value) {
+        throw new PropertyNotWritableException();
+    }
+
+    @Override
+    public Class<?> getCommonPropertyType(ELContext context, Object base) {
+        return MethodInvocation.class;
+    }
+
+    @Override
+    public boolean isReadOnly(ELContext context, Object base, Object property) 
{
+        return true;
+    }
+
+    @Override
+    public Class<?> getType(ELContext context, Object base, Object property) {
+        return null;
+    }
+
+    @Override
+    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext 
context, Object base) {
+        return null;
+    }
+}
+


Reply via email to