Added simple mechanism to resolve a client, apply some operation to it and

release it back into the wild.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2010 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2002-11-29 23:40:32 +00:00
parent 1c726c8e33
commit 55f40108b8
@@ -1,5 +1,5 @@
//
// $Id: ClientManager.java,v 1.27 2002/11/26 02:14:25 mdb Exp $
// $Id: ClientManager.java,v 1.28 2002/11/29 23:40:32 mdb Exp $
package com.threerings.presents.server;
@@ -33,6 +33,22 @@ import com.threerings.presents.server.util.SafeInterval;
public class ClientManager
implements ConnectionObserver, PresentsServer.Reporter
{
/**
* Used by {@link #applyToClient}.
*/
public static interface ClientOp
{
/**
* Called with the resolved client object.
*/
public void apply (ClientObject clobj);
/**
* Called if the client resolution fails.
*/
public void resolutionFailed (Exception e);
}
/**
* Constructs a client manager that will interact with the supplied
* connection manager.
@@ -130,6 +146,15 @@ public class ClientManager
return username.toLowerCase();
}
/**
* Resolves the specified client, applies the supplied client
* operation to them and releases the client.
*/
public void applyToClient (String username, ClientOp clop)
{
resolveClientObject(username, new ClientOpResolver(clop));
}
/**
* Requests that the client object for the specified user be resolved.
* If the client object is already resolved, the request will be
@@ -366,6 +391,40 @@ public class ClientManager
}
}
/** Used by {@link #applyToClient}. */
protected class ClientOpResolver
implements ClientResolutionListener
{
public ClientOpResolver (ClientOp clop)
{
_clop = clop;
}
// documentation inherited from interface
public void clientResolved (String username, ClientObject clobj)
{
try {
_clop.apply(clobj);
} catch (Exception e) {
Log.warning("Client op failed [username=" + username +
", clop=" + _clop + "].");
Log.logStackTrace(e);
} finally {
releaseClientObject(username);
}
}
// documentation inherited from interface
public void resolutionFailed (String username, Exception reason)
{
_clop.resolutionFailed(reason);
}
protected ClientOp _clop;
}
/** A mapping from usernames to client instances. */
protected HashMap _usermap = new HashMap();