///////////////////////////////////////////////////////////////
 * 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.
///////////////////////////////////////////////////////////////

[[extension-cache-ehcache, Ehcache Cache]]
= Ehcache Cache =

[devstatus]
--------------
source=extensions/cache-ehcache/dev-status.xml
--------------

EntityStore cache backed by http://ehcache.org/[EhCache].


include::../../build/docs/buildinfo/artifact.txt[]

Not all EntityStore implementations use the Cache extension, so check the implementation details of the
EntityStore whether the cache extension can bring any benefits or not.


== Assembly ==

Assembly is done using the provided Assembler:

[snippet,java]
----
source=extensions/cache-ehcache/src/test/java/org/apache/polygene/cache/ehcache/EhCacheTest.java
tag=assembly
----


== Configuration ==

Here are the configuration properties for the EhCache EntityStore Cache:

[snippet,java]
----
source=extensions/cache-ehcache/src/main/java/org/apache/polygene/cache/ehcache/EhCacheConfiguration.java
tag=config
----

Cache overflow to disk may be configured using the <<library-fileconfig>>.
If the FileConfig library is not in use, then it defaults to a temporary directory in `java.io.tmpdir`.
