helma/src/helma/objectmodel/db/Replicator.java
hns 2f39d4f908 Checked in patch from Stefan Matthias Aust:
* Don't call static methods as instance methods
* Remove unused imports
* Remove variables that are never read
2003-07-08 13:52:36 +00:00

141 lines
3.4 KiB
Java

/*
* 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.rmi.*;
import java.util.*;
/**
* This class replicates the updates of transactions to other applications via RMI
*/
public class Replicator implements Runnable {
Vector urls;
Vector add;
Vector delete;
Vector currentAdd;
Vector currentDelete;
Thread runner;
NodeManager nmgr;
/**
* Creates a new Replicator object.
*
* @param nmgr ...
*/
public Replicator(NodeManager nmgr) {
urls = new Vector();
add = new Vector();
delete = new Vector();
this.nmgr = nmgr;
runner = new Thread(this);
runner.start();
}
/**
*
*
* @param url ...
*/
public void addUrl(String url) {
urls.addElement(url);
if (nmgr.logReplication) {
nmgr.app.logEvent("Adding replication listener: " + url);
}
}
/**
*
*/
public void run() {
while (Thread.currentThread() == runner) {
if (prepareReplication()) {
for (int i = 0; i < urls.size(); i++) {
try {
String url = (String) urls.elementAt(i);
IReplicationListener listener = (IReplicationListener) Naming.lookup(url);
if (listener == null) {
throw new NullPointerException("Replication listener not bound for URL "+url);
}
listener.replicateCache(currentAdd, currentDelete);
if (nmgr.logReplication) {
nmgr.app.logEvent("Sent cache replication event: " +
currentAdd.size() + " added, " + currentDelete.size() +
" deleted");
}
} catch (Exception x) {
nmgr.app.logEvent("Error sending cache replication event: " + x);
if (nmgr.app.debug()) {
x.printStackTrace();
}
}
}
}
try {
if (runner != null) {
Thread.sleep(1000L);
}
} catch (InterruptedException ir) {
runner = null;
}
}
}
/**
*
*
* @param n ...
*/
public synchronized void addNewNode(Node n) {
add.addElement(n);
}
/**
*
*
* @param n ...
*/
public synchronized void addModifiedNode(Node n) {
add.addElement(n);
}
/**
*
*
* @param n ...
*/
public synchronized void addDeletedNode(Node n) {
delete.addElement(n);
}
private synchronized boolean prepareReplication() {
if ((add.size() == 0) && (delete.size() == 0)) {
return false;
}
currentAdd = add;
currentDelete = delete;
add = new Vector();
delete = new Vector();
return true;
}
}