You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ss...@apache.org on 2014/03/17 11:23:21 UTC

[30/32] git commit: - re-added support for EHCache as KiWi caching backend (MARMOTTA-450) - cleanup old use of EHCache (MARMOTTA-443)

- re-added support for EHCache as KiWi caching backend (MARMOTTA-450)
- cleanup old use of EHCache (MARMOTTA-443)


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/2c5e8529
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/2c5e8529
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/2c5e8529

Branch: refs/heads/develop
Commit: 2c5e8529cc51fbbec6c54cc43fd0c65b39352b11
Parents: 18db945
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Mon Mar 17 11:15:47 2014 +0100
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Mon Mar 17 11:15:47 2014 +0100

----------------------------------------------------------------------
 .../src/main/resources/ehcache-lmf.xml          | 422 ----------
 .../resources/META-INF/test-persistence.xml     |  86 ---
 .../src/test/resources/arquillian.xml           |  31 -
 .../src/test/resources/ehcache.xml              | 380 ---------
 libraries/kiwi/kiwi-caching-ehcache/pom.xml     | 117 +++
 .../kiwi/ehcache/caching/EHCacheManager.java    | 201 +++++
 .../ehcache/caching/EHCacheManagerFactory.java  |  41 +
 .../marmotta/kiwi/ehcache/util/CacheMap.java    | 144 ++++
 ...he.marmotta.kiwi.caching.CacheManagerFactory |   1 +
 .../src/main/resources/ehcache-kiwi.xml         | 767 +++++++++++++++++++
 .../EHCacheRepositoryConnectionTest.java        |  63 ++
 .../test/caching/EHCacheRepositoryTest.java     |  61 ++
 ...he.marmotta.kiwi.caching.CacheManagerFactory |   1 +
 .../marmotta/kiwi/config/CachingBackends.java   |   8 +-
 libraries/kiwi/pom.xml                          |   1 +
 parent/pom.xml                                  |   9 +
 .../src/main/resources/META-INF/ehcache.xml     | 500 ------------
 17 files changed, 1413 insertions(+), 1420 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/main/resources/ehcache-lmf.xml
----------------------------------------------------------------------
diff --git a/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/main/resources/ehcache-lmf.xml b/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/main/resources/ehcache-lmf.xml
deleted file mode 100644
index 9923971..0000000
--- a/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/main/resources/ehcache-lmf.xml
+++ /dev/null
@@ -1,422 +0,0 @@
-#set( $symbol_pound = '#' )
-#set( $symbol_dollar = '$' )
-#set( $symbol_escape = '\' )
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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.
-
--->
-<!--
-CacheManager Configuration
-==========================
-An ehcache-lmf.xml corresponds to a single CacheManager.
-
-See instructions below or the ehcache schema (ehcache.xsd) on how to configure.
-
-System property tokens can be specified in this file which are replaced when the configuration
-is loaded. For example multicastGroupPort=${symbol_dollar}{multicastGroupPort} can be replaced with the
-System property either from an environment variable or a system property specified with a
-command line switch such as -DmulticastGroupPort=4446.
-
-The attributes of <ehcache> are:
-* name - an optional name for the CacheManager.  The name is optional and primarily used 
-for documentation or to distinguish Terracotta clustered cache state.  With Terracotta 
-clustered caches, a combination of CacheManager name and cache name uniquely identify a 
-particular cache store in the Terracotta clustered memory.
-* updateCheck - an optional boolean flag specifying whether this CacheManager should check
-for new versions of Ehcache over the Internet.  If not specified, updateCheck="true".
-* monitoring - an optional setting that determines whether the CacheManager should 
-automatically register the SampledCacheMBean with the system MBean server.  Currently,
-this monitoring is only useful when using Terracotta and thus the "autodetect" value 
-will detect the presence of Terracotta and register the MBean.  Other allowed values 
-are "on" and "off".  The default is "autodetect".
--->    
-<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" name="lmf">
-
-    <!-- 
-    DiskStore configuration
-    =======================
-
-    The diskStore element is optional. To turn off disk store path creation, comment out the diskStore
-    element below.
-
-    Configure it if you have overflowToDisk or diskPersistent enabled for any cache.
-
-    If it is not configured, and a cache is created which requires a disk store, a warning will be
-     issued and java.io.tmpdir will automatically be used.
-
-    diskStore has only one attribute - "path". It is the path to the directory where
-    .data and .index files will be created.
-
-    If the path is one of the following Java System Property it is replaced by its value in the
-    running VM. For backward compatibility these are not specified without being enclosed in the ${symbol_dollar}{token}
-    replacement syntax.
-
-    The following properties are translated:
-    * user.home - KiWiUser's home directory
-    * user.dir - KiWiUser's current working directory
-    * java.io.tmpdir - Default temp file path
-    * ehcache.disk.store.dir - A system property you would normally specify on the command line
-      e.g. java -Dehcache.disk.store.dir=/u01/myapp/diskdir ...
-
-    Subdirectories can be specified below the property e.g. java.io.tmpdir/one
-
-    -->
-    <diskStore path="java.io.tmpdir/lmf-cache/lmf"/>
-
-   <!--
-    Cachemanagereventlistener
-    =========================
-    Specifies a CacheManagerEventListenerFactory which is notified when Caches are added
-    or removed from the CacheManager.
-
-    The attributes of CacheManagerEventListenerFactory are:
-    * class - a fully qualified factory class name
-    * properties - comma separated properties having meaning only to the factory.
-
-    Sets the fully qualified class name to be registered as the CacheManager event listener.
-
-    The events include:
-    * adding a Cache
-    * removing a Cache
-
-    Callbacks to listener methods are synchronous and unsynchronized. It is the responsibility
-    of the implementer to safely handle the potential performance and thread safety issues
-    depending on what their listener is doing.
-
-    If no class is specified, no listener is created. There is no default.
-    -->
-    <cacheManagerEventListenerFactory class="" properties=""/>
-
-
-    <!--
-    CacheManagerPeerProvider
-    ========================
-    (For distributed operation)
-
-    Specifies a CacheManagerPeerProviderFactory which will be used to create a
-    CacheManagerPeerProvider, which discovers other CacheManagers in the cluster.
-
-    One or more providers can be configured. The first one in the ehcache-lmf.xml is the default, which is used
-    for replication and bootstrapping.
-
-    The attributes of cacheManagerPeerProviderFactory are:
-    * class - a fully qualified factory class name
-    * properties - comma separated properties having meaning only to the factory.
-
-    Providers are available for RMI, JGroups and JMS as shown following.
-
-    RMICacheManagerPeerProvider
-    +++++++++++++++++++++++++++
-
-    Ehcache comes with a built-in RMI-based distribution system with two means of discovery of
-    CacheManager peers participating in the cluster:
-    * automatic, using a multicast group. This one automatically discovers peers and detects
-      changes such as peers entering and leaving the group
-    * manual, using manual rmiURL configuration. A hardcoded list of peers is provided at
-      configuration time.
-
-    Configuring Automatic Discovery:
-    Automatic discovery is configured as per the following example:
-    <cacheManagerPeerProviderFactory
-                        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                        properties="hostName=fully_qualified_hostname_or_ip,
-                                    peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
-                                    multicastGroupPort=4446, timeToLive=32"/>
-
-    Valid properties are:
-    * peerDiscovery (mandatory) - specify "automatic"
-    * multicastGroupAddress (mandatory) - specify a valid multicast group address
-    * multicastGroupPort (mandatory) - specify a dedicated port for the multicast heartbeat
-      traffic
-    * timeToLive - specify a value between 0 and 255 which determines how far the packets will
-      propagate.
-
-      By convention, the restrictions are:
-      0   - the same host
-      1   - the same subnet
-      32  - the same site
-      64  - the same region
-      128 - the same continent
-      255 - unrestricted
-
-     * hostName - the hostname or IP of the interface to be used for sending and receiving multicast packets
-       (relevant to mulithomed hosts only)
-
-    Configuring Manual Discovery:
-    Manual discovery requires a unique configuration per host. It is contains a list of rmiURLs for the peers, other
-    than itself. So, if we have server1, server2 and server3 the configuration will be:
-
-    In server1's configuration:
-    <cacheManagerPeerProviderFactory class=
-                          "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                          properties="peerDiscovery=manual,
-                          rmiUrls=//server2:40000/sampleCache1|//server3:40000/sampleCache1
-                          | //server2:40000/sampleCache2|//server3:40000/sampleCache2"
-                          propertySeparator="," />
-
-    In server2's configuration:
-    <cacheManagerPeerProviderFactory class=
-                          "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                          properties="peerDiscovery=manual,
-                          rmiUrls=//server1:40000/sampleCache1|//server3:40000/sampleCache1
-                          | //server1:40000/sampleCache2|//server3:40000/sampleCache2"
-                          propertySeparator="," />
-
-    In server3's configuration:
-    <cacheManagerPeerProviderFactory class=
-                          "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                          properties="peerDiscovery=manual,
-                          rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1
-                          | //server1:40000/sampleCache2|//server2:40000/sampleCache2"
-                          propertySeparator="," />
-
-
-    Valid properties are:
-    * peerDiscovery (mandatory) - specify "manual"
-    * rmiUrls (mandatory) - specify a pipe separated list of rmiUrls, in the form
-                            //hostname:port
-    * hostname (optional) - the hostname is the hostname of the remote CacheManager peer. The port is the listening
-      port of the RMICacheManagerPeerListener of the remote CacheManager peer.
-    
-    JGroupsCacheManagerPeerProvider
-    +++++++++++++++++++++++++++++++
-    <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
-                                     properties="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;
-                                     mcast_send_buf_size=150000;mcast_recv_buf_size=80000):
-                                     PING(timeout=2000;num_initial_members=6):
-                                     MERGE2(min_interval=5000;max_interval=10000):
-                                     FD_SOCK:VERIFY_SUSPECT(timeout=1500):
-                                     pbcast.NAKACK(gc_lag=10;retransmit_timeout=3000):
-                                     UNICAST(timeout=5000):
-                                     pbcast.STABLE(desired_avg_gossip=20000):
-                                     FRAG:
-                                     pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=false)"
-                                     propertySeparator="::"
-            />
-     The only property necessary is the connect String used by jgroups to configure itself. Refer to the Jgroups documentation for explanation
-     of all the protocols. The example above uses UDP multicast. If the connect property is not specified the default JGroups connection will be
-     used.       
-
-
-    JMSCacheManagerPeerProviderFactory
-    ++++++++++++++++++++++++++++++++++
-    <cacheManagerPeerProviderFactory
-            class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory"
-            properties="..."
-            propertySeparator=","
-            />
-
-    The JMS PeerProviderFactory uses JNDI to maintain message queue independence. Refer to the manual for full configuration
-    examples using ActiveMQ and Open Message Queue.
-
-    Valid properties are:
-    * initialContextFactoryName (mandatory) - the name of the factory used to create the message queue initial context.
-    * providerURL (mandatory) - the JNDI configuration information for the service provider to use.
-    * topicConnectionFactoryBindingName (mandatory) - the JNDI binding name for the TopicConnectionFactory
-    * topicBindingName (mandatory) - the JNDI binding name for the topic name
-    * getQueueBindingName (mandatory only if using jmsCacheLoader) - the JNDI binding name for the queue name
-    * securityPrincipalName - the JNDI java.naming.security.principal
-    * securityCredentials - the JNDI java.naming.security.credentials
-    * urlPkgPrefixes - the JNDI java.naming.factory.url.pkgs
-    * userName - the user name to use when creating the TopicConnection to the Message Queue
-    * password - the password to use when creating the TopicConnection to the Message Queue
-    * acknowledgementMode - the JMS Acknowledgement mode for both publisher and subscriber. The available choices are
-                            AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE and SESSION_TRANSACTED. The default is AUTO_ACKNOWLEDGE.
-    -->
-<!--    <cacheManagerPeerProviderFactory-->
-<!--            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"-->
-<!--            properties="peerDiscovery=automatic,-->
-<!--                        multicastGroupAddress=230.0.0.1,-->
-<!--                        multicastGroupPort=4446, timeToLive=1"-->
-<!--            propertySeparator=","-->
-<!--            />-->
-
-
-    <!--
-    CacheManagerPeerListener
-    ========================
-    (Enable for distributed operation)
-
-    Specifies a CacheManagerPeerListenerFactory which will be used to create a
-    CacheManagerPeerListener, which listens for messages from cache replicators participating in the cluster.
-
-    The attributes of cacheManagerPeerListenerFactory are:
-    class - a fully qualified factory class name
-    properties - comma separated properties having meaning only to the factory.
-
-    Ehcache comes with a built-in RMI-based distribution system. The listener component is
-    RMICacheManagerPeerListener which is configured using
-    RMICacheManagerPeerListenerFactory. It is configured as per the following example:
-
-    <cacheManagerPeerListenerFactory
-        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
-        properties="hostName=fully_qualified_hostname_or_ip,
-                    port=40001,
-                    remoteObjectPort=40002,
-                    socketTimeoutMillis=120000"
-                    propertySeparator="," />
-
-    All properties are optional. They are:
-    * hostName - the hostName of the host the listener is running on. Specify
-      where the host is multihomed and you want to control the interface over which cluster
-      messages are received. Defaults to the host name of the default interface if not
-      specified.
-    * port - the port the RMI Registry listener listens on. This defaults to a free port if not specified.
-    * remoteObjectPort - the port number on which the remote objects bound in the registry receive calls.
-                         This defaults to a free port if not specified.
-    * socketTimeoutMillis - the number of ms client sockets will stay open when sending
-      messages to the listener. This should be long enough for the slowest message.
-      If not specified it defaults to 120000ms.
-
-    -->
-<!--    <cacheManagerPeerListenerFactory-->
-<!--            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>-->
-
-    <!-- Cache configuration.
-
-    The following attributes are required.
-
-    name:
-    Sets the name of the cache. This is used to identify the cache. It must be unique.
-
-    maxElementsInMemory:
-    Sets the maximum number of objects that will be created in memory
-
-        maxElementsOnDisk:
-    Sets the maximum number of objects that will be maintained in the DiskStore
-        The default value is zero, meaning unlimited.
-
-    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 memory store
-    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)
-
-    -->
-
-    <!--
-    Mandatory Default Cache configuration. These settings will be applied to caches
-    created programmtically using CacheManager.add(String cacheName)
-    -->
-    <defaultCache
-            maxElementsInMemory="20000"
-            overflowToDisk="false"
-            memoryStoreEvictionPolicy="LRU"
-            />
-
-
-    <!-- the cache used for triple queries by KiWi -->
-    <cache name="uri-node-cache"
-           statistics="true"
-           maxElementsInMemory="100000"
-           timeToIdleSeconds="3600"
-           overflowToDisk="false"/>
-    <cache name="anon-node-cache"
-           statistics="true"
-           maxElementsInMemory="10000"
-           timeToIdleSeconds="3600"
-           overflowToDisk="false"/>
-    <cache name="literal-cache"
-           statistics="true"
-           maxElementsInMemory="10000"
-           timeToIdleSeconds="3600"
-           overflowToDisk="false"/>
-
-    <cache name="namespace-prefix-cache"
-           statistics="true"
-           maxElementsInMemory="100"
-           overflowToDisk="true"/>
-
-    <cache name="namespace-uri-cache"
-           statistics="true"
-           maxElementsInMemory="100"
-           overflowToDisk="true"/>
-
-    <!-- the cache used for triple queries by KiWi -->
-    <cache name="query-cache"
-           statistics="true"
-           maxElementsInMemory="200000"
-           timeToIdleSeconds="3600"
-           overflowToDisk="false"/>
-
-    <!-- the cache used for resource lookups from module jar files -->
-    <cache name="resource-cache"
-           statistics="true"
-           maxElementsInMemory="10000"
-           timeToIdleSeconds="3600"
-           timeToLiveSeconds="3600"
-           overflowToDisk="false"
-           memoryStoreEvictionPolicy="LRU"/>
-
-    <!-- the cache used for triple queries by KiWi -->
-    <cache name="page-cache"
-           statistics="true"
-           maxElementsInMemory="500"
-           timeToIdleSeconds="3600"
-           memoryStoreEvictionPolicy="LRU"
-           overflowToDisk="true"/>
-
-    <cache name="http-content-cache"
-           statistics="true"
-           maxElementsInMemory="500"
-           timeToIdleSeconds="3600"
-           memoryStoreEvictionPolicy="LRU"
-           overflowToDisk="true"/>
-
-
-    <!--  uncomment to enable cache debugging -->
-<!-- 
-	<cacheManagerPeerListenerFactory
-	    class="org.terracotta.ehcachedx.monitor.probe.ProbePeerListenerFactory"
-	    properties="monitorAddress=localhost, monitorPort=9889" />
--->
-
-</ehcache>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/META-INF/test-persistence.xml
----------------------------------------------------------------------
diff --git a/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/META-INF/test-persistence.xml b/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/META-INF/test-persistence.xml
deleted file mode 100644
index 852b672..0000000
--- a/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/META-INF/test-persistence.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-#set( $symbol_pound = '#' )
-#set( $symbol_dollar = '$' )
-#set( $symbol_escape = '\' )
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   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.
--->
-
-<persistence xmlns="http://java.sun.com/xml/ns/persistence"
-             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
-             version="2.0">
-
-    <!--
-
-            resources/META-INF/persistence.xml.tmpl should be the only place you change anything
-            any of persistence.*.xml. After changing it, "ant configure"
-            copies it to all places it is needed.
-
-    -->
-
-    <persistence-unit name="KiWi" transaction-type="RESOURCE_LOCAL">
-
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiNode</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiResource</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiUriResource</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiAnonResource</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiLiteral</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiStringLiteral</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiIntLiteral</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiDoubleLiteral</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiTextContentLiteral</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiMediaContentLiteral</class>
-
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiNamespace</class>
-        <class>org.apache.marmotta.platform.core.model.rdf.KiWiTriple</class>
-
-        <class>${package}.user.model.UserAccount</class>
-        <!--<class>kiwi.core.model.user.KiWiUser</class>-->
-        <!--<class>kiwi.core.model.user.KiWiGroup</class>-->
-        <!--<class>kiwi.core.model.user.Role</class>-->
-
-        <class>${package}.versioning.model.Version</class>
-
-        <properties>
-            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
-            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
-            <property name="javax.persistence.jdbc.user" value="sa"/>
-            <property name="javax.persistence.jdbc.password" value="sa"/>
-            <property name="javax.persistence.jdbc.url" value="jdbc:h2:/tmp/kiwi-test/db/kiwi2;MVCC=true;DB_CLOSE_ON_EXIT=FALSE"/>
-
-
-            <!-- valid values are validate, update, create, create-drop -->
-            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
-            <property name="hibernate.show_sql" value="false"/>
-            <property name="hibernate.format_sql" value="true"/>
-            <property name="hibernate.jdbc.fetch_size" value="30"/>
-            <property name="hibernate.jdbc.batch_size" value="30"/>
-            <property name="hibernate.default_batch_fetch_size" value="16" />
-            <property name="hibernate.max_fetch_depth" value="3" />
-
-            <!-- Without this statement seem Hibernate to come to "Cannot open connection" state at peak times (e.g. test) -->
-            <property name="hibernate.connection.release_mode" value="after_statement" />
-
-            <!--  caching -->
-            <property name="hibernate.cache.region.factory_class"
-                      value="net.sf.ehcache.hibernate.EhCacheRegionFactory"/>
-            <property name="hibernate.cache.use_query_cache" value="true" />
-            <property name="hibernate.cache.use_second_level_cache" value="true"/>
-            <property name="hibernate.cache.region_prefix" value=""/>
-        </properties>
-    </persistence-unit>
-</persistence>

http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/arquillian.xml
----------------------------------------------------------------------
diff --git a/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/arquillian.xml b/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/arquillian.xml
deleted file mode 100644
index ab814c4..0000000
--- a/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/arquillian.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-#set( $symbol_pound = '#' )
-#set( $symbol_dollar = '$' )
-#set( $symbol_escape = '\' )
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   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.
--->
-
-<arquillian xmlns="http://jboss.com/arquillian"
-            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-            xmlns:tomcat6="urn:arq:org.jboss.arquillian.container.tomcat.embedded_6"
-            xsi:schemaLocation="http://jboss.com/arquillian ">
-
-    <tomcat6:container>
-        <tomcat6:unpackArchive>true</tomcat6:unpackArchive>
-    </tomcat6:container>
-
-</arquillian>

http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/ehcache.xml
----------------------------------------------------------------------
diff --git a/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/ehcache.xml b/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/ehcache.xml
deleted file mode 100644
index 9174f6c..0000000
--- a/build/archetypes/marmotta-archetype-webapp/src/main/resources/archetype-resources/src/test/resources/ehcache.xml
+++ /dev/null
@@ -1,380 +0,0 @@
-#set( $symbol_pound = '#' )
-#set( $symbol_dollar = '$' )
-#set( $symbol_escape = '\' )
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   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.
--->
-
-<!--
-CacheManager Configuration
-==========================
-An ehcache-lmf.xml corresponds to a single CacheManager.
-
-See instructions below or the ehcache schema (ehcache.xsd) on how to configure.
-
-System property tokens can be specified in this file which are replaced when the configuration
-is loaded. For example multicastGroupPort=${symbol_dollar}{multicastGroupPort} can be replaced with the
-System property either from an environment variable or a system property specified with a
-command line switch such as -DmulticastGroupPort=4446.
-
-The attributes of <ehcache> are:
-* name - an optional name for the CacheManager.  The name is optional and primarily used 
-for documentation or to distinguish Terracotta clustered cache state.  With Terracotta 
-clustered caches, a combination of CacheManager name and cache name uniquely identify a 
-particular cache store in the Terracotta clustered memory.
-* updateCheck - an optional boolean flag specifying whether this CacheManager should check
-for new versions of Ehcache over the Internet.  If not specified, updateCheck="true".
-* monitoring - an optional setting that determines whether the CacheManager should 
-automatically register the SampledCacheMBean with the system MBean server.  Currently,
-this monitoring is only useful when using Terracotta and thus the "autodetect" value 
-will detect the presence of Terracotta and register the MBean.  Other allowed values 
-are "on" and "off".  The default is "autodetect".
--->    
-<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
-
-    <!-- 
-    DiskStore configuration
-    =======================
-
-    The diskStore element is optional. To turn off disk store path creation, comment out the diskStore
-    element below.
-
-    Configure it if you have overflowToDisk or diskPersistent enabled for any cache.
-
-    If it is not configured, and a cache is created which requires a disk store, a warning will be
-     issued and java.io.tmpdir will automatically be used.
-
-    diskStore has only one attribute - "path". It is the path to the directory where
-    .data and .index files will be created.
-
-    If the path is one of the following Java System Property it is replaced by its value in the
-    running VM. For backward compatibility these are not specified without being enclosed in the ${symbol_dollar}{token}
-    replacement syntax.
-
-    The following properties are translated:
-    * user.home - KiWiUser's home directory
-    * user.dir - KiWiUser's current working directory
-    * java.io.tmpdir - Default temp file path
-    * ehcache.disk.store.dir - A system property you would normally specify on the command line
-      e.g. java -Dehcache.disk.store.dir=/u01/myapp/diskdir ...
-
-    Subdirectories can be specified below the property e.g. java.io.tmpdir/one
-
-    -->
-    <diskStore path="java.io.tmpdir"/>
-
-   <!--
-    Cachemanagereventlistener
-    =========================
-    Specifies a CacheManagerEventListenerFactory which is notified when Caches are added
-    or removed from the CacheManager.
-
-    The attributes of CacheManagerEventListenerFactory are:
-    * class - a fully qualified factory class name
-    * properties - comma separated properties having meaning only to the factory.
-
-    Sets the fully qualified class name to be registered as the CacheManager event listener.
-
-    The events include:
-    * adding a Cache
-    * removing a Cache
-
-    Callbacks to listener methods are synchronous and unsynchronized. It is the responsibility
-    of the implementer to safely handle the potential performance and thread safety issues
-    depending on what their listener is doing.
-
-    If no class is specified, no listener is created. There is no default.
-    -->
-    <cacheManagerEventListenerFactory class="" properties=""/>
-
-
-    <!--
-    CacheManagerPeerProvider
-    ========================
-    (For distributed operation)
-
-    Specifies a CacheManagerPeerProviderFactory which will be used to create a
-    CacheManagerPeerProvider, which discovers other CacheManagers in the cluster.
-
-    One or more providers can be configured. The first one in the ehcache-lmf.xml is the default, which is used
-    for replication and bootstrapping.
-
-    The attributes of cacheManagerPeerProviderFactory are:
-    * class - a fully qualified factory class name
-    * properties - comma separated properties having meaning only to the factory.
-
-    Providers are available for RMI, JGroups and JMS as shown following.
-
-    RMICacheManagerPeerProvider
-    +++++++++++++++++++++++++++
-
-    Ehcache comes with a built-in RMI-based distribution system with two means of discovery of
-    CacheManager peers participating in the cluster:
-    * automatic, using a multicast group. This one automatically discovers peers and detects
-      changes such as peers entering and leaving the group
-    * manual, using manual rmiURL configuration. A hardcoded list of peers is provided at
-      configuration time.
-
-    Configuring Automatic Discovery:
-    Automatic discovery is configured as per the following example:
-    <cacheManagerPeerProviderFactory
-                        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                        properties="hostName=fully_qualified_hostname_or_ip,
-                                    peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
-                                    multicastGroupPort=4446, timeToLive=32"/>
-
-    Valid properties are:
-    * peerDiscovery (mandatory) - specify "automatic"
-    * multicastGroupAddress (mandatory) - specify a valid multicast group address
-    * multicastGroupPort (mandatory) - specify a dedicated port for the multicast heartbeat
-      traffic
-    * timeToLive - specify a value between 0 and 255 which determines how far the packets will
-      propagate.
-
-      By convention, the restrictions are:
-      0   - the same host
-      1   - the same subnet
-      32  - the same site
-      64  - the same region
-      128 - the same continent
-      255 - unrestricted
-
-     * hostName - the hostname or IP of the interface to be used for sending and receiving multicast packets
-       (relevant to mulithomed hosts only)
-
-    Configuring Manual Discovery:
-    Manual discovery requires a unique configuration per host. It is contains a list of rmiURLs for the peers, other
-    than itself. So, if we have server1, server2 and server3 the configuration will be:
-
-    In server1's configuration:
-    <cacheManagerPeerProviderFactory class=
-                          "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                          properties="peerDiscovery=manual,
-                          rmiUrls=//server2:40000/sampleCache1|//server3:40000/sampleCache1
-                          | //server2:40000/sampleCache2|//server3:40000/sampleCache2"
-                          propertySeparator="," />
-
-    In server2's configuration:
-    <cacheManagerPeerProviderFactory class=
-                          "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                          properties="peerDiscovery=manual,
-                          rmiUrls=//server1:40000/sampleCache1|//server3:40000/sampleCache1
-                          | //server1:40000/sampleCache2|//server3:40000/sampleCache2"
-                          propertySeparator="," />
-
-    In server3's configuration:
-    <cacheManagerPeerProviderFactory class=
-                          "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                          properties="peerDiscovery=manual,
-                          rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1
-                          | //server1:40000/sampleCache2|//server2:40000/sampleCache2"
-                          propertySeparator="," />
-
-
-    Valid properties are:
-    * peerDiscovery (mandatory) - specify "manual"
-    * rmiUrls (mandatory) - specify a pipe separated list of rmiUrls, in the form
-                            //hostname:port
-    * hostname (optional) - the hostname is the hostname of the remote CacheManager peer. The port is the listening
-      port of the RMICacheManagerPeerListener of the remote CacheManager peer.
-    
-    JGroupsCacheManagerPeerProvider
-    +++++++++++++++++++++++++++++++
-    <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
-                                     properties="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;
-                                     mcast_send_buf_size=150000;mcast_recv_buf_size=80000):
-                                     PING(timeout=2000;num_initial_members=6):
-                                     MERGE2(min_interval=5000;max_interval=10000):
-                                     FD_SOCK:VERIFY_SUSPECT(timeout=1500):
-                                     pbcast.NAKACK(gc_lag=10;retransmit_timeout=3000):
-                                     UNICAST(timeout=5000):
-                                     pbcast.STABLE(desired_avg_gossip=20000):
-                                     FRAG:
-                                     pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=false)"
-                                     propertySeparator="::"
-            />
-     The only property necessary is the connect String used by jgroups to configure itself. Refer to the Jgroups documentation for explanation
-     of all the protocols. The example above uses UDP multicast. If the connect property is not specified the default JGroups connection will be
-     used.       
-
-
-    JMSCacheManagerPeerProviderFactory
-    ++++++++++++++++++++++++++++++++++
-    <cacheManagerPeerProviderFactory
-            class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory"
-            properties="..."
-            propertySeparator=","
-            />
-
-    The JMS PeerProviderFactory uses JNDI to maintain message queue independence. Refer to the manual for full configuration
-    examples using ActiveMQ and Open Message Queue.
-
-    Valid properties are:
-    * initialContextFactoryName (mandatory) - the name of the factory used to create the message queue initial context.
-    * providerURL (mandatory) - the JNDI configuration information for the service provider to use.
-    * topicConnectionFactoryBindingName (mandatory) - the JNDI binding name for the TopicConnectionFactory
-    * topicBindingName (mandatory) - the JNDI binding name for the topic name
-    * getQueueBindingName (mandatory only if using jmsCacheLoader) - the JNDI binding name for the queue name
-    * securityPrincipalName - the JNDI java.naming.security.principal
-    * securityCredentials - the JNDI java.naming.security.credentials
-    * urlPkgPrefixes - the JNDI java.naming.factory.url.pkgs
-    * userName - the user name to use when creating the TopicConnection to the Message Queue
-    * password - the password to use when creating the TopicConnection to the Message Queue
-    * acknowledgementMode - the JMS Acknowledgement mode for both publisher and subscriber. The available choices are
-                            AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE and SESSION_TRANSACTED. The default is AUTO_ACKNOWLEDGE.
-    -->
-<!--    <cacheManagerPeerProviderFactory-->
-<!--            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"-->
-<!--            properties="peerDiscovery=automatic,-->
-<!--                        multicastGroupAddress=230.0.0.1,-->
-<!--                        multicastGroupPort=4446, timeToLive=1"-->
-<!--            propertySeparator=","-->
-<!--            />-->
-
-
-    <!--
-    CacheManagerPeerListener
-    ========================
-    (Enable for distributed operation)
-
-    Specifies a CacheManagerPeerListenerFactory which will be used to create a
-    CacheManagerPeerListener, which listens for messages from cache replicators participating in the cluster.
-
-    The attributes of cacheManagerPeerListenerFactory are:
-    class - a fully qualified factory class name
-    properties - comma separated properties having meaning only to the factory.
-
-    Ehcache comes with a built-in RMI-based distribution system. The listener component is
-    RMICacheManagerPeerListener which is configured using
-    RMICacheManagerPeerListenerFactory. It is configured as per the following example:
-
-    <cacheManagerPeerListenerFactory
-        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
-        properties="hostName=fully_qualified_hostname_or_ip,
-                    port=40001,
-                    remoteObjectPort=40002,
-                    socketTimeoutMillis=120000"
-                    propertySeparator="," />
-
-    All properties are optional. They are:
-    * hostName - the hostName of the host the listener is running on. Specify
-      where the host is multihomed and you want to control the interface over which cluster
-      messages are received. Defaults to the host name of the default interface if not
-      specified.
-    * port - the port the RMI Registry listener listens on. This defaults to a free port if not specified.
-    * remoteObjectPort - the port number on which the remote objects bound in the registry receive calls.
-                         This defaults to a free port if not specified.
-    * socketTimeoutMillis - the number of ms client sockets will stay open when sending
-      messages to the listener. This should be long enough for the slowest message.
-      If not specified it defaults to 120000ms.
-
-    -->
-<!--    <cacheManagerPeerListenerFactory-->
-<!--            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>-->
-
-    <!-- Cache configuration.
-
-    The following attributes are required.
-
-    name:
-    Sets the name of the cache. This is used to identify the cache. It must be unique.
-
-    maxElementsInMemory:
-    Sets the maximum number of objects that will be created in memory
-
-        maxElementsOnDisk:
-    Sets the maximum number of objects that will be maintained in the DiskStore
-        The default value is zero, meaning unlimited.
-
-    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 memory store
-    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)
-
-    -->
-
-    <!--
-    Mandatory Default Cache configuration. These settings will be applied to caches
-    created programmtically using CacheManager.add(String cacheName)
-    -->
-    <defaultCache
-            maxElementsInMemory="20000"
-            eternal="true"
-            overflowToDisk="false"
-            memoryStoreEvictionPolicy="LRU"
-            />
-
-    <cache name="org.hibernate.cache.StandardQueryCache"
-           maxElementsInMemory="10000"
-           eternal="true"
-           overflowToDisk="false"
-           memoryStoreEvictionPolicy="LRU"/>
-
-    <cache name="org.hibernate.cache.UpdateTimestampsCache"
-           maxElementsInMemory="10000"
-           eternal="true"
-           overflowToDisk="false"/>
-
-    <cache name="PageCache"
-           maxElementsInMemory="1000"
-           eternal="false"
-           overflowToDisk="true"
-           timeToIdleSeconds="1000"
-           timeToLiveSeconds="1000"
-           memoryStoreEvictionPolicy="LRU"/>
-
-<!--  uncomment to enable cache debugging -->
-<!-- 
-	<cacheManagerPeerListenerFactory
-	    class="org.terracotta.ehcachedx.monitor.probe.ProbePeerListenerFactory"
-	    properties="monitorAddress=localhost, monitorPort=9889" />
--->
-
-</ehcache>

http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-caching-ehcache/pom.xml
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-ehcache/pom.xml b/libraries/kiwi/kiwi-caching-ehcache/pom.xml
new file mode 100644
index 0000000..48a727d
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-ehcache/pom.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.marmotta</groupId>
+        <artifactId>kiwi-parent</artifactId>
+        <version>3.2.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>kiwi-caching-ehcache</artifactId>
+    <packaging>jar</packaging>
+
+    <name>KiWi Triplestore: EHCache Cache Backend</name>
+    <description>
+        EHCache cache implementation for the KiWi triplestore. Useful for single-machine production environments.
+    </description>
+
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.marmotta</groupId>
+            <artifactId>kiwi-triplestore</artifactId>
+        </dependency>
+
+        <!-- Caching  -->
+        <dependency>
+            <groupId>net.sf.ehcache</groupId>
+            <artifactId>ehcache</artifactId>
+        </dependency>
+
+
+
+        <!-- Testing -->
+        <dependency>
+            <artifactId>junit</artifactId>
+            <groupId>junit</groupId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.marmotta</groupId>
+            <artifactId>kiwi-triplestore</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <artifactId>hamcrest-core</artifactId>
+            <groupId>org.hamcrest</groupId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <artifactId>hamcrest-library</artifactId>
+            <groupId>org.hamcrest</groupId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>test</scope>
+            <optional>true</optional> <!-- GPL licensed, no dependency -->
+        </dependency>
+        <dependency>
+            <groupId>org.openrdf.sesame</groupId>
+            <artifactId>sesame-rio-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.openrdf.sesame</groupId>
+            <artifactId>sesame-rio-rdfxml</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.openrdf.sesame</groupId>
+            <artifactId>sesame-store-testsuite</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/caching/EHCacheManager.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/caching/EHCacheManager.java b/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/caching/EHCacheManager.java
new file mode 100644
index 0000000..65d7502
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/caching/EHCacheManager.java
@@ -0,0 +1,201 @@
+/*
+ * 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.
+ */
+
+package org.apache.marmotta.kiwi.ehcache.caching;
+
+import org.apache.marmotta.kiwi.caching.CacheManager;
+import org.apache.marmotta.kiwi.config.KiWiConfiguration;
+import org.apache.marmotta.kiwi.ehcache.util.CacheMap;
+import org.apache.marmotta.kiwi.model.rdf.*;
+
+import java.util.Map;
+
+/**
+ * KiWi Cache Manager implementation based on EHCache. Best used for single machine production environments.
+ *
+ * @author Sebastian Schaffert (sschaffert@apache.org)
+ */
+public class EHCacheManager implements CacheManager {
+
+
+    private net.sf.ehcache.CacheManager cacheManager;
+
+    private CacheMap<Long,KiWiNode> nodeCache;
+    private CacheMap<Long,KiWiTriple> tripleCache;
+    private CacheMap<String,KiWiUriResource> uriCache;
+    private CacheMap<String,KiWiAnonResource> bnodeCache;
+    private CacheMap<String,KiWiLiteral> literalCache;
+    private CacheMap<String,KiWiNamespace> nsPrefixCache;
+    private CacheMap<String,KiWiNamespace> nsUriCache;
+
+    private CacheMap<Long,Long> registryCache;
+
+    public EHCacheManager(KiWiConfiguration configuration) {
+        cacheManager = net.sf.ehcache.CacheManager.newInstance(EHCacheManager.class.getResource("/ehcache-kiwi.xml"));
+        if(configuration.getClusterName() != null) {
+            cacheManager.setName(configuration.getClusterName());
+        }
+    }
+
+
+    /**
+     * Return the node id -> node cache from the cache manager. This cache is heavily used to lookup
+     * nodes when querying or loading triples and should therefore have a decent size (default 500.000 elements).
+     *
+     * @return an EHCache Cache instance containing the node id -> node mappings
+     */
+    @Override
+    public Map<Long, KiWiNode> getNodeCache() {
+        if(nodeCache == null) {
+            nodeCache = new CacheMap<>(cacheManager.getCache((NODE_CACHE)));
+        }
+
+        return nodeCache;
+    }
+
+    /**
+     * Return the triple id -> triple cache from the cache manager. This cache is used for speeding up the
+     * construction of query results.
+     *
+     * @return
+     */
+    @Override
+    public Map<Long, KiWiTriple> getTripleCache() {
+        if(tripleCache == null) {
+            tripleCache = new CacheMap<>(cacheManager.getCache((TRIPLE_CACHE)));
+        }
+
+        return tripleCache;
+    }
+
+    /**
+     * Return the uri -> KiWiUriResource cache from the cache manager. This cache is used when constructing new
+     * KiWiUriResources to avoid a database lookup.
+     *
+     * @return
+     */
+    @Override
+    public Map<String, KiWiUriResource> getUriCache() {
+        if(uriCache == null) {
+            uriCache = new CacheMap<>(cacheManager.getCache((URI_CACHE)));
+        }
+
+        return uriCache;
+    }
+
+    /**
+     * Return the anonId -> KiWiAnonResource cache from the cache manager. This cache is used when constructing new
+     * KiWiAnonResources to avoid a database lookup.
+     *
+     * @return
+     */
+    @Override
+    public Map<String, KiWiAnonResource> getBNodeCache() {
+        if(bnodeCache == null) {
+            bnodeCache = new CacheMap<>(cacheManager.getCache((BNODE_CACHE)));
+        }
+
+        return bnodeCache;
+    }
+
+    /**
+     * Return the literal cache key -> KiWiLiteral cache from the cache manager. This cache is used when constructing new
+     * KiWiLiterals to avoid a database lookup.
+     *
+     * @return
+     * @see org.apache.marmotta.commons.sesame.model.LiteralCommons#createCacheKey(String, java.util.Locale, String)
+     */
+    @Override
+    public Map<String, KiWiLiteral> getLiteralCache() {
+        if(literalCache == null) {
+            literalCache = new CacheMap<>(cacheManager.getCache((LITERAL_CACHE)));
+        }
+
+        return literalCache;
+    }
+
+    /**
+     * Return the URI -> namespace cache from the cache manager. Used for looking up namespaces
+     *
+     * @return
+     */
+    @Override
+    public Map<String, KiWiNamespace> getNamespaceUriCache() {
+        if(nsUriCache == null) {
+            nsUriCache = new CacheMap<>(cacheManager.getCache((NS_URI_CACHE)));
+        }
+
+        return nsUriCache;
+    }
+
+    /**
+     * Return the prefix -> namespace cache from the cache manager. Used for looking up namespaces
+     *
+     * @return
+     */
+    @Override
+    public Map<String, KiWiNamespace> getNamespacePrefixCache() {
+        if(nsPrefixCache == null) {
+            nsPrefixCache = new CacheMap<>(cacheManager.getCache((NS_PREFIX_CACHE)));
+        }
+
+        return nsPrefixCache;
+    }
+
+    /**
+     * Create and return the cache used by the CacheTripleRegistry. This is an unlimited synchronous replicated
+     * cache and should be used with care.
+     *
+     * @return
+     */
+    @Override
+    public Map<Long, Long> getRegistryCache() {
+        if(registryCache == null) {
+            registryCache = new CacheMap<>(cacheManager.getCache((REGISTRY_CACHE)));
+        }
+
+        return registryCache;
+    }
+
+    /**
+     * Get the cache with the given name from the cache manager. Can be used to request additional
+     * caches from the cache manager that are not covered by explicit methods.
+     *
+     * @param name
+     * @return
+     */
+    @Override
+    public Map getCacheByName(String name) {
+        return new CacheMap(cacheManager.getCache((name)));
+    }
+
+    /**
+     * Clear all caches managed by this cache manager.
+     */
+    @Override
+    public void clear() {
+        cacheManager.clearAll();
+    }
+
+    /**
+     * Shutdown this cache manager instance. Will shutdown the underlying EHCache cache manager.
+     */
+    @Override
+    public void shutdown() {
+        cacheManager.shutdown();
+    }
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/caching/EHCacheManagerFactory.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/caching/EHCacheManagerFactory.java b/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/caching/EHCacheManagerFactory.java
new file mode 100644
index 0000000..f315e1b
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/caching/EHCacheManagerFactory.java
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+package org.apache.marmotta.kiwi.ehcache.caching;
+
+import org.apache.marmotta.kiwi.caching.CacheManager;
+import org.apache.marmotta.kiwi.caching.CacheManagerFactory;
+import org.apache.marmotta.kiwi.config.KiWiConfiguration;
+
+/**
+ * Create EHCacheManager instances.
+ *
+ * @author Sebastian Schaffert (sschaffert@apache.org)
+ */
+public class EHCacheManagerFactory implements CacheManagerFactory {
+
+    /**
+     * Create a new cache manager instance using the KiWiConfiguration passed as argument.
+     *
+     * @param configuration KiWi configuration used by the underlying triple store
+     * @return a new cache manager instance for this triple store
+     */
+    @Override
+    public CacheManager createCacheManager(KiWiConfiguration configuration) {
+        return new EHCacheManager(configuration);
+    }
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/util/CacheMap.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/util/CacheMap.java b/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/util/CacheMap.java
new file mode 100644
index 0000000..7bfefb6
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-ehcache/src/main/java/org/apache/marmotta/kiwi/ehcache/util/CacheMap.java
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ */
+
+package org.apache.marmotta.kiwi.ehcache.util;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableSet;
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.Element;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A map API wrapper around EHCache caches so it is compatible with the KiWi caching API.
+ *
+ * @author Sebastian Schaffert (sschaffert@apache.org)
+ */
+public class CacheMap<K,V> implements Map<K,V> {
+
+    private Cache delegate;
+
+    public CacheMap(Cache delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public int size() {
+        return delegate.getSize();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return delegate.getSize() == 0;
+    }
+
+    @Override
+    public boolean containsKey(Object o) {
+        return delegate.isKeyInCache(o);
+    }
+
+    @Override
+    public boolean containsValue(Object o) {
+        return delegate.isValueInCache(o);
+    }
+
+    @Override
+    public V get(Object o) {
+        Element e = delegate.get(o);
+
+        if(e != null) {
+            return (V) e.getObjectValue();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public V put(K k, V v) {
+        Element e = delegate.get(k);
+        delegate.put(new Element(k, v));
+
+        if(e != null) {
+            return (V) e.getObjectValue();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public V remove(Object o) {
+        Element e = delegate.removeAndReturnElement(o);
+        if(e != null) {
+            return (V) e.getObjectValue();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public void putAll(Map<? extends K, ? extends V> map) {
+        for(Map.Entry entry : map.entrySet()) {
+            put((K)entry.getKey(), (V)entry.getValue());
+        }
+    }
+
+    @Override
+    public void clear() {
+        delegate.removeAll();
+    }
+
+    @Override
+    public Set<K> keySet() {
+        return ImmutableSet.copyOf(delegate.getKeys());
+    }
+
+    @Override
+    public Collection<V> values() {
+        throw new UnsupportedOperationException("listing values not supported by cache");
+    }
+
+    @Override
+    public Set<Entry<K, V>> entrySet() {
+        return ImmutableSet.copyOf(Collections2.transform(delegate.getKeys(), new Function<K,Entry<K,V>> () {
+            @Override
+            public Entry<K, V> apply(final K input) {
+                final Element e = delegate.get(input);
+                return new Entry<K,V>() {
+                    @Override
+                    public K getKey() {
+                        return input;
+                    }
+
+                    @Override
+                    public V getValue() {
+                        return (V) e.getObjectValue();
+                    }
+
+                    @Override
+                    public V setValue(V v) {
+                        delegate.put(new Element(input,v));
+                        return (V) e.getObjectValue();
+                    }
+                };
+            }
+        }));
+    }
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-caching-ehcache/src/main/resources/META-INF/services/org.apache.marmotta.kiwi.caching.CacheManagerFactory
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-ehcache/src/main/resources/META-INF/services/org.apache.marmotta.kiwi.caching.CacheManagerFactory b/libraries/kiwi/kiwi-caching-ehcache/src/main/resources/META-INF/services/org.apache.marmotta.kiwi.caching.CacheManagerFactory
new file mode 100644
index 0000000..6fd37b2
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-ehcache/src/main/resources/META-INF/services/org.apache.marmotta.kiwi.caching.CacheManagerFactory
@@ -0,0 +1 @@
+org.apache.marmotta.kiwi.ehcache.caching.EHCacheManagerFactory