using System.Runtime.Serialization.Json;
using System.Text;
using System.Diagnostics.CodeAnalysis;
using System.Xml;
using CoreLibrary.Persistance;
using CoreLibrary.Regles;
namespace Persistance.Persistance
{
///
/// Classe PersistanceJson, implémentant l'interface IPersistance, pour la persistance des données au format JSON.
///
[ExcludeFromCodeCoverage]
public class PersistanceJson : IPersistance
{
///
/// Chaîne de caractères représentant le nom du dossier pour sauvegarder et charger.
///
private readonly string nomDossier = "Fichiers";
///
/// Chaîne de caractères représentant le nom du dossier.
///
private readonly string dossier;
///
/// Constructeur de PersistanceJson.
///
public PersistanceJson(string dossier)
{
if(!Directory.Exists(dossier))
Directory.CreateDirectory(dossier);
this.dossier = dossier;
}
///
/// Charge les données trouvées dans le fichier de sauvegarde au format JSON.
///
/// Renvoie un tableau de tous les éléments chargés.
public T[] Charger() where T : IEstPersistant
{
string fichier = $"{typeof(T).Name.ToLower()}s.json";
Directory.SetCurrentDirectory(dossier);
if (!Directory.Exists(nomDossier))
return [];
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), nomDossier));
if (!File.Exists(fichier))
return [];
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(
typeof(T[]),
typeof(IRegles).Assembly.GetTypes()
.Where(type => typeof(IRegles).IsAssignableFrom(type) && type.IsClass)
);
T[]? elements;
using (FileStream s = File.OpenRead(fichier))
{
elements = jsonSerializer.ReadObject(s) as T[];
}
return elements != null ? elements : Array.Empty();
}
///
/// Enregistre les éléments spécifiés dans le fichier de sauvegarde au format JSON.
///
/// Elements à enregistrer dans le fichier de sauvegarde.
public void Enregistrer(T[] elements) where T : IEstPersistant
{
string fichier = $"{typeof(T).Name.ToLower()}s.json";
Directory.SetCurrentDirectory(dossier);
if (!Directory.Exists(nomDossier))
Directory.CreateDirectory(nomDossier);
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), nomDossier));
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(
typeof(T[]),
typeof(IRegles).Assembly.GetTypes()
.Where(type => typeof(IRegles).IsAssignableFrom(type) && type.IsClass)
);
using (FileStream s = File.Create(fichier))
{
using (XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter(
s,
Encoding.UTF8,
false,
true))
{
jsonSerializer.WriteObject(writer, elements);
}
}
}
}
}