package org.jactr.core.concurrent;
/*
* default logging
*/
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class FutureManager<K, C>
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(FutureManager.class);
final private Map<K, LocalFuture<C>> _map;
public FutureManager()
{
_map = new HashMap<K, LocalFuture<C>>();
}
public Future<C> acquire(K key)
{
LocalFuture<C> future = new LocalFuture<C>();
_map.put(key, future);
return future;
}
public Future<C> release(K key, C result)
{
LocalFuture<C> future = _map.remove(key);
if (future != null) future.set(result, null);
return future;
}
public Future<C> release(K key, Throwable exception)
{
LocalFuture<C> future = _map.remove(key);
if (future != null) future.set(null, exception);
return future;
}
private class LocalFuture<C> extends FutureTask<C>
{
public LocalFuture()
{
super(new Runnable() {
public void run()
{
}
}, null);
}
public void set(C result, Throwable thrown)
{
if (thrown != null) setException(thrown);
set(result);
}
}
}