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:15:52 UTC
[1/2] - re-added support for EHCache as KiWi caching backend
(MARMOTTA-450) - cleanup old use of EHCache (MARMOTTA-443)
Repository: marmotta
Updated Branches:
refs/heads/MARMOTTA-450 18db94512 -> 2c5e8529c
http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-caching-ehcache/src/main/resources/ehcache-kiwi.xml
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-ehcache/src/main/resources/ehcache-kiwi.xml b/libraries/kiwi/kiwi-caching-ehcache/src/main/resources/ehcache-kiwi.xml
new file mode 100644
index 0000000..79af086
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-ehcache/src/main/resources/ehcache-kiwi.xml
@@ -0,0 +1,767 @@
+<?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.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=${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. Another example, useful for Terracotta
+server based deployments is <terracottaConfig url="${serverAndPort}"/ and specify a command line
+switch of -Dserver36:9510
+
+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".
+* dynamicConfig - an optional setting that can be used to disable dynamic configuration of caches
+associated with this CacheManager. By default this is set to true - i.e. dynamic configuration
+is enabled. Dynamically configurable caches can have their TTI, TTL and maximum disk and
+in-memory capacity changed at runtime through the cache's configuration object.
+* 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 clustering and using the
+Terracotta Developer Console. With the "autodetect" value, the presence of Terracotta clustering
+will be detected and monitoring, via the Developer Console, will be enabled. Other allowed values
+are "on" and "off". The default is "autodetect". This setting does not perform any function when
+used with JMX monitors.
+
+* maxBytesLocalHeap - optional setting that constraints the memory usage of the Caches managed by the CacheManager
+to use at most the specified number of bytes of the local VM's heap.
+* maxBytesLocalOffHeap - optional setting that constraints the offHeap usage of the Caches managed by the CacheManager
+to use at most the specified number of bytes of the local VM's offHeap memory.
+* maxBytesLocalDisk - optional setting that constraints the disk usage of the Caches managed by the CacheManager
+to use at most the specified number of bytes of the local disk.
+
+These settings let you define "resource pools", caches will share. For instance setting maxBytesLocalHeap to 100M, will result in
+all caches sharing 100 MegaBytes of ram. The CacheManager will balance these 100 MB across all caches based on their respective usage
+patterns. You can allocate a precise amount of bytes to a particular cache by setting the appropriate maxBytes* attribute for that cache.
+That amount will be subtracted from the CacheManager pools, so that if a cache a specified 30M requirement, the other caches will share
+the remaining 70M.
+
+Also, specifying a maxBytesLocalOffHeap at the CacheManager level will result in overflowToOffHeap to be true by default. If you don't want
+a specific cache to overflow to off heap, you'll have to set overflowToOffHeap="false" explicitly
+
+Here is an example of CacheManager level resource tuning, which will use up to 400M of heap and 2G of offHeap:
+
+<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="ehcache.xsd"
+ updateCheck="true" monitoring="autodetect"
+ dynamicConfig="true" maxBytesLocalHeap="400M" maxBytesLocalOffHeap="2G">
+
+-->
+<ehcache name="kiwi"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ updateCheck="false"
+ maxBytesLocalHeap="60%"
+ dynamicConfig="false"
+ xsi:noNamespaceSchemaLocation="http://ehcache.sf.net/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 ${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/kiwi-cache"/>
+
+
+ <!--
+ 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.
+
+ maxEntriesLocalHeap:
+ Sets the maximum number of objects that will be held on heap memory. 0 = no limit.
+
+ maxEntriesLocalDisk:
+ 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.
+
+ The following attributes and elements are optional.
+
+ maxEntriesInCache:
+ This feature is applicable only to Terracotta distributed caches.
+ Sets the maximum number of entries that can be stored in the cluster. 0 = no limit.
+ Note that clustered cache will still perform eviction if resource usage requires it.
+ This property can be modified dynamically while the cache is operating.
+
+ overflowToOffHeap:
+ (boolean) This feature is available only in enterprise versions of Ehcache.
+ When set to true, enables the cache to utilize off-heap memory
+ storage to improve performance. Off-heap memory is not subject to Java
+ GC. The default value is false.
+
+ maxBytesLocalHeap:
+ Defines how many bytes the cache may use from the VM's heap. If a CacheManager
+ maxBytesLocalHeap has been defined, this Cache's specified amount will be
+ subtracted from the CacheManager. Other caches will share the remainder.
+ This attribute's values are given as <number>k|K|m|M|g|G for
+ kilobytes (k|K), megabytes (m|M), or gigabytes (g|G).
+ For example, maxBytesLocalHeap="2g" allots 2 gigabytes of heap memory.
+ If you specify a maxBytesLocalHeap, you can't use the maxEntriesLocalHeap attribute.
+ maxEntriesLocalHeap can't be used if a CacheManager maxBytesLocalHeap is set.
+
+ Elements put into the cache will be measured in size using net.sf.ehcache.pool.sizeof.SizeOf
+ If you wish to ignore some part of the object graph, see net.sf.ehcache.pool.sizeof.annotations.IgnoreSizeOf
+
+ maxBytesLocalOffHeap:
+ This feature is available only in enterprise versions of Ehcache.
+ Sets the amount of off-heap memory this cache can use, and will reserve.
+
+ This setting will set overflowToOffHeap to true. Set explicitly to false to disable overflow behavior.
+
+ Note that it is recommended to set maxEntriesLocalHeap to at least 100 elements
+ when using an off-heap store, otherwise performance will be seriously degraded,
+ and a warning will be logged.
+
+ The minimum amount that can be allocated is 128MB. There is no maximum.
+
+ maxBytesLocalDisk:
+ As for maxBytesLocalHeap, but specifies the limit of disk storage this cache will ever use.
+
+ 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.
+
+ diskExpiryThreadIntervalSeconds:
+ The number of seconds between runs of the disk expiry thread. The default value
+ is 120 seconds.
+
+ diskSpoolBufferSizeMB:
+ This is the size to allocate the DiskStore for a spool buffer. Writes are made
+ to this area and then asynchronously written to disk. The default size is 30MB.
+ Each spool buffer is used only by its cache. If you get OutOfMemory errors consider
+ lowering this value. To improve DiskStore performance consider increasing it. Trace level
+ logging in the DiskStore will show if put back ups are occurring.
+
+ clearOnFlush:
+ whether the MemoryStore should be cleared when flush() is called on the cache.
+ By default, this is true i.e. the MemoryStore is cleared.
+
+ memoryStoreEvictionPolicy:
+ Policy would be enforced upon reaching the maxEntriesLocalHeap 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)
+
+ copyOnRead:
+ Whether an Element is copied when being read from a cache.
+ By default this is false.
+
+ copyOnWrite:
+ Whether an Element is copied when being added to the cache.
+ By default this is false.
+
+ Cache persistence is configured through the persistence sub-element. The attributes of the
+ persistence element are:
+
+ strategy:
+ Configures the type of persistence provided by the configured cache. This must be one of the
+ following values:
+
+ * localRestartable - Enables the RestartStore and copies all cache entries (on-heap and/or off-heap)
+ to disk. This option provides fast restartability with fault tolerant cache persistence on disk.
+ It is available for Enterprise Ehcache users only.
+
+ * localTempSwap - Swaps cache entries (on-heap and/or off-heap) to disk when the cache is full.
+ "localTempSwap" is not persistent.
+
+ * none - Does not persist cache entries.
+
+ * distributed - Defers to the <terracotta> configuration for persistence settings. This option
+ is not applicable for standalone.
+
+ synchronousWrites:
+ When set to true write operations on the cache do not return until after the operations data has been
+ successfully flushed to the disk storage. This option is only valid when used with the "localRestartable"
+ strategy, and defaults to false.
+
+ The following example configuration shows a cache configured for localTempSwap restartability.
+
+ <cache name="persistentCache" maxEntriesLocalHeap="1000">
+ <persistence strategy="localTempSwap"/>
+ </cache>
+
+ Cache elements can also contain sub elements which take the same format of a factory class
+ and properties. Defined sub-elements are:
+
+ * cacheEventListenerFactory - Enables registration of listeners for cache events, such as
+ put, remove, update, and expire.
+
+ * bootstrapCacheLoaderFactory - Specifies a BootstrapCacheLoader, which is called by a
+ cache on initialisation to prepopulate itself.
+
+ * cacheExtensionFactory - Specifies a CacheExtension, a generic mechanism to tie a class
+ which holds a reference to a cache to the cache lifecycle.
+
+ * cacheExceptionHandlerFactory - Specifies a CacheExceptionHandler, which is called when
+ cache exceptions occur.
+
+ * cacheLoaderFactory - Specifies a CacheLoader, which can be used both asynchronously and
+ synchronously to load objects into a cache. More than one cacheLoaderFactory element
+ can be added, in which case the loaders form a chain which are executed in order. If a
+ loader returns null, the next in chain is called.
+
+ * copyStrategy - Specifies a fully qualified class which implements
+ net.sf.ehcache.store.compound.CopyStrategy. This strategy will be used for copyOnRead
+ and copyOnWrite in place of the default which is serialization.
+
+ Example of cache level resource tuning:
+ <cache name="memBound" maxBytesLocalHeap="100m" maxBytesLocalOffHeap="4g" maxBytesLocalDisk="200g" />
+
+
+ Cache Event Listeners
+ +++++++++++++++++++++
+
+ All cacheEventListenerFactory elements can take an optional property listenFor that describes
+ which events will be delivered in a clustered environment. The listenFor attribute has the
+ following allowed values:
+
+ * all - the default is to deliver all local and remote events
+ * local - deliver only events originating in the current node
+ * remote - deliver only events originating in other nodes
+
+ Example of setting up a logging listener for local cache events:
+
+ <cacheEventListenerFactory class="my.company.log.CacheLogger"
+ listenFor="local" />
+
+
+ Search
+ ++++++
+
+ A <cache> can be made searchable by adding a <searchable/> sub-element. By default the keys
+ and value objects of elements put into the cache will be attributes against which
+ queries can be expressed.
+
+ <cache>
+ <searchable/>
+ </cache>
+
+
+ An "attribute" of the cache elements can also be defined to be searchable. In the example below
+ an attribute with the name "age" will be available for use in queries. The value for the "age"
+ attribute will be computed by calling the method "getAge()" on the value object of each element
+ in the cache. See net.sf.ehcache.search.attribute.ReflectionAttributeExtractor for the format of
+ attribute expressions. Attribute values must also conform to the set of types documented in the
+ net.sf.ehcache.search.attribute.AttributeExtractor interface
+
+ <cache>
+ <searchable>
+ <searchAttribute name="age" expression="value.getAge()"/>
+ </searchable>
+ </cache>
+
+
+ Attributes may also be defined using a JavaBean style. With the following attribute declaration
+ a public method getAge() will be expected to be found on either the key or value for cache elements
+
+ <cache>
+ <searchable>
+ <searchAttribute name="age"/>
+ </searchable>
+ </cache>
+
+ In more complex situations you can create your own attribute extractor by implementing the
+ AttributeExtractor interface. Providing your extractor class is shown in the following example:
+
+ <cache>
+ <searchable>
+ <searchAttribute name="age" class="com.example.MyAttributeExtractor"/>
+ </searchable>
+ </cache>
+
+ Use properties to pass state to your attribute extractor if needed. Your implementation must provide
+ a public constructor that takes a single java.util.Properties instance
+
+ <cache>
+ <searchable>
+ <searchAttribute name="age" class="com.example.MyAttributeExtractor" properties="foo=1,bar=2"/>
+ </searchable>
+ </cache>
+
+
+ RMI Cache Replication
+ +++++++++++++++++++++
+
+ Each cache that will be distributed needs to set a cache event listener which replicates
+ messages to the other CacheManager peers. For the built-in RMI implementation this is done
+ by adding a cacheEventListenerFactory element of type RMICacheReplicatorFactory to each
+ distributed cache's configuration as per the following example:
+
+ <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
+ properties="replicateAsynchronously=true,
+ replicatePuts=true,
+ replicatePutsViaCopy=false,
+ replicateUpdates=true,
+ replicateUpdatesViaCopy=true,
+ replicateRemovals=true,
+ asynchronousReplicationIntervalMillis=<number of milliseconds>,
+ asynchronousReplicationMaximumBatchSize=<number of operations>"
+ propertySeparator="," />
+
+ The RMICacheReplicatorFactory recognises the following properties:
+
+ * replicatePuts=true|false - whether new elements placed in a cache are
+ replicated to others. Defaults to true.
+
+ * replicatePutsViaCopy=true|false - whether the new elements are
+ copied to other caches (true), or whether a remove message is sent. Defaults to true.
+
+ * replicateUpdates=true|false - whether new elements which override an
+ element already existing with the same key are replicated. Defaults to true.
+
+ * replicateRemovals=true - whether element removals are replicated. Defaults to true.
+
+ * replicateAsynchronously=true | false - whether replications are
+ asynchronous (true) or synchronous (false). Defaults to true.
+
+ * replicateUpdatesViaCopy=true | false - whether the new elements are
+ copied to other caches (true), or whether a remove message is sent. Defaults to true.
+
+ * asynchronousReplicationIntervalMillis=<number of milliseconds> - The asynchronous
+ replicator runs at a set interval of milliseconds. The default is 1000. The minimum
+ is 10. This property is only applicable if replicateAsynchronously=true
+
+ * asynchronousReplicationMaximumBatchSize=<number of operations> - The maximum
+ number of operations that will be batch within a single RMI message. The default
+ is 1000. This property is only applicable if replicateAsynchronously=true
+
+ JGroups Replication
+ +++++++++++++++++++
+
+ For the Jgroups replication this is done with:
+ <cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
+ properties="replicateAsynchronously=true, replicatePuts=true,
+ replicateUpdates=true, replicateUpdatesViaCopy=false,
+ replicateRemovals=true,asynchronousReplicationIntervalMillis=1000"/>
+ This listener supports the same properties as the RMICacheReplicationFactory.
+
+
+ JMS Replication
+ +++++++++++++++
+
+ For JMS-based replication this is done with:
+ <cacheEventListenerFactory
+ class="net.sf.ehcache.distribution.jms.JMSCacheReplicatorFactory"
+ properties="replicateAsynchronously=true,
+ replicatePuts=true,
+ replicateUpdates=true,
+ replicateUpdatesViaCopy=true,
+ replicateRemovals=true,
+ asynchronousReplicationIntervalMillis=1000"
+ propertySeparator=","/>
+
+ This listener supports the same properties as the RMICacheReplicationFactory.
+
+ Cluster Bootstrapping
+ +++++++++++++++++++++
+
+ Bootstrapping a cluster may use a different mechanism to replication. e.g you can mix
+ JMS replication with bootstrap via RMI - just make sure you have the cacheManagerPeerProviderFactory
+ and cacheManagerPeerListenerFactory configured.
+
+ There are two bootstrapping mechanisms: RMI and JGroups.
+
+ RMI Bootstrap
+
+ The RMIBootstrapCacheLoader bootstraps caches in clusters where RMICacheReplicators are
+ used. It is configured as per the following example:
+
+ <bootstrapCacheLoaderFactory
+ class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
+ properties="bootstrapAsynchronously=true, maximumChunkSizeBytes=5000000"
+ propertySeparator="," />
+
+ The RMIBootstrapCacheLoaderFactory recognises the following optional properties:
+
+ * bootstrapAsynchronously=true|false - whether the bootstrap happens in the background
+ after the cache has started. If false, bootstrapping must complete before the cache is
+ made available. The default value is true.
+
+ * maximumChunkSizeBytes=<integer> - Caches can potentially be very large, larger than the
+ memory limits of the VM. This property allows the bootstraper to fetched elements in
+ chunks. The default chunk size is 5000000 (5MB).
+
+ JGroups Bootstrap
+
+ Here is an example of bootstrap configuration using JGroups boostrap:
+
+ <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsBootstrapCacheLoaderFactory"
+ properties="bootstrapAsynchronously=true"/>
+
+ The configuration properties are the same as for RMI above. Note that JGroups bootstrap only supports
+ asynchronous bootstrap mode.
+
+
+ Cache Exception Handling
+ ++++++++++++++++++++++++
+
+ By default, most cache operations will propagate a runtime CacheException on failure. An
+ interceptor, using a dynamic proxy, may be configured so that a CacheExceptionHandler can
+ be configured to intercept Exceptions. Errors are not intercepted.
+
+ It is configured as per the following example:
+
+ <cacheExceptionHandlerFactory class="com.example.ExampleExceptionHandlerFactory"
+ properties="logLevel=FINE"/>
+
+ Caches with ExceptionHandling configured are not of type Cache, but are of type Ehcache only,
+ and are not available using CacheManager.getCache(), but using CacheManager.getEhcache().
+
+
+ Cache Loader
+ ++++++++++++
+
+ A default CacheLoader may be set which loads objects into the cache through asynchronous and
+ synchronous methods on Cache. This is different to the bootstrap cache loader, which is used
+ only in distributed caching.
+
+ It is configured as per the following example:
+
+ <cacheLoaderFactory class="com.example.ExampleCacheLoaderFactory"
+ properties="type=int,startCounter=10"/>
+
+ Element value comparator
+ ++++++++++++++++++++++++
+
+ These two cache atomic methods:
+ removeElement(Element e)
+ replace(Element old, Element element)
+
+ rely on comparison of cached elements value. The default implementation relies on Object.equals()
+ but that can be changed in case you want to use a different way to compute equality of two elements.
+
+ This is configured as per the following example:
+
+ <elementValueComparator class="com.company.xyz.MyElementComparator"/>
+
+ The MyElementComparator class must implement the is net.sf.ehcache.store.ElementValueComparator
+ interface. The default implementation is net.sf.ehcache.store.DefaultElementValueComparator.
+
+
+ SizeOf Policy
+ +++++++++++++
+
+ Control how deep the SizeOf engine can go when sizing on-heap elements.
+
+ This is configured as per the following example:
+
+ <sizeOfPolicy maxDepth="100" maxDepthExceededBehavior="abort"/>
+
+ maxDepth controls how many linked objects can be visited before the SizeOf engine takes any action.
+ maxDepthExceededBehavior specifies what happens when the max depth is exceeded while sizing an object graph.
+ "continue" makes the SizeOf engine log a warning and continue the sizing. This is the default.
+ "abort" makes the SizeOf engine abort the sizing, log a warning and mark the cache as not correctly tracking
+ memory usage. This makes Ehcache.hasAbortedSizeOf() return true when this happens.
+
+ The SizeOf policy can be configured at the cache manager level (directly under <ehcache>) and at
+ the cache level (under <cache> or <defaultCache>). The cache policy always overrides the cache manager
+ one if both are set. This element has no effect on distributed caches.
+
+ Transactions
+ ++++++++++++
+
+ To enable an ehcache as transactions, set the transactionalMode
+
+ transactionalMode="xa" - high performance JTA/XA implementation
+ transactionalMode="xa_strict" - canonically correct JTA/XA implementation
+ transactionMode="local" - high performance local transactions involving caches only
+ transactionalMode="off" - the default, no transactions
+
+ If set, all cache operations will need to be done through transactions.
+
+ To prevent users keeping references on stored elements and modifying them outside of any transaction's control,
+ transactions also require the cache to be configured copyOnRead and copyOnWrite.
+
+ CacheWriter
+ ++++++++++++
+
+ A CacheWriter can be set to write to an underlying resource. Only one CacheWriter can be
+ configured per cache.
+
+ The following is an example of how to configure CacheWriter for write-through:
+
+ <cacheWriter writeMode="write-through" notifyListenersOnException="true">
+ <cacheWriterFactory class="net.sf.ehcache.writer.TestCacheWriterFactory"
+ properties="type=int,startCounter=10"/>
+ </cacheWriter>
+
+ The following is an example of how to configure CacheWriter for write-behind:
+
+ <cacheWriter writeMode="write-behind" minWriteDelay="1" maxWriteDelay="5"
+ rateLimitPerSecond="5" writeCoalescing="true" writeBatching="true" writeBatchSize="1"
+ retryAttempts="2" retryAttemptDelaySeconds="1">
+ <cacheWriterFactory class="net.sf.ehcache.writer.TestCacheWriterFactory"
+ properties="type=int,startCounter=10"/>
+ </cacheWriter>
+
+ The cacheWriter element has the following attributes:
+ * writeMode: the write mode, write-through or write-behind
+
+ These attributes only apply to write-through mode:
+ * notifyListenersOnException: Sets whether to notify listeners when an exception occurs on a writer operation.
+
+ These attributes only apply to write-behind mode:
+ * minWriteDelay: Set the minimum number of seconds to wait before writing behind. If set to a value greater than 0,
+ it permits operations to build up in the queue. This is different from the maximum write delay in that by waiting
+ a minimum amount of time, work is always being built up. If the minimum write delay is set to zero and the
+ CacheWriter performs its work very quickly, the overhead of processing the write behind queue items becomes very
+ noticeable in a cluster since all the operations might be done for individual items instead of for a collection
+ of them.
+ * maxWriteDelay: Set the maximum number of seconds to wait before writing behind. If set to a value greater than 0,
+ it permits operations to build up in the queue to enable effective coalescing and batching optimisations.
+ * writeBatching: Sets whether to batch write operations. If set to true, writeAll and deleteAll will be called on
+ the CacheWriter rather than write and delete being called for each key. Resources such as databases can perform
+ more efficiently if updates are batched, thus reducing load.
+ * writeBatchSize: Sets the number of operations to include in each batch when writeBatching is enabled. If there are
+ less entries in the write-behind queue than the batch size, the queue length size is used.
+ * rateLimitPerSecond: Sets the maximum number of write operations to allow per second when writeBatching is enabled.
+ * writeCoalescing: Sets whether to use write coalescing. If set to true and multiple operations on the same key are
+ present in the write-behind queue, only the latest write is done, as the others are redundant.
+ * retryAttempts: Sets the number of times the operation is retried in the CacheWriter, this happens after the
+ original operation.
+ * retryAttemptDelaySeconds: Sets the number of seconds to wait before retrying an failed operation.
+
+ Cache Extension
+ +++++++++++++++
+
+ CacheExtensions are a general purpose mechanism to allow generic extensions to a Cache.
+ CacheExtensions are tied into the Cache lifecycle.
+
+ CacheExtensions are created using the CacheExtensionFactory which has a
+ <code>createCacheCacheExtension()</code> method which takes as a parameter a
+ Cache and properties. It can thus call back into any public method on Cache, including, of
+ course, the load methods.
+
+ Extensions are added as per the following example:
+
+ <cacheExtensionFactory class="com.example.FileWatchingCacheRefresherExtensionFactory"
+ properties="refreshIntervalMillis=18000, loaderTimeout=3000,
+ flushPeriod=whatever, someOtherProperty=someValue ..."/>
+
+ Cache Decorator Factory
+ +++++++++++++++++++++++
+
+ Cache decorators can be configured directly in ehcache.xml. The decorators will be created and added to the CacheManager.
+ It accepts the name of a concrete class that extends net.sf.ehcache.constructs.CacheDecoratorFactory
+ The properties will be parsed according to the delimiter (default is comma ',') and passed to the concrete factory's
+ <code>createDecoratedEhcache(Ehcache cache, Properties properties)</code> method along with the reference to the owning cache.
+
+ It is configured as per the following example:
+
+ <cacheDecoratorFactory
+ class="com.company.DecoratedCacheFactory"
+ properties="property1=true ..." />
+
+ Distributed Caching with Terracotta
+ +++++++++++++++++++++++++++++++++++
+
+ Distributed Caches connect to a Terracotta Server Array. They are configured with the <terracotta> sub-element.
+
+ The <terracotta> sub-element has the following attributes:
+
+ * clustered=true|false - indicates whether this cache should be clustered (distributed) with Terracotta. By
+ default, if the <terracotta> element is included, clustered=true.
+
+ * copyOnRead=true|false - indicates whether cache values are deserialized on every read or if the
+ materialized cache value can be re-used between get() calls. This setting is useful if a cache
+ is being shared by callers with disparate classloaders or to prevent local drift if keys/values
+ are mutated locally without being put back in the cache.
+
+ The default is false.
+
+ * consistency=strong|eventual - Indicates whether this cache should have strong consistency or eventual
+ consistency. The default is eventual. See the documentation for the meaning of these terms.
+
+ * synchronousWrites=true|false
+
+ Synchronous writes (synchronousWrites="true") maximize data safety by blocking the client thread until
+ the write has been written to the Terracotta Server Array.
+
+ This option is only available with consistency=strong. The default is false.
+
+ * concurrency - the number of segments that will be used by the map underneath the Terracotta Store.
+ Its optional and has default value of 0, which means will use default values based on the internal
+ Map being used underneath the store.
+
+ This value cannot be changed programmatically once a cache is initialized.
+
+ The <terracotta> sub-element also has a <nonstop> sub-element to allow configuration of cache behaviour if a distributed
+ cache operation cannot be completed within a set time or in the event of a clusterOffline message. If this element does not appear, nonstop behavior is off.
+
+ <nonstop> has the following attributes:
+
+ * enabled="true" - defaults to true.
+
+ * timeoutMillis - An SLA setting, so that if a cache operation takes longer than the allowed ms, it will timeout.
+
+ * searchTimeoutMillis - If a cache search operation in the nonstop mode takes longer than the allowed ms, it will timeout.
+
+ * immediateTimeout="true|false" - What to do on receipt of a ClusterOffline event indicating that communications
+ with the Terracotta Server Array were interrupted.
+
+ <nonstop> has one sub-element, <timeoutBehavior> which has the following attribute:
+
+ * type="noop|exception|localReads|localReadsAndExceptionOnWrite" - What to do when a timeout has occurred. Exception is the default.
+
+ Simplest example to indicate clustering:
+ <terracotta/>
+
+ To indicate the cache should not be clustered (or remove the <terracotta> element altogether):
+ <terracotta clustered="false"/>
+
+ To indicate the cache should be clustered using "eventual" consistency mode for better performance :
+ <terracotta clustered="true" consistency="eventual"/>
+
+ To indicate the cache should be clustered using synchronous-write locking level:
+ <terracotta clustered="true" synchronousWrites="true"/>
+ -->
+
+ <!--
+ Mandatory Default Cache configuration. These settings will be applied to caches
+ created programmtically using CacheManager.add(String cacheName)
+ -->
+ <defaultCache
+ eternal="true"
+ overflowToDisk="false"
+ memoryStoreEvictionPolicy="LRU"
+ />
+
+ <!--
+ a cache from database ID to KiWiNode; should be very large since this kind of lookup is a very frequent operation
+ -->
+ <cache name="node-cache"
+ maxBytesLocalHeap="30%"
+ timeToLiveSeconds="3600"
+ overflowToDisk="false"
+ memoryStoreEvictionPolicy="LFU"/>
+
+ <!--
+ a cache from database ID to KiWiTriple; should be fairly large since it can speed up loading query results
+ from the database by avoiding reconstructing each triple from the database result
+ -->
+ <cache name="triple-cache"
+ maxBytesLocalHeap="10%"
+ overflowToDisk="false"
+ timeToLiveSeconds="3600"
+ memoryStoreEvictionPolicy="LFU"/>
+
+
+ <!-- a cache from URI to KiWiUriResource -->
+ <cache name="uri-cache"
+ maxBytesLocalHeap="10%"
+ overflowToDisk="false"
+ timeToLiveSeconds="3600"
+ memoryStoreEvictionPolicy="LRU"/>
+
+ <!-- a cache from anonymous ID to KiWiAnonResource -->
+ <cache name="bnode-cache"
+ maxBytesLocalHeap="5%"
+ overflowToDisk="false"
+ timeToLiveSeconds="3600"
+ memoryStoreEvictionPolicy="LRU"/>
+
+
+ <!-- a cache from literal cache key to KiWiLiteral -->
+ <cache name="literal-cache"
+ maxBytesLocalHeap="10%"
+ overflowToDisk="false"
+ timeToLiveSeconds="3600"
+ memoryStoreEvictionPolicy="LFU"/>
+
+
+ <cache name="namespace-prefix-cache"
+ maxBytesLocalHeap="5%"
+ eternal="true"
+ overflowToDisk="false"
+ memoryStoreEvictionPolicy="LFU"/>
+
+ <cache name="namespace-uri-cache"
+ maxBytesLocalHeap="5%"
+ eternal="true"
+ overflowToDisk="false"
+ memoryStoreEvictionPolicy="LFU"/>
+
+
+ <cache name="registry-cache"
+ maxEntriesLocalHeap="0"
+ eternal="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/libraries/kiwi/kiwi-caching-ehcache/src/test/java/org/apache/marmotta/kiwi/test/caching/EHCacheRepositoryConnectionTest.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-ehcache/src/test/java/org/apache/marmotta/kiwi/test/caching/EHCacheRepositoryConnectionTest.java b/libraries/kiwi/kiwi-caching-ehcache/src/test/java/org/apache/marmotta/kiwi/test/caching/EHCacheRepositoryConnectionTest.java
new file mode 100644
index 0000000..80f54ad
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-ehcache/src/test/java/org/apache/marmotta/kiwi/test/caching/EHCacheRepositoryConnectionTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.test.caching;
+
+import org.apache.marmotta.kiwi.config.CachingBackends;
+import org.apache.marmotta.kiwi.config.KiWiConfiguration;
+import org.apache.marmotta.kiwi.sail.KiWiStore;
+import org.apache.marmotta.kiwi.test.junit.KiWiDatabaseRunner;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openrdf.repository.Repository;
+import org.openrdf.repository.RepositoryConnectionTest;
+import org.openrdf.repository.sail.SailRepository;
+
+/**
+ * Run the {@link org.openrdf.repository.RepositoryConnectionTest}s.
+ * @author Jakob Frank <ja...@apache.org>
+ *
+ */
+@RunWith(KiWiDatabaseRunner.class)
+public class EHCacheRepositoryConnectionTest extends RepositoryConnectionTest {
+
+ private final KiWiConfiguration config;
+
+ public EHCacheRepositoryConnectionTest(KiWiConfiguration config) {
+ this.config = config;
+ config.setClustered(false);
+ config.setCachingBackend(CachingBackends.EHCACHE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openrdf.repository.RepositoryConnectionTest#createRepository()
+ */
+ @Override
+ protected Repository createRepository() throws Exception {
+ config.setDefaultContext(null);
+ KiWiStore store = new KiWiStore(config);
+ store.setDropTablesOnShutdown(true);
+ return new SailRepository(store);
+ }
+
+ @Ignore
+ @Test
+ @Override
+ public void testOrderByQueriesAreInterruptable() throws Exception {
+ }
+}
http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-caching-ehcache/src/test/java/org/apache/marmotta/kiwi/test/caching/EHCacheRepositoryTest.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-ehcache/src/test/java/org/apache/marmotta/kiwi/test/caching/EHCacheRepositoryTest.java b/libraries/kiwi/kiwi-caching-ehcache/src/test/java/org/apache/marmotta/kiwi/test/caching/EHCacheRepositoryTest.java
new file mode 100644
index 0000000..15df596
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-ehcache/src/test/java/org/apache/marmotta/kiwi/test/caching/EHCacheRepositoryTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.test.caching;
+
+import org.apache.marmotta.kiwi.config.CachingBackends;
+import org.apache.marmotta.kiwi.config.KiWiConfiguration;
+import org.apache.marmotta.kiwi.sail.KiWiStore;
+import org.apache.marmotta.kiwi.test.junit.KiWiDatabaseRunner;
+import org.junit.runner.RunWith;
+import org.openrdf.repository.Repository;
+import org.openrdf.repository.RepositoryTest;
+import org.openrdf.repository.sail.SailRepository;
+
+/**
+ * Run the {@link org.openrdf.repository.RepositoryTest}s.
+ * @author Jakob Frank <ja...@apache.org>
+ *
+ */
+@RunWith(KiWiDatabaseRunner.class)
+public class EHCacheRepositoryTest extends RepositoryTest {
+
+ private final KiWiConfiguration config;
+
+ private KiWiStore store;
+
+ public EHCacheRepositoryTest(KiWiConfiguration config) {
+ this.config = config;
+ config.setClustered(false);
+ config.setCachingBackend(CachingBackends.EHCACHE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openrdf.repository.RepositoryTest#createRepository()
+ */
+ @Override
+ protected Repository createRepository() throws Exception {
+ store = new KiWiStore(config);
+ return new SailRepository(store);
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ store.getPersistence().dropDatabase();
+ super.tearDown();
+ }
+}
http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-caching-hazelcast/src/main/resources/META-INF/services/org.apache.marmotta.kiwi.caching.CacheManagerFactory
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-caching-hazelcast/src/main/resources/META-INF/services/org.apache.marmotta.kiwi.caching.CacheManagerFactory b/libraries/kiwi/kiwi-caching-hazelcast/src/main/resources/META-INF/services/org.apache.marmotta.kiwi.caching.CacheManagerFactory
new file mode 100644
index 0000000..dde7847
--- /dev/null
+++ b/libraries/kiwi/kiwi-caching-hazelcast/src/main/resources/META-INF/services/org.apache.marmotta.kiwi.caching.CacheManagerFactory
@@ -0,0 +1 @@
+org.apache.marmotta.kiwi.hazelcast.caching.HazelcastCacheManagerFactory
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/config/CachingBackends.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/config/CachingBackends.java b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/config/CachingBackends.java
index 9698259..9e936d9 100644
--- a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/config/CachingBackends.java
+++ b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/config/CachingBackends.java
@@ -43,7 +43,13 @@ public enum CachingBackends {
/**
* Cache backend based on Hazelcast using a dynamic cluster setup
*/
- HAZELCAST("org.apache.marmotta.kiwi.hazelcast.caching.HazelcastCacheManagerFactory");
+ HAZELCAST("org.apache.marmotta.kiwi.hazelcast.caching.HazelcastCacheManagerFactory"),
+
+
+ /**
+ * Cache backend based in EHCache for single-machine production environments.
+ */
+ EHCACHE("org.apache.marmotta.kiwi.ehcache.caching.EHCacheManagerFactory");
CachingBackends(String factoryClass) {
http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/libraries/kiwi/pom.xml
----------------------------------------------------------------------
diff --git a/libraries/kiwi/pom.xml b/libraries/kiwi/pom.xml
index 034464a..f86a467 100644
--- a/libraries/kiwi/pom.xml
+++ b/libraries/kiwi/pom.xml
@@ -113,6 +113,7 @@
<module>kiwi-triplestore</module>
<module>kiwi-caching-infinispan</module>
<module>kiwi-caching-hazelcast</module>
+ <module>kiwi-caching-ehcache</module>
<module>kiwi-versioning</module>
<module>kiwi-reasoner</module>
<module>kiwi-sparql</module>
http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 58f7cd2..abb622c 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1033,6 +1033,7 @@
<version>${project.version}</version>
</dependency>
+ <!-- Infinispan Caching Backend -->
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
@@ -1060,6 +1061,7 @@
</dependency>
+ <!-- Hazelcast Caching Backend -->
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
@@ -1067,6 +1069,13 @@
</dependency>
+ <!-- EHCache Caching Backend -->
+ <dependency>
+ <groupId>net.sf.ehcache</groupId>
+ <artifactId>ehcache</artifactId>
+ <version>2.8.1</version>
+ </dependency>
+
<!-- use stable versions for some dependencies -->
<dependency>
<groupId>org.jboss.spec.javax.annotation</groupId>
http://git-wip-us.apache.org/repos/asf/marmotta/blob/2c5e8529/platform/marmotta-core/src/main/resources/META-INF/ehcache.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-core/src/main/resources/META-INF/ehcache.xml b/platform/marmotta-core/src/main/resources/META-INF/ehcache.xml
deleted file mode 100644
index f51210a..0000000
--- a/platform/marmotta-core/src/main/resources/META-INF/ehcache.xml
+++ /dev/null
@@ -1,500 +0,0 @@
-<?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.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=${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 ${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/marmotta-cache"/>
-
- <!--
- 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.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.apache.marmotta.platform.core.model.rdf.KiWiNode"
- statistics="true"
- maxElementsInMemory="10000"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
- <cache name="org.apache.marmotta.platform.versioning.model.Version"
- statistics="true"
- maxElementsInMemory="10000"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
-
- <cache name="org.apache.marmotta.platform.core.model.rdf.KiWiNamespace"
- statistics="true"
- maxElementsInMemory="100"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
- <cache name="org.apache.marmotta.platform.core.model.user.KiWiGroup"
- statistics="true"
- maxElementsInMemory="100"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
- <cache name="org.apache.marmotta.platform.core.model.user.MarmottaUser"
- statistics="true"
- maxElementsInMemory="100"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
-
- <cache name="org.apache.marmotta.platform.core.model.rdf.KiWiTriple"
- statistics="true"
- maxElementsInMemory="100000"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
- <cache name="org.apache.marmotta.platform.reasoner.model.Pattern"
- statistics="true"
- maxElementsInMemory="1000"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
- <cache name="org.apache.marmotta.platform.reasoner.model.Field"
- statistics="true"
- maxElementsInMemory="10000"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
- <!--
- <cache name="org.hibernate.cache.StandardQueryCache"
- statistics="true"
- maxElementsInMemory="10000"
- eternal="true"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
-
- <cache name="org.hibernate.cache.UpdateTimestampsCache"
- statistics="true"
- maxElementsInMemory="10000"
- eternal="true"
- overflowToDisk="false"/>
- -->
-
- <!-- the cache used for triple queries by KiWi -->
- <!-- 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="triple-cache"
- statistics="true"
- maxElementsInMemory="100000"
- memoryStoreEvictionPolicy="LRU"
- 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="10000"
- 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"/>
-
- <!-- the cache used by the file system importer module -->
- <cache name="fsimport-file-cache"
- statistics="true"
- maxElementsInMemory="500"
- timeToIdleSeconds="3600"
- memoryStoreEvictionPolicy="LRU"
- diskPersistent="true"
- eternal="true"/>
-
-<!-- uncomment to enable cache debugging -->
-<!--
- <cacheManagerPeerListenerFactory
- class="org.terracotta.ehcachedx.monitor.probe.ProbePeerListenerFactory"
- properties="monitorAddress=localhost, monitorPort=9889" />
--->
-
-</ehcache>
[2/2] git commit: - re-added support for EHCache as KiWi caching
backend (MARMOTTA-450) - cleanup old use of EHCache (MARMOTTA-443)
Posted by ss...@apache.org.
- 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/MARMOTTA-450
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