Class ResourceCache
- java.lang.Object
-
- org.xmlresolver.CatalogManager
-
- org.xmlresolver.cache.ResourceCache
-
- All Implemented Interfaces:
XMLCatalogResolver
public class ResourceCache extends CatalogManager
Implements a resource cache.Resources added to the cache are stored locally. Access to the cache is through an OASIS XML Catalog returned by the
catalog()method. After a catalog search that includes the cache catalog, you can test if the local copy of the resource is expired. If it is, it will be removed from the cache.Implementation details
The underlying cache is implemented using the filesystem. A cache directory must be given when the cache is created. The
ResourceCachemust have write access to the directory. The directory specified should be used exclusively for the cache in order to avoid filename collisions and other errors.The cache uses three subdirectories and two files:
- Catalog entries for files in the cache are stored in the
entrydirectory. - The actual resources are stored in the
datadirectory. - Expired entries are stored in
expired. - The
lockfile is used to maintain synchronized access to the cache directory (multiple threads and even multiple applications running perhaps in different VMs can share the same cache directory). - The
control.xmlfile can be used to configure the cache.
When a resource is added to the cache, the data is stored in the
datadirectory and a catalog entry is created in theentrydirectory. After the entry has been added, the next request for the catalog will include this entry.When a resource expires, its catalog entry file is moved to the
expireddirectory. The actual data is not removed right away because other caches may still have that entry in their catalog.During catalog initialization, all of the the expired entries are scanned. If any of them are older than a "delete wait" threshold, they are deleted along with their data.
The cache control file contains caching parameters:
<cache-control xmlns="http://xmlresolver.org/ns/cache" max-age="86400" delete-wait="86400" size="1500" space="10m"> <cache uri="http://www.w3.org/" max-age="172800" space="500k"/> <no-cache uri="http://localhost/"/> <cache uri="http://www.flickr.com/" max-age="0"/> <cache uri="http://flickr.com/" max-age="0"/> </cache-control>If definitive information about the age of a resource cannot be determined and it is older than "max-age", it will be treated as out-of-date and its cached entry will be updated.
Entries in the cache are sorted by age. If the cache exceeds "size" entries or "space" bytes of storage, then the oldest entries are deleted.
The
cacheandno-cacheelements match URIs by regular expression. If ano-cacheentry matches, then the URI is not cached. If no entry matches, the default is to cache with the parameters specified on thecache-controlelement.
-
-
Field Summary
Fields Modifier and Type Field Description static longcacheSizeThe maximum size of the cache (in files).static longcacheSpaceThe maximum size of the cache (in bytes).static java.lang.StringdefaultPatternThe default cache pattern.static longdeleteWaitLength of time a cached resource remains available after it has been deleted.static java.lang.String[]excludedPatternsExcluded patterns.static longmaxAgeThe maximum age of a file in the cache.
-
Constructor Summary
Constructors Constructor Description ResourceCache(ResolverConfiguration config)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description CacheInfoaddCacheInfo(java.lang.String pattern, boolean cache)CacheInfoaddCacheInfo(java.lang.String pattern, boolean cache, long deleteWait, long cacheSize, long cacheSpace, long maxAge)CacheEntrycachedNamespaceUri(java.net.URI uri, java.lang.String nature, java.lang.String purpose)CacheEntrycachedSystem(java.net.URI systemId, java.lang.String publicId)CacheEntrycachedUri(java.net.URI uri)booleancacheURI(java.lang.String uri)Returns true if the specified absolute URI should be cached.java.lang.Stringdirectory()Returns the cache directory associated with this ResourceCache.java.util.List<CacheEntry>entries()booleanexpired(java.net.URI local)Attempts to determine if the local copy is out of date.CacheInfogetCacheInfo(java.lang.String pattern)java.util.List<CacheInfo>getCacheInfoList()CacheInfogetDefaultCacheInfo()java.net.URIlookupNamespaceURI(java.lang.String uri, java.lang.String nature, java.lang.String purpose)Lookup the specified namespace URI in the catalog.java.net.URIlookupPublic(java.lang.String systemId, java.lang.String publicId)Lookup the specified system and public identifiers in the catalog.java.net.URIlookupSystem(java.lang.String systemId)Lookup the specified system identifier in the catalog.java.net.URIlookupURI(java.lang.String uri)Lookup the specified URI in the catalog.voidremoveCacheInfo(java.lang.String pattern)voidreset()Reset the cache configuration.-
Methods inherited from class org.xmlresolver.CatalogManager
catalogs, getCatalogLoader, getResolverConfiguration, loadCatalog, loadCatalog, loadCatalog, lookupDoctype, lookupDocument, lookupEntity, lookupNotation, normalizedForComparison, setCatalogLoader
-
-
-
-
Field Detail
-
deleteWait
public static final long deleteWait
Length of time a cached resource remains available after it has been deleted.- See Also:
- Constant Field Values
-
cacheSize
public static final long cacheSize
The maximum size of the cache (in files).- See Also:
- Constant Field Values
-
cacheSpace
public static final long cacheSpace
The maximum size of the cache (in bytes).- See Also:
- Constant Field Values
-
maxAge
public static final long maxAge
The maximum age of a file in the cache.- See Also:
- Constant Field Values
-
defaultPattern
public static final java.lang.String defaultPattern
The default cache pattern.- See Also:
- Constant Field Values
-
excludedPatterns
public static final java.lang.String[] excludedPatterns
Excluded patterns.These patterns are excluded because they refer to files on the local filesystem. If they are cached, then the resolver may resolve URIs from the cache that are "stale" with respect to the files actually on the filesystem.
The
jar:file:andclasspath:schemes are Java schemes.The
path:scheme as a .NET scheme (similar in effect toclasspath:).Both the Java and .NET schemes are excluded in case the cache is shared across languages.
-
-
Constructor Detail
-
ResourceCache
public ResourceCache(ResolverConfiguration config)
-
-
Method Detail
-
reset
public void reset()
Reset the cache configuration.If the cache configuration is changed, calling
resetwill adjust this cache to reflect the new settings.
-
directory
public java.lang.String directory()
Returns the cache directory associated with this ResourceCache.- Returns:
- The absolute path of the cache directory, or null if it could not be configured with the requested directory.
-
getCacheInfoList
public java.util.List<CacheInfo> getCacheInfoList()
-
getCacheInfo
public CacheInfo getCacheInfo(java.lang.String pattern)
-
getDefaultCacheInfo
public CacheInfo getDefaultCacheInfo()
-
addCacheInfo
public CacheInfo addCacheInfo(java.lang.String pattern, boolean cache)
-
addCacheInfo
public CacheInfo addCacheInfo(java.lang.String pattern, boolean cache, long deleteWait, long cacheSize, long cacheSpace, long maxAge)
-
removeCacheInfo
public void removeCacheInfo(java.lang.String pattern)
-
entries
public java.util.List<CacheEntry> entries()
-
expired
public boolean expired(java.net.URI local)
Attempts to determine if the local copy is out of date.N.B. Calling this function will remove expired entries from the cache!
If the URI is an
http:URI, a HEAD request is made and thecachedTime()andetagare compared. If the resource on the web is more recent,trueis returned.If the resource isn't cached, isn't an
http:URI, or an error occurs attempting to get the HEAD, thenfalseis returned.- Parameters:
local- The local URI as found in cache.- Returns:
- True if and only if the resource is expired.
-
cacheURI
public boolean cacheURI(java.lang.String uri)
Returns true if the specified absolute URI should be cached.- Parameters:
uri- The URI- Returns:
- Whether or not it should be cached
-
lookupURI
public java.net.URI lookupURI(java.lang.String uri)
Description copied from class:CatalogManagerLookup the specified URI in the catalog.If a URI entry exists in the catalog for the URI specified, return the mapped value.
- Specified by:
lookupURIin interfaceXMLCatalogResolver- Overrides:
lookupURIin classCatalogManager- Parameters:
uri- The URI to locate in the catalog.- Returns:
- The mapped value, or
nullif no matching entry is found.
-
lookupNamespaceURI
public java.net.URI lookupNamespaceURI(java.lang.String uri, java.lang.String nature, java.lang.String purpose)Description copied from class:CatalogManagerLookup the specified namespace URI in the catalog.If a URI entry exists in the catalog for the URI specified, and with the specified nature and purpose, return the mapped value.
- Overrides:
lookupNamespaceURIin classCatalogManager- Parameters:
uri- The URI to locate in the catalog.nature- The RDDL nature of the requested resourcepurpose- The RDDL purpose of the requested resource- Returns:
- The mapped value, or
nullif no matching entry is found.
-
lookupPublic
public java.net.URI lookupPublic(java.lang.String systemId, java.lang.String publicId)Description copied from class:CatalogManagerLookup the specified system and public identifiers in the catalog.If a SYSTEM or PUBLIC entry exists in the catalog for the system and public identifiers specified, return the mapped value.
On Windows and MacOS operating systems, the comparison between the system identifier provided and the SYSTEM entries in the Catalog is case-insensitive.
- Specified by:
lookupPublicin interfaceXMLCatalogResolver- Overrides:
lookupPublicin classCatalogManager- Parameters:
systemId- The nominal system identifier for the entity in question (as provided in the source document).publicId- The public identifier to locate in the catalog. Public identifiers are normalized before comparison.- Returns:
- The mapped value, or
nullif no matching entry is found.
-
lookupSystem
public java.net.URI lookupSystem(java.lang.String systemId)
Description copied from class:CatalogManagerLookup the specified system identifier in the catalog.If a SYSTEM entry exists in the catalog for the system identifier specified, return the mapped value.
On Windows-based operating systems, the comparison between the system identifier provided and the SYSTEM entries in the Catalog is case-insensitive.
- Specified by:
lookupSystemin interfaceXMLCatalogResolver- Overrides:
lookupSystemin classCatalogManager- Parameters:
systemId- The system identifier to locate in the catalog.- Returns:
- The mapped value, or
nullif no matching entry is found.
-
cachedUri
public CacheEntry cachedUri(java.net.URI uri)
-
cachedNamespaceUri
public CacheEntry cachedNamespaceUri(java.net.URI uri, java.lang.String nature, java.lang.String purpose)
-
cachedSystem
public CacheEntry cachedSystem(java.net.URI systemId, java.lang.String publicId)
-
-