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:[email protected]&quot;&gt;Eric 
Pugh&lt;/a&gt;
+ * @author &lt;a href=&quot;mailto:[email protected]&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:[email protected]&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:[email protected]&quot;&gt;Dave 
Bryson&lt;/a&gt;
+ * @author &lt;a href=&quot;mailto:[email protected]&quot;&gt;Henning P. 
Schmiedehausen&lt;/a&gt;
+ * @author &lt;a href=&quot;mailto:[email protected]&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:[email protected]&quot;&gt;Dave 
Bryson&lt;/a&gt;
+ * @author &lt;a 
href=&quot;mailto:[email protected]&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:[email protected]&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


Reply via email to