diff --git a/src/helma/objectmodel/db/NodeChangeListener.java b/src/helma/objectmodel/db/NodeChangeListener.java new file mode 100644 index 00000000..04a8a694 --- /dev/null +++ b/src/helma/objectmodel/db/NodeChangeListener.java @@ -0,0 +1,29 @@ +/* + * Helma License Notice + * + * The contents of this file are subject to the Helma License + * Version 2.0 (the "License"). You may not use this file except in + * compliance with the License. A copy of the License is available at + * http://adele.helma.org/download/helma/license.txt + * + * Copyright 1998-2003 Helma Software. All Rights Reserved. + * + * $RCSfile$ + * $Author$ + * $Revision$ + * $Date$ + */ + +package helma.objectmodel.db; + +import java.util.List; + +public interface NodeChangeListener { + + /** + * Called when a transaction is committed that has created, modified or + * deleted one or more nodes. + */ + public void nodesChanged(List inserted, List updated, List deleted); + +} diff --git a/src/helma/objectmodel/db/NodeManager.java b/src/helma/objectmodel/db/NodeManager.java index 3c4ee872..055d9c46 100644 --- a/src/helma/objectmodel/db/NodeManager.java +++ b/src/helma/objectmodel/db/NodeManager.java @@ -36,12 +36,12 @@ public final class NodeManager { protected Application app; private ObjectCache cache; - private Replicator replicator; protected IDatabase db; protected IDGenerator idgen; private long idBaseValue = 1L; private boolean logSql; protected boolean logReplication; + private ArrayList listeners = new ArrayList(); // a wrapper that catches some Exceptions while accessing this NM public final WrappedNodeManager safe; @@ -72,10 +72,9 @@ public final class NodeManager { app.logEvent("Setting up replication listener at " + replicationUrl); } - replicator = new Replicator(this); + Replicator replicator = new Replicator(this); replicator.addUrl(replicationUrl); - } else { - replicator = null; + addNodeChangeListener(replicator); } // get the initial id generator value @@ -1801,13 +1800,40 @@ public final class NodeManager { } } - /** - * Get a replicator for this node cache. A replicator is used to transfer updates - * in this node manager to other node managers in remote servers via RMI. + /** + * Add a listener that is notified each time a transaction commits + * that adds, modifies or deletes any Nodes. */ - protected Replicator getReplicator() { - return replicator; + public void addNodeChangeListener(NodeChangeListener listener) { + listeners.add(listener); } + + /** + * Remove a previously added NodeChangeListener. + */ + public void removeNodeChangeListener(NodeChangeListener listener) { + listeners.remove(listener); + } + + /** + * Let transactors know if they should collect and fire NodeChangeListener + * events + */ + protected boolean hasNodeChangeListeners() { + return listeners.size() > 0; + } + + /** + * Called by transactors after committing. + */ + protected void fireNodeChangeEvent(List inserted, List updated, List deleted) { + int l = listeners.size(); + + for (int i=0; i