You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Ashish Jain (JIRA)" <de...@myfaces.apache.org> on 2009/12/17 11:50:18 UTC

[jira] Commented: (MYFACES-1820) Infinite loop can occur when custom FacesContext subclass compiled against JSF1.1 but used with JSF1.2

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

Ashish Jain commented on MYFACES-1820:
--------------------------------------

How is that this problem can be recreated??

> 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.