using System; using System.ServiceModel; using HeuristicLab.Hive.Contracts; using HeuristicLab.Hive.Contracts.Interfaces; namespace HeuristicLab.Hive.Server.ServerConsole { internal class ServiceLocator { private static IServerConsoleFacade serverConsoleFacade = null; internal static string Address { get; set; } internal static string Port { get; set; } internal static string Username { get; set; } internal static string Password { get; set; } // [chn] TODO: Don't store plaintext password in memory! internal static ISlaveManager GetSlaveManager() { return GetServerConsoleFacade() as ISlaveManager; } internal static IJobManager GetJobManager() { return GetServerConsoleFacade() as IJobManager; } internal static IServerConsoleFacade GetServerConsoleFacade() { if (serverConsoleFacade == null && Address != String.Empty && Port != String.Empty) { ChannelFactory factory = new ChannelFactory("ServerConsoleHttpEndpoint"); WcfSettings.SetEndpointAddress(factory.Endpoint, Address); factory.Credentials.UserName.UserName = Username; factory.Credentials.UserName.Password = Password; IServerConsoleFacade client = factory.CreateChannel(); ((ICommunicationObject)client).Faulted += ServiceLocator_Faulted; serverConsoleFacade = client; } return serverConsoleFacade; } static void ServiceLocator_Faulted(object sender, EventArgs e) { ((ICommunicationObject)serverConsoleFacade).Abort(); ((ICommunicationObject)serverConsoleFacade).Faulted -= ServiceLocator_Faulted; serverConsoleFacade = null; } internal static void ShutDownFacade() { serverConsoleFacade = null; } } }