On 02/04/2010 09:25 AM, Vincent Massol wrote:
Hi devs,
I'm going to work on this and put the code in the xwiki-script module.
There's only Thomas who voiced his positive opinion on the proposal below. Could you
please let me know if you don't agree (or even if you do, actually).
Just to complement a bit the proposal here are what some existing mapping would become
(in Velocity for the example):
* $syntaxFactory --> $services.rendering.syntaxFactory
* $officeimporter --> $services.officeImporter.importer
* $ooconfig --> $services.officeImporter.openOfficeConfiguration
* $oomanager --> $services.officeImporter.openOfficeManager
* $captchaservice --> $services.captcha
Note 1: It might be good to split xwiki-officeimporter into 2 modules: one for the
importer and one for managing an openoffice server (xwiki-openoffice). In this case the
mapping would be:
* $officeimporter --> $services.officeImporter
* $ooconfig --> $services.openOffice.configuration
* $oomanager --> $services.openOffice.manager
+1, especially since the same OpenOffice server will be used by the
preview and by the exporter.
Note 2: It might be good to force the format
$services.<modulename>.<object to get>.<method> since otherwise it
would mean putting all the APIs into a single object. I'm not sure on this, we need to
decide.
+1
Note 3: I'll need to expose some new script APIs
from the xwiki-model module too to allow velocity scripts to manipulate Entity References,
so I propose:
* $services.model.referenceResolver.getCurrentResolver()/getDefaultResolver(), etc
* $services.model.referenceSerializer.getDefaultSerializer()/getCompactSerializer(), etc
+1
Note 4: In due time, we'll deprecate/remove $msg
and $util from the velocity context. When the new xwiki-localization module gets done,
it'll expose script APIs through $services.localization.*
And as a wiki macro, too.
Note 5: What do we do with Velocity Tools that are
exposed directly in the Velocity context? IMO we should leave them in the velo context
directly since they're not Script Services (they're only specific to velocity).
They should not be in the services, since they're not, but I think they
could go in $tools.list, $tools.regex, $tools.math...
Yes. A velocity tool is a helper tool that makes only
sense in
Velocity actually. Sometimes it's not easy to decide whether it should
be a velo tool or a service available from all scripting languages.
It's easy: does it do something complex that any scripting language
finds useful/needed? Or does it provide basic data manipulation that's
not available directly?
Note 6: $doc, $xwiki, $xcontext stay in the script
context for now. They'll be replaced one day by new model objects and $xwiki will be
replaced by $wiki and all non model services will be accessible through $services.*
+1
WDYT?
Thanks
-Vincent
On Aug 5, 2009, at 5:47 PM, Vincent Massol wrote:
> Hi,
>
> This is following the proposal done here some time ago:
>
http://markmail.org/message/nnybto3mluvp2rov
>
> Since we now have a generic Script notion we need to revisit it in that light. Also
we really need to implement it now since more and more components are put in the velocity
context (office importer, syntax factory, etc) and we need to bring some order.
>
> Here's a new generic proposal:
>
> Short term
> ========
>
> * The variable "services" is bound in the script context. For ex in
Velocity: $services
> * The Services object (ScriptServiceManager) has a ScriptService get(String
serviceName) method which returns the service
> * We use the namespace: services.<module name>.<method>. Each module
provides only one service entry point.
> * ScriptService interface (empty interface) represents a service to be bound in the
context
> * ScriptServiceManager.get() looks for all components of role ScriptService and
returns the component matching the the name as the component hint.
+1
> Ex:
>
> @Component("mymodule")
> public class MyModuleScriptService implements ScriptService,
MyModuleBusinessInterface
> {
> public void myMethod() {}
> }
>
> In script:
>
> {{velocity}}
> $services.mymodule.myMethod
> {{/velocity}}
>
> Medium term
> ==========
>
> * We handle @authorization(Authorization.PROGRAMMING) annotations to check for access
rights. To do this in ScriptServiceManager.get() we use a Dynamic Proxy to implement
MyModuleBusinessInterface (we probably need a ScriptService.getInterface() method to make
it unambiguous). The Dynamic Proxy checks the annotation before proxying to the real
object.
>
> WDYT?
>
> Thanks
> -Vincent
>
> PS: This is to answer Sergiu's question about where is
getAvailableParserSyntaxes() from my other mail... ;) Answer: It would be in
RenderingScriptService.
--
Sergiu Dumitriu
http://purl.org/net/sergiu/