diff --git a/Trolleybus/Trolleybus/BusNotFoundException.cs b/Trolleybus/Trolleybus/BusNotFoundException.cs new file mode 100644 index 0000000..694d627 --- /dev/null +++ b/Trolleybus/Trolleybus/BusNotFoundException.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.Serialization; + +namespace Trolleybus.Exceptions +{ + [Serializable] + internal class BusNotFoundException : ApplicationException + { + public BusNotFoundException(int i) : base($"Не найден объект по позиции {i}") { } + public BusNotFoundException() : base() { } + public BusNotFoundException(string message) : base(message) { } + public BusNotFoundException(string message, Exception exception) : base(message, exception) { } + protected BusNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } + } +} \ No newline at end of file diff --git a/Trolleybus/Trolleybus/BusesGenericCollection.cs b/Trolleybus/Trolleybus/BusesGenericCollection.cs index ff8b62d..2df2f1b 100644 --- a/Trolleybus/Trolleybus/BusesGenericCollection.cs +++ b/Trolleybus/Trolleybus/BusesGenericCollection.cs @@ -73,14 +73,7 @@ namespace Trolleybus.Generics /// public static bool operator -(BusesGenericCollection collect, int pos) { - T? obj = collect._collection[pos]; - if (obj != null) - { - collect._collection.Remove(pos); - return true; - - } - return false; + return collect._collection.Remove(pos); } /// @@ -138,7 +131,7 @@ namespace Trolleybus.Generics { if (bus != null) { - bus.SetPosition(j * (_placeSizeWidth + 10) + 5, i * (_placeSizeHeight) + 10); + bus.SetPosition(j * (_placeSizeWidth + 10) + 5, i * (_placeSizeHeight + 10) + 5); bus.DrawTransport(g); } j--; diff --git a/Trolleybus/Trolleybus/BusesGenericStorage.cs b/Trolleybus/Trolleybus/BusesGenericStorage.cs index f837e84..f1c9649 100644 --- a/Trolleybus/Trolleybus/BusesGenericStorage.cs +++ b/Trolleybus/Trolleybus/BusesGenericStorage.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Trolleybus.DrawingObjects; using Trolleybus.MovementStrategy; +using Trolleybus.Exceptions; namespace Trolleybus.Generics { @@ -103,7 +104,7 @@ namespace Trolleybus.Generics /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { if (File.Exists(filename)) { @@ -122,12 +123,11 @@ namespace Trolleybus.Generics } if (data.Length == 0) { - return false; + throw new InvalidOperationException("Невалиданя операция, нет данных для сохранения"); } using StreamWriter sw = new StreamWriter(filename, false); sw.WriteLine($"BusesStorage"); sw.WriteLine(data); - return true; } /// /// Загрузка информации по автобусам из файла в хранилище @@ -138,15 +138,20 @@ namespace Trolleybus.Generics { if (!File.Exists(filename)) { - return false; + throw new FileNotFoundException("Файл не найден"); } using(StreamReader sr = File.OpenText(filename)) { String currentLine = sr.ReadLine(); - // Если первая строка пустая или в файле не те данные - if (currentLine == null || !currentLine.Contains("BusesStorage")) + // Если первая строка пустая + if (currentLine == null || currentLine.Length == 0) { - return false; + throw new ArgumentException("Нет данных для загрузки"); + } + // Если в файле не те данные + if (!currentLine.Contains("BusesStorage")) + { + throw new InvalidDataException("Неверный формат данных"); } // Очистка хранилища _busStorages.Clear(); @@ -163,7 +168,7 @@ namespace Trolleybus.Generics { if ((collection + bus) == -1) { - return false; + throw new StorageOverflowException("Ошибка добавления в коллекцию"); } } } diff --git a/Trolleybus/Trolleybus/FormBusesCollection.cs b/Trolleybus/Trolleybus/FormBusesCollection.cs index b71fe5f..f3df2c3 100644 --- a/Trolleybus/Trolleybus/FormBusesCollection.cs +++ b/Trolleybus/Trolleybus/FormBusesCollection.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; using Trolleybus.DrawingObjects; +using Trolleybus.Exceptions; using Trolleybus.Generics; using Trolleybus.MovementStrategy; @@ -19,13 +21,20 @@ namespace Trolleybus /// Набор объектов /// private readonly BusesGenericStorage _storage; + + /// + /// Логер + /// + private readonly ILogger _logger; + /// /// Конструктор /// - public FormBusesCollection() + public FormBusesCollection(ILogger logger) { InitializeComponent(); _storage = new BusesGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height); + _logger = logger; } /// @@ -63,6 +72,7 @@ namespace Trolleybus } _storage.AddSet(textBoxNameOfSet.Text); ReloadObjects(); + _logger.LogInformation($"Добавлен набор: {textBoxNameOfSet.Text} "); } /// /// Выбор набора @@ -84,11 +94,15 @@ namespace Trolleybus { return; } - if (MessageBox.Show($"Удалить объект {listBoxSets.SelectedItem}?", "Удаление", + string nameOfSet = listBoxSets.SelectedItem.ToString() ?? string.Empty; + + if (MessageBox.Show($"Удалить набор {nameOfSet}?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - _storage.DelSet(listBoxSets.SelectedItem.ToString() ?? string.Empty); + _storage.DelSet(nameOfSet); ReloadObjects(); + _logger.LogInformation($"Удалён набор: {nameOfSet}"); + } } /// @@ -114,15 +128,31 @@ namespace Trolleybus return; } //Возвращение объекту размеров pictureBox с этой формы (до этого создался с размерами pictureBox с FormBusConfig) - selectedBus.ChangePictureSize(pictureBoxCollection.Width, pictureBoxCollection.Height); - if (obj + selectedBus != -1) + if (selectedBus != null) { - MessageBox.Show("Объект добавлен"); - pictureBoxCollection.Image = obj.ShowBuses(); + selectedBus.ChangePictureSize(pictureBoxCollection.Width, pictureBoxCollection.Height); } - else + String nameOfSet = listBoxSets.SelectedItem.ToString() ?? string.Empty; + try + { + if(obj + selectedBus != -1) + { + MessageBox.Show("Объект добавлен"); + _logger.LogInformation($"Объект добавлен в набор {nameOfSet}"); + pictureBoxCollection.Image = obj.ShowBuses(); + } + // Сюда попадёт, если сложение не вернуло исключение, но вернуло -1 (добавляемый объект = null) + else + { + MessageBox.Show("Не удалось добавить null объект"); + _logger.LogWarning($"Не удалось добавить null объект"); + } + } + // Сюда попадёт, если сложение вернуло исключение при добавлении объекта + catch (StorageOverflowException ex) { MessageBox.Show("Не удалось добавить объект"); + _logger.LogWarning($"Не удалось добавить объект в набор {nameOfSet} : {ex.Message}"); } } /// @@ -152,14 +182,25 @@ namespace Trolleybus pos_string = "0"; } int pos = Convert.ToInt32(pos_string); - if (obj - pos) + String nameOfSet = listBoxSets.SelectedItem.ToString(); + try { - MessageBox.Show("Объект удален"); - pictureBoxCollection.Image = obj.ShowBuses(); + if (obj - pos) + { + MessageBox.Show("Объект удалён"); + _logger.LogInformation($"Объект удалён из набора {nameOfSet}"); + pictureBoxCollection.Image = obj.ShowBuses(); + } + else + { + MessageBox.Show("Объект не удалось удалить"); + _logger.LogWarning($"Не удалось удалить объект из набора {nameOfSet}"); + } } - else + catch (BusNotFoundException ex) { - MessageBox.Show("Не удалось удалить объект"); + MessageBox.Show(ex.Message); + _logger.LogWarning($"Не удалось удалить объект из набора {nameOfSet} : {ex.Message}"); } } /// @@ -189,13 +230,16 @@ namespace Trolleybus { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storage.SaveData(saveFileDialog.FileName)) + try { + _storage.SaveData(saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation($"Набор сохранился в файл {saveFileDialog.FileName}"); } - else + catch (Exception ex) { - MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"Набор НЕ сохранился", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogWarning($"Набор НЕ сохранился в файл {saveFileDialog.FileName} : {ex.Message}"); } } } @@ -204,18 +248,21 @@ namespace Trolleybus /// /// /// - private void DownloadToolStripMenuItem_Click(object sender, EventArgs e) + private void LoadToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storage.LoadData(openFileDialog.FileName)) + try { + _storage.LoadData(openFileDialog.FileName); ReloadObjects(); MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation($"Успешная загрузка данных из файла {openFileDialog.FileName}"); } - else + catch (Exception ex) { - MessageBox.Show("Не удалось загрузить данные", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"Не удалось загрузить данные", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogWarning($"Не удалось загрузить данные из файла {openFileDialog.FileName} : {ex.Message}"); } } } @@ -250,7 +297,7 @@ namespace Trolleybus pictureBoxCollection.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; pictureBoxCollection.Location = new Point(0, 36); pictureBoxCollection.Name = "pictureBoxCollection"; - pictureBoxCollection.Size = new Size(670, 517); + pictureBoxCollection.Size = new Size(270, 517); pictureBoxCollection.TabIndex = 0; pictureBoxCollection.TabStop = false; // @@ -263,7 +310,7 @@ namespace Trolleybus panelTools.Controls.Add(maskedTextBoxNumber); panelTools.Controls.Add(buttonRemoveBus); panelTools.Controls.Add(buttonAddBus); - panelTools.Location = new Point(676, 36); + panelTools.Location = new Point(276, 36); panelTools.Name = "panelTools"; panelTools.Size = new Size(200, 517); panelTools.TabIndex = 1; @@ -363,7 +410,7 @@ namespace Trolleybus menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; - menuStrip.Size = new Size(882, 28); + menuStrip.Size = new Size(482, 28); menuStrip.TabIndex = 2; menuStrip.Text = "menuStrip1"; // @@ -377,16 +424,16 @@ namespace Trolleybus // saveToolStripMenuItem // saveToolStripMenuItem.Name = "saveToolStripMenuItem"; - saveToolStripMenuItem.Size = new Size(224, 26); + saveToolStripMenuItem.Size = new Size(177, 26); saveToolStripMenuItem.Text = "Сохранение"; saveToolStripMenuItem.Click += SaveToolStripMenuItem_Click; // // downloadToolStripMenuItem // downloadToolStripMenuItem.Name = "downloadToolStripMenuItem"; - downloadToolStripMenuItem.Size = new Size(224, 26); + downloadToolStripMenuItem.Size = new Size(177, 26); downloadToolStripMenuItem.Text = "Загрузка"; - downloadToolStripMenuItem.Click += DownloadToolStripMenuItem_Click; + downloadToolStripMenuItem.Click += LoadToolStripMenuItem_Click; // // openFileDialog // @@ -399,7 +446,7 @@ namespace Trolleybus // // FormBusesCollection // - ClientSize = new Size(882, 553); + ClientSize = new Size(482, 553); Controls.Add(panelTools); Controls.Add(pictureBoxCollection); Controls.Add(menuStrip); diff --git a/Trolleybus/Trolleybus/Program.cs b/Trolleybus/Trolleybus/Program.cs index 728fe68..d9c1b9e 100644 --- a/Trolleybus/Trolleybus/Program.cs +++ b/Trolleybus/Trolleybus/Program.cs @@ -1,3 +1,8 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; + namespace Trolleybus { internal static class Program @@ -11,7 +16,29 @@ namespace Trolleybus // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormBusesCollection()); + + var services = new ServiceCollection(); + ConfigureServices(services); + using (ServiceProvider serviceProvider = services.BuildServiceProvider()) + { + Application.Run(serviceProvider.GetRequiredService()); + } + } + private static void ConfigureServices(ServiceCollection services) + { + services.AddSingleton().AddLogging(option => + { + string[] path = Directory.GetCurrentDirectory().Split('\\'); + string pathNeed = ""; + for (int i = 0; i < path.Length - 3; i++) + { + pathNeed += path[i] + "\\"; + } + var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(path: $"{pathNeed}appsettings.json", optional: false, reloadOnChange: true).Build(); + var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger(); + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(logger); + }); } } } \ No newline at end of file diff --git a/Trolleybus/Trolleybus/SetGeneric.cs b/Trolleybus/Trolleybus/SetGeneric.cs index 6f84c1e..3ad7ebd 100644 --- a/Trolleybus/Trolleybus/SetGeneric.cs +++ b/Trolleybus/Trolleybus/SetGeneric.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Trolleybus.Exceptions; namespace Trolleybus.Generics { @@ -48,7 +49,7 @@ namespace Trolleybus.Generics return 0; } //если при добавлении в списке станет больше макс. кол-ва элементов, то как бы вставлять будет некуда - return -1; + throw new StorageOverflowException(_maxCount); } /// /// Добавление объекта в набор на конкретную позицию @@ -61,7 +62,7 @@ namespace Trolleybus.Generics if (position >= _maxCount || position < 0) { //позиция неверная, значит вставить нельзя - return -1; + throw new StorageOverflowException("Неверный индекс"); } if (Count + 1 <= _maxCount) { @@ -70,7 +71,7 @@ namespace Trolleybus.Generics return position; } //места в списке нет - return -1; + throw new StorageOverflowException(_maxCount); } /// /// Удаление объекта из набора с конкретной позиции @@ -81,7 +82,11 @@ namespace Trolleybus.Generics { if (position >= Count || position < 0) { - return false; + throw new BusNotFoundException(position); + } + if (_places[position] == null) + { + throw new BusNotFoundException(position); } _places.RemoveAt(position); return true; diff --git a/Trolleybus/Trolleybus/StorageOverflowException.cs b/Trolleybus/Trolleybus/StorageOverflowException.cs new file mode 100644 index 0000000..873482f --- /dev/null +++ b/Trolleybus/Trolleybus/StorageOverflowException.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.Serialization; + +namespace Trolleybus.Exceptions +{ + [Serializable] + internal class StorageOverflowException : ApplicationException + { + public StorageOverflowException(int count) : base($"В наборе превышено допустимое количество: {count}") { } + public StorageOverflowException() : base() { } + public StorageOverflowException(string message) : base(message) { } + public StorageOverflowException(string message, Exception exception) : base(message, exception) { } + protected StorageOverflowException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } + } +} \ No newline at end of file diff --git a/Trolleybus/Trolleybus/Trolleybus.csproj b/Trolleybus/Trolleybus/Trolleybus.csproj index 13ee123..79b8c81 100644 --- a/Trolleybus/Trolleybus/Trolleybus.csproj +++ b/Trolleybus/Trolleybus/Trolleybus.csproj @@ -8,6 +8,19 @@ enable + + + + + + + + + + + + + True diff --git a/Trolleybus/Trolleybus/appsettings.json b/Trolleybus/Trolleybus/appsettings.json new file mode 100644 index 0000000..0c69bec --- /dev/null +++ b/Trolleybus/Trolleybus/appsettings.json @@ -0,0 +1,20 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/log_.log", + "rollingInterval": "Day", + "outputTemplate": "[{Timestamp:HH:mm:ss.fff}]{Level:u4}: {Message:lj}{NewLine}{Exception}" + } + } + ], + "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ], + "Properties": { + "Application": "AirplaneWithRadar" + } + } +} \ No newline at end of file