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

Leonardo Uribe commented on MYFACES-2730:
-----------------------------------------

Hi Jakob

@delete svn files: It is good to know there are different opinions about it, 
but a discussion about that point only lead to a non sense "bizantine war". My 
suggestion about do not delete svn files is more a personal programming 
practice than a rule of thumb. According to Murphy's law, it is more often that 
you delete code that you really need that the opposite. In this case, the svn 
history of those files are important, as I'll show below.

Did you notice the part I said: "...MYFACES-2730-2.patch has an alternative I'm 
working on...."? The code I sended is not complete on purpose, because what I 
wanted is create a discussion about what is the community position and show an 
alternate way to do it and possible advantages/disadvantages and 
suggestions/tomatoes.

The reason I'm doing this issue is because I'm working to get a release of 
myfaces core 2.0.1 out and the code committed here causes a problem, because I 
can't start a release over a code that it is not tested. Please note I reverted 
the code but I created a patch with the committed changes, to take advantage of 
those changes and do not lose job. It is not possible to propose an alternative 
and see the differences without revert the code.

I saw the stuff related to ServletExternalContextImplBase, and I still maintain 
my position about it. That class only has sense if we want to override methods 
in StartupServletExternalContextImpl to throw exceptions, but the patch I 
sended does not suppose that, instead it tries to let as many code as possible 
working.

Now, some comments related to the solution I'm working on. At first, this is 
how FacesInitializer should looks like:

public interface FacesInitializer
{
    void initFaces(ServletContext servletContext);
    
    void destroyFaces(ServletContext servletContext);

    FacesContext initStartupFacesContext(ServletContext servletContext);
    
    void destroyStartupFacesContext(FacesContext facesContext);
        
    FacesContext initShutdownFacesContext(ServletContext servletContext);    

    void destroyShutdownFacesContext(FacesContext facesContext);
}

We need to add methods that initialize and destroy the FacesContext instance 
and implement them on AbstractFacesInitializer. In that way we provide a way to 
override the startup FacesContext/ExternalContext/ExceptionHandler.

Let's remember the history of why we need a startup FacesContext, checking the 
svn log. This is the list of related myfaces issues:

MYFACES-2358 System event system not working (to publish system events we need 
Application object)
MYFACES-2434 dummy request/response classes for system event listeners will 
break with Servlet 3.0 (note orchestra try to resolve EL Expressions on startup 
time)
MYFACES-2520 UnsupportedOperationException when launching Trinidad 2 w/ 
MyFaces2 in Jetty (note the call to 
ServletExternalContextImpl.getRequestContentType)

In few words, there is a chance that we end throwing exceptions on init time. 
When the code lookup a Factory, that triggers the creation of objects in other 
libraries that could think this is a real request. For example, the call to 
ServletExternalContextImpl.getRequestContentType. It seems orchestra try to 
resolve EL expressions, on FacesContext init, but with the new code we don't 
have this problem anymore. 

Note that StartupFacesContextImpl.setViewRoot() is called from init code, but 
to be strict that method should throw an UnsupportedOperationException. We need 
a ViewRoot to publish init/destroy events.

So, at this point we have three options:

- Throw UnsupportedOperationException "aggresively", and live with the 
possibility of find myfaces bugs on xxx or yyy lib by that reason, that could 
be prevented using dummy methods.
- Do not throw any UnsupportedOperationException, and instead implements dummy 
methods.
- Just throw UnsupportedOperationException when definitively does not have 
sense to use it, that means, methods that do something like  
ExternalContext.dispatch() or ExternalContext.redirect(), but be nice and 
return null, false or 0 on methods like ExternalContext.getRequestContentType() 
and so on.

Note that based on previous tests done, RI uses dummy methods and do not throw 
UnsupportedOperationException.

I'll check FacesContext and ExternalContext implementation to analyze in which 
cases we should throw UnsupportedOperationException and propose a patch to be 
discussed.

".....That's why I object committing any of your patches...."

I'll propose as many alternatives as I can imagine until find one that fits, 
but I reserve myself the right of change of opinion based on proper 
argumentation. My only interest is solve as many issues as possible.

best regards,

Leonardo Uribe

> FacesContext not available on application startup
> -------------------------------------------------
>
>                 Key: MYFACES-2730
>                 URL: https://issues.apache.org/jira/browse/MYFACES-2730
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-127, JSR-252, JSR-314
>    Affects Versions: 1.1.8, 1.2.9, 2.0.0
>            Reporter: Nick Belaevski
>            Assignee: Leonardo Uribe
>             Fix For: 2.0.2-SNAPSHOT
>
>         Attachments: MYFACES-2730-1.patch, MYFACES-2730-2.patch, 
> MYFACES-2730-revert.patch
>
>
> If custom ResourceHandler calls FacesContext.getCurrentInstance() in 
> constructor to read init parameters, null value is returned. This affects 
> latest MyFaces 2.0.0-SNAPSHOT. Mojarra 2.0 provides InitFacesContext in this 
> case.

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