Hello,
First, agreed with Thomas, we should make this generic and allow to
define macros with all script languages we support.
I started to give it a shot, I think this would really accelerate the
number of syntax 2.0 macro we can distribute (both written by us or
contributions).
Below my findings / questions :
1. Initialization (creating the MacroClass if not present already)
This is going to be very hard to do oustide xwiki-core. One thing is
that their is no store available as long as the main XWiki object is not
initialized, and some work is needed to make this happen without having
to wait for the first HTTP request (and even if we do that, we have the
problem with virtual wikis, for which we need to update the macro class
too). An alternative would be to create a component interface for code
that needs initialization once a wiki is initialized (wiki store,
notification/observation manager, etc available) and lookup and call
initialization method for all implementations once a wiki is ready. Even
with this, we need bridges for adding class/class properties. I'm not
sure we want that really, I think having the component implementation in
the core too is a better option.
2. Querying documents that have a MacroClass object
We don't have a bridge for that. My take is that we should have an
interface like WikiMacroStore which default implementation would be in
xwiki-core, and once we have the new model & storage we reimplement it
in another place. The MacroManager would have this store as injected
dependency. Maybe this implentation in core could be responsible to
initialize the MacroClass too.
3. Observation
This is possible to have as a component implementation outside core, but
would mean having to add a version property to the DocumentModelBridge,
and overload methods from the DocumentAccessBridge adding a version
parameter, since we need to compare things (was there a MacroClass
object deleted ? etc.). I'm not very conviced by this, since its more
bridge code that will need to be changed later. Alternatives I see are
either a component implementation in core (maybe that WikiStore too)
that would subscribe to notifications, compare things upon notify, and
generate custom events that the MacroManager listens to (like
WikiMacroDeleted, WikiMacroChanged, etc.) It would mean the macro
manager component defines its own set of events. Third possibility is
that the macro store (or whatever thing we create to listens to analyze
macro related notifications in core) call itself the macro manager to
register/unregister macors. But I don't think it's right this way.
So at the end, I see the MacroManager as a component thats knows how to
register/unregister a "WikiScriptMacro" (in
xwiki-rendering-macro-script, that extends the AbstractScriptMacro)
implementation to/from the component manager. Upon initialization, it
asks a WikiMacroStore to return all active macros in the wiki and
register them. Then it listens to events from the observation manager to
load/unload when a new macro is created, a macro is deleted or loses its
programming right, etc.
As for where should it go, I think the rendering module is the best
option, tell me if I'm wrong. (At least not xwiki-velocity if it
supports several languages).
I did not started to look at parameters handling yet.
In advance, thanks for your feedback
Jerome.
PS: I created a JIRA issue for it:
http://jira.xwiki.org/jira/browse/XWIKI-3213
Thomas Mortagne wrote:
+1 for the general principal of using rendering api
from script in
place of velocity macros.
I would prefer a MacroClass which can support any script language.
Thanks to jsr223, the only difference with what you described is that
the macro content would be executed with a different engine depending
on a "language" field of the MacroClass (and the name of the class
would be different ;)). This field would be to "velocity" by default I
guess.
On Wed, Feb 4, 2009 at 8:41 AM, Vincent Massol <vincent(a)massol.net> wrote:
Hi,
We need to allow users to write macros using Velocity and still use
the same mechanism as the new rendering. Basically this means
transforming velocity macros into Rendering Macros. Once this is done
then the velocity macro will be able to be used as standard Rendering
Macros, they'll appear in the new WYSIWYG, etc.
Here's a proposal for doing so:
* Split xwiki-velocity/ module into 2
- xwiki-velocity-engine/ (the one currently in xwiki-velocity)
- xwiki-velocity-macro/ (the new one)
* In xwiki-velocity-macro create a VelocityMacroManager class that
does the following:
- initialize itself at xwiki startup
- create a VelocityMacroClass definition in the wiki if it doesn't
exist
- query the wiki for all objects of type VelocityMacroClass
- for each of them register them dynamically (we can already do
this) as a Rendering Macro
* The VelocityMacroClass has several fields:
- macro name, parameter names, parameters description, macro
description, usage example, velocity content to execute (the macro
content)
* The VelocityMacroManager register itself against the Observation
component to receive notifications whenever a VelocityMacroClass is
modified (added, removed, etc)
* Users will then be able to add velocity macros by simply creating a
new page, adding the VelocityMacroClass in it, fill the values.
* We should also provide a VelocityMacroClassSheet so that the macro
page containing the VelocityMacroClass can display the help for the
macro (self-standing)
The nice thing is that this keeps velocity macro handling in the xwiki-
velocity/ module and makes it completely optional (i.e. the wiki will
still work and there's no ties with this feature elsewhere).
WDYT?
Thanks
-Vincent
http://xwiki.com
http://xwiki.org
http://massol.net
_______________________________________________
devs mailing list
devs(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/devs