using Modèle; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml; namespace Persistance { /// /// Classe DataContractPersistance qui implémente IPersistanceManager et stocke les données dans les fichiers de persistance /// public class DataContractPersistance : IPersistanceManager { // Serializers pour requins et utlisateurs/experts /// /// DataContractSerializer permet de serialiser le type DataToPersistReq /// DataContractSerializer SerializerReq { get; set; } = new DataContractSerializer(typeof(DataToPersistReq)); /// /// DataContractSerializer permet de serialiser le type DataToPersistUsers /// DataContractSerializer SerializerUsers { get; set; } = new DataContractSerializer(typeof(DataToPersistUsers)); /// /// DataContractSerializer permet de serialiser le type List de String /// DataContractSerializer SerializerFun { get; set; } = new DataContractSerializer(typeof(List)); // DataToPersistReq et DataToPersistUsers /// /// DataToPersistReq permet de structurer le fichier de persistance des requins /// DataToPersistReq dataReq = new DataToPersistReq(); /// /// DataToPersistUsers permet de structurer le fichier de persistance des utilisateurs /// DataToPersistUsers data = new DataToPersistUsers(); /// /// List de String permet de strcturer le fichier de persistance des fun facts /// List lesFunFacts = new List(); // Chemin des fichiers /// /// String le chemin des fichiers de persistance /// String FilePath { get; set; } = Path.Combine(Directory.GetCurrentDirectory(), "..//..//..//Persistance"); // Noms des fichiers /// /// String le nom du fichier de persistance des requins /// String FileNameReq { get; set; } = "ficReqs"; /// /// String le nom du fichier de persistance des utilisateurs /// String FileNameUsers { get; set; } = "ficUsers"; /// /// String le nom du fichier de persistance des fun facts /// String FileNameFunFacts { get; set; } = "ficFunFacts"; // Fichiers complets /// /// String le chemin complet du fichier de persistance des requins /// String FileReq => Path.Combine(FilePath, FileNameReq); /// /// String le chemin complet du fichier de persistance des utilisateurs /// String FileUsers => Path.Combine(FilePath, FileNameUsers); /// /// String le chemin compket du fichier de persistance des fun facts /// String FileFunFacts => Path.Combine(FilePath, FileNameFunFacts); // Settings /// /// XmlWriterSettings permet de rajouter des paramètres dans l'écriture des fichiers de persistance /// public XmlWriterSettings settings { get; set; } = new XmlWriterSettings() { Indent = true }; // Méthodes pour les utilisateurs et experts /// /// Charge les utilisateurs des fichiers /// /// Les List d'Utilisateur et d'Expert du fichier public (List, List) LoadUsers() { if (!File.Exists(FileUsers)) { throw new FileNotFoundException("The persistance file does not exist"); } using (Stream stream = File.OpenRead(FileUsers)) { data = SerializerUsers.ReadObject(stream) as DataToPersistUsers; } return (data.Users, data.Experts); } /// /// Sauvegarde les listes en paramètres dans le fichier des utilisateurs /// /// /// public void SaveUsers(List users, List experts) { if (!Directory.Exists(FilePath)) { Directory.CreateDirectory(FileUsers); } data.Users.Clear(); data.Experts.Clear(); data.Users.AddRange(users); data.Experts.AddRange(experts); using (TextWriter tw = File.CreateText(Path.Combine(FilePath, FileNameUsers))) { using (XmlWriter writer = XmlWriter.Create(tw, settings)) { SerializerUsers.WriteObject(writer, data); } } } // Méthodes pour tous les requins /// /// Charge les listes des requins depuis les fichiers et les retourne /// /// Les List de Requin : ceux de l'application, ceux ajoutés par les utilisateurs, et ceux édités par les utilisateurs public (List, List, List) LoadRequins() { if (!File.Exists(FileReq)) { throw new FileNotFoundException("The persistance file does not exist"); } using (Stream stream = File.OpenRead(FileReq)) { dataReq = SerializerReq.ReadObject(stream) as DataToPersistReq; } return (dataReq.Requins, dataReq.RequinsAdd, dataReq.RequinsEdit); } /// /// Sauvegarde les listes de requins en paramètres dans le fichier de persistance pour les requins /// /// /// /// public void SaveRequins(List reqs, List reqsAdd, List reqsEdit) { if (!Directory.Exists(FilePath)) { Directory.CreateDirectory(FilePath); } dataReq.Requins.Clear(); dataReq.RequinsAdd.Clear(); dataReq.RequinsEdit.Clear(); dataReq.Requins.AddRange(reqs); dataReq.RequinsAdd.AddRange(reqsAdd); dataReq.RequinsEdit.AddRange(reqsEdit); using (TextWriter tw = File.CreateText(Path.Combine(FilePath, FileReq))) { using (XmlWriter writer = XmlWriter.Create(tw, settings)) { SerializerReq.WriteObject(writer, dataReq); } } } /// /// Charge les fun facts du fichier de persistance dans un liste et la retourne /// /// List de String avec les fun facts du fichier dedans public List LoadFunFacts() { if (!File.Exists(FileFunFacts)) { throw new FileNotFoundException("The persistance file does not exist"); } using (Stream stream = File.OpenRead(FileFunFacts)) { lesFunFacts = SerializerFun.ReadObject(stream) as List; } return lesFunFacts; } /// /// Sauvegarde les fun facts de la liste en paramètre dans le fichier de persistance des fun facts /// /// public void SaveFunFacts(List funFacts) { if (!Directory.Exists(FilePath)) { Directory.CreateDirectory(FilePath); } lesFunFacts.Clear(); lesFunFacts.AddRange(funFacts); using (TextWriter tw = File.CreateText(Path.Combine(FilePath, FileFunFacts))) { using (XmlWriter writer = XmlWriter.Create(tw, settings)) { SerializerFun.WriteObject(writer, lesFunFacts); } } } } }