package thaw.plugins.index;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import thaw.core.Config;
import thaw.core.Logger;
import thaw.core.ThawThread;
import thaw.core.ThawRunnable;
import thaw.fcp.FCPQueueManager;
import thaw.plugins.Hsqldb;
public class AutoRefresh implements ThawRunnable, java.util.Observer {
public final static boolean DEFAULT_ACTIVATED = true;
public final static int DEFAULT_INTERVAL = 150;
public final static int DEFAULT_INDEX_NUMBER = 10;
private Hsqldb db;
private IndexBrowserPanel browserPanel;
private Config config;
private boolean threadRunning;
private int interval;
private int nmbIndexesPerInterval;
private int subInterval;
private int nmbIndexesPerSubInterval;
private FCPQueueManager queueManager;
public AutoRefresh(Hsqldb db, IndexBrowserPanel indexBrowser, FCPQueueManager queueManager, Config config) {
this.browserPanel = indexBrowser;
this.queueManager = queueManager;
this.config = config;
threadRunning = false;
interval = 0;
nmbIndexesPerInterval = 0;
try {
if (config.getValue("indexRefreshInterval") != null) {
interval = Integer.parseInt(config.getValue("indexRefreshInterval"));
}
if (config.getValue("nmbIndexesPerRefreshInterval") != null) {
nmbIndexesPerInterval = Integer.parseInt(config.getValue("nmbIndexesPerRefreshInterval"));
}
} catch(NumberFormatException e) {
Logger.error(this, "Error while parsing value in the configuration, using default ones");
interval = 0;
nmbIndexesPerInterval = 0;
}
if (interval == 0)
interval = DEFAULT_INTERVAL;
if (nmbIndexesPerInterval == 0)
nmbIndexesPerInterval = DEFAULT_INDEX_NUMBER;
this.db = db;
if (interval >= nmbIndexesPerInterval) {
nmbIndexesPerSubInterval = 1;
subInterval = (interval / nmbIndexesPerInterval);
} else {
subInterval = 1;
nmbIndexesPerSubInterval = (nmbIndexesPerInterval / interval);
}
}
public void start() {
if (!threadRunning) {
threadRunning = true;
Thread th = new ThawThread(this, "Index tree auto-refresher", this);
th.start();
}
}
public int updateNext(int lastIdx) {
if (browserPanel.getIndexTree().numberOfUpdatingIndexes() >= nmbIndexesPerInterval) {
Logger.debug(this, "Too many indexes are updating ; won't auto-update another one");
return lastIdx;
}
try {
Connection c = db.getConnection();
PreparedStatement st;
ResultSet results;
int ret;
st = c.prepareStatement("SELECT id, originalName, displayName, "+
" publicKey, privateKey, publishPrivateKey, "+
" author, positionInTree, revision, "+
" insertionDate "+
"FROM indexes ORDER by RAND() LIMIT 1");
results = st.executeQuery();
if (results == null || !results.next()) {
st.close();
return -1;
}
ret = results.getInt("id");
Index index;
if (results.getString("privateKey") == null
|| results.getInt("revision") > 0) {
Logger.debug(this, "Index unavailable on freenet -> not updated");
index = new Index(browserPanel.getDb(),
config,
results.getInt("id"),
null, results.getString("publicKey"),
results.getInt("revision"),
results.getString("privateKey"),
results.getBoolean("publishPrivateKey"),
results.getString("displayName"),
results.getDate("insertionDate"),
false, false);
index.downloadFromFreenet(this, browserPanel.getIndexTree(), queueManager);
browserPanel.getIndexTree().redraw();
}
st.close();
return ret;
} catch(java.sql.SQLException e) {
Logger.error(this, "SQLEXCEPTION while autorefreshing: "+e.toString());
return -2;
}
}
public void update(java.util.Observable o, Object param) {
browserPanel.getIndexTree().redraw(((Index)o).getTreePath(browserPanel.getIndexTree()));
if (o.equals(browserPanel.getTables().getFileTable().getFileList())) {
browserPanel.getTables().getFileTable().refresh();
}
if (o.equals(browserPanel.getTables().getLinkTable().getLinkList())) {
browserPanel.getTables().getLinkTable().refresh();
}
browserPanel.getUnknownIndexList().addLinks((LinkList)o);
}
public void run() {
int lastIdx = -1;
while(threadRunning) {
try {
Thread.sleep(1000 * subInterval);
} catch(java.lang.InterruptedException e) {
/* \_o< */
}
if (!threadRunning)
break;
for (int i = 0 ; i < nmbIndexesPerSubInterval ; i++) {
lastIdx = updateNext(lastIdx);
if (lastIdx == -2) {
Logger.error(this, "Disabling auto-refreshing !");
return;
}
}
}
}
public void stop() {
if (threadRunning)
threadRunning = false;
}
}