Hi Andrey,
On Fri, Apr 22, 2016 at 11:34 AM, abtv <andreybutov(a)mail.ru> wrote:
  I have XWiki and a separate app. I need to use my app
permissions in XWiki.
 XWiki uses security cache and asks my app for a particular permission only
 once. I need to make XWiki aware about permission changes in my app.
 I have several options:
 1. sometimes I invalidate cache in my application. I could call xwiki api
 to
 invalidate the whole xwiki cache when I invalidate my app cache.
 2. from time to time (say, every minute) make a REST call to my app. My app
 says if cache was invalidated. If it was I would like to invalidate xwiki
 cache.
 My questions are:
 1. how to invalidate the whole cache? I implemented
 CustomSecurityCacheInvalidator, but it seems like I can remove only
 separate
 entities there via `remove` call. As I understand I have to call `suspend`
 and then remove entities from the cache and then call `resume`, right? But
 SecurityCache has only `get` and `remove` methods for separate entities.
 
No you are wrong, the suspend / resume method that you have to implement
will be called by the SecurityCacheLoader to inform your invalidator  to
suspend his work. This happen each time the cache is affected.
When you evict a reference in the cache, you will effectively evict all its
dependencies… for example if you evict a space, all the documents in that
space are evicted as well, if you evict a user, all access decisions made
previously for that user is evicted, if you evict a group, all user of that
group (and therefore access decisions for those users) will be evicted.
Emptying the cache is equivalent to evicting the main wiki (farm). The
reference to the main wiki (farm) is easy to build, just pass a null
reference to the security reference factory.
  2. should I create a separate `Component` for
scheduler which will poll
 data
 from my app from time to time? I could start new thread there to ask my app
 on schedule and Inject CustomSecurityCacheInvalidator. Is it the right
 approach?
 
Well, the best would be that your external service trigger your invalidator
maybe through a REST service that generate events. If you base your work on
events, it is event easier, because you just have to override the
SecurityCacheRulesInvalidatorListener, and the suspend>resume aspect will
be managed for you. You just have to listen to your own event, that your
REST service would generate.
To create a REST service in XWiki, this could be as easy as writing a
scripted XWiki page for example.
Regarding events and listener, you can read:
http://extensions.xwiki.org/xwiki/bin/view/Extension/Observation+Module+Loc…
Regards,
 My class is here:
 @Component
 @Singleton
 public class CustomSecurityCacheInvalidator extends
 DefaultSecurityCacheRulesInvalidator {
     @Inject
     private SecurityCache securityCache;
     @Override
     public void suspend() {
         System.out.println("suspend!");
         super.suspend();
         //I can use securityCache here
     }
     @Override
     public void resume() {
         System.out.println("resume!");
         super.resume();
     }
 }
 --
 View this message in context:
 
http://xwiki.475771.n2.nabble.com/How-to-invalidate-security-cache-tp759913…
 Sent from the XWiki- Dev mailing list archive at 
Nabble.com.
 _______________________________________________
 devs mailing list
 devs(a)xwiki.org
 
http://lists.xwiki.org/mailman/listinfo/devs
 
--
Denis Gervalle
SOFTEC sa - CEO