Daniel Fagerstrom wrote:

Sylvain Wallez wrote:

Hi all,

While working on some new CForms stuff (Ajax suggest lists and fi:styling as attributes), I felt more and more limited by the reduced enviromnent that JXTG offers to macros.

Put it clearly, here's what I need to be accessible in macros:
- the service manager: I need to get a continuations knowing its ID


Don't like it, would prefer the accessor stuff that we discussed (and I started to implement). But as my focus will be on blocks for the near future I shouldn't block other peoples work, so go ahead.


Accessors are about an extended objet model, right? In this regard, I don't think giving access to the ServiceManager there is a good thing as it will make it generally accessible, although of course Accessors can be serviceable and use the manager to provide some data.

JXTG extensions, on the other hand, may want to access additional components providing access to information that is to be used by the template. I make here a distinction between extensions (macros, taglibs, etc) and the template itself, even if I agree that the distinction is subtle.

- knowing and changing the XMLConsumer to which the template is sending SAX events. I need this to cleanly implement fi:styling as attributes and ensure no fi:styling element exists if attributes are used.


Like it even less, it breaks SoC and I have some optimiztion ideas that I would to work on in the future that not would work together direct access to the XMLConsumer.

Could you give some example of what you need to do, so that we can see if there could be some more dclarative solution of it that we could add to JXTG?


Sure. Let's consider the <ft:widget> macro:
<jx:macro name="widget" targetNamespace="http://apache.org/cocoon/forms/1.0#template";>
     <jx:parameter name="id"/>
<jx:if test="${cformsHelper.pushWidget(id)}">
       <jx:set var="widget" value="${cformsHelper.peekWidget()}"/>
<jx:set var="cformsDummy" value="${cformsHelper.generateWidget(widget, macro.arguments)}"/>
       <jx:evalBody/>
<jx:set var="cformsDummy" value="${cformsHelper.flushRootAndPop()}"/>
     </jx:if>
   </jx:macro>

generateWidget() will use macro.arguments to automatically generate a <fi:styling> element. Now we would like also to ensure that the macro's body doesn't itself contain a <fi:styling>.

What that means is that the macro must be able to filter the SAX events produced by <jx:evalBody/>

Actually, having an optional content-handler argument to <jx:evalBody> may do the trick:

<jx:set var="cformsDummy" value="${cformsHelper.generateWidget(widget, macro.arguments)}"/>
       <jx:evalBody handler="${cformsHelper.getStylingChecker()}"/>
<jx:set var="cformsDummy" value="${cformsHelper.flushRootAndPop()}"/>

Does it sound better?

Sylvain

--
Sylvain Wallez                        Anyware Technologies
http://people.apache.org/~sylvain     http://www.anyware-tech.com
Apache Software Foundation Member     Research & Technology Director

Reply via email to