diff --git a/Adaptation/.vscode/tasks.json b/Adaptation/.vscode/tasks.json
index 81d3cea..19f4d04 100644
--- a/Adaptation/.vscode/tasks.json
+++ b/Adaptation/.vscode/tasks.json
@@ -60,6 +60,26 @@
"command": "code ../EC.csproj",
"problemMatcher": []
},
+ {
+ "label": "Readme",
+ "type": "shell",
+ "command": "code ../README.md",
+ "problemMatcher": []
+ },
+ {
+ "label": "File-Folder-Helper AOT s X Day-Helper-2025-03-20",
+ "type": "shell",
+ "command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe",
+ "args": [
+ "s",
+ "X",
+ "L:/DevOps/EAF-Mesa-Integration/EC",
+ "Day-Helper-2025-03-20",
+ "false",
+ "4"
+ ],
+ "problemMatcher": []
+ },
{
"label": "Git Config",
"type": "shell",
diff --git a/Adaptation/EC.Tests.csproj b/Adaptation/EC.Tests.csproj
index f85e4a7..0edcaad 100644
--- a/Adaptation/EC.Tests.csproj
+++ b/Adaptation/EC.Tests.csproj
@@ -67,7 +67,7 @@
- NU1701
+ NU1701
diff --git a/Adaptation/FileHandlers/CellInstanceConnectionName.cs b/Adaptation/FileHandlers/CellInstanceConnectionName.cs
index 8f78c68..06537cc 100644
--- a/Adaptation/FileHandlers/CellInstanceConnectionName.cs
+++ b/Adaptation/FileHandlers/CellInstanceConnectionName.cs
@@ -9,7 +9,7 @@ namespace Adaptation.FileHandlers;
public class CellInstanceConnectionName
{
- internal static IFileRead Get(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, int? connectionCount)
+ internal static IFileRead Get(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, int? connectionCount)
{
IFileRead result = cellInstanceConnectionName switch
{
diff --git a/Adaptation/FileHandlers/MapEafDrives/FileRead.cs b/Adaptation/FileHandlers/MapEafDrives/FileRead.cs
index b7ca935..59f1f09 100644
--- a/Adaptation/FileHandlers/MapEafDrives/FileRead.cs
+++ b/Adaptation/FileHandlers/MapEafDrives/FileRead.cs
@@ -18,7 +18,7 @@ public class FileRead : Shared.FileRead, IFileRead
private readonly AppSettings _AppSettings;
- public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
+ public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
base(new Description(), true, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null)
{
_MinFileLength = 10;
diff --git a/Adaptation/FileHandlers/RijndaelEncryption/FileRead.cs b/Adaptation/FileHandlers/RijndaelEncryption/FileRead.cs
index 286e994..24458e4 100644
--- a/Adaptation/FileHandlers/RijndaelEncryption/FileRead.cs
+++ b/Adaptation/FileHandlers/RijndaelEncryption/FileRead.cs
@@ -18,7 +18,7 @@ public class FileRead : Shared.FileRead, IFileRead
private readonly AppSettings _AppSettings;
- public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
+ public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
base(new Description(), true, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null)
{
_MinFileLength = 10;
diff --git a/Adaptation/Shared/FileRead.cs b/Adaptation/Shared/FileRead.cs
index f66b29b..49a4526 100644
--- a/Adaptation/Shared/FileRead.cs
+++ b/Adaptation/Shared/FileRead.cs
@@ -44,9 +44,9 @@ public class FileRead : Properties.IFileRead
protected readonly string _CellInstanceConnectionNameBase;
protected readonly Dictionary> _DummyRuns;
protected readonly Dictionary _FileParameter;
- protected readonly Dictionary> _StaticRuns;
protected readonly string _ParameterizedModelObjectDefinitionType;
protected readonly FileConnectorConfiguration _FileConnectorConfiguration;
+ protected readonly Dictionary> _StaticRuns;
protected readonly IList _ModelObjectParameterDefinitions;
bool Properties.IFileRead.IsEvent => _IsEvent;
@@ -63,7 +63,147 @@ public class FileRead : Properties.IFileRead
string Properties.IFileRead.CellInstanceConnectionName => _CellInstanceConnectionName;
string Properties.IFileRead.ParameterizedModelObjectDefinitionType => _ParameterizedModelObjectDefinitionType;
- public FileRead(IDescription description, bool isEvent, ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted)
+ protected static string GetTupleFile(Logistics logistics, List descriptions, Properties.IScopeInfo scopeInfo, string duplicateDirectory, string duplicateFile) where T : Properties.IDescription
+ {
+ string result;
+ string rds;
+ string fileName;
+ string dateValue;
+ string rdsPlaceholder = "%RDS%";
+ string mesEntityPlaceholder = "%MesEntity%";
+ if (descriptions.Count == 0 || string.IsNullOrEmpty(descriptions[0].RDS))
+ rds = logistics.MID;
+ else
+ rds = descriptions[0].RDS;
+ string[] segments = scopeInfo.FileName.Split(new string[] { "DateTime:" }, StringSplitOptions.RemoveEmptyEntries);
+ if (segments.Length == 0)
+ result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileNameWithoutExtension.Replace(rdsPlaceholder, rds).Replace(mesEntityPlaceholder, logistics.MesEntity));
+ else
+ {
+ segments = segments[1].Split('%');
+ string datePlaceholder = "%DateTime%";
+ dateValue = logistics.DateTimeFromSequence.ToString(segments[0]);
+ foreach (string segment in scopeInfo.FileName.Split('%'))
+ {
+ if (!segment.Contains(segments[0]))
+ continue;
+ datePlaceholder = string.Concat('%', segment, '%');
+ }
+ fileName = scopeInfo.FileName.Replace(rdsPlaceholder, rds).Replace(mesEntityPlaceholder, logistics.MesEntity).Replace(datePlaceholder, dateValue);
+ if (!duplicateFile.Contains("Viewer"))
+ result = Path.Combine(duplicateDirectory, fileName);
+ else
+ result = Path.Combine(duplicateDirectory, $"Viewer_{fileName}");
+ }
+ if (result.Contains('%'))
+ throw new Exception("Placeholder exists!");
+ return result;
+ }
+
+ protected void WaitForFileConsumption(string sourceDirectoryCloaking, Logistics logistics, DateTime dateTime, List descriptions, string successDirectory, string duplicateDirectory, string duplicateFile, List<(Properties.IScopeInfo, string)> collection) where T : Properties.IDescription
+ {
+ bool check;
+ long preWait;
+ string tupleFile;
+ string tupleFileName = string.Empty;
+ List duplicateFiles = new();
+ StringBuilder stringBuilder = new();
+ List consumedFileIndices = new();
+ bool moreThanAnHour = _BreakAfterSeconds > 3600;
+ long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks;
+ if (_FileConnectorConfiguration?.FileHandleWaitTime is null)
+ preWait = dateTime.AddMilliseconds(1234).Ticks;
+ else
+ preWait = dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks;
+ if (collection.Count == 0)
+ duplicateFiles.Add(duplicateFile);
+ string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath);
+ string successFile = string.Concat(successDirectory, @"\", Path.GetFileName(logistics.ReportFullPath));
+ foreach ((Properties.IScopeInfo scopeInfo, string text) in collection)
+ {
+ if (scopeInfo.FileName.StartsWith(@"\"))
+ tupleFile = scopeInfo.FileName;
+ else if (!scopeInfo.FileName.Contains('%'))
+ tupleFile = string.Concat(duplicateDirectory, @"\", fileName, "_", scopeInfo.FileNameWithoutExtension, ".pdsfc");
+ else
+ tupleFile = GetTupleFile(logistics, descriptions, scopeInfo, duplicateDirectory, duplicateFile);
+ tupleFileName = Path.GetFileNameWithoutExtension(tupleFile).Split('.')[0];
+ duplicateFiles.Add(tupleFile);
+ if (_IsEAFHosted)
+ File.WriteAllText(tupleFile, text);
+ }
+ for (short i = 0; i < short.MaxValue; i++)
+ {
+ if (DateTime.Now.Ticks > preWait)
+ break;
+ Thread.Sleep(100);
+ }
+ if (!moreThanAnHour)
+ {
+ for (short z = 0; z < short.MaxValue; z++)
+ {
+ try
+ {
+ check = string.IsNullOrEmpty(successDirectory) || File.Exists(successFile);
+ if (check)
+ {
+ consumedFileIndices.Clear();
+ for (int i = 0; i < duplicateFiles.Count; i++)
+ {
+ if (!File.Exists(duplicateFiles[i]))
+ {
+ if (string.IsNullOrEmpty(tupleFileName))
+ consumedFileIndices.Add(i);
+ else if (duplicateFiles.All(l => Path.GetFileNameWithoutExtension(l).Split('.')[0] == tupleFileName))
+ {
+ for (int j = 0; j < duplicateFiles.Count; j++)
+ consumedFileIndices.Add(j);
+ }
+ else
+ consumedFileIndices.Add(i);
+ }
+ }
+ if (consumedFileIndices.Count == duplicateFiles.Count)
+ break;
+ }
+ }
+ catch (Exception) { }
+ if (DateTime.Now.Ticks > breakAfter)
+ {
+ for (int i = 0; i < duplicateFiles.Count; i++)
+ {
+ if (File.Exists(duplicateFiles[i]))
+ {
+ try
+ { File.Delete(duplicateFiles[i]); }
+ catch (Exception) { }
+ _ = stringBuilder.Append('<').Append(duplicateFiles[i]).Append("> ");
+ }
+ }
+ throw new Exception(string.Concat("After {", _BreakAfterSeconds, "} seconds, right side of {", sourceDirectoryCloaking, "} didn't consume file(s) ", stringBuilder));
+ }
+ Thread.Sleep(250);
+ }
+ }
+ }
+
+ protected void WaitForFileConsumption(DateTime dateTime, List descriptions, bool isDummyRun, string successDirectory, string duplicateDirectory, List<(Properties.IScopeInfo, string)> collection, string duplicateFile) where T : Properties.IDescription
+ {
+ if (!isDummyRun && _IsEAFHosted)
+ WaitForFileConsumption(_FileConnectorConfiguration.SourceDirectoryCloaking, _Logistics, dateTime, descriptions, successDirectory, duplicateDirectory, duplicateFile, collection);
+ else
+ {
+ long breakAfter = DateTime.Now.AddSeconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks;
+ for (short i = 0; i < short.MaxValue; i++)
+ {
+ if (!_IsEAFHosted || DateTime.Now.Ticks > breakAfter)
+ break;
+ Thread.Sleep(500);
+ }
+ }
+ }
+
+ public FileRead(IDescription description, bool isEvent, ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted)
{
_SMTP = smtp;
_IsEvent = isEvent;
@@ -160,10 +300,161 @@ public class FileRead : Properties.IFileRead
return result;
}
+ protected void UpdateLastTicksDuration(long ticksDuration)
+ {
+ if (ticksDuration < 50000000)
+ ticksDuration = 50000000;
+ _LastTicksDuration = (long)Math.Ceiling(ticksDuration * .667);
+ _Log.Info($"{new TimeSpan(ticksDuration).TotalMilliseconds} TotalMillisecond(s) to process{Environment.NewLine}{_CellInstanceConnectionName}{Environment.NewLine}<{_ReportFullPath}>");
+ }
+
+ internal static string GetParentParent(string value)
+ {
+ string result = Path.GetDirectoryName(Path.GetDirectoryName(value));
+ return result;
+ }
+
+ internal static List GetDirectoryNames(string directory)
+ {
+#nullable enable
+ List results = new();
+ string? fileName;
+ string? checkDirectory = directory;
+ string? pathRoot = Path.GetPathRoot(directory);
+ string extension = Path.GetExtension(directory);
+ if (string.IsNullOrEmpty(pathRoot))
+ throw new NullReferenceException(nameof(pathRoot));
+ if (Directory.Exists(directory))
+ {
+ fileName = Path.GetFileName(directory);
+ if (!string.IsNullOrEmpty(fileName))
+ results.Add(fileName);
+ }
+ else if ((string.IsNullOrEmpty(extension) || extension.Length > 3) && !File.Exists(directory))
+ {
+ fileName = Path.GetFileName(directory);
+ if (!string.IsNullOrEmpty(fileName))
+ results.Add(fileName);
+ }
+ for (int i = 0; i < int.MaxValue; i++)
+ {
+ checkDirectory = Path.GetDirectoryName(checkDirectory);
+ if (string.IsNullOrEmpty(checkDirectory) || checkDirectory == pathRoot)
+ break;
+ fileName = Path.GetFileName(checkDirectory);
+ if (string.IsNullOrEmpty(fileName))
+ continue;
+ results.Add(fileName);
+ }
+ results.Add(pathRoot);
+ results.Reverse();
+ return results;
+#nullable disable
+ }
+
+ internal static string GetJobIdParentDirectory(string directory)
+ {
+ string result;
+ if (!string.IsNullOrEmpty(Path.GetFileName(directory)))
+ result = Path.GetFullPath(GetParentParent(directory));
+ else
+ result = Path.GetFullPath(GetParentParent(Path.GetDirectoryName(directory)));
+ if (!Directory.Exists(result))
+ _ = Directory.CreateDirectory(result);
+ return result;
+ }
+
+ internal static string GetFileNameAfterUnderscoreSplit(string reportFullPath)
+ {
+ string result;
+ string[] segments = Path.GetFileNameWithoutExtension(reportFullPath).Split('_');
+ if (segments.Length <= 2)
+ result = segments[0];
+ else
+ result = string.Concat(segments[0], segments[2]);
+ return result;
+ }
+
+ internal string[] GetInProcessDirectory(string jobIdDirectory)
+ {
+ List results = new();
+ if (!_IsEAFHosted)
+ results = new string[] { jobIdDirectory }.ToList();
+ else
+ {
+ string[] files;
+ string logisticsSequence = _Logistics.Sequence.ToString();
+ string[] directories = Directory.GetDirectories(jobIdDirectory, $"*{logisticsSequence}*", SearchOption.TopDirectoryOnly);
+ foreach (string directory in directories)
+ {
+ files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly);
+ if (files.Length == 0)
+ continue;
+ results.Add(directory);
+ }
+ }
+ if ((results is null) || results.Count != 1)
+ throw new Exception("Didn't find directory by logistics sequence");
+ return results.ToArray();
+ }
+
+ protected static string[] GetMatches(FileConnectorConfiguration fileConnectorConfiguration)
+ {
+ string[] segments;
+ string[] results = null;
+ foreach (string subSourceFileFilter in fileConnectorConfiguration.SourceFileFilters)
+ {
+ segments = subSourceFileFilter.Split('\\');
+ if (fileConnectorConfiguration.IncludeSubDirectories.Value)
+ results = Directory.GetFiles(fileConnectorConfiguration.SourceFileLocation, segments.Last(), SearchOption.AllDirectories);
+ else
+ results = Directory.GetFiles(fileConnectorConfiguration.SourceFileLocation, segments.Last(), SearchOption.TopDirectoryOnly);
+ if (results.Length != 0)
+ break;
+ }
+ return results;
+ }
+
+ protected static void NestExistingFiles(FileConnectorConfiguration fileConnectorConfiguration)
+ {
+ // if (!fileConnectorConfiguration.IncludeSubDirectories.Value && fileConnectorConfiguration.TriggerOnCreated is not null && fileConnectorConfiguration.TriggerOnCreated.Value)
+ if (!fileConnectorConfiguration.IncludeSubDirectories.Value)
+ {
+ string[] matches = GetMatches(fileConnectorConfiguration);
+ if (matches is not null && matches.Length > 0)
+ {
+ string fileName;
+ string nestedDirectory = Path.Combine(fileConnectorConfiguration.SourceFileLocation, DateTime.Now.Ticks.ToString());
+ if (!Directory.Exists(nestedDirectory))
+ _ = Directory.CreateDirectory(nestedDirectory);
+ foreach (string match in matches)
+ {
+ fileName = Path.GetFileName(match);
+ File.Move(match, Path.Combine(nestedDirectory, fileName));
+ }
+ }
+ }
+ }
+
+ protected static List GetDuplicatorDescriptions(JsonElement[] jsonElements)
+ {
+ List results = new();
+ Duplicator.Description description;
+ JsonSerializerOptions jsonSerializerOptions = new() { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString };
+ foreach (JsonElement jsonElement in jsonElements)
+ {
+ if (jsonElement.ValueKind != JsonValueKind.Object)
+ throw new Exception();
+ description = JsonSerializer.Deserialize(jsonElement.ToString(), jsonSerializerOptions);
+ results.Add(description);
+ }
+ return results;
+ }
+
protected static ModelObjectParameterDefinition[] GetProperties(string cellInstanceConnectionName, IList modelObjectParameters, string propertyNamePrefix)
{
ModelObjectParameterDefinition[] results = (from l in modelObjectParameters where l.Name.StartsWith(propertyNamePrefix) select l).ToArray();
- if (!results.Any())
+ if (results.Length == 0)
throw new Exception(cellInstanceConnectionName);
return results;
}
@@ -171,17 +462,43 @@ public class FileRead : Properties.IFileRead
protected static ModelObjectParameterDefinition[] GetProperties(string cellInstanceConnectionName, IList modelObjectParameters, string propertyNamePrefix, string propertyNameSuffix)
{
ModelObjectParameterDefinition[] results = (from l in modelObjectParameters where l.Name.StartsWith(propertyNamePrefix) && l.Name.EndsWith(propertyNameSuffix) select l).ToArray();
- if (!results.Any())
+ if (results.Length == 0)
throw new Exception(cellInstanceConnectionName);
return results;
}
- protected void UpdateLastTicksDuration(long ticksDuration)
+ protected void SetFileParameter(string key, string value)
{
- if (ticksDuration < 50000000)
- ticksDuration = 50000000;
- _LastTicksDuration = (long)Math.Ceiling(ticksDuration * .667);
- _Log.Info($"{new TimeSpan(ticksDuration).TotalMilliseconds} TotalMillisecond(s) to process{Environment.NewLine}{_CellInstanceConnectionName}{Environment.NewLine}<{_ReportFullPath}>");
+ if (_FileConnectorConfiguration is null || _FileConnectorConfiguration.TargetFileLocation.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.ErrorTargetFileLocation.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.TargetFileName.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.ErrorTargetFileName.Contains(string.Concat("%", key, "%")))
+ {
+ if (_FileParameter.ContainsKey(key))
+ _FileParameter[key] = value;
+ else
+ _FileParameter.Add(key, value);
+ }
+ }
+
+ protected void WritePDSF(IFileRead fileRead, JsonElement[] jsonElements)
+ {
+ string directory;
+ string day = $"{_Logistics.DateTimeFromSequence:yyyy-MM-dd}";
+ string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
+ string weekDirectory = $"{_Logistics.DateTimeFromSequence:yyyy}_Week_{weekOfYear}";
+ if (!_CellInstanceConnectionName.StartsWith(_CellInstanceName) && _CellInstanceConnectionNameBase == _EquipmentType)
+ directory = Path.Combine(_TracePath, _EquipmentType, "Target", weekDirectory, day, _CellInstanceName, _CellInstanceConnectionName);
+ else
+ directory = Path.Combine(_TracePath, _EquipmentType, "Source", weekDirectory, day, _CellInstanceName, _CellInstanceConnectionName);
+ if (!Directory.Exists(directory))
+ _ = Directory.CreateDirectory(directory);
+ string file = Path.Combine(directory, string.Concat(_Logistics.MesEntity, "_", _Logistics.Sequence, ".ipdsf"));
+ string lines = ProcessDataStandardFormat.GetPDSFText(fileRead, _Logistics, jsonElements, logisticsText: string.Empty);
+ File.WriteAllText(file, lines);
+ if (_Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600)
+ {
+ try
+ { File.SetLastWriteTime(file, _Logistics.DateTimeFromSequence); }
+ catch (Exception) { }
+ }
}
protected void WaitForThread(Thread thread, List threadExceptions)
@@ -203,7 +520,7 @@ public class FileRead : Properties.IFileRead
}
lock (threadExceptions)
{
- if (threadExceptions.Any())
+ if (threadExceptions.Count != 0)
{
foreach (Exception item in threadExceptions)
_Log.Error(string.Concat(item.Message, Environment.NewLine, Environment.NewLine, item.StackTrace));
@@ -215,230 +532,6 @@ public class FileRead : Properties.IFileRead
}
}
- private void WriteAllLines(string to, string[] exceptionLines)
- {
- string fileName = string.Concat(to, @"\readme.txt");
- try
- {
- if (!Directory.Exists(to))
- _ = Directory.CreateDirectory(to);
- File.WriteAllLines(fileName, exceptionLines);
- }
- catch (Exception ex) { _Log.Error(ex.Message); }
- }
-
- protected string[] Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception)
- {
- string[] results;
- bool isErrorFile = exception is not null;
- if (!to.EndsWith(@"\"))
- _ = string.Concat(to, @"\");
- if (!isErrorFile)
- results = Array.Empty();
- else
- {
- results = new string[] { _Logistics.Sequence.ToString(), _Logistics.ReportFullPath, from, resolvedFileLocation, to, string.Empty, string.Empty, exception.Message, string.Empty, string.Empty, exception.StackTrace };
- if (!_IsDuplicator)
- WriteAllLines(to, results);
- }
- if (extractResults is not null && extractResults.Item4 is not null && extractResults.Item4.Any())
- {
- string itemFile;
- List directories = new();
- foreach (FileInfo sourceFile in extractResults.Item4)
- {
- if (sourceFile.FullName != _Logistics.ReportFullPath)
- {
- itemFile = sourceFile.FullName.Replace(from, to);
- Shared1880(itemFile, directories, sourceFile, isErrorFile);
- }
- else if (!isErrorFile && _Logistics is not null)
- Shared1811(to, sourceFile);
- }
- Shared0231(directories);
- }
- return results;
- }
-
- protected static string GetTupleFile(Logistics logistics, List descriptions, Properties.IScopeInfo scopeInfo, string duplicateDirectory, string duplicateFile) where T : Properties.IDescription
- {
- string result;
- string rds;
- string fileName;
- string dateValue;
- string rdsPlaceholder = "%RDS%";
- string mesEntityPlaceholder = "%MesEntity%";
- if (!descriptions.Any() || string.IsNullOrEmpty(descriptions[0].RDS))
- rds = logistics.MID;
- else
- rds = descriptions[0].RDS;
- string[] segments = scopeInfo.FileName.Split(new string[] { "DateTime:" }, StringSplitOptions.RemoveEmptyEntries);
- if (segments.Length == 0)
- result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileNameWithoutExtension.Replace(rdsPlaceholder, rds).Replace(mesEntityPlaceholder, logistics.MesEntity));
- else
- {
- segments = segments[1].Split('%');
- string datePlaceholder = "%DateTime%";
- dateValue = logistics.DateTimeFromSequence.ToString(segments[0]);
- foreach (string segment in scopeInfo.FileName.Split('%'))
- {
- if (!segment.Contains(segments[0]))
- continue;
- datePlaceholder = string.Concat('%', segment, '%');
- }
- fileName = scopeInfo.FileName.Replace(rdsPlaceholder, rds).Replace(mesEntityPlaceholder, logistics.MesEntity).Replace(datePlaceholder, dateValue);
- if (!duplicateFile.Contains("Viewer"))
- result = Path.Combine(duplicateDirectory, fileName);
- else
- result = Path.Combine(duplicateDirectory, $"Viewer_{fileName}");
- }
- if (result.Contains('%'))
- throw new Exception("Placeholder exists!");
- return result;
- }
-
- protected void WaitForFileConsumption(string sourceDirectoryCloaking, Logistics logistics, DateTime dateTime, List descriptions, string successDirectory, string duplicateDirectory, string duplicateFile, List<(Properties.IScopeInfo, string)> collection) where T : Properties.IDescription
- {
- bool check;
- long preWait;
- string tupleFile;
- string tupleFileName = string.Empty;
- List duplicateFiles = new();
- StringBuilder stringBuilder = new();
- List consumedFileIndices = new();
- bool moreThanAnHour = _BreakAfterSeconds > 3600;
- long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks;
- if (_FileConnectorConfiguration?.FileHandleWaitTime is null)
- preWait = dateTime.AddMilliseconds(1234).Ticks;
- else
- preWait = dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks;
- if (!collection.Any())
- duplicateFiles.Add(duplicateFile);
- string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath);
- string successFile = string.Concat(successDirectory, @"\", Path.GetFileName(logistics.ReportFullPath));
- foreach ((Properties.IScopeInfo scopeInfo, string text) in collection)
- {
- if (scopeInfo.FileName.StartsWith(@"\"))
- tupleFile = scopeInfo.FileName;
- else if (!scopeInfo.FileName.Contains('%'))
- tupleFile = string.Concat(duplicateDirectory, @"\", fileName, "_", scopeInfo.FileNameWithoutExtension, ".pdsfc");
- else
- tupleFile = GetTupleFile(logistics, descriptions, scopeInfo, duplicateDirectory, duplicateFile);
- tupleFileName = Path.GetFileNameWithoutExtension(tupleFile).Split('.')[0];
- duplicateFiles.Add(tupleFile);
- if (_IsEAFHosted)
- File.WriteAllText(tupleFile, text);
- }
- for (short i = 0; i < short.MaxValue; i++)
- {
- if (DateTime.Now.Ticks > preWait)
- break;
- Thread.Sleep(100);
- }
- if (!moreThanAnHour)
- {
- for (short z = 0; z < short.MaxValue; z++)
- {
- try
- {
- check = string.IsNullOrEmpty(successDirectory) || File.Exists(successFile);
- if (check)
- {
- consumedFileIndices.Clear();
- for (int i = 0; i < duplicateFiles.Count; i++)
- {
- if (!File.Exists(duplicateFiles[i]))
- {
- if (string.IsNullOrEmpty(tupleFileName))
- consumedFileIndices.Add(i);
- else if (duplicateFiles.All(l => Path.GetFileNameWithoutExtension(l).Split('.')[0] == tupleFileName))
- {
- for (int j = 0; j < duplicateFiles.Count; j++)
- consumedFileIndices.Add(j);
- }
- else
- consumedFileIndices.Add(i);
- }
- }
- if (consumedFileIndices.Count == duplicateFiles.Count)
- break;
- }
- }
- catch (Exception) { }
- if (DateTime.Now.Ticks > breakAfter)
- {
- for (int i = 0; i < duplicateFiles.Count; i++)
- {
- if (File.Exists(duplicateFiles[i]))
- {
- try
- { File.Delete(duplicateFiles[i]); }
- catch (Exception) { }
- _ = stringBuilder.Append('<').Append(duplicateFiles[i]).Append("> ");
- }
- }
- throw new Exception(string.Concat("After {", _BreakAfterSeconds, "} seconds, right side of {", sourceDirectoryCloaking, "} didn't consume file(s) ", stringBuilder));
- }
- Thread.Sleep(250);
- }
- }
- }
-
- protected void SetFileParameter(string key, string value)
- {
- if (_FileConnectorConfiguration is null || _FileConnectorConfiguration.TargetFileLocation.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.ErrorTargetFileLocation.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.TargetFileName.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.ErrorTargetFileName.Contains(string.Concat("%", key, "%")))
- {
- if (_FileParameter.ContainsKey(key))
- _FileParameter[key] = value;
- else
- _FileParameter.Add(key, value);
- }
- }
-
- protected void SetFileParameterLotIDToLogisticsMID(bool includeLogisticsSequence = true)
- {
- string key;
- if (!includeLogisticsSequence)
- key = "LotID";
- else
- key = "LotIDWithLogisticsSequence";
- string value = string.Concat(_Logistics.MID, "_", _Logistics.Sequence, "_", DateTime.Now.Ticks - _Logistics.Sequence);
- SetFileParameter(key, value);
- }
-
- protected void SetFileParameterLotID(string value, bool includeLogisticsSequence = true)
- {
- string key;
- if (!includeLogisticsSequence)
- key = "LotID";
- else
- {
- key = "LotIDWithLogisticsSequence";
- value = string.Concat(value, "_", _Logistics.Sequence, "_", DateTime.Now.Ticks - _Logistics.Sequence);
- }
- SetFileParameter(key, value);
- }
-
- protected void WritePDSF(IFileRead fileRead, JsonElement[] jsonElements)
- {
- string directory;
- if (!_CellInstanceConnectionName.StartsWith(_CellInstanceName) && _CellInstanceConnectionNameBase == _EquipmentType)
- directory = Path.Combine(_TracePath, _EquipmentType, "Target", _CellInstanceName, _CellInstanceConnectionName);
- else
- directory = Path.Combine(_TracePath, _EquipmentType, "Source", _CellInstanceName, _CellInstanceConnectionName);
- if (!Directory.Exists(directory))
- _ = Directory.CreateDirectory(directory);
- string file = Path.Combine(directory, string.Concat(_Logistics.MesEntity, "_", _Logistics.Sequence, ".ipdsf"));
- string lines = ProcessDataStandardFormat.GetPDSFText(fileRead, _Logistics, jsonElements, logisticsText: string.Empty);
- File.WriteAllText(file, lines);
- if (_Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600)
- {
- try
- { File.SetLastWriteTime(file, _Logistics.DateTimeFromSequence); }
- catch (Exception) { }
- }
- }
-
protected void Move(Tuple> extractResults)
{
if (!_IsEAFHosted)
@@ -457,80 +550,49 @@ public class FileRead : Properties.IFileRead
}
}
- protected void TriggerEvents(Tuple> extractResults, List headerNames, Dictionary keyValuePairs)
+ protected string[] Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception)
{
- object value;
- string description;
- List