/*
* Copyright (c) 2000-2007 by Rodney Kinney
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.chat.node;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;
import VASSAL.chat.HttpRequestWrapper;
import VASSAL.chat.SimpleStatus;
import VASSAL.tools.PropertiesEncoder;
/**
* Copyright (c) 2003 by Rodney Kinney. All rights reserved.
* Date: Jun 7, 2003
*/
public class StatusReporter implements Runnable {
private HttpRequestWrapper reportStatus;
private String lastReportedContents;
private String currentContents;
private long sleepInterval = MIN_SLEEP;
private static final long MIN_SLEEP = 2000;
private static final long MAX_SLEEP = 1000 * 60 * 60 * 2;
private AsynchronousServerNode server;
public StatusReporter(HttpRequestWrapper reportStatus, AsynchronousServerNode server) {
this.reportStatus = reportStatus;
this.server = server;
new Thread(this, "status reporter").start();
}
public void updateContents(Node[] players) {
if (reportStatus == null) {
return;
}
final StringBuilder buffer = new StringBuilder();
for (Node pl : players) {
Node mod = server.getModule(pl);
try {
final String name = new PropertiesEncoder(pl.getInfo()).getProperties().getProperty(SimpleStatus.NAME);
if (name != null) {
buffer.append(mod.getId())
.append('\t')
.append(pl.getParent().getId())
.append('\t')
.append(name)
.append('\n');
}
}
// FIXME: review error message
catch (IOException e) {
e.printStackTrace();
}
}
synchronized (this) {
currentContents = buffer.toString();
}
}
private synchronized void sendContents() {
if (currentContents != null
&& !currentContents.equals(lastReportedContents)) {
try {
Properties props = new Properties();
props.put("STATUS", currentContents); //$NON-NLS-1$
reportStatus.doPost("updateConnections", props); //$NON-NLS-1$
sleepInterval = MIN_SLEEP;
}
// FIXME: review error message
catch (IOException e) {
sleepInterval = Math.min(2 * sleepInterval, MAX_SLEEP);
}
lastReportedContents = currentContents;
System.err.println("----" + new Date()); //$NON-NLS-1$
System.err.println(currentContents);
}
}
public void run() {
while (true) {
try {
Thread.sleep(sleepInterval);
sendContents();
}
// FIXME: review error message
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}