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.