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