diff --git a/ProjectCruiser/CollectionGenericObj/ArrayGenObj.cs b/ProjectCruiser/CollectionGenericObj/ArrayGenObj.cs index 5c56167..cf2297a 100644 --- a/ProjectCruiser/CollectionGenericObj/ArrayGenObj.cs +++ b/ProjectCruiser/CollectionGenericObj/ArrayGenObj.cs @@ -1,4 +1,6 @@  +using ProjectCruiser.Exceptions; + namespace ProjectCruiser.CollectionGenericObj; public class ArrayGenObj : ICollectionGenObj @@ -36,74 +38,140 @@ public class ArrayGenObj : ICollectionGenObj // methods : public T? GetItem(int index) { - if (index > Count || index < 0) + try { + if (index > Count) + throw new CollectionOverflowException(index); + if (index < 0) + throw new PositionOutOfCollectionException(index); + + if (_collection[index] == null) + throw new ObjectNotFoundException(index); + + return _collection[index]; + } + catch (CollectionOverflowException ex) + { + Console.WriteLine(ex.Message); + return null; + } + catch (ObjectNotFoundException ex) + { + Console.WriteLine(ex.Message); + return null; + } + catch (PositionOutOfCollectionException ex) + { + Console.WriteLine(ex.Message); return null; } - return _collection[index]; } public int Insert(T? item) { - if (Count >= _maxCount || item == null) + if (item == null) { return -1; } + + try // выход за границы, курируется CollectionOverflowException { + if (Count >= _maxCount) + { + throw new CollectionOverflowException(Count); + } + + // any empty place -> fill immediately + for (int i = 0; i < _collection.Length; i++) + { + if (_collection[i] == null) + { + _collection[i] = item; + return i; + } + } + return Count; + } + catch (CollectionOverflowException ex) + { + Console.WriteLine(ex.Message); return -1; } - - // any empty place -> fill immediately - for (int i = 0; i < _collection.Length; i++) - { - if (_collection[i] == null) - { - _collection[i] = item; - return i; - } - } - return Count; } public int Insert(T? item, int index) { - if (index >= _maxCount || Count >= _maxCount || - index < 0 || _collection[index] != null - || item == null) + try { - return -1; - } + if (index < 0 || index >= _maxCount) throw new PositionOutOfCollectionException(index); + if (Count >= _maxCount) throw new CollectionOverflowException(Count); - if (_collection[index] == null) - { - _collection[index] = item; - return index; - } + if (item == null) throw new ObjectNotFoundException(index); - int min_diff = 100, firstNullIndex = 100; - - for (int i = 0; i < Count; i++) - { - if (_collection[i] == null - && min_diff > Math.Abs(index - i)) + if (_collection[index] == null) { - min_diff = Math.Abs(index - i); - firstNullIndex = i; + _collection[index] = item; + return index; + } + else + { + int min_diff = 100, firstNullIndex = 100; + + for (int i = 0; i < Count; i++) + { + if (_collection[i] == null && min_diff > Math.Abs(index - i)) + { + min_diff = Math.Abs(index - i); + firstNullIndex = i; + } + } + + _collection[firstNullIndex] = item; + return firstNullIndex; } } - - _collection[firstNullIndex] = item; - return firstNullIndex; + catch (CollectionOverflowException ex) + { + Console.WriteLine(ex.Message); + return -1; + } + catch (ObjectNotFoundException ex) + { + Console.WriteLine(ex.Message); + return -1; + } + catch (PositionOutOfCollectionException ex) + { + Console.WriteLine(ex.Message); + return -1; + } } public T? Remove(int index) { - if (index >= Count || index < 0) - // on the other positions items don't exist + try { + if (index >= _maxCount || index < 0) + // on the other positions items don't exist + { + throw new CollectionOverflowException(index); + // [?] PositionOutOfCollectionException <<< + } + + T? item = _collection[index]; + _collection[index] = null; + + if (item == null) throw new ObjectNotFoundException(index); + + return item; + } + catch (CollectionOverflowException ex) + { + Console.WriteLine(ex.Message); + return null; + } + catch (ObjectNotFoundException ex) + { + Console.WriteLine(ex.Message); return null; } - - T? item = _collection[index]; - _collection[index] = null; - return item; } public IEnumerable GetItems() diff --git a/ProjectCruiser/CollectionGenericObj/ListGenObj.cs b/ProjectCruiser/CollectionGenericObj/ListGenObj.cs index fd256d3..3e11e11 100644 --- a/ProjectCruiser/CollectionGenericObj/ListGenObj.cs +++ b/ProjectCruiser/CollectionGenericObj/ListGenObj.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; +using ProjectCruiser.Exceptions; namespace ProjectCruiser.CollectionGenericObj; @@ -40,49 +41,111 @@ public class ListGenObj : ICollectionGenObj public T? GetItem(int position) { - if (position >= Count || position < 0) + try { + if (position > Count) + throw new CollectionOverflowException(position); + if (position < 0) + throw new PositionOutOfCollectionException(position); + + if (_collection[position] == null) + throw new ObjectNotFoundException(position); + + return _collection[position]; + } + catch (CollectionOverflowException ex) + { + Console.WriteLine(ex.Message); + return null; + } + catch (ObjectNotFoundException ex) + { + Console.WriteLine(ex.Message); + return null; + } + catch (PositionOutOfCollectionException ex) + { + Console.WriteLine(ex.Message); return null; } - - return _collection[position]; } public int Insert(T? obj) { - if (Count >= _maxCount || obj == null) + if (obj == null) { return -1; } + + try // выход за границы, курируется CollectionOverflowException { + if (Count >= _maxCount) + { + throw new CollectionOverflowException(Count); + } + + _collection.Add(obj); + return Count; + } + catch (CollectionOverflowException ex) + { + Console.WriteLine(ex.Message); return -1; } - - _collection.Add(obj); - return Count; } public int Insert(T? obj, int position) { - if (position >= _maxCount || Count >= _maxCount || - position < 0 || _collection[position] != null - || obj == null) + try { + if (position < 0 || position >= _maxCount) throw new PositionOutOfCollectionException(position); + if (Count >= _maxCount) throw new CollectionOverflowException(Count); + + if (obj == null) throw new ObjectNotFoundException(position); + + _collection.Insert(position, obj); + return position; + } + catch (CollectionOverflowException ex) + { + Console.WriteLine(ex.Message); + return -1; + } + catch (ObjectNotFoundException ex) + { + Console.WriteLine(ex.Message); + return -1; + } + catch (PositionOutOfCollectionException ex) + { + Console.WriteLine(ex.Message); return -1; } - - _collection.Insert(position, obj); - return position; } public T? Remove(int position) { - if (position >= Count || position < 0) - // on the other positions items don't exist + try { + if (position >= _maxCount || position < 0) + // on the other positions items don't exist + { + throw new CollectionOverflowException(position); + } + + T? item = _collection[position]; + _collection.RemoveAt(position); + + if (item == null) throw new ObjectNotFoundException(position); + + return item; + } + catch (CollectionOverflowException ex) { + Console.WriteLine(ex.Message); + return null; + } + catch (ObjectNotFoundException ex) + { + Console.WriteLine(ex.Message); return null; } - - T? item = _collection[position]; - _collection.RemoveAt(position); - return item; } public IEnumerable GetItems() diff --git a/ProjectCruiser/CollectionGenericObj/StorageCollection.cs b/ProjectCruiser/CollectionGenericObj/StorageCollection.cs index 93ae0b4..a209124 100644 --- a/ProjectCruiser/CollectionGenericObj/StorageCollection.cs +++ b/ProjectCruiser/CollectionGenericObj/StorageCollection.cs @@ -1,5 +1,6 @@ using System.Text; using ProjectCruiser.DrawningSamples; +using ProjectCruiser.Exceptions; namespace ProjectCruiser.CollectionGenericObj; @@ -55,9 +56,11 @@ public class StorageCollection /// Путь и имя файла /// true - сохранение прошло успешно, /// false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { - if (_storages.Count == 0) { return false; } + if (_storages.Count == 0) + throw new NullReferenceException(" > No existing collections to save"); + if (File.Exists(filename)) { File.Delete(filename); } StringBuilder sb = new(); @@ -79,21 +82,6 @@ public class StorageCollection foreach (T? item in pair.Value.GetItems()) { string data = item?.GetDataForSave() ?? string.Empty; - - /* - string n = item.GetType().Name; - string data = null; - - if (n != null && n == "DrawningCruiser") - { - data = ExtentionDrShip.GetDataForSave(item); - } - else if (n != null && n == "DrawningBase") - { - data = ExtentionDrShip.GetDataForSave(item); - } - */ - if (string.IsNullOrEmpty(data)) { continue; @@ -107,7 +95,6 @@ public class StorageCollection using FileStream fs = new(filename, FileMode.Create); byte[] info = new UTF8Encoding(true).GetBytes(sb.ToString()); fs.Write(info, 0, info.Length); - return true; } // Создание коллекции по типу @@ -122,12 +109,9 @@ public class StorageCollection } // Загрузка информации по кораблям в хранилище из файла - public bool LoadData(string filename) + public void LoadData(string filename) { - if (!File.Exists(filename)) - { - return false; - } + if (!File.Exists(filename)) throw new FileNotFoundException(); string bufferTextFromFile = ""; @@ -145,14 +129,9 @@ public class StorageCollection new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); if (strs == null || strs.Length == 0) - { - return false; - } + throw new NullReferenceException("> No data to decode"); if (!strs[0].Equals(_collectionKey)) - { - //если нет такой записи, то это не те данные - return false; - } + throw new InvalidDataException("> Incorrect data"); string[] companies = new string[strs.Length - 1]; for (int k = 1; k < strs.Length; k++) @@ -171,10 +150,9 @@ public class StorageCollection } CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]); ICollectionGenObj? collection = StorageCollection.CreateCollection(collectionType); + if (collection == null) - { - return false; - } + throw new NullReferenceException("> Failed to create collection"); collection.MaxCount = Convert.ToInt32(record[2]); string[] set = record[3].Split(_separatorItems, @@ -184,15 +162,20 @@ public class StorageCollection { if (elem?.CreateDrawningCar() is T ship) { - if (collection.Insert(ship) == -1) + try { - return false; + if (collection.Insert(ship) == -1) + throw new IndexOutOfRangeException( + "> Failed to add to collection : " + record[3]); + } + catch (CollectionOverflowException e) + { + throw new CollectionOverflowException("Collection overflowed", e); } } } _storages.Add(record[0], collection); } - return true; } } diff --git a/ProjectCruiser/Exceptions/CollectionOverflowException.cs b/ProjectCruiser/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..43f991d --- /dev/null +++ b/ProjectCruiser/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,18 @@ +using System.Runtime.Serialization; +namespace ProjectCruiser.Exceptions; + +// Класс, описывающий ошибку переполнения коллекции +[Serializable] +internal class CollectionOverflowException : ApplicationException +{ + public CollectionOverflowException(int count) + : base("Possible accsess of collection is over : " + count) { } + public CollectionOverflowException() : base() { } + public CollectionOverflowException(string message) : base(message) { } + public CollectionOverflowException(string message, Exception exception) : + base(message, exception) + { } + protected CollectionOverflowException(SerializationInfo info, + StreamingContext contex) : base(info, contex) { } +} + diff --git a/ProjectCruiser/Exceptions/ObjectNotFoundException.cs b/ProjectCruiser/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..81e29f9 --- /dev/null +++ b/ProjectCruiser/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; +namespace ProjectCruiser.Exceptions; + +// Класс, описывающий ошибку, что по указанной позиции нет элемента +[Serializable] +internal class ObjectNotFoundException : ApplicationException +{ + public ObjectNotFoundException(int i) + : base("Didn't find obj on this position : " + i) { } + public ObjectNotFoundException() : base() { } + public ObjectNotFoundException(string message) : base(message) { } + public ObjectNotFoundException(string message, Exception exception) + : base(message, exception) { } + protected ObjectNotFoundException(SerializationInfo info, + StreamingContext contex) : base(info, contex) { } +} diff --git a/ProjectCruiser/Exceptions/PositionOutOfCollectionException.cs b/ProjectCruiser/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..266b7ee --- /dev/null +++ b/ProjectCruiser/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; +namespace ProjectCruiser.Exceptions; + +// Класс, описывающий ошибку выхода за границы коллекции +[Serializable] +internal class PositionOutOfCollectionException : ApplicationException +{ + public PositionOutOfCollectionException(int i) + : base("Out of collection boarder. Position : " + i) { } + public PositionOutOfCollectionException() : base() { } + public PositionOutOfCollectionException(string message) : base(message) { } + public PositionOutOfCollectionException(string message, + Exception exception) : base(message, exception) { } + protected PositionOutOfCollectionException(SerializationInfo info, + StreamingContext contex) : base(info, contex) { } +} diff --git a/ProjectCruiser/Program.cs b/ProjectCruiser/Program.cs index ecba91c..7e7a369 100644 --- a/ProjectCruiser/Program.cs +++ b/ProjectCruiser/Program.cs @@ -1,17 +1,42 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; + namespace ProjectCruiser { internal static class Program { /// - /// The main entry point for the application. + /// The main entry point for the application. /// [STAThread] static void Main() { // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); - Application.Run(new ServiceForm2()); + ServiceCollection services = new(); + ConfigureServices(services); + + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + Application.Run(serviceProvider.GetRequiredService()); + } + + /// DI + /// + private static void ConfigureServices(ServiceCollection services) + { + services.AddSingleton().AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + // [*] option.AddSerilog("serilog.config"); + option.AddSerilog("serilog.config"); + + // instead of : + // option.SetMinimumLevel(LogLevel.Information); + // option.AddNLog("nlog.config"); + }); } } } \ No newline at end of file diff --git a/ProjectCruiser/ProjectCruiser.csproj b/ProjectCruiser/ProjectCruiser.csproj index 663fdb8..1afe9e3 100644 --- a/ProjectCruiser/ProjectCruiser.csproj +++ b/ProjectCruiser/ProjectCruiser.csproj @@ -8,4 +8,14 @@ enable + + + + + + + Always + + + \ No newline at end of file diff --git a/ProjectCruiser/ServiceForm2.cs b/ProjectCruiser/ServiceForm2.cs index 3b0c05f..83edf3e 100644 --- a/ProjectCruiser/ServiceForm2.cs +++ b/ProjectCruiser/ServiceForm2.cs @@ -1,5 +1,9 @@ using ProjectCruiser.CollectionGenericObj; using ProjectCruiser.DrawningSamples; + +using Microsoft.Extensions.Logging; +// using NLog.Extensions.Logging; + namespace ProjectCruiser; public partial class ServiceForm2 : Form @@ -9,10 +13,16 @@ public partial class ServiceForm2 : Form private readonly StorageCollection _storageCollection; - public ServiceForm2() + // Логер + private readonly ILogger _logger; + + // Конструктор > logger + public ServiceForm2(ILogger logger) { InitializeComponent(); _storageCollection = new(); + _logger = logger; + } // Выбор компании @@ -71,27 +81,39 @@ public partial class ServiceForm2 : Form // Передача объекта в другую форму private void btnChooseforTest_Click(object sender, EventArgs e) { + // Add EXCEPTIONS [!] if (_company == null) { return; } - DrawningBase? car = null; + DrawningBase? ship = null; int counter = 100; - while (car == null) + while (ship == null) { - car = _company.GetRandomObject(); - counter--; - if (counter <= 0) + try { - break; + ship = _company.GetRandomObject(); + counter--; + + if (counter <= 0) + { + break; + } } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + return; + } + } - if (car == null) + + if (ship == null) { return; } - OceanForm1 form = new() { SetShip = car }; + OceanForm1 form = new() { SetShip = ship }; form.ShowDialog(); } @@ -190,15 +212,17 @@ public partial class ServiceForm2 : Form { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.SaveData(saveFileDialog.FileName)) + try { + _storageCollection.SaveData(saveFileDialog.FileName); MessageBox.Show(" < Saved succesfully >", "Result :", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Saving to file : {filename}", saveFileDialog.FileName); } - else + catch (Exception ex) { - MessageBox.Show("< Failed to save >", "Result :", - MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Result :", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("< Error > : {Message}", ex.Message); } } } @@ -208,16 +232,20 @@ public partial class ServiceForm2 : Form { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.LoadData(openFileDialog.FileName)) + try { + _storageCollection.LoadData(openFileDialog.FileName); MessageBox.Show(" < Loaded succesfully >", "Result :", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Loading from file : {filename}", openFileDialog.FileName); + RefreshListBoxItems(); } - else + catch (Exception ex) { - MessageBox.Show("< Failed to load >", "Result :", - MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("< Failed to load >" + ex.Message, + "Result :", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("< Error > : {Message}", ex.Message); } } } diff --git a/ProjectCruiser/serilog.config b/ProjectCruiser/serilog.config new file mode 100644 index 0000000..a00fcc6 --- /dev/null +++ b/ProjectCruiser/serilog.config @@ -0,0 +1,13 @@ + + + + + + + + + + +