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, ReadOnlyCollectionmatchingFiles) + private static ReadOnlyCollection GetPreCollection(int numberLength, string parentDirectory, ReadOnlyCollectionmatchingFiles, 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, ReadOnlyCollectionpreWithCollection) + 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); + Listdescriptions = pcl.ProcessData.GetDescriptions(jsonElements); + bool mesEntityMatchesProcess = descriptions.Count > 0 && descriptions[0].MesEntity == descriptions[0].Reactor; + ReadOnlyCollection preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles, mesEntityMatchesProcess); ReadOnlyCollectionpreWithCollection = 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!");