private void runScript(string message) { if (_isFaulted) { return; } var originalMessage = message; message = "{event} {global-profile} {local-profile}"; Logger.Write("Running: " + _file + " " + message); ThreadPool.QueueUserWorkItem((task) => { try { var process = new Process(); var responseDispatcher = new ResponseDispatcher( _keyPath, _dispatchErrors, "rscript-" + Name + " ", _outputDispatcher, internalDispatch, (response) => process.Write(response) ); process.SetLogger((logMsg) => Logger.Write(logMsg)); var msg = task.ToString(); process.Query( _file, msg, false, _keyPath, (error, m) => { if (m == null) { return; } Logger.Write("request doing " + m); if (error) { Logger.Write("rscript-" + Name + " produced an error:"); Logger.Write("rscript-" + Name + "-" + m); } responseDispatcher.Handle(error, m); }, new[] { new KeyValuePair <string, string>("{event}", "\"" + originalMessage + "\""), new KeyValuePair <string, string>("{global-profile}", "\"" + _globalProfileName + "\""), new KeyValuePair <string, string>("{local-profile}", "\"" + _localProfileName + "\"") }); Logger.Write("RScript completed"); } catch (Exception ex) { internalDispatch("rscript-" + Name + " " + ex.ToString()); Logger.Write(ex.ToString()); } }, message); }
public async Task Should_dispatch_messages() { var msg1 = new Message(1, 2, new TestResponse {TestId = 3, TestText = "TEXT 1"}); var msg1Ex = new Message(3, 4, new TestResponseEx {TestId = 3, TestText = "TEXT 1", TestText2 = "TEXT 1 EX"}); var msg2 = new Message(5, 6, new TestResponse2 {Name = "Mr.Resp", Address = "1 Object st.", City = "Class"}); var msg3 = new Message(7, 8, 9); Expression<Func<IResponseHandler, Task>> handleAnyMsgExp = handler => handler.HandleAsync(It.IsAny<IMessage>()); var handler1 = new Mock<IResponseHandler>(); handler1.SetupGet(handler => handler.ResponseType).Returns(typeof (ITestResponse)); var handler2 = new Mock<IResponseHandler>(); handler2.SetupGet(handler => handler.ResponseType).Returns(typeof (ITestResponse2)); var handlerF = new Mock<IResponseHandler>(); handlerF.SetupGet(handler => handler.ResponseType).Returns(typeof (object)); var dispatcher = new ResponseDispatcher(); dispatcher.AddHandler(handler1.Object); dispatcher.AddHandler(handler2.Object); dispatcher.FallbackHandler = handlerF.Object; await dispatcher.DispatchAsync(msg1); handler1.Verify(handler => handler.HandleAsync(msg1)); handler1.Verify(handleAnyMsgExp, Times.Once()); handler2.Verify(handleAnyMsgExp, Times.Never()); handlerF.Verify(handleAnyMsgExp, Times.Never()); await dispatcher.DispatchAsync(msg1Ex); handler1.Verify(handler => handler.HandleAsync(msg1Ex)); handler1.Verify(handleAnyMsgExp, Times.Exactly(2)); handler2.Verify(handleAnyMsgExp, Times.Never()); handlerF.Verify(handleAnyMsgExp, Times.Never()); await dispatcher.DispatchAsync(msg2); handler2.Verify(handler => handler.HandleAsync(msg2)); handler2.Verify(handleAnyMsgExp, Times.Once()); handler1.Verify(handleAnyMsgExp, Times.Exactly(2)); handlerF.Verify(handleAnyMsgExp, Times.Never()); await dispatcher.DispatchAsync(msg3); handlerF.Verify(handler => handler.HandleAsync(msg3), "Fallback handler didn't handle a message."); handlerF.Verify(handleAnyMsgExp, Times.Once()); handler1.Verify(handleAnyMsgExp, Times.Exactly(2)); handler2.Verify(handleAnyMsgExp, Times.Once); }
private void startService() { _service = new Process(); try { var responseDispatcher = new ResponseDispatcher( _keyPath, _dispatchErrors, "rscript-" + Name + " ", _outputDispatcher, internalDispatch, (response) => _service.Write(response) ); _service.SetLogger((logMsg) => Logger.Write(logMsg)); _service.Query( _file, "{global-profile} {local-profile}", false, _keyPath, (error, m) => { if (m == null) { return; } Logger.Write("request doing " + m); if (error) { Logger.Write("rscript-" + Name + " produced an error:"); Logger.Write("rscript-" + Name + "-" + m); } responseDispatcher.Handle(error, m); }, new[] { new KeyValuePair <string, string>("{global-profile}", "\"" + _globalProfileName + "\""), new KeyValuePair <string, string>("{local-profile}", "\"" + _localProfileName + "\"") }); Logger.Write("Exiting service script"); } catch (Exception ex) { internalDispatch("rscript-" + Name + " " + ex.ToString()); Logger.Write(ex.ToString()); } }
public static CommandEndpoint GetEndpoint(string path, string[] enabledLanguages) { _path = path; var reader = new ConfigReader(_path); _interpreters = new Interpreters(_path); ProcessExtensions.GetInterpreter = (file) => { var interpreters = _interpreters .GetInterpreterFor(Path.GetExtension(file)); return(interpreters); }; _cache = new TypeCache(); _outputEndpoint = new OutputEndpoint(_path); Logger.Write("Event endpoint serving on port: {0}", _outputEndpoint.Port); var responseDispatcher = new ResponseDispatcher( _path, false, "language-output ", (p, m) => _outputEndpoint.Send(p, m), (m) => _endpoint.Handle(m), (m) => {} ); responseDispatcher.OnlyCommands(); _pluginLocator = new PluginLocator( enabledLanguages, new ProfileLocator(_path), (msg) => { responseDispatcher.Handle(false, msg); } ); initPlugins(_pluginLocator); _eventEndpoint = new EventEndpoint(_path, _pluginLocator, _outputEndpoint); _eventEndpoint.Start(); Logger.Write("Event endpoint listening on port: {0}", _eventEndpoint.Port); Logger.Write("Creating plugin file tracker"); _tracker = new PluginFileTracker(); Logger.Write("Starting plugin file tracker"); var ignoreDirSetting = reader.Get("oi.ignore.directories"); var ignoreDirectories = new string[] {}; if (ignoreDirSetting != null) { ignoreDirectories = ignoreDirSetting .Split(new[] { ',' }) .Select(x => { if (Path.IsPathRooted(x)) { return(x); } return(Path.Combine(_path, x)); }) .ToArray(); } _tracker.Start( _path, _cache, _cache, _pluginLocator, _eventEndpoint, ignoreDirectories); Logger.Write("Plugin file tracker started"); _endpoint = new CommandEndpoint(_path, _cache, _eventEndpoint); _endpoint.AddHandler(messageHandler); _handlers.AddRange(new IHandler[] { new GetProjectsHandler(_endpoint, _cache), new GetFilesHandler(_endpoint, _cache), new GetCodeRefsHandler(_endpoint, _cache), new GetSignatureRefsHandler(_endpoint, _cache), new GoToDefinitionHandler(_endpoint, _cache, _pluginLocator), new FindTypeHandler(_endpoint, _cache), new SnippetEditHandler(_endpoint, _cache, _path), new SnippetDeleteHandler(_cache, _path), new GetRScriptStateHandler(_endpoint, _eventEndpoint), new CompleteSnippetHandler(_cache, _path, _endpoint), new WriteOutputHandler(_eventEndpoint), // Make sure this handler is the last one since the command can be file extension or language name new LanguageCommandHandler(_endpoint, _cache, _pluginLocator) }); Logger.Write("Command endpoint started"); return(_endpoint); }