From 2c811fae7b04fdb95d9e95434584ffd5105e2679 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Fri, 16 May 2025 15:18:00 -0700 Subject: [PATCH] json in process-data-standard-format --- .../MoveMatchingFiles/FileRead.cs | 68 +++++----- .../Shared/ProcessDataStandardFormat.cs | 119 ++++++++++++------ Adaptation/_Tests/Shared/AdaptationTesting.cs | 2 +- 3 files changed, 117 insertions(+), 72 deletions(-) diff --git a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs index e2e0489..2796326 100644 --- a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs +++ b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs @@ -22,17 +22,21 @@ public class FileRead : Shared.FileRead, IFileRead internal class PreWith { - internal string MatchingFile { get; private set; } - internal string CheckFile { get; private set; } internal string ErrFile { get; private set; } + internal string CheckFile { get; private set; } + internal string MatchingFile { get; private set; } internal string CheckDirectory { get; private set; } internal string NoWaitDirectory { get; private set; } - internal PreWith(string matchingFile, string checkFile, string errFile, string checkDirectory, string noWaitDirectory) + internal PreWith(string checkDirectory, + string checkFile, + string errFile, + string matchingFile, + string noWaitDirectory) { - MatchingFile = matchingFile; - CheckFile = checkFile; ErrFile = errFile; + CheckFile = checkFile; + MatchingFile = matchingFile; CheckDirectory = checkDirectory; NoWaitDirectory = noWaitDirectory; } @@ -221,7 +225,11 @@ public class FileRead : Shared.FileRead, IFileRead if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); noWaitDirectory = Path.Combine(checkDirectory, "NoWaitDirectory"); - preWith = new(pre.MatchingFile, pre.CheckFile, errFile, checkDirectory, noWaitDirectory); + preWith = new(checkDirectory: checkDirectory, + checkFile: pre.CheckFile, + errFile: errFile, + matchingFile: pre.MatchingFile, + noWaitDirectory: noWaitDirectory); results.Add(preWith); } return results.AsReadOnly(); @@ -260,7 +268,7 @@ public class FileRead : Shared.FileRead, IFileRead } } - private static ReadOnlyCollection
 GetPreCollection(int numberLength, string parentDirectory, ReadOnlyCollection matchingFiles)
+    private static ReadOnlyCollection
 GetPreCollection(int numberLength, string parentDirectory, ReadOnlyCollection matchingFiles, bool _)
     {
         List
 results = new();
         Pre pre;
@@ -275,7 +283,7 @@ public class FileRead : Shared.FileRead, IFileRead
         return results.AsReadOnly();
     }
 
-    private void MoveCollection(DateTime dateTime, ProcessDataStandardFormat? processDataStandardFormat, ReadOnlyCollection preWithCollection)
+    private void MoveCollection(DateTime dateTime, ProcessDataStandardFormat processDataStandardFormat, ReadOnlyCollection preWithCollection)
     {
         ReadOnlyCollection postCollection = GetPostCollection(dateTime, processDataStandardFormat, preWithCollection);
         if (postCollection.Count != 0)
@@ -294,7 +302,7 @@ public class FileRead : Shared.FileRead, IFileRead
         }
     }
 
-    private ReadOnlyCollection GetPostCollection(DateTime dateTime, ProcessDataStandardFormat? processDataStandardFormat, ReadOnlyCollection preWithCollection)
+    private ReadOnlyCollection GetPostCollection(DateTime dateTime, ProcessDataStandardFormat processDataStandardFormat, ReadOnlyCollection preWithCollection)
     {
         List results = new();
         Post post;
@@ -303,15 +311,10 @@ public class FileRead : Shared.FileRead, IFileRead
         {
             if (!_IsEAFHosted)
                 continue;
-            if (processDataStandardFormat is null)
-                File.Move(preWith.MatchingFile, preWith.CheckFile);
-            else
-            {
-                if (!_StaticRuns.TryGetValue(_Logistics.Sequence, out List? wsResults))
-                    wsResults = null;
-                ProcessDataStandardFormat.Write(preWith.CheckFile, processDataStandardFormat, wsResults);
-                File.Delete(preWith.MatchingFile);
-            }
+            if (!_StaticRuns.TryGetValue(_Logistics.Sequence, out List? wsResults))
+                wsResults = null;
+            ProcessDataStandardFormat.Write(preWith.CheckFile, processDataStandardFormat, wsResults);
+            File.Delete(preWith.MatchingFile);
             if (Directory.Exists(preWith.NoWaitDirectory))
             {
                 post = new(preWith.CheckFile, preWith.ErrFile);
@@ -345,17 +348,10 @@ public class FileRead : Shared.FileRead, IFileRead
     private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime)
     {
         Tuple> results = new(string.Empty, Array.Empty(), Array.Empty(), new List());
-        ProcessDataStandardFormat? processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath, _ProcessDataStandardFormatMapping);
-        if (processDataStandardFormat is not null)
-            _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
-        else
-        {
-            processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath);
-            _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
-            processDataStandardFormat = null;
-        }
-        if (!_IsEAFHosted && processDataStandardFormat is not null)
-            ProcessDataStandardFormat.Write(".pdsf", processDataStandardFormat, wsResults: null);
+        ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath, _ProcessDataStandardFormatMapping);
+        _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
+        if (!_IsEAFHosted)
+            ProcessDataStandardFormat.Write("../../.pdsf", processDataStandardFormat, wsResults: null);
         SetFileParameterLotIDToLogisticsMID();
         int numberLength = 2;
         long ticks = dateTime.Ticks;
@@ -364,10 +360,16 @@ public class FileRead : Shared.FileRead, IFileRead
         ReadOnlyCollection matchingFiles = GetMatchingFiles(ticks, reportFullPath, searchDirectories);
         if (matchingFiles.Count != searchDirectories.Count)
             throw new Exception($"Didn't find all files after {_BreakAfterSeconds} second(s)!");
-        try
-        { CreatePointerFile(numberLength, parentParentDirectory, matchingFiles); }
-        catch (Exception) { }
-        ReadOnlyCollection
 preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles);
+        if (_IsEAFHosted)
+        {
+            try
+            { CreatePointerFile(numberLength, parentParentDirectory, matchingFiles); }
+            catch (Exception) { }
+        }
+        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat);
+        List descriptions = pcl.ProcessData.GetDescriptions(jsonElements);
+        bool mesEntityMatchesProcess = descriptions.Count > 0 && descriptions[0].MesEntity == descriptions[0].Reactor;
+        ReadOnlyCollection
 preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles, mesEntityMatchesProcess);
         ReadOnlyCollection preWithCollection = GetPreWithCollection(preCollection);
         MoveCollection(dateTime, processDataStandardFormat, preWithCollection);
         return results;
diff --git a/Adaptation/Shared/ProcessDataStandardFormat.cs b/Adaptation/Shared/ProcessDataStandardFormat.cs
index 60407cd..113ba5f 100644
--- a/Adaptation/Shared/ProcessDataStandardFormat.cs
+++ b/Adaptation/Shared/ProcessDataStandardFormat.cs
@@ -61,8 +61,8 @@ internal class ProcessDataStandardFormat
     internal static string Archive(bool addSpaces = true, char separator = ' ') =>
         GetString(SearchFor.Archive, addSpaces, separator);
 
-    internal static ProcessDataStandardFormat GetEmpty() =>
-        new(new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), null, new(new string[] { "LOGISTICS_1" }), null);
+    internal static ProcessDataStandardFormat GetEmpty(Logistics logistics) =>
+        new(new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), null, new(logistics.Logistics1), null);
 
     internal static List PDSFToFixedWidth(string reportFullPath)
     {
@@ -214,25 +214,26 @@ internal class ProcessDataStandardFormat
         return results.AsReadOnly();
     }
 
-    internal static ProcessDataStandardFormat? GetProcessDataStandardFormat(string reportFullPath, ProcessDataStandardFormatMapping pdsfMapping)
+    internal static ProcessDataStandardFormat GetProcessDataStandardFormat(string reportFullPath, ProcessDataStandardFormatMapping pdsfMapping)
     {
-        ProcessDataStandardFormat? result;
+        ProcessDataStandardFormat result;
         const int columnsLine = 6;
         FileInfo fileInfo = new(reportFullPath);
-        ProcessDataStandardFormat processDataStandardFormat = GetProcessDataStandardFormat(fileInfo.LastWriteTime, pdsfMapping.NewColumnNames.Count, columnsLine, fileInfo.FullName, lines: null);
-        JsonElement[]? jsonElements = GetArray(pdsfMapping.NewColumnNames.Count, processDataStandardFormat, lookForNumbers: false);
-        if (jsonElements is null || jsonElements.Length == 0 || pdsfMapping.OldColumnNames.Count != pdsfMapping.ColumnIndices.Count)
-            result = null;
+        ProcessDataStandardFormat processDataStandardFormat = GetProcessDataStandardFormat(fileInfo.LastWriteTime, columnsLine, fileInfo.FullName, lines: null);
+        JsonElement[]? jsonElements = pdsfMapping.OldColumnNames.Count != pdsfMapping.ColumnIndices.Count ? null : GetFullArray(processDataStandardFormat);
+        JsonProperty[]? jsonProperties = jsonElements is null || jsonElements.Length == 0 ? null : jsonElements[0].EnumerateObject().ToArray();
+        if (jsonElements is null || jsonProperties is null || jsonProperties.Length != pdsfMapping.NewColumnNames.Count)
+            result = processDataStandardFormat;
         else
         {
             result = GetProcessDataStandardFormat(pdsfMapping, jsonElements, processDataStandardFormat);
             if (result.Sequence is null || result.Columns.Count == 0 || result.Body.Count == 0 || result.Logistics.Count == 0)
-                result = null;
+                result = processDataStandardFormat;
         }
         return result;
     }
 
-    private static ProcessDataStandardFormat GetProcessDataStandardFormat(DateTime lastWriteTime, int expectedColumns, int columnsLine, string path, string[]? lines)
+    private static ProcessDataStandardFormat GetProcessDataStandardFormat(DateTime lastWriteTime, int columnsLine, string path, string[]? lines)
     {
         ProcessDataStandardFormat result;
         long sequence;
@@ -248,8 +249,6 @@ internal class ProcessDataStandardFormat
         else
         {
             segments = lines[columnsLine].Split('\t');
-            if (segments.Length != expectedColumns)
-                segments = Array.Empty();
             for (int i = 0; i < columnsLine; i++)
                 header.Add(lines[i]);
         }
@@ -285,7 +284,7 @@ internal class ProcessDataStandardFormat
         return result;
     }
 
-    private static JsonElement[]? GetArray(int expectedColumns, ProcessDataStandardFormat processDataStandardFormat, bool lookForNumbers)
+    private static JsonElement[]? GetFullArray(ProcessDataStandardFormat processDataStandardFormat)
     {
         JsonElement[]? results;
         if (processDataStandardFormat.Body.Count == 0 || !processDataStandardFormat.Body[0].Contains('\t'))
@@ -293,36 +292,18 @@ internal class ProcessDataStandardFormat
         else
         {
             string value;
-            string[] segments;
+            List segments;
             List lines = new();
             StringBuilder stringBuilder = new();
             foreach (string bodyLine in processDataStandardFormat.Body)
             {
                 _ = stringBuilder.Clear();
                 _ = stringBuilder.Append('{');
-                segments = bodyLine.Split('\t');
-                if (segments.Length != expectedColumns)
-                    continue;
-                if (!lookForNumbers)
+                segments = bodyLine.Split('\t').ToList();
+                for (int c = 0; c < segments.Count; c++)
                 {
-                    for (int c = 0; c < segments.Length; c++)
-                    {
-                        value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
-                        _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\",");
-                    }
-                }
-                else
-                {
-                    for (int c = 0; c < segments.Length; c++)
-                    {
-                        value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
-                        if (string.IsNullOrEmpty(value))
-                            _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":").Append(value).Append("null,");
-                        else if (value.All(char.IsDigit))
-                            _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":").Append(value).Append(',');
-                        else
-                            _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\",");
-                    }
+                    value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
+                    _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\",");
                 }
                 _ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
                 _ = stringBuilder.AppendLine("}");
@@ -379,6 +360,63 @@ internal class ProcessDataStandardFormat
         return result;
     }
 
+    private static string GetJson(ProcessDataStandardFormat processDataStandardFormat)
+    {
+        if (processDataStandardFormat.InputPDSF is null)
+            throw new NullReferenceException(nameof(processDataStandardFormat.InputPDSF));
+#pragma warning disable CA1845, IDE0057
+        string result;
+        string line;
+        string value;
+        string[] segments;
+        List lines = new();
+        for (int i = 0; i < processDataStandardFormat.InputPDSF.Body.Count; i++)
+        {
+            line = "{";
+            segments = processDataStandardFormat.InputPDSF.Body[i].Trim().Split('\t');
+            if (segments.Length != processDataStandardFormat.InputPDSF.Columns.Count)
+                break;
+            for (int c = 0; c < segments.Length; c++)
+            {
+                value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
+                line += string.Concat('"', processDataStandardFormat.InputPDSF.Columns[c].Trim('"'), '"', ':', '"', value, '"', ',');
+            }
+            line = string.Concat(line.Substring(0, line.Length - 1), '}');
+            lines.Add(line);
+        }
+        result = string.Concat(
+            '{',
+            Environment.NewLine,
+            '"',
+            "Count",
+            '"',
+            ": ",            
+            processDataStandardFormat.Body.Count,
+            ',',
+            Environment.NewLine,
+            '"',
+            "Records",
+            '"',
+            ": ",
+            Environment.NewLine,
+            '[',
+            Environment.NewLine,
+            string.Join($",{Environment.NewLine}", lines),
+            Environment.NewLine,
+            ']',
+            ',',
+            Environment.NewLine,
+            '"',
+            "Sequence",
+            '"',
+            ": ",            
+            processDataStandardFormat.Sequence,
+            Environment.NewLine,
+            '}');
+        return result;
+#pragma warning restore CA1845, IDE0057
+    }
+
     internal static void Write(string path, ProcessDataStandardFormat processDataStandardFormat, List? wsResults)
     {
         List results = new();
@@ -418,12 +456,12 @@ internal class ProcessDataStandardFormat
                     results.Add($"{segments[0]}\t{segments[1][0]}_HeaderId={wsResults[0].HeaderId};{segments[1][0]}_SubgroupId={wsResults[0].SubgroupId};{segments[1]}");
             }
         }
-        results.Add("EOF");
+        results.Add("END_HEADER");
         if (processDataStandardFormat.InputPDSF is not null)
         {
+            results.Add(string.Empty);
             List hyphens = new();
             results.AddRange(processDataStandardFormat.InputPDSF.Header.Select(l => l.Replace('\t', '|')));
-            results.Add(string.Empty);
             results.Add($"|{string.Join("|", processDataStandardFormat.InputPDSF.Columns)}|");
             for (int i = 0; i < processDataStandardFormat.InputPDSF.Columns.Count; i++)
                 hyphens.Add('-');
@@ -431,6 +469,11 @@ internal class ProcessDataStandardFormat
             results.AddRange(processDataStandardFormat.InputPDSF.Body.Select(l => l.Replace('\t', '|')));
             results.Add(string.Empty);
             results.AddRange(processDataStandardFormat.InputPDSF.Footer.Select(l => l.Replace('\t', '|')));
+            results.Add(string.Empty);
+            results.Add("EOF");
+            results.Add(string.Empty);
+            string json = GetJson(processDataStandardFormat);
+            results.Add(json);
         }
         File.WriteAllText(path, string.Join(Environment.NewLine, results));
     }
diff --git a/Adaptation/_Tests/Shared/AdaptationTesting.cs b/Adaptation/_Tests/Shared/AdaptationTesting.cs
index e461be5..8c0bc93 100644
--- a/Adaptation/_Tests/Shared/AdaptationTesting.cs
+++ b/Adaptation/_Tests/Shared/AdaptationTesting.cs
@@ -1182,7 +1182,7 @@ public class AdaptationTesting : ISMTP
             Assert.IsNotNull(extractResult.Item3);
             Assert.IsNotNull(extractResult.Item4);
             if (!validatePDSF)
-                _ = GetProcessDataStandardFormat(fileRead, logistics, extractResult, ProcessDataStandardFormat.GetEmpty());
+                _ = GetProcessDataStandardFormat(fileRead, logistics, extractResult, ProcessDataStandardFormat.GetEmpty(logistics));
             else
             {
                 Assert.IsTrue(extractResult.Item3.Length > 0, "extractResult Array Length check!");