You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ja...@apache.org on 2010/08/17 01:18:38 UTC

svn commit: r986159 - in /myfaces/core/branches/1.2.x/impl/src: main/java/org/apache/myfaces/config/ main/java/org/apache/myfaces/el/unified/ test/java/org/apache/myfaces/el/unified/

Author: jakobk
Date: Mon Aug 16 23:18:37 2010
New Revision: 986159

URL: http://svn.apache.org/viewvc?rev=986159&view=rev
Log:
MYFACES-2873 Provide a way to change the order of ELResolvers (for 1.2.x)

Added:
    myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java
      - copied, changed from r985940, myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java
    myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java
      - copied, changed from r985940, myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java
    myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java
      - copied, changed from r985940, myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java
Modified:
    myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java
    myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java
    myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java
    myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java
    myfaces/core/branches/1.2.x/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java

Modified: myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java?rev=986159&r1=986158&r2=986159&view=diff
==============================================================================
--- myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java Mon Aug 16 23:18:37 2010
@@ -18,11 +18,7 @@
  */
 package org.apache.myfaces.config;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import javax.el.CompositeELResolver;
 import javax.el.ELResolver;
@@ -58,8 +54,8 @@ public class RuntimeConfig
     private final Map<String, ResourceBundle> _resourceBundles = new HashMap<String, ResourceBundle>();
     private final Map<String, ManagedBean> _oldManagedBeans = new HashMap<String, ManagedBean>();
 
-    private CompositeELResolver facesConfigElResolvers;
-    private CompositeELResolver applicationElResolvers;
+    private List<ELResolver> facesConfigElResolvers;
+    private List<ELResolver> applicationElResolvers;
 
     private VariableResolver _variableResolver;
     private PropertyResolver _propertyResolver;
@@ -181,12 +177,12 @@ public class RuntimeConfig
     {
         if (facesConfigElResolvers == null)
         {
-            facesConfigElResolvers = new org.apache.myfaces.el.CompositeELResolver();
+            facesConfigElResolvers = new ArrayList<ELResolver>();
         }
         facesConfigElResolvers.add(resolver);
     }
 
-    public ELResolver getFacesConfigElResolvers()
+    public List<ELResolver> getFacesConfigElResolvers()
     {
         return facesConfigElResolvers;
     }
@@ -195,12 +191,12 @@ public class RuntimeConfig
     {
         if (applicationElResolvers == null)
         {
-            applicationElResolvers = new org.apache.myfaces.el.CompositeELResolver();
+            applicationElResolvers = new ArrayList<ELResolver>();
         }
         applicationElResolvers.add(resolver);
     }
 
-    public ELResolver getApplicationElResolvers()
+    public List<ELResolver> getApplicationElResolvers()
     {
         return applicationElResolvers;
     }

Copied: myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java (from r985940, myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java?p2=myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java&p1=myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java&r1=985940&r2=986159&rev=986159&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java Mon Aug 16 23:18:37 2010
@@ -33,6 +33,8 @@ import org.apache.myfaces.config.Runtime
  * 
  * @author Jakob Korherr (latest modification by $Author$)
  * @version $Revision$ $Date$
+ *
+ * @since 1.2.10, 2.0.2
  */
 public class CustomFirstELResolverComparator implements Comparator<ELResolver>
 {
@@ -42,6 +44,12 @@ public class CustomFirstELResolverCompar
     public int compare(ELResolver r1, ELResolver r2)
     {
         List<ELResolver> facesConfigResolvers = _getFacesConfigElResolvers();
+
+        if (facesConfigResolvers == null)
+        {
+            // no el-resolvers in faces-config
+            return 0; // keep order
+        }
         
         boolean r1FromFacesConfig = facesConfigResolvers.contains(r1);
         boolean r2FromFacesConfig = facesConfigResolvers.contains(r2);

Copied: myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java (from r985940, myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java?p2=myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java&p1=myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java&r1=985940&r2=986159&rev=986159&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java Mon Aug 16 23:18:37 2010
@@ -28,6 +28,8 @@ import javax.el.ELResolver;
  * 
  * @author Jakob Korherr (latest modification by $Author$)
  * @version $Revision$ $Date$
+ *
+ * @since 1.2.10, 2.0.2
  */
 public class CustomLastELResolverComparator implements Comparator<ELResolver>
 {

Copied: myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java (from r985940, myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java?p2=myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java&p1=myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java&r1=985940&r2=986159&rev=986159&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java Mon Aug 16 23:18:37 2010
@@ -27,6 +27,8 @@ import javax.el.ELResolver;
  * 
  * @author Jakob Korherr (latest modification by $Author$)
  * @version $Revision$ $Date$
+ *
+ * @since 1.2.10, 2.0.2
  */
 public class OpenWebBeansELResolverComparator implements Comparator<ELResolver>
 {

Modified: myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java?rev=986159&r1=986158&r2=986159&view=diff
==============================================================================
--- myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java Mon Aug 16 23:18:37 2010
@@ -18,15 +18,24 @@
  */
 package org.apache.myfaces.el.unified;
 
+import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
 import org.apache.myfaces.config.RuntimeConfig;
 import org.apache.myfaces.el.convert.PropertyResolverToELResolver;
 import org.apache.myfaces.el.convert.VariableResolverToELResolver;
+import org.apache.myfaces.shared_impl.util.ClassUtils;
 
 import javax.el.CompositeELResolver;
 import javax.el.ELResolver;
 import javax.faces.application.Application;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
 import javax.faces.el.PropertyResolver;
 import javax.faces.el.VariableResolver;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * @author Mathias Broekelmann (latest modification by $Author$)
@@ -35,6 +44,13 @@ import javax.faces.el.VariableResolver;
 @SuppressWarnings("deprecation")
 public class ResolverBuilderBase
 {
+    
+    private static final Logger log = Logger.getLogger(ResolverBuilderBase.class.getName());
+
+    @JSFWebConfigParam(since = "1.2.10, 2.0.2",
+            desc = "The Class of an Comparator<ELResolver> implementation.")
+    public static final String EL_RESOLVER_COMPARATOR = "org.apache.myfaces.EL_RESOLVER_COMPARATOR";
+
     private final RuntimeConfig _config;
 
     public ResolverBuilderBase(RuntimeConfig config)
@@ -50,34 +66,89 @@ public class ResolverBuilderBase
      * @param elResolver
      *            the composite el resolver to which the resolvers where added
      */
-    protected void addFromRuntimeConfig(CompositeELResolver elResolver)
+    protected void addFromRuntimeConfig(List<ELResolver> resolvers)
     {
         if (_config.getFacesConfigElResolvers() != null)
         {
-            elResolver.add(_config.getFacesConfigElResolvers());
+            for (ELResolver resolver : _config.getFacesConfigElResolvers())
+            {
+                resolvers.add(resolver);
+            }
         }
 
         if (_config.getVariableResolver() != null)
         {
-            elResolver.add(createELResolver(_config.getVariableResolver()));
+            resolvers.add(createELResolver(_config.getVariableResolver()));
         }
         else if (_config.getVariableResolverChainHead() != null)
         {
-            elResolver.add(createELResolver(_config.getVariableResolverChainHead()));
+            resolvers.add(createELResolver(_config.getVariableResolverChainHead()));
         }
 
         if (_config.getPropertyResolver() != null)
         {
-            elResolver.add(createELResolver(_config.getPropertyResolver()));
+            resolvers.add(createELResolver(_config.getPropertyResolver()));
         }
         else if (_config.getPropertyResolverChainHead() != null)
         {
-            elResolver.add(createELResolver(_config.getPropertyResolverChainHead()));
+            resolvers.add(createELResolver(_config.getPropertyResolverChainHead()));
         }
 
         if (_config.getApplicationElResolvers() != null)
         {
-            elResolver.add(_config.getApplicationElResolvers());
+            for (ELResolver resolver : _config.getApplicationElResolvers())
+            {
+                resolvers.add(resolver);
+            }
+        }
+    }
+
+    /**
+     * Sort the ELResolvers with a custom Comparator provided by the user.
+     * @param resolvers
+     * @since 1.2.10, 2.0.2
+     */
+    @SuppressWarnings("unchecked")
+    protected void sortELResolvers(List<ELResolver> resolvers)
+    {
+        ExternalContext externalContext
+                = FacesContext.getCurrentInstance().getExternalContext();
+
+        String comparatorClass = externalContext
+                .getInitParameter(EL_RESOLVER_COMPARATOR);
+
+        if (comparatorClass != null && !"".equals(comparatorClass))
+        {
+            // the user provided the parameter.
+
+            // if we already have a cached instance, use it
+            Comparator<ELResolver> comparator
+                    = (Comparator<ELResolver>) externalContext.
+                        getApplicationMap().get(EL_RESOLVER_COMPARATOR);
+            try
+            {
+                if (comparator == null)
+                {
+                    // get the comparator class
+                    Class<Comparator<ELResolver>> clazz
+                             = ClassUtils.classForName(comparatorClass);
+
+                    // create the instance
+                    comparator = clazz.newInstance();
+
+                    // cache the instance, because it will be used at least two times
+                    externalContext.getApplicationMap()
+                            .put(EL_RESOLVER_COMPARATOR, comparator);
+                }
+
+                // sort the resolvers
+                Collections.sort(resolvers, comparator);
+            }
+            catch (Exception e)
+            {
+                log.log(Level.WARNING,
+                        "Could not sort ELResolvers with custom Comparator", e);
+            }
         }
     }
 

Modified: myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java?rev=986159&r1=986158&r2=986159&view=diff
==============================================================================
--- myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java Mon Aug 16 23:18:37 2010
@@ -24,12 +24,9 @@ import org.apache.myfaces.el.unified.res
 import org.apache.myfaces.el.unified.resolver.ScopedAttributeResolver;
 import org.apache.myfaces.el.unified.resolver.implicitobject.ImplicitObjectResolver;
 
-import javax.el.ArrayELResolver;
-import javax.el.BeanELResolver;
-import javax.el.CompositeELResolver;
-import javax.el.ListELResolver;
-import javax.el.MapELResolver;
-import javax.el.ResourceBundleELResolver;
+import javax.el.*;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Create the el resolver for faces. see 1.2 spec section 5.6.2
@@ -45,20 +42,35 @@ public class ResolverBuilderForFaces ext
         super(config);
     }
 
-    public void build(CompositeELResolver elResolver)
+    public void build(CompositeELResolver compositeElResolver)
     {
-        elResolver.add(ImplicitObjectResolver.makeResolverForFaces());
-
-        addFromRuntimeConfig(elResolver);
-
-        elResolver.add(new ManagedBeanResolver());
-        elResolver.add(new ResourceBundleELResolver());
-        elResolver.add(new ResourceBundleResolver());
-        elResolver.add(new MapELResolver());
-        elResolver.add(new ListELResolver());
-        elResolver.add(new ArrayELResolver());
-        elResolver.add(new BeanELResolver());
-        elResolver.add(new ScopedAttributeResolver());
+        // add the ELResolvers to a List first to be able to sort them
+        List<ELResolver> list = new ArrayList<ELResolver>();
+        
+        list.add(ImplicitObjectResolver.makeResolverForFaces());
+
+        addFromRuntimeConfig(list);
+
+        list.add(new ManagedBeanResolver());
+        list.add(new ResourceBundleELResolver());
+        list.add(new ResourceBundleResolver());
+        list.add(new MapELResolver());
+        list.add(new ListELResolver());
+        list.add(new ArrayELResolver());
+        list.add(new BeanELResolver());
+
+        // give the user a chance to sort the resolvers
+        sortELResolvers(list);
+
+        // add the resolvers from the list to the CompositeELResolver
+        for (ELResolver resolver : list)
+        {
+            compositeElResolver.add(resolver);
+        }
+
+        // the ScopedAttributeResolver has to be the last one in every
+        // case, because it always sets propertyResolved to true (per the spec)
+        compositeElResolver.add(new ScopedAttributeResolver());
     }
 
 }

Modified: myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java?rev=986159&r1=986158&r2=986159&view=diff
==============================================================================
--- myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java Mon Aug 16 23:18:37 2010
@@ -24,6 +24,9 @@ import org.apache.myfaces.el.unified.res
 import org.apache.myfaces.el.unified.resolver.implicitobject.ImplicitObjectResolver;
 
 import javax.el.CompositeELResolver;
+import javax.el.ELResolver;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * build the el resolver for jsp. see 1.2 spec section 5.6.1
@@ -39,13 +42,25 @@ public class ResolverBuilderForJSP exten
         super(config);
     }
 
-    public void build(CompositeELResolver elResolver)
+    public void build(CompositeELResolver compositeElResolver)
     {
-        elResolver.add(ImplicitObjectResolver.makeResolverForJSP());
-        elResolver.add(new ManagedBeanResolver());
-        elResolver.add(new ResourceBundleResolver());
+        // add the ELResolvers to a List first to be able to sort them
+        List<ELResolver> list = new ArrayList<ELResolver>();
 
-        addFromRuntimeConfig(elResolver);
+        list.add(ImplicitObjectResolver.makeResolverForJSP());
+        list.add(new ManagedBeanResolver());
+        list.add(new ResourceBundleResolver());
+
+        addFromRuntimeConfig(list);
+
+        // give the user a chance to sort the resolvers
+        sortELResolvers(list);
+
+        // add the resolvers from the list to the CompositeELResolver
+        for (ELResolver resolver : list)
+        {
+            compositeElResolver.add(resolver);
+        }
     }
 
 }

Modified: myfaces/core/branches/1.2.x/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/1.2.x/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java?rev=986159&r1=986158&r2=986159&view=diff
==============================================================================
--- myfaces/core/branches/1.2.x/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java (original)
+++ myfaces/core/branches/1.2.x/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java Mon Aug 16 23:18:37 2010
@@ -19,44 +19,56 @@
 package org.apache.myfaces.el.unified;
 
 import static org.easymock.EasyMock.*;
-import static org.testng.Assert.assertEquals;
 
-import javax.el.CompositeELResolver;
 import javax.el.ELResolver;
 import javax.faces.el.PropertyResolver;
 import javax.faces.el.VariableResolver;
 
+import junit.framework.Assert;
+import junit.framework.TestCase;
 import org.apache.myfaces.config.RuntimeConfig;
 import org.apache.myfaces.el.convert.PropertyResolverToELResolver;
 import org.apache.myfaces.el.convert.VariableResolverToELResolver;
-import org.easymock.IAnswer;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * @author Mathias Broekelmann (latest modification by $Author$)
  * @version $Revision$ $Date$
  */
 @SuppressWarnings("deprecation")
-public class ResolverBuilderBaseTest
+public class ResolverBuilderBaseTest extends TestCase
 {
     private IMocksControl _mocksControl;
     private RuntimeConfig _runtimeConfig;
     private ResolverBuilderBase _testImpl;
-    private CompositeELResolver _compositeELResolver;
+    private List<ELResolver> _resolvers;
+
+    public ResolverBuilderBaseTest()
+    {
+    }
 
-    @BeforeMethod
-    void setUp()
+    public void setUp()
     {
         _mocksControl = EasyMock.createNiceControl();
         _runtimeConfig = _mocksControl.createMock(RuntimeConfig.class);
-        _compositeELResolver = _mocksControl.createMock(CompositeELResolver.class);
         _testImpl = new ResolverBuilderBase(_runtimeConfig);
+        _resolvers = new ArrayList<ELResolver>();
+    }
+
+    public void tearDown()
+    {
+        _mocksControl = null;
+        _runtimeConfig = null;
+        _testImpl = null;
+        _resolvers = null;
     }
 
-    @Test
+    /*
     public void testGetFacesConfigElResolvers() throws Exception
     {
         ELResolver resolver = _mocksControl.createMock(ELResolver.class);
@@ -66,99 +78,70 @@ public class ResolverBuilderBaseTest
         _mocksControl.replay();
         _testImpl.addFromRuntimeConfig(_compositeELResolver);
         _mocksControl.verify();
-    }
+    }*/
 
-    @Test
     public void testGetApplicationElResolvers() throws Exception
     {
         ELResolver resolver = _mocksControl.createMock(ELResolver.class);
-        expect(_runtimeConfig.getApplicationElResolvers()).andReturn(resolver).anyTimes();
-        _compositeELResolver = _mocksControl.createMock(CompositeELResolver.class);
-        _compositeELResolver.add(eq(resolver));
+        expect(_runtimeConfig.getApplicationElResolvers()).andReturn(Arrays.asList(resolver)).anyTimes();
         _mocksControl.replay();
-        _testImpl.addFromRuntimeConfig(_compositeELResolver);
+        _testImpl.addFromRuntimeConfig(_resolvers);
         _mocksControl.verify();
+        Assert.assertEquals(Arrays.asList(resolver), _resolvers);
     }
 
-    @Test
     public void testGetVariableResolver() throws Exception
     {
         VariableResolver resolver = _mocksControl.createMock(VariableResolver.class);
         expect(_runtimeConfig.getVariableResolver()).andReturn(resolver).anyTimes();
-        _compositeELResolver.add(isA(VariableResolverToELResolver.class));
-        expectLastCall().andAnswer(new VariableResolverToELResolverValidator(resolver));
         _mocksControl.replay();
-        _testImpl.addFromRuntimeConfig(_compositeELResolver);
+        _testImpl.addFromRuntimeConfig(_resolvers);
         _mocksControl.verify();
+
+        VariableResolverToELResolver elResolver
+                = (VariableResolverToELResolver) _resolvers.get(0);
+        Assert.assertEquals(resolver, elResolver.getVariableResolver());
     }
 
-    @Test
     public void testGetVariableResolverChainHead() throws Exception
     {
         VariableResolver resolver = _mocksControl.createMock(VariableResolver.class);
         EasyMock.expect(_runtimeConfig.getVariableResolverChainHead()).andReturn(resolver).anyTimes();
-        _compositeELResolver.add(isA(VariableResolverToELResolver.class));
-        expectLastCall().andAnswer(new VariableResolverToELResolverValidator(resolver));
         _mocksControl.replay();
-        _testImpl.addFromRuntimeConfig(_compositeELResolver);
+        _testImpl.addFromRuntimeConfig(_resolvers);
         _mocksControl.verify();
+
+        VariableResolverToELResolver elResolver
+                = (VariableResolverToELResolver) _resolvers.get(0);
+        Assert.assertEquals(resolver, elResolver.getVariableResolver());
     }
 
-    @Test
     public void testGetPropertyResolver() throws Exception
     {
         PropertyResolver resolver = _mocksControl.createMock(PropertyResolver.class);
         expect(_runtimeConfig.getPropertyResolver()).andReturn(resolver).anyTimes();
-        _compositeELResolver.add(isA(PropertyResolverToELResolver.class));
-        expectLastCall().andAnswer(new PropertyResolverToELResolverValidator(resolver));
         _mocksControl.replay();
-        _testImpl.addFromRuntimeConfig(_compositeELResolver);
+        _testImpl.addFromRuntimeConfig(_resolvers);
         _mocksControl.verify();
+
+        PropertyResolverToELResolver elResolver
+                = (PropertyResolverToELResolver) _resolvers.get(0);
+        Assert.assertEquals(resolver, elResolver.getPropertyResolver());
     }
 
-    @Test
     public void testGetPropertyResolverChainHead() throws Exception
     {
         PropertyResolver resolver = _mocksControl.createMock(PropertyResolver.class);
         EasyMock.expect(_runtimeConfig.getPropertyResolverChainHead()).andReturn(resolver).anyTimes();
-        _compositeELResolver.add(isA(PropertyResolverToELResolver.class));
-        expectLastCall().andAnswer(new PropertyResolverToELResolverValidator(resolver));
         _mocksControl.replay();
-        _testImpl.addFromRuntimeConfig(_compositeELResolver);
+        _testImpl.addFromRuntimeConfig(_resolvers);
         _mocksControl.verify();
-    }
 
-    private class VariableResolverToELResolverValidator implements IAnswer<Object>
-    {
-        private final VariableResolver _resolver;
 
-        private VariableResolverToELResolverValidator(VariableResolver resolver)
-        {
-            _resolver = resolver;
-        }
-
-        public Object answer() throws Throwable
-        {
-            VariableResolverToELResolver vr = (VariableResolverToELResolver) getCurrentArguments()[0];
-            assertEquals(_resolver, vr.getVariableResolver());
-            return null;
-        }
-    }
-
-    private class PropertyResolverToELResolverValidator implements IAnswer<Object>
-    {
-        private final PropertyResolver _resolver;
-
-        private PropertyResolverToELResolverValidator(PropertyResolver resolver)
-        {
-            _resolver = resolver;
-        }
-
-        public Object answer() throws Throwable
-        {
-            PropertyResolverToELResolver vr = (PropertyResolverToELResolver) getCurrentArguments()[0];
-            assertEquals(_resolver, vr.getPropertyResolver());
-            return null;
-        }
+        PropertyResolverToELResolver elResolver
+                = (PropertyResolverToELResolver) _resolvers.get(0);
+        Assert.assertEquals(resolver, elResolver.getPropertyResolver());
     }
+
 }
+