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);
}
}
}
}
}