[ 
https://issues.apache.org/jira/browse/MYFACES-1820?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12792138#action_12792138
 ] 

Leonardo Uribe commented on MYFACES-1820:
-----------------------------------------

Just as a side note, the latest code in trunk looks like this: 

    public ELContext getELContext()
    {
        // Do NOT use getCurrentInstance here. For FacesContext decorators that
        // register themselves as "the current instance" that will cause an
        // infinite loop. For FacesContext decorators that do not register
        // themselves as "the current instance", if they are themselves wrapped
        // by a decorator that *does* register itself, then an infinite loop
        // also occurs.
        //
        // As noted above, we really want to do something like
        //   ctx = getWrappedInstance();
        // where the subclass can return the object it is delegating to. 
        // As there is no such method, however, the best we can do is pass the
        // method call on to the first-registered FacesContext instance. That
        // instance will never be "this", as the real original FacesContext
        // object will provide a proper implementation of this method.
        FacesContext ctx = _firstInstance.get();

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

        ELContext elctx = ctx.getELContext();

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

        return elctx;
    }

maybe we could add an check for equals to prevent the infinite loop:

if (ctx == this)
{
    throw new UnsupportedOperationException();
}

I remember this error usually happens when FacesContext instances not 
implementing this method are called, but the current version should works.


> 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
>         Attachments: FacesContext.patch.txt, patch-1820.txt
>
>
> 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