You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by ju...@apache.org on 2021/12/02 21:55:36 UTC
[jspwiki] 18/26: Delegate caching operations to CachingManager
This is an automated email from the ASF dual-hosted git repository.
juanpablo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jspwiki.git
commit a1d6b6f7cdb8a7525248403c950583b5cba984f2
Author: Juan Pablo Santos RodrÃguez <ju...@gmail.com>
AuthorDate: Thu Dec 2 17:05:48 2021 +0100
Delegate caching operations to CachingManager
---
.../org/apache/wiki/pages/DefaultPageManager.java | 13 +-
.../java/org/apache/wiki/pages/PageManager.java | 2 -
.../wiki/render/DefaultRenderingManager.java | 140 ++++++++-------------
.../org/apache/wiki/render/RenderingManager.java | 5 +-
4 files changed, 57 insertions(+), 103 deletions(-)
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java b/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
index 1186a3c..04a4adf 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
@@ -39,6 +39,7 @@ import org.apache.wiki.auth.WikiPrincipal;
import org.apache.wiki.auth.WikiSecurityException;
import org.apache.wiki.auth.acl.AclManager;
import org.apache.wiki.auth.user.UserProfile;
+import org.apache.wiki.cache.CachingManager;
import org.apache.wiki.diff.DifferenceManager;
import org.apache.wiki.event.WikiEvent;
import org.apache.wiki.event.WikiEventManager;
@@ -87,18 +88,12 @@ import java.util.concurrent.ConcurrentHashMap;
public class DefaultPageManager implements PageManager {
private static final Logger LOG = LogManager.getLogger( DefaultPageManager.class );
-
private final PageProvider m_provider;
-
private final Engine m_engine;
-
- protected final ConcurrentHashMap< String, PageLock > m_pageLocks = new ConcurrentHashMap<>();
-
private final int m_expiryTime;
-
- private LockReaper m_reaper;
-
+ protected final ConcurrentHashMap< String, PageLock > m_pageLocks = new ConcurrentHashMap<>();
private final PageSorter pageSorter = new PageSorter();
+ private LockReaper m_reaper;
/**
* Creates a new PageManager.
@@ -111,7 +106,7 @@ public class DefaultPageManager implements PageManager {
public DefaultPageManager(final Engine engine, final Properties props) throws NoSuchElementException, WikiException {
m_engine = engine;
final String classname;
- final boolean useCache = "true".equals( props.getProperty( PROP_USECACHE ) );
+ final boolean useCache = m_engine.getManager( CachingManager.class ).enabled( CachingManager.CACHE_PAGES );
m_expiryTime = TextUtil.parseIntParameter( props.getProperty( PROP_LOCKEXPIRY ), 60 );
// If user wants to use a cache, then we'll use the CachingProvider.
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
index ec031e8..f8ac7be 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
@@ -34,8 +34,6 @@ public interface PageManager extends WikiEventListener {
/** The property value for setting the current page provider. Value is {@value}. */
String PROP_PAGEPROVIDER = "jspwiki.pageProvider";
- /** The property value for setting the cache on/off. Value is {@value}. */
- String PROP_USECACHE = "jspwiki.usePageCache";
/** The property value for setting the amount of time before the page locks expire. Value is {@value}. */
String PROP_LOCKEXPIRY = "jspwiki.lockExpiryTime";
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java b/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
index 59ad3a7..2f7b38e 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
@@ -18,9 +18,6 @@
*/
package org.apache.wiki.render;
-import net.sf.ehcache.Cache;
-import net.sf.ehcache.CacheManager;
-import net.sf.ehcache.Element;
import org.apache.commons.lang3.time.StopWatch;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -36,6 +33,7 @@ import org.apache.wiki.api.exceptions.WikiException;
import org.apache.wiki.api.providers.PageProvider;
import org.apache.wiki.api.spi.Wiki;
import org.apache.wiki.attachment.AttachmentManager;
+import org.apache.wiki.cache.CachingManager;
import org.apache.wiki.event.WikiEvent;
import org.apache.wiki.event.WikiEventListener;
import org.apache.wiki.event.WikiEventManager;
@@ -61,20 +59,16 @@ import java.util.Properties;
* This class provides a facade towards the differing rendering routines. You should use the routines in this manager
* instead of the ones in Engine, if you don't want the different side effects to occur - such as WikiFilters.
* <p>
- * This class also manages a rendering cache, i.e. documents are stored between calls. You may control the cache by
- * tweaking the ehcache.xml file.
+ * This class also delegates to a rendering cache, i.e. documents are stored between calls. You may control the cache by
+ * tweaking the ehcache configuration file.
* <p>
*
* @since 2.4
*/
public class DefaultRenderingManager implements RenderingManager {
- private static final Logger log = LogManager.getLogger( DefaultRenderingManager.class );
-
- /** The capacity of the caches, if you want something else, tweak ehcache.xml. */
- private static final int DEFAULT_CACHESIZE = 1_000;
- private static final String VERSION_DELIMITER = "::";
-
+ private static final Logger LOG = LogManager.getLogger( DefaultRenderingManager.class );
+ private static final String VERSION_DELIMITER = "::";
/** The name of the default renderer. */
private static final String DEFAULT_PARSER = JSPWikiMarkupParser.class.getName();
/** The name of the default renderer. */
@@ -83,17 +77,11 @@ public class DefaultRenderingManager implements RenderingManager {
private static final String DEFAULT_WYSIWYG_RENDERER = WysiwygEditingRenderer.class.getName();
private Engine m_engine;
-
- private boolean m_useCache = true;
- private final CacheManager m_cacheManager = CacheManager.getInstance();
- private final int m_cacheExpiryPeriod = 24*60*60; // This can be relatively long
+ private CachingManager cachingManager;
/** If true, all titles will be cleaned. */
private boolean m_beautifyTitle;
- /** Stores the WikiDocuments that have been cached. */
- private Cache m_documentCache;
-
private Constructor< ? > m_rendererConstructor;
private Constructor< ? > m_rendererWysiwygConstructor;
private String m_markupParserClass = DEFAULT_PARSER;
@@ -107,27 +95,15 @@ public class DefaultRenderingManager implements RenderingManager {
@Override
public void initialize( final Engine engine, final Properties properties ) throws WikiException {
m_engine = engine;
+ cachingManager = m_engine.getManager( CachingManager.class );
m_markupParserClass = properties.getProperty( PROP_PARSER, DEFAULT_PARSER );
if( !ClassUtil.assignable( m_markupParserClass, MarkupParser.class.getName() ) ) {
- log.warn( "{} does not subclass {} reverting to default markup parser.", m_markupParserClass, MarkupParser.class.getName() );
+ LOG.warn( "{} does not subclass {} reverting to default markup parser.", m_markupParserClass, MarkupParser.class.getName() );
m_markupParserClass = DEFAULT_PARSER;
}
- log.info( "Using {} as markup parser.", m_markupParserClass );
+ LOG.info( "Using {} as markup parser.", m_markupParserClass );
m_beautifyTitle = TextUtil.getBooleanProperty( properties, PROP_BEAUTIFYTITLE, m_beautifyTitle );
- m_useCache = "true".equals( properties.getProperty( PageManager.PROP_USECACHE ) );
-
- if( m_useCache ) {
- final String documentCacheName = engine.getApplicationName() + "." + DOCUMENTCACHE_NAME;
- if( m_cacheManager.cacheExists( documentCacheName ) ) {
- m_documentCache = m_cacheManager.getCache( documentCacheName );
- } else {
- log.info( "cache with name {} not found in ehcache.xml, creating it with defaults.", documentCacheName );
- m_documentCache = new Cache( documentCacheName, DEFAULT_CACHESIZE, false, false, m_cacheExpiryPeriod, m_cacheExpiryPeriod );
- m_cacheManager.addCache( m_documentCache );
- }
- }
-
final String renderImplName = properties.getProperty( PROP_RENDERER, DEFAULT_RENDERER );
final String renderWysiwygImplName = properties.getProperty( PROP_WYSIWYG_RENDERER, DEFAULT_WYSIWYG_RENDERER );
@@ -135,7 +111,7 @@ public class DefaultRenderingManager implements RenderingManager {
m_rendererConstructor = initRenderer( renderImplName, rendererParams );
m_rendererWysiwygConstructor = initRenderer( renderWysiwygImplName, rendererParams );
- log.info( "Rendering content with {}.", renderImplName );
+ LOG.info( "Rendering content with {}.", renderImplName );
WikiEventManager.addWikiEventListener( m_engine.getManager( FilterManager.class ),this );
}
@@ -146,11 +122,11 @@ public class DefaultRenderingManager implements RenderingManager {
final Class< ? > clazz = Class.forName( renderImplName );
c = clazz.getConstructor( rendererParams );
} catch( final ClassNotFoundException e ) {
- log.error( "Unable to find WikiRenderer implementation " + renderImplName );
+ LOG.error( "Unable to find WikiRenderer implementation {}", renderImplName );
} catch( final SecurityException e ) {
- log.error( "Unable to access the WikiRenderer(WikiContext,WikiDocument) constructor for " + renderImplName );
+ LOG.error( "Unable to access the WikiRenderer(WikiContext,WikiDocument) constructor for {}", renderImplName );
} catch( final NoSuchMethodException e ) {
- log.error( "Unable to locate the WikiRenderer(WikiContext,WikiDocument) constructor for " + renderImplName );
+ LOG.error( "Unable to locate the WikiRenderer(WikiContext,WikiDocument) constructor for {}", renderImplName );
}
if( c == null ) {
throw new WikiException( "Failed to get WikiRenderer '" + renderImplName + "'." );
@@ -200,7 +176,7 @@ public class DefaultRenderingManager implements RenderingManager {
try {
return ClassUtil.getMappedObject( m_markupParserClass, context, new StringReader( pagedata ) );
} catch( final ReflectiveOperationException | IllegalArgumentException e ) {
- log.error( "unable to get an instance of " + m_markupParserClass + " (" + e.getMessage() + "), returning default markup parser.", e );
+ LOG.error( "unable to get an instance of {} ({}), returning default markup parser.", m_markupParserClass, e.getMessage(), e );
return new JSPWikiMarkupParser( context, new StringReader( pagedata ) );
}
}
@@ -216,42 +192,38 @@ public class DefaultRenderingManager implements RenderingManager {
context.getVariable( Context.VAR_EXECUTE_PLUGINS );
if( useCache( context ) ) {
- final Element element = m_documentCache.get( pageid );
- if ( element != null ) {
- final WikiDocument doc = ( WikiDocument )element.getObjectValue();
-
- //
+ final WikiDocument doc = cachingManager.get( CachingManager.CACHE_DOCUMENTS, pageid, () -> null );
+ if ( doc != null ) {
// This check is needed in case the different filters have actually changed the page data.
// FIXME: Figure out a faster method
if( pagedata.equals( doc.getPageData() ) ) {
- if( log.isDebugEnabled() ) {
- log.debug( "Using cached HTML for page " + pageid );
- }
+ LOG.debug( "Using cached HTML for page {}", pageid );
return doc;
}
- } else if( log.isDebugEnabled() ) {
- log.debug( "Re-rendering and storing " + pageid );
+ } else {
+ LOG.debug( "Re-rendering and storing {}", pageid );
}
}
- // Refresh the data content
+ // Refresh the data content
try {
final MarkupParser parser = getParser( context, pagedata );
final WikiDocument doc = parser.parse();
doc.setPageData( pagedata );
if( useCache( context ) ) {
- m_documentCache.put( new Element( pageid, doc ) );
+ cachingManager.put( CachingManager.CACHE_DOCUMENTS, pageid, doc );
}
return doc;
} catch( final IOException ex ) {
- log.error( "Unable to parse", ex );
+ LOG.error( "Unable to parse", ex );
}
return null;
}
boolean useCache( final Context context ) {
- return m_useCache && ContextEnum.PAGE_VIEW.getRequestContext().equals( context.getRequestContext() );
+ return cachingManager.enabled( CachingManager.CACHE_DOCUMENTS )
+ && ContextEnum.PAGE_VIEW.getRequestContext().equals( context.getRequestContext() );
}
/**
@@ -323,13 +295,11 @@ public class DefaultRenderingManager implements RenderingManager {
result = m_engine.getManager( FilterManager.class ).doPostTranslateFiltering( context, result );
}
} catch( final FilterException e ) {
- log.error( "page filter threw exception: ", e );
+ LOG.error( "page filter threw exception: ", e );
// FIXME: Don't yet know what to do
}
sw.stop();
- if( log.isDebugEnabled() ) {
- log.debug( "Page " + context.getRealPage().getName() + " rendered, took " + sw );
- }
+ LOG.debug( "Page {} rendered, took {}", context.getRealPage().getName(), sw );
return result;
}
@@ -348,7 +318,7 @@ public class DefaultRenderingManager implements RenderingManager {
String result = "";
if( pagedata == null ) {
- log.error("NULL pagedata to textToHTML()");
+ LOG.error( "NULL pagedata to textToHTML()" );
return null;
}
@@ -372,11 +342,9 @@ public class DefaultRenderingManager implements RenderingManager {
}
final WikiDocument doc = mp.parse();
-
// In some cases it's better just to parse, not to render
if( !justParse ) {
result = getHTML( context, doc );
-
if( runFilters && m_engine.getManager( FilterManager.class ) != null ) {
result = m_engine.getManager( FilterManager.class ).doPostTranslateFiltering( context, result );
}
@@ -384,13 +352,11 @@ public class DefaultRenderingManager implements RenderingManager {
sw.stop();
- if( log.isDebugEnabled() ) {
- log.debug( "Page " + context.getRealPage().getName() + " rendered, took " + sw );
- }
+ LOG.debug( "Page {} rendered, took {}", context.getRealPage().getName(), sw );
} catch( final IOException e ) {
- log.error( "Failed to scan page data: ", e );
+ LOG.error( "Failed to scan page data: ", e );
} catch( final FilterException e ) {
- log.error( "page filter threw exception: ", e );
+ LOG.error( "page filter threw exception: ", e );
// FIXME: Don't yet know what to do
}
@@ -420,7 +386,7 @@ public class DefaultRenderingManager implements RenderingManager {
try {
return ( T )rendererConstructor.newInstance( params );
} catch( final Exception e ) {
- log.error( "Unable to create WikiRenderer", e );
+ LOG.error( "Unable to create WikiRenderer", e );
}
return null;
}
@@ -434,32 +400,30 @@ public class DefaultRenderingManager implements RenderingManager {
*/
@Override
public void actionPerformed( final WikiEvent event ) {
- log.debug( "event received: " + event.toString() );
- if( m_useCache ) {
- if( ( event instanceof WikiPageEvent ) && ( event.getType() == WikiPageEvent.POST_SAVE_BEGIN ) ) {
- if( m_documentCache != null ) {
- final String pageName = ( ( WikiPageEvent ) event ).getPageName();
- m_documentCache.remove( pageName );
- final Collection< String > referringPages = m_engine.getManager( ReferenceManager.class ).findReferrers( pageName );
-
- //
- // Flush also those pages that refer to this page (if a nonexistent page
- // appears, we need to flush the HTML that refers to the now-existent page)
- //
- if( referringPages != null ) {
- for( final String page : referringPages ) {
- if( log.isDebugEnabled() ) {
- log.debug( "Flushing latest version of " + page );
- }
- // as there is a new version of the page expire both plugin and pluginless versions of the old page
- m_documentCache.remove( page + VERSION_DELIMITER + PageProvider.LATEST_VERSION + VERSION_DELIMITER + Boolean.FALSE );
- m_documentCache.remove( page + VERSION_DELIMITER + PageProvider.LATEST_VERSION + VERSION_DELIMITER + Boolean.TRUE );
- m_documentCache.remove( page + VERSION_DELIMITER + PageProvider.LATEST_VERSION + VERSION_DELIMITER + null );
- }
- }
+ LOG.debug( "event received: {}", event.toString() );
+ if( isBeginningAWikiPagePostSaveEventAndDocumentCacheIsEnabled( event ) ) {
+ final String pageName = ( ( WikiPageEvent ) event ).getPageName();
+ cachingManager.remove( CachingManager.CACHE_DOCUMENTS, pageName );
+ final Collection< String > referringPages = m_engine.getManager( ReferenceManager.class ).findReferrers( pageName );
+
+ // Flush also those pages that refer to this page (if a nonexistent page
+ // appears, we need to flush the HTML that refers to the now-existent page)
+ if( referringPages != null ) {
+ for( final String page : referringPages ) {
+ LOG.debug( "Flushing latest version of {}", page );
+ // as there is a new version of the page expire both plugin and pluginless versions of the old page
+ cachingManager.remove( CachingManager.CACHE_DOCUMENTS, page + VERSION_DELIMITER + PageProvider.LATEST_VERSION + VERSION_DELIMITER + Boolean.FALSE );
+ cachingManager.remove( CachingManager.CACHE_DOCUMENTS, page + VERSION_DELIMITER + PageProvider.LATEST_VERSION + VERSION_DELIMITER + Boolean.TRUE );
+ cachingManager.remove( CachingManager.CACHE_DOCUMENTS, page + VERSION_DELIMITER + PageProvider.LATEST_VERSION + VERSION_DELIMITER + null );
}
}
}
}
+ boolean isBeginningAWikiPagePostSaveEventAndDocumentCacheIsEnabled( final WikiEvent event ) {
+ return event instanceof WikiPageEvent
+ && event.getType() == WikiPageEvent.POST_SAVE_BEGIN
+ && cachingManager.enabled( CachingManager.CACHE_DOCUMENTS );
+ }
+
}
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java b/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
index 0ff10d9..be6a9bd 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
@@ -38,7 +38,7 @@ import java.io.IOException;
* instead of the ones in Engine, if you don't want the different side effects to occur - such as WikiFilters.
* <p>
* This class also manages a rendering cache, i.e. documents are stored between calls. You may control the cache by
- * tweaking the ehcache.xml file.
+ * tweaking the ehcache-jspwiki.xml file.
* <p>
*
* @since 2.4
@@ -56,9 +56,6 @@ public interface RenderingManager extends RenderApi, WikiEventListener, Internal
String PROP_BEAUTIFYTITLE = "jspwiki.breakTitleWithSpaces";
- /** Name of the regular page cache. */
- String DOCUMENTCACHE_NAME = "jspwiki.renderingCache";
-
/**
* Beautifies the title of the page by appending spaces in suitable places, if the user has so decreed in the properties when
* constructing this Engine. However, attachment names are only beautified by the name.