001: /*
002: * CoadunationLib: The coaduntion implementation library.
003: * Copyright (C) 2006 Rift IT Contracting
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
018: *
019: * BeanCacheManager.java
020: *
021: * This object is responsible for managing the bean cache entries.
022: */
023:
024: // package path
025: package com.rift.coad.lib.bean;
026:
027: // java imports
028: import java.util.Map;
029: import java.util.HashMap;
030: import java.util.Iterator;
031:
032: // coadunation imports
033: import com.rift.coad.lib.cache.Cache;
034: import com.rift.coad.lib.cache.CacheEntry;
035: import com.rift.coad.lib.thread.ThreadStateMonitor;
036:
037: /**
038: * This object is responsible for managing the bean cache entries.
039: *
040: * @author Brett Chaldecott
041: */
042: public class BeanCacheManager implements Cache {
043:
044: // the classes private member variables
045: private Map beanCaches = new HashMap();
046: private ThreadStateMonitor status = new ThreadStateMonitor();
047:
048: /**
049: * Creates a new instance of BeanCacheManager
050: */
051: public BeanCacheManager() {
052:
053: }
054:
055: /**
056: * This method returns the reference to the bean cache.
057: *
058: * @return The reference to the bean cache.
059: * @param ref The reference to the bean cache.
060: * @exception BeanException
061: */
062: public BeanCache getBeanCache(Object ref) throws BeanException {
063: checkStatus();
064: synchronized (beanCaches) {
065: if (!beanCaches.containsKey(ref)) {
066: beanCaches.put(ref, new BeanCache());
067: }
068: return (BeanCache) beanCaches.get(ref);
069: }
070: }
071:
072: /**
073: * This method is called to perform garbage collection on the cache entries.
074: */
075: public void garbageCollect() {
076: Map beanCaches = new HashMap();
077: synchronized (this .beanCaches) {
078: beanCaches.putAll(this .beanCaches);
079: }
080: for (Iterator iter = beanCaches.keySet().iterator(); iter
081: .hasNext();) {
082: BeanCache beanCache = (BeanCache) beanCaches.get(iter
083: .next());
084: beanCache.garbageCollect();
085: }
086: }
087:
088: /**
089: * This method is called to forcibly remove everything from the cache.
090: */
091: public void clear() {
092: status.terminate(true);
093: Map beanCaches = new HashMap();
094: synchronized (this .beanCaches) {
095: beanCaches.putAll(this .beanCaches);
096: this .beanCaches.clear();
097: }
098: for (Iterator iter = beanCaches.keySet().iterator(); iter
099: .hasNext();) {
100: BeanCache beanCache = (BeanCache) beanCaches.get(iter
101: .next());
102: beanCache.clear();
103: }
104: }
105:
106: /**
107: * This mehtod returns true if the cache contains the checked entry.
108: *
109: * @return TRUE if the cache contains the checked entry.
110: * @param cacheEntry The entry to perform the check for.
111: */
112: public boolean contains(Object cacheEntry) {
113: synchronized (beanCaches) {
114: return beanCaches.containsKey(cacheEntry);
115: }
116: }
117:
118: /**
119: * This method checks the status of the bean cache manager.
120: *
121: * @exception BeanException
122: */
123: private void checkStatus() throws BeanException {
124: if (status.isTerminated()) {
125: throw new BeanException(
126: "Bean cache manager has been terminated.");
127: }
128: }
129: }
|