/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.clients.fcp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import freenet.clients.fcp.ClientRequest.Persistence;
import freenet.support.LogThresholdCallback;
import freenet.support.Logger;
import freenet.support.Logger.LogLevel;
/**
* Tracks persistent requests by PersistentRequestClient. Not persistent itself. Populated on startup.
* @author toad
*/
public class PersistentRequestRoot {
private static final long serialVersionUID = 1L;
final PersistentRequestClient globalForeverClient;
private final Map<String, PersistentRequestClient> clients;
private static volatile boolean logMINOR;
static {
Logger.registerLogThresholdCallback(new LogThresholdCallback(){
@Override
public void shouldUpdate(){
logMINOR = Logger.shouldLog(LogLevel.MINOR, this);
}
});
}
public PersistentRequestRoot() {
globalForeverClient = new PersistentRequestClient("Global Queue", null, true, null, Persistence.FOREVER, this);
clients = new TreeMap<String, PersistentRequestClient>();
}
public PersistentRequestClient registerForeverClient(final String name, FCPConnectionHandler handler) {
if(logMINOR) Logger.minor(this, "Registering forever-client for "+name);
PersistentRequestClient client;
synchronized(this) {
client = clients.get(name);
if(client == null)
client = new PersistentRequestClient(name, handler, false, null, Persistence.FOREVER, this);
clients.put(name, client);
}
if(handler != null)
client.setConnection(handler);
return client;
}
/** Get the PersistentRequestClient if it exists.
* @param handler */
public PersistentRequestClient getForeverClient(final String name, FCPConnectionHandler handler) {
PersistentRequestClient client;
synchronized(this) {
client = clients.get(name);
if(client == null) return null;
}
if(handler != null)
client.setConnection(handler);
return client;
}
public void maybeUnregisterClient(PersistentRequestClient client) {
if((!client.isGlobalQueue) && !client.hasPersistentRequests()) {
synchronized(this) {
clients.remove(client.name);
}
}
}
public ClientRequest[] getPersistentRequests() {
List<ClientRequest> requests = new ArrayList<ClientRequest>();
globalForeverClient.addPersistentRequests(requests, true);
for(PersistentRequestClient client : clients.values())
client.addPersistentRequests(requests, true);
return requests.toArray(new ClientRequest[requests.size()]);
}
PersistentRequestClient resume(ClientRequest clientRequest, boolean global, String clientName) {
PersistentRequestClient client = makeClient(global, clientName);
client.resume(clientRequest);
return client;
}
PersistentRequestClient makeClient(boolean global, String clientName) {
if(global) {
return globalForeverClient;
} else {
return registerForeverClient(clientName, null);
}
}
public synchronized boolean hasRequest(RequestIdentifier req) {
PersistentRequestClient client;
if(req.globalQueue)
client = globalForeverClient;
else
client = getForeverClient(req.clientName, null);
if(client == null) return false;
return client.getRequest(req.identifier) != null;
}
public PersistentRequestClient getGlobalForeverClient() {
return globalForeverClient;
}
}