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.clustering;
11:
12: import java.util.Iterator;
13: import java.util.Map;
14:
15: import org.mmbase.core.event.*;
16: import org.mmbase.module.core.*;
17: import org.mmbase.module.corebuilders.InsRel;
18:
19: /**
20: * This utility class contains the methods for broadcasting/registering changes on nodes. It is
21: * available as 'getChangeManager()' from the StorageManagerFactory.
22: *
23: * @author Pierre van Rooden
24: * @version $Id: ChangeManager.java,v 1.13 2007/02/24 21:57:51 nklasens Exp $
25: * @see org.mmbase.storage.StorageManagerFactory#getChangeManager
26: */
27: public final class ChangeManager {
28:
29: /**
30: * Commit all changes stored in a Changes map.
31: * Clears the change status of all changed nodes, then broadcasts changes to the
32: * nodes' builders.
33: * @param changes a map with node/change value pairs
34: */
35: public void commit(Map<MMObjectNode, String> changes) {
36: for (Iterator<Map.Entry<MMObjectNode, String>> i = changes
37: .entrySet().iterator(); i.hasNext();) {
38: Map.Entry<MMObjectNode, String> e = i.next();
39: MMObjectNode node = e.getKey();
40: String change = e.getValue();
41: commit(node, change);
42: i.remove();
43: }
44: }
45:
46: /**
47: * Commits the change to a node.
48: * Fires the node change events through the EventManager.
49: * Then clears 'changed' state on the node.
50: * @param node the node to commit the change of
51: * @param change the type of change: "n": new, "c": commit, "d": delete, "r" : relation changed
52: */
53: public void commit(MMObjectNode node, String change) {
54: MMObjectBuilder builder = node.getBuilder();
55: //create a new local node event
56: NodeEvent event = NodeEventHelper.createNodeEventInstance(node,
57: NodeEvent.oldTypeToNewType(change), null);
58:
59: //regardless of wether this is a relatione event we fire a node event first
60: EventManager.getInstance().propagateEvent(event);
61:
62: //if the changed node is a relation, we fire a relation event as well
63: if (builder instanceof InsRel) {
64: RelationEvent relEvent = NodeEventHelper
65: .createRelationEventInstance(node, NodeEvent
66: .oldTypeToNewType(change), null);
67:
68: //the relation event broker will make shure that listeners
69: //for node-relation changes to a specific builder, will be
70: //notified if this builder is either source or destination type
71: //in the relation event
72: EventManager.getInstance().propagateEvent(relEvent);
73: }
74:
75: node.clearChanged();
76: }
77: }
|