From 4db232763f578048c3339e6a60fe801cc3853b3d Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 25 Feb 2009 18:33:15 +0000 Subject: More refactoring of the Grid, User and Messaging servers. --- OpenSim/Grid/UserServer/Main.cs | 167 +++++++-------------- OpenSim/Grid/UserServer/UserServerCommandModule.cs | 14 +- .../UserServer/UserServerEventDispatchModule.cs | 141 +++++++++++++++++ 3 files changed, 209 insertions(+), 113 deletions(-) create mode 100644 OpenSim/Grid/UserServer/UserServerEventDispatchModule.cs (limited to 'OpenSim/Grid/UserServer') diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs index e174b2d..63d788d 100644 --- a/OpenSim/Grid/UserServer/Main.cs +++ b/OpenSim/Grid/UserServer/Main.cs @@ -62,10 +62,12 @@ namespace OpenSim.Grid.UserServer protected UserServerFriendsModule m_friendsModule; public UserLoginService m_loginService; - public GridInfoService m_gridInfoService; public MessageServersConnector m_messagesService; + protected GridInfoServiceModule m_gridInfoService; + protected UserServerCommandModule m_consoleCommandModule; + protected UserServerEventDispatchModule m_eventDispatcher; public static void Main(string[] args) { @@ -97,62 +99,40 @@ namespace OpenSim.Grid.UserServer protected override void StartupSpecific() { - IInterServiceInventoryServices inventoryService = SetupRegisterCoreComponents(); + IInterServiceInventoryServices inventoryService = StartupCoreComponents(); m_stats = StatsManager.StartCollectingUserStats(); - m_log.Info("[STARTUP]: Establishing data connection"); - //setup database access service - m_userDataBaseService = new UserDataBaseService(); - m_userDataBaseService.Initialise(this); - //setup services/modules StartupUserServerModules(); StartOtherComponents(inventoryService); - m_consoleCommandModule = new UserServerCommandModule(m_loginService); - m_consoleCommandModule.Initialise(this); - - //register event handlers - RegisterEventHandlers(); - //PostInitialise the modules - m_consoleCommandModule.PostInitialise(); //it will register its Console command handlers in here - m_userDataBaseService.PostInitialise(); + PostInitialiseModules(); //register http handlers and start http server m_log.Info("[STARTUP]: Starting HTTP process"); RegisterHttpHandlers(); m_httpServer.Start(); - - base.StartupSpecific(); - } - - private void StartOtherComponents(IInterServiceInventoryServices inventoryService) - { - m_gridInfoService = new GridInfoService(); - - StartupLoginService(inventoryService); - // - // Get the minimum defaultLevel to access to the grid - // - m_loginService.setloginlevel((int)Cfg.DefaultUserLevel); - m_messagesService = new MessageServersConnector(); + base.StartupSpecific(); } - private IInterServiceInventoryServices SetupRegisterCoreComponents() + protected virtual IInterServiceInventoryServices StartupCoreComponents() { Cfg = new UserConfig("USER SERVER", (Path.Combine(Util.configDir(), "UserServer_Config.xml"))); - IInterServiceInventoryServices inventoryService = new OGS1InterServiceInventoryService(Cfg.InventoryUrl); - m_httpServer = new BaseHttpServer(Cfg.HttpPort); RegisterInterface(m_console); RegisterInterface(Cfg); + + IInterServiceInventoryServices inventoryService = new OGS1InterServiceInventoryService(Cfg.InventoryUrl); + // IRegionProfileService regionProfileService = new RegionProfileServiceProxy(); + RegisterInterface(inventoryService); + // RegisterInterface(regionProfileService); return inventoryService; } @@ -163,9 +143,43 @@ namespace OpenSim.Grid.UserServer /// protected virtual void StartupUserServerModules() { + m_log.Info("[STARTUP]: Establishing data connection"); + //setup database access service, for now this has to be created before the other modules. + m_userDataBaseService = new UserDataBaseService(); + m_userDataBaseService.Initialise(this); + + //TODO: change these modules so they fetch the databaseService class in the PostInitialise method m_userManager = new UserManager(m_userDataBaseService); + m_userManager.Initialise(this); + m_avatarAppearanceModule = new UserServerAvatarAppearanceModule(m_userDataBaseService); + m_avatarAppearanceModule.Initialise(this); + m_friendsModule = new UserServerFriendsModule(m_userDataBaseService); + m_friendsModule.Initialise(this); + + m_consoleCommandModule = new UserServerCommandModule(); + m_consoleCommandModule.Initialise(this); + + m_messagesService = new MessageServersConnector(); + m_messagesService.Initialise(this); + + m_gridInfoService = new GridInfoServiceModule(); + m_gridInfoService.Initialise(this); + } + + protected virtual void StartOtherComponents(IInterServiceInventoryServices inventoryService) + { + StartupLoginService(inventoryService); + // + // Get the minimum defaultLevel to access to the grid + // + m_loginService.setloginlevel((int)Cfg.DefaultUserLevel); + + RegisterInterface(m_loginService); //TODO: should be done in the login service + + m_eventDispatcher = new UserServerEventDispatchModule(m_userManager, m_messagesService, m_loginService); + m_eventDispatcher.Initialise(this); } /// @@ -178,34 +192,32 @@ namespace OpenSim.Grid.UserServer m_userDataBaseService, inventoryService, new LibraryRootFolder(Cfg.LibraryXmlfile), Cfg, Cfg.DefaultStartupMsg, new RegionProfileServiceProxy()); } - protected virtual void RegisterEventHandlers() + protected virtual void PostInitialiseModules() { - m_loginService.OnUserLoggedInAtLocation += NotifyMessageServersUserLoggedInToLocation; - m_userManager.OnLogOffUser += NotifyMessageServersUserLoggOff; - - m_messagesService.OnAgentLocation += HandleAgentLocation; - m_messagesService.OnAgentLeaving += HandleAgentLeaving; - m_messagesService.OnRegionStartup += HandleRegionStartup; - m_messagesService.OnRegionShutdown += HandleRegionShutdown; + m_consoleCommandModule.PostInitialise(); //it will register its Console command handlers in here + m_userDataBaseService.PostInitialise(); + m_messagesService.PostInitialise(); + m_eventDispatcher.PostInitialise(); //it will register event handlers in here + m_gridInfoService.PostInitialise(); + m_userManager.PostInitialise(); + m_avatarAppearanceModule.PostInitialise(); + m_friendsModule.PostInitialise(); } protected virtual void RegisterHttpHandlers() { m_loginService.RegisterHandlers(m_httpServer, Cfg.EnableLLSDLogin, true); - + m_userManager.RegisterHandlers(m_httpServer); m_friendsModule.RegisterHandlers(m_httpServer); m_avatarAppearanceModule.RegisterHandlers(m_httpServer); m_messagesService.RegisterHandlers(m_httpServer); - - m_httpServer.AddStreamHandler(new RestStreamHandler("GET", "/get_grid_info", - m_gridInfoService.RestGetGridInfoMethod)); - m_httpServer.AddXmlRPCHandler("get_grid_info", m_gridInfoService.XmlRpcGridInfoMethod); + m_gridInfoService.RegisterHandlers(m_httpServer); } public override void ShutdownSpecific() { - m_loginService.OnUserLoggedInAtLocation -= NotifyMessageServersUserLoggedInToLocation; + m_eventDispatcher.Close(); } #region IUGAIMCore @@ -247,74 +259,11 @@ namespace OpenSim.Grid.UserServer { return m_httpServer; } - - - #endregion - - #region Console Command Handlers - - protected override void ShowHelp(string[] helpArgs) - { - base.ShowHelp(helpArgs); - } #endregion public void TestResponse(List resp) { m_console.Notice("response got"); } - - #region Event Handlers - public void NotifyMessageServersUserLoggOff(UUID agentID) - { - m_messagesService.TellMessageServersAboutUserLogoff(agentID); - } - - public void NotifyMessageServersUserLoggedInToLocation(UUID agentID, UUID sessionID, UUID RegionID, - ulong regionhandle, float positionX, float positionY, - float positionZ, string firstname, string lastname) - { - m_messagesService.TellMessageServersAboutUser(agentID, sessionID, RegionID, regionhandle, positionX, - positionY, positionZ, firstname, lastname); - } - - public void HandleAgentLocation(UUID agentID, UUID regionID, ulong regionHandle) - { - m_userManager.HandleAgentLocation(agentID, regionID, regionHandle); - } - - public void HandleAgentLeaving(UUID agentID, UUID regionID, ulong regionHandle) - { - m_userManager.HandleAgentLeaving(agentID, regionID, regionHandle); - } - - public void HandleRegionStartup(UUID regionID) - { - // This might seem strange, that we send this back to the - // server it came from. But there is method to the madness. - // There can be multiple user servers on the same database, - // and each can have multiple messaging servers. So, we send - // it to all known user servers, who send it to all known - // message servers. That way, we should be able to finally - // update presence to all regions and thereby all friends - // - m_userManager.HandleRegionStartup(regionID); - m_messagesService.TellMessageServersAboutRegionShutdown(regionID); - } - - public void HandleRegionShutdown(UUID regionID) - { - // This might seem strange, that we send this back to the - // server it came from. But there is method to the madness. - // There can be multiple user servers on the same database, - // and each can have multiple messaging servers. So, we send - // it to all known user servers, who send it to all known - // message servers. That way, we should be able to finally - // update presence to all regions and thereby all friends - // - m_userManager.HandleRegionShutdown(regionID); - m_messagesService.TellMessageServersAboutRegionShutdown(regionID); - } - #endregion } } diff --git a/OpenSim/Grid/UserServer/UserServerCommandModule.cs b/OpenSim/Grid/UserServer/UserServerCommandModule.cs index f35cfec..a6f8af2 100644 --- a/OpenSim/Grid/UserServer/UserServerCommandModule.cs +++ b/OpenSim/Grid/UserServer/UserServerCommandModule.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -59,9 +59,8 @@ namespace OpenSim.Grid.UserServer protected IUGAIMCore m_core; - public UserServerCommandModule( UserLoginService loginService) + public UserServerCommandModule() { - m_loginService = loginService; } public void Initialise(IUGAIMCore core) @@ -83,8 +82,15 @@ namespace OpenSim.Grid.UserServer m_userDataBaseService = userDBservice; } + UserLoginService loginService; + if (m_core.TryGet(out loginService)) + { + m_loginService = loginService; + } + ConsoleBase console; - if ((m_core.TryGet(out console)) && (m_cfg != null) && (m_userDataBaseService != null)) + if ((m_core.TryGet(out console)) && (m_cfg != null) + && (m_userDataBaseService != null) && (m_loginService != null)) { RegisterConsoleCommands(console); } diff --git a/OpenSim/Grid/UserServer/UserServerEventDispatchModule.cs b/OpenSim/Grid/UserServer/UserServerEventDispatchModule.cs new file mode 100644 index 0000000..e23a7d1 --- /dev/null +++ b/OpenSim/Grid/UserServer/UserServerEventDispatchModule.cs @@ -0,0 +1,141 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using log4net; +using log4net.Config; +using OpenMetaverse; +using OpenSim.Data; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Communications.Cache; +using OpenSim.Framework.Console; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Statistics; +using OpenSim.Grid.Communications.OGS1; +using OpenSim.Grid.Framework; +using OpenSim.Grid.UserServer.Modules; + +namespace OpenSim.Grid.UserServer +{ + //Do we actually need these event dispatchers? + //shouldn't the other modules just directly register event handlers to each other? + public class UserServerEventDispatchModule + { + protected UserManager m_userManager; + protected MessageServersConnector m_messagesService; + protected UserLoginService m_loginService; + + public UserServerEventDispatchModule(UserManager userManager, MessageServersConnector messagesService, UserLoginService loginService) + { + m_userManager = userManager; + m_messagesService = messagesService; + m_loginService = loginService; + } + + public void Initialise(IUGAIMCore core) + { + } + + public void PostInitialise() + { + m_loginService.OnUserLoggedInAtLocation += NotifyMessageServersUserLoggedInToLocation; + m_userManager.OnLogOffUser += NotifyMessageServersUserLoggOff; + + m_messagesService.OnAgentLocation += HandleAgentLocation; + m_messagesService.OnAgentLeaving += HandleAgentLeaving; + m_messagesService.OnRegionStartup += HandleRegionStartup; + m_messagesService.OnRegionShutdown += HandleRegionShutdown; + } + + public void RegisterHandlers(BaseHttpServer httpServer) + { + + } + + public void Close() + { + m_loginService.OnUserLoggedInAtLocation -= NotifyMessageServersUserLoggedInToLocation; + } + + #region Event Handlers + public void NotifyMessageServersUserLoggOff(UUID agentID) + { + m_messagesService.TellMessageServersAboutUserLogoff(agentID); + } + + public void NotifyMessageServersUserLoggedInToLocation(UUID agentID, UUID sessionID, UUID RegionID, + ulong regionhandle, float positionX, float positionY, + float positionZ, string firstname, string lastname) + { + m_messagesService.TellMessageServersAboutUser(agentID, sessionID, RegionID, regionhandle, positionX, + positionY, positionZ, firstname, lastname); + } + + public void HandleAgentLocation(UUID agentID, UUID regionID, ulong regionHandle) + { + m_userManager.HandleAgentLocation(agentID, regionID, regionHandle); + } + + public void HandleAgentLeaving(UUID agentID, UUID regionID, ulong regionHandle) + { + m_userManager.HandleAgentLeaving(agentID, regionID, regionHandle); + } + + public void HandleRegionStartup(UUID regionID) + { + // This might seem strange, that we send this back to the + // server it came from. But there is method to the madness. + // There can be multiple user servers on the same database, + // and each can have multiple messaging servers. So, we send + // it to all known user servers, who send it to all known + // message servers. That way, we should be able to finally + // update presence to all regions and thereby all friends + // + m_userManager.HandleRegionStartup(regionID); + m_messagesService.TellMessageServersAboutRegionShutdown(regionID); + } + + public void HandleRegionShutdown(UUID regionID) + { + // This might seem strange, that we send this back to the + // server it came from. But there is method to the madness. + // There can be multiple user servers on the same database, + // and each can have multiple messaging servers. So, we send + // it to all known user servers, who send it to all known + // message servers. That way, we should be able to finally + // update presence to all regions and thereby all friends + // + m_userManager.HandleRegionShutdown(regionID); + m_messagesService.TellMessageServersAboutRegionShutdown(regionID); + } + #endregion + } +} -- cgit v1.1