2014-05-13 19:10 GMT+02:00 Thomas Mortagne <thomas.morta...@xwiki.com>:

> On Tue, May 13, 2014 at 6:29 PM, Jeremie BOUSQUET
> <jeremie.bousq...@gmail.com> wrote:
> > 2014-05-13 17:53 GMT+02:00 Thomas Mortagne <thomas.morta...@xwiki.com>:
> >
> >> The ExecutionContext returned by execution.getContext(); comes from a
> >> ThreadLocal which means it's not a singleton associated to the main
> >> wiki but a new ExecutionContext generated for each http request.
> >>
> >
> > That is what I understood, but that means that for my component to
> operate
> > on correct wiki (in correct context), it should reassign his own
> "context"
> > member for each request - and not do it once at component initialization
> > time.
>
> I'm not sure I understand, are you talking about storing the
> XWikiContext in your component instance at init ?
>

Yes in fact it's what I did (the "this.context = " in my sample code). I
realize that I didn't think about it so much when I did it :)


>
> The XWikiContext should never ever be stored, instead you should
> always request the current one when you need it. Among other things
> the XWikiContext is not thread safe at all and is supposed to always
> be used in the Thread it's been created for.
>

Here I have to apologize because we already had this discussion here, and
you already suggested to use Provider<XWikiContext>, but I completely
forgot about it.

I suggest that the component tutorial could be updated around this context
stuff ?
http://platform.xwiki.org/xwiki/bin/view/DevGuide/WritingComponents#HTheXWikicontext

I would propose to replace:

"If you still need to access the old XWiki context, then you can get a
reference to it from the execution context, but you should not cast it to
an XWikiContext, which would pull the whole xwiki-core as a dependency, but
to a Map. You won't be able to access all the properties, like the current
user name or the URL factory, but you can access anything placed in the
internal map of the XWikiContext."

By:

"If you still need to access the old XWiki context, then you can get a
reference to it from an injected XWikiContext Provider, but you should not
cast it to an XWikiContext, which would pull the whole xwiki-core as a
dependency, but to a Map. You won't be able to access all the properties,
like the current user name or the URL factory, but you can access anything
placed in the internal map of the XWikiContext."

And to replace the sample code by:

"
/** Provides access to the XWiki context. Injected by the Component
Manager. */
    @Inject
    private Provider<XWikiContext> xcontextProvider;

    [...]

private void workWithTheContext()
 {
        Map<Object, Object> xwikiContext = (Map<Object, Object>)
xcontextProvider.get();
        // Do something with the XWiki context
 }"



>
> >
> >
> >>
> >> By the way you should really use Provider<XWikiContext> component
> instead.
> >>
> >
> > I will, thanks. Does it have a different/better behaviour or is just the
> > preferred way ?
> >
> >
> >> _______________________________________________
> >> users mailing list
> >> users@xwiki.org
> >> http://lists.xwiki.org/mailman/listinfo/users
> >>
> > _______________________________________________
> > users mailing list
> > users@xwiki.org
> > http://lists.xwiki.org/mailman/listinfo/users
>
>
>
> --
> Thomas Mortagne
> _______________________________________________
> users mailing list
> users@xwiki.org
> http://lists.xwiki.org/mailman/listinfo/users
>
_______________________________________________
users mailing list
users@xwiki.org
http://lists.xwiki.org/mailman/listinfo/users

Reply via email to