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/16 16:07:28 UTC

svn commit: r985940 - in /myfaces/core/trunk/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 14:07:28 2010
New Revision: 985940

URL: http://svn.apache.org/viewvc?rev=985940&view=rev
Log:
MYFACES-2873 Provide a way to change the order of ELResolvers

Added:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java   (with props)
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java   (with props)
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java   (with props)
Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java
    myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java?rev=985940&r1=985939&r2=985940&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java Mon Aug 16 14:07:28 2010
@@ -22,11 +22,11 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.el.CompositeELResolver;
 import javax.el.ELResolver;
 import javax.el.ExpressionFactory;
 import javax.faces.context.ExternalContext;
@@ -61,8 +61,8 @@ public class RuntimeConfig
     
     private String _facesVersion;
     
-    private CompositeELResolver facesConfigElResolvers;
-    private CompositeELResolver applicationElResolvers;
+    private List<ELResolver> facesConfigElResolvers;
+    private List<ELResolver> applicationElResolvers;
 
     private VariableResolver _variableResolver;
     private PropertyResolver _propertyResolver;
@@ -184,12 +184,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;
     }
@@ -198,12 +198,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;
     }

Added: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java?rev=985940&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java (added)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java Mon Aug 16 14:07:28 2010
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.el.unified;
+
+import java.util.Comparator;
+import java.util.List;
+
+import javax.el.ELResolver;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.config.RuntimeConfig;
+
+/**
+ * Comparator for ELResolvers that shifts the Resolvers from
+ * the faces-config to the front.
+ * 
+ * @author Jakob Korherr (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public class CustomFirstELResolverComparator implements Comparator<ELResolver>
+{
+    
+    private List<ELResolver> _facesConfigResolvers;
+    
+    public int compare(ELResolver r1, ELResolver r2)
+    {
+        List<ELResolver> facesConfigResolvers = _getFacesConfigElResolvers();
+        
+        boolean r1FromFacesConfig = facesConfigResolvers.contains(r1);
+        boolean r2FromFacesConfig = facesConfigResolvers.contains(r2);
+        
+        if (r1FromFacesConfig)
+        {
+            if (r2FromFacesConfig)
+            {
+                // both are from faces-config
+                return 0; // keep order
+            }
+            else
+            {
+                // only r1 is from faces-config
+                return -1;
+            }
+        }
+        else
+        {
+            if (r2FromFacesConfig)
+            {
+                // only r2 is from faces-config
+                return 1;
+            }
+            else
+            {
+                // neither r1 nor r2 are from faces-config
+                return 0; // keep order
+            }
+        }
+    }
+    
+    /**
+     * Returns a List of all ELResolvers from the faces-config.
+     * @return
+     */
+    private List<ELResolver> _getFacesConfigElResolvers()
+    {
+        if (_facesConfigResolvers == null)
+        {
+            ExternalContext externalContext
+                    = FacesContext.getCurrentInstance().getExternalContext();
+            RuntimeConfig runtimeConfig
+                    = RuntimeConfig.getCurrentInstance(externalContext);
+            _facesConfigResolvers 
+                    = runtimeConfig.getFacesConfigElResolvers();
+        }
+        
+        return _facesConfigResolvers;
+    }
+    
+}

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomFirstELResolverComparator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java?rev=985940&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java (added)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java Mon Aug 16 14:07:28 2010
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.el.unified;
+
+import java.util.Comparator;
+
+import javax.el.ELResolver;
+
+/**
+ * Comparator for ELResolvers that shifts the Resolvers from
+ * the faces-config to the back.
+ * 
+ * @author Jakob Korherr (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public class CustomLastELResolverComparator implements Comparator<ELResolver>
+{
+
+    private CustomFirstELResolverComparator _inverseResolver
+            = new CustomFirstELResolverComparator();
+    
+    public int compare(ELResolver r1, ELResolver r2)
+    {
+        return _inverseResolver.compare(r2, r1);
+    }
+
+}

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/CustomLastELResolverComparator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java?rev=985940&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java (added)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java Mon Aug 16 14:07:28 2010
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.el.unified;
+
+import java.util.Comparator;
+
+import javax.el.ELResolver;
+
+/**
+ * Comparator for ELResolvers that shifts the Resolver from OWB to the last place.
+ * 
+ * @author Jakob Korherr (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public class OpenWebBeansELResolverComparator implements Comparator<ELResolver>
+{
+    
+    public static final String OWB_RESOLVER = "org.apache.webbeans.el.WebBeansELResolver";
+
+    public int compare(ELResolver r1, ELResolver r2)
+    {
+        if (r1.getClass().getName().equals(OWB_RESOLVER))
+        {
+            return 1;
+        }
+        else if (r2.getClass().getName().equals(OWB_RESOLVER))
+        {
+            return -1;
+        }
+        return 0; // keep order
+    }
+    
+}

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/OpenWebBeansELResolverComparator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java?rev=985940&r1=985939&r2=985940&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderBase.java Mon Aug 16 14:07:28 2010
@@ -18,16 +18,25 @@
  */
 package org.apache.myfaces.el.unified;
 
-import org.apache.myfaces.config.RuntimeConfig;
-import org.apache.myfaces.el.convert.PropertyResolverToELResolver;
-import org.apache.myfaces.el.convert.VariableResolverToELResolver;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
-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 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;
+
 /**
  * @author Mathias Broekelmann (latest modification by $Author$)
  * @version $Revision$ $Date$
@@ -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 = "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)
@@ -47,37 +63,90 @@ public class ResolverBuilderBase
      * wrapper for the property resolver and the el resolvers added by {@link Application#addELResolver(ELResolver)}.
      * The resolvers where only added if they are not null
      * 
-     * @param elResolver
-     *            the composite el resolver to which the resolvers where added
+     * @param resolvers
      */
-    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
+     */
+    @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);
+            }
         }
     }
 
@@ -91,4 +160,4 @@ public class ResolverBuilderBase
         return new PropertyResolverToELResolver(resolver);
     }
 
-}
\ No newline at end of file
+}

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java?rev=985940&r1=985939&r2=985940&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForFaces.java Mon Aug 16 14:07:28 2010
@@ -18,9 +18,13 @@
  */
 package org.apache.myfaces.el.unified;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.el.ArrayELResolver;
 import javax.el.BeanELResolver;
 import javax.el.CompositeELResolver;
+import javax.el.ELResolver;
 import javax.el.ListELResolver;
 import javax.el.MapELResolver;
 import javax.el.ResourceBundleELResolver;
@@ -40,7 +44,6 @@ import org.apache.myfaces.el.unified.res
  * @author Mathias Broekelmann (latest modification by $Author$)
  * @version $Revision$ $Date$
  */
-@SuppressWarnings("deprecation")
 public class ResolverBuilderForFaces extends ResolverBuilderBase implements ELResolverBuilder
 {
     public ResolverBuilderForFaces(RuntimeConfig config)
@@ -48,25 +51,40 @@ public class ResolverBuilderForFaces ext
         super(config);
     }
 
-    public void build(CompositeELResolver elResolver)
+    public void build(CompositeELResolver compositeElResolver)
     {
-        elResolver.add(ImplicitObjectResolver.makeResolverForFaces());
-        elResolver.add (new CompositeComponentELResolver());
+        // add the ELResolvers to a List first to be able to sort them
+        List<ELResolver> list = new ArrayList<ELResolver>();
+        
+        list.add(ImplicitObjectResolver.makeResolverForFaces());
+        list.add(new CompositeComponentELResolver());
 
-        addFromRuntimeConfig(elResolver);
+        addFromRuntimeConfig(list);
 
         //Flash object is instanceof Map, so it is necessary to resolve
         //before MapELResolver. Better to put this one before
-        elResolver.add(new FlashELResolver());
-        elResolver.add(new ManagedBeanResolver());
-        elResolver.add(new ResourceResolver());
-        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());
+        list.add(new FlashELResolver());
+        list.add(new ManagedBeanResolver());
+        list.add(new ResourceResolver());
+        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/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java?rev=985940&r1=985939&r2=985940&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/el/unified/ResolverBuilderForJSP.java Mon Aug 16 14:07:28 2010
@@ -18,7 +18,11 @@
  */
 package org.apache.myfaces.el.unified;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.el.CompositeELResolver;
+import javax.el.ELResolver;
 
 import org.apache.myfaces.config.RuntimeConfig;
 import org.apache.myfaces.el.FlashELResolver;
@@ -33,7 +37,6 @@ import org.apache.myfaces.el.unified.res
  * @author Mathias Broekelmann (latest modification by $Author$)
  * @version $Revision$ $Date$
  */
-@SuppressWarnings("deprecation")
 public class ResolverBuilderForJSP extends ResolverBuilderBase implements ELResolverBuilder
 {
     public ResolverBuilderForJSP(RuntimeConfig config)
@@ -41,17 +44,29 @@ public class ResolverBuilderForJSP exten
         super(config);
     }
 
-    public void build(CompositeELResolver elResolver)
+    public void build(CompositeELResolver compositeElResolver)
     {
-        elResolver.add(ImplicitObjectResolver.makeResolverForJSP());
+        // add the ELResolvers to a List first to be able to sort them
+        List<ELResolver> list = new ArrayList<ELResolver>();
+        
+        list.add(ImplicitObjectResolver.makeResolverForJSP());
         //Flash object is instanceof Map, so it is necessary to resolve
         //before MapELResolver. Better to put this one before
-        elResolver.add(new FlashELResolver());        
-        elResolver.add(new ManagedBeanResolver());
-        elResolver.add(new ResourceBundleResolver());
-        elResolver.add(new ResourceResolver());
-
-        addFromRuntimeConfig(elResolver);
+        list.add(new FlashELResolver());        
+        list.add(new ManagedBeanResolver());
+        list.add(new ResourceBundleResolver());
+        list.add(new ResourceResolver());
+
+        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/trunk/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java?rev=985940&r1=985939&r2=985940&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/el/unified/ResolverBuilderBaseTest.java Mon Aug 16 14:07:28 2010
@@ -18,13 +18,12 @@
  */
 package org.apache.myfaces.el.unified;
 
-import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.getCurrentArguments;
-import static org.easymock.EasyMock.isA;
 
-import javax.el.CompositeELResolver;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import javax.el.ELResolver;
 import javax.faces.el.PropertyResolver;
 import javax.faces.el.VariableResolver;
@@ -32,7 +31,6 @@ import javax.faces.el.VariableResolver;
 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.junit.After;
@@ -50,7 +48,7 @@ public class ResolverBuilderBaseTest
     private IMocksControl _mocksControl;
     private RuntimeConfig _runtimeConfig;
     private ResolverBuilderBase _testImpl;
-    private CompositeELResolver _compositeELResolver;
+    private List<ELResolver> _resolvers;
     
     public ResolverBuilderBaseTest()
     {
@@ -61,8 +59,8 @@ public class ResolverBuilderBaseTest
     {
         _mocksControl = EasyMock.createNiceControl();
         _runtimeConfig = _mocksControl.createMock(RuntimeConfig.class);
-        _compositeELResolver = _mocksControl.createMock(CompositeELResolver.class);
         _testImpl = new ResolverBuilderBase(_runtimeConfig);
+        _resolvers = new ArrayList<ELResolver>();
     }
     
     @After
@@ -71,7 +69,7 @@ public class ResolverBuilderBaseTest
         _mocksControl = null;
         _runtimeConfig = null;
         _testImpl = null;
-        _compositeELResolver = null;
+        _resolvers = null;
     }
 
     /*
@@ -91,12 +89,11 @@ public class ResolverBuilderBaseTest
     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
@@ -104,11 +101,13 @@ public class ResolverBuilderBaseTest
     {
         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
@@ -116,11 +115,13 @@ public class ResolverBuilderBaseTest
     {
         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
@@ -128,11 +129,13 @@ public class ResolverBuilderBaseTest
     {
         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
@@ -140,44 +143,14 @@ public class ResolverBuilderBaseTest
     {
         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];
-            Assert.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];
-            Assert.assertEquals(_resolver, vr.getPropertyResolver());
-            return null;
-        }
+        PropertyResolverToELResolver elResolver
+                = (PropertyResolverToELResolver) _resolvers.get(0);
+        Assert.assertEquals(resolver, elResolver.getPropertyResolver());
     }
+
 }