<!--
  ~ 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.
  -->

<!-- EhCache XML configuration file used for Ki spring sample application -->
<ehcache>

  <!-- Sets the path to the directory where cache .data files are created.

If the path is a Java System Property it is replaced by
its value in the running VM.

The following properties are translated:
user.home - User's home directory
user.dir - User's current working directory
java.io.tmpdir - Default temp file path -->
  <diskStore path="java.io.tmpdir/ki-spring-sample"/>


  <!--Default Cache configuration. These will applied to caches programmatically created through
  the CacheManager.

  The following attributes are required:

  maxElementsInMemory            - Sets the maximum number of objects that will be created in memory
  eternal                        - Sets whether elements are eternal. If eternal,  timeouts are ignored and the
                                   element is never expired.
  overflowToDisk                 - Sets whether elements can overflow to disk when the in-memory cache
                                   has reached the maxInMemory limit.

  The following attributes are optional:
  timeToIdleSeconds              - Sets the time to idle for an element before it expires.
                                   i.e. The maximum amount of time between accesses before an element expires
                                   Is only used if the element is not eternal.
                                   Optional attribute. A value of 0 means that an Element can idle for infinity.
                                   The default value is 0.
  timeToLiveSeconds              - Sets the time to live for an element before it expires.
                                   i.e. The maximum time between creation time and when an element expires.
                                   Is only used if the element is not eternal.
                                   Optional attribute. A value of 0 means that and Element can live for infinity.
                                   The default value is 0.
  diskPersistent                 - Whether the disk store persists between restarts of the Virtual Machine.
                                   The default value is false.
  diskExpiryThreadIntervalSeconds- The number of seconds between runs of the disk expiry thread. The default value
                                   is 120 seconds.
  memoryStoreEvictionPolicy      - Policy would be enforced upon reaching the maxElementsInMemory limit. Default
                                   policy is Least Recently Used (specified as LRU). Other policies available -
                                   First In First Out (specified as FIFO) and Less Frequently Used
                                   (specified as LFU)
  -->

  <defaultCache
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="120"
    timeToLiveSeconds="120"
    overflowToDisk="false"
    diskPersistent="false"
    diskExpiryThreadIntervalSeconds="120"
    />

  <!-- We want eternal="true" (with no timeToIdle or timeToLive settings) because Ki manages session
expirations explicitly.  If we set it to false and then set corresponding timeToIdle and timeToLive properties,
ehcache would evict sessions without Ki's knowledge, which would cause many problems
(e.g. "My Ki session timeout is 30 minutes - why isn't a session available after 2 minutes?"
Answer - ehcache expired it due to the timeToIdle property set to 120 seconds.)

diskPersistent=true since we want an enterprise session management feature - ability to use sessions after
even after a JVM restart.  -->
  <cache name="jsecurity-activeSessionCache"
         maxElementsInMemory="20000"
         eternal="true"
         overflowToDisk="true"
         diskPersistent="true"
         diskExpiryThreadIntervalSeconds="600"/>

  <cache name="org.apache.ki.realm.SimpleAccountRealm.authorization"
         maxElementsInMemory="100"
         eternal="false"
         timeToLiveSeconds="600"
         overflowToDisk="false"/>

</ehcache>
