> Actually, extending is *not* the recommended way to do this, because
> it ties the implementations too tightly together.

I agreed this is to be avoided but I wasn't aware that its possible to
chain the ViewHandlers.

[snip]
 
> The key is that each implementation of ViewHandler should have a
> constructor that takes a ViewHandler argument.  As the JSF runtime is
> processing configuration files, it should be checking whether such a
> constructor exists.  If it does, the runtime will call *that*
> constructor (passing in the most recent "default" implementation) so
> that you can construct a *chain* of implementations that can add
> specialized behavior where relevant, or delegate to the previous
> implementation for all the regular use cases.

That changes things then.  I was reading up on ViewHandler but
everything I read kept mentioning that the "default" implementation
would be passed.  It wasn't clear that the meaning of "default" was
really "default as decorated so far."

A chain was what I was going to suggest for a spec revision but it
appears that this has already been anticipated ;-)

> Separating the two implementations allows a Shale user who is *not*
> using Tiles from having to pay any overhead at all for the fact that
> shales-tiles.jar is available (although, not in this webapp,
> obviously).  It also means that shale-tiles.jar (the interface layer)
> will have *zero* dependencies on Shale -- at least, once I clean up
> the localization thing -- so it can be used (with MyFaces or any other
> JSF implementation) without the rest of Shale.

I agree that you would want the ability to use TilesViewHandler
without the rest of Shale, that's why I figured ShaleViewHandler would
extend TilesViewHandler instead of the other way around.  Turns out
extension is not needed.

An interesting aspect of the decorator/chain pattern is that you need
to know a little bit about the internals of the ViewHandlers that your
are chaining together.  Its possible that there could be a conflict
between two ViewHandlers that want to do two different things in the
same interface method.  Also, I can envision situations where the
order of decoration might be important (not this case though.)

[snip]

Thanks for the clarifying this.

sean

Reply via email to