Relocatable Resources support in Trinidad
-----------------------------------------

                 Key: TRINIDAD-1610
                 URL: https://issues.apache.org/jira/browse/TRINIDAD-1610
             Project: MyFaces Trinidad
          Issue Type: New Feature
          Components: Components
    Affects Versions: 2.0.0-core
            Reporter: Matthias Weßendorf
            Assignee: Matthias Weßendorf


in order to avoid dependency to h:head/body/form BUT be able to
support the "Relocatable Resources" feature, we should change our
renderers for "head", "body" and "form" to check
for any component resource(s) that has been targeted to one of these guys.

This would mean that something like this just works:
<tr:document
 xmlns="http://www.w3.org/1999/xhtml";
 xmlns:f="http://java.sun.com/jsf/core";
 xmlns:h="http://java.sun.com/jsf/html";
 xmlns:tr="http://myfaces.apache.org/trinidad";
 title="TESTER of Scripts">

   <h:outputScript target="body" name="myCoolBody.js"/>
   <h:outputScript target="head" name="anAwesomeHead.js"/>

</tr:document>
==> no need to add the nasty h:head/body.

The call inside of the renderer should be fairly simple:
...
   for(UIComponent comp :
context.getViewRoot().getComponentResources(context, "head"))
   {
     comp.encodeAll(context);
   }
...
Note: We need to render out these resources pretty much BEFORE we end
the particular HTML element (e.g.  "head", "body" or "form")...

In order to avoid duplicated code, I think we want to add a utility
which should be called from particular renderers, like on
CoreRenderer.java (part of the Trinidad API). This would allow
extensions to easily use this new API as well...

suggested change to CoreRenderer.java =>
 /**
  * Hook for rendering the component resources for the <code>target</code>.
  * @param context Current <code>FacesContext</code> object for this request.
  * @param target The target for the resources (e.g. head/body/form)
  *
  * @throws IOException
  */
 protected final void encodeComponentResources(
   FacesContext context,
   String       target) throws IOException
 {
   if(target != null)
   {
     UIViewRoot viewRoot = context.getViewRoot();
     for(UIComponent componentResource :
viewRoot.getComponentResources(context, target))
     {
       componentResource.encodeAll(context);
     }
   }
 }

As a matter of fact the HeadRenderer's encodeEnd() method would simply
look like:

 protected void encodeEnd(
   FacesContext        context,
   RenderingContext arc,
   UIComponent         comp,
   FacesBean           bean) throws IOException
 {
   ResponseWriter rw = context.getResponseWriter();

   // trigger the rendering of targeted resource
   // for the HEAD, on UIViewRoot - if there are
   // any...
   encodeComponentResources(context, "head");

   rw.endElement("head");
 }


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