Hi,
quite interesting ideas, but they have few glitches (inside).
Mario Ivankovits napsal(a):
Hi!
Sorry for the lenghty mail!! Maybe something for the upcoming MyFaces
Commons project.
To get rid of the AddResource oddities I thought about introducing a
new "resource dependency framework".
1) DefaultAddResource is slow in performance and I don't like it to
buffer the output at all
2) StreamingAddResource is a little bit better, but requires to cache
the styles requested on the server which is somehow tricky
3) DojoAddResource (in the sandbox) is a hack too
Also, solution 2 and 3 lazily request resources, which you might
sometimes see in rendering glitches on the client side, be it that the
page renders choppy due to script loading in the mid of the page, or
that the browser has to load the css and until then the visual
representation is not correct.
The idea is (if running in an environment which allows this (JSF >=
1.2, facelets) to:
a) scan the JSF tree after it has been created and before it is going
to be rendered
b) collect the required resources during creation of the tree
Both possibilities are in wrong place - if all resources were to be
caught, it has to scan tree after all modifications - after
INVOKE_APPLICATION phase.
both ways might require view-framework dependent hooks.
It is a shame that even in JSF 1.2 or Facelets there is no place
defined in the spec where to get access to the view once built but not
rendered yet. Maybe someone can bring this up in JSF 2.0?
Also b might need some investigation if this is somehow pluggable,
might also depend on the used framework.
For this to work I'd like to introduce a new interface called
something like
org.apache.myfaces.commons.renderkit.html.HtmlResourceDependencies
with a method like
public ResourceInfo[] getResources(UIComponent component)
where ResourceInfo is something like
ResourceInfo
{
String resource;
ResourcePosition position; (HEADER_BEGIN, BODY_END, not sure about
BODY_ONLOAD)
}
The Renderer has to implement that interface then.
Implementing interface would break TCK test of JSF spec.
With either a or b the getResources() method will be called and all
the required resources are collected.
Then, with help of our t:document, t:documentHead, t:documentBody
(maybe we need one more) it should be possible to render the resources
at the correct places.
Since all this happens during or after the compile-time of the view -
and depending how your view-framework is configured
(facelets.BUILD_BEFORE_RESTORE=true|false) all this might not work
well if the resources required depends on component value bindings.
But normally I think resources are static things, so it should be
possible to workaround that limitation.
To make resource requesting work even in pure JSF 1.1 environments I'd
enhance our default AddResource with
AddResource.loadResources(HtmlResourceDependencies renderer)
with everything setup correctly this is a noop, else it delegates to 1-3.
Wouldn't simple splitting output of whole page to 3 (or 4) independend
chunks do the trick (HTML example):
1st for whole head w/o finnishing </head> tag
2nd starting with </head> <body> to the inserting spot for styles (not
sure of this splitting)
3rd for whole body w/o ending tag </body>
4th ending body + html tags
Adding resources was simple appending style's output to relevant chunk then.
After all resources included and finnishing encoding all components,
simple combining of all chunks would make a whole page's output.
Best regards,
Zdenek