I think you should reconsider this, if I understood things correctly.

Api.getContext is a method that can be called from any velocity code, and the XWikiContext class should NOT be freely available.

Right. Ok, so what you're saying is that getContext should be protected instead of public?

Yep, that's the only solution I found this far.

I thought about this before implementing it but then the Api constructor is public and takes a XWikiContext object. Thus I guess what we are really saying is that either we should use Context instead of XWikiContext and leave everything public or make the constructor and the getContext method protected.

No, Context is less powerful than XWikiCOntext, and you can't get the XWikiCOntext from the Context.

BTW c.x.XWiki and c.x.XWikiContext are already available from velocity/groovy through c.x.api.XWiki.getWiki() and c.x.api.Context.getContext(), but I guess this is not right too and needs to be fixed.

No, only for users having programming rights.

In summary:

- The Context.getContext() method can be accessed both from the velocity and java code only by the users having programming rights. It cannot be called from java without PR.
- The public Api.getContext() method can be freely called from either java or velocity, regardless of the rights.
- The protected Api.getContext() method can be freely called only from Java.

--
http://purl.org/net/sergiu