On 15 Jan 2016 at 13:23:07, vinc...@massol.net 
(vinc...@massol.net(mailto:vinc...@massol.net)) wrote:

> Forget what I’ve said regarding the #try directive.
>  
> Actually the way to use it is:  
>  
> #try()  
> … wrap some script snipper, one or several calls…
> #end
> .. here only you can access the $exception binding.
>  
> Thus:  
>  
> * Wrapping the whole content to evaluate won’t work  
> * The Exception Catching Uberspector is really what we need. It’s more 
> fine-grained than the #try directive (or it’s equivalent if you use #try() 
> for each line of script calling methods).
>  
> In addition:  
>  
> * We provide script APIs in xwiki-commons too so if we want this best 
> practice of throwing exceptions in script APIs, we also need to make this 
> work in xwiki-commons when used outside of XWiki. Thus we need a solution 
> there too.  
> ** A) One solution would be to use XWiki’s Context and make the last 
> exception available with $xcontext.lastVelocityException but it’s not very 
> natural, I hope we can find a better solution
> ** B) Another solution is to move VelocityManager to commons in 
> xwiki-commons-velocity, offer a basic impl without skin support and override 
> it in xwiki-platform to add the platform-specific stuff.
>  
> I’ll start exploring B). Let me know if you don’t agree or if you have a 
> better idea. 

Actually VelocityManager is already in commons, it’s the impl that is in 
platform. So right now it will work for us; it just won’t work for users who 
use just commons. Like if you use the Rendering in standalone mode.

Thanks
-Vincent

> Thanks  
> -Vincent
>  
>  
> On 15 Jan 2016 at 12:15:41, vinc...@massol.net 
> (vinc...@massol.net(mailto:vinc...@massol.net)) wrote:
>  
> >
> > [snip]
> >
> > > > > > > >> > Hi devs,
> > > > > > > >> >
> > > > > > > >> > Right now our strategy is for script services and script 
> > > > > > > >> > APIs in general
> > > > > > > >> > to catch exceptions, store them and offer a getLastError() 
> > > > > > > >> > method to get
> > > > > > > >> > them (see
> > > > > > > >> > http://extensions.xwiki.org/xwiki/bin/view/Extension/Script+Module#HBestPractices
> > > > > > > >> > )
> > > > > > > >> >
> > > > > > > >> > However it would be much nicer to:
> > > > > > > >> > * Let our script services generate exceptions
> > > > > > > >> > * Offer a velocity script service to get the last exception 
> > > > > > > >> > raised by a
> > > > > > > >> > java call from velocity
> > > > > > > >> > * Implement this uberspector to catch the exceptions and to 
> > > > > > > >> > set them in
> > > > > > > >> > the execution context
> > > > > > > >> >
> > > > > > > >> > That should be quite easy to implement IMO.
> > > > > > > >> >
> > > > > > > >> > WDYT?
> > > > > > > >> >
> > > > > > > >>
> > > > > > > >> +1, it's a pain to call setLastError() everywhere there can be 
> > > > > > > >> an exception
> > > > > > > >> thrown, and we almost always forget to do it (for this reason).
> > > > > > > >>
> > > > > > > >> Note that we also have the #try() directive now.
> > > > > > > >
> > > > > > > > Yes, I should have mentioned that there’s indeed also this 
> > > > > > > > possibility:
> > > > > > > > * Have script API throw Exceptions
> > > > > > > > * Force velocity script users to wrap their code with the try 
> > > > > > > > directive when they need to catch exceptions
> > > > > > > >
> > > > > > > > I still believe that the use of the Exception-catching 
> > > > > > > > uberspector is better.
> > > > > > > >
> > > > > > > > WDYT?
> > > > > > >
> > > > > > > Does it mean you plan to get rid of new #try directive ? Because 
> > > > > > > it
> > > > > > > will be broken with this new uberspector.
> > > > > >
> > > > > > That’s a good point, I had not thought about the implementation at 
> > > > > > this stage.
> > > > > >
> > > > > > I think this could still work. When the #try directive is used I’d 
> > > > > > just have to setup some flag somewhere in Velocity and in the 
> > > > > > uberspector I could check if this flag is set and if so then don’t 
> > > > > > catch the exception.
> > > > >
> > > > >
> > > > > Actually, thinking more, I think you’re right and that the #try 
> > > > > directive plays exactly the same role as an Exception-catching 
> > > > > uberspector and I don’t see the need for the #try directive if we 
> > > > > provide an uberspector.
> > > > >
> > > > > So I’m proposing to deprecate it but still keep it for backward 
> > > > > compatibility for now (probably a full cycle).
> > > > >
> > > > > WDYT?
> > > >
> > > > Note that I’d like to change a bit the proposal and instead of making 
> > > > the exception available from a script service, I’d prefer to make it 
> > > > available as a known velocity binding such as $lastException. There’s 
> > > > no reason to use a script service since that would mean it would work 
> > > > for all scripts and in this case we only want it to work for Velocity.
> > > >
> > > > Since there’s no way to get the Velocity Context from within an 
> > > > uberspector, I’ll get it by using our Component Manager and get the 
> > > > VelocityManager component and call getVelocityContext()… If you know a 
> > > > better way, let me know.
> > >
> > > hmm… this would mean that I’d need to put this new uberspector in 
> > > xwiki-platform since VelocityManager is in platform ATM… (@Thomas: our 
> > > discussion of yesterday ;)).
> >
> >
> > There’s an alternative, which is to modify our implementation of 
> > VelocityEngine.evaluate() and decorate the source with a #try() directive 
> > so that it’s always called (and make sure that calling it nested won’t 
> > affect it for backward compat).
> >
> > This could be simpler to implement and doesn’t force us to move some 
> > velocity code to platform.
> >
> > WDYT?
> >
> > Thanks
> > -Vincent
> >
> > [snip]

_______________________________________________
devs mailing list
devs@xwiki.org
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to