< Summary - pva.SuperV

Information
Class: pva.SuperV.Engine.ProjectStorage
Assembly: pva.SuperV.Engine
File(s): /home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Engine/ProjectStorage.cs
Tag: dotnet-ubuntu_18869653307
Line coverage
100%
Covered lines: 73
Uncovered lines: 0
Coverable lines: 73
Total lines: 160
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Engine/ProjectStorage.cs

#LineLine coverage
 1using pva.Helpers.Extensions;
 2using pva.SuperV.Engine.HistoryStorage;
 3using pva.SuperV.Engine.JsonConverters;
 4using System.Text.Json;
 5
 6namespace pva.SuperV.Engine
 7{
 8    /// <summary>
 9    /// Class for saving/loading <see cref="Project"/> definitions and snapshot files.
 10    /// </summary>
 11    public static class ProjectStorage
 12    {
 13        /// <summary>
 14        /// Saves a project definition.
 15        /// </summary>
 16        /// <typeparam name="T"></typeparam>
 17        /// <param name="project">The project for which definitions should be saved.</param>
 18        /// <returns>Name of saved file.</returns>
 19        public static string SaveProjectDefinition<T>(T project) where T : Project
 1320        {
 1321            string filename = Path.Combine(Project.ProjectsPath, $"{project.Name}.{project.Version}.prj");
 2622            Task.Run(async () => await SaveProjectDefinitionAsync(project, filename)).Wait();
 1323            return filename;
 1324        }
 25
 26        /// <summary>
 27        /// Saves a project definition.
 28        /// </summary>
 29        /// <typeparam name="T"></typeparam>
 30        /// <param name="project">The project.</param>
 31        /// <param name="filename">The filename.</param>
 32        public static async ValueTask SaveProjectDefinitionAsync<T>(T project, string filename) where T : Project
 1333        {
 1334            using StreamWriter outputFile = new(filename);
 1335            await StreamProjectDefinitionAsync(project, outputFile);
 1336        }
 37
 38        /// <summary>
 39        /// Saves a project definition.
 40        /// </summary>
 41        /// <typeparam name="T"></typeparam>
 42        /// <param name="project">The project.</param>
 43        /// <param name="filename">The filename.</param>
 44        public static async Task<Stream?> StreamProjectDefinitionAsync<T>(T project, StreamWriter streamWriter) where T 
 1445        {
 1446            await streamWriter.WriteAsync(JsonSerializer.Serialize(project));
 1447            await streamWriter.FlushAsync();
 1448            streamWriter.BaseStream.Position = 0;
 1449            return streamWriter.BaseStream;
 1450        }
 51
 52
 53        /// <summary>
 54        /// Loads a project definition from a file.
 55        /// </summary>
 56        /// <typeparam name="T"></typeparam>
 57        /// <param name="filename">The filename.</param>
 58        /// <returns></returns>
 59        public static T LoadProjectDefinition<T>(string filename) where T : Project
 1360        {
 1361            using StreamReader fileReader = new(filename);
 1362            return CreateProjectFromJsonDefinition<T>(fileReader);
 1363        }
 64
 65        /// <summary>
 66        /// Loads a project definition from a file.
 67        /// </summary>
 68        /// <typeparam name="T"></typeparam>
 69        /// <param name="filename">The filename.</param>
 70        /// <returns></returns>
 71        public static T CreateProjectFromJsonDefinition<T>(StreamReader streamReader) where T : Project
 1472        {
 1473            string json = streamReader.ReadToEnd();
 1474            T? projectInstance = JsonSerializer.Deserialize<T>(json);
 1475            projectInstance!.HistoryStorageEngine = HistoryStorageEngineFactory.CreateHistoryStorageEngine(projectInstan
 1476            projectInstance.Classes.Values.ForEach(clazz =>
 1677            {
 1678                if (clazz.BaseClassName != null)
 179                {
 180                    clazz.BaseClass = projectInstance.GetClass(clazz.BaseClassName);
 181                }
 1682                clazz.FieldDefinitions.Values.ForEach(field =>
 3383                {
 3384                    field.ValuePostChangeProcessings.ForEach(postProcessing =>
 3685                        postProcessing.BuildAfterDeserialization(projectInstance, clazz));
 4986                });
 3087            });
 1488            Project.AddProjectToCollection(projectInstance);
 1489            return projectInstance;
 1490        }
 91
 92        /// <summary>
 93        /// Saves a project instances.
 94        /// </summary>
 95        /// <param name="project">The project.</param>
 96        /// <returns>File name where project instances were saved.</returns>
 97        public static string SaveProjectInstances(RunnableProject project)
 1398        {
 1399            string filename = Path.Combine(Project.ProjectsPath, $"{project.Name}.{project.Version}.snp");
 26100            Task.Run(async () => await SaveProjectInstancesAsync(project, filename)).Wait();
 13101            return filename;
 13102        }
 103
 104        /// <summary>
 105        /// Saves a project instances into a file.
 106        /// </summary>
 107        /// <param name="project">The project.</param>
 108        /// <param name="filename">The filename.</param>
 109        public static async ValueTask SaveProjectInstancesAsync(RunnableProject project, string filename)
 13110        {
 13111            using StreamWriter outputFile = new(filename);
 13112            Dictionary<string, IInstance> instances = new(project.Instances.Count);
 13113            project.Instances.ForEach((k, v) =>
 13114            {
 13115                var instance = v as IInstance;
 13116                instances.Add(k, instance!);
 26117            });
 13118            await StreamProjectInstancesAsync(project, outputFile);
 13119        }
 120
 121        /// <summary>
 122        /// Saves a project instances into a file.
 123        /// </summary>
 124        /// <param name="project">The project.</param>
 125        /// <param name="filename">The filename.</param>
 126        public static async Task<Stream?> StreamProjectInstancesAsync(RunnableProject project, StreamWriter streamWriter
 14127        {
 14128            Dictionary<string, IInstance> instances = new(project.Instances.Count);
 14129            project.Instances.ForEach((k, v) =>
 13130            {
 13131                var instance = v as IInstance;
 13132                instances.Add(k, instance!);
 27133            });
 14134            await streamWriter.WriteAsync(JsonSerializer.Serialize(instances));
 14135            await streamWriter.FlushAsync();
 14136            streamWriter.BaseStream.Position = 0;
 14137            return streamWriter.BaseStream;
 138
 14139        }
 140
 141        /// <summary>
 142        /// Loads the project instances from a file.
 143        /// </summary>
 144        /// <param name="project">The project.</param>
 145        /// <param name="filename">The filename.</param>
 146        public static void LoadProjectInstances(RunnableProject project, string filename)
 13147        {
 13148            InstanceJsonConverter.LoadedProject = project;
 149            // Instances are already added to project as deserialization uses project.CreateInstance()
 13150            LoadProjectInstances(project, new StreamReader(filename));
 13151        }
 152
 153        public static void LoadProjectInstances(RunnableProject project, StreamReader streamReader)
 14154        {
 14155            InstanceJsonConverter.LoadedProject = project;
 156            // Instances are already added to project as deserialization uses project.CreateInstance()
 14157            JsonSerializer.Deserialize<Dictionary<string, IInstance>>(streamReader.ReadToEnd());
 14158        }
 159    }
 160}