[ 
https://issues.apache.org/jira/browse/TOMAHAWK-1472?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12805681#action_12805681
 ] 

Leonardo Uribe commented on TOMAHAWK-1472:
------------------------------------------

In order to provide the community a way to "contribute" or "hear" how will be 
tomahawk for jsf 2.0 module, it is better to do a full
discussion of this issue here.

First of all we need a comparison between Resource API and Tomahawk AddResource 
API, to identify possible problems of use one of another.

TOMAHAWK RESOURCE API

    The AddResource api is used for add and server resources. It is capable of 
serve static and dynamic resources. Below there is a list of
    the classes involved with a brief description of the purpose:
    
    AddResourceFactory: This class provides the ability to instantiate 
AddResource objects. By default it check if the environment is correctly set.
    
    AddResource: This interface defines methods necessary to render links to 
resources used by custom components. Mostly used to avoid having 
    to include [script src="..."][/script] in the head of the pages before 
using a component.
    
    ResourceLoader: A class which can interpret the URI generated by a 
corresponding ResourceHandler implementation, locate that resource 
    and write it to the servlet response stream.
    
    ResourceProvider: A class which can provide the resource itself. It 
represents a resource like Resource class in jsf 2.0, but it is used only
    on the algorithm that serve resources
    
    ResourceHandler: Represents a single resource that a component in a page 
needs a  browser to fetch. This class helps generate the URI 
    that is emitted into the page, and specifies the class that should be 
invoked to handle the request for that URI when the browser makes it.
    
    Below there is a list of components using AddResource api:
    
    t:inputCalendar
    t:inputDate
    t:captcha
    t:documentHead
    t:dojoInitializer
    t:inputHtml
    t:inputTextHelp
    t:jsValueChangeListener
    t:panelNavigation2
    t:jscookMenu
    t:selectManyPicklist
    t:popup
    t:schedule
    t:swapImage
    t:panelTab
    t:togglePanel
    t:tree
    t:tree2
    t:stylesheet
    
    It is possible to use several strategies to put resources in a web page:
    
    NonBufferingAddResource: Put the link or script directly on the web page, 
in other words, it inserts them into the body of the page instead. 
    Used in portlets.
    StreamingAddResource: Works like NonBufferingAddResource, but has a hack 
with t:documentHead to solve the problem with css styles on head section.
    DefaultAddResource:  When used together with the ExtensionsFilter, this 
class can allow components in the body of a page to emit script and stylesheet 
    references into the page head section. The relevant methods on this object 
simply queue the changes, and when the page is complete 
    the ExtensionsFilter calls back into this class to allow it to insert the 
commands into the buffered response.
    
    There are different ways to serve resources:
    
    MyFacesResourceLoader: Look the javascript file scanning the package 
"org.apache.myfaces.custom".
    StreamingResourceLoader: Allows the hack with t:documentHead to solve the 
problem with css styles.
    CAPTCHARenderer: Render the image used by t:captcha.

NEW JSF 2.0 RESOURCE API

    In JSF 2.0 a new api was introduced to solve the problem of Resource 
Handling. This tags were introduced in this version:
    
    h:head
    h:body
    h:outputScript
    h:outputStylesheet
    
    This tags DO NOT exists in JSP, because all new features are for facelets, 
now bundled with JSF. By default, it only handle static resources.

DISCUSSION

    If we load all resources used by components with the new api, pages created 
with JSF 1.2 or earlier will not work on JSP as is. We could implement 
    a variant of h:head, h:body, h:outputScript and h:outputStylesheet that 
works for jsp. t:head and t:body are easy but t:outputScript 
    and t:outputStylesheet cannot be relocated on the component tree, instead 
we need to create a "copy" to register it in UIViewRoot, using a 
    custom JSP Tag class.

    The current implementation of javax.faces.webapp.UIComponentELTag calls 
Application.createComponent(componentType) and 
    Application.createComponent(ValueExpression, FacesContext, componentType). 
The problem with this one is that renderers are not scanned 
    looking for ResourceDependency or ListenerFor annotations, but it is not a 
big deal, because we can put those annotations on component class
    instead.

    If someone wants to run tomahawk using its resource api, there is no 
technical reason why not run tomahawk12 with myfaces core 2.0 in JSP. 
    
    Use tomahawk resource api and the new jsf 2.0 resource api seems to be 
confusing. Finally we end in all renderers with the following:
 
    if (usingAddResourceApiOnComponents)
    {
        callAddResourceApiToLoadMyScriptOrStylesheet
    }
    
    but note the new api requires register resources before render view phase, 
so one choice could be registered on the component. If we use 
    addResourceApi and h:head or t:head we will end with duplicate resource 
references. At the end, it seems more easier add t:head 
    or h:head and do not use addResource api.

    In theory we can add resources on PreRenderViewEvent, instead of register 
resources using a ResourceDependency annotation. In this case, we
    need a check for duplicate resources.
    
CONCLUSION

    It seems deprecate tomahawk resource api and create a wrapper to handle 
dynamic resources the best way to go. We should not worry too much about JSP
    support, because it is possible to run applications with JSF 2.0 and 
tomahawk for JSF 1.2 in JSP mode. It's more the problems and the unnecessary 
    complexity than the real benefit. Also, port existing applications from JSP 
to Facelets is not very hard. If we do it in this way, it will be easier 
    for users to understand tomahawk code, because we KEEP THINGS SIMPLE!. The 
philosophy behind tomahawk is a jsf library simple to use, 
    easy to understand, and compatible with other libraries. Also, in the 
begining, tomahawk was called "myfaces extensions", so all components that needs
    some specific hack to run with myfaces core implementation are here (Ex: 
t:aliasBean) and this library has been a place to try and test myfaces core 
stuff.
    Backward compatibility is good but we have to move on. 

Suggestions, critics and tomatoes are welcome.

> Add Support for new Resource API in tomahawk 2.0 module
> -------------------------------------------------------
>
>                 Key: TOMAHAWK-1472
>                 URL: https://issues.apache.org/jira/browse/TOMAHAWK-1472
>             Project: MyFaces Tomahawk
>          Issue Type: Task
>            Reporter: Leonardo Uribe
>


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