01: /*
02:
03: This software is OSI Certified Open Source Software.
04: OSI Certified is a certification mark of the Open Source Initiative.
05:
06: The license (Mozilla version 1.0) can be read at the MMBase site.
07: See http://www.MMBase.org/license
08:
09: */
10: package org.mmbase.cache;
11:
12: import java.util.*;
13:
14: import org.mmbase.core.event.*;
15: import org.mmbase.module.core.*;
16: import org.mmbase.storage.search.SearchQuery;
17: import org.mmbase.storage.search.Step;
18: import org.mmbase.util.logging.Logger;
19: import org.mmbase.util.logging.Logging;
20:
21: /**
22: * This class provides a very basic release strategy. In fact it will release
23: * the cache in nearly every instance, except when the event is for a step in
24: * the <code>SearchQuery</code> that has 'nodes' set for it and the changed
25: * node is not one of those. This release strategy is in fact the original one
26: * and will allways be the first in the hierarchy of the
27: * <code>ChainedReleaseStrategy</code>.
28: *
29: * @author Ernst Bunders
30: * @since MMBase-1.8
31: * @version $Id: BasicReleaseStrategy.java,v 1.17 2008/02/12 16:27:11 michiel Exp $
32: */
33: public class BasicReleaseStrategy extends ReleaseStrategy {
34:
35: private static final Logger log = Logging
36: .getLoggerInstance(BasicReleaseStrategy.class);
37:
38: public BasicReleaseStrategy() {
39: }
40:
41: public String getName() {
42: return "Basic release strategy";
43: }
44:
45: /* (non-Javadoc)
46: * @see org.mmbase.cache.QueryResultCacheReleaseStrategy#getDescription()
47: */
48: public String getDescription() {
49: return "This strategy does exactly what the original cache release "
50: + "implementation did. It checks if the step of the query that maches the "
51: + "type of the changed node has 'nodes' set. if it does, and the changed "
52: + "node is not one of them, the query should not be flushed from cache";
53: }
54:
55: /* (non-Javadoc)
56: * @see org.mmbase.cache.ReleaseStrategy#doEvaluate(org.mmbase.module.core.NodeEvent, org.mmbase.storage.search.SearchQuery, java.util.List)
57: */
58: protected final boolean doEvaluate(NodeEvent event,
59: SearchQuery query, List<MMObjectNode> cachedResult) {
60: //this simple optimization only works for nodeEvents
61: MMBase mmb = MMBase.getMMBase();
62: String eventTable = event.getBuilderName();
63: MMObjectBuilder eventBuilder = mmb.getBuilder(eventTable);
64: if (eventBuilder == null) {
65: eventBuilder = mmb.getBuilder("object");
66: eventTable = "object";
67: }
68: for (Step step : query.getSteps()) {
69: String table = step.getTableName();
70: if (table == null) {
71: // I think this cannot happen
72: log.warn("Found null in a query !" + query);
73: continue;
74: }
75: MMObjectBuilder stepBuilder = mmb.getBuilder(table);
76: if (stepBuilder == null)
77: stepBuilder = mmb.getBuilder("object");
78: if (!(table.equals(eventTable) || eventBuilder
79: .isExtensionOf(stepBuilder)))
80: continue;
81: Set<Integer> nodes = step.getNodes();
82: if (nodes == null || nodes.size() == 0
83: || nodes.contains(event.getNodeNumber())) {
84: return true;
85: }
86: }
87: return false;
88: }
89:
90: protected boolean doEvaluate(RelationEvent event,
91: SearchQuery query, List<MMObjectNode> cachedResult) {
92: // no strategy for relation events
93: log.debug("basic strategy: flush: relation event");
94: return true;
95: }
96:
97: }
|