Infinite loop can occur when custom FacesContext subclass compiled against 
JSF1.1 but used with JSF1.2
------------------------------------------------------------------------------------------------------

                 Key: MYFACES-1820
                 URL: https://issues.apache.org/jira/browse/MYFACES-1820
             Project: MyFaces Core
          Issue Type: Bug
          Components: JSR-252
    Affects Versions: 1.2.2
            Reporter: Simon Kitching


The problem is method FacesContext.getELContext. JSF1.2 added a method to this 
base class that was not there in JSF1.1. This makes life difficult for existing 
JSF1.1 code that already subclasses that class.

A default concrete implementation needs to exist, in order not to break 
existing JSF1.1 code, but (a) the current one gets it wrong, and (b) defining a 
correct one is difficult (impossible?)

(1) Stan Silvert initially defined this method like this:

// The following concrete method was added for JSF 1.2.  
// It supplies a default 
// implementation that throws UnsupportedOperationException.  
// This allows old FacesContext implementations to still work.
public ELContext getELContext() {
    throw new UnsupportedOperationException();
}

(2) Dennis Byrne changed it to its current form:

public ELContext getELContext() {
  FacesContext ctx = getCurrentInstance();

  if (ctx == null)
      throw new NullPointerException(FacesContext.class.getName());

  ELContext elctx = ctx.getELContext();

  if (elctx == null)
      throw new UnsupportedOperationException();

  return elctx;
}


However (2) assumes that custom subclasses never set themselves as the current 
instance, instead only ever *delegating* to the "real" instance.
If someone's custom subclass of FacesContext ever calls 
setCurrentInstance(this), then an infinite loop will occur here.

And in fact, this is just what we get:

java.lang.StackOverflowError
        at java.lang.ThreadLocal$ThreadLocalMap.getEntry(ThreadLocal.java:357)
        at java.lang.ThreadLocal$ThreadLocalMap.access$000(ThreadLocal.java:242)
        at java.lang.ThreadLocal.get(ThreadLocal.java:127)
        at 
javax.faces.context.FacesContext.getCurrentInstance(FacesContext.java:98)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:35)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)
        at javax.faces.context.FacesContext.getELContext(FacesContext.java:40)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to