using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Logging; using Tango.LogViewer.UI.LogViewerFileParser; namespace Tango.LogViewer.UI { public class LogViewerManager { private ILogViewerParser _parser; public LogFile LogFile { get; set; } public string FileName { get; set; } public bool IsEmbeddedLog { get; set; } public int CountOfSet { get; set; } public LogViewerManager() { LogFile = null; ; } /// /// Create LogFile by given path. /// /// The file. public void InitLogFile(String file) { LogFile = GetLogFile(file); } /// /// Gets set of log files by path. /// public LogFile GetLogFile(string filePath) { if (!File.Exists(filePath)) { throw new IOException("File not found."); } if (Path.GetExtension(filePath) != ".log") { throw new IOException("Invalid log file extension. extension must be *.log"); } var directoryName = Path.GetDirectoryName(filePath); var logfileName = Path.GetFileNameWithoutExtension(filePath); String fileName = logfileName; int index = logfileName.IndexOf("-"); if (index >= 0) { fileName = logfileName.Substring(0, index); } int indexPos = logfileName.IndexOf(FileLogger.FILE_SET_EXTENSION); if (indexPos > 0) { logfileName = logfileName.Substring(0, indexPos); } String dateString = System.IO.Path.GetFileNameWithoutExtension(filePath).Replace($"{fileName}-", "").Replace("_session", ""); indexPos = dateString.IndexOf(FileLogger.FILE_SET_EXTENSION); int indexOfFile = 0; CountOfSet = 0; if (indexPos > 0) { string fileNameIndex = dateString.Substring(indexPos + FileLogger.FILE_SET_EXTENSION.Length); string[] fileEntries = Directory.GetFiles(directoryName, $"{logfileName}*{Path.GetExtension(filePath)}").Where(x => Path.GetFileName(x).StartsWith(logfileName)).OrderBy(x => x).ToArray(); CountOfSet = fileEntries.Length; int.TryParse(fileNameIndex, out indexOfFile); dateString = dateString.Substring(0, indexPos); } DateTime date = DateTime.ParseExact(dateString, "dd-MM-yyyy_HH-mm-ss", CultureInfo.InvariantCulture); return (new LogFile() { DateTime = date, File = filePath, FileName = logfileName, PartOfSet = indexOfFile > 0, SetStartIndex = indexOfFile, SetCount = CountOfSet }); } /// /// Parses the this LogFile. /// public List Parse() { IsEmbeddedLog = false; FileName = ""; List logItems = new List(); if (LogFile == null) return logItems; FileName = LogFile.FileName; IsEmbeddedLog = FileName.StartsWith("Embedded"); if (IsEmbeddedLog) { _parser = new EmbeddedLogViewerParser(); } else { _parser = new ApplicationLogViewerParser(); } if (LogFile.PartOfSet) { string extension = Path.GetExtension(LogFile.File); var directoryName = Path.GetDirectoryName(LogFile.File); string[] fileEntries = Directory.GetFiles(directoryName, $"{FileName}*{extension}").Where(x => Path.GetFileName(x).StartsWith(FileName)).OrderBy(x => x).ToArray(); foreach (var file in fileEntries) { _parser.Parse(file, LogFile.DateTime, ref logItems); } } else { _parser.Parse(LogFile.File, LogFile.DateTime, ref logItems); } return logItems; } } }