< 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_22190969454
Line coverage
100%
Covered lines: 74
Uncovered lines: 0
Coverable lines: 74
Total lines: 161
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">Type of <see cref="Project"/></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">Type of <see cref="Project"/></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            await 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">Type of <see cref="Project"/></typeparam>
 42        /// <param name="project">The project.</param>
 43        /// <param name="streamWriter">The stream writer where to stream the project definitions.</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">Type of <see cref="Project"/></typeparam>
 57        /// <param name="filename">The filename.</param>
 58        /// <returns>The loaded project.</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">Type of <see cref="Project"/></typeparam>
 69        /// <param name="streamReader">The stream reader where to read project definitions from.</param>
 70        /// <returns>The created project.</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 =>
 1777            {
 1778                if (clazz.BaseClassName != null)
 179                {
 180                    clazz.BaseClass = projectInstance.GetClass(clazz.BaseClassName);
 181                }
 1782                clazz.FieldDefinitions.Values.ForEach(field =>
 3583                {
 3584                    projectInstance.SetFieldValueChangeChannel(field);
 3585                    field.ValuePostChangeProcessings.ForEach(postProcessing =>
 5086                        postProcessing.BuildAfterDeserialization(projectInstance, clazz));
 5287                });
 3188            });
 1489            Project.AddProjectToCollection(projectInstance);
 1490            return projectInstance;
 1491        }
 92
 93        /// <summary>
 94        /// Saves a project instances.
 95        /// </summary>
 96        /// <param name="project">The project.</param>
 97        /// <returns>File name where project instances were saved.</returns>
 98        public static string SaveProjectInstances(RunnableProject project)
 1399        {
 13100            string filename = Path.Combine(Project.ProjectsPath, $"{project.Name}.{project.Version}.snp");
 26101            Task.Run(async () => await SaveProjectInstancesAsync(project, filename)).Wait();
 13102            return filename;
 13103        }
 104
 105        /// <summary>
 106        /// Saves a project instances into a file.
 107        /// </summary>
 108        /// <param name="project">The project.</param>
 109        /// <param name="filename">The filename.</param>
 110        public static async ValueTask SaveProjectInstancesAsync(RunnableProject project, string filename)
 13111        {
 13112            await using StreamWriter outputFile = new(filename);
 13113            Dictionary<string, IInstance> instances = new(project.Instances.Count);
 13114            project.Instances.ForEach((k, v) =>
 13115            {
 13116                var instance = v as IInstance;
 13117                instances.Add(k, instance!);
 26118            });
 13119            await StreamProjectInstancesAsync(project, outputFile);
 13120        }
 121
 122        /// <summary>
 123        /// Saves a project instances into a file.
 124        /// </summary>
 125        /// <param name="project">The project.</param>
 126        /// <param name="streamWriter">The stream writer where to write the project instances.</param>
 127        public static async Task<Stream?> StreamProjectInstancesAsync(RunnableProject project, StreamWriter streamWriter
 14128        {
 14129            Dictionary<string, IInstance> instances = new(project.Instances.Count);
 14130            project.Instances.ForEach((k, v) =>
 13131            {
 13132                var instance = v as IInstance;
 13133                instances.Add(k, instance!);
 27134            });
 14135            await streamWriter.WriteAsync(JsonSerializer.Serialize(instances));
 14136            await streamWriter.FlushAsync();
 14137            streamWriter.BaseStream.Position = 0;
 14138            return streamWriter.BaseStream;
 139
 14140        }
 141
 142        /// <summary>
 143        /// Loads the project instances from a file.
 144        /// </summary>
 145        /// <param name="project">The project.</param>
 146        /// <param name="filename">The filename.</param>
 147        public static void LoadProjectInstances(RunnableProject project, string filename)
 13148        {
 13149            InstanceJsonConverter.LoadedProject = project;
 150            // Instances are already added to project as deserialization uses project.CreateInstance()
 13151            LoadProjectInstances(project, new StreamReader(filename));
 13152        }
 153
 154        public static void LoadProjectInstances(RunnableProject project, StreamReader streamReader)
 14155        {
 14156            InstanceJsonConverter.LoadedProject = project;
 157            // Instances are already added to project as deserialization uses project.CreateInstance()
 14158            JsonSerializer.Deserialize<Dictionary<string, IInstance>>(streamReader.ReadToEnd());
 14159        }
 160    }
 161}