public bool ProcessServiceMessages(string text, IBuildVisitor buildVisitor) { if (buildVisitor == null) { throw new ArgumentNullException(nameof(buildVisitor)); } if (string.IsNullOrWhiteSpace(text)) { _log.Trace(() => new [] { new Text("Message is empty.") }); return(false); } var processed = false; foreach (var message in _serviceMessageParser.ParseServiceMessages(text)) { _log.Trace(() => new[] { new Text("Start message processing "), ToText(message) }); var flowId = message.GetValue("parent") ?? message.GetValue("flowId") ?? string.Empty; if (!_flows.TryGetValue(flowId, out var flow)) { _log.Trace(() => new[] { new Text($"Create flow {flowId}") }); flow = _flowFactory(); _flows.Add(flowId, flow); } else { _log.Trace(() => new[] { new Text($"Use existing flow {flowId}") }); } switch (message.Name?.ToLowerInvariant()) { case "flowstarted": _log.Trace(() => new[] { new Text($"Create child flow {flowId}") }); _flows[message.GetValue("flowId")] = flow.CreateChild(); processed = true; break; case "flowfinished": _log.Trace(() => new[] { new Text($"Remove flow {flowId}") }); _flows.Remove(flowId); processed = true; break; default: var result = flow.ProcessMessage(this, buildVisitor, message); // ReSharper disable once AccessToModifiedClosure _log.Trace(() => new[] { new Text($"Processed: {result}") }); processed |= result; break; } _log.Trace(() => new[] { new Text("Finish message processing "), ToText(message) }); } return(processed); }
public bool ProcessMessage(IMessageProcessor processor, IBuildVisitor buildVisitor, IServiceMessage message) { var processed = false; switch (message.Name?.ToLowerInvariant()) { case "message": var text = message.GetValue("text"); if (text != null) { var status = message.GetValue("status")?.ToUpperInvariant(); switch (status) { case "ERROR": _log.Trace(() => new[] { new Text($"Add error {text}") }); buildVisitor.Visit(new BuildError(text)); break; case "WARNING": _log.Trace(() => new[] { new Text($"Add warning {text}") }); buildVisitor.Visit(new BuildWarning(text)); break; } } var parseInternal = message.GetValue("tc:tags")?.ToLowerInvariant() == "tc:parseservicemessagesinside"; if (!parseInternal || !processor.ProcessServiceMessages(text, buildVisitor)) { WriteLine(text); } processed = true; break; case "blockopened": var blockName = message.GetValue("name"); _log.Trace(() => new [] { new Text($"Open block {blockName}") }); WriteLine(blockName); _tabs++; _tabsString = new string(' ', _tabs *Text.Tab.Value.Length); processed = true; break; case "blockclosed": _log.Trace(() => new[] { new Text("Close block") }); _tabs--; _tabsString = new string(' ', _tabs *Text.Tab.Value.Length); processed = true; break; } return(processed); }