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 <[email protected]> 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.
