using Modele;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
namespace Persistance
{
///
/// Classe XMLPersistance qui implémentant IPersistanceManager
///
public class XMLPersistance : IPersistanceManager
{
///
/// Contruit un XMLPersistance avec des strings en parametres
///
/// Nom du fichier contenant les Titres de ListeTitre de Manager
/// Nom du fichier contenant les Titres de la collection Favoris de ListeCollection de Manager
/// Chemin vers les fichiers
public XMLPersistance(string fileName = "Projet1.xml", string fileNameFav = "Projet1CollectionFav.xml", string filePath = null) //Ctor XMLPersistance
{
if(!string.IsNullOrWhiteSpace(filePath)) FilePath = filePath;
FileName = fileName;
FileNameFav = fileNameFav;
}
//Outil de mémoire Serializer, s'occupe de la lecture et de l'enregistrement du fichier xml
private DataContractSerializer Serializer { get; set; } = new DataContractSerializer(typeof(IEnumerable), //Type de données a persister (collection de titres)
new DataContractSerializerSettings() //Permet de preserver les references d'objets , pas de duplication de references
{
PreserveObjectReferences = true
});
//Persistance des titres
///
/// String contenant le chemin vers le dossier contenant les fichiers xml, getter et setter public
///
string FilePath { get; set; } = Path.Combine(Directory.GetCurrentDirectory(), "..\\..\\xml\\");
///
/// String contenant le nom du fichier a charger pour les Titres de ListeTitre du Manager, getter et setter public
///
string FileName { get; set; }
///
/// String contenant le chemin complet vers le fichier a charger pour les Titres de ListeTitre du Manager, cree en combinant le Chemin vers le dossier et le Nom du fichier
///
string XmlFile => Path.Combine(FilePath, FileName);
///
/// Charge les Titres a partir du fichier XML
///
/// Un enumerateur prenant en charge une iteration sur une collection de Titre
public IEnumerable LoadTitres()
{
//Verif si le fichier existe, et leve une exception si non
if (!File.Exists(XmlFile))
{
throw new FileNotFoundException("le fichier xml n'existe pas");
}
IEnumerable titres;
using (Stream stream = File.OpenRead(XmlFile)) //using utilisé car donnée non manager (implémente IDisposable), car il n'est pas capable de liberer la mémoire sans qu'on lui dise
{
titres = Serializer.ReadObject(stream) as IEnumerable; //On lui passe le flux et il doit rendre une collection de titres
} //Flux qui contient le contenu du fichier xml
return titres; //retourne la collection de titres si tout c'est bien passé
}
///
/// Enregistre les Titres de ListeTitre du Manager dans le fichier XML
///
/// Liste des titres a enregistrer dans le fichier
public void SaveTitres(IEnumerable titres)
{
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath); //Crée un directory a l'endroit du FilePath
} //Est ce que le FilePath existe deja, si non tu le crée
using (Stream stream = File.Create(XmlFile))
{
Serializer.WriteObject(stream, titres); //Recupere et enregistre les titres passe en paramètres de la méthode
}
}
//Persistance de la collection de favoris
///
/// String contenant le nom du fichier xml a charger pour les Titres des Favoris de la ListeCollection de Manager
///
string FileNameFav { get; set; }
///
/// String contenant le chemin complet vers le fichier xml des Titres favoris, cree en combinant le chemin vers le dossier et le nom du fichier
///
string XmlFileFav => Path.Combine(FilePath, FileNameFav);
///
/// Charge les Titres Favoris a partir du fichier XML
///
/// Un enumerateur prenant en charge une iteration sur une collection de Titre
public IEnumerable LoadTitresFavoris()
{
//Verif si le fichier existe, et leve une exception si non
if (!File.Exists(XmlFileFav))
{
throw new FileNotFoundException("le fichier xml n'existe pas");
}
IEnumerable titres;
using (Stream stream = File.OpenRead(XmlFileFav)) //using utilisé car donnée non manager (implémente IDisposable), car il n'est pas capable de liberer la mémoire sans qu'on lui dise
{
titres = Serializer.ReadObject(stream) as IEnumerable; //On lui passe le flux et il doit rendre une collection de titres
} //Flux qui contient le contenu du fichier xml
return titres; //retourne la collection de titres si tout c'est bien passé
}
///
/// Enregistre les Titres Favoris de la ListeCollecion du Manager dans le fichier XML
///
/// Liste des Titres de Favoris de ListeCollection
public void SaveTitresFavoris(IEnumerable titres)
{
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath); //Crée un directory a l'endroit du FilePath
} //Est ce que le FilePath existe deja, si non tu le crée
using (Stream stream = File.Create(XmlFileFav))
{
Serializer.WriteObject(stream, titres); //Recupere et enregistre les titres passe en paramètres de la méthode
}
}
}
}