KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > cache > RelatedNodesCache


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.cache;
11
12 import java.util.*;
13
14 import org.mmbase.storage.search.*;
15
16 /**
17  * Query result cache used for getRelatedNodes from MMObjectNodes. Entries are invalidated on the
18  * normal QueryResultCache way, but also if the one node from which the related nodes were requested is
19  * removed from the Node Cache itself.
20  *
21  * @author Michiel Meeuwissen
22  * @version $Id: RelatedNodesCache.java,v 1.7 2006/06/23 14:17:39 johannes Exp $
23  * @see org.mmbase.module.core.MMObjectNode#getRelatedNodes
24  * @since MMBase-1.7
25  */

26
27 public class RelatedNodesCache extends QueryResultCache {
28
29     // There will be only one list cache, and here it is:
30
private static RelatedNodesCache relatedNodesCache;
31
32     public static RelatedNodesCache getCache() {
33         return relatedNodesCache;
34     }
35
36     static {
37         relatedNodesCache = new RelatedNodesCache(300);
38         relatedNodesCache.putCache();
39     }
40
41     public String JavaDoc getName() {
42         return "RelatedNodesCache";
43     }
44     public String JavaDoc getDescription() {
45         return "Caches related nodes of a certain node";
46     }
47
48     // nodenumber -> set of keys
49
// Used to sync this cache with node-cache. If node not any more in node-cache, then we decide to also remove its related nodes.
50
// This seems a plausible thing to do.
51

52     private Map numberToKeys = new HashMap();
53
54
55     public synchronized Object JavaDoc put(SearchQuery query, List queryResult) {
56         // test cache policy before caching
57
if (!checkCachePolicy(query)) return null;
58         Integer JavaDoc number = (Integer JavaDoc) ((Step) query.getSteps().get(0)).getNodes().first();
59         Set keys = (Set) numberToKeys.get(number);
60         if (keys == null) {
61             keys = new HashSet();
62             numberToKeys.put(number, keys);
63         }
64         keys.add(query);
65         return super.put(query, queryResult);
66     }
67
68
69     public synchronized Object JavaDoc remove(Object JavaDoc key) {
70         SearchQuery query = (SearchQuery) key;
71         Integer JavaDoc number = (Integer JavaDoc) ((Step) query.getSteps().get(0)).getNodes().first();
72         Set keys = (Set) numberToKeys.get(number);
73         if (keys != null) {
74             keys.remove(query);
75             if (keys.size() == 0) numberToKeys.remove(number);
76         }
77         return super.remove(key);
78     }
79
80     synchronized void removeNode(Integer JavaDoc number) {
81         Set keys = (Set) numberToKeys.get(number);
82         if (keys != null) {
83             Iterator i = keys.iterator();
84             while (i.hasNext()) {
85                 super.remove(i.next());
86             }
87             numberToKeys.remove(number);
88         }
89     }
90
91     /**
92      * Creates the Node list cache.
93      */

94     private RelatedNodesCache(int size) {
95         super(size);
96     }
97
98     public void clear(){
99         super.clear();
100         numberToKeys.clear();
101     }
102 }
103
Popular Tags