* Add name keyed cache to UserProfileCacheService
							parent
							
								
									6391b5312a
								
							
						
					
					
						commit
						cab7a2a45c
					
				| 
						 | 
					@ -39,16 +39,28 @@ namespace OpenSim.Framework.Communications.Cache
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
					        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <value>
 | 
				
			||||||
 | 
					        /// Standard format for names.
 | 
				
			||||||
 | 
					        /// </value>
 | 
				
			||||||
 | 
					        public const string NAME_FORMAT = "{0} {1}";
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// The comms manager holds references to services (user, grid, inventory, etc.)
 | 
					        /// The comms manager holds references to services (user, grid, inventory, etc.)
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        private readonly CommunicationsManager m_commsManager;
 | 
					        private readonly CommunicationsManager m_commsManager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Each user has a cached profile.
 | 
					        /// User profiles indexed by UUID
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        private readonly Dictionary<UUID, CachedUserInfo> m_userProfiles = new Dictionary<UUID, CachedUserInfo>();
 | 
					        private readonly Dictionary<UUID, CachedUserInfo> m_userProfilesById 
 | 
				
			||||||
 | 
					            = new Dictionary<UUID, CachedUserInfo>();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// User profiles indexed by name
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        private readonly Dictionary<string, CachedUserInfo> m_userProfilesByName 
 | 
				
			||||||
 | 
					            = new Dictionary<string, CachedUserInfo>();        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// The root library folder.
 | 
					        /// The root library folder.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
| 
						 | 
					@ -89,25 +101,49 @@ namespace OpenSim.Framework.Communications.Cache
 | 
				
			||||||
        /// <returns>true if the user was successfully removed, false otherwise</returns>
 | 
					        /// <returns>true if the user was successfully removed, false otherwise</returns>
 | 
				
			||||||
        public bool RemoveUser(UUID userId)
 | 
					        public bool RemoveUser(UUID userId)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            lock (m_userProfiles)
 | 
					            if (!RemoveFromCaches(userId))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (m_userProfiles.ContainsKey(userId))
 | 
					                m_log.WarnFormat(
 | 
				
			||||||
                {
 | 
					                    "[USER CACHE]: Tried to remove the profile of user {0}, but this was not in the scene", userId);
 | 
				
			||||||
                    m_userProfiles.Remove(userId);
 | 
					                
 | 
				
			||||||
                    return true;
 | 
					                return false;
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            m_log.WarnFormat(
 | 
					            return true;
 | 
				
			||||||
                "[USER CACHE]: Tried to remove the profile of user {0}, but this was not in the scene", userId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Get cached details of the given user.  If the user isn't in cache then the user is requested from the 
 | 
					        /// Get details of the given user.
 | 
				
			||||||
        /// profile service.  
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// If the user isn't in cache then the user is requested from the profile service.  
 | 
				
			||||||
 | 
					        /// <param name="userID"></param>
 | 
				
			||||||
 | 
					        /// <returns>null if no user details are found</returns>        
 | 
				
			||||||
 | 
					        public CachedUserInfo GetUserDetails(string fname, string lname)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            lock (m_userProfilesByName)
 | 
				
			||||||
 | 
					            {    
 | 
				
			||||||
 | 
					                CachedUserInfo userInfo;
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                if (m_userProfilesByName.TryGetValue(string.Format(NAME_FORMAT, fname, lname), out userInfo))                    
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return userInfo;
 | 
				
			||||||
 | 
					                }                
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {                
 | 
				
			||||||
 | 
					                    UserProfileData userProfile = m_commsManager.UserService.GetUserProfile(fname, lname);
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    if (userProfile != null)
 | 
				
			||||||
 | 
					                        return AddToCaches(userProfile);             
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                        return null;
 | 
				
			||||||
 | 
					                }               
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Get details of the given user.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// If the user isn't in cache then the user is requested from the profile service.  
 | 
				
			||||||
        /// <param name="userID"></param>
 | 
					        /// <param name="userID"></param>
 | 
				
			||||||
        /// <returns>null if no user details are found</returns>
 | 
					        /// <returns>null if no user details are found</returns>
 | 
				
			||||||
        public CachedUserInfo GetUserDetails(UUID userID)
 | 
					        public CachedUserInfo GetUserDetails(UUID userID)
 | 
				
			||||||
| 
						 | 
					@ -115,28 +151,69 @@ namespace OpenSim.Framework.Communications.Cache
 | 
				
			||||||
            if (userID == UUID.Zero)
 | 
					            if (userID == UUID.Zero)
 | 
				
			||||||
                return null;
 | 
					                return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            lock (m_userProfiles)
 | 
					            lock (m_userProfilesById)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (m_userProfiles.ContainsKey(userID))
 | 
					                if (m_userProfilesById.ContainsKey(userID))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    return m_userProfiles[userID];
 | 
					                    return m_userProfilesById[userID];
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    UserProfileData userprofile = m_commsManager.UserService.GetUserProfile(userID);
 | 
					                    UserProfileData userProfile = m_commsManager.UserService.GetUserProfile(userID);
 | 
				
			||||||
                    if (userprofile != null)
 | 
					                    if (userProfile != null)
 | 
				
			||||||
                    {
 | 
					                        return AddToCaches(userProfile);
 | 
				
			||||||
                        CachedUserInfo userinfo = new CachedUserInfo(m_commsManager, userprofile);
 | 
					 | 
				
			||||||
                        m_userProfiles.Add(userID, userinfo);
 | 
					 | 
				
			||||||
                        return userinfo;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    else
 | 
					                    else
 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        return null;
 | 
					                        return null;
 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Populate caches with the given user profile
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="userProfile"></param>
 | 
				
			||||||
 | 
					        protected CachedUserInfo AddToCaches(UserProfileData userProfile)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CachedUserInfo createdUserInfo = new CachedUserInfo(m_commsManager, userProfile);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            lock (m_userProfilesById)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                m_userProfilesById[createdUserInfo.UserProfile.ID] = createdUserInfo;
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                lock (m_userProfilesByName)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    m_userProfilesByName[createdUserInfo.UserProfile.Name] = createdUserInfo;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return createdUserInfo;            
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Remove profile belong to the given uuid from the caches
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="userUuid"></param>
 | 
				
			||||||
 | 
					        /// <returns>true if there was a profile to remove, false otherwise</returns>
 | 
				
			||||||
 | 
					        protected bool RemoveFromCaches(UUID userId)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            lock (m_userProfilesById)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (m_userProfilesById.ContainsKey(userId))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    CachedUserInfo userInfo = m_userProfilesById[userId];                    
 | 
				
			||||||
 | 
					                    m_userProfilesById.Remove(userId);
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    lock (m_userProfilesByName)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        m_userProfilesByName.Remove(userInfo.UserProfile.Name);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    return true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Preloads User data into the region cache. Modules may use this service to add non-standard clients
 | 
					        /// Preloads User data into the region cache. Modules may use this service to add non-standard clients
 | 
				
			||||||
| 
						 | 
					@ -145,21 +222,7 @@ namespace OpenSim.Framework.Communications.Cache
 | 
				
			||||||
        /// <param name="userData"></param>
 | 
					        /// <param name="userData"></param>
 | 
				
			||||||
        public void PreloadUserCache(UUID userID, UserProfileData userData)
 | 
					        public void PreloadUserCache(UUID userID, UserProfileData userData)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (userID == UUID.Zero)
 | 
					            AddToCaches(userData);
 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            lock (m_userProfiles)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                if (m_userProfiles.ContainsKey(userID))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    return;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    CachedUserInfo userInfo = new CachedUserInfo(m_commsManager, userData);
 | 
					 | 
				
			||||||
                    m_userProfiles.Add(userID, userInfo);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue