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());
}
+
}