<?xml version="1.0"?>
<!--
 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
 "License"); 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
 "AS IS" 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.
-->

<document>

  <properties>
    <title>Cache Component</title>
    <author email="epugh@upstate.com">Eric Pugh</author>
    <author email="tv@apache.org">Thomas Vandahl</author>
    <author email="gk@apache.org">Georg Kallidis</author>
  </properties>

  <body>

  <section name="Overview">
    <p>
      This Service functions as a Global Cache.  A global cache is a good
      place to store items that you may need to access often but don't
      necessarily need (or want) to fetch from the database everytime.  A
      good example would be a look up table of States that you store in a
      database and use throughout your application. Since information
      about States doesn't change very often, you could store this
      information in the Global Cache and decrease the overhead of
      hitting the database everytime you need State information.
    </p>
    <p>
      There are three cache implementations
      <ul>
      	<li>GlobalCacheService,</li>
      	<li>EHCacheService (built on the EHCache project from
      		<a href="https://www.ehcache.org/">ehcache.sourceforge.net</a>, N.B. The implementation is still based on last release 2.10.9.2 of net.sf.ehcache.EHcache) and</li>
      	<li>JCSCacheService (built on the <a href="http://commons.apache.org/proper/commons-jcs/">Java Caching System</a>,
      		which was originally a part of Turbine)</li>
      </ul>
    </p>
    <p>
      It is written for use in Turbine but it can be used in any container 
      compatible with Avalon's ECM container.
    </p>
  </section>
  <section name="GlobalCacheService" id="GlobalCacheService">
    <subsection name="Role Configuration">
      <source><![CDATA[
    <role
        name="org.apache.fulcrum.cache.GlobalCacheService"
        shorthand="cache"
        default-class="org.apache.fulcrum.cache.impl.DefaultGlobalCacheService"/>
      ]]></source>
    </subsection>

    <subsection name="Component Configuration">
      <table>
        <tr>
          <th>Item</th>
          <th>Datatype</th>
          <th>Cardinality</th>
          <th>Description</th>
        </tr>
        <tr>
          <td>@cacheInitialSize</td>
          <td>int</td>
          <td>[0|1]</td>
          <td>
            The initial size of the cache. The default is 20.
          </td>
        </tr>
        <tr>
          <td>@cacheCheckFrequency</td>
          <td>int</td>
          <td>[0|1]</td>
          <td>
            The cache uses a background thread to check for expired objects.
            This defines the time between two checks in seconds. The default
            is 5.
          </td>
        </tr>
      </table>
    </subsection>

    <subsection name="Component Configuration Example">
      <source><![CDATA[
    <cache cacheInitialSize="20" cacheCheckFrequency="5"/>
      ]]></source>
    </subsection>
  </section>

  <section name="EHCacheService" id="EHCacheService">

    <subsection name="Role Configuration">
      <source><![CDATA[
    <role
        name="org.apache.fulcrum.cache.GlobalCacheService"
        shorthand="ehcache"
        default-class="org.apache.fulcrum.cache.impl.EHCacheService"/>
      ]]></source>
    </subsection>

    <subsection name="Component Configuration">
      <table>
        <tr>
          <th>Item</th>
          <th>Datatype</th>
          <th>Cardinality</th>
          <th>Description</th>
        </tr>
        <tr>
          <td>cacheCheckFrequency</td>
          <td>int</td>
          <td>[0|1]</td>
          <td>
            The cache uses a background thread to check for expired objects.
            This defines the time between two checks in milliseconds. The 
            default is 5000.
          </td>
        </tr>
        <tr>
          <td>cacheName</td>
          <td>String</td>
          <td>[0|1]</td>
          <td>
            The EHcache cache name to use for the cache. The default is 
            <code>fulcrum</code>.
          </td>
        </tr>
        <tr>
          <td>configurationFile</td>
          <td>String</td>
          <td>[0|1]</td>
          <td>
            The the location of the EHcache configuration file.
            The default is to create a default cache withut settings.
          </td>
        </tr>
      </table>
      <p>z
        See <a href="http://commons.apache.org/proper/commons-jcs/">the JCS site</a> for more 
        information about configuring JCS.
      </p>
    </subsection>

    <subsection name="Component Configuration Example">
      <source><![CDATA[
    <ehcache>
        <cacheCheckFrequency>5000</cacheCheckFrequency>
        <cacheName>fulcrum</cacheName>
        <configurationFile>ehcache.xml</configurationFile>
    </ehcache>
      ]]></source>
    </subsection>
  </section>

  <section name="JCSCacheService" id="JCSCacheService">

	<p>
	  The JCS cache service implements the interface <code>GlobalCacheService</code> and thus can
	  serve as a drop-in replacement for <code>DefaultGlobalCacheService</code>. However it is
	  possible to configure the cache behavior in much more detail to provide disk caches or lateral TCP
	  caches for example.
	</p>

    <subsection name="Role Configuration">
      <source><![CDATA[
    <role
        name="org.apache.fulcrum.cache.GlobalCacheService"
        shorthand="jcscache"
        default-class="org.apache.fulcrum.cache.impl.JCSCacheService"/>
      ]]></source>
    </subsection>

    <subsection name="Component Configuration">
      <table>
        <tr>
          <th>Item</th>
          <th>Datatype</th>
          <th>Cardinality</th>
          <th>Description</th>
        </tr>
        <tr>
          <td>cacheCheckFrequency</td>
          <td>int</td>
          <td>[0|1]</td>
          <td>
            The cache uses a background thread to check for expired objects.
            This defines the time between two checks in milliseconds. The 
            default is 5000.
          </td>
        </tr>
        <tr>
          <td>region</td>
          <td>String</td>
          <td>[0|1]</td>
          <td>
            The JCS cache region name to use for the cache. The default is 
            <code>fulcrum</code>.
            JCS will store the objects in a group named <code>default_group</code> 
            in the given region.
          </td>
        </tr>
        <tr>
          <td>configurationFile</td>
          <td>String</td>
          <td>[0|1]</td>
          <td>
            The the location of the JCS configuration file. Please note that 
            JCS uses a class loader to read this file, so make sure this path 
            is part of your classpath. The default is <code>/cache.ccf</code>.
          </td>
        </tr>
      </table>
      <p>
        See <a href="http://jakarta.apache.org/jcs/">the JCS site</a> for more 
        information about configuring JCS.
      </p>
    </subsection>

    <subsection name="Component Configuration Example">
      <source><![CDATA[
    <jcscache>
    	<cacheCheckFrequency>5000</cacheCheckFrequency>
    	<region>fulcrum</region>
    	<configurationFile>/cache.ccf</configurationFile>
    </jcscache>
      ]]></source>
    </subsection>
  </section>

  <section name="Usage">

    <source><![CDATA[
    GlobalCacheService gs = null;
    try
    {
        /*
         * Look for the item in the cache.
         * If it doesn't exist or the item is stale,
         * the cache will throw an exception.
         */
        gs = (GlobalCacheService)avalonComponentService.lookup(GlobalCacheService.ROLE)

        CachedObject obj = gs.getObject("cached_object");

        data.setMessage( data.getScreen() + " Got " +
            obj.getContents().toString() + " from global cache!" );
    }
    catch(ObjectExpiredException gone)
    {
        /*
         * Add the item to the cache.
         */
        gs.addObject("cached_object",
            new CachedObject("in_the_cache",5000));

        data.setMessage( data.getScreen() +
            " Refreshed/or added new item to" +
            " the cache! Expires in 5 seconds" );
    }
    ]]></source>

    <p>
      You can also place an expiration time on your objects so the Service will
      automatically remove them when they expire. If you don't specify an expiration
      time, the DefaultGlobalCacheService uses 5 seconds. For JCS this value depends on values set
      in the cache configuration file. To see an example, look at the
      test case <a href="xref-test/org/apache/fulcrum/cache/CacheTest.html">CacheTest</a>
    </p>

    <p>
      The cache also supports <code>RefreshableCachedObject</code>s. These objects must implement
      a <code>refresh()</code>-method which will be called every time the cache detects that the
      object is expired. This way, you can keep objects in the cache that "auto-refresh" 
      asynchronously. 
    </p>
  </section>

</body>
</document>
