package plugins.CENO.Client;
import java.util.concurrent.TimeUnit;
import net.minidev.json.JSONObject;
import plugins.CENO.CENOErrCode;
import plugins.CENO.CENOException;
import plugins.CENO.FreenetInterface.ConnectionOverview.NodeConnections;
import freenet.pluginmanager.PluginHTTPException;
import freenet.support.api.HTTPRequest;
/**
* Handler for requests to the /status path. Responsible for returning
* the Freenet agents' status according to the documentation JSON schema.
*/
public class StatusHandler extends AbstractCENOClientHandler {
private static Long noPeersTimer = null;
@Override
public String handleHTTPGet(HTTPRequest request) throws PluginHTTPException {
NodeConnections nodeConnections = CENOClient.nodeInterface.getConnections();
if (nodeConnections.getCurrent() == 0) {
StatusHandler.noPeersTimer = (StatusHandler.noPeersTimer == null) ? System.currentTimeMillis() : StatusHandler.noPeersTimer;
if (System.currentTimeMillis() - StatusHandler.noPeersTimer > TimeUnit.MINUTES.toMillis(8)) {
// The node is not connected to any peers for longer than 5 mins.
// Could it be a firewall/connectivity issue?
return returnStatus("error", new CENOException(CENOErrCode.LCS_NODE_NOT_ENOUGH_PEERS).getMessage());
}
}
// If the Freenet node is connected to less than 3 peers, the process will be slow
// and we inform the users appropriately
if (nodeConnections.getCurrent() < 5) {
return returnStatus("warning", new CENOException(CENOErrCode.LCS_NODE_INITIALIZING).getMessage());
}
StatusHandler.noPeersTimer = null;
return returnStatus("okay", "Freenet node connected to " + nodeConnections.getCurrent() + " peers");
}
@Override
public String handleHTTPPost(HTTPRequest request) throws PluginHTTPException {
// Won't handle POST requests
return "StatusHandler: POST request received on /status path";
}
private String returnStatus(String status, String message) {
JSONObject jsonResponse = new JSONObject();
jsonResponse.put("status", status);
jsonResponse.put("message", message);
return jsonResponse.toJSONString();
}
}