<?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 milliseconds. The default
            is 5000.
          </td>
        </tr>
      </table>
    </subsection>

    <subsection name="Component Configuration Example">
      <source><![CDATA[
    <cache cacheInitialSize="20" cacheCheckFrequency="5000"/>
      ]]></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>
