001: package org.apache.velocity.runtime.resource;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.util.Collections;
023: import java.util.Hashtable;
024: import java.util.Map;
025: import java.util.Iterator;
026:
027: import org.apache.commons.collections.map.LRUMap;
028: import org.apache.velocity.runtime.RuntimeConstants;
029: import org.apache.velocity.runtime.RuntimeServices;
030:
031: /**
032: * Default implementation of the resource cache for the default
033: * ResourceManager. The cache uses a <i>least recently used</i> (LRU)
034: * algorithm, with a maximum size specified via the
035: * <code>resource.manager.cache.size</code> property (idenfied by the
036: * {@link
037: * org.apache.velocity.runtime.RuntimeConstants#RESOURCE_MANAGER_DEFAULTCACHE_SIZE}
038: * constant). This property get be set to <code>0</code> or less for
039: * a greedy, unbounded cache (the behavior from pre-v1.5).
040: *
041: * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
042: * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
043: * @version $Id: ResourceCacheImpl.java 463298 2006-10-12 16:10:32Z henning $
044: */
045: public class ResourceCacheImpl implements ResourceCache {
046: /**
047: * Cache storage, assumed to be thread-safe.
048: */
049: protected Map cache = new Hashtable();
050:
051: /**
052: * Runtime services, generally initialized by the
053: * <code>initialize()</code> method.
054: */
055: protected RuntimeServices rsvc = null;
056:
057: /**
058: * @see org.apache.velocity.runtime.resource.ResourceCache#initialize(org.apache.velocity.runtime.RuntimeServices)
059: */
060: public void initialize(RuntimeServices rs) {
061: rsvc = rs;
062:
063: int maxSize = rsvc
064: .getInt(
065: RuntimeConstants.RESOURCE_MANAGER_DEFAULTCACHE_SIZE,
066: 89);
067: if (maxSize > 0) {
068: // Create a whole new Map here to avoid hanging on to a
069: // handle to the unsynch'd LRUMap for our lifetime.
070: Map lruCache = Collections.synchronizedMap(new LRUMap(
071: maxSize));
072: lruCache.putAll(cache);
073: cache = lruCache;
074: }
075: rsvc.getLog().debug(
076: "ResourceCache: initialized (" + this .getClass() + ')');
077: }
078:
079: /**
080: * @see org.apache.velocity.runtime.resource.ResourceCache#get(java.lang.Object)
081: */
082: public Resource get(Object key) {
083: return (Resource) cache.get(key);
084: }
085:
086: /**
087: * @see org.apache.velocity.runtime.resource.ResourceCache#put(java.lang.Object, org.apache.velocity.runtime.resource.Resource)
088: */
089: public Resource put(Object key, Resource value) {
090: return (Resource) cache.put(key, value);
091: }
092:
093: /**
094: * @see org.apache.velocity.runtime.resource.ResourceCache#remove(java.lang.Object)
095: */
096: public Resource remove(Object key) {
097: return (Resource) cache.remove(key);
098: }
099:
100: /**
101: * @see org.apache.velocity.runtime.resource.ResourceCache#enumerateKeys()
102: */
103: public Iterator enumerateKeys() {
104: return cache.keySet().iterator();
105: }
106: }
|