/* * The contents of this file are subject to the Mozilla Public License Version 1.1 * (the "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at . * * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT * WARRANTY OF ANY KIND, either express or implied. See the License for the specific * language governing rights and limitations under the License. * * The Original Code is the Venice Web Communities System. * * The Initial Developer of the Original Code is Eric J. Bowersox , * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * Copyright (C) 2002-03 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * * Contributor(s): */ package com.silverwrist.dynamo.db; import java.lang.ref.*; import java.util.*; import org.w3c.dom.*; import com.silverwrist.util.xml.*; import com.silverwrist.dynamo.UserInfoNamespace; import com.silverwrist.dynamo.event.*; import com.silverwrist.dynamo.except.*; import com.silverwrist.dynamo.iface.*; import com.silverwrist.dynamo.security.SecurityReferenceMonitor; import com.silverwrist.dynamo.util.*; public class UserManagerObject implements NamedObject, ComponentInitialize, ComponentShutdown, UserManagement, UserProxyManagement, AuthenticatorLookup, AuthenticatorRegistration, UserInfoNamespace, UserPropertyTranslatorInstall { /*-------------------------------------------------------------------------------- * Internal class implementing user proxies *-------------------------------------------------------------------------------- */ private class MyUserProxy extends UserProxy { /*==================================================================== * Attributes *==================================================================== */ private DynamoUser m_real_user = null; /*==================================================================== * Constructors *==================================================================== */ MyUserProxy(int uid) { super(uid); } // end constructor MyUserProxy(int uid, String username) { super(uid,username); } // end constructor /*==================================================================== * Abstract implementations from class UserProxy *==================================================================== */ protected synchronized DynamoUser getRealUser() { if (m_real_user==null) { // need to retrieve the real user... try { // get the real user... m_real_user = UserManagerObject.this.getUser(m_uid); } // end try catch (DatabaseException e) { // wrap it in a runtime exception type throw new ProxyException(e); } // end catch } // end if return m_real_user; } // end getRealUser } // end class MyUserProxy /*-------------------------------------------------------------------------------- * Internal class implementing group proxies *-------------------------------------------------------------------------------- */ private class MyGroupProxy extends GroupProxy { /*==================================================================== * Attributes *==================================================================== */ private DynamoGroup m_real_group = null; /*==================================================================== * Constructors *==================================================================== */ MyGroupProxy(int gid) { super(gid); } // end constructor MyGroupProxy(int gid, String groupname) { super(gid,groupname); } // end constructor /*==================================================================== * Abstract implementations from class UserProxy *==================================================================== */ protected synchronized DynamoGroup getRealGroup() { if (m_real_group==null) { // need to retrieve the real group... try { // get the real group... m_real_group = UserManagerObject.this.getGroup(m_gid); } // end try catch (DatabaseException e) { // wrap it in a runtime exception type throw new ProxyException(e); } // end catch } // end if return m_real_group; } // end getRealGroup } // end class MyGroupProxy /*-------------------------------------------------------------------------------- * Internal event listener class *-------------------------------------------------------------------------------- */ private class UpdateListener implements DynamicUpdateListener { /*==================================================================== * Constructor *==================================================================== */ UpdateListener() { // do nothing } // end constructor /*==================================================================== * Implementations from interface DynamicUpdateListener *==================================================================== */ public void updateReceived(DynamicUpdateEvent evt) { if (evt instanceof UserUpdateEvent) { // try to pass the event on to the user int uid = ((UserUpdateEvent)evt).getUID(); Integer key = new Integer(uid); synchronized (m_users_sync) { // try looking in the cache for a UserObject IDNameCacheObject cobj = (IDNameCacheObject)(m_id_to_user.get(key)); if (cobj!=null) { // got a cache object - retrieve the user value UserObject target = (UserObject)(cobj.get()); if (target==null) { // the UserObject got kicked out! kick it out of the HashMaps m_id_to_user.remove(key); m_name_to_user.remove(cobj.getNameKey()); cobj.clear(); cobj = null; } // end if else if (target!=evt.getSource()) target.updated((UserUpdateEvent)evt); } // end if } // end synchronized block } // end if } // end updateReceived } // end class UpdateListener /*-------------------------------------------------------------------------------- * Internal property serializer class *-------------------------------------------------------------------------------- */ private class UserGroupSerializer implements PropertySerializer { /*==================================================================== * Constructor *==================================================================== */ UserGroupSerializer() { // do nothing } // end constructor /*==================================================================== * Implementations from interface PropertySerializer *==================================================================== */ public String serializeProperty(Object value) { if (value instanceof DynamoUser) return "User:" + String.valueOf(((DynamoUser)value).getUID()); if (value instanceof DynamoGroup) return "Group:" + String.valueOf(((DynamoGroup)value).getGID()); return null; } // end serializeProperty public Object deserializeProperty(String value) { try { // look for our known prefixes if (value.startsWith("User:")) return getUserProxy(Integer.parseInt(value.substring(5))); if (value.startsWith("Group:")) return getGroupProxy(Integer.parseInt(value.substring(6))); return null; } // end try catch (NumberFormatException e) { // number parse blew up... return null; } // end catch } // end deserializeProperty } // end UserGroupSerializer /*-------------------------------------------------------------------------------- * Internal class implementing the adapter for UserPropertyTranslator *-------------------------------------------------------------------------------- */ class UserPropertyAdapter implements UserPropertyTranslator { /*==================================================================== * Attributes *==================================================================== */ private UserPropertyTranslator m_upt = null; /*==================================================================== * Constructor *==================================================================== */ UserPropertyAdapter() { // do nothing } // end constructor /*==================================================================== * Implementations from interface UserPropertyTranslator *==================================================================== */ public String getUserFullName(DynamoUser user) { if (m_upt!=null) return m_upt.getUserFullName(user); else return user.getName(); } // end getUserFullName /*==================================================================== * External operations *==================================================================== */ void setTranslator(UserPropertyTranslator upt) { m_upt = upt; } // end setTranslator } // end class UserPropertyAdapter /*-------------------------------------------------------------------------------- * Static data members *-------------------------------------------------------------------------------- */ private static final int MAX_USERNAME = 64; private static final int MAX_GROUPNAME = 64; /*-------------------------------------------------------------------------------- * Attributes *-------------------------------------------------------------------------------- */ private UserPropertyAdapter m_adapter; // user property adapter private String m_name; // object name private NamespaceCache m_ns_cache; // namespace cache object private SecurityReferenceMonitor m_srm; // security reference monitor private PostDynamicUpdate m_post; // dynamic update poster private UserManagerOps m_ops; // database operations object private UserObject m_anon_user = null; // permanent reference to anonymous user private Object m_anon_user_sync = new Object(); // synchronization on the above field private HashMap m_id_to_user = new HashMap(); // map from IDs (Integer) to objects private HashMap m_name_to_user = new HashMap(); // map from names (DynamoIDKey) to objects private ReferenceQueue m_rq = new ReferenceQueue(); // reference queue for old objects private Object m_users_sync = new Object(); // synchronization for user HashMaps private HashMap m_id_to_group = new HashMap(); // map from IDs (Integer) to groups private HashMap m_name_to_group = new HashMap(); // map from names (DynamoIDKey) to groups private ReferenceQueue m_group_rq = new ReferenceQueue(); // reference queue for group objects private Object m_groups_sync = new Object(); // synchronization for group HashMaps private Hashtable m_authenticators = new Hashtable(); // authenticators list private ComponentShutdown m_hook_init; // hook for init service provider private ComponentShutdown m_hook_rt; // hook for runtime service provider private ComponentShutdown m_pszreg; // property serializer registration private ComponentShutdown m_evt_user; // event registration /*-------------------------------------------------------------------------------- * Constructor *-------------------------------------------------------------------------------- */ public UserManagerObject() { m_adapter = new UserPropertyAdapter(); // create the adapter // Add some default authenticators. m_authenticators.put(new QualifiedNameKey(NAMESPACE,AUTH_DEFAULT),new DefaultHashAuthenticator()); } // end constructor /*-------------------------------------------------------------------------------- * Implementations from interface NamedObject *-------------------------------------------------------------------------------- */ public String getName() { return m_name; } // end getName /*-------------------------------------------------------------------------------- * Implementations from interface ComponentInitialize *-------------------------------------------------------------------------------- */ public void initialize(Element config_root, ServiceProvider services) throws ConfigException { String conn_name = null; String nscache_name = null; String srm_name = null; String connect_name = null; XMLLoader loader = XMLLoader.get(); try { // verify the right node name loader.verifyNodeName(config_root,"object"); // get the object's name m_name = loader.getAttribute(config_root,"name"); // get the database configuration connection DOMElementHelper config_root_h = new DOMElementHelper(config_root); Element elt = loader.getSubElement(config_root_h,"database"); conn_name = loader.getAttribute(elt,"connection"); nscache_name = loader.getAttribute(elt,"namespaces"); // get the security reference monitor reference elt = loader.getSubElement(config_root_h,"security"); srm_name = loader.getAttribute(elt,"object"); // get the name of the connection point to connect ourselves to elt = config_root_h.getSubElement("connect-proxy-services"); if (elt!=null) connect_name = loader.getAttribute(elt,"cpoint"); } // end try catch (XMLLoadException e) { // error loading XML config data throw new ConfigException(e); } // end catch // Get the database connection pool, namespace cache, and security reference monitor. DBConnectionPool pool = GetObjectUtils.getDatabaseConnection(services,conn_name); m_ns_cache = (NamespaceCache)(GetObjectUtils.getDynamoComponent(services,NamespaceCache.class,nscache_name)); m_srm = (SecurityReferenceMonitor)(GetObjectUtils.getDynamoComponent(services,SecurityReferenceMonitor.class, srm_name)); m_post = (PostDynamicUpdate)(services.queryService(PostDynamicUpdate.class)); // Get the operations object. m_ops = UserManagerOps.get(pool); // Connect our proxy services to the connection point. if (connect_name!=null) { // get the ConnectionBackend service and use it to jack in ConnectionBackEnd backend = (ConnectionBackEnd)(services.queryService(ConnectionBackEnd.class)); backend.connectObject(connect_name,this); } // end if // Register event listeners that forward events to the right location. EventListenerRegistration reg = (EventListenerRegistration)(services.queryService(EventListenerRegistration.class)); UpdateListener ul = new UpdateListener(); m_evt_user = reg.registerDynamicUpdateListener(UserUpdateEvent.class,ul); // Register our property serializer to let User and Group objects be serialized. PropertySerializerRegistration psreg = (PropertySerializerRegistration)(services.queryService(PropertySerializerRegistration.class)); m_pszreg = psreg.registerPropertySerializer(new UserGroupSerializer()); // Add us to the initialization services. HookServiceProviders hooker = (HookServiceProviders)(services.queryService(HookServiceProviders.class)); SimpleServiceProvider esp = new SimpleServiceProvider("UserManagerObject"); esp.addService(AuthenticatorRegistration.class,(AuthenticatorRegistration)this); esp.addService(AuthenticatorLookup.class,(AuthenticatorLookup)this); m_hook_init = hooker.hookInitServiceProvider(esp); // Add us to the runtime services as well. SingletonServiceProvider ssp = new SingletonServiceProvider("UserManagerObject",AuthenticatorLookup.class, (AuthenticatorLookup)this); m_hook_rt = hooker.hookRuntimeServiceProvider(ssp); } // end initialize /*-------------------------------------------------------------------------------- * Implementations from interface ComponentShutdown *-------------------------------------------------------------------------------- */ public void shutdown() { m_evt_user.shutdown(); m_evt_user = null; m_pszreg.shutdown(); m_pszreg = null; m_hook_rt.shutdown(); m_hook_rt = null; m_hook_init.shutdown(); m_hook_init = null; m_authenticators.clear(); m_id_to_user.clear(); m_name_to_user.clear(); m_anon_user = null; m_ops.dispose(); m_ops = null; m_post = null; m_srm = null; m_ns_cache = null; } // end shutdown /*-------------------------------------------------------------------------------- * Implementations from interface UserManagement *-------------------------------------------------------------------------------- */ public DynamoUser getAnonymousUser() throws DatabaseException { synchronized (m_anon_user_sync) { // get the anonymous user, if it doesn't already exist if (m_anon_user==null) { // get the data for the anonymous user Map data = m_ops.getAnonymousUserData(); if (data==null) throw new DatabaseException(UserManagerObject.class,"UserMessages","anon.notFound"); m_anon_user = new UserObject(data,true,m_ops.getObjectOps(),m_ns_cache,m_srm,this,m_post,m_adapter); } // end if return m_anon_user; } // end synchronized block } // end getAnonymousUser public DynamoUser getUser(int id) throws DatabaseException { DynamoUser rc = getAnonymousUser(); if (rc.getUID()==id) return rc; rc = null; Integer key = new Integer(id); synchronized (m_users_sync) { // try to retrieve the user IDNameCacheObject cobj = (IDNameCacheObject)(m_id_to_user.get(key)); if (cobj!=null) { // got a cache object - retrieve the user value rc = (DynamoUser)(cobj.get()); if (rc==null) { // the UserObject got kicked out! kick it out of the HashMaps m_id_to_user.remove(key); m_name_to_user.remove(cobj.getNameKey()); cobj.clear(); cobj = null; } // end if } // end if if (rc==null) { // OK, we have to go to the database to find the user Map data = m_ops.getUserData(id); if (data!=null) { // create UserObject and add it to our cache maps UserObject uobj = new UserObject(data,false,m_ops.getObjectOps(),m_ns_cache,m_srm,this,m_post, m_adapter); rc = uobj; cobj = new IDNameCacheObject(key,uobj.getName(),uobj,m_rq); m_id_to_user.put(cobj.getIDKey(),cobj); m_name_to_user.put(cobj.getNameKey(),cobj); } // end if // else user does not exist - return null } // end if } // end synchronized block return rc; } // end getUser public DynamoUser getUser(String username) throws DatabaseException { DynamoUser rc = getAnonymousUser(); if (rc.getName().equalsIgnoreCase(username)) return rc; rc = null; DynamoIDKey key = new DynamoIDKey(username); synchronized (m_users_sync) { // try to retrieve the user IDNameCacheObject cobj = (IDNameCacheObject)(m_name_to_user.get(key)); if (cobj!=null) { // got a cache object - retrieve the user value rc = (DynamoUser)(cobj.get()); if (rc==null) { // the UserObject got kicked out! kick it out of the HashMaps m_id_to_user.remove(cobj.getIDKey()); m_name_to_user.remove(key); cobj.clear(); cobj = null; } // end if } // end if if (rc==null) { // OK, we have to go to the database to find the user Map data = m_ops.getUserData(username); if (data!=null) { // create user object and add it to our cache maps UserObject uobj = new UserObject(data,false,m_ops.getObjectOps(),m_ns_cache,m_srm,this,m_post, m_adapter); rc = uobj; cobj = new IDNameCacheObject(uobj.getUID(),key,uobj,m_rq); m_id_to_user.put(cobj.getIDKey(),cobj); m_name_to_user.put(cobj.getNameKey(),cobj); } // end if // else user does not exist - return null } // end if } // end synchronized block return rc; } // end getUser public DynamoUser createUser(String username, String email) throws DatabaseException { DynamoUser rc = getAnonymousUser(); if (rc.getName().equalsIgnoreCase(username)) { // this user already exists DatabaseException de = new DatabaseException(UserManagerObject.class,"UserMessages","user.exists"); de.setParameter(0,username); throw de; } // end if DynamoIDKey key = new DynamoIDKey(username); if (!(key.isValid(MAX_USERNAME))) { // the user ID is invalid... DatabaseException de = new DatabaseException(UserManagerObject.class,"UserMessages","user.badID"); de.setParameter(0,username); throw de; } // end if rc = null; synchronized (m_users_sync) { // see if the user is in our cache already IDNameCacheObject cobj = (IDNameCacheObject)(m_name_to_user.get(key)); if (cobj!=null) { // it's in the cache - we're going to fail this operation. But while we're here, if the // actual user object has been kicked out, expunge the reference. if (cobj.get()==null) { // the UserObject got kicked out! kick it out of the HashMaps m_id_to_user.remove(cobj.getIDKey()); m_name_to_user.remove(key); cobj.clear(); cobj = null; } // end if // throw the exception saying that we exist DatabaseException de = new DatabaseException(UserManagerObject.class,"UserMessages","user.exists"); de.setParameter(0,username); throw de; } // end if // OK, at this point, we can't be any surer the user doesn't already exist without // hitting the database. So create it. (createNewUser will throw a DatabaseException if the // user already exists.) Map data = m_ops.createNewUser(username,email); UserObject uobj = new UserObject(data,false,m_ops.getObjectOps(),m_ns_cache,m_srm,this,m_post,m_adapter); rc = uobj; cobj = new IDNameCacheObject(uobj.getUID(),key,uobj,m_rq); m_id_to_user.put(cobj.getIDKey(),cobj); m_name_to_user.put(cobj.getNameKey(),cobj); } // end synchronized block return rc; // new user created! } // end createUser public DynamoGroup getGroup(int id) throws DatabaseException { DynamoGroup rc = null; Integer key = new Integer(id); synchronized (m_groups_sync) { // try to retrieve the group IDNameCacheObject cobj = (IDNameCacheObject)(m_id_to_group.get(key)); if (cobj!=null) { // got a cache object - retrieve the group value rc = (DynamoGroup)(cobj.get()); if (rc==null) { // the GroupObject got kicked out! kick it out of the HashMaps m_id_to_group.remove(key); m_name_to_group.remove(cobj.getNameKey()); cobj.clear(); cobj = null; } // end if } // end if if (rc==null) { // OK, we have to go to the database to find the group Map data = m_ops.getGroupData(id); if (data!=null) { // create GroupObject and add it to our cache maps GroupObject gobj = new GroupObject(data,m_ops.getGroupOps(),m_ns_cache,m_srm,this); rc = gobj; cobj = new IDNameCacheObject(key,gobj.getName(),gobj,m_group_rq); m_id_to_group.put(cobj.getIDKey(),cobj); m_name_to_group.put(cobj.getNameKey(),cobj); } // end if // else group does not exist - return null } // end if } // end synchronized block return rc; } // end getGroup public DynamoGroup getGroup(String groupname) throws DatabaseException { DynamoGroup rc = null; DynamoIDKey key = new DynamoIDKey(groupname); synchronized (m_groups_sync) { // try to retrieve the group IDNameCacheObject cobj = (IDNameCacheObject)(m_name_to_group.get(key)); if (cobj!=null) { // got a cache object - retrieve the group value rc = (DynamoGroup)(cobj.get()); if (rc==null) { // the GroupObject got kicked out! kick it out of the HashMaps m_id_to_group.remove(cobj.getIDKey()); m_name_to_group.remove(key); cobj.clear(); cobj = null; } // end if } // end if if (rc==null) { // OK, we have to go to the database to find the group Map data = m_ops.getGroupData(groupname); if (data!=null) { // create group object and add it to our cache maps GroupObject gobj = new GroupObject(data,m_ops.getGroupOps(),m_ns_cache,m_srm,this); rc = gobj; cobj = new IDNameCacheObject(gobj.getGID(),key,gobj,m_group_rq); m_id_to_group.put(cobj.getIDKey(),cobj); m_name_to_group.put(cobj.getNameKey(),cobj); } // end if // else group does not exist - return null } // end if } // end synchronized block return rc; } // end getGroup public DynamoGroup createGroup(String groupname) throws DatabaseException { DynamoIDKey key = new DynamoIDKey(groupname); if (!(key.isValid(MAX_GROUPNAME))) { // the group ID is invalid... DatabaseException de = new DatabaseException(UserManagerObject.class,"UserMessages","group.badID"); de.setParameter(0,groupname); throw de; } // end if DynamoGroup rc = null; synchronized (m_groups_sync) { // see if the group is in our cache already IDNameCacheObject cobj = (IDNameCacheObject)(m_name_to_group.get(key)); if (cobj!=null) { // it's in the cache - we're going to fail this operation. But while we're here, if the // actual group object has been kicked out, expunge the reference. if (cobj.get()==null) { // the GroupObject got kicked out! kick it out of the HashMaps m_id_to_group.remove(cobj.getIDKey()); m_name_to_group.remove(key); cobj.clear(); cobj = null; } // end if // throw the exception saying that we exist DatabaseException de = new DatabaseException(UserManagerObject.class,"UserMessages","group.exists"); de.setParameter(0,groupname); throw de; } // end if // OK, at this point, we can't be any surer the group doesn't already exist without // hitting the database. So create it. (createNewGroup will throw a DatabaseException if the // group already exists.) Map data = m_ops.createNewGroup(groupname); GroupObject gobj = new GroupObject(data,m_ops.getGroupOps(),m_ns_cache,m_srm,this); rc = gobj; cobj = new IDNameCacheObject(gobj.getGID(),key,gobj,m_group_rq); m_id_to_group.put(cobj.getIDKey(),cobj); m_name_to_group.put(cobj.getNameKey(),cobj); } // end synchronized block return rc; // new group created! } // end createNewGroup public void loadUserDefaults(DynamoUser user, Collection namespaces) throws DatabaseException { // Start by translating all the namespaces to namespace IDs. int[] nsids = new int[namespaces.size()]; int i = 0; Iterator it = namespaces.iterator(); while (it.hasNext()) nsids[i++] = m_ns_cache.namespaceNameToId(it.next().toString()); // Now feed it into the database operations. m_ops.loadUserDefaults(user.getUID(),nsids); } // end loadUserDefaults /*-------------------------------------------------------------------------------- * Implementations from interface UserProxyManagement *-------------------------------------------------------------------------------- */ public DynamoUser getUserProxy(int uid) { synchronized (m_anon_user_sync) { // get the anonymous user, if it's there and matches if ((m_anon_user!=null) && (m_anon_user.getUID()==uid)) return m_anon_user; } // end synchronized block Integer key = new Integer(uid); synchronized (m_users_sync) { // try to retrieve the user IDNameCacheObject cobj = (IDNameCacheObject)(m_id_to_user.get(key)); if (cobj!=null) { // got a cache object - retrieve the user value DynamoUser rc = (DynamoUser)(cobj.get()); if (rc==null) { // the UserObject got kicked out! kick it out of the HashMaps m_id_to_user.remove(key); m_name_to_user.remove(cobj.getNameKey()); rc = new MyUserProxy(uid,cobj.getNameKey().toString()); cobj.clear(); cobj = null; } // end if return rc; } // end if return new MyUserProxy(uid); // just return a proxy object } // end synchronized block } // end getUserProxy public DynamoUser getUserProxy(int uid, String username) { synchronized (m_anon_user_sync) { // get the anonymous user, if it's there and matches if ((m_anon_user!=null) && (m_anon_user.getUID()==uid)) return m_anon_user; } // end synchronized block Integer key = new Integer(uid); synchronized (m_users_sync) { // try to retrieve the user IDNameCacheObject cobj = (IDNameCacheObject)(m_id_to_user.get(key)); if (cobj!=null) { // got a cache object - retrieve the user value DynamoUser rc = (DynamoUser)(cobj.get()); if (rc==null) { // the UserObject got kicked out! kick it out of the HashMaps m_id_to_user.remove(key); m_name_to_user.remove(cobj.getNameKey()); rc = new MyUserProxy(uid,cobj.getNameKey().toString()); cobj.clear(); cobj = null; } // end if return rc; } // end if return new MyUserProxy(uid,username); // just return a proxy object } // end synchronized block } // end getUserProxy public DynamoGroup getGroupProxy(int gid) { Integer key = new Integer(gid); synchronized (m_groups_sync) { // try to retrieve the group IDNameCacheObject cobj = (IDNameCacheObject)(m_id_to_group.get(key)); if (cobj!=null) { // got a cache object - retrieve the group value DynamoGroup rc = (DynamoGroup)(cobj.get()); if (rc==null) { // the GroupObject got kicked out! kick it out of the HashMaps m_id_to_group.remove(key); m_name_to_group.remove(cobj.getNameKey()); rc = new MyGroupProxy(gid,cobj.getNameKey().toString()); cobj.clear(); cobj = null; } // end if return rc; } // end if return new MyGroupProxy(gid); // just return a proxy object } // end synchronized block } // end getGroupProxy public DynamoGroup getGroupProxy(int gid, String groupname) { Integer key = new Integer(gid); synchronized (m_groups_sync) { // try to retrieve the group IDNameCacheObject cobj = (IDNameCacheObject)(m_id_to_group.get(key)); if (cobj!=null) { // got a cache object - retrieve the group value DynamoGroup rc = (DynamoGroup)(cobj.get()); if (rc==null) { // the GroupObject got kicked out! kick it out of the HashMaps m_id_to_group.remove(key); m_name_to_group.remove(cobj.getNameKey()); rc = new MyGroupProxy(gid,cobj.getNameKey().toString()); cobj.clear(); cobj = null; } // end if return rc; } // end if return new MyGroupProxy(gid,groupname); // just return a proxy object } // end synchronized block } // end getGroupProxy /*-------------------------------------------------------------------------------- * Implementations from interface AuthenticatorLookup *-------------------------------------------------------------------------------- */ public Authenticator findAuthenticator(String method_namespace, String method) { return (Authenticator)(m_authenticators.get(new QualifiedNameKey(method_namespace,method))); } // end findAuthenticator /*-------------------------------------------------------------------------------- * Implementations from interface AuthenticatorRegistration *-------------------------------------------------------------------------------- */ public ComponentShutdown registerAuthenticator(String method_namespace, String method, Authenticator auth) throws ConfigException { QualifiedNameKey key = new QualifiedNameKey(method_namespace,method); if (m_authenticators.containsKey(key)) { // dump out here ConfigException ce = new ConfigException(UserManagerObject.class,"DatabaseMessages","auth.register"); ce.setParameter(0,method_namespace); ce.setParameter(1,method); throw ce; } // end if m_authenticators.put(key,auth); return new ShutdownHashtableRemove(m_authenticators,key); } // end registerAuthenticator /*-------------------------------------------------------------------------------- * Implementations from interface UserPropertyTranslatorInstall *-------------------------------------------------------------------------------- */ public void installUserPropertyTranslator(UserPropertyTranslator upt) { m_adapter.setTranslator(upt); } // end installUserPropertyTranslator } // end class UserManagerObject