diff --git a/MotorBoat/MotorBoat/BoatNotFoundException.cs b/MotorBoat/MotorBoat/BoatNotFoundException.cs new file mode 100644 index 0000000..55b9f5c --- /dev/null +++ b/MotorBoat/MotorBoat/BoatNotFoundException.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace MotorBoat +{ + internal class BoatNotFoundException : ApplicationException + { + public BoatNotFoundException(int i) : base($"Не найден объект по позиции {i}") { } + public BoatNotFoundException() : base() { } + public BoatNotFoundException(string message) : base(message) { } + public BoatNotFoundException(string message, Exception exception) : base(message, exception) { } + protected BoatNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} diff --git a/MotorBoat/MotorBoat/DrawningObjectBoat.cs b/MotorBoat/MotorBoat/DrawningObjectBoat.cs index c6685be..16b4fe2 100644 --- a/MotorBoat/MotorBoat/DrawningObjectBoat.cs +++ b/MotorBoat/MotorBoat/DrawningObjectBoat.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Extensions.Logging; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -24,7 +25,8 @@ namespace MotorBoat } public void SetObject(int x, int y, int width, int height) { - _boat.SetPosition(x, y, width, height); + _boat.SetPosition(x, y, width, height); + } void IDrawningObject.DrawningObject(Graphics g) { diff --git a/MotorBoat/MotorBoat/FormMapWithSetBoats.cs b/MotorBoat/MotorBoat/FormMapWithSetBoats.cs index 45c643d..43324ed 100644 --- a/MotorBoat/MotorBoat/FormMapWithSetBoats.cs +++ b/MotorBoat/MotorBoat/FormMapWithSetBoats.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Extensions.Logging; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -23,12 +24,14 @@ namespace MotorBoat {"Морская карта",new SeaMap() } }; private readonly MapsCollection _mapsCollection; + private readonly ILogger _logger; /// /// Конструктор /// - public FormMapWithSetBoats() + public FormMapWithSetBoats(ILogger logger) { InitializeComponent(); + _logger = logger; _mapsCollection = new MapsCollection(pictureBox.Width, pictureBox.Height); comboBoxSelectorMap.Items.Clear(); foreach (var elem in _mapDict) @@ -104,21 +107,32 @@ namespace MotorBoat public void AddBoat(DrawningBoat boat) { - if (ListBoxMaps.SelectedIndex == -1) + try { - return; - } + if (ListBoxMaps.SelectedIndex == -1) + { + return; + } - if (_mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty] + new DrawningObjectBoat(boat) != -1) - { - MessageBox.Show("Object is added"); - pictureBox.Image = _mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + if (_mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty] + new DrawningObjectBoat(boat) != -1) + { + + MessageBox.Show("Объект добавлен"); + _logger.LogInformation("Добавлен объект {@Boat}", boat); + pictureBox.Image = _mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + + } + else + { + MessageBox.Show("Не удалось добавить объект"); + _logger.LogWarning("Не удалось добавить объект"); + } } - else + catch (StorageOverflowException ex) { - MessageBox.Show("Unable to add object"); + _logger.LogWarning("Ошибка, переполнение хранилища :{0}", ex.Message); + MessageBox.Show($"Ошибка хранилище переполнено: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } - } /// /// Удаление объекта @@ -140,14 +154,30 @@ namespace MotorBoat return; } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); - if (_mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty] - pos != null) + try { - MessageBox.Show("Объект удален"); - pictureBox.Image = _mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + var boatForDel = _mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty] - pos; + if (boatForDel != null) + { + MessageBox.Show("Объект удален"); + _logger.LogInformation("Из текущей карты удалён объект {@Boat}", boatForDel); + pictureBox.Image = _mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } + else + { + _logger.LogWarning("Не удалось удалить объект по позиции {0}. Объект равен null", pos); + MessageBox.Show("Не удалось удалить объект"); + } } - else + catch (BoatNotFoundException ex) { - MessageBox.Show("Не удалось удалить объект"); + _logger.LogWarning("Ошибка удаления: {0}", ex.Message); + MessageBox.Show($"Ошибка удаления: {ex.Message}"); + } + catch (Exception ex) + { + _logger.LogWarning("Неизвестная ошибка удаления: {0}", ex.Message); + MessageBox.Show($"Неизвестная ошибка: {ex.Message}"); } } /// @@ -213,19 +243,23 @@ namespace MotorBoat if (comboBoxSelectorMap.SelectedIndex == -1 || string.IsNullOrEmpty(textBoxNewMapName.Text)) { MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogWarning("При добавлении карты {0}", comboBoxSelectorMap.SelectedIndex == -1 ? "Не была выбрана карта" : "Не была названа карта"); return; } if (!_mapDict.ContainsKey(comboBoxSelectorMap.Text)) { MessageBox.Show("Нет такой карты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogWarning("Отсутствует карта с типом {0}", comboBoxSelectorMap.Text); return; } _mapsCollection.AddMap(textBoxNewMapName.Text, _mapDict[comboBoxSelectorMap.Text]); ReloadMaps(); + _logger.LogInformation($"Добавлена карта: {textBoxNewMapName.Text}"); } private void ListBoxMaps_SelectedIndexChanged(object sender, EventArgs e) { pictureBox.Image = _mapsCollection[ListBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + _logger.LogInformation("Осуществлён переход на карту под названием {0}", ListBoxMaps.SelectedItem?.ToString() ?? string.Empty); } private void ButtonDeleteMap_Click(object sender, EventArgs e) @@ -236,6 +270,7 @@ namespace MotorBoat } if (MessageBox.Show($"Удалить карту {ListBoxMaps.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { + _logger.LogInformation("Удалена карта {0}", ListBoxMaps.SelectedItem?.ToString() ?? string.Empty); _mapsCollection.DelMap(ListBoxMaps.SelectedItem?.ToString() ?? string.Empty); ReloadMaps(); } @@ -245,13 +280,16 @@ namespace MotorBoat { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_mapsCollection.SaveData(saveFileDialog.FileName)) + try { + _mapsCollection.SaveData(saveFileDialog.FileName); + _logger.LogInformation("Сохранение прошло успешно. Расположение файла: {0}", saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); } - else + catch (Exception ex) { + _logger.LogWarning("Не удалось сохранить файл '{0}'. Текст ошибки: {1}", saveFileDialog.FileName, ex.Message); MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -262,13 +300,16 @@ namespace MotorBoat { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_mapsCollection.LoadData(openFileDialog.FileName)) + try { + _mapsCollection.LoadData(openFileDialog.FileName); + _logger.LogInformation("Загрузка данных из файла '{0}' прошла успешно", openFileDialog.FileName); ReloadMaps(); MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); } - else + catch (Exception ex) { + _logger.LogWarning("Не удалось загрузить файл '{0}'. Текст ошибки: {1}", openFileDialog.FileName, ex.Message); MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } } diff --git a/MotorBoat/MotorBoat/MapWithSetBoatsGeneric.cs b/MotorBoat/MotorBoat/MapWithSetBoatsGeneric.cs index 82eff4c..aa3ceb9 100644 --- a/MotorBoat/MotorBoat/MapWithSetBoatsGeneric.cs +++ b/MotorBoat/MotorBoat/MapWithSetBoatsGeneric.cs @@ -22,7 +22,7 @@ { int width = picWidth / _placeSizeWidth; int height = picHeight / _placeSizeHeight; - _setBoats = new SetBoatsGeneric(width * height); + _setBoats = new SetBoatsGeneric(21); _pictureWidth = picWidth; _pictureHeight = picHeight; _map = map; @@ -30,6 +30,7 @@ /// Перегрузка оператора сложения public static int operator +(MapWithSetBoatsGeneric map, T boat) { + return map._setBoats.Insert(boat); } /// Перегрузка оператора вычитания diff --git a/MotorBoat/MotorBoat/MapsCollection.cs b/MotorBoat/MotorBoat/MapsCollection.cs index e873d83..12ee377 100644 --- a/MotorBoat/MotorBoat/MapsCollection.cs +++ b/MotorBoat/MotorBoat/MapsCollection.cs @@ -44,7 +44,7 @@ namespace MotorBoat } } - public bool SaveData(string filename) + public void SaveData(string filename) { if (File.Exists(filename)) { @@ -59,13 +59,12 @@ namespace MotorBoat fs.Write($"{storage.Key}{separatorDict}{storage.Value.GetData(separatorDict, separatorData)}{Environment.NewLine}"); } } - return true; } - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new FileNotFoundException("Файл не найден"); } string str = ""; using (StreamReader fs = new StreamReader(filename)) @@ -73,8 +72,7 @@ namespace MotorBoat str = fs.ReadLine(); if (!str.Contains("MapsCollection")) { - //если нет такой записи, то это не те данные - return false; + throw new FileFormatException("Формат данных в файле не правильный"); } _mapStorages.Clear(); while ((str = fs.ReadLine()) != null) @@ -97,7 +95,6 @@ namespace MotorBoat _mapStorages[elem[0]].LoadData(elem[2].Split(separatorData,StringSplitOptions.RemoveEmptyEntries)); } } - return true; } } diff --git a/MotorBoat/MotorBoat/Program.cs b/MotorBoat/MotorBoat/Program.cs index fff7c6a..a86114f 100644 --- a/MotorBoat/MotorBoat/Program.cs +++ b/MotorBoat/MotorBoat/Program.cs @@ -1,3 +1,8 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; + namespace MotorBoat { internal static class Program @@ -11,7 +16,27 @@ namespace MotorBoat // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormMapWithSetBoats()); + 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 => + { + var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile(path: "appSetting.json", optional: false, reloadOnChange: true) + .Build(); + var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration) + .WriteTo.RollingFile("Logs\\log.txt") + .CreateLogger(); + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(logger); + }); } } } \ No newline at end of file diff --git a/MotorBoat/MotorBoat/SetBoatsGeneric.cs b/MotorBoat/MotorBoat/SetBoatsGeneric.cs index 3fcde51..19967d9 100644 --- a/MotorBoat/MotorBoat/SetBoatsGeneric.cs +++ b/MotorBoat/MotorBoat/SetBoatsGeneric.cs @@ -27,14 +27,15 @@ namespace MotorBoat } public int Insert(T boat, int position) { - if (position >= _maxCount || position < 0) return -1; + if (Count == _maxCount) { throw new StorageOverflowException(_maxCount); } + if (position > _maxCount || position < 0) return -1; _places.Insert(position, boat); return position; } public T Remove(int position) { // TODO проверка позиции - if (position >= _maxCount || position < 0) return null; + if (position >= Count || position < 0) throw new BoatNotFoundException(position); // TODO удаление объекта из массива, присовив элементу массива значение null T temp = _places[position]; _places.RemoveAt(position); diff --git a/MotorBoat/MotorBoat/StorageOverflowException.cs b/MotorBoat/MotorBoat/StorageOverflowException.cs new file mode 100644 index 0000000..1da6332 --- /dev/null +++ b/MotorBoat/MotorBoat/StorageOverflowException.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace MotorBoat +{ + [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 context) : base(info, context) { } + } +} diff --git a/MotorBoat/MotorBoat/appSetting.json b/MotorBoat/MotorBoat/appSetting.json new file mode 100644 index 0000000..4966efb --- /dev/null +++ b/MotorBoat/MotorBoat/appSetting.json @@ -0,0 +1,20 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "log_.log", + "rollingInterval": "Day", + "outputTemplate": "[{Timestamp:HH:mm:ss.fff}]{Level:u4}: {Message:lj}{NewLine}{Exception}" + } + } + ], + "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ], + "Properties": { + "Application": "MotorBoat" + } + } +} \ No newline at end of file