You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@turbine.apache.org by gk...@apache.org on 2021/08/04 06:41:16 UTC

svn commit: r1076289 [14/25] - in /websites/production/turbine/content/fulcrum/fulcrum-cache: ./ apidocs/ apidocs/jquery/ apidocs/jquery/external/ apidocs/jquery/external/jquery/ apidocs/jquery/images/ apidocs/jquery/jszip-utils/ apidocs/jquery/jszip-u...

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/EHCacheService.java.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/EHCacheService.java.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/EHCacheService.java.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1,353 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>EHCacheService.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.source.html" class="el_package">org.apache.fulcrum.cache.impl</a> &gt; <span class="el_source">EHCac
 heService.java</span></div><h1>EHCacheService.java</h1><pre class="source lang-java linenums">package org.apache.fulcrum.cache.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * &quot;License&quot;); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.activity.Initializable;
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.fulcrum.cache.CachedObject;
+import org.apache.fulcrum.cache.GlobalCacheService;
+import org.apache.fulcrum.cache.ObjectExpiredException;
+import org.apache.fulcrum.cache.RefreshableCachedObject;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.Element;
+
+/**
+ * Default implementation of EHCacheService (Ehcache 2)
+ *
+ * @author &lt;a href=&quot;mailto:epughNOSPAM@opensourceconnections.com&quot;&gt;Eric Pugh&lt;/a&gt;
+ * @author &lt;a href=&quot;mailto:tv@apache.org&quot;&gt;Thomas Vandahl&lt;/a&gt;
+ *
+ */
+public class EHCacheService extends AbstractLogEnabled implements
+        GlobalCacheService, Runnable, Configurable, Disposable, Initializable, ThreadSafe
+{
+    /**
+     * Cache check frequency in Millis (1000 Millis = 1 second). Value must be &amp;gt;
+     * 0. Default = 5 seconds
+     */
+    public static final long DEFAULT_CACHE_CHECK_FREQUENCY = 5000; // 5 seconds
+
+    /**
+     * cacheCheckFrequency (default - 5 seconds)
+     */
+    private long cacheCheckFrequency;
+
+    /**
+     * Path name of the Ehcache configuration file
+     */
+    private String configFile;
+
+    /**
+     * Constant value which provides a cache name
+     */
+    private static final String DEFAULT_CACHE_NAME = &quot;fulcrum&quot;;
+
+    /**
+     * A cache name
+     */
+    private String cacheName;
+
+    /** thread for refreshing stale items in the cache */
+    private Thread refreshing;
+
+    /** flag to stop the housekeeping thread when the component is disposed. */
+    private boolean continueThread;
+
+    /** The EHCache manager instance */
+    private CacheManager cacheManager;
+
+    /** A cache instance */
+    private Cache cache;
+
+    public EHCacheService()
+<span class="fc" id="L91">    {</span>
+     
+<span class="fc" id="L93">    }</span>
+    // ---------------- Avalon Lifecycle Methods ---------------------
+
+    /**
+     * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
+     */
+    @Override
+    public void configure(Configuration config) throws ConfigurationException
+    {
+<span class="fc" id="L102">        this.cacheCheckFrequency = config.getChild(&quot;cacheCheckFrequency&quot;)</span>
+<span class="fc" id="L103">                .getValueAsLong(DEFAULT_CACHE_CHECK_FREQUENCY);</span>
+<span class="fc" id="L104">        this.cacheName = config.getChild(&quot;cacheName&quot;).getValue(DEFAULT_CACHE_NAME);</span>
+<span class="fc" id="L105">        this.configFile = config.getChild(&quot;configurationFile&quot;).getValue(null);</span>
+<span class="fc" id="L106">    }</span>
+
+    /**
+     * @see org.apache.avalon.framework.activity.Initializable#initialize()
+     */
+    @Override
+    public void initialize() throws Exception
+    {
+<span class="pc bpc" id="L114" title="1 of 2 branches missed.">        if (this.configFile == null)</span>
+        {
+<span class="fc" id="L116">            this.cacheManager = new CacheManager();</span>
+<span class="fc" id="L117">            this.cacheManager.addCache(this.cacheName);</span>
+        }
+        else
+        {
+<span class="nc" id="L121">            this.cacheManager = new CacheManager(this.configFile);</span>
+        }
+
+<span class="fc" id="L124">        this.cache = this.cacheManager.getCache(this.cacheName);</span>
+
+        // Start housekeeping thread.
+<span class="fc" id="L127">        this.continueThread = true;</span>
+<span class="fc" id="L128">        this.refreshing = new Thread(this);</span>
+
+        // Indicate that this is a system thread. JVM will quit only when
+        // there are no more active user threads. Settings threads spawned
+        // internally by Turbine as daemons allows commandline applications
+        // using Turbine to terminate in an orderly manner.
+<span class="fc" id="L134">        this.refreshing.setDaemon(true);</span>
+<span class="fc" id="L135">        this.refreshing.setName(&quot;EHCacheService Refreshing&quot;);</span>
+<span class="fc" id="L136">        this.refreshing.start();</span>
+
+<span class="fc" id="L138">        getLogger().debug(&quot;EHCacheService started!&quot;);</span>
+<span class="fc" id="L139">    }</span>
+
+    /**
+     * @see org.apache.avalon.framework.activity.Disposable#dispose()
+     */
+    @Override
+    public void dispose()
+    {
+<span class="fc" id="L147">        this.continueThread = false;</span>
+<span class="fc" id="L148">        this.refreshing.interrupt();</span>
+
+<span class="fc" id="L150">        this.cacheManager.shutdown();</span>
+<span class="fc" id="L151">        this.cacheManager = null;</span>
+<span class="fc" id="L152">        this.cache = null;</span>
+<span class="fc" id="L153">        getLogger().debug(&quot;EHCacheService stopped!&quot;);</span>
+<span class="fc" id="L154">    }</span>
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#addObject(java.lang.String, org.apache.fulcrum.cache.CachedObject)
+     */
+    @Override
+    public &lt;T&gt; void addObject(String objectId, CachedObject&lt;T&gt; object)
+    {
+<span class="fc" id="L162">        Element cacheElement = new Element(objectId, object);</span>
+
+<span class="pc bpc" id="L164" title="1 of 2 branches missed.">        if (object instanceof RefreshableCachedObject)</span>
+        {
+<span class="nc" id="L166">            cacheElement.setEternal(true);</span>
+        }
+        else
+        {
+<span class="fc" id="L170">            cacheElement.setEternal(false);</span>
+<span class="fc" id="L171">            cacheElement.setTimeToLive((int)(object.getExpires() + 500) / 1000);</span>
+        }
+
+<span class="fc" id="L174">        this.cache.put(cacheElement);</span>
+<span class="fc" id="L175">    }</span>
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#flushCache()
+     */
+    @Override
+    public void flushCache()
+    {
+<span class="fc" id="L183">        this.cache.removeAll();</span>
+<span class="fc" id="L184">    }</span>
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getCachedObjects()
+     */
+    @Override
+    public List&lt;CachedObject&lt;?&gt;&gt; getCachedObjects()
+    {
+<span class="fc" id="L192">        ArrayList&lt;CachedObject&lt;?&gt;&gt; values = new ArrayList&lt;CachedObject&lt;?&gt;&gt;();</span>
+
+<span class="fc bfc" id="L194" title="All 2 branches covered.">        for (String key : getKeys())</span>
+        {
+<span class="fc" id="L196">            Element cachedElement = this.cache.get(key);</span>
+
+<span class="pc bpc" id="L198" title="1 of 2 branches missed.">            if (cachedElement != null)</span>
+            {
+<span class="fc" id="L200">                values.add((CachedObject&lt;?&gt;)cachedElement.getObjectValue());</span>
+            }
+<span class="fc" id="L202">        }</span>
+
+<span class="fc" id="L204">        return values;</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getCacheSize()
+     */
+    @SuppressWarnings(&quot;deprecation&quot;)
+	@Override
+    public int getCacheSize() throws IOException
+    {
+<span class="nc" id="L214">        return (int)this.cache.calculateInMemorySize();</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getKeys()
+     */
+    @Override
+    public List&lt;String&gt; getKeys()
+    {
+        @SuppressWarnings(&quot;unchecked&quot;)
+<span class="fc" id="L224">        List&lt;String&gt; keysWithExpiryCheck = this.cache.getKeysWithExpiryCheck();</span>
+<span class="fc" id="L225">        return keysWithExpiryCheck;</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getNumberOfObjects()
+     */
+    @Override
+    public int getNumberOfObjects()
+    {
+<span class="fc" id="L234">        return getKeys().size();</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getObject(java.lang.String)
+     */
+    @Override
+    public &lt;T&gt; CachedObject&lt;T&gt; getObject(String objectId) throws ObjectExpiredException
+    {
+<span class="fc" id="L243">        Element cachedElement = this.cache.get(objectId);</span>
+
+<span class="fc bfc" id="L245" title="All 2 branches covered.">        if (cachedElement == null)</span>
+        {
+            // Not in the cache.
+<span class="fc" id="L248">            throw new ObjectExpiredException();</span>
+        }
+
+        @SuppressWarnings(&quot;unchecked&quot;)
+<span class="fc" id="L252">        CachedObject&lt;T&gt; cachedObject = (CachedObject&lt;T&gt;)cachedElement.getObjectValue();</span>
+
+<span class="pc bpc" id="L254" title="1 of 2 branches missed.">        if (cachedObject.isStale())</span>
+        {
+<span class="nc bnc" id="L256" title="All 2 branches missed.">            if (cachedObject instanceof RefreshableCachedObject)</span>
+            {
+<span class="nc" id="L258">                RefreshableCachedObject&lt;?&gt; refreshableCachedObject = (RefreshableCachedObject&lt;?&gt;) cachedObject;</span>
+<span class="nc bnc" id="L259" title="All 2 branches missed.">                if (refreshableCachedObject.isUntouched())</span>
+                {
+                    // Do not refresh an object that has exceeded TimeToLive
+<span class="nc" id="L262">                    removeObject(objectId);</span>
+<span class="nc" id="L263">                    throw new ObjectExpiredException();</span>
+                }
+
+                // Refresh Object
+<span class="nc" id="L267">                refreshableCachedObject.refresh();</span>
+<span class="nc bnc" id="L268" title="All 2 branches missed.">                if (refreshableCachedObject.isStale())</span>
+                {
+                    // Object is Expired, remove it from cache.
+<span class="nc" id="L271">                    removeObject(objectId);</span>
+<span class="nc" id="L272">                    throw new ObjectExpiredException();</span>
+                }
+<span class="nc" id="L274">            }</span>
+            else
+            {
+                // Expired.
+<span class="nc" id="L278">                removeObject(objectId);</span>
+<span class="nc" id="L279">                throw new ObjectExpiredException();</span>
+            }
+        }
+
+<span class="pc bpc" id="L283" title="1 of 2 branches missed.">        if (cachedObject instanceof RefreshableCachedObject)</span>
+        {
+            // notify it that it's being accessed.
+<span class="nc" id="L286">            RefreshableCachedObject&lt;?&gt; refreshableCachedObject = (RefreshableCachedObject&lt;?&gt;) cachedObject;</span>
+<span class="nc" id="L287">            refreshableCachedObject.touch();</span>
+        }
+
+<span class="fc" id="L290">        return cachedObject;</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#removeObject(java.lang.String)
+     */
+    @Override
+    public void removeObject(String objectId)
+    {
+<span class="fc" id="L299">        this.cache.remove(objectId);</span>
+<span class="fc" id="L300">    }</span>
+
+    /**
+     * Circle through the cache and refresh stale objects. Frequency is
+     * determined by the cacheCheckFrequency property.
+     */
+    @Override
+    public void run()
+    {
+<span class="pc bpc" id="L309" title="1 of 2 branches missed.">        while (this.continueThread)</span>
+        {
+            // Sleep for amount of time set in cacheCheckFrequency -
+            // default = 5 seconds.
+            try
+            {
+<span class="fc" id="L315">                Thread.sleep(this.cacheCheckFrequency);</span>
+            }
+<span class="fc" id="L317">            catch (InterruptedException exc)</span>
+            {
+<span class="pc bpc" id="L319" title="1 of 2 branches missed.">                if (!this.continueThread)</span>
+                {
+<span class="fc" id="L321">                    return;</span>
+                }
+<span class="fc" id="L323">            }</span>
+
+<span class="fc bfc" id="L325" title="All 2 branches covered.">            for (String key : getKeys())</span>
+            {
+<span class="fc" id="L327">                Element cachedElement = this.cache.get(key);</span>
+
+<span class="pc bpc" id="L329" title="1 of 2 branches missed.">                if (cachedElement == null)</span>
+                {
+<span class="nc" id="L331">                    this.cache.remove(key);</span>
+<span class="nc" id="L332">                    continue;</span>
+                }
+
+<span class="fc" id="L335">                Object object = cachedElement.getObjectValue();</span>
+
+<span class="pc bpc" id="L337" title="1 of 2 branches missed.">                if (object instanceof RefreshableCachedObject)</span>
+                {
+<span class="nc" id="L339">                    RefreshableCachedObject&lt;?&gt; refreshableObject = (RefreshableCachedObject&lt;?&gt;) object;</span>
+<span class="nc bnc" id="L340" title="All 2 branches missed.">                    if (refreshableObject.isUntouched())</span>
+                    {
+<span class="nc" id="L342">                        this.cache.remove(key);</span>
+                    }
+<span class="nc bnc" id="L344" title="All 2 branches missed.">                    else if (refreshableObject.isStale())</span>
+                    {
+<span class="nc" id="L346">                    	refreshableObject.refresh();</span>
+                    }
+                }
+<span class="fc" id="L349">            }</span>
+        }
+<span class="nc" id="L351">    }</span>
+}
+</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/JCSCacheService.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/JCSCacheService.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/JCSCacheService.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>JCSCacheService</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.html" class="el_package">org.apache.fulcrum.cache.impl</a> &gt; <span class="el_class">JCSCacheService</span></div><h1>JCSCacheService</h1><table class="coverage" cellspacing="0" id="coveragetable"><
 thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">139 of 425</td><td class="ctr2">67%</td><td class="bar">21 of 42</td><td class="ctr2">50%</td><td class="ctr1">16</td><td class="ctr2">35
 </td><td class="ctr1">33</td><td class="ctr2">108</td><td class="ctr1">1</td><td class="ctr2">14</td></tr></tfoot><tbody><tr><td id="a5"><a href="JCSCacheService.java.html#L348" class="el_method">getCacheSize()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="53" height="10" title="43" alt="43"/></td><td class="ctr2" id="c13">0%</td><td class="bar" id="d3"><img src="../jacoco-resources/redbar.gif" width="17" height="10" title="2" alt="2"/></td><td class="ctr2" id="e5">0%</td><td class="ctr1" id="f3">2</td><td class="ctr2" id="g5">2</td><td class="ctr1" id="h1">8</td><td class="ctr2" id="i4">8</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a8"><a href="JCSCacheService.java.html#L161" class="el_method">getObject(String)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="50" height="10" title="41" alt="41"/><img src="../jacoco-resources/greenbar.gif" width="25" height="10" title="21" alt="
 21"/></td><td class="ctr2" id="c12">33%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="68" height="10" title="8" alt="8"/><img src="../jacoco-resources/greenbar.gif" width="34" height="10" title="4" alt="4"/></td><td class="ctr2" id="e4">33%</td><td class="ctr1" id="f0">5</td><td class="ctr2" id="g1">7</td><td class="ctr1" id="h0">14</td><td class="ctr2" id="i0">20</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a0"><a href="JCSCacheService.java.html#L217" class="el_method">addObject(String, CachedObject)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="47" height="10" title="38" alt="38"/><img src="../jacoco-resources/greenbar.gif" width="72" height="10" title="59" alt="59"/></td><td class="ctr2" id="c11">60%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="25" height="10" title="3" alt="3"/><img src="../jacoco-resources/greenbar.gif" width="25" height="10" t
 itle="3" alt="3"/></td><td class="ctr2" id="e3">50%</td><td class="ctr1" id="f2">3</td><td class="ctr2" id="g2">4</td><td class="ctr1" id="h2">6</td><td class="ctr2" id="i1">18</td><td class="ctr1" id="j2">0</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a12"><a href="JCSCacheService.java.html#L299" class="el_method">run()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="21" height="10" title="17" alt="17"/><img src="../jacoco-resources/greenbar.gif" width="54" height="10" title="44" alt="44"/></td><td class="ctr2" id="c10">72%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="51" height="10" title="6" alt="6"/><img src="../jacoco-resources/greenbar.gif" width="68" height="10" title="8" alt="8"/></td><td class="ctr2" id="e2">57%</td><td class="ctr1" id="f1">4</td><td class="ctr2" id="g0">8</td><td class="ctr1" id="h3">5</td><td class="ctr2" id="i2">18</td><td class="ctr1" id="j3">0</td><td class="ctr2" id="k3">1</td></t
 r><tr><td id="a9"><a href="JCSCacheService.java.html#L120" class="el_method">initialize()</a></td><td class="bar" id="b4"><img src="../jacoco-resources/greenbar.gif" width="40" height="10" title="33" alt="33"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">0</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h4">0</td><td class="ctr2" id="i3">9</td><td class="ctr1" id="j4">0</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a4"><a href="JCSCacheService.java.html#L279" class="el_method">getCachedObjects()</a></td><td class="bar" id="b5"><img src="../jacoco-resources/greenbar.gif" width="40" height="10" title="33" alt="33"/></td><td class="ctr2" id="c1">100%</td><td class="bar" id="d4"><img src="../jacoco-resources/redbar.gif" width="8" height="10" title="1" alt="1"/><img src="../jacoco-resources/greenbar.gif" width="25" height="10" title="3" alt="3"/></td><td class="ctr2" id="e0">75%</td><td class="ctr1
 " id="f4">1</td><td class="ctr2" id="g3">3</td><td class="ctr1" id="h5">0</td><td class="ctr2" id="i5">7</td><td class="ctr1" id="j5">0</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a7"><a href="JCSCacheService.java.html#L373" class="el_method">getNumberOfObjects()</a></td><td class="bar" id="b6"><img src="../jacoco-resources/greenbar.gif" width="30" height="10" title="25" alt="25"/></td><td class="ctr2" id="c2">100%</td><td class="bar" id="d5"><img src="../jacoco-resources/redbar.gif" width="8" height="10" title="1" alt="1"/><img src="../jacoco-resources/greenbar.gif" width="25" height="10" title="3" alt="3"/></td><td class="ctr2" id="e1">75%</td><td class="ctr1" id="f5">1</td><td class="ctr2" id="g4">3</td><td class="ctr1" id="h6">0</td><td class="ctr2" id="i7">6</td><td class="ctr1" id="j6">0</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a1"><a href="JCSCacheService.java.html#L107" class="el_method">configure(Configuration)</a></td><td class="bar" id="b7"><img src="..
 /jacoco-resources/greenbar.gif" width="27" height="10" title="22" alt="22"/></td><td class="ctr2" id="c3">100%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">0</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">0</td><td class="ctr2" id="i8">5</td><td class="ctr1" id="j7">0</td><td class="ctr2" id="k7">1</td></tr><tr><td id="a2"><a href="JCSCacheService.java.html#L144" class="el_method">dispose()</a></td><td class="bar" id="b8"><img src="../jacoco-resources/greenbar.gif" width="23" height="10" title="19" alt="19"/></td><td class="ctr2" id="c4">100%</td><td class="bar" id="d8"/><td class="ctr2" id="e8">n/a</td><td class="ctr1" id="f8">0</td><td class="ctr2" id="g8">1</td><td class="ctr1" id="h8">0</td><td class="ctr2" id="i6">7</td><td class="ctr1" id="j8">0</td><td class="ctr2" id="k8">1</td></tr><tr><td id="a6"><a href="JCSCacheService.java.html#L268" class="el_method">getKeys()</a></td><td class="bar" id="b9"><img src="../jacoco-res
 ources/greenbar.gif" width="16" height="10" title="13" alt="13"/></td><td class="ctr2" id="c5">100%</td><td class="bar" id="d9"/><td class="ctr2" id="e9">n/a</td><td class="ctr1" id="f9">0</td><td class="ctr2" id="g9">1</td><td class="ctr1" id="h9">0</td><td class="ctr2" id="i9">3</td><td class="ctr1" id="j9">0</td><td class="ctr2" id="k9">1</td></tr><tr><td id="a11"><a href="JCSCacheService.java.html#L259" class="el_method">removeObject(String)</a></td><td class="bar" id="b10"><img src="../jacoco-resources/greenbar.gif" width="7" height="10" title="6" alt="6"/></td><td class="ctr2" id="c6">100%</td><td class="bar" id="d10"/><td class="ctr2" id="e10">n/a</td><td class="ctr1" id="f10">0</td><td class="ctr2" id="g10">1</td><td class="ctr1" id="h10">0</td><td class="ctr2" id="i10">2</td><td class="ctr1" id="j10">0</td><td class="ctr2" id="k10">1</td></tr><tr><td id="a3"><a href="JCSCacheService.java.html#L392" class="el_method">flushCache()</a></td><td class="bar" id="b11"><img src="..
 /jacoco-resources/greenbar.gif" width="6" height="10" title="5" alt="5"/></td><td class="ctr2" id="c7">100%</td><td class="bar" id="d11"/><td class="ctr2" id="e11">n/a</td><td class="ctr1" id="f11">0</td><td class="ctr2" id="g11">1</td><td class="ctr1" id="h11">0</td><td class="ctr2" id="i11">2</td><td class="ctr1" id="j11">0</td><td class="ctr2" id="k11">1</td></tr><tr><td id="a10"><a href="JCSCacheService.java.html#L95" class="el_method">JCSCacheService()</a></td><td class="bar" id="b12"><img src="../jacoco-resources/greenbar.gif" width="3" height="10" title="3" alt="3"/></td><td class="ctr2" id="c8">100%</td><td class="bar" id="d12"/><td class="ctr2" id="e12">n/a</td><td class="ctr1" id="f12">0</td><td class="ctr2" id="g12">1</td><td class="ctr1" id="h12">0</td><td class="ctr2" id="i12">2</td><td class="ctr1" id="j12">0</td><td class="ctr2" id="k12">1</td></tr><tr><td id="a13"><a href="JCSCacheService.java.html#L86" class="el_method">static {...}</a></td><td class="bar" id="b13">
 <img src="../jacoco-resources/greenbar.gif" width="3" height="10" title="3" alt="3"/></td><td class="ctr2" id="c9">100%</td><td class="bar" id="d13"/><td class="ctr2" id="e13">n/a</td><td class="ctr1" id="f13">0</td><td class="ctr2" id="g13">1</td><td class="ctr1" id="h13">0</td><td class="ctr2" id="i13">1</td><td class="ctr1" id="j13">0</td><td class="ctr2" id="k13">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/JCSCacheService.java.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/JCSCacheService.java.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/JCSCacheService.java.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1,395 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>JCSCacheService.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.source.html" class="el_package">org.apache.fulcrum.cache.impl</a> &gt; <span class="el_source">JCSC
 acheService.java</span></div><h1>JCSCacheService.java</h1><pre class="source lang-java linenums">package org.apache.fulcrum.cache.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * &quot;License&quot;); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.activity.Initializable;
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.commons.jcs3.JCS;
+import org.apache.commons.jcs3.access.GroupCacheAccess;
+import org.apache.commons.jcs3.access.exception.CacheException;
+import org.apache.commons.jcs3.engine.ElementAttributes;
+import org.apache.commons.jcs3.engine.control.CompositeCacheManager;
+import org.apache.fulcrum.cache.CachedObject;
+import org.apache.fulcrum.cache.GlobalCacheService;
+import org.apache.fulcrum.cache.ObjectExpiredException;
+import org.apache.fulcrum.cache.RefreshableCachedObject;
+
+/**
+ * Default implementation of JCSCacheService
+ *
+ * @author &lt;a href=&quot;mailto:tv@apache.org&quot;&gt;Thomas Vandahl&lt;/a&gt;
+ * @version $Id: JCSCacheService.java 1890338 2021-05-31 10:31:19Z gk $
+ */
+public class JCSCacheService extends AbstractLogEnabled implements
+        GlobalCacheService, Runnable, Configurable, Disposable, Initializable,
+        ThreadSafe
+{
+    /**
+     * Cache check frequency in Millis (1000 Millis = 1 second). Value must be &amp;gt;
+     * 0. Default = 5 seconds
+     */
+    public static final long DEFAULT_CACHE_CHECK_FREQUENCY = 5000; // 5 seconds
+
+    /**
+     * cacheCheckFrequency (default - 5 seconds)
+     */
+    private long cacheCheckFrequency;
+
+    /**
+     * Instance of the JCS cache
+     */
+    private GroupCacheAccess&lt;String, CachedObject&lt;?&gt;&gt; cacheManager;
+
+    /**
+     * JCS region to use
+     */
+    private String region;
+
+    /**
+     * Path name of the JCS configuration file
+     */
+    private String configFile;
+
+    /**
+     * Constant value which provides a group name
+     */
+<span class="fc" id="L86">    private static String group = &quot;default_group&quot;;</span>
+
+    /** thread for refreshing stale items in the cache */
+    private Thread refreshing;
+
+    /** flag to stop the housekeeping thread when the component is disposed. */
+    private boolean continueThread;
+    
+    public JCSCacheService()
+<span class="fc" id="L95">    {</span>
+        
+<span class="fc" id="L97">    }</span>
+
+    // ---------------- Avalon Lifecycle Methods ---------------------
+
+    /**
+     * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
+     */
+    @Override
+	public void configure(Configuration config) throws ConfigurationException
+    {
+<span class="fc" id="L107">        this.cacheCheckFrequency = config.getChild(&quot;cacheCheckFrequency&quot;)</span>
+<span class="fc" id="L108">                .getValueAsLong(DEFAULT_CACHE_CHECK_FREQUENCY);</span>
+<span class="fc" id="L109">        this.region = config.getChild(&quot;region&quot;).getValue(&quot;fulcrum&quot;);</span>
+<span class="fc" id="L110">        this.configFile = config.getChild(&quot;configurationFile&quot;).getValue(</span>
+                &quot;/cache.ccf&quot;);
+<span class="fc" id="L112">    }</span>
+
+    /**
+     * @see org.apache.avalon.framework.activity.Initializable#initialize()
+     */
+    @Override
+	public void initialize() throws Exception
+    {
+<span class="fc" id="L120">        JCS.setConfigFilename(this.configFile);</span>
+<span class="fc" id="L121">        this.cacheManager = JCS.getGroupCacheInstance(this.region);</span>
+
+        // Start housekeeping thread.
+<span class="fc" id="L124">        this.continueThread = true;</span>
+<span class="fc" id="L125">        this.refreshing = new Thread(this);</span>
+
+        // Indicate that this is a system thread. JVM will quit only when
+        // there are no more active user threads. Settings threads spawned
+        // internally by Turbine as daemons allows commandline applications
+        // using Turbine to terminate in an orderly manner.
+<span class="fc" id="L131">        this.refreshing.setDaemon(true);</span>
+<span class="fc" id="L132">        this.refreshing.setName(&quot;JCSCacheService Refreshing&quot;);</span>
+<span class="fc" id="L133">        this.refreshing.start();</span>
+
+<span class="fc" id="L135">        getLogger().debug(&quot;JCSCacheService started.&quot;);</span>
+<span class="fc" id="L136">    }</span>
+
+    /**
+     * @see org.apache.avalon.framework.activity.Disposable#dispose()
+     */
+    @Override
+	public void dispose()
+    {
+<span class="fc" id="L144">        this.continueThread = false;</span>
+<span class="fc" id="L145">        this.refreshing.interrupt();</span>
+
+<span class="fc" id="L147">        this.cacheManager.dispose();</span>
+<span class="fc" id="L148">        this.cacheManager = null;</span>
+<span class="fc" id="L149">        CompositeCacheManager.getInstance().shutDown();</span>
+
+<span class="fc" id="L151">        getLogger().debug(&quot;JCSCacheService stopped.&quot;);</span>
+<span class="fc" id="L152">    }</span>
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getObject(java.lang.String)
+     */
+    @Override
+	public &lt;T&gt; CachedObject&lt;T&gt; getObject(final String objectId) throws ObjectExpiredException
+    {
+        @SuppressWarnings(&quot;unchecked&quot;)
+<span class="fc" id="L161">        CachedObject&lt;T&gt; cachedObject = (CachedObject&lt;T&gt;)this.cacheManager.getFromGroup(objectId, group);</span>
+
+<span class="fc bfc" id="L163" title="All 2 branches covered.">        if (cachedObject == null)</span>
+        {
+            // Not in the cache.
+<span class="fc" id="L166">            throw new ObjectExpiredException();</span>
+        }
+
+<span class="pc bpc" id="L169" title="1 of 2 branches missed.">        if (cachedObject.isStale())</span>
+        {
+<span class="nc bnc" id="L171" title="All 2 branches missed.">            if (cachedObject instanceof RefreshableCachedObject)</span>
+            {
+<span class="nc" id="L173">                RefreshableCachedObject&lt;?&gt; refreshableObject = (RefreshableCachedObject&lt;?&gt;) cachedObject;</span>
+<span class="nc bnc" id="L174" title="All 2 branches missed.">                if (refreshableObject.isUntouched())</span>
+                {
+                    // Do not refresh an object that has exceeded TimeToLive
+<span class="nc" id="L177">                    removeObject(objectId);</span>
+<span class="nc" id="L178">                    throw new ObjectExpiredException();</span>
+                }
+
+                // Refresh Object
+<span class="nc" id="L182">                refreshableObject.refresh();</span>
+<span class="nc bnc" id="L183" title="All 2 branches missed.">                if (refreshableObject.isStale())</span>
+                {
+                    // Object is Expired, remove it from cache.
+<span class="nc" id="L186">                    removeObject(objectId);</span>
+<span class="nc" id="L187">                    throw new ObjectExpiredException();</span>
+                }
+<span class="nc" id="L189">            }</span>
+            else
+            {
+                // Expired.
+<span class="nc" id="L193">                removeObject(objectId);</span>
+<span class="nc" id="L194">                throw new ObjectExpiredException();</span>
+            }
+        }
+
+<span class="pc bpc" id="L198" title="1 of 2 branches missed.">        if (cachedObject instanceof RefreshableCachedObject)</span>
+        {
+            // notify it that it's being accessed.
+<span class="nc" id="L201">            RefreshableCachedObject&lt;?&gt; refreshableCachedObject = (RefreshableCachedObject&lt;?&gt;) cachedObject;</span>
+<span class="nc" id="L202">            refreshableCachedObject.touch();</span>
+        }
+
+<span class="fc" id="L205">        return cachedObject;</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#addObject(java.lang.String,
+     *      org.apache.fulcrum.cache.CachedObject)
+     */
+    @Override
+	public &lt;T&gt; void addObject(String objectId, CachedObject&lt;T&gt; cachedObject)
+    {
+        try
+        {
+<span class="pc bpc" id="L217" title="1 of 2 branches missed.">            if (!(cachedObject.getContents() instanceof Serializable))</span>
+            {
+<span class="nc" id="L219">                getLogger()</span>
+<span class="nc" id="L220">                        .warn(</span>
+                                &quot;Object (contents) with id [&quot;
+                                        + objectId
+                                        + &quot;] is not serializable. Expect problems with auxiliary caches: &quot; + 
+<span class="nc" id="L224">                                        cachedObject.getContents().getClass().getSimpleName());</span>
+            }
+
+<span class="fc" id="L227">            ElementAttributes attrib = (ElementAttributes) this.cacheManager.getDefaultElementAttributes();</span>
+
+<span class="pc bpc" id="L229" title="1 of 2 branches missed.">            if (cachedObject instanceof RefreshableCachedObject)</span>
+            {
+<span class="nc" id="L231">                attrib.setIsEternal(true);</span>
+            }
+            else
+            {
+<span class="fc" id="L235">                attrib.setIsEternal(false);</span>
+                // expires in millis, maxlife in seconds
+<span class="fc" id="L237">                double tmp0 = ((double) (cachedObject.getExpires() + 500)) / 1000;</span>
+<span class="fc" id="L238">                getLogger().debug( &quot;setting maxlife seconds (minimum 1sec) from expiry + 0.5s: &quot; + (int)tmp0 );</span>
+<span class="pc bpc" id="L239" title="1 of 2 branches missed.">                attrib.setMaxLife( tmp0 &gt; 0 ? (int) Math.floor( tmp0 ) : 1 );</span>
+            }
+
+<span class="fc" id="L242">            attrib.setLastAccessTimeNow();</span>
+<span class="fc" id="L243">            attrib.setCreateTime();</span>
+
+<span class="fc" id="L245">            this.cacheManager.putInGroup(objectId, group, cachedObject, attrib);</span>
+        }
+<span class="nc" id="L247">        catch (CacheException e)</span>
+        {
+<span class="nc" id="L249">            getLogger().error(&quot;Could not add object &quot; + objectId + &quot; to cache&quot;, e);</span>
+<span class="fc" id="L250">        }</span>
+<span class="fc" id="L251">    }</span>
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#removeObject(java.lang.String)
+     */
+    @Override
+	public void removeObject(String objectId)
+    {
+<span class="fc" id="L259">        this.cacheManager.removeFromGroup(objectId, group);</span>
+<span class="fc" id="L260">    }</span>
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getKeys()
+     */
+    @Override
+	public List&lt;String&gt; getKeys()
+    {
+<span class="fc" id="L268">        ArrayList&lt;String&gt; keys = new ArrayList&lt;&gt;();</span>
+<span class="fc" id="L269">        keys.addAll(this.cacheManager.getGroupKeys(group));</span>
+<span class="fc" id="L270">        return keys;</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getCachedObjects()
+     */
+    @Override
+	public List&lt;CachedObject&lt;?&gt;&gt; getCachedObjects()
+    {
+<span class="fc" id="L279">        ArrayList&lt;CachedObject&lt;?&gt;&gt; values = new ArrayList&lt;&gt;();</span>
+<span class="fc bfc" id="L280" title="All 2 branches covered.">        for (String key : this.cacheManager.getGroupKeys(group))</span>
+        {
+<span class="fc" id="L282">            CachedObject&lt;?&gt; cachedObject = this.cacheManager.getFromGroup(key, group);</span>
+<span class="pc bpc" id="L283" title="1 of 2 branches missed.">            if (cachedObject != null)</span>
+            {
+<span class="fc" id="L285">                values.add(cachedObject);</span>
+            }
+<span class="fc" id="L287">        }</span>
+
+<span class="fc" id="L289">        return values;</span>
+    }
+
+    /**
+     * Circle through the cache and refresh stale objects. Frequency is
+     * determined by the cacheCheckFrequency property.
+     */
+    @Override
+	public void run()
+    {
+<span class="fc bfc" id="L299" title="All 2 branches covered.">        while (this.continueThread)</span>
+        {
+            // Sleep for amount of time set in cacheCheckFrequency -
+            // default = 5 seconds.
+            try
+            {
+<span class="fc" id="L305">                Thread.sleep(this.cacheCheckFrequency);</span>
+            }
+<span class="fc" id="L307">            catch (InterruptedException exc)</span>
+            {
+<span class="pc bpc" id="L309" title="1 of 2 branches missed.">                if (!this.continueThread)</span>
+                {
+<span class="fc" id="L311">                    return;</span>
+                }
+<span class="fc" id="L313">            }</span>
+
+<span class="fc bfc" id="L315" title="All 2 branches covered.">            for (String key : this.cacheManager.getGroupKeys(group))</span>
+            {
+<span class="fc" id="L317">                CachedObject&lt;?&gt; cachedObject = this.cacheManager.getFromGroup(key, group);</span>
+<span class="fc bfc" id="L318" title="All 2 branches covered.">                if (cachedObject == null)</span>
+                {
+<span class="fc" id="L320">                    removeObject(key);</span>
+                }
+                else
+                {
+<span class="pc bpc" id="L324" title="1 of 2 branches missed.">                    if (cachedObject instanceof RefreshableCachedObject)</span>
+                    {
+<span class="nc" id="L326">                        RefreshableCachedObject&lt;?&gt; refreshableObject = (RefreshableCachedObject&lt;?&gt;) cachedObject;</span>
+<span class="nc bnc" id="L327" title="All 2 branches missed.">                        if (refreshableObject.isUntouched())</span>
+                        {
+<span class="nc" id="L329">                            this.cacheManager.removeFromGroup(key, group);</span>
+                        }
+<span class="nc bnc" id="L331" title="All 2 branches missed.">                        else if (refreshableObject.isStale())</span>
+                        {
+<span class="nc" id="L333">                            refreshableObject.refresh();</span>
+                        }
+                    }
+                }
+<span class="fc" id="L337">            }</span>
+        }
+<span class="fc" id="L339">    }</span>
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getCacheSize()
+     */
+    @Override
+	public int getCacheSize() throws IOException
+    {
+        // This is evil!
+<span class="nc" id="L348">        ByteArrayOutputStream baos = new ByteArrayOutputStream();</span>
+<span class="nc" id="L349">        ObjectOutputStream out = new ObjectOutputStream(baos);</span>
+<span class="nc" id="L350">        Set&lt;String&gt; keys = this.cacheManager.getGroupKeys(group);</span>
+
+<span class="nc bnc" id="L352" title="All 2 branches missed.">        for (String key : keys)</span>
+        {
+<span class="nc" id="L354">            out.writeObject(this.cacheManager.getFromGroup(key, group));</span>
+<span class="nc" id="L355">        }</span>
+
+<span class="nc" id="L357">        out.flush();</span>
+
+        //
+        // Subtract 4 bytes from the length, because the serialization
+        // magic number (2 bytes) and version number (2 bytes) are
+        // both written to the stream before the object
+        //
+<span class="nc" id="L364">        return baos.toByteArray().length - 4 * keys.size();</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#getNumberOfObjects()
+     */
+    @Override
+	public int getNumberOfObjects()
+    {
+<span class="fc" id="L373">        int count = 0;</span>
+
+<span class="fc bfc" id="L375" title="All 2 branches covered.">        for (String key : this.cacheManager.getGroupKeys(group))</span>
+        {
+<span class="pc bpc" id="L377" title="1 of 2 branches missed.">            if (this.cacheManager.getFromGroup(key, group) != null)</span>
+            {
+<span class="fc" id="L379">                count++;</span>
+            }
+<span class="fc" id="L381">        }</span>
+
+<span class="fc" id="L383">        return count;</span>
+    }
+
+    /**
+     * @see org.apache.fulcrum.cache.GlobalCacheService#flushCache()
+     */
+    @Override
+	public void flushCache()
+    {
+<span class="fc" id="L392">        this.cacheManager.invalidateGroup(group);</span>
+<span class="fc" id="L393">    }</span>
+}
+</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/index.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/index.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/index.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>org.apache.fulcrum.cache.impl</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <span class="el_package">org.apache.fulcrum.cache.impl</span></div><h1>org.apache.fulcrum.cache.impl</h1><table class="co
 verage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr
 ></thead><tfoot><tr><td>Total</td><td class="bar">307 of 1,066</td><td class="ctr2">71%</td><td class="bar">53 of 110</td><td class="ctr2">51%</td><td class="ctr1">41</td><td class="ctr2">97</td><td class="ctr1">87</td><td class="ctr2">293</td><td class="ctr1">3</td><td class="ctr2">42</td><td class="ctr1">0</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a2"><a href="JCSCacheService.html" class="el_class">JCSCacheService</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="39" height="10" title="139" alt="139"/><img src="../jacoco-resources/greenbar.gif" width="80" height="10" title="286" alt="286"/></td><td class="ctr2" id="c2">67%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="60" height="10" title="21" alt="21"/><img src="../jacoco-resources/greenbar.gif" width="60" height="10" title="21" alt="21"/></td><td class="ctr2" id="e1">50%</td><td class="ctr1" id="f0">16</td><td class="ctr2" id="g0">35</td><td class="c
 tr1" id="h0">33</td><td class="ctr2" id="i0">108</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k1">14</td><td class="ctr1" id="l0">0</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="DefaultGlobalCacheService.html" class="el_class">DefaultGlobalCacheService</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="24" height="10" title="87" alt="87"/><img src="../jacoco-resources/greenbar.gif" width="68" height="10" title="244" alt="244"/></td><td class="ctr2" id="c1">73%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="37" height="10" title="13" alt="13"/><img src="../jacoco-resources/greenbar.gif" width="60" height="10" title="21" alt="21"/></td><td class="ctr2" id="e0">61%</td><td class="ctr1" id="f2">10</td><td class="ctr2" id="g1">32</td><td class="ctr1" id="h1">29</td><td class="ctr2" id="i1">96</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k0">15</td><td class="ctr1" id="l1">0</td><td class=
 "ctr2" id="m1">1</td></tr><tr><td id="a1"><a href="EHCacheService.html" class="el_class">EHCacheService</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="22" height="10" title="81" alt="81"/><img src="../jacoco-resources/greenbar.gif" width="64" height="10" title="229" alt="229"/></td><td class="ctr2" id="c0">73%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="54" height="10" title="19" alt="19"/><img src="../jacoco-resources/greenbar.gif" width="42" height="10" title="15" alt="15"/></td><td class="ctr2" id="e2">44%</td><td class="ctr1" id="f1">15</td><td class="ctr2" id="g2">30</td><td class="ctr1" id="h2">25</td><td class="ctr2" id="i2">89</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">13</td><td class="ctr1" id="l2">0</td><td class="ctr2" id="m2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></b
 ody></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/index.source.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/index.source.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache.impl/index.source.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>org.apache.fulcrum.cache.impl</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <span class="el_package">org.apache.fulcrum.cache.impl</span></div><h1>org.apache.fulcrum.cache.impl</h1><table class="coverage" cells
 pacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfo
 ot><tr><td>Total</td><td class="bar">307 of 1,066</td><td class="ctr2">71%</td><td class="bar">53 of 110</td><td class="ctr2">51%</td><td class="ctr1">41</td><td class="ctr2">97</td><td class="ctr1">87</td><td class="ctr2">293</td><td class="ctr1">3</td><td class="ctr2">42</td><td class="ctr1">0</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a2"><a href="JCSCacheService.java.html" class="el_source">JCSCacheService.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="39" height="10" title="139" alt="139"/><img src="../jacoco-resources/greenbar.gif" width="80" height="10" title="286" alt="286"/></td><td class="ctr2" id="c2">67%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="60" height="10" title="21" alt="21"/><img src="../jacoco-resources/greenbar.gif" width="60" height="10" title="21" alt="21"/></td><td class="ctr2" id="e1">50%</td><td class="ctr1" id="f0">16</td><td class="ctr2" id="g0">35</td><td class="ctr
 1" id="h0">33</td><td class="ctr2" id="i0">108</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k1">14</td><td class="ctr1" id="l0">0</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="DefaultGlobalCacheService.java.html" class="el_source">DefaultGlobalCacheService.java</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="24" height="10" title="87" alt="87"/><img src="../jacoco-resources/greenbar.gif" width="68" height="10" title="244" alt="244"/></td><td class="ctr2" id="c1">73%</td><td class="bar" id="d2"><img src="../jacoco-resources/redbar.gif" width="37" height="10" title="13" alt="13"/><img src="../jacoco-resources/greenbar.gif" width="60" height="10" title="21" alt="21"/></td><td class="ctr2" id="e0">61%</td><td class="ctr1" id="f2">10</td><td class="ctr2" id="g1">32</td><td class="ctr1" id="h1">29</td><td class="ctr2" id="i1">96</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k0">15</td><td class="ctr1" id="l1">0</td><
 td class="ctr2" id="m1">1</td></tr><tr><td id="a1"><a href="EHCacheService.java.html" class="el_source">EHCacheService.java</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="22" height="10" title="81" alt="81"/><img src="../jacoco-resources/greenbar.gif" width="64" height="10" title="229" alt="229"/></td><td class="ctr2" id="c0">73%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="54" height="10" title="19" alt="19"/><img src="../jacoco-resources/greenbar.gif" width="42" height="10" title="15" alt="15"/></td><td class="ctr2" id="e2">44%</td><td class="ctr1" id="f1">15</td><td class="ctr2" id="g2">30</td><td class="ctr1" id="h2">25</td><td class="ctr2" id="i2">89</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">13</td><td class="ctr1" id="l2">0</td><td class="ctr2" id="m2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.20200915
 0832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/CachedObject.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/CachedObject.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/CachedObject.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>CachedObject</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.html" class="el_package">org.apache.fulcrum.cache</a> &gt; <span class="el_class">CachedObject</span></div><h1>CachedObject</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td 
 class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">37 of 109</td><td class="ctr2">66%</td><td class="bar">7 of 12</td><td class="ctr2">41%</td><td class="ctr1">6</td><td class="ctr2">14</td><td class="c
 tr1">8</td><td class="ctr2">28</td><td class="ctr1">2</td><td class="ctr2">8</td></tr></tfoot><tbody><tr><td id="a6"><a href="CachedObject.java.html#L140" class="el_method">setExpires(long)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="34" alt="34"/></td><td class="ctr2" id="c6">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="e2">0%</td><td class="ctr1" id="f0">4</td><td class="ctr2" id="g0">4</td><td class="ctr1" id="h0">7</td><td class="ctr2" id="i1">7</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a3"><a href="CachedObject.java.html#L119" class="el_method">getCreated()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="3" alt="3"/></td><td class="ctr2" id="c7">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" i
 d="f1">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i5">1</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a1"><a href="CachedObject.java.html#L54" class="el_method">CachedObject(Object, long)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/greenbar.gif" width="105" height="10" title="30" alt="30"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d2"><img src="../jacoco-resources/greenbar.gif" width="40" height="10" title="2" alt="2"/></td><td class="ctr2" id="e0">100%</td><td class="ctr1" id="f3">0</td><td class="ctr2" id="g2">2</td><td class="ctr1" id="h2">0</td><td class="ctr2" id="i0">9</td><td class="ctr1" id="j2">0</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a5"><a href="CachedObject.java.html#L177" class="el_method">isStale()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/greenbar.gif" width="91" height="10" title="26" alt="26"/></td><td class="ctr2" id
 ="c1">100%</td><td class="bar" id="d1"><img src="../jacoco-resources/redbar.gif" width="20" height="10" title="1" alt="1"/><img src="../jacoco-resources/greenbar.gif" width="60" height="10" title="3" alt="3"/></td><td class="ctr2" id="e1">75%</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g1">3</td><td class="ctr1" id="h3">0</td><td class="ctr2" id="i2">5</td><td class="ctr1" id="j3">0</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a0"><a href="CachedObject.java.html#L76" class="el_method">CachedObject(Object)</a></td><td class="bar" id="b4"><img src="../jacoco-resources/greenbar.gif" width="17" height="10" title="5" alt="5"/></td><td class="ctr2" id="c2">100%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">0</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">0</td><td class="ctr2" id="i3">2</td><td class="ctr1" id="j4">0</td><td class="ctr2" id="k4">1</td></tr><tr><td id="a7"><a href="CachedObject.java.html#L166" class="
 el_method">setStale(boolean)</a></td><td class="bar" id="b5"><img src="../jacoco-resources/greenbar.gif" width="17" height="10" title="5" alt="5"/></td><td class="ctr2" id="c3">100%</td><td class="bar" id="d5"/><td class="ctr2" id="e5">n/a</td><td class="ctr1" id="f5">0</td><td class="ctr2" id="g5">1</td><td class="ctr1" id="h5">0</td><td class="ctr2" id="i4">2</td><td class="ctr1" id="j5">0</td><td class="ctr2" id="k5">1</td></tr><tr><td id="a2"><a href="CachedObject.java.html#L109" class="el_method">getContents()</a></td><td class="bar" id="b6"><img src="../jacoco-resources/greenbar.gif" width="10" height="10" title="3" alt="3"/></td><td class="ctr2" id="c4">100%</td><td class="bar" id="d6"/><td class="ctr2" id="e6">n/a</td><td class="ctr1" id="f6">0</td><td class="ctr2" id="g6">1</td><td class="ctr1" id="h6">0</td><td class="ctr2" id="i6">1</td><td class="ctr1" id="j6">0</td><td class="ctr2" id="k6">1</td></tr><tr><td id="a4"><a href="CachedObject.java.html#L129" class="el_method
 ">getExpires()</a></td><td class="bar" id="b7"><img src="../jacoco-resources/greenbar.gif" width="10" height="10" title="3" alt="3"/></td><td class="ctr2" id="c5">100%</td><td class="bar" id="d7"/><td class="ctr2" id="e7">n/a</td><td class="ctr1" id="f7">0</td><td class="ctr2" id="g7">1</td><td class="ctr1" id="h7">0</td><td class="ctr2" id="i7">1</td><td class="ctr1" id="j7">0</td><td class="ctr2" id="k7">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/CachedObject.java.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/CachedObject.java.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/CachedObject.java.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>CachedObject.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.source.html" class="el_package">org.apache.fulcrum.cache</a> &gt; <span class="el_source">CachedObject
 .java</span></div><h1>CachedObject.java</h1><pre class="source lang-java linenums">package org.apache.fulcrum.cache;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * &quot;License&quot;); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.Serializable;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Wrapper for an object you want to store in a cache for a period of time.
+ *
+ * @author &lt;a href=&quot;mailto:mbryson@mont.mindspring.com&quot;&gt;Dave Bryson&lt;/a&gt;
+ * @author &lt;a href=&quot;mailto:hps@intermeta.de&quot;&gt;Henning P. Schmiedehausen&lt;/a&gt;
+ * @author &lt;a href=&quot;mailto:epugh@upstate.com&quot;&gt;Eric Pugh&lt;/a&gt;
+ * @version $Id: CachedObject.java 1890338 2021-05-31 10:31:19Z gk $
+ */
+
+public class CachedObject&lt;T&gt; implements Serializable
+{
+    /*
+     * TODO: The old Turbine version you could set the default age from Turbine.
+     * What we need is a CachedObjectFactory that would generate CachedObject's
+     * that could then have their default age set.
+     */
+
+    /**
+     * Serialization key
+     */
+    private static final long serialVersionUID = -9107764093769042092L;
+
+    /** Cache the object with the Default TTL */
+    public static final int DEFAULT = 0;
+
+    /** Do not expire the object */
+    public static final int FOREVER = -1;
+
+    /** The object to be cached. */
+<span class="fc" id="L54">    private T contents = null;</span>
+
+    /** Default age (30 minutes). */
+    private static final long DEFAULT_AGE = 1_800_000;
+
+    /** When the object is created. */
+    protected long created;
+
+    /** When the object should expire. */
+    private long expires;
+
+    /** Is this object stale/expired? */
+<span class="fc" id="L66">    private final AtomicBoolean stale = new AtomicBoolean();</span>
+
+    /**
+     * Constructor; sets the object to expire in the default time (30 minutes).
+     *
+     * @param object
+     *            The object you want to cache.
+     */
+    public CachedObject(final T object)
+    {
+<span class="fc" id="L76">        this(object, DEFAULT);</span>
+<span class="fc" id="L77">    }</span>
+
+    /**
+     * Constructor.
+     *
+     * @param object
+     *            The object to cache.
+     * @param expires
+     *            How long before the object expires, in ms, e.g. 1000 = 1
+     *            second.
+     */
+    public CachedObject(final T object, final long expires)
+<span class="fc" id="L89">    {</span>
+<span class="fc bfc" id="L90" title="All 2 branches covered.">        if (expires == DEFAULT)</span>
+        {
+<span class="fc" id="L92">            this.expires = this.DEFAULT_AGE;</span>
+        } else {
+<span class="fc" id="L94">            this.expires = expires;</span>
+        }
+
+<span class="fc" id="L97">        this.contents = object;</span>
+
+<span class="fc" id="L99">        this.created = System.currentTimeMillis();</span>
+<span class="fc" id="L100">    }</span>
+
+    /**
+     * Returns the cached object.
+     *
+     * @return The cached object.
+     */
+    public T getContents()
+    {
+<span class="fc" id="L109">        return this.contents;</span>
+    }
+
+    /**
+     * Returns the creation time for the object.
+     *
+     * @return When the object was created.
+     */
+    public long getCreated()
+    {
+<span class="nc" id="L119">        return this.created;</span>
+    }
+
+    /**
+     * Returns the expiration time for the object.
+     *
+     * @return When the object expires.
+     */
+    public long getExpires()
+    {
+<span class="fc" id="L129">        return this.expires;</span>
+    }
+
+    /**
+     * Set the expiration interval for the object.
+     *
+     * @param expires
+     *            Expiration interval in millis ( 1 second = 1000 millis)
+     */
+    public void setExpires(final long expires)
+    {
+<span class="nc bnc" id="L140" title="All 2 branches missed.">        if (expires == DEFAULT)</span>
+        {
+<span class="nc" id="L142">            this.expires = this.DEFAULT_AGE;</span>
+        }
+        else
+        {
+<span class="nc" id="L146">            this.expires = expires;</span>
+        }
+<span class="nc bnc" id="L148" title="All 2 branches missed.">        if (expires == FOREVER)</span>
+        {
+<span class="nc" id="L150">            setStale(false);</span>
+        }
+        else
+        {
+<span class="nc bnc" id="L154" title="All 2 branches missed.">            setStale((System.currentTimeMillis() - this.created) &gt; expires);</span>
+        }
+<span class="nc" id="L156">    }</span>
+
+    /**
+     * Set the stale status for the object.
+     *
+     * @param stale
+     *            Whether the object is stale or not.
+     */
+    public void setStale(final boolean stale)
+    {
+<span class="fc" id="L166">        this.stale.set( stale );</span>
+<span class="fc" id="L167">    }</span>
+    
+
+    /**
+     * Is the object stale?
+     *
+     * @return True if the object is stale.
+     */
+    public boolean isStale()
+    {
+<span class="fc" id="L177">    	boolean currentState = false;</span>
+<span class="pc bpc" id="L178" title="1 of 2 branches missed.">        if (this.expires != FOREVER)</span>
+        {
+<span class="fc bfc" id="L180" title="All 2 branches covered.">        	setStale((System.currentTimeMillis() - this.created) &gt; this.expires);</span>
+<span class="fc" id="L181">        	currentState = this.stale.get();</span>
+        }
+<span class="fc" id="L183">        return currentState;</span>
+    }
+}
+</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/GlobalCacheService.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/GlobalCacheService.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/GlobalCacheService.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>GlobalCacheService</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.html" class="el_package">org.apache.fulcrum.cache</a> &gt; <span class="el_class">GlobalCacheService</span></div><h1>GlobalCacheService</h1><table class="coverage" cellspacing="0" id="coveragetabl
 e"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 4</td><td class="ctr2">100%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">0</td><td class="ctr2">1</t
 d><td class="ctr1">0</td><td class="ctr2">1</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="GlobalCacheService.java.html#L35" class="el_method">static {...}</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="4" alt="4"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/GlobalCacheService.java.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/GlobalCacheService.java.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/GlobalCacheService.java.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>GlobalCacheService.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.source.html" class="el_package">org.apache.fulcrum.cache</a> &gt; <span class="el_source">Global
 CacheService.java</span></div><h1>GlobalCacheService.java</h1><pre class="source lang-java linenums">package org.apache.fulcrum.cache;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * &quot;License&quot;); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * GlobalCacheService interface.
+ *
+ * @author &lt;a href=&quot;mailto:mbryson@mont.mindspring.com&quot;&gt;Dave Bryson&lt;/a&gt;
+ * @author &lt;a href=&quot;mailto:peter@courefreshableCachedObjectux.biz&quot;&gt;Peter CourefreshableCachedObjectux&lt;/a&gt;
+ * @version $Id: GlobalCacheService.java 1890075 2021-05-21 15:04:52Z painter $
+ */
+public interface GlobalCacheService
+{
+    /** Avalon role - used to id the component within the manager */
+<span class="fc" id="L35">    String ROLE = GlobalCacheService.class.getName();</span>
+
+    /**
+     * Gets a cached object given its id (a String).
+     *
+     * @param &lt;T&gt; type of object to return
+     * @param objectId
+     *            The String id for the object.
+     * @return A CachedObject.
+     * @throws ObjectExpiredException
+     *                if the object has expired in the cache.
+     */
+    &lt;T&gt; CachedObject&lt;T&gt; getObject(String objectId) throws ObjectExpiredException;
+
+    /**
+     * Adds an object to the cache.
+     *
+     * @param &lt;T&gt; type of object to add
+     * @param objectId
+     *            The String id for the object.
+     * @param object
+     *            The object to add to the cache.
+     */
+    &lt;T&gt; void addObject(String objectId, CachedObject&lt;T&gt; object);
+
+    /**
+     * Removes an object from the cache.
+     *
+     * @param objectId
+     *            The String id for the object.
+     */
+    void removeObject(String objectId);
+
+    /**
+     * Returns a copy of keys to objects in the cache as a list.
+     *
+     * Note that keys to expired objects are not returned.
+     *
+     * @return A List of &lt;code&gt;String&lt;/code&gt;'s representing the keys to
+     *         objects in the cache.
+     */
+    List&lt;String&gt; getKeys();
+
+    /**
+     * Returns a copy of the non-expired CachedObjects in the cache as a list.
+     *
+     * @return A List of &lt;code&gt;CachedObject&lt;/code&gt; objects held in the cache
+     */
+    List&lt;CachedObject&lt;?&gt;&gt; getCachedObjects();
+
+    /**
+     * Returns the current size of the cache.
+     *
+     * @return int representing current cache size in number of bytes
+     * @throws IOException if unable to return cache size
+     */
+    int getCacheSize() throws IOException;
+
+    /**
+     * Returns the number of objects in the cache.
+     *
+     * @return int The current number of objects in the cache.
+     */
+    int getNumberOfObjects();
+
+    /**
+     * Flush the cache of all objects.
+     */
+    void flushCache();
+}
+</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/ObjectExpiredException.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/ObjectExpiredException.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/ObjectExpiredException.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ObjectExpiredException</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.html" class="el_package">org.apache.fulcrum.cache</a> &gt; <span class="el_class">ObjectExpiredException</span></div><h1>ObjectExpiredException</h1><table class="coverage" cellspacing="0" id="
 coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 3</td><td class="ctr2">100%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">0</td><td class
 ="ctr2">1</td><td class="ctr1">0</td><td class="ctr2">1</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="ObjectExpiredException.java.html#L29" class="el_method">ObjectExpiredException()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="3" alt="3"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file

Added: websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/ObjectExpiredException.java.html
==============================================================================
--- websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/ObjectExpiredException.java.html (added)
+++ websites/production/turbine/content/fulcrum/fulcrum-cache/jacoco/org.apache.fulcrum.cache/ObjectExpiredException.java.html Wed Aug  4 06:41:15 2021
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ObjectExpiredException.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Fulcrum Cache</a> &gt; <a href="index.source.html" class="el_package">org.apache.fulcrum.cache</a> &gt; <span class="el_source">Ob
 jectExpiredException.java</span></div><h1>ObjectExpiredException.java</h1><pre class="source lang-java linenums">package org.apache.fulcrum.cache;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * &quot;License&quot;); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Exception thrown when an item either does not exist or has expired from the
+ * GlobalCache.
+ * 
+ * @author &lt;a href=&quot;mailto:mbryson@mont.mindspring.com&quot;&gt;Dave Bryson&lt;/a&gt;
+ * @version $Id: ObjectExpiredException.java 670326 2008-06-22 09:31:47Z tv $
+ */
+<span class="fc" id="L29">public class ObjectExpiredException extends Exception</span>
+{
+
+    /**
+     * Serial version id
+     */
+    private static final long serialVersionUID = -4331535517388875678L;
+}
+</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.6.202009150832</span></div></body></html>
\ No newline at end of file