diff --git a/jspwiki-cache/src/main/java/org/apache/wiki/cache/CachingManager.java b/jspwiki-cache/src/main/java/org/apache/wiki/cache/CachingManager.java index 245e1efe73..feed2ecedf 100644 --- a/jspwiki-cache/src/main/java/org/apache/wiki/cache/CachingManager.java +++ b/jspwiki-cache/src/main/java/org/apache/wiki/cache/CachingManager.java @@ -19,6 +19,7 @@ Licensed to the Apache Software Foundation (ASF) under one package org.apache.wiki.cache; +import net.sf.ehcache.event.CacheEventListener; import org.apache.wiki.util.CheckedSupplier; import java.io.Serializable; @@ -121,4 +122,12 @@ public interface CachingManager { */ void remove( String cacheName, Serializable key ); + /** + * Register a listener to a cache + * + * @param cacheName The cache to which the listener should be registered + * @param listener cache listener to register + * @return true if the listener is being added and was not already added + */ + boolean registerListener( String cacheName, CacheEventListener listener ); } diff --git a/jspwiki-cache/src/main/java/org/apache/wiki/cache/EhcacheCachingManager.java b/jspwiki-cache/src/main/java/org/apache/wiki/cache/EhcacheCachingManager.java index a624f07345..dafbe345a3 100644 --- a/jspwiki-cache/src/main/java/org/apache/wiki/cache/EhcacheCachingManager.java +++ b/jspwiki-cache/src/main/java/org/apache/wiki/cache/EhcacheCachingManager.java @@ -21,6 +21,7 @@ Licensed to the Apache Software Foundation (ASF) under one import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; +import net.sf.ehcache.event.CacheEventListener; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.wiki.api.core.Engine; @@ -159,6 +160,16 @@ public void remove( final String cacheName, final Serializable key ) { } } + @Override + public boolean registerListener( final String cacheName, final CacheEventListener listener ) { + if (enabled(cacheName)) { + return cacheMap.get(cacheName).getCacheEventNotificationService().registerListener(listener); + } + return false; + } + + + boolean keyAndCacheAreNotNull( final String cacheName, final Serializable key ) { return enabled( cacheName ) && key != null; } diff --git a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingAttachmentProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingAttachmentProvider.java index e8523d0717..07cddc81c5 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingAttachmentProvider.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingAttachmentProvider.java @@ -18,6 +18,9 @@ Licensed to the Apache Software Foundation (ASF) under one */ package org.apache.wiki.providers; +import net.sf.ehcache.Ehcache; +import net.sf.ehcache.Element; +import net.sf.ehcache.event.CacheEventListenerAdapter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.wiki.api.core.Attachment; @@ -59,7 +62,7 @@ public class CachingAttachmentProvider implements AttachmentProvider { private AttachmentProvider provider; private CachingManager cachingManager; - private boolean allRequested; + private volatile boolean allRequested; private final AtomicLong attachments = new AtomicLong( 0L ); /** @@ -68,7 +71,13 @@ public class CachingAttachmentProvider implements AttachmentProvider { @Override public void initialize( final Engine engine, final Properties properties ) throws NoRequiredPropertyException, IOException { LOG.info( "Initing CachingAttachmentProvider" ); - cachingManager = engine.getManager( CachingManager.class ); + cachingManager = engine.getManager( CachingManager.class ); + cachingManager.registerListener( CachingManager.CACHE_PAGES, new CacheEventListenerAdapter() { + @Override + public void notifyElementExpired(Ehcache cache, Element element) { + allRequested = false; // signal that the cache no longer contains all elements... + } + }); // Find and initialize real provider. final String classname; diff --git a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java index 5b1260f468..a85a469f33 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java @@ -18,6 +18,9 @@ Licensed to the Apache Software Foundation (ASF) under one */ package org.apache.wiki.providers; +import net.sf.ehcache.Ehcache; +import net.sf.ehcache.Element; +import net.sf.ehcache.event.CacheEventListenerAdapter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.wiki.api.core.Context; @@ -67,7 +70,7 @@ public class CachingProvider implements PageProvider { private PageProvider provider; private Engine engine; - private boolean allRequested; + private volatile boolean allRequested; private final AtomicLong pages = new AtomicLong( 0L ); /** @@ -80,6 +83,12 @@ public void initialize( final Engine engine, final Properties properties ) throw // engine is used for getting the search engine this.engine = engine; cachingManager = this.engine.getManager( CachingManager.class ); + cachingManager.registerListener( CachingManager.CACHE_PAGES, new CacheEventListenerAdapter() { + @Override + public void notifyElementExpired(Ehcache cache, Element element) { + allRequested = false; // signal that the cache no longer contains all elements... + } + }); // Find and initialize real provider. final String classname;