From 8f9c7e71170526bab9c4d15bed243b69b00930e0 Mon Sep 17 00:00:00 2001 From: Jamie Doornbos Date: Thu, 3 Jul 2008 20:31:37 +0000 Subject: [PATCH] BureauClientFactory class to make client resolution more intuitive, plus a registry method to install the factory git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5221 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../bureau/server/BureauClientFactory.java | 69 +++++++++++++++++++ .../bureau/server/BureauRegistry.java | 11 +++ 2 files changed, 80 insertions(+) create mode 100644 src/java/com/threerings/bureau/server/BureauClientFactory.java diff --git a/src/java/com/threerings/bureau/server/BureauClientFactory.java b/src/java/com/threerings/bureau/server/BureauClientFactory.java new file mode 100644 index 000000000..3d60811bf --- /dev/null +++ b/src/java/com/threerings/bureau/server/BureauClientFactory.java @@ -0,0 +1,69 @@ +// +// $Id$ +// +// Narya library - tools for developing networked games +// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved +// http://www.threerings.net/code/narya/ +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation; either version 2.1 of the License, or +// (at your option) any later version. +// +// 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.threerings.bureau.server; + +import com.threerings.util.Name; + +import com.threerings.presents.net.AuthRequest; +import com.threerings.presents.server.ClientFactory; +import com.threerings.presents.server.ClientResolver; +import com.threerings.presents.server.PresentsClient; + +import com.threerings.bureau.data.BureauCredentials; + +/** + * Handles resolution of bureaus and passes non-bureau resolution requests through to a normal + * factory. + */ +public class BureauClientFactory implements ClientFactory +{ + public BureauClientFactory (ClientFactory delegate) + { + _delegate = delegate; + } + + // from interface ClientFactory + public Class getClientClass (AuthRequest areq) + { + // Just give bureaus a vanilla PresentsClient client for now. + // TODO: will bureaus need a more tailored client? + if (areq.getCredentials() instanceof BureauCredentials) { + return PresentsClient.class; + } else { + return _delegate.getClientClass(areq); + } + } + + // from interface ClientFactory + public Class getClientResolverClass (Name username) + { + // Just give bureaus a vanilla ClientResolver for now. + // TODO: will bureaus need specific resolution? + if (BureauCredentials.isBureau(username)) { + return ClientResolver.class; + } else { + return _delegate.getClientResolverClass(username); + } + } + + protected ClientFactory _delegate; +} diff --git a/src/java/com/threerings/bureau/server/BureauRegistry.java b/src/java/com/threerings/bureau/server/BureauRegistry.java index e3ed0c014..2d9655452 100644 --- a/src/java/com/threerings/bureau/server/BureauRegistry.java +++ b/src/java/com/threerings/bureau/server/BureauRegistry.java @@ -39,6 +39,7 @@ import com.threerings.presents.data.ClientObject; import com.threerings.presents.dobj.ObjectDeathListener; import com.threerings.presents.dobj.ObjectDestroyedEvent; import com.threerings.presents.dobj.RootDObjectManager; +import com.threerings.presents.server.ClientManager; import com.threerings.presents.server.InvocationManager; import com.threerings.bureau.data.AgentObject; @@ -117,6 +118,16 @@ public class BureauRegistry { } + /** + * Install the bureau client factory in the manager, delegating to the current factory + * for non-bureau connections. + */ + public void addClientFactory (ClientManager clmgr) + { + clmgr.setClientFactory( + new BureauClientFactory(clmgr.getClientFactory())); + } + /** * Check the credentials to make sure this is one of our bureaus. * @return null if all's well, otherwise a string describing the authentication failure