You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by or...@apache.org on 2005/09/10 02:45:52 UTC
svn commit: r279924 -
/myfaces/impl/trunk/src/java/org/apache/myfaces/el/VariableResolverImpl.java
Author: oros
Date: Fri Sep 9 17:45:47 2005
New Revision: 279924
URL: http://svn.apache.org/viewcvs?rev=279924&view=rev
Log:
MYFACES-524: check for cyclic bean references causing a stack overflow when creating the beans
Modified:
myfaces/impl/trunk/src/java/org/apache/myfaces/el/VariableResolverImpl.java
Modified: myfaces/impl/trunk/src/java/org/apache/myfaces/el/VariableResolverImpl.java
URL: http://svn.apache.org/viewcvs/myfaces/impl/trunk/src/java/org/apache/myfaces/el/VariableResolverImpl.java?rev=279924&r1=279923&r2=279924&view=diff
==============================================================================
--- myfaces/impl/trunk/src/java/org/apache/myfaces/el/VariableResolverImpl.java (original)
+++ myfaces/impl/trunk/src/java/org/apache/myfaces/el/VariableResolverImpl.java Fri Sep 9 17:45:47 2005
@@ -17,11 +17,14 @@
import java.util.HashMap;
import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.el.ReferenceSyntaxException;
import javax.faces.el.VariableResolver;
+import javax.faces.FacesException;
import org.apache.myfaces.config.ManagedBeanBuilder;
import org.apache.myfaces.config.RuntimeConfig;
@@ -42,6 +45,7 @@
//~ Static fields/initializers -----------------------------------------------------------------
private static final Log log = LogFactory.getLog(VariableResolverImpl.class);
+ private static final String BEANS_UNDER_CONSTRUCTION = "org.apache.myfaces.config.beansUnderConstruction";
//~ Instance fields ----------------------------------------------------------------------------
@@ -289,7 +293,25 @@
if (mbc != null)
{
- obj = beanBuilder.buildManagedBean(facesContext, mbc);
+
+ // check for cyclic references
+ List beansUnderConstruction = (List)requestMap.get(BEANS_UNDER_CONSTRUCTION);
+ if (beansUnderConstruction == null) {
+ beansUnderConstruction = new ArrayList();
+ requestMap.put(BEANS_UNDER_CONSTRUCTION, beansUnderConstruction);
+ }
+
+ String managedBeanName = mbc.getManagedBeanName();
+ if (beansUnderConstruction.contains(managedBeanName)) {
+ throw new FacesException( "Detected cyclic reference to managedBean " + mbc.getManagedBeanName());
+ }
+
+ beansUnderConstruction.add(managedBeanName);
+ try {
+ obj = beanBuilder.buildManagedBean(facesContext, mbc);
+ } finally {
+ beansUnderConstruction.remove(managedBeanName);
+ }
// put in scope
String scopeKey = mbc.getManagedBeanScope();