On Tue, 2004-11-23 at 12:51 +0100, Daniel Fagerstrom wrote:
snip... 
> The main question now IMO is what tag framework we should base JXTG 2.0 
> on. The candidates that has been mentioned this far are: Jelly, the 
> taglib, Carsten's taglib and Jonas taglib (are there more alternatives). 
> I discussed Jelly with Carsten and the conclusion was that it doesn't 
> fit that well in Cocoon. I don't know Carsten's plans for his taglib. 
> Jonas need to some advertising of his taglib and explain how it relates 
> to the alternatives.

Hello, I didn't have the time to do a proper presentation of the
template transformer last week but I'll try to explain it a bit. First
of all let me say that I have updated the download and the new version
can be found at:
http://home.student.uu.se/j/joek8725/template.zip

The idea of the transformer is to be a replacement for JXTG. All JX tags
can easily be implemented as Tag classes. It supports JSTL expressions
using commons-el but not XPath (XPath support could perhaps be provided
using JSTLs ability to define functions). Expressions are also
converted using the conversion block discussed before.

Similar to taglib it allows extending by tag classes. These tags are
configured in sitemap.xmap (as opposed to taglib which does it in
cocoon.xconf) which allows for reconfiguration without restarting
cocoon.

Variables are done a wee bit differently to taglib. The transformer has
a stack of maps that contains all variables. The
TemplateObjectModelHelper populates the bottom Map. Tags can then
introduce new variable contexts by pushing and popping maps on the
stack. The variables in lower maps are still "gettable" but can be
overloaded by whatever variables the tags introduce in the new context.
As an example here is the ForTag:

public class ForTag extends AbstractTag {

    String var;
    int begin;
    int end;
    int step;
    RecordingConsumer recorder;

    public void start() {
        var = getAttribute("var", null);
        begin = evalInt(getAttribute("begin"));
        end = evalInt(getAttribute("end"));
        step = evalInt(getAttribute("step", "1"));

        recorder = new RecordingConsumer();
        transformer.pushConsumer(recorder);
    }

    public void end() {
        SaxBuffer buffer = recorder.getSaxBuffer();

        variables.push();
        for (int i = begin; i <= end; i+= step) {
            if (var != null)
                variables.put(var, new Integer(i));
            play(buffer);
        }
        variables.pop();
    }

}

As you can see in the end() method the variable context is first pushed
(which adds a Map on the stack) and later popped when the buffer has
been played.

Another feature visible from the sample above is that it allows tags to
do whatever it wants with the body content. The transformer keeps a
stack of consumers that tags operate on by pushing and popping.
Currently I've implemented a RecordingConsumer and an IgnoringConsumer
(which simple ignores the body content). 

To summarize the template transformer is basically a merge of the
features of taglib (tag classes) and jxtg (expression evaluation) with
the added benefit of object conversion.

Cheers Jonas





Reply via email to