From cef49ab67b5ce9b24da8e034f50d4ad9fd8e3cf5 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Fri, 18 Feb 2022 16:43:30 -0700 Subject: [PATCH] Ready to test --- Adaptation/.vscode/format-report.json | 38 + Adaptation/.vscode/settings.json | 40 + .../Core/AutoGenerated/BackboneComponent.cs | 7 +- .../Core/AutoGenerated/BackboneStatusCache.cs | 7 +- .../AutoGenerated/ILoggingSetupManager.cs | 7 +- .../Eaf/Core/AutoGenerated/StatusItem.cs | 7 +- Adaptation/Eaf/Core/Backbone.cs | 83 +- Adaptation/Eaf/Core/Smtp/EmailMessage.cs | 31 +- Adaptation/Eaf/Core/Smtp/ISmtp.cs | 11 +- Adaptation/Eaf/Core/Smtp/MailPriority.cs | 15 +- .../ChangeDataCollectionHandler.cs | 7 +- .../AutoGenerated/DataCollectionRequest.cs | 7 +- .../Control/AutoGenerated/EquipmentEvent.cs | 7 +- .../AutoGenerated/EquipmentException.cs | 7 +- .../AutoGenerated/EquipmentSelfDescription.cs | 7 +- .../GetParameterValuesHandler.cs | 7 +- .../AutoGenerated/IConnectionControl.cs | 7 +- .../AutoGenerated/IDataTracingHandler.cs | 7 +- .../AutoGenerated/IEquipmentCommandService.cs | 7 +- .../AutoGenerated/IEquipmentControl.cs | 23 +- .../IEquipmentSelfDescriptionBuilder.cs | 7 +- .../Control/AutoGenerated/IPackage.cs | 7 +- .../AutoGenerated/ISelfDescriptionLookup.cs | 7 +- .../IVirtualParameterValuesHandler.cs | 7 +- .../SetParameterValuesHandler.cs | 7 +- .../Control/AutoGenerated/TraceRequest.cs | 7 +- .../Control/IEquipmentDataCollection.cs | 63 +- .../EquipmentCore/Control/IPackageSource.cs | 7 +- .../Reporting/ParameterValue.cs | 29 +- .../ElementDescription/EquipmentParameter.cs | 37 +- .../SelfDescription/ParameterTypes/Field.cs | 24 +- .../ParameterTypes/ParameterTypeDefinition.cs | 20 +- .../ParameterTypes/StructuredType.cs | 16 +- .../CellAutomation/IConfigurationObject.cs | 7 +- .../ModelObjectParameterDefinition.cs | 44 +- .../ModelObjectParameterType.cs | 29 +- .../SecsConnectionConfiguration.cs | 77 +- Adaptation/FileHandlers/Archive/FileRead.cs | 141 + .../CellInstanceConnectionName.cs | 39 + Adaptation/FileHandlers/Dummy/FileRead.cs | 308 ++ Adaptation/FileHandlers/FileRead.cs | 300 -- Adaptation/FileHandlers/FileReadShared.cs | 1041 ------ .../FileHandlers/MET08DDUPSFS6420/FileRead.cs | 519 +++ .../FileHandlers/MET08DDUPSFS6420/Hyphen.cs | 17 + .../MET08DDUPSFS6420/ProcessData.cs | 278 ++ .../MET08DDUPSFS6420/WSRequest.cs | 199 ++ .../FileHandlers/ManualOIEntry/FileRead.cs | 145 + Adaptation/FileHandlers/ToArchive/FileRead.cs | 140 + Adaptation/FileHandlers/pcl/Description.cs | 499 +++ Adaptation/FileHandlers/pcl/Detail.cs | 45 + Adaptation/FileHandlers/pcl/FileRead.cs | 131 + Adaptation/FileHandlers/pcl/ProcessData.cs | 672 ++++ Adaptation/Helpers/ConfigData.Level.cs | 49 - Adaptation/Helpers/ConfigData.cs | 614 ---- Adaptation/Helpers/ProcessData.DataFile.cs | 53 - .../ProcessData.FileRead.Description.cs | 473 --- Adaptation/Helpers/ProcessData.HeaderFile.cs | 61 - Adaptation/Helpers/ProcessData.WSRequest.cs | 203 -- Adaptation/Helpers/ProcessData.cs | 912 ----- Adaptation/Helpers/Si/Transport.Input.cs | 19 - Adaptation/Helpers/Si/Transport.Item.cs | 18 - Adaptation/Helpers/Si/Transport.Job.cs | 198 -- Adaptation/Helpers/Si/Transport.Logistics.cs | 77 - Adaptation/Helpers/Si/Transport.cs | 218 -- .../Common/Configuration/ConnectionSetting.cs | 26 +- .../EquipmentConnector/File/Component/File.cs | 28 +- .../File/Component/FilePathGenerator.cs | 57 +- .../FileConnectorConfiguration.cs | 253 +- ...onnectorParameterTypeDefinitionProvider.cs | 21 +- Adaptation/MET08DDUPSFS6420.Tests.csproj | 2 +- .../GCL/Annotations/NotNullAttribute.cs | 11 +- .../GCL/SecsDriver/HsmsConnectionMode.cs | 11 +- .../GCL/SecsDriver/HsmsSessionMode.cs | 11 +- .../GCL/SecsDriver/SecsTransportType.cs | 11 +- .../GCL/SecsDriver/SerialBaudRate.cs | 27 +- .../Shared/Deposition/DEP08EGANAIXG5H.cs | 20 - Adaptation/Shared/Deposition/Test.cs | 16 - Adaptation/Shared/Description.cs | 192 -- Adaptation/Shared/Duplicator/Description.cs | 142 + Adaptation/Shared/EquipmentType.cs | 53 - Adaptation/Shared/ExtendedParameter.cs | 178 - Adaptation/Shared/ExtractResult.cs | 652 ---- Adaptation/Shared/FileRead.cs | 813 +++++ Adaptation/Shared/IProcessData.cs | 16 - Adaptation/Shared/IProcessDataDescription.cs | 26 - Adaptation/Shared/IQSRecord.cs | 239 -- Adaptation/Shared/IScopeInfo.cs | 21 - Adaptation/Shared/IsEnvironment.cs | 171 - Adaptation/Shared/Logistics.cs | 368 +- Adaptation/Shared/Logistics2.cs | 140 +- Adaptation/Shared/Methods/IDescription.cs | 22 + Adaptation/Shared/Methods/IFileRead.cs | 24 + Adaptation/Shared/Methods/ILogistics.cs | 5 + Adaptation/Shared/Methods/ILogistics2.cs | 5 + Adaptation/Shared/Methods/IProcessData.cs | 14 + Adaptation/Shared/Methods/ISMTP.cs | 8 + Adaptation/Shared/Metrology/Column.cs | 1605 --------- Adaptation/Shared/Metrology/ConfigDataBase.cs | 419 --- Adaptation/Shared/Metrology/EventName.cs | 13 - Adaptation/Shared/Metrology/ILogic.cs | 45 - .../Shared/Metrology/MET08DDUPSFS6420.cs | 14 - .../Shared/Metrology/MET08DDUPSP1TBI.cs | 14 - Adaptation/Shared/Metrology/MET08RESIHGCV.cs | 14 - .../Shared/Metrology/MET08RESIMAPCDE.cs | 14 - .../Shared/Metrology/MET08THFTIRQS408M.cs | 14 - .../Shared/Metrology/MET08THFTIRSTRATUS.cs | 14 - .../Shared/Metrology/MET08XRDXPERTPROMRDXL.cs | 23 - Adaptation/Shared/Metrology/OISiViewer.cs | 36 - .../Metrology/ProcessData.Duplicator.cs | 110 - .../Metrology/ProcessDataStandardFormat.cs | 527 --- Adaptation/Shared/Metrology/ScopeInfo.cs | 691 ++-- Adaptation/Shared/Metrology/Test.cs | 57 - Adaptation/Shared/Metrology/WS.Attachment.cs | 29 +- Adaptation/Shared/Metrology/WS.Results.cs | 36 +- Adaptation/Shared/Metrology/WS.cs | 206 +- Adaptation/Shared/ParameterType.cs | 10 + .../Shared/ProcessDataStandardFormat.cs | 411 +++ Adaptation/Shared/Properties/IDescription.cs | 10 + Adaptation/Shared/Properties/IFileRead.cs | 17 + Adaptation/Shared/Properties/ILogistics.cs | 22 + Adaptation/Shared/Properties/ILogistics2.cs | 14 + Adaptation/Shared/Properties/IProcessData.cs | 10 + Adaptation/Shared/Properties/IScopeInfo.cs | 17 + Adaptation/Shared/Test.cs | 58 + .../Staging/v2.39.0/MET08DDUPSFS6420.cs | 177 + .../Staging/v2.39.0/TENCOR1.cs | 59 + .../Staging/v2.39.0/TENCOR2.cs | 54 + .../Staging/v2.39.0/TENCOR3-EQPT.cs | 65 + .../Staging/v2.39.0/TENCOR3.cs | 65 + .../Staging/v2.39.0/MET08DDUPSFS6420.cs | 82 + .../_Tests/Extract/Staging/v2.39.0/TENCOR1.cs | 0 .../_Tests/Extract/Staging/v2.39.0/TENCOR2.cs | 0 .../Extract/Staging/v2.39.0/TENCOR3-EQPT.cs | 32 + .../_Tests/Extract/Staging/v2.39.0/TENCOR3.cs | 32 + Adaptation/_Tests/Helpers/Metrology.cs | 156 + Adaptation/_Tests/Shared/AdaptationTesting.cs | 1061 ++++++ .../_Tests/Shared/EAFLoggingUnitTesting.cs | 28 + Adaptation/_Tests/Shared/IsEnvironment.cs | 168 + .../_Tests/Shared/LoggingUnitTesting.cs | 111 + .../EAF XML API/CellInstance.cs | 3056 +++++++++++++++++ .../EAF XML API/ConfigurationData.cs | 23 + .../EAF XML API/EquipmentDictionary.cs | 1300 +++++++ .../EAF XML API/EquipmentType.cs | 962 ++++++ Adaptation/_Tests/Shared/UnitTesting.cs | 90 + Adaptation/appsettings.Development.json | 139 + Adaptation/appsettings.json | 139 + Adaptation/package.json | 23 +- FileHandlers/FileRead.cs | 367 +- FileHandlers/FileReadShared.cs | 249 -- Helpers/ConfigData.Level.cs | 47 - Helpers/ConfigData.cs | 553 --- Helpers/ProcessData.DataFile.cs | 53 - Helpers/ProcessData.FileRead.Description.cs | 472 --- Helpers/ProcessData.HeaderFile.cs | 61 - Helpers/ProcessData.WSRequest.cs | 203 -- Helpers/ProcessData.cs | 761 ---- MET08DDUPSFS6420.csproj | 68 +- Properties/AssemblyInfo.cs | 4 +- Shared/Deposition/Test.cs | 16 - Shared/Description.cs | 182 - Shared/FilePathGenerator.cs | 35 +- Shared/FilePathGeneratorInfo.cs | 112 +- Shared/Mapper.cs | 74 + Shared/Metrology/Column.cs | 803 ----- Shared/Metrology/ConfigDataBase.cs | 321 -- Shared/Metrology/EventName.cs | 13 - Shared/Metrology/ILogic.cs | 46 - Shared/Metrology/MET08DDUPSFS6420.cs | 14 - Shared/Metrology/MET08DDUPSP1TBI.cs | 14 - Shared/Metrology/MET08RESIHGCV.cs | 14 - Shared/Metrology/MET08RESIMAPCDE.cs | 14 - Shared/Metrology/MET08THFTIRQS408M.cs | 14 - Shared/Metrology/MET08THFTIRSTRATUS.cs | 14 - Shared/Metrology/MET08XRDXPERTPROMRDXL.cs | 23 - Shared/Metrology/OISiViewer.cs | 36 - Shared/Metrology/ProcessData.Duplicator.cs | 115 - Shared/Metrology/ProcessDataStandardFormat.cs | 520 --- Shared/Metrology/ScopeInfo.cs | 405 --- Shared/Metrology/Test.cs | 56 - Shared/Metrology/WS.Attachment.cs | 24 - Shared/Metrology/WS.Results.cs | 33 - Shared/Metrology/WS.cs | 128 - 182 files changed, 14333 insertions(+), 15482 deletions(-) create mode 100644 Adaptation/.vscode/format-report.json create mode 100644 Adaptation/.vscode/settings.json create mode 100644 Adaptation/FileHandlers/Archive/FileRead.cs create mode 100644 Adaptation/FileHandlers/CellInstanceConnectionName.cs create mode 100644 Adaptation/FileHandlers/Dummy/FileRead.cs delete mode 100644 Adaptation/FileHandlers/FileRead.cs delete mode 100644 Adaptation/FileHandlers/FileReadShared.cs create mode 100644 Adaptation/FileHandlers/MET08DDUPSFS6420/FileRead.cs create mode 100644 Adaptation/FileHandlers/MET08DDUPSFS6420/Hyphen.cs create mode 100644 Adaptation/FileHandlers/MET08DDUPSFS6420/ProcessData.cs create mode 100644 Adaptation/FileHandlers/MET08DDUPSFS6420/WSRequest.cs create mode 100644 Adaptation/FileHandlers/ManualOIEntry/FileRead.cs create mode 100644 Adaptation/FileHandlers/ToArchive/FileRead.cs create mode 100644 Adaptation/FileHandlers/pcl/Description.cs create mode 100644 Adaptation/FileHandlers/pcl/Detail.cs create mode 100644 Adaptation/FileHandlers/pcl/FileRead.cs create mode 100644 Adaptation/FileHandlers/pcl/ProcessData.cs delete mode 100644 Adaptation/Helpers/ConfigData.Level.cs delete mode 100644 Adaptation/Helpers/ConfigData.cs delete mode 100644 Adaptation/Helpers/ProcessData.DataFile.cs delete mode 100644 Adaptation/Helpers/ProcessData.FileRead.Description.cs delete mode 100644 Adaptation/Helpers/ProcessData.HeaderFile.cs delete mode 100644 Adaptation/Helpers/ProcessData.WSRequest.cs delete mode 100644 Adaptation/Helpers/ProcessData.cs delete mode 100644 Adaptation/Helpers/Si/Transport.Input.cs delete mode 100644 Adaptation/Helpers/Si/Transport.Item.cs delete mode 100644 Adaptation/Helpers/Si/Transport.Job.cs delete mode 100644 Adaptation/Helpers/Si/Transport.Logistics.cs delete mode 100644 Adaptation/Helpers/Si/Transport.cs delete mode 100644 Adaptation/Shared/Deposition/DEP08EGANAIXG5H.cs delete mode 100644 Adaptation/Shared/Deposition/Test.cs delete mode 100644 Adaptation/Shared/Description.cs create mode 100644 Adaptation/Shared/Duplicator/Description.cs delete mode 100644 Adaptation/Shared/EquipmentType.cs delete mode 100644 Adaptation/Shared/ExtendedParameter.cs delete mode 100644 Adaptation/Shared/ExtractResult.cs create mode 100644 Adaptation/Shared/FileRead.cs delete mode 100644 Adaptation/Shared/IProcessData.cs delete mode 100644 Adaptation/Shared/IProcessDataDescription.cs delete mode 100644 Adaptation/Shared/IQSRecord.cs delete mode 100644 Adaptation/Shared/IScopeInfo.cs delete mode 100644 Adaptation/Shared/IsEnvironment.cs create mode 100644 Adaptation/Shared/Methods/IDescription.cs create mode 100644 Adaptation/Shared/Methods/IFileRead.cs create mode 100644 Adaptation/Shared/Methods/ILogistics.cs create mode 100644 Adaptation/Shared/Methods/ILogistics2.cs create mode 100644 Adaptation/Shared/Methods/IProcessData.cs create mode 100644 Adaptation/Shared/Methods/ISMTP.cs delete mode 100644 Adaptation/Shared/Metrology/Column.cs delete mode 100644 Adaptation/Shared/Metrology/ConfigDataBase.cs delete mode 100644 Adaptation/Shared/Metrology/EventName.cs delete mode 100644 Adaptation/Shared/Metrology/ILogic.cs delete mode 100644 Adaptation/Shared/Metrology/MET08DDUPSFS6420.cs delete mode 100644 Adaptation/Shared/Metrology/MET08DDUPSP1TBI.cs delete mode 100644 Adaptation/Shared/Metrology/MET08RESIHGCV.cs delete mode 100644 Adaptation/Shared/Metrology/MET08RESIMAPCDE.cs delete mode 100644 Adaptation/Shared/Metrology/MET08THFTIRQS408M.cs delete mode 100644 Adaptation/Shared/Metrology/MET08THFTIRSTRATUS.cs delete mode 100644 Adaptation/Shared/Metrology/MET08XRDXPERTPROMRDXL.cs delete mode 100644 Adaptation/Shared/Metrology/OISiViewer.cs delete mode 100644 Adaptation/Shared/Metrology/ProcessData.Duplicator.cs delete mode 100644 Adaptation/Shared/Metrology/ProcessDataStandardFormat.cs delete mode 100644 Adaptation/Shared/Metrology/Test.cs create mode 100644 Adaptation/Shared/ParameterType.cs create mode 100644 Adaptation/Shared/ProcessDataStandardFormat.cs create mode 100644 Adaptation/Shared/Properties/IDescription.cs create mode 100644 Adaptation/Shared/Properties/IFileRead.cs create mode 100644 Adaptation/Shared/Properties/ILogistics.cs create mode 100644 Adaptation/Shared/Properties/ILogistics2.cs create mode 100644 Adaptation/Shared/Properties/IProcessData.cs create mode 100644 Adaptation/Shared/Properties/IScopeInfo.cs create mode 100644 Adaptation/Shared/Test.cs create mode 100644 Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/MET08DDUPSFS6420.cs create mode 100644 Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR1.cs create mode 100644 Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR2.cs create mode 100644 Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR3-EQPT.cs create mode 100644 Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR3.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.39.0/MET08DDUPSFS6420.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR1.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR2.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR3-EQPT.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR3.cs create mode 100644 Adaptation/_Tests/Helpers/Metrology.cs create mode 100644 Adaptation/_Tests/Shared/AdaptationTesting.cs create mode 100644 Adaptation/_Tests/Shared/EAFLoggingUnitTesting.cs create mode 100644 Adaptation/_Tests/Shared/IsEnvironment.cs create mode 100644 Adaptation/_Tests/Shared/LoggingUnitTesting.cs create mode 100644 Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/CellInstance.cs create mode 100644 Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/ConfigurationData.cs create mode 100644 Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentDictionary.cs create mode 100644 Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentType.cs create mode 100644 Adaptation/_Tests/Shared/UnitTesting.cs create mode 100644 Adaptation/appsettings.Development.json create mode 100644 Adaptation/appsettings.json delete mode 100644 FileHandlers/FileReadShared.cs delete mode 100644 Helpers/ConfigData.Level.cs delete mode 100644 Helpers/ConfigData.cs delete mode 100644 Helpers/ProcessData.DataFile.cs delete mode 100644 Helpers/ProcessData.FileRead.Description.cs delete mode 100644 Helpers/ProcessData.HeaderFile.cs delete mode 100644 Helpers/ProcessData.WSRequest.cs delete mode 100644 Helpers/ProcessData.cs delete mode 100644 Shared/Deposition/Test.cs delete mode 100644 Shared/Description.cs create mode 100644 Shared/Mapper.cs delete mode 100644 Shared/Metrology/Column.cs delete mode 100644 Shared/Metrology/ConfigDataBase.cs delete mode 100644 Shared/Metrology/EventName.cs delete mode 100644 Shared/Metrology/ILogic.cs delete mode 100644 Shared/Metrology/MET08DDUPSFS6420.cs delete mode 100644 Shared/Metrology/MET08DDUPSP1TBI.cs delete mode 100644 Shared/Metrology/MET08RESIHGCV.cs delete mode 100644 Shared/Metrology/MET08RESIMAPCDE.cs delete mode 100644 Shared/Metrology/MET08THFTIRQS408M.cs delete mode 100644 Shared/Metrology/MET08THFTIRSTRATUS.cs delete mode 100644 Shared/Metrology/MET08XRDXPERTPROMRDXL.cs delete mode 100644 Shared/Metrology/OISiViewer.cs delete mode 100644 Shared/Metrology/ProcessData.Duplicator.cs delete mode 100644 Shared/Metrology/ProcessDataStandardFormat.cs delete mode 100644 Shared/Metrology/ScopeInfo.cs delete mode 100644 Shared/Metrology/Test.cs delete mode 100644 Shared/Metrology/WS.Attachment.cs delete mode 100644 Shared/Metrology/WS.Results.cs delete mode 100644 Shared/Metrology/WS.cs diff --git a/Adaptation/.vscode/format-report.json b/Adaptation/.vscode/format-report.json new file mode 100644 index 0000000..7c68521 --- /dev/null +++ b/Adaptation/.vscode/format-report.json @@ -0,0 +1,38 @@ +[ + { + "DocumentId": { + "ProjectId": { + "Id": "5de73c6e-a3a2-4ec4-ae79-d15993268b3c" + }, + "Id": "89553829-ed12-4613-93e4-505108d314f9" + }, + "FileName": "Detail.cs", + "FilePath": "T:\\MET08DDUPSFS6420\\06_SourceCode\\MET08DDUPSFS6420\\Adaptation\\FileHandlers\\pcl\\Detail.cs", + "FileChanges": [ + { + "LineNumber": 43, + "CharNumber": 16, + "DiagnosticId": "IDE1006", + "FormatDescription": "warning IDE1006: Naming rule violation: These words must begin with upper case characters: i" + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "5de73c6e-a3a2-4ec4-ae79-d15993268b3c" + }, + "Id": "edd1edc5-c335-46e6-9a59-d0ae024c8e63" + }, + "FileName": "WSRequest.cs", + "FilePath": "T:\\MET08DDUPSFS6420\\06_SourceCode\\MET08DDUPSFS6420\\Adaptation\\FileHandlers\\MET08DDUPSFS6420\\WSRequest.cs", + "FileChanges": [ + { + "LineNumber": 64, + "CharNumber": 16, + "DiagnosticId": "IDE1006", + "FormatDescription": "warning IDE1006: Naming rule violation: These words must begin with upper case characters: i" + } + ] + } +] \ No newline at end of file diff --git a/Adaptation/.vscode/settings.json b/Adaptation/.vscode/settings.json new file mode 100644 index 0000000..a80cb93 --- /dev/null +++ b/Adaptation/.vscode/settings.json @@ -0,0 +1,40 @@ +{ + "cSpell.words": [ + "DDUPSFS", + "EQPT", + "gpcl", + "IKVM", + "ISMTP", + "Linc", + "LPDCM", + "messa", + "NOPAUSE", + "PDFC", + "pdmodel", + "pdsf", + "PPTST", + "RESIMAPTENCOR", + "TENCOR", + "TIBCO" + ], + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#7933a3", + "activityBar.activeBorder": "#31240f", + "activityBar.background": "#7933a3", + "activityBar.foreground": "#e7e7e7", + "activityBar.inactiveForeground": "#e7e7e799", + "activityBarBadge.background": "#31240f", + "activityBarBadge.foreground": "#e7e7e7", + "sash.hoverBorder": "#7933a3", + "statusBar.background": "#5c277c", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#7933a3", + "statusBarItem.remoteBackground": "#5c277c", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#5c277c", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#5c277c99", + "titleBar.inactiveForeground": "#e7e7e799" + }, + "peacock.color": "#5c277c" +} \ No newline at end of file diff --git a/Adaptation/Eaf/Core/AutoGenerated/BackboneComponent.cs b/Adaptation/Eaf/Core/AutoGenerated/BackboneComponent.cs index 4b83dcf..06ec233 100644 --- a/Adaptation/Eaf/Core/AutoGenerated/BackboneComponent.cs +++ b/Adaptation/Eaf/Core/AutoGenerated/BackboneComponent.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.Core +namespace Adaptation.Eaf.Core; + +public class BackboneComponent { - public class BackboneComponent - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/Core/AutoGenerated/BackboneStatusCache.cs b/Adaptation/Eaf/Core/AutoGenerated/BackboneStatusCache.cs index 5da2cda..69d3b7a 100644 --- a/Adaptation/Eaf/Core/AutoGenerated/BackboneStatusCache.cs +++ b/Adaptation/Eaf/Core/AutoGenerated/BackboneStatusCache.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.Core +namespace Adaptation.Eaf.Core; + +public class BackboneStatusCache { - public class BackboneStatusCache - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs b/Adaptation/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs index ba939e7..62e12d8 100644 --- a/Adaptation/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs +++ b/Adaptation/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.Core +namespace Adaptation.Eaf.Core; + +public interface ILoggingSetupManager { - public interface ILoggingSetupManager - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/Core/AutoGenerated/StatusItem.cs b/Adaptation/Eaf/Core/AutoGenerated/StatusItem.cs index 4dc8f3b..f981297 100644 --- a/Adaptation/Eaf/Core/AutoGenerated/StatusItem.cs +++ b/Adaptation/Eaf/Core/AutoGenerated/StatusItem.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.Core +namespace Adaptation.Eaf.Core; + +public class StatusItem { - public class StatusItem - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/Core/Backbone.cs b/Adaptation/Eaf/Core/Backbone.cs index d4b6f03..f39f081 100644 --- a/Adaptation/Eaf/Core/Backbone.cs +++ b/Adaptation/Eaf/Core/Backbone.cs @@ -2,47 +2,52 @@ using System; using System.Collections.Generic; -namespace Adaptation.Eaf.Core +namespace Adaptation.Eaf.Core; + +public class Backbone { - public class Backbone - { - public const string STATE_ERROR = "Error"; - public const string STATE_OFFLINE = "Offline"; - public const string STATE_RUNNING = "Running"; - public const string STATE_SHUTDOWN = "Shutting Down"; - public const string STATE_STARTING = "Starting"; - protected Backbone() { } +#pragma warning disable CA1822 +#pragma warning disable CA2254 +#pragma warning disable IDE0060 - [NotNull] - public static Backbone Instance { get; } - [NotNull] - public ILoggingSetupManager LoggingConfigurationManager { get; set; } - public BackboneStatusCache Status { get; } - public bool IsAutomatedRestartActive { get; } - public bool IsReadyForRestart { get; } - public string StartTime { get; } - public string State { get; } - public string Name { get; } - public string ConfigurationServiceAddress { get; } - public string CellName { get; } - protected bool IsInitialized { get; set; } - protected Dictionary BackboneComponents { get; } + public const string STATE_ERROR = "Error"; + public const string STATE_OFFLINE = "Offline"; + public const string STATE_RUNNING = "Running"; + public const string STATE_SHUTDOWN = "Shutting Down"; + public const string STATE_STARTING = "Starting"; + + protected Backbone() { } + + [NotNull] + public static Backbone Instance { get; } + [NotNull] + public ILoggingSetupManager LoggingConfigurationManager { get; set; } + public BackboneStatusCache Status { get; } + public bool IsAutomatedRestartActive { get; } + public bool IsReadyForRestart { get; } + public string StartTime { get; } + public string State { get; } + public string Name { get; } + public string ConfigurationServiceAddress { get; } + public string CellName { get; } + protected bool IsInitialized { get; set; } + protected Dictionary BackboneComponents { get; } + + public void AddBackboneComponent(BackboneComponent backboneComponent) { } + public bool ContainsBackboneComponent(string id) => throw new NotImplementedException(); + [Obsolete("Use the capabilities exposed via the Status property -> GetAll. Will be removed with next major release.")] + public List GetAllStatuses() => throw new NotImplementedException(); + public BackboneComponent GetBackboneComponentById(string id) => throw new NotImplementedException(); + public List GetBackboneComponentsOfType() => throw new NotImplementedException(); + public List GetBackboneComponentsOfType(Type type) => throw new NotImplementedException(); + public void RegisterSubprocess(int pid) { } + [Obsolete("Use the capabilities exposed via the Status property -> SetValue. Will be removed with next major release.")] + public void SetStatus(string statusName, string statusValue) { } + [Obsolete("Use the capabilities exposed via the Status property -> SetValue. Will be removed with next major release.")] + public void SetStatus(BackboneComponent source, string statusName, string statusValue) { } + protected void CloseConnectionOfComponents(List components) { } + protected virtual void StopAllComponents() { } + protected void StopComponents(List components) { } - public void AddBackboneComponent(BackboneComponent backboneComponent) { } - public bool ContainsBackboneComponent(string id) { throw new NotImplementedException(); } - [Obsolete("Use the capabilities exposed via the Status property -> GetAll. Will be removed with next major release.")] - public List GetAllStatuses() { throw new NotImplementedException(); } - public BackboneComponent GetBackboneComponentById(string id) { throw new NotImplementedException(); } - public List GetBackboneComponentsOfType() { throw new NotImplementedException(); } - public List GetBackboneComponentsOfType(Type type) { throw new NotImplementedException(); } - public void RegisterSubprocess(int pid) { } - [Obsolete("Use the capabilities exposed via the Status property -> SetValue. Will be removed with next major release.")] - public void SetStatus(string statusName, string statusValue) { } - [Obsolete("Use the capabilities exposed via the Status property -> SetValue. Will be removed with next major release.")] - public void SetStatus(BackboneComponent source, string statusName, string statusValue) { } - protected void CloseConnectionOfComponents(List components) { } - protected virtual void StopAllComponents() { } - protected void StopComponents(List components) { } - } } \ No newline at end of file diff --git a/Adaptation/Eaf/Core/Smtp/EmailMessage.cs b/Adaptation/Eaf/Core/Smtp/EmailMessage.cs index f0c2baf..e16b8aa 100644 --- a/Adaptation/Eaf/Core/Smtp/EmailMessage.cs +++ b/Adaptation/Eaf/Core/Smtp/EmailMessage.cs @@ -1,24 +1,25 @@ using System; -namespace Adaptation.Eaf.Core.Smtp +namespace Adaptation.Eaf.Core.Smtp; + +public class EmailMessage { - public class EmailMessage - { - public EmailMessage() { } - public EmailMessage(string subject, string body, MailPriority priority = MailPriority.Normal) { } +#pragma warning disable CA2254 +#pragma warning disable IDE0060 - public string Body { get; } - public MailPriority Priority { get; } - public string Subject { get; } + public EmailMessage() { } + public EmailMessage(string subject, string body, MailPriority priority = MailPriority.Normal) { } - public EmailMessage PriorityHigh() { throw new NotImplementedException(); } - public EmailMessage PriorityLow() { throw new NotImplementedException(); } - public EmailMessage PriorityNormal() { throw new NotImplementedException(); } - public EmailMessage SetBody(string body) { throw new NotImplementedException(); } - public EmailMessage SetPriority(MailPriority priority) { throw new NotImplementedException(); } - public EmailMessage SetSubject(string subject) { throw new NotImplementedException(); } + public string Body { get; } + public MailPriority Priority { get; } + public string Subject { get; } - } + public EmailMessage PriorityHigh() => throw new NotImplementedException(); + public EmailMessage PriorityLow() => throw new NotImplementedException(); + public EmailMessage PriorityNormal() => throw new NotImplementedException(); + public EmailMessage SetBody(string body) => throw new NotImplementedException(); + public EmailMessage SetPriority(MailPriority priority) => throw new NotImplementedException(); + public EmailMessage SetSubject(string subject) => throw new NotImplementedException(); } \ No newline at end of file diff --git a/Adaptation/Eaf/Core/Smtp/ISmtp.cs b/Adaptation/Eaf/Core/Smtp/ISmtp.cs index 3a12278..0446065 100644 --- a/Adaptation/Eaf/Core/Smtp/ISmtp.cs +++ b/Adaptation/Eaf/Core/Smtp/ISmtp.cs @@ -1,9 +1,6 @@ -namespace Adaptation.Eaf.Core.Smtp +namespace Adaptation.Eaf.Core.Smtp; + +public interface ISmtp { - - public interface ISmtp - { - void Send(EmailMessage message); - } - + void Send(EmailMessage message); } \ No newline at end of file diff --git a/Adaptation/Eaf/Core/Smtp/MailPriority.cs b/Adaptation/Eaf/Core/Smtp/MailPriority.cs index 18ee1af..b59d146 100644 --- a/Adaptation/Eaf/Core/Smtp/MailPriority.cs +++ b/Adaptation/Eaf/Core/Smtp/MailPriority.cs @@ -1,11 +1,8 @@ -namespace Adaptation.Eaf.Core.Smtp +namespace Adaptation.Eaf.Core.Smtp; + +public enum MailPriority { - - public enum MailPriority - { - Low = 0, - Normal = 1, - High = 2 - } - + Low = 0, + Normal = 1, + High = 2 } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs index 096cfd8..80e911e 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public class ChangeDataCollectionHandler { - public class ChangeDataCollectionHandler - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs index f085c14..d49c557 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public class DataCollectionRequest { - public class DataCollectionRequest - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs index fd97bcb..9d45cb1 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public class EquipmentEvent { - public class EquipmentEvent - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs index 1a3babd..c0cf1c3 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public class EquipmentException { - public class EquipmentException - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs index 3697004..92d7722 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public class EquipmentSelfDescription { - public class EquipmentSelfDescription - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs index bc26e0f..dca26fc 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public class GetParameterValuesHandler { - public class GetParameterValuesHandler - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs index a9e800c..7481501 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IConnectionControl { - public interface IConnectionControl - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs index 3b98f85..cf0602a 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IDataTracingHandler { - public interface IDataTracingHandler - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs index 2a54add..9f6000e 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IEquipmentCommandService { - public interface IEquipmentCommandService - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs index a119d2b..8b4f8d1 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs @@ -1,16 +1,15 @@ using Adaptation.PeerGroup.GCL.Annotations; -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IEquipmentControl : IPackageSource { - public interface IEquipmentControl : IPackageSource - { - [NotNull] - IEquipmentSelfDescriptionBuilder SelfDescriptionBuilder { get; } - [NotNull] - IEquipmentDataCollection DataCollection { get; } - [NotNull] - IEquipmentCommandService Commands { get; } - [NotNull] - IConnectionControl Connection { get; } - } + [NotNull] + IEquipmentSelfDescriptionBuilder SelfDescriptionBuilder { get; } + [NotNull] + IEquipmentDataCollection DataCollection { get; } + [NotNull] + IEquipmentCommandService Commands { get; } + [NotNull] + IConnectionControl Connection { get; } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs index b583e8c..f34413f 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IEquipmentSelfDescriptionBuilder { - public interface IEquipmentSelfDescriptionBuilder - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs index 67ef808..eef26c3 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IPackage { - public interface IPackage - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs index 57b3215..be924e9 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface ISelfDescriptionLookup { - public interface ISelfDescriptionLookup - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs index 64e4621..e7a76fc 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IVirtualParameterValuesHandler { - public interface IVirtualParameterValuesHandler - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs index 200fb13..2615f40 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public class SetParameterValuesHandler { - public class SetParameterValuesHandler - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs index 84511e9..8d26e7b 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public class TraceRequest { - public class TraceRequest - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs b/Adaptation/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs index 7a704b5..d0980ee 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs @@ -3,37 +3,36 @@ using Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription; using System; using System.Collections.Generic; -namespace Adaptation.Eaf.EquipmentCore.Control -{ - public interface IEquipmentDataCollection - { - IVirtualParameterValuesHandler VirtualParameterValuesHandler { get; } - ISelfDescriptionLookup SelfDescriptionLookup { get; } - EquipmentSelfDescription SelfDescription { get; } - IEnumerable ActiveRequests { get; } - IDataTracingHandler DataTracingHandler { get; } +namespace Adaptation.Eaf.EquipmentCore.Control; - ParameterValue CreateParameterValue(EquipmentParameter parameter, object value); - void NotifyDataTracingAvailable(bool isAvailable); - void RegisterChangeDataCollectionHandler(ChangeDataCollectionHandler handler); - void RegisterDataTracingHandler(IDataTracingHandler handler); - void RegisterGetParameterValuesHandler(GetParameterValuesHandler handler); - void RegisterSetParameterValuesHandler(SetParameterValuesHandler handler); - void TriggerDeactivate(DataCollectionRequest deactivateRequest); - void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable parameters); - void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable parameters, IPackage sourcePackage); - void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters); - void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, IPackage sourcePackage); - void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride); - void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); - void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); - void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride); - void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, IPackage sourcePackage); - void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters); - void TriggerPerformanceRestored(); - void TriggerPerformanceWarning(); - void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters); - void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters, IPackage sourcePackage); - void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters, DateTime equipmentTimeStamp); - } +public interface IEquipmentDataCollection +{ + IVirtualParameterValuesHandler VirtualParameterValuesHandler { get; } + ISelfDescriptionLookup SelfDescriptionLookup { get; } + EquipmentSelfDescription SelfDescription { get; } + IEnumerable ActiveRequests { get; } + IDataTracingHandler DataTracingHandler { get; } + + ParameterValue CreateParameterValue(EquipmentParameter parameter, object value); + void NotifyDataTracingAvailable(bool isAvailable); + void RegisterChangeDataCollectionHandler(ChangeDataCollectionHandler handler); + void RegisterDataTracingHandler(IDataTracingHandler handler); + void RegisterGetParameterValuesHandler(GetParameterValuesHandler handler); + void RegisterSetParameterValuesHandler(SetParameterValuesHandler handler); + void TriggerDeactivate(DataCollectionRequest deactivateRequest); + void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable parameters); + void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable parameters, IPackage sourcePackage); + void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters); + void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, IPackage sourcePackage); + void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride); + void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); + void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); + void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride); + void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, IPackage sourcePackage); + void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters); + void TriggerPerformanceRestored(); + void TriggerPerformanceWarning(); + void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters); + void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters, IPackage sourcePackage); + void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters, DateTime equipmentTimeStamp); } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/Control/IPackageSource.cs b/Adaptation/Eaf/EquipmentCore/Control/IPackageSource.cs index 2c0371e..86760aa 100644 --- a/Adaptation/Eaf/EquipmentCore/Control/IPackageSource.cs +++ b/Adaptation/Eaf/EquipmentCore/Control/IPackageSource.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.EquipmentCore.Control +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IPackageSource { - public interface IPackageSource - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs b/Adaptation/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs index 9f0b794..468230d 100644 --- a/Adaptation/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs +++ b/Adaptation/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs @@ -2,19 +2,24 @@ using Adaptation.PeerGroup.GCL.Annotations; using System; -namespace Adaptation.Eaf.EquipmentCore.DataCollection.Reporting +namespace Adaptation.Eaf.EquipmentCore.DataCollection.Reporting; + +public class ParameterValue { - public class ParameterValue - { - public ParameterValue(EquipmentParameter definition, object value) { } - public ParameterValue(EquipmentParameter definition, object value, DateTime timestamp) { } - public virtual object Value { get; protected internal set; } - [NotNull] - public EquipmentParameter Definition { get; } - public DateTime Timestamp { get; protected set; } +#pragma warning disable CA1822 +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public ParameterValue(EquipmentParameter definition, object value) { } + public ParameterValue(EquipmentParameter definition, object value, DateTime timestamp) { } + + public virtual object Value { get; protected internal set; } + [NotNull] + public EquipmentParameter Definition { get; } + public DateTime Timestamp { get; protected set; } + + public virtual ParameterValue Clone(EquipmentParameter newDefinition) => throw new NotImplementedException(); + public override string ToString() => base.ToString(); - public virtual ParameterValue Clone(EquipmentParameter newDefinition) { throw new NotImplementedException(); } - public override string ToString() { return base.ToString(); } - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs b/Adaptation/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs index 852fb8d..f9c126d 100644 --- a/Adaptation/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs +++ b/Adaptation/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs @@ -1,24 +1,27 @@ using Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; -namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription +namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription; + +public class EquipmentParameter { - public class EquipmentParameter - { - public EquipmentParameter(EquipmentParameter source, ParameterTypeDefinition typeDefinition) { } - public EquipmentParameter(string name, ParameterTypeDefinition typeDefinition, string description, bool isTransient = false, bool isReadOnly = true) { } - public EquipmentParameter(string id, string name, ParameterTypeDefinition typeDefinition, string description, bool isTransient = false, bool isReadOnly = true) { } - public string Name { get; } - public string Id { get; } - public string Description { get; } - public string SourcePath { get; } - public string SourceEquipment { get; } - public ParameterTypeDefinition TypeDefinition { get; } - public bool IsTransient { get; } - public bool IsReadOnly { get; } +#pragma warning disable CA2254 +#pragma warning disable IDE0060 - public override string ToString() { return base.ToString(); } - public string ToStringWithDetails() { return base.ToString(); } - } + public EquipmentParameter(EquipmentParameter source, ParameterTypeDefinition typeDefinition) { } + public EquipmentParameter(string name, ParameterTypeDefinition typeDefinition, string description, bool isTransient = false, bool isReadOnly = true) { } + public EquipmentParameter(string id, string name, ParameterTypeDefinition typeDefinition, string description, bool isTransient = false, bool isReadOnly = true) { } + + public string Name { get; } + public string Id { get; } + public string Description { get; } + public string SourcePath { get; } + public string SourceEquipment { get; } + public ParameterTypeDefinition TypeDefinition { get; } + public bool IsTransient { get; } + public bool IsReadOnly { get; } + + public override string ToString() => base.ToString(); + public string ToStringWithDetails() => base.ToString(); } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs index a83b45f..726b51a 100644 --- a/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs +++ b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs @@ -1,12 +1,16 @@ -namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes -{ - public class Field - { - public Field(string name, string description, bool canBeNull, ParameterTypeDefinition typeDefinition) { } +namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; + +public class Field +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public Field(string name, string description, bool canBeNull, ParameterTypeDefinition typeDefinition) { } + + public string Name { get; } + public string Description { get; } + public ParameterTypeDefinition TypeDefinition { get; } + public bool CanBeNull { get; } - public string Name { get; } - public string Description { get; } - public ParameterTypeDefinition TypeDefinition { get; } - public bool CanBeNull { get; } - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs index 65ad7dd..00fc42a 100644 --- a/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs +++ b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs @@ -1,12 +1,16 @@ -namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes +namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; + +public abstract class ParameterTypeDefinition { - public abstract class ParameterTypeDefinition - { - public ParameterTypeDefinition(string name, string description) { } - public string Name { get; } - public string Description { get; } +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public ParameterTypeDefinition(string name, string description) { } + + public string Name { get; } + public string Description { get; } + + public override string ToString() => base.ToString(); - public override string ToString() { return base.ToString(); } - } } \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs index 24c5856..fe5fbce 100644 --- a/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs +++ b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs @@ -1,12 +1,16 @@ using System.Collections.Generic; -namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes +namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; + +public class StructuredType : ParameterTypeDefinition { - public class StructuredType : ParameterTypeDefinition - { - public StructuredType(string name, string description, IList fields) : base(name, description) { } +#pragma warning disable CA1822 +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public StructuredType(string name, string description, IList fields) : base(name, description) { } + + public IList Fields { get; } - public IList Fields { get; } - } } \ No newline at end of file diff --git a/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs index 597ace3..70ef834 100644 --- a/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs +++ b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs @@ -1,6 +1,5 @@ -namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation +namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; + +public interface IConfigurationObject { - public interface IConfigurationObject - { - } } \ No newline at end of file diff --git a/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs index 0b772a2..067bf67 100644 --- a/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs +++ b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs @@ -1,26 +1,30 @@ using System; -namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation +namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; + +[System.Runtime.Serialization.DataContractAttribute(IsReference = true)] +public class ModelObjectParameterDefinition : IConfigurationObject { - [System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - public class ModelObjectParameterDefinition : IConfigurationObject - { - public ModelObjectParameterDefinition() { } - public ModelObjectParameterDefinition(string name, ModelObjectParameterType valueType, object defaultValue) { } - public ModelObjectParameterDefinition(string name, Type enumType, object defaultValue) { } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long Id { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual string Name { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual string Value { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual ModelObjectParameterType ValueType { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual string EnumType { get; set; } +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public ModelObjectParameterDefinition() { } + public ModelObjectParameterDefinition(string name, ModelObjectParameterType valueType, object defaultValue) { } + public ModelObjectParameterDefinition(string name, Type enumType, object defaultValue) { } + + [System.Runtime.Serialization.DataMemberAttribute] + public virtual long Id { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual string Name { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual string Value { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual ModelObjectParameterType ValueType { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual string EnumType { get; set; } + + public virtual ModelObjectParameterDefinition Clone() => null; + public virtual bool IsValidValue(string value) => false; - public virtual ModelObjectParameterDefinition Clone() { return null; } - public virtual bool IsValidValue(string value) { return false; } - } } \ No newline at end of file diff --git a/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs index 6f779af..c5a85c2 100644 --- a/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs +++ b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs @@ -1,17 +1,16 @@ -namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation +namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; + +public enum ModelObjectParameterType { - public enum ModelObjectParameterType - { - String = 0, - Bool = 1, - Byte = 2, - SignedByte = 3, - Integer = 4, - UnsignedInteger = 5, - LongInteger = 6, - UnsignedLongInteger = 7, - Double = 8, - Float = 9, - Enum = 10 - } + String = 0, + Bool = 1, + Byte = 2, + SignedByte = 3, + Integer = 4, + UnsignedInteger = 5, + LongInteger = 6, + UnsignedLongInteger = 7, + Double = 8, + Float = 9, + Enum = 10 } \ No newline at end of file diff --git a/Adaptation/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs b/Adaptation/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs index 91493b0..bea5a40 100644 --- a/Adaptation/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs +++ b/Adaptation/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs @@ -1,44 +1,43 @@ using Adaptation.PeerGroup.GCL.SecsDriver; using System; -namespace Adaptation.Eaf.Management.ConfigurationData.Semiconductor.CellInstances -{ - [System.Runtime.Serialization.DataContractAttribute] - public class SecsConnectionConfiguration - { - public SecsConnectionConfiguration() { } +namespace Adaptation.Eaf.Management.ConfigurationData.Semiconductor.CellInstances; - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T6HsmsControlMessage { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T5ConnectionSeperation { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T4InterBlock { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T3MessageReply { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T2Protocol { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T1InterCharacter { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual SerialBaudRate? BaudRate { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual SecsTransportType? PortType { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? Port { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan LinkTestTimer { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual string Host { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? DeviceId { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual HsmsSessionMode? SessionMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual HsmsConnectionMode? ConnectionMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T7ConnectionIdle { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T8NetworkIntercharacter { get; set; } - } +[System.Runtime.Serialization.DataContractAttribute] +public class SecsConnectionConfiguration +{ + public SecsConnectionConfiguration() { } + + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan T6HsmsControlMessage { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan T5ConnectionSeperation { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan T4InterBlock { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan T3MessageReply { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan T2Protocol { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan T1InterCharacter { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual SerialBaudRate? BaudRate { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual SecsTransportType? PortType { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual long? Port { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan LinkTestTimer { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual string Host { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual long? DeviceId { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual HsmsSessionMode? SessionMode { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual HsmsConnectionMode? ConnectionMode { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan T7ConnectionIdle { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual TimeSpan T8NetworkIntercharacter { get; set; } } \ No newline at end of file diff --git a/Adaptation/FileHandlers/Archive/FileRead.cs b/Adaptation/FileHandlers/Archive/FileRead.cs new file mode 100644 index 0000000..5a7643d --- /dev/null +++ b/Adaptation/FileHandlers/Archive/FileRead.cs @@ -0,0 +1,141 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared; +using Adaptation.Shared.Duplicator; +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text.Json; + +namespace Adaptation.FileHandlers.Archive; + +public class FileRead : Shared.FileRead, IFileRead +{ + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new Logistics(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) => Move(extractResults, exception); + + void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); + + string IFileRead.GetEventDescription() + { + string result = _Description.GetEventDescription(); + return result; + } + + List IFileRead.GetHeaderNames() + { + List results = _Description.GetHeaderNames(); + return results; + } + + string[] IFileRead.Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception) + { + string[] results = Move(extractResults, to, from, resolvedFileLocation, exception); + return results; + } + + JsonProperty[] IFileRead.GetDefault() + { + JsonProperty[] results = _Description.GetDefault(this, _Logistics); + return results; + } + + Dictionary IFileRead.GetDisplayNamesJsonElement() + { + Dictionary results = _Description.GetDisplayNamesJsonElement(this); + return results; + } + + List IFileRead.GetDescriptions(IFileRead fileRead, List tests, IProcessData processData) + { + List results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); + return results; + } + + Tuple> IFileRead.GetExtractResult(string reportFullPath, string eventName) + { + Tuple> results; + if (string.IsNullOrEmpty(eventName)) + throw new Exception(); + _ReportFullPath = reportFullPath; + DateTime dateTime = DateTime.Now; + results = GetExtractResult(reportFullPath, dateTime); + if (results.Item3 is null) + results = new Tuple>(results.Item1, Array.Empty(), JsonSerializer.Deserialize("[]"), results.Item4); + if (results.Item3.Length > 0 && _IsEAFHosted) + WritePDSF(this, results.Item3); + UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); + return results; + } + + Tuple> IFileRead.ReExtract() + { + Tuple> results; + List headerNames = _Description.GetHeaderNames(); + Dictionary keyValuePairs = _Description.GetDisplayNamesJsonElement(this); + results = ReExtract(this, headerNames, keyValuePairs); + return results; + } + + void IFileRead.CheckTests(Test[] tests, bool extra) + { + if (_Description is not Description) + throw new Exception(); + } + + void IFileRead.Callback(object state) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); + + private void MoveArchive(DateTime dateTime) + { + if (dateTime == DateTime.MinValue) + { } + string logisticsSequence = _Logistics.Sequence.ToString(); + string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + string weekDirectory = string.Concat(_Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); + string jobIdDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\", _Logistics.JobID); + if (!Directory.Exists(jobIdDirectory)) + _ = Directory.CreateDirectory(jobIdDirectory); + //string destinationArchiveDirectory = string.Concat(jobIdDirectory, @"\!Archive\", weekDirectory); + string destinationArchiveDirectory = string.Concat(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation), @"\Archive\", _Logistics.JobID, @"\", weekDirectory); + if (!Directory.Exists(destinationArchiveDirectory)) + _ = Directory.CreateDirectory(destinationArchiveDirectory); + string[] matchDirectories = new string[] { GetDirectoriesRecursively(jobIdDirectory, logisticsSequence).FirstOrDefault() }; + if ((matchDirectories is null) || matchDirectories.Length != 1) + throw new Exception("Didn't find directory by logistics sequence"); + string sourceDirectory = Path.GetDirectoryName(matchDirectories[0]); + destinationArchiveDirectory = string.Concat(destinationArchiveDirectory, @"\", Path.GetFileName(sourceDirectory)); + Directory.Move(sourceDirectory, destinationArchiveDirectory); + } + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + Tuple> results; + Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); + _Logistics = new Logistics(reportFullPath, pdsf.Item1); + SetFileParameterLotIDToLogisticsMID(); + JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); + List descriptions = GetDuplicatorDescriptions(jsonElements); + Tuple>> tuple = GetTuple(this, descriptions, extra: false); + MoveArchive(dateTime); + results = new Tuple>(pdsf.Item1, tuple.Item1, jsonElements, new List()); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/CellInstanceConnectionName.cs b/Adaptation/FileHandlers/CellInstanceConnectionName.cs new file mode 100644 index 0000000..2f2845e --- /dev/null +++ b/Adaptation/FileHandlers/CellInstanceConnectionName.cs @@ -0,0 +1,39 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; + +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, bool useCyclicalForDescription, bool isEAFHosted) + { + IFileRead result; + bool isDuplicator = cellInstanceConnectionName.StartsWith(cellInstanceName); + if (isDuplicator) + { + string cellInstanceConnectionNameBase = cellInstanceConnectionName.Replace("-", string.Empty); + int hyphens = cellInstanceConnectionName.Length - cellInstanceConnectionNameBase.Length; + result = hyphens switch + { + (int)MET08DDUPSFS6420.Hyphen.IsArchive => new Archive.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted), + (int)MET08DDUPSFS6420.Hyphen.IsDummy => new Dummy.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted), + (int)MET08DDUPSFS6420.Hyphen.IsXToArchive => new ToArchive.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted), + _ => new MET08DDUPSFS6420.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) + }; + } + else + { + result = cellInstanceConnectionName switch + { + nameof(pcl) => new pcl.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted), + _ => throw new Exception(), + }; + } + return result; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/Dummy/FileRead.cs b/Adaptation/FileHandlers/Dummy/FileRead.cs new file mode 100644 index 0000000..b33618f --- /dev/null +++ b/Adaptation/FileHandlers/Dummy/FileRead.cs @@ -0,0 +1,308 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared; +using Adaptation.Shared.Duplicator; +using Adaptation.Shared.Methods; +using Infineon.Monitoring.MonA; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Text.Json; +using System.Threading; + +namespace Adaptation.FileHandlers.Dummy; + +public class FileRead : Shared.FileRead, IFileRead +{ + + private readonly Timer _Timer; + private int _LastDummyRunIndex; + private readonly string[] _CellNames; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new Logistics(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + _LastDummyRunIndex = -1; + List cellNames = new(); + _Timer = new Timer(Callback, null, Timeout.Infinite, Timeout.Infinite); + ModelObjectParameterDefinition[] cellInstanceCollection = GetProperties(cellInstanceConnectionName, modelObjectParameters, "CellInstance.", ".Alias"); + foreach (ModelObjectParameterDefinition modelObjectParameterDefinition in cellInstanceCollection) + cellNames.Add(modelObjectParameterDefinition.Name.Split('.')[1]); + _CellNames = cellNames.ToArray(); + if (Debugger.IsAttached || fileConnectorConfiguration.PreProcessingMode == FileConnectorConfiguration.PreProcessingModeEnum.Process) + Callback(null); + else + { + TimeSpan timeSpan = new(DateTime.Now.AddSeconds(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value).Ticks - DateTime.Now.Ticks); + _ = _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); + } + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) => Move(extractResults, exception); + + void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); + + string IFileRead.GetEventDescription() + { + string result = _Description.GetEventDescription(); + return result; + } + + List IFileRead.GetHeaderNames() + { + List results = _Description.GetHeaderNames(); + return results; + } + + string[] IFileRead.Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception) + { + string[] results = Move(extractResults, to, from, resolvedFileLocation, exception); + return results; + } + + JsonProperty[] IFileRead.GetDefault() + { + JsonProperty[] results = _Description.GetDefault(this, _Logistics); + return results; + } + + Dictionary IFileRead.GetDisplayNamesJsonElement() + { + Dictionary results = _Description.GetDisplayNamesJsonElement(this); + return results; + } + + List IFileRead.GetDescriptions(IFileRead fileRead, List tests, IProcessData processData) + { + List results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); + return results; + } + + Tuple> IFileRead.GetExtractResult(string reportFullPath, string eventName) => throw new Exception(string.Concat("See ", nameof(CallbackFileExists))); + + Tuple> IFileRead.ReExtract() => throw new Exception(string.Concat("See ", nameof(CallbackFileExists))); + + void IFileRead.CheckTests(Test[] tests, bool extra) + { + if (_Description is not Description) + throw new Exception(); + } + + void IFileRead.Callback(object state) => Callback(state); + + private void CallbackInProcessCleared(string sourceArchiveFile, string traceDummyFile, string targetFileLocation, string monARessource, string inProcessDirectory, long sequence, bool warning) + { + const string site = "sjc"; + string stateName = string.Concat("Dummy_", _EventName); + const string monInURL = "http://moninhttp.sjc.infineon.com/input/text"; + MonIn monIn = MonIn.GetInstance(monInURL); + try + { + if (warning) + { + File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Warning.ToString() }); + _ = monIn.SendStatus(site, monARessource, stateName, State.Warning); + for (int i = 1; i < 12; i++) + Thread.Sleep(500); + } + ZipFile.ExtractToDirectory(sourceArchiveFile, inProcessDirectory); + string[] files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.TopDirectoryOnly); + if (files.Length > 250) + throw new Exception("Safety net!"); + foreach (string file in files) + File.SetLastWriteTime(file, new DateTime(sequence)); + if (!_FileConnectorConfiguration.IncludeSubDirectories.Value) + { + foreach (string file in files) + File.Move(file, Path.Combine(targetFileLocation, Path.GetFileName(file))); + } + else + { + string[] directories = Directory.GetDirectories(inProcessDirectory, "*", SearchOption.AllDirectories); + foreach (string directory in directories) + _ = Directory.CreateDirectory(string.Concat(targetFileLocation, directory.Substring(inProcessDirectory.Length))); + foreach (string file in files) + File.Move(file, string.Concat(targetFileLocation, file.Substring(inProcessDirectory.Length))); + } + File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Ok.ToString() }); + _ = monIn.SendStatus(site, monARessource, stateName, State.Ok); + } + catch (Exception exception) + { + string subject = string.Concat("Exception:", _CellInstanceConnectionName); + string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); + try + { _SMTP.SendHighPriorityEmailMessage(subject, body); } + catch (Exception) { } + File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Critical.ToString(), exception.Message, exception.StackTrace }); + _ = monIn.SendStatus(site, monARessource, stateName, State.Critical); + } + } + + private void CallbackFileExists(string sourceArchiveFile, string traceDummyFile, string targetFileLocation, string monARessource, long sequence) + { + string[] files; + bool warning = false; + if (!_DummyRuns.ContainsKey(monARessource)) + _DummyRuns.Add(monARessource, new List()); + if (!_DummyRuns[monARessource].Contains(sequence)) + _DummyRuns[monARessource].Add(sequence); + File.AppendAllLines(traceDummyFile, new string[] { sourceArchiveFile }); + string inProcessDirectory = Path.Combine(_ProgressPath, "Dummy In-Process", sequence.ToString()); + if (!Directory.Exists(inProcessDirectory)) + _ = Directory.CreateDirectory(inProcessDirectory); + files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.AllDirectories); + if (files.Any()) + { + if (files.Length > 250) + throw new Exception("Safety net!"); + try + { + foreach (string file in files) + File.Delete(file); + } + catch (Exception) { } + } + if (_FileConnectorConfiguration.IncludeSubDirectories.Value) + files = Directory.GetFiles(targetFileLocation, "*", SearchOption.AllDirectories); + else + files = Directory.GetFiles(targetFileLocation, "*", SearchOption.TopDirectoryOnly); + foreach (string file in files) + { + if (new FileInfo(file).LastWriteTime.Ticks == sequence) + { + warning = true; + break; + } + } + CallbackInProcessCleared(sourceArchiveFile, traceDummyFile, targetFileLocation, monARessource, inProcessDirectory, sequence, warning); + } + + private string GetCellName(string pathSegment) + { + string result = string.Empty; + foreach (string cellName in _CellNames) + { + if (pathSegment.ToLower().Contains(cellName.ToLower())) + { + result = cellName; + break; + } + } + if (string.IsNullOrEmpty(result)) + { + int count; + List<(string CellName, int Count)> cellNames = new(); + foreach (string cellName in _CellNames) + { + count = 0; + foreach (char @char in cellName.ToLower()) + count += pathSegment.Length - pathSegment.ToLower().Replace(@char.ToString(), string.Empty).Length; + cellNames.Add(new(cellName, count)); + } + result = (from l in cellNames orderby l.CellName.Length, l.Count descending select l.CellName).First(); + } + return result; + } + + private void Callback(object state) + { + try + { + string pathSegment; + string monARessource; + DateTime dateTime = DateTime.Now; + if (!_FileConnectorConfiguration.TargetFileLocation.Contains(_FileConnectorConfiguration.SourceFileLocation)) + throw new Exception("Target must start with source"); + bool check = dateTime.Hour > 7 && dateTime.Hour < 18 && dateTime.DayOfWeek != DayOfWeek.Sunday && dateTime.DayOfWeek != DayOfWeek.Saturday; + if (!_IsEAFHosted || check) + { + string checkSegment; + string checkDirectory; + string sourceFileFilter; + string sourceArchiveFile; + string sourceFileLocation; + string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + string traceDummyDirectory = Path.Combine(Path.GetPathRoot(_TracePath), "TracesDummy", _CellInstanceName, "Source", $"{dateTime:yyyy}___Week_{weekOfYear}"); + if (!Directory.Exists(traceDummyDirectory)) + _ = Directory.CreateDirectory(traceDummyDirectory); + string traceDummyFile = Path.Combine(traceDummyDirectory, $"{dateTime.Ticks} - {_CellInstanceName}.txt"); + File.AppendAllText(traceDummyFile, string.Empty); + if (_FileConnectorConfiguration.SourceFileLocation.EndsWith("\\")) + sourceFileLocation = _FileConnectorConfiguration.SourceFileLocation; + else + sourceFileLocation = string.Concat(_FileConnectorConfiguration.SourceFileLocation, '\\'); + for (int i = 0; i < _FileConnectorConfiguration.SourceFileFilters.Count; i++) + { + _LastDummyRunIndex += 1; + if (_LastDummyRunIndex >= _FileConnectorConfiguration.SourceFileFilters.Count) + _LastDummyRunIndex = 0; + sourceFileFilter = _FileConnectorConfiguration.SourceFileFilters[_LastDummyRunIndex]; + sourceArchiveFile = Path.GetFullPath(string.Concat(sourceFileLocation, sourceFileFilter)); + if (File.Exists(sourceArchiveFile)) + { + checkSegment = _FileConnectorConfiguration.TargetFileLocation.Substring(sourceFileLocation.Length); + checkDirectory = Path.GetDirectoryName(sourceArchiveFile); + for (int z = 0; z < int.MaxValue; z++) + { + if (checkDirectory.Length < sourceFileLocation.Length || !checkDirectory.StartsWith(sourceFileLocation)) + break; + checkDirectory = Path.GetDirectoryName(checkDirectory); + if (Directory.Exists(Path.Combine(checkDirectory, checkSegment))) + { + checkDirectory = Path.Combine(checkDirectory, checkSegment); + break; + } + } + if (!checkDirectory.EndsWith(checkSegment)) + throw new Exception("Could not determine dummy target directory for extract!"); + if (!long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) + throw new Exception("Invalid file name for source archive file!"); + pathSegment = checkDirectory.Substring(sourceFileLocation.Length); + monARessource = GetCellName(pathSegment); + if (string.IsNullOrEmpty(monARessource)) + throw new Exception("Could not determine which cell archive file is associated with!"); + if (_IsEAFHosted) + CallbackFileExists(sourceArchiveFile, traceDummyFile, checkDirectory, monARessource, sequence); + break; + } + } + } + } + catch (Exception exception) + { + string subject = string.Concat("Exception:", _CellInstanceConnectionName); + string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); + try + { _SMTP.SendHighPriorityEmailMessage(subject, body); } + catch (Exception) { } + } + try + { + TimeSpan timeSpan = new(DateTime.Now.AddSeconds(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value).Ticks - DateTime.Now.Ticks); + _ = _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); + } + catch (Exception exception) + { + string subject = string.Concat("Exception:", _CellInstanceConnectionName); + string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); + try + { _SMTP.SendHighPriorityEmailMessage(subject, body); } + catch (Exception) { } + } + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/FileRead.cs b/Adaptation/FileHandlers/FileRead.cs deleted file mode 100644 index 469d25e..0000000 --- a/Adaptation/FileHandlers/FileRead.cs +++ /dev/null @@ -1,300 +0,0 @@ -using Adaptation.Helpers; -using Adaptation.Shared; -using Adaptation.Shared.Metrology; -using log4net; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Text.RegularExpressions; - -namespace Adaptation.FileHandlers -{ - - public partial class FileRead : ILogic - { - - private ConfigData _ConfigData; - - public FileRead() - { - Logistics = new Logistics(); - _Log = LogManager.GetLogger(typeof(FileRead)); - } - - public ILogic ShallowCopy() - { - return (ILogic)MemberwiseClone(); - } - - public void WaitForThread() - { - WaitForThread(thread: null, threadExceptions: null); - } - - public Tuple GetOpenInsightTuple() - { - Tuple restuls = new Tuple(_ConfigData.OpenInsightSiViewer, _ConfigData); - return restuls; - } - - public Tuple> GetExtractResult(string reportFullPath, string eventName) - { - Tuple> results; - _FileParameter.Clear(); - DateTime dateTime = DateTime.Now; - if (_ConfigData.IsEvent && _ConfigData.Duplicator is null) - results = GetExtractResult(reportFullPath); - else if (_ConfigData.Duplicator.HasValue && _ConfigData.Duplicator.Value != ConfigData.Level.IsManualOIEntry) - results = GetDuplicatorExtractResult(reportFullPath, dateTime); - else if (_ConfigData.Duplicator.HasValue && _ConfigData.Duplicator.Value == ConfigData.Level.IsManualOIEntry) - results = _ConfigData.IsManualOIEntry(reportFullPath); - else - throw new Exception(); - if (results.Item2 is null) - results = new Tuple>(results.Item1, JsonSerializer.Deserialize("[]"), results.Item3); - int count = results.Item2.Value.GetArrayLength(); - if (count > 0 && _ConfigData.EafHosted) - WritePDSF(results.Item2.Value); - UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); - return results; - } - - private Tuple> GetExtractResult(string reportFullPath) - { - Tuple> results = new Tuple>(string.Empty, null, new List()); - FileInfo fileInfo = new FileInfo(reportFullPath); - Logistics = new Logistics(ConfigData.NullData, _ConfigData.CellNames, _ConfigData.MesEntities, fileInfo, useSplitForMID: false, fileInfoLength: 50000); - SetFileParameterLotID(Logistics.MID); - if (new FileInfo(reportFullPath).Length < ConfigData.MinFileLength) - results.Item3.Add(fileInfo); - else - { - ProcessData processData = new ProcessData(this, _ConfigData, results.Item3); - if (!(processData.Header is null)) - { - string mid = string.Concat(processData.Header.Reactor, "-", processData.Header.RDS, "-", processData.Header.PSN); - mid = Regex.Replace(mid, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; - Logistics.MID = mid; - SetFileParameterLotID(mid); - Logistics.ProcessJobID = processData.Header.Reactor; - } - if (processData.Header is null || !processData.Details.Any()) - throw new Exception(); - results = processData.GetResults(this, _ConfigData, results.Item3); - } - return results; - } - - private Tuple> GetDuplicatorExtractResult(string reportFullPath, DateTime dateTime) - { - Tuple> results; - Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); - Logistics = new Logistics(reportFullPath, pdsf.Item1); - SetFileParameterLotIDToLogisticsMID(); - JsonElement pdsdBodyValues = ProcessDataStandardFormat.GetArray(pdsf); - results = new Tuple>(pdsf.Item1, pdsdBodyValues, new List()); - List processDataDescriptions = _ConfigData.GetProcessDataDescriptions(pdsdBodyValues); - Dictionary> keyValuePairs = ProcessData.GetKeyValuePairs(_ConfigData, pdsdBodyValues, processDataDescriptions, extra: false); - bool isNotUsedInsightMetrologyViewerAttachments = (!(_Configuration.FileScanningIntervalInSeconds > 0) && _ConfigData.Duplicator.Value == ConfigData.Level.IsXToOpenInsightMetrologyViewerAttachments); - bool isDummyRun = (ConfigData.DummyRuns.Any() && ConfigData.DummyRuns.ContainsKey(Logistics.JobID) && ConfigData.DummyRuns[Logistics.JobID].Any() && (from l in ConfigData.DummyRuns[Logistics.JobID] where l == Logistics.Sequence select 1).Any()); - if (isDummyRun) - { - try - { File.SetLastWriteTime(reportFullPath, dateTime); } - catch (Exception) { } - } - string duplicateDirectory; - string[] segments = Path.GetFileNameWithoutExtension(reportFullPath).Split('_'); - if (_ConfigData.Duplicator.Value == ConfigData.Level.IsXToIQSSi) - duplicateDirectory = string.Concat(_Configuration.TargetFileLocation, @"\ALL"); - else if (_ConfigData.Duplicator.Value != ConfigData.Level.IsXToOpenInsight) - duplicateDirectory = string.Concat(_Configuration.TargetFileLocation, @"\", segments[0]); - else - duplicateDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_Configuration.TargetFileLocation)), @"\Data"); - if (segments.Length > 2) - duplicateDirectory = string.Concat(duplicateDirectory, @"-", segments[2]); - if (!Directory.Exists(duplicateDirectory)) - Directory.CreateDirectory(duplicateDirectory); - if ((isDummyRun || isNotUsedInsightMetrologyViewerAttachments || _Configuration.FileScanningIntervalInSeconds > 0) && _ConfigData.Duplicator.Value != ConfigData.Level.IsXToArchive && _ConfigData.Duplicator.Value != ConfigData.Level.IsArchive) - { - bool ganPPTST = false; - string successDirectory; - if (_ConfigData.Duplicator.Value != ConfigData.Level.IsXToAPC) - successDirectory = string.Empty; - else - { - successDirectory = string.Concat(Path.GetDirectoryName(_Configuration.TargetFileLocation), @"\ViewerPath"); - if (!Directory.Exists(successDirectory)) - Directory.CreateDirectory(successDirectory); - } - CultureInfo cultureInfo = new CultureInfo("en-US"); - Calendar calendar = cultureInfo.Calendar; - List> tuples = new List>(); - string duplicateFile = string.Concat(duplicateDirectory, @"\", Path.GetFileName(reportFullPath)); - string weekOfYear = calendar.GetWeekOfYear(Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - string weekDirectory = string.Concat(Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); - string logisticsSequenceMemoryDirectory = string.Concat(_ConfigData.MemoryPath, @"\", _ConfigData.GetEquipmentType(), @"\Source\", weekDirectory, @"\", Logistics.Sequence); - if (!Directory.Exists(logisticsSequenceMemoryDirectory)) - Directory.CreateDirectory(logisticsSequenceMemoryDirectory); - if (_ConfigData.Duplicator.Value == ConfigData.Level.IsXToAPC) - { - if (!isDummyRun && _ConfigData.EafHosted) - File.Copy(reportFullPath, duplicateFile, overwrite: true); - } - else - { - if (_ConfigData.Duplicator.Value == ConfigData.Level.IsXToOpenInsightMetrologyViewer) - { - List fileReadDescriptions = ProcessData.GetProcessDataFileReadDescriptions(_ConfigData, pdsdBodyValues); - ProcessData.WSRequest wsRequest = new ProcessData.WSRequest(this, fileReadDescriptions); - if (!isDummyRun && _ConfigData.EafHosted) - { - Tuple wsResults = WS.SendData(_ConfigData.OpenInsightMetrogyViewerAPI, wsRequest); - if (!wsResults.Item2.Success) - throw new Exception(wsResults.ToString()); - _Log.Debug(wsResults.Item2.HeaderID); - File.WriteAllText(string.Concat(logisticsSequenceMemoryDirectory, @"\", nameof(WS.Results), ".json"), wsResults.Item1); - } - } - else - { - Test test; - string lines; - IScopeInfo scopeInfo; - foreach (KeyValuePair> keyValuePair in keyValuePairs) - { - test = keyValuePair.Key; - //scopeInfo = new ScopeInfo(this, _ConfigData, test); - if (_ConfigData.Duplicator.Value != ConfigData.Level.IsXToOpenInsight) - scopeInfo = new ScopeInfo(this, _ConfigData, test, _ConfigData.IqsFile, _ConfigData.IqsQueryFilter); - else - scopeInfo = new ScopeInfo(this, _ConfigData, test, _ConfigData.OpenInsightFilePattern, _ConfigData.IqsQueryFilter); - //lines = ProcessDataStandardFormat.GetLines(Logistics, scopeInfo, names, values, dateFormat: "M/d/yyyy hh:mm:ss tt", timeFormat: string.Empty, pairedColumns: ExtractResultPairedColumns); - List fileReadDescriptions = ProcessData.GetProcessDataFileReadDescriptions(_ConfigData, pdsdBodyValues); - ganPPTST = fileReadDescriptions[0].Recipe.Contains("GAN_PPTST"); - lines = ProcessData.GetLines(this, fileReadDescriptions, ganPPTST); - tuples.Add(new Tuple(scopeInfo, lines)); - } - } - if (_ConfigData.Duplicator.Value == ConfigData.Level.IsXToOpenInsightMetrologyViewerAttachments) - { - string[] matchDirectories = Shared1567(reportFullPath, tuples); - if (!isDummyRun && _ConfigData.EafHosted && !isNotUsedInsightMetrologyViewerAttachments) - { - List fileReadDescriptions = ProcessData.GetProcessDataFileReadDescriptions(_ConfigData, pdsdBodyValues); - ProcessData.PostOpenInsightMetrologyViewerAttachments(_Log, _ConfigData, Logistics, dateTime, logisticsSequenceMemoryDirectory, fileReadDescriptions, matchDirectories[0]); - } - } - } - if (_ConfigData.Duplicator.Value != ConfigData.Level.IsXToOpenInsightMetrologyViewer && _ConfigData.Duplicator.Value != ConfigData.Level.IsXToOpenInsightMetrologyViewerAttachments) - { - bool check = false; - if (_ConfigData.Duplicator.Value != ConfigData.Level.IsXToIQSSi && _ConfigData.Duplicator.Value != ConfigData.Level.IsXToIQSGaN) - check = true; - else if (_ConfigData.Duplicator.Value == ConfigData.Level.IsXToIQSSi && !ganPPTST) - check = true; - else if (_ConfigData.Duplicator.Value == ConfigData.Level.IsXToIQSGaN && ganPPTST) - check = true; - //else - // Don't write file(s) //throw new Exception(); - if (check) - Shared0413(dateTime, isDummyRun, successDirectory, duplicateDirectory, tuples, duplicateFile); - } - } - if (_ConfigData.Duplicator.Value == ConfigData.Level.IsXToOpenInsightMetrologyViewerAttachments) - { - string destinationDirectory; - //string destinationDirectory = WriteScopeInfo(_ConfigData.ProgressPath, Logistics, dateTime, duplicateDirectory, tuples); - FileInfo fileInfo = new FileInfo(reportFullPath); - string logisticsSequence = Logistics.Sequence.ToString(); - if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) - File.SetLastWriteTime(reportFullPath, fileInfo.CreationTime); - string jobIdDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_Configuration.TargetFileLocation)), @"\", Logistics.JobID); - if (!Directory.Exists(jobIdDirectory)) - Directory.CreateDirectory(jobIdDirectory); - string[] matchDirectories; - if (!_ConfigData.EafHosted) - matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(reportFullPath)) }; - else - matchDirectories = Directory.GetDirectories(jobIdDirectory, string.Concat(Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly); - if ((matchDirectories is null) || matchDirectories.Length != 1) - throw new Exception("Didn't find directory by logistics sequence"); - destinationDirectory = matchDirectories[0]; - if (isDummyRun) - Shared0607(reportFullPath, duplicateDirectory, logisticsSequence, destinationDirectory); - else - { - List fileReadDescriptions = ProcessData.GetProcessDataFileReadDescriptions(_ConfigData, pdsdBodyValues); - ProcessData.WSRequest wsRequest = new ProcessData.WSRequest(this, fileReadDescriptions); - JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { WriteIndented = true }; - string json = JsonSerializer.Serialize(wsRequest, wsRequest.GetType(), jsonSerializerOptions); - if (_ConfigData.EafHosted) - Shared1277(reportFullPath, destinationDirectory, logisticsSequence, jobIdDirectory, json); - else - { - string jsonFileName = Path.ChangeExtension(reportFullPath, ".json"); - string historicalText = File.ReadAllText(jsonFileName); - if (json != historicalText) - throw new Exception("File doesn't match historical!"); - } - } - } - return results; - } - - private void MoveArchive() - { - CultureInfo cultureInfo = new CultureInfo("en-US"); - Calendar calendar = cultureInfo.Calendar; - string logisticsSequence = Logistics.Sequence.ToString(); - string weekOfYear = calendar.GetWeekOfYear(Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - string weekDirectory = string.Concat(Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); - string jobIdDirectory = string.Concat(_Configuration.TargetFileLocation, @"\", Logistics.JobID); - if (!Directory.Exists(jobIdDirectory)) - Directory.CreateDirectory(jobIdDirectory); - //string destinationArchiveDirectory = string.Concat(jobIdDirectory, @"\!Archive\", weekDirectory); - string destinationArchiveDirectory = string.Concat(Path.GetDirectoryName(_Configuration.TargetFileLocation), @"\Archive\", Logistics.JobID, @"\", weekDirectory); - if (!Directory.Exists(destinationArchiveDirectory)) - Directory.CreateDirectory(destinationArchiveDirectory); - string[] matchDirectories = new string[] { GetDirectoriesRecursively(jobIdDirectory, logisticsSequence).FirstOrDefault() }; - if ((matchDirectories is null) || matchDirectories.Length != 1) - throw new Exception("Didn't find directory by logistics sequence"); - string sourceDirectory = Path.GetDirectoryName(matchDirectories[0]); - destinationArchiveDirectory = string.Concat(destinationArchiveDirectory, @"\", Path.GetFileName(sourceDirectory)); - Directory.Move(sourceDirectory, destinationArchiveDirectory); - } - - public void Move(string reportFullPath, Tuple> extractResults, Exception exception = null) - { - Shared1872(reportFullPath, exception); - bool isErrorFile = !(exception is null); - if (!isErrorFile && _ConfigData.Duplicator.HasValue) - { - if (_ConfigData.Duplicator.Value == ConfigData.Level.IsXToArchive) - Shared0192(reportFullPath); - else if (_ConfigData.EafHosted && _ConfigData.Duplicator.Value == ConfigData.Level.IsArchive) - MoveArchive(); - if (_ConfigData.EafHosted && !string.IsNullOrEmpty(_ConfigData.ProgressPath)) - CreateProgressDirectory(_ConfigData.ProgressPath, Logistics, (int?)_ConfigData.Duplicator, exceptionLines: null); - } - if (!isErrorFile && _ConfigData.Duplicator is null) - WriteIO(reportFullPath); - if (!_ConfigData.EafHosted) - { - object @object = GetFilePathGeneratorInfo(reportFullPath, isErrorFile: false); - if (!(@object is null) && @object is string to) - { - if (to.Contains("%")) - _Log.Debug("Can't debug without EAF Hosting"); - else - Shared1124(reportFullPath, extractResults, to, _Configuration.SourceFileLocation, resolvedFileLocation: string.Empty, exception: null); - } - } - } - - } - -} \ No newline at end of file diff --git a/Adaptation/FileHandlers/FileReadShared.cs b/Adaptation/FileHandlers/FileReadShared.cs deleted file mode 100644 index 1be34c7..0000000 --- a/Adaptation/FileHandlers/FileReadShared.cs +++ /dev/null @@ -1,1041 +0,0 @@ -using Adaptation.Eaf.Core; -using Adaptation.Eaf.EquipmentCore.DataCollection.Reporting; -using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; -using Adaptation.Helpers; -using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; -using Adaptation.Shared; -using Adaptation.Shared.Metrology; -using log4net; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.Json; -using System.Text.Json.Serialization; -using System.Threading; - -namespace Adaptation.FileHandlers -{ - - public partial class FileRead - { - - public Logistics Logistics { get; protected set; } - - private bool _TargetFileLocationOkay; - private bool _ErrorTargetFileLocationOkay; - - private string _OriginalSourceFileLocation; - private string _OriginalTargetFileLocation; - private string _OriginalTarget2FileLocation; - private string _OriginalErrorTargetFileLocation; - -#pragma warning disable CS0169 - private readonly ILog _Log; - private Description _Description; -#pragma warning restore CS0169 - - private Type _ConfigurationType; - private MethodInfo _SetPlaceHolderMethodInfo; - private PropertyInfo _Target2FileLocationPropertyInfo; - private MethodInfo _ResolveSourcePlaceHoldersMethodInfo; - private MethodInfo _ResolveTargetPlaceHoldersMethodInfo; - private MethodInfo _ResolveTarget2PlaceHoldersMethodInfo; - private MethodInfo _ResolveErrorTargetPlaceHoldersMethodInfo; - - private string _LastReportFullPath; - private long _BreakAfterSeconds = 0; - private long _LastTicksDuration = 0; - private Dictionary _FileParameter; - private FileConnectorConfiguration _Configuration; - - public ConfigDataBase GetConfigDataBase(MethodBase methodBase, string cellInstanceName, string equipmentElementName, FileConnectorConfiguration fileConnectorConfiguration, IList modelObjectParameterDefinitions, bool eafHosted) - { - ConfigData result; - _Configuration = fileConnectorConfiguration; - Type type = methodBase.DeclaringType; - string equipmentTypeName = string.Empty; - result = new ConfigData(this, cellInstanceName, equipmentElementName, fileConnectorConfiguration, equipmentTypeName, modelObjectParameterDefinitions, type.FullName, isEAFHosted: true); - _ConfigData = result; - return result; - } - - public string GetTarget2FileLocation() - { - string result; - if (_Target2FileLocationPropertyInfo is null) - _Target2FileLocationPropertyInfo = _ConfigurationType.GetProperty("Target2FileLocation", BindingFlags.Instance | BindingFlags.Public); - if (_Target2FileLocationPropertyInfo is null) - result = string.Empty; - else - { - object @object = _Target2FileLocationPropertyInfo.GetValue(_Configuration); - if (@object is null) - result = string.Empty; - else - result = @object.ToString(); - } - return result; - } - - public void ReflectionCreateSelfDescription(string equipmentElementName, int? input, string cellName, string debugConfig, string[] strings, bool[] booleans, long[] numbers, string[] enums) - { - throw new NotImplementedException("Use V2"); - } - - public ConfigDataBase ReflectionCreateSelfDescriptionV2(string json) - { - ConfigData result; - string cellInstanceName; - string equipmentTypeName; - string cellInstanceConnectionName; - string parameterizedModelObjectDefinitionType; - if (!json.Contains(nameof(cellInstanceName))) - throw new Exception(); - if (!json.Contains(nameof(equipmentTypeName))) - throw new Exception(); - if (!json.Contains(nameof(cellInstanceConnectionName))) - throw new Exception(); - if (!json.Contains(nameof(FileConnectorConfiguration))) - throw new Exception(); - if (!json.Contains(nameof(IList))) - throw new Exception(); - if (!json.Contains(nameof(parameterizedModelObjectDefinitionType))) - throw new Exception(); - MethodBase methodBase = new StackFrame().GetMethod(); - JsonElement jsonElement = JsonSerializer.Deserialize(json); - cellInstanceName = jsonElement.GetProperty(nameof(cellInstanceName)).ToString(); - equipmentTypeName = jsonElement.GetProperty(nameof(equipmentTypeName)).ToString(); - cellInstanceConnectionName = jsonElement.GetProperty(nameof(cellInstanceConnectionName)).ToString(); - JsonElement fileConnectorConfigurationJsonElement = jsonElement.GetProperty(nameof(FileConnectorConfiguration)); - parameterizedModelObjectDefinitionType = jsonElement.GetProperty(nameof(parameterizedModelObjectDefinitionType)).ToString(); - if (fileConnectorConfigurationJsonElement.ValueKind != JsonValueKind.Object) - throw new Exception(); - JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } }; - FileConnectorConfiguration fileConnectorConfiguration = JsonSerializer.Deserialize(fileConnectorConfigurationJsonElement.ToString(), jsonSerializerOptions); - _Configuration = fileConnectorConfiguration; - JsonElement modelObjectParameterDefinitionJsonElement = jsonElement.GetProperty(nameof(IList)); - if (modelObjectParameterDefinitionJsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - IList modelObjectParameterDefinitions = JsonSerializer.Deserialize>(modelObjectParameterDefinitionJsonElement.ToString(), jsonSerializerOptions); -#if (false) - FileConnectorConfiguration fileConnectorConfigurationOld = GetFileConnectorConfiguration(strings, booleans, numbers, enums); - jsonSerializerOptions = new JsonSerializerOptions { WriteIndented = true }; - string @new = JsonSerializer.Serialize(fileConnectorConfiguration, fileConnectorConfiguration.GetType(), jsonSerializerOptions); - string old = JsonSerializer.Serialize(fileConnectorConfigurationOld, fileConnectorConfiguration.GetType(), jsonSerializerOptions); - if (@new != old) - throw new Exception(); -#endif - if (!(Backbone.Instance is null)) - { - Type type = Backbone.Instance.GetType(); - PropertyInfo propertyInfo = type.GetProperty(nameof(Backbone.Instance.CellName)); - if (!(propertyInfo is null)) - { - MethodInfo methodInfo = propertyInfo.GetSetMethod(nonPublic: true); - if (!(methodInfo is null)) - methodInfo.Invoke(Backbone.Instance, new object[] { cellInstanceName }); - } - } - _Configuration = fileConnectorConfiguration; - result = new ConfigData(this, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, modelObjectParameterDefinitions, parameterizedModelObjectDefinitionType, isEAFHosted: false); - _ConfigData = result; - _Description = new Description(this, result, equipmentControl: null); - Shared0749(); - _FileParameter = new Dictionary(); - Shared1301(_FileParameter, fileConnectorConfiguration); - return result; - } - - public object GetFilePathGeneratorInfo(string reportFullPath, bool isErrorFile) - { - string result; - if (!_Configuration.TargetFileLocation.EndsWith(Path.DirectorySeparatorChar.ToString())) - result = _Configuration.TargetFileLocation; - else - result = Path.GetDirectoryName(_Configuration.TargetFileLocation); - foreach (KeyValuePair keyValuePair in _FileParameter) - result = result.Replace(string.Concat('%', keyValuePair.Key, '%'), keyValuePair.Value); - return result; - } - - private void TriggerEvents(string reportFullPath, Tuple> extractResults) - { - List parameters; - int count = extractResults.Item2.Value.GetArrayLength(); - for (int i = 0; i < count; i++) - { - _Log.Debug(string.Concat("TriggerEvent - {", reportFullPath, "} ", i, " of ", count)); - parameters = _Description.GetParameterValues(this, null, extractResults.Item2.Value, i); -#if (false) - if (!(_EquipmentEvent is null)) - Equipment.DataCollection.TriggerEvent(_EquipmentEvent, parameters); -#endif - if (_ConfigData.UseCyclicalForDescription) - break; - } - if (_ConfigData.IsDatabaseExportToIPDSF && count > 0) - { - _Log.Debug(string.Concat("TriggerEvent - {", reportFullPath, "} ", null, " of ", count)); - parameters = _Description.GetParameterValues(this, null, extractResults.Item2.Value, null); -#if (false) - if (!(_EquipmentEvent is null)) - Equipment.DataCollection.TriggerEvent(_EquipmentEvent, parameters); -#endif - } - } - - public Tuple> ReExtract(string searchDirectory, string sourceFileFilter) - { - Tuple> results; - if (!Directory.Exists(searchDirectory)) - results = null; - else - { - string[] segments; - string[] matches = null; - foreach (string subSourceFileFilter in sourceFileFilter.Split('|')) - { - segments = subSourceFileFilter.Split('\\'); - if (_Configuration.IncludeSubDirectories.Value) - matches = Directory.GetFiles(searchDirectory, segments.Last(), SearchOption.AllDirectories); - else - matches = Directory.GetFiles(searchDirectory, segments.Last(), SearchOption.TopDirectoryOnly); - if (matches.Any()) - break; - } - if (matches is null || !matches.Any()) - results = null; - else - { - string reportFullPath = matches[0]; - results = GetExtractResult(reportFullPath, Description.FileFound); - if (!_ConfigData.EafHosted) - TriggerEvents(Logistics.ReportFullPath, results); - } - } - return results; - } - - public void SetTarget2FileLocation(string value) - { - if (_Target2FileLocationPropertyInfo is null) - _Target2FileLocationPropertyInfo = _ConfigurationType.GetProperty("Target2FileLocation", BindingFlags.Instance | BindingFlags.Public); - if (!(_Target2FileLocationPropertyInfo is null)) - _Target2FileLocationPropertyInfo.SetValue(_Configuration, value); - } - - public void ConfigurationRestore() - { - _Configuration.SourceFileLocation = _OriginalSourceFileLocation; - _Configuration.TargetFileLocation = _OriginalTargetFileLocation; - SetTarget2FileLocation(_OriginalTarget2FileLocation); - _Configuration.ErrorTargetFileLocation = _OriginalErrorTargetFileLocation; - } - - public string GetConfigurationSourceFileLocation() - { - return _Configuration.SourceFileLocation; - } - - public string GetConfigurationTargetFileLocation() - { - return _Configuration.TargetFileLocation; - } - - public string GetConfigurationTargetFileName() - { - return _Configuration.TargetFileName; - } - - public string GetConfigurationTarget2FileLocation() - { - return GetTarget2FileLocation(); - } - - public string GetConfigurationErrorTargetFileLocation() - { - return _Configuration.ErrorTargetFileLocation; - } - - public void SetPlaceHolder(string reportFullPath, string key, string value) - { - if (!string.IsNullOrEmpty(reportFullPath) && _LastReportFullPath != reportFullPath) - _LastReportFullPath = reportFullPath; - if (_SetPlaceHolderMethodInfo is null) - _SetPlaceHolderMethodInfo = _ConfigurationType.GetMethod(nameof(this.SetPlaceHolder)); - object @object = _SetPlaceHolderMethodInfo.Invoke(_Configuration, new object[] { key, value }); - if (!_FileParameter.ContainsKey(key)) - _FileParameter[key] = string.Empty; - _FileParameter[key] = value; - } - - public string ResolveSourcePlaceHolders(string reportFullPath, bool createDirectory = true) - { - string result; - if (!string.IsNullOrEmpty(reportFullPath) && _LastReportFullPath != reportFullPath) - _LastReportFullPath = reportFullPath; - _FileParameter.Clear(); - if (_ResolveSourcePlaceHoldersMethodInfo is null) - _ResolveSourcePlaceHoldersMethodInfo = _ConfigurationType.GetMethod(nameof(this.ResolveSourcePlaceHolders)); - if (_ResolveSourcePlaceHoldersMethodInfo is null) - result = string.Empty; - else - { - object @object = _ResolveSourcePlaceHoldersMethodInfo.Invoke(_Configuration, new object[] { createDirectory }); - if (@object is null) - result = string.Empty; - else - result = @object.ToString(); - } - return result; - } - - public string ResolveTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "") - { - string result; - if (!string.IsNullOrEmpty(reportFullPath) && _LastReportFullPath != reportFullPath) - _LastReportFullPath = reportFullPath; - if (!string.IsNullOrEmpty(reportFullPath) || !string.IsNullOrEmpty(_LastReportFullPath)) - { - //bool isErrorFile = false; - //Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator filePathGenerator; - //if (!string.IsNullOrEmpty(reportFullPath)) - // filePathGenerator = new Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator(_Configuration, reportFullPath, isErrorFile, _FileParameter); - //else if (!string.IsNullOrEmpty(_LastReportFullPath)) - // filePathGenerator = new Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator(_Configuration, _LastReportFullPath, isErrorFile, _FileParameter); - //else - // throw new Exception(); - //result = filePathGenerator.GetTargetFolder(); - } - _FileParameter.Clear(); - if (_ResolveTargetPlaceHoldersMethodInfo is null) - _ResolveTargetPlaceHoldersMethodInfo = _ConfigurationType.GetMethod(nameof(this.ResolveTargetPlaceHolders)); - if (_ResolveTargetPlaceHoldersMethodInfo is null) - result = string.Empty; - else - { - object @object = _ResolveTargetPlaceHoldersMethodInfo.Invoke(_Configuration, new object[] { createDirectory, fileFoundPath }); - if (@object is null) - result = string.Empty; - else - result = @object.ToString(); - } - return result; - } - - public string ResolveTarget2PlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "") - { - string result; - if (!string.IsNullOrEmpty(reportFullPath) && _LastReportFullPath != reportFullPath) - _LastReportFullPath = reportFullPath; - _FileParameter.Clear(); - if (_ResolveTarget2PlaceHoldersMethodInfo is null) - _ResolveTarget2PlaceHoldersMethodInfo = _ConfigurationType.GetMethod(nameof(this.ResolveTarget2PlaceHolders)); - if (_ResolveTarget2PlaceHoldersMethodInfo is null) - result = string.Empty; - else - { - object @object = _ResolveTarget2PlaceHoldersMethodInfo.Invoke(_Configuration, new object[] { createDirectory, fileFoundPath }); - if (@object is null) - result = string.Empty; - else - result = @object.ToString(); - } - return result; - } - - public string ResolveErrorTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "") - { - string result; - if (!string.IsNullOrEmpty(reportFullPath) && _LastReportFullPath != reportFullPath) - _LastReportFullPath = reportFullPath; - if (!string.IsNullOrEmpty(reportFullPath) || !string.IsNullOrEmpty(_LastReportFullPath)) - { - //bool isErrorFile = true; - //Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator filePathGenerator; - //if (!string.IsNullOrEmpty(reportFullPath)) - // filePathGenerator = new Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator(_Configuration, reportFullPath, isErrorFile, _FileParameter); - //else if (!string.IsNullOrEmpty(_LastReportFullPath)) - // filePathGenerator = new Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator(_Configuration, _LastReportFullPath, isErrorFile, _FileParameter); - //else - // throw new Exception(); - //result = filePathGenerator.GetTargetFolder(); - } - _FileParameter.Clear(); - if (_ResolveErrorTargetPlaceHoldersMethodInfo is null) - _ResolveErrorTargetPlaceHoldersMethodInfo = _ConfigurationType.GetMethod(nameof(this.ResolveErrorTargetPlaceHolders)); - if (_ResolveErrorTargetPlaceHoldersMethodInfo is null) - result = string.Empty; - else - { - object @object = _ResolveErrorTargetPlaceHoldersMethodInfo.Invoke(_Configuration, new object[] { createDirectory, fileFoundPath }); - if (@object is null) - result = string.Empty; - else - result = @object.ToString(); - } - return result; - } - - public string GetReportFullPath(Dictionary keyValuePairs) - { - string result; - if (keyValuePairs is null || !keyValuePairs.Any()) - result = string.Empty; - else - { - string key; - key = "Param1"; - Dictionary eventDataList; - if (!keyValuePairs.ContainsKey(key)) - eventDataList = keyValuePairs; - else - eventDataList = (Dictionary)keyValuePairs[key]; - key = "InputFileName"; - if (!eventDataList.ContainsKey(key)) - result = string.Empty; - else - result = eventDataList[key].ToString(); - } - return result; - } - - public void SetFileParameter(string key, string value) - { - if (_Configuration is null || _Configuration.TargetFileLocation.Contains(string.Concat("%", key, "%")) || _Configuration.ErrorTargetFileLocation.Contains(string.Concat("%", key, "%")) || _Configuration.TargetFileName.Contains(string.Concat("%", key, "%")) || _Configuration.ErrorTargetFileName.Contains(string.Concat("%", key, "%"))) - { - if (_FileParameter.ContainsKey(key)) - _FileParameter[key] = value; - else - _FileParameter.Add(key, value); - } - } - - public 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); - } - - public 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); - } - - public void SetFileParameterSystemDateTimeToLogisticsSequence() - { - string key = "SystemDateTime"; - string value = string.Concat(DateTime.Now.ToString("hh;mm;ss_tt_"), Logistics.Sequence); - SetFileParameter(key, value); - } - - private void UpdateLastTicksDuration(long ticksDuration) - { - if (ticksDuration < 50000000) - ticksDuration = 50000000; - _LastTicksDuration = (long)Math.Ceiling(ticksDuration * .667); - } - - private string GetTupleFile(Logistics logistics, IScopeInfo scopeInfo, string duplicateDirectory) - { - string result; - string rds; - string dateValue; - string datePlaceholder; - string[] segments = logistics.MID.Split('-'); - if (segments.Length < 2) - rds = "%RDS%"; - else - rds = segments[1]; - segments = scopeInfo.FileName.Split(new string[] { "DateTime:" }, StringSplitOptions.RemoveEmptyEntries); - if (segments.Length == 0) - result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileNameWithoutExtension.Replace("%RDS%", rds)); - else - { - datePlaceholder = "%DateTime%"; - segments = segments[1].Split('%'); - dateValue = logistics.DateTimeFromSequence.ToString(segments[0]); - foreach (string segment in scopeInfo.FileName.Split('%')) - { - if (!segment.Contains(segments[0])) - continue; - datePlaceholder = string.Concat('%', segment, '%'); - } - result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileName.Replace("%RDS%", rds).Replace(datePlaceholder, dateValue)); - } - if (result.Contains('%')) - throw new Exception("Placeholder exists!"); - return result; - } - - private void WaitForFileConsumption(string sourceDirectoryCloaking, Logistics logistics, DateTime dateTime, string successDirectory, string duplicateDirectory, string duplicateFile, List> tuples) - { - bool check; - long preWait; - string tupleFile; - List consumedFileIndices = new List(); - List duplicateFiles = new List(); - bool moreThanAnHour = (_BreakAfterSeconds > 3600); - StringBuilder stringBuilder = new StringBuilder(); - long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks; - if (moreThanAnHour) - preWait = dateTime.AddSeconds(30).Ticks; - else - preWait = dateTime.AddTicks(_LastTicksDuration).Ticks; - if (!tuples.Any()) - duplicateFiles.Add(duplicateFile); - string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath); - string successFile = string.Concat(successDirectory, @"\", Path.GetFileName(logistics.ReportFullPath)); - foreach (Tuple tuple in tuples) - { - if (tuple.Item1.FileName.StartsWith(@"\")) - tupleFile = tuple.Item1.FileName; - else if (!tuple.Item1.FileName.Contains('%')) - tupleFile = string.Concat(duplicateDirectory, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc"); - else - tupleFile = GetTupleFile(logistics, tuple.Item1, duplicateDirectory); - duplicateFiles.Add(tupleFile); - File.WriteAllText(tupleFile, tuple.Item2); - } - for (short i = 0; i < short.MaxValue; i++) - { - if (DateTime.Now.Ticks > preWait) - break; - Thread.Sleep(500); - } - 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])) - 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(500); - } - } - } - - private IEnumerable GetDirectoriesRecursively(string path, string directoryNameSegment = null) - { - Queue queue = new Queue(); - queue.Enqueue(path); - while (queue.Count > 0) - { - path = queue.Dequeue(); - foreach (string subDirectory in Directory.GetDirectories(path)) - { - queue.Enqueue(subDirectory); - if (string.IsNullOrEmpty(directoryNameSegment) || Path.GetFileName(subDirectory).Contains(directoryNameSegment)) - yield return subDirectory; - } - } - } - - private string GetProcessedDirectory(string progressPath, Logistics logistics, DateTime dateTime, string duplicateDirectory) - { - string result = duplicateDirectory; - string logisticsSequence = logistics.Sequence.ToString(); - string[] matchDirectories; - if (!_ConfigData.EafHosted) - matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(logistics.ReportFullPath)) }; - else - matchDirectories = new string[] { GetDirectoriesRecursively(Path.GetDirectoryName(progressPath), logisticsSequence).FirstOrDefault() }; - if (matchDirectories.Length == 0 || string.IsNullOrEmpty(matchDirectories[0])) - matchDirectories = Directory.GetDirectories(duplicateDirectory, string.Concat('*', logisticsSequence, '*'), SearchOption.AllDirectories); - if ((matchDirectories is null) || matchDirectories.Length != 1) - throw new Exception("Didn't find directory by logistics sequence"); - if (!matchDirectories[0].Contains("_processed")) - { - result = string.Concat(matchDirectories[0].Split(new string[] { logisticsSequence }, StringSplitOptions.None)[0], logistics.DateTimeFromSequence.ToString("yyyy-MM-dd_hh;mm_tt_"), dateTime.Ticks - logistics.Sequence, "_processed"); - Directory.Move(matchDirectories[0], result); - result = string.Concat(result, @"\", logistics.Sequence); - if (!Directory.Exists(result)) - Directory.CreateDirectory(result); - } - return result; - } - - private string WriteScopeInfo(string progressPath, Logistics logistics, DateTime dateTime, string duplicateDirectory, List> tuples) - { - string result = GetProcessedDirectory(progressPath, logistics, dateTime, duplicateDirectory); - string tupleFile; - string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath); - string duplicateFile = string.Concat(result, @"\", fileName, ".pdsf"); - foreach (Tuple tuple in tuples) - { - if (tuple.Item1.FileName.StartsWith(@"\")) - tupleFile = tuple.Item1.FileName; - else - tupleFile = string.Concat(result, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc"); - File.WriteAllText(tupleFile, tuple.Item2); - } - File.Copy(logistics.ReportFullPath, duplicateFile, overwrite: true); - return result; - } - - private void CreateProgressDirectory(string progressPath, Logistics logistics, int? duplicator, string[] exceptionLines) - { - string progressDirectory; - StringBuilder stringBuilder = new StringBuilder(); - if (duplicator is null || duplicator.Value == 0) - progressDirectory = string.Concat(progressPath, @"\", ProcessDataStandardFormat.EquipmentIntegration()); - else - { - stringBuilder.Clear(); - for (int i = 0; i < duplicator.Value; i++) - { - if (i > 0 && (i % 2) == 0) - stringBuilder.Append(' '); - stringBuilder.Append('-'); - } - progressDirectory = string.Concat(progressPath, @"\", (duplicator.Value + 1).ToString().PadLeft(2, '0'), " ", stringBuilder).Trim(); - } - DateTime dateTime = DateTime.Now; - CultureInfo cultureInfo = new CultureInfo("en-US"); - Calendar calendar = cultureInfo.Calendar; - string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - progressDirectory = string.Concat(progressDirectory, @"\", dateTime.ToString("yyyy"), "_Week_", weekOfYear, @"\", logistics.MID, "_", logistics.Sequence, "_", DateTime.Now.Ticks - logistics.Sequence); - if (!Directory.Exists(progressDirectory)) - Directory.CreateDirectory(progressDirectory); - if (!(exceptionLines is null)) - { - string fileName = string.Concat(progressDirectory, @"\readme.txt"); - try - { File.WriteAllLines(fileName, exceptionLines); } - catch (Exception) { } - } - } - - private void Shared0192(string reportFullPath) - { - if (!string.IsNullOrEmpty(reportFullPath)) - { - FileInfo fileInfo = new FileInfo(reportFullPath); - if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) - File.SetLastWriteTime(reportFullPath, fileInfo.CreationTime); - } - } - - public void Shared0231(List directories) - { - if (_Configuration.PostProcessingMode != FileConnectorConfiguration.PostProcessingModeEnum.Copy) - { - foreach (string directory in (from l in directories orderby l.Split('\\').Length descending select l).Distinct()) - { - if (Directory.Exists(directory) && !Directory.GetFiles(directory).Any()) - Directory.Delete(directory); - } - } - } - - private void WriteIO(string reportFullPath) - { - if (!_ConfigData.IsSourceTimer && !_ConfigData.IsDatabaseExportToIPDSF) - { - string fileName = string.Concat(reportFullPath, ".IO"); - if (!(_Configuration is null) && _Configuration.PostProcessingMode == FileConnectorConfiguration.PostProcessingModeEnum.Copy) - File.WriteAllLines(fileName, new string[] { _Configuration.TargetFileName, Logistics.Sequence.ToString() }); - } - } - - private void Shared0413(DateTime dateTime, bool isDummyRun, string successDirectory, string duplicateDirectory, List> tuples, string duplicateFile) - { - if (!isDummyRun && _ConfigData.EafHosted) - WaitForFileConsumption(_Configuration.SourceDirectoryCloaking, Logistics, dateTime, successDirectory, duplicateDirectory, duplicateFile, tuples); - else - { - long breakAfter = DateTime.Now.AddSeconds(_Configuration.ConnectionRetryInterval.Value).Ticks; - for (short i = 0; i < short.MaxValue; i++) - { - if (!_ConfigData.EafHosted || DateTime.Now.Ticks > breakAfter) - break; - Thread.Sleep(500); - } - } - } - - public void Shared0449(string to, string[] exceptionLines) - { - if (_ConfigData.Duplicator.HasValue) - CreateProgressDirectory(_ConfigData.ProgressPath, Logistics, (int?)_ConfigData.Duplicator, exceptionLines); - else - { - 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); } - } - } - - private static void Shared0607(string reportFullPath, string duplicateDirectory, string logisticsSequence, string destinationDirectory) - { - if (destinationDirectory == duplicateDirectory) - throw new Exception("Check Target File Folder for %LotIDWithLogisticsSequence%_in process on CI (not Duplicator)"); - if (destinationDirectory.EndsWith(logisticsSequence)) - destinationDirectory = Path.GetDirectoryName(destinationDirectory); - string[] deleteFiles = Directory.GetFiles(destinationDirectory, "*", SearchOption.AllDirectories); - if (deleteFiles.Length > 250) - throw new Exception("Safety net!"); - foreach (string file in deleteFiles) - File.Delete(file); - Directory.Delete(destinationDirectory, recursive: true); - File.Delete(reportFullPath); - } - - public void Shared0749() - { - long breakAfterSeconds; - if (_Configuration is null) - breakAfterSeconds = 360; - else - { - if (_Configuration.FileScanningOption == FileConnectorConfiguration.FileScanningOptionEnum.TimeBased) - breakAfterSeconds = 360; - else - breakAfterSeconds = Math.Abs(_Configuration.FileScanningIntervalInSeconds.Value); - } - _BreakAfterSeconds = breakAfterSeconds; - UpdateLastTicksDuration(breakAfterSeconds * 10000000); - if (_ConfigData.Duplicator.HasValue) - { - if (string.IsNullOrEmpty(_Configuration.TargetFileLocation) || string.IsNullOrEmpty(_Configuration.ErrorTargetFileLocation)) - throw new Exception("_Configuration is empty?"); - if (_Configuration.TargetFileLocation.Contains('%') || _Configuration.ErrorTargetFileLocation.Contains('%')) - throw new Exception("_Configuration is incorrect for a duplicator!"); - if (!(_Configuration is null)) - { - if (string.IsNullOrEmpty(_Configuration.SourceDirectoryCloaking)) - throw new Exception("SourceDirectoryCloaking is empty?"); - if (!_Configuration.SourceDirectoryCloaking.StartsWith("~")) - throw new Exception("SourceDirectoryCloaking is incorrect for a duplicator!"); - } - } - } - - public string[] Shared1124(string reportFullPath, Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception = null) - { - string[] results; - bool isErrorFile = !(exception is null); - if (!to.EndsWith(@"\")) - string.Concat(to, @"\"); - if (!isErrorFile) - results = new string[] { }; - else - { - results = new string[] { Logistics.Sequence.ToString(), reportFullPath, from, resolvedFileLocation, to, string.Empty, string.Empty, exception.Message, string.Empty, string.Empty, exception.StackTrace }; - Shared0449(to, results); - } - if (!(extractResults is null) && !(extractResults.Item3 is null) && extractResults.Item3.Any()) - { - string itemFile; - List directories = new List(); - foreach (FileInfo sourceFile in extractResults.Item3) - { - if (sourceFile.FullName != reportFullPath) - { - itemFile = sourceFile.FullName.Replace(from, to); - Shared1880(reportFullPath, itemFile, directories, sourceFile, isErrorFile); - } - else if (!isErrorFile && !(Logistics is null)) - Shared1811(to, sourceFile); - } - Shared0231(directories); - } - return results; - } - - private void WritePDSF(JsonElement jsonElement) - { - string directory; - string eventName = _ConfigData.GetEventName(); - string equipmentType = _ConfigData.GetEquipmentType(); - if (_ConfigData.EquipmentConnection is null || _ConfigData.EquipmentConnection.Value == _ConfigData.EquipmentType) - directory = Path.Combine(_ConfigData.TracePath, equipmentType, "Source", _ConfigData.CellName, _ConfigData.EquipmentElementName); - else - directory = Path.Combine(_ConfigData.VillachPath, equipmentType, "Target"); - if (!Directory.Exists(directory)) - Directory.CreateDirectory(directory); - string file = Path.Combine(directory, string.Concat(Logistics.MesEntity, "_", Logistics.Sequence, ".ipdsf")); - string lines = ProcessDataStandardFormat.GetPDSFText(this, eventName, equipmentType, jsonElement, logisticsText: string.Empty); - File.WriteAllText(file, lines); - if (Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600) - { - try - { File.SetLastWriteTime(file, Logistics.DateTimeFromSequence); } - catch (Exception) { } - } - } - - private void Shared1277(string reportFullPath, string destinationDirectory, string logisticsSequence, string jobIdDirectory, string json) - { - string ecCharacterizationSi = Path.GetDirectoryName(Path.GetDirectoryName(jobIdDirectory)); - string destinationJobIdDirectory = string.Concat(ecCharacterizationSi, @"\Processed\", Logistics.JobID); - if (!Directory.Exists(destinationJobIdDirectory)) - Directory.CreateDirectory(destinationJobIdDirectory); - destinationJobIdDirectory = string.Concat(destinationJobIdDirectory, @"\", Path.GetFileName(destinationDirectory).Split(new string[] { logisticsSequence }, StringSplitOptions.None)[0], Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd_hh;mm_tt_"), DateTime.Now.Ticks - Logistics.Sequence); - string sequenceDirectory = string.Concat(destinationJobIdDirectory, @"\", logisticsSequence); - string jsonFileName = string.Concat(sequenceDirectory, @"\", Path.GetFileNameWithoutExtension(reportFullPath), ".json"); - Directory.Move(destinationDirectory, destinationJobIdDirectory); - if (!Directory.Exists(sequenceDirectory)) - Directory.CreateDirectory(sequenceDirectory); - File.Copy(reportFullPath, string.Concat(sequenceDirectory, @"\", Path.GetFileName(reportFullPath)), overwrite: true); - File.WriteAllText(jsonFileName, json); - } - - public void Shared1301(Dictionary fileParameter, FileConnectorConfiguration configuration) - { - if (fileParameter is null) - throw new Exception("File Parameter is null?"); - _FileParameter = fileParameter; - _LastReportFullPath = string.Empty; - _TargetFileLocationOkay = true; - _ErrorTargetFileLocationOkay = true; - _ConfigurationType = configuration.GetType(); - _OriginalSourceFileLocation = configuration.SourceFileLocation; - _OriginalTargetFileLocation = configuration.TargetFileLocation; - _OriginalTarget2FileLocation = GetTarget2FileLocation(); - _OriginalErrorTargetFileLocation = configuration.ErrorTargetFileLocation; - if (_TargetFileLocationOkay) - { } - if (_ErrorTargetFileLocationOkay) - { } - } - - private string[] Shared1567(string reportFullPath, List> tuples) - { - string[] results; - string historicalText; - string logisticsSequence = Logistics.Sequence.ToString(); - string jobIdDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_Configuration.TargetFileLocation)), @"\", Logistics.JobID); - if (!Directory.Exists(jobIdDirectory)) - Directory.CreateDirectory(jobIdDirectory); - string[] matchDirectories; - if (!_ConfigData.EafHosted) - matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(reportFullPath)) }; - else - matchDirectories = Directory.GetDirectories(jobIdDirectory, string.Concat(Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly); - if ((matchDirectories is null) || matchDirectories.Length != 1) - throw new Exception("Didn't find directory by logistics sequence"); - string fileName = Path.GetFileNameWithoutExtension(reportFullPath); - string sequenceDirectory = string.Concat(matchDirectories[0], @"\", logisticsSequence); - if (!Directory.Exists(sequenceDirectory)) - Directory.CreateDirectory(sequenceDirectory); - foreach (Tuple tuple in tuples) - { - fileName = string.Concat(sequenceDirectory, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc"); - if (_ConfigData.EafHosted) - File.WriteAllText(fileName, tuple.Item2); - else - { - historicalText = File.ReadAllText(fileName); - if (tuple.Item2 != historicalText) - throw new Exception("File doesn't match historical!"); - } - } - results = matchDirectories; - return results; - } - - public void Shared1811(string to, FileInfo sourceFile) - { - if (_ConfigData.Duplicator is null && _Configuration.SourceFileFilter != "*" && sourceFile.Exists && sourceFile.Length < ConfigData.MinFileLength) - { - string directoryName = Path.GetFileName(to); - string jobIdDirectory = Path.GetDirectoryName(to); - CultureInfo cultureInfo = new CultureInfo("en-US"); - Calendar calendar = cultureInfo.Calendar; - DateTime dateTime = DateTime.Now.AddMinutes(-15); - string weekOfYear = calendar.GetWeekOfYear(Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - string weekDirectory = string.Concat(Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); - string destinationDirectory = string.Concat(jobIdDirectory, @"\_ Ignore 100 bytes\", weekDirectory, @"\", directoryName); - if (!Directory.Exists(destinationDirectory)) - Directory.CreateDirectory(destinationDirectory); - File.Move(sourceFile.FullName, string.Concat(destinationDirectory, @"\", sourceFile.Name)); - try - { - string[] checkDirectories = Directory.GetDirectories(jobIdDirectory, "*", SearchOption.TopDirectoryOnly); - foreach (string checkDirectory in checkDirectories) - { - if (!checkDirectory.Contains("_")) - continue; - if (Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly).Any()) - continue; - if (Directory.GetFiles(checkDirectory, "*", SearchOption.TopDirectoryOnly).Any()) - continue; - if (Directory.GetDirectories(checkDirectory, "*", SearchOption.AllDirectories).Any()) - continue; - if (Directory.GetFiles(checkDirectory, "*", SearchOption.AllDirectories).Any()) - continue; - if (new DirectoryInfo(checkDirectory).CreationTime > dateTime) - continue; - Directory.Delete(checkDirectory, recursive: false); - } - } - catch (Exception) { throw; } - } - } - - private void Shared1872(string reportFullPath, Exception exception) - { - if (!string.IsNullOrEmpty(reportFullPath) && !(exception is null)) - { - if (!(_Configuration is null) && _ConfigData.Duplicator.HasValue) - try - { File.WriteAllLines(string.Concat(_Configuration.ErrorTargetFileLocation, @"\", Path.GetFileNameWithoutExtension(reportFullPath), ".err"), new string[] { Logistics.Sequence.ToString(), exception.Message, string.Empty, string.Empty, exception.StackTrace }); } - catch (Exception) { } - if (!_ConfigData.IsSourceTimer && !_ConfigData.IsDatabaseExportToIPDSF) - { - string fileName = string.Concat(reportFullPath, ".IO"); - if (!(_Configuration is null) && _Configuration.PostProcessingMode == FileConnectorConfiguration.PostProcessingModeEnum.Copy) - try - { File.WriteAllLines(fileName, new string[] { _Configuration.TargetFileName, Logistics.Sequence.ToString(), exception.Message, string.Empty, string.Empty, exception.StackTrace }); } - catch (Exception) { } - } - if (_ConfigData.EquipmentConnection.HasValue && _ConfigData.EquipmentConnection.Value != _ConfigData.EquipmentType) - { - if (!reportFullPath.EndsWith(".pdsf") && !reportFullPath.EndsWith(".ipdsf")) - { - string fileName = string.Concat(reportFullPath, ".IO"); - try - { File.WriteAllLines(fileName, new string[] { _Configuration.TargetFileName, Logistics.Sequence.ToString(), exception.Message, string.Empty, string.Empty, exception.StackTrace }); } - catch (Exception) { } - } - else - { - List debug = new List { "//Exception:" }; - if (!(Logistics is null) && !(Logistics.Tags is null)) - debug.AddRange(Logistics.Tags); - debug.Add(exception.Message); - debug.Add(exception.StackTrace); - try - { File.AppendAllLines(reportFullPath, debug); } - catch (Exception) { } - if (!(Logistics is null) && Logistics.DateTimeFromSequence != DateTime.MinValue && Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600) - { - try - { File.SetLastWriteTime(reportFullPath, Logistics.DateTimeFromSequence); } - catch (Exception) { } - } - } - } - } - } - - public void Shared1880(string reportFullPath, string itemFile, List directories, FileInfo sourceFile, bool isErrorFile) - { - string itemDirectory; - directories.Add(Path.GetDirectoryName(sourceFile.FullName)); - itemDirectory = Path.GetDirectoryName(itemFile); - FileConnectorConfiguration.PostProcessingModeEnum processingModeEnum; - if (!isErrorFile) - processingModeEnum = _Configuration.PostProcessingMode.Value; - else - processingModeEnum = _Configuration.ErrorPostProcessingMode.Value; - if (processingModeEnum != FileConnectorConfiguration.PostProcessingModeEnum.Delete && !Directory.Exists(itemDirectory)) - { - Directory.CreateDirectory(itemDirectory); - FileInfo fileInfo = new FileInfo(reportFullPath); - Directory.SetCreationTime(itemDirectory, fileInfo.LastWriteTime); - } - if (_ConfigData.EafHosted) - { - switch (processingModeEnum) - { - case FileConnectorConfiguration.PostProcessingModeEnum.Move: - File.Move(sourceFile.FullName, itemFile); - break; - case FileConnectorConfiguration.PostProcessingModeEnum.Copy: - File.Copy(sourceFile.FullName, itemFile); - break; - case FileConnectorConfiguration.PostProcessingModeEnum.Delete: - File.Delete(sourceFile.FullName); - break; - default: - throw new Exception(); - } - } - } - - public void WaitForThread(Thread thread, List threadExceptions) - { - if (!(thread is null)) - { - System.Threading.ThreadState threadState; - for (short i = 0; i < short.MaxValue; i++) - { - if (thread is null) - break; - else - { - threadState = thread.ThreadState; - if (threadState != System.Threading.ThreadState.Running && threadState != System.Threading.ThreadState.WaitSleepJoin) - break; - } - Thread.Sleep(500); - } - lock (threadExceptions) - { - if (threadExceptions.Any()) - { - foreach (Exception item in threadExceptions) - _Log.Error(string.Concat(item.Message, Environment.NewLine, Environment.NewLine, item.StackTrace)); - Exception exception = threadExceptions[0]; - threadExceptions.Clear(); - throw exception; - } - } - } - } - - } - -} \ No newline at end of file diff --git a/Adaptation/FileHandlers/MET08DDUPSFS6420/FileRead.cs b/Adaptation/FileHandlers/MET08DDUPSFS6420/FileRead.cs new file mode 100644 index 0000000..9974d04 --- /dev/null +++ b/Adaptation/FileHandlers/MET08DDUPSFS6420/FileRead.cs @@ -0,0 +1,519 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared; +using Adaptation.Shared.Duplicator; +using Adaptation.Shared.Methods; +using Adaptation.Shared.Metrology; +using Infineon.Monitoring.MonA; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading; + +namespace Adaptation.FileHandlers.MET08DDUPSFS6420; + +public class FileRead : Shared.FileRead, IFileRead +{ + + private readonly Timer _Timer; + private int _LastDummyRunIndex; + private readonly bool _IsDummy; + private readonly bool _IsNaEDA; + private readonly bool _IsXToAPC; + private readonly string _IqsFile; + private readonly bool _IsXToIQSSi; + private readonly bool _IsXToSPaCe; + private readonly bool _IsXToIQSGaN; + private readonly string _MemoryPath; + private readonly bool _IsXToOpenInsight; + private readonly string _OpenInsightFilePattern; + private readonly bool _IsXToOpenInsightMetrologyViewer; + private readonly Dictionary _CellNames; + private readonly string _OpenInsightMetrologyViewerAPI; + private readonly bool _IsXToOpenInsightMetrologyViewerAttachments; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new Logistics(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + _LastDummyRunIndex = -1; + _IsDummy = _Hyphens == (int)Hyphen.IsDummy; + _IsNaEDA = _Hyphens == (int)Hyphen.IsNaEDA; + _IsXToAPC = _Hyphens == (int)Hyphen.IsXToAPC; + _CellNames = new Dictionary(); + _IsXToIQSSi = _Hyphens == (int)Hyphen.IsXToIQSSi; + _IsXToSPaCe = _Hyphens == (int)Hyphen.IsXToSPaCe; + _IsXToIQSGaN = _Hyphens == (int)Hyphen.IsXToIQSGaN; + _IsXToOpenInsight = _Hyphens == (int)Hyphen.IsXToOpenInsight; + _IsXToOpenInsightMetrologyViewer = _Hyphens == (int)Hyphen.IsXToOpenInsightMetrologyViewer; + _IqsFile = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "IQS.File"); + _MemoryPath = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "Path.Memory"); + _IsXToOpenInsightMetrologyViewerAttachments = _Hyphens == (int)Hyphen.IsXToOpenInsightMetrologyViewerAttachments; + _OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern"); + _OpenInsightMetrologyViewerAPI = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.MetrologyViewerAPI"); + ModelObjectParameterDefinition[] cellInstanceCollection = GetProperties(cellInstanceConnectionName, modelObjectParameters, "CellInstance.", ".Path"); + foreach (ModelObjectParameterDefinition modelObjectParameterDefinition in cellInstanceCollection) + _CellNames.Add(modelObjectParameterDefinition.Name.Split('.')[1], modelObjectParameterDefinition.Value); + if (_IsDummy) + { + if (Debugger.IsAttached || fileConnectorConfiguration.PreProcessingMode == FileConnectorConfiguration.PreProcessingModeEnum.Process) + { + _Timer = new Timer(Callback, null, Timeout.Infinite, Timeout.Infinite); + Callback(null); + } + else + { + int milliSeconds; + milliSeconds = (int)(fileConnectorConfiguration.FileScanningIntervalInSeconds * 1000 / 2); + _Timer = new Timer(Callback, null, milliSeconds, Timeout.Infinite); + milliSeconds += 2000; + } + } + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) => Move(extractResults, exception); + + void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); + + string IFileRead.GetEventDescription() + { + string result = _Description.GetEventDescription(); + return result; + } + + List IFileRead.GetHeaderNames() + { + List results = _Description.GetHeaderNames(); + return results; + } + + string[] IFileRead.Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception) + { + string[] results = Move(extractResults, to, from, resolvedFileLocation, exception); + return results; + } + + JsonProperty[] IFileRead.GetDefault() + { + JsonProperty[] results = _Description.GetDefault(this, _Logistics); + return results; + } + + Dictionary IFileRead.GetDisplayNamesJsonElement() + { + Dictionary results = _Description.GetDisplayNamesJsonElement(this); + return results; + } + + List IFileRead.GetDescriptions(IFileRead fileRead, List tests, IProcessData processData) + { + List results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); + return results; + } + + Tuple> IFileRead.GetExtractResult(string reportFullPath, string eventName) + { + Tuple> results; + if (string.IsNullOrEmpty(eventName)) + throw new Exception(); + _ReportFullPath = reportFullPath; + DateTime dateTime = DateTime.Now; + results = GetExtractResult(reportFullPath, dateTime); + if (results.Item3 is null) + results = new Tuple>(results.Item1, Array.Empty(), JsonSerializer.Deserialize("[]"), results.Item4); + if (results.Item3.Length > 0 && _IsEAFHosted) + WritePDSF(this, results.Item3); + UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); + return results; + } + + Tuple> IFileRead.ReExtract() + { + Tuple> results; + List headerNames = _Description.GetHeaderNames(); + Dictionary keyValuePairs = _Description.GetDisplayNamesJsonElement(this); + results = ReExtract(this, headerNames, keyValuePairs); + return results; + } + + void IFileRead.CheckTests(Test[] tests, bool extra) + { + if (_Description is not Description) + throw new Exception(); + } + + void IFileRead.Callback(object state) => Callback(state); + + protected static List GetDescriptions(JsonElement[] jsonElements) + { + List results = new(); + pcl.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; + } + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + Tuple> results; + string duplicateDirectory; + Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); + _Logistics = new Logistics(reportFullPath, pdsf.Item1); + SetFileParameterLotIDToLogisticsMID(); + JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); + List descriptions = GetDescriptions(jsonElements); + Tuple>> tuple = GetTuple(this, from l in descriptions select (Shared.Properties.IDescription)l, extra: false); + results = new Tuple>(pdsf.Item1, tuple.Item1, jsonElements, new List()); + bool isNotUsedInsightMetrologyViewerAttachments = !(_FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) && _IsXToOpenInsightMetrologyViewerAttachments; + bool isDummyRun = _DummyRuns.Any() && _DummyRuns.ContainsKey(_Logistics.JobID) && _DummyRuns[_Logistics.JobID].Any() && (from l in _DummyRuns[_Logistics.JobID] where l == _Logistics.Sequence select 1).Any(); + if (isDummyRun) + { + try + { File.SetLastWriteTime(reportFullPath, dateTime); } + catch (Exception) { } + } + string[] segments = Path.GetFileNameWithoutExtension(reportFullPath).Split('_'); + if (_IsXToIQSSi) + duplicateDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\All"); + else if (!_IsXToOpenInsight) + duplicateDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\", segments[0]); + else + duplicateDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation)), @"\Data"); + if (segments.Length > 2) + duplicateDirectory = string.Concat(duplicateDirectory, @"-", segments[2]); + if (!Directory.Exists(duplicateDirectory)) + _ = Directory.CreateDirectory(duplicateDirectory); + if (isDummyRun || isNotUsedInsightMetrologyViewerAttachments || _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + { + bool ganPPTST = false; + if (!Directory.Exists(duplicateDirectory)) + _ = Directory.CreateDirectory(duplicateDirectory); + string successDirectory; + if (!_IsXToAPC) + successDirectory = string.Empty; + else + { + successDirectory = string.Concat(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation), @"\ViewerPath"); + if (!Directory.Exists(successDirectory)) + _ = Directory.CreateDirectory(successDirectory); + } + List> tuples = new(); + string duplicateFile = string.Concat(duplicateDirectory, @"\", Path.GetFileName(reportFullPath)); + string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + string weekDirectory = string.Concat(_Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); + string logisticsSequenceMemoryDirectory = string.Concat(_MemoryPath, @"\", _EquipmentType, @"\Source\", weekDirectory, @"\", _Logistics.Sequence); + if (!Directory.Exists(logisticsSequenceMemoryDirectory)) + _ = Directory.CreateDirectory(logisticsSequenceMemoryDirectory); + if (_IsXToAPC) + { + if (!isDummyRun && _IsEAFHosted) + File.Copy(reportFullPath, duplicateFile, overwrite: true); + } + else + { + if (_IsXToOpenInsightMetrologyViewer) + { + WSRequest wsRequest = new(this, _Logistics, descriptions); + if (!isDummyRun && _IsEAFHosted) + { + Tuple wsResults = WS.SendData(_OpenInsightMetrologyViewerAPI, wsRequest); + if (!wsResults.Item2.Success) + throw new Exception(wsResults.ToString()); + _Log.Debug(wsResults.Item2.HeaderID); + File.WriteAllText(string.Concat(logisticsSequenceMemoryDirectory, @"\", nameof(WS.Results), ".json"), wsResults.Item1); + } + } + else + { + Test test; + string lines; + Shared.Properties.IScopeInfo scopeInfo; + foreach (KeyValuePair> keyValuePair in tuple.Item2) + { + test = keyValuePair.Key; + //scopeInfo = new ScopeInfo(test); + if (!_IsXToOpenInsight) + scopeInfo = new ScopeInfo(test, _IqsFile); + else + scopeInfo = new ScopeInfo(test, _OpenInsightFilePattern); + //lines = ProcessDataStandardFormat.GetLines(this, scopeInfo, names, values, dateFormat: "M/d/yyyy hh:mm:ss tt", timeFormat: string.Empty, pairedColumns: ExtractResultPairedColumns); + ganPPTST = descriptions[0].Recipe.Contains("GAN_PPTST"); + lines = ProcessData.GetLines(this, _Logistics, descriptions, ganPPTST); + tuples.Add(new Tuple(scopeInfo, lines)); + } + } + if (_IsXToOpenInsightMetrologyViewerAttachments) + { + string[] matchDirectories = Shared1567(reportFullPath, tuples); + if (!isDummyRun && _IsEAFHosted && !isNotUsedInsightMetrologyViewerAttachments) + ProcessData.PostOpenInsightMetrologyViewerAttachments(this, _Logistics, _OpenInsightMetrologyViewerAPI, dateTime, logisticsSequenceMemoryDirectory, descriptions, matchDirectories[0]); + } + } + if (!_IsXToOpenInsightMetrologyViewer && !_IsXToOpenInsightMetrologyViewerAttachments) + { + bool check = false; + if (!_IsXToIQSSi && !_IsXToIQSGaN) + check = true; + else if (_IsXToIQSSi && !ganPPTST) + check = true; + else if (_IsXToIQSGaN && ganPPTST) + check = true; + //else + // Don't write file(s) //throw new Exception(); + if (check) + Shared0413(dateTime, isDummyRun, successDirectory, duplicateDirectory, tuples, duplicateFile); + } + } + if (_IsXToOpenInsightMetrologyViewerAttachments) + { + string destinationDirectory; + //string destinationDirectory = WriteScopeInfo(_ProgressPath, _Logistics, dateTime, duplicateDirectory, tuples); + FileInfo fileInfo = new(reportFullPath); + string logisticsSequence = _Logistics.Sequence.ToString(); + if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) + File.SetLastWriteTime(reportFullPath, fileInfo.CreationTime); + string jobIdDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation)), @"\", _Logistics.JobID); + if (!Directory.Exists(jobIdDirectory)) + _ = Directory.CreateDirectory(jobIdDirectory); + string[] matchDirectories; + if (!_IsEAFHosted) + matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(reportFullPath)) }; + else + matchDirectories = Directory.GetDirectories(jobIdDirectory, string.Concat(_Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly); + if ((matchDirectories is null) || matchDirectories.Length != 1) + throw new Exception("Didn't find directory by logistics sequence"); + destinationDirectory = matchDirectories[0]; + if (isDummyRun) + Shared0607(reportFullPath, duplicateDirectory, logisticsSequence, destinationDirectory); + else + { + WSRequest wsRequest = new(this, _Logistics, descriptions); + JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true }; + string json = JsonSerializer.Serialize(wsRequest, wsRequest.GetType(), jsonSerializerOptions); + if (_IsEAFHosted) + Shared1277(reportFullPath, destinationDirectory, logisticsSequence, jobIdDirectory, json); + else + { + string jsonFileName = Path.ChangeExtension(reportFullPath, ".json"); + string historicalText = File.ReadAllText(jsonFileName); + if (json != historicalText) + throw new Exception("File doesn't match historical!"); + } + } + } + return results; + } + + private void CallbackIsDummy(string traceDummyFile, List> tuples, bool fileConnectorConfigurationIncludeSubDirectories, bool includeSubDirectoriesExtra) + { + int fileCount; + string[] files; + string monARessource; + string checkDirectory; + string sourceArchiveFile; + string inProcessDirectory; + const string site = "sjc"; + string stateName = string.Concat("Dummy_", _EventName); + const string monInURL = "http://moninhttp.sjc.infineon.com/input/text"; + MonIn monIn = MonIn.GetInstance(monInURL); + foreach (Tuple item in tuples) + { + monARessource = item.Item1; + sourceArchiveFile = item.Item2; + inProcessDirectory = item.Item3; + checkDirectory = item.Item4; + fileCount = item.Item5; + try + { + if (fileCount > 0 || string.IsNullOrEmpty(checkDirectory)) + { + File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Warning.ToString() }); + _ = monIn.SendStatus(site, monARessource, stateName, State.Warning); + for (int i = 1; i < 12; i++) + Thread.Sleep(500); + } + else if (inProcessDirectory == checkDirectory) + continue; + if (!_IsEAFHosted) + continue; + if (!File.Exists(sourceArchiveFile)) + continue; + if (!long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) + continue; + ZipFile.ExtractToDirectory(sourceArchiveFile, inProcessDirectory); + if (fileConnectorConfigurationIncludeSubDirectories && includeSubDirectoriesExtra) + checkDirectory = string.Concat(checkDirectory, @"\", sequence); + if (fileConnectorConfigurationIncludeSubDirectories) + files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.AllDirectories); + else + files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.TopDirectoryOnly); + if (files.Length > 250) + throw new Exception("Safety net!"); + foreach (string file in files) + File.SetLastWriteTime(file, new DateTime(sequence)); + if (!fileConnectorConfigurationIncludeSubDirectories) + { + foreach (string file in files) + File.Move(file, string.Concat(checkDirectory, @"\", Path.GetFileName(file))); + } + else + { + string[] directories = Directory.GetDirectories(inProcessDirectory, "*", SearchOption.AllDirectories); + foreach (string directory in directories) + _ = Directory.CreateDirectory(string.Concat(checkDirectory, directory.Substring(inProcessDirectory.Length))); + foreach (string file in files) + File.Move(file, string.Concat(checkDirectory, file.Substring(inProcessDirectory.Length))); + } + File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Ok.ToString() }); + _ = monIn.SendStatus(site, monARessource, stateName, State.Ok); + } + catch (Exception exception) + { + string subject = string.Concat("Exception:", _CellInstanceConnectionName); + string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); + try + { _SMTP.SendHighPriorityEmailMessage(subject, body); } + catch (Exception) { } + File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Critical.ToString(), exception.Message, exception.StackTrace }); + _ = monIn.SendStatus(site, monARessource, stateName, State.Critical); + } + } + } + + private void Callback(object state) + { + if (!_IsDummy) + throw new Exception(); + try + { + DateTime dateTime = DateTime.Now; + bool check = dateTime.Hour > 7 && dateTime.Hour < 18 && dateTime.DayOfWeek != DayOfWeek.Sunday && dateTime.DayOfWeek != DayOfWeek.Saturday; + if (check) + { + int fileCount; + string[] files; + string monARessource; + string checkDirectory; + string sourceArchiveFile; + string sourceFileLocation; + string inProcessDirectory; + string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + string traceDummyDirectory = string.Concat(Path.GetPathRoot(_TracePath), @"\TracesDummy\", _CellInstanceName, @"\Source\", dateTime.ToString("yyyy"), "___Week_", weekOfYear); + if (!Directory.Exists(traceDummyDirectory)) + _ = Directory.CreateDirectory(traceDummyDirectory); + string traceDummyFile = string.Concat(traceDummyDirectory, @"\", dateTime.Ticks, " - ", _CellInstanceName, ".txt"); + File.AppendAllText(traceDummyFile, string.Empty); + List> tuples = new(); + string progressDirectory = Path.GetFullPath(string.Concat(_FileConnectorConfiguration.SourceFileLocation, @"\_ Progress")); + if (progressDirectory != _ProgressPath || !Directory.Exists(progressDirectory)) + throw new Exception("Invalid progress path"); + foreach (KeyValuePair keyValuePair in _CellNames) + { + monARessource = keyValuePair.Key; + if (!keyValuePair.Value.Contains('\\')) + continue; + foreach (string sourceFileFilter in _FileConnectorConfiguration.SourceFileFilter.Split('|')) + { + if (sourceFileFilter.ToLower().StartsWith(keyValuePair.Value.Replace(@"\", string.Empty))) + sourceFileLocation = Path.GetFullPath(_FileConnectorConfiguration.SourceFileLocation); + else if (_FileConnectorConfiguration.SourceFileLocation.ToLower().EndsWith(keyValuePair.Value)) + sourceFileLocation = Path.GetFullPath(_FileConnectorConfiguration.SourceFileLocation); + else + sourceFileLocation = Path.GetFullPath(string.Concat(_FileConnectorConfiguration.SourceFileLocation, @"\", keyValuePair.Value)); + sourceArchiveFile = Path.GetFullPath(string.Concat(sourceFileLocation, @"\", sourceFileFilter)); + if (!File.Exists(sourceArchiveFile)) + continue; + if (!_DummyRuns.ContainsKey(monARessource)) + _DummyRuns.Add(monARessource, new List()); + tuples.Add(new Tuple(monARessource, sourceFileFilter, sourceFileLocation, sourceArchiveFile, 0)); + } + } + File.AppendAllLines(traceDummyFile, from l in tuples select l.Item4); + if (tuples.Any()) + { + _LastDummyRunIndex += 1; + if (_LastDummyRunIndex >= tuples.Count) + _LastDummyRunIndex = 0; + monARessource = tuples[_LastDummyRunIndex].Item1; + string sourceFileFilter = tuples[_LastDummyRunIndex].Item2; + sourceFileLocation = tuples[_LastDummyRunIndex].Item3; + sourceArchiveFile = tuples[_LastDummyRunIndex].Item4; + //fileCount = tuples[_LastDummyRunIndex].Item5; + tuples.Clear(); + if (long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) + { + if (!_DummyRuns[monARessource].Contains(sequence)) + _DummyRuns[monARessource].Add(sequence); + inProcessDirectory = string.Concat(progressDirectory, @"\Dummy_in process\", sequence); + checkDirectory = inProcessDirectory; + if (!Directory.Exists(checkDirectory)) + _ = Directory.CreateDirectory(checkDirectory); + files = Directory.GetFiles(checkDirectory, "*", SearchOption.AllDirectories); + fileCount = files.Length; + if (files.Any()) + { + if (files.Length > 250) + throw new Exception("Safety net!"); + try + { + foreach (string file in files) + File.Delete(file); + } + catch (Exception) { } + } + tuples.Add(new Tuple(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); + checkDirectory = sourceFileLocation; + files = Directory.GetFiles(checkDirectory, string.Concat("*", sequence, "*"), SearchOption.TopDirectoryOnly); + fileCount = files.Length; + tuples.Add(new Tuple(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); + } + } + if (tuples.Any()) + //CallbackIsDummy(traceDummyFile, tuples, FileConnectorConfiguration.IncludeSubDirectories.Value, includeSubDirectoriesExtra: false); + CallbackIsDummy(traceDummyFile, tuples, fileConnectorConfigurationIncludeSubDirectories: true, includeSubDirectoriesExtra: true); + } + } + catch (Exception exception) + { + string subject = string.Concat("Exception:", _CellInstanceConnectionName); + string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); + try + { _SMTP.SendHighPriorityEmailMessage(subject, body); } + catch (Exception) { } + } + try + { + TimeSpan timeSpan = new(DateTime.Now.AddSeconds(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value).Ticks - DateTime.Now.Ticks); + _ = _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); + } + catch (Exception exception) + { + string subject = string.Concat("Exception:", _CellInstanceConnectionName); + string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); + try + { _SMTP.SendHighPriorityEmailMessage(subject, body); } + catch (Exception) { } + } + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/MET08DDUPSFS6420/Hyphen.cs b/Adaptation/FileHandlers/MET08DDUPSFS6420/Hyphen.cs new file mode 100644 index 0000000..f71c3f1 --- /dev/null +++ b/Adaptation/FileHandlers/MET08DDUPSFS6420/Hyphen.cs @@ -0,0 +1,17 @@ +namespace Adaptation.FileHandlers.MET08DDUPSFS6420; + +public enum Hyphen +{ + IsXToOpenInsightMetrologyViewer, //MetrologyWS.SendData(logic, string.Concat("http://", serverName, "/api/inbound/Tencor"), headerAttachments, detailAttachments); + IsXToIQSSi, //bool WriteFileSPC(Dictionary + IsXToIQSGaN, //GAN_PPTST + IsXToOpenInsight, //bool WriteFileOpenInsight(Dictionary + IsXToOpenInsightMetrologyViewerAttachments, //Site-Two + IsXToAPC, + IsXToSPaCe, + IsXToArchive, + IsArchive, + IsDummy, + IsManualOIEntry, + IsNaEDA +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/MET08DDUPSFS6420/ProcessData.cs b/Adaptation/FileHandlers/MET08DDUPSFS6420/ProcessData.cs new file mode 100644 index 0000000..faa37a8 --- /dev/null +++ b/Adaptation/FileHandlers/MET08DDUPSFS6420/ProcessData.cs @@ -0,0 +1,278 @@ +using Adaptation.Shared; +using Adaptation.Shared.Metrology; +using Adaptation.Shared.Properties; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; + +namespace Adaptation.FileHandlers.MET08DDUPSFS6420; + +public class ProcessData +{ + + internal static List> HyphenTuples => new() + { + new Tuple(0, Hyphen.IsNaEDA, @"\EC_EDA\Staging\Traces\~\Source"), + new Tuple(15, Hyphen.IsXToOpenInsightMetrologyViewer, @"\EC_EAFLog\TracesMES\~\Source"), + new Tuple(36, Hyphen.IsXToIQSSi, @"\EC_SPC_Si\Traces\~\PollPath"), + new Tuple(36, Hyphen.IsXToIQSGaN, @"\EC_SPC_GaN\Traces\~\PollPath"), + new Tuple(36, Hyphen.IsXToOpenInsight, @"\\messa01ec.ec.local\APPS\Metrology\~\Source"), + new Tuple(36, Hyphen.IsXToOpenInsightMetrologyViewerAttachments, @"\EC_Characterization_Si\In Process\~\Source"), + new Tuple(360, Hyphen.IsXToAPC, @"\EC_APC\Staging\Traces\~\PollPath"), + new Tuple(-36, Hyphen.IsXToSPaCe, @"\EC_SPC_Si\Traces\~\Source"), + new Tuple(180, Hyphen.IsXToArchive, @"\EC_EAFLog\TracesArchive\~\Source"), + new Tuple(36, Hyphen.IsArchive, @"\EC_Characterization_Si\Processed") + //new Tuple("IsDummy" + }; + + internal static string GetLines(IFileRead fileRead, Logistics logistics, List descriptions, bool ganPPTST) + { + if (fileRead is null) + { } + StringBuilder result = new(); + pcl.Description x = descriptions[0]; + if (ganPPTST) + { + string slot; + string reactor; + const int eight = 8; + DateTime dateTime = DateTime.Parse(x.Date); + string lot = x.Lot.ToLower().Replace("69-", string.Empty).Replace("71-", string.Empty).Replace("-", string.Empty); + if (string.IsNullOrEmpty(x.Lot) || x.Lot.Length < 2) + reactor = "R"; + else + reactor = string.Concat("R", x.Lot.Substring(0, 2)); + _ = result.Append(nameof(x.Date)).Append(';'). + Append("Part").Append(';'). + Append(nameof(x.Reactor)).Append(';'). + Append("Lot").Append(';'). + Append(nameof(pcl.Detail.Slot)).Append(';'). + Append(nameof(pcl.Detail.Bin1)).Append(';'). + Append(nameof(pcl.Detail.Bin2)).Append(';'). + Append(nameof(pcl.Detail.Bin3)).Append(';'). + Append(nameof(pcl.Detail.Bin4)).Append(';'). + Append(nameof(pcl.Detail.Bin5)).Append(';'). + Append(nameof(pcl.Detail.Bin6)).Append(';'). + Append("Bin9"). + AppendLine(); + foreach (pcl.Description description in descriptions) + { + slot = description.Slot.Replace("*", string.Empty); + _ = result.Append('!').Append(dateTime.ToString("MM/dd/yyyy HH:mm:ss")).Append(';'). + Append("Particle Adder;"). + Append(reactor).Append(';'). + Append(lot).Append(';'). + Append(slot).Append(';'). + Append(description.Bin1).Append(';'). + Append(description.Bin2).Append(';'). + Append(description.Bin3).Append(';'). + Append(description.Bin4).Append(';'). + Append(description.Bin5).Append(';'). + Append(description.Bin6).Append(';'). + Append(description.AreaCount). + AppendLine(); + } + if (descriptions.Count != eight) + { + string negativeTenThousand = "-10000"; + for (int i = descriptions.Count; i < eight; i++) + { + _ = result.Append('!').Append(dateTime.ToString("MM/dd/yyyy HH:mm:ss")).Append(';'). + Append("Particle Adder;"). + Append(reactor).Append(';'). + Append(lot).Append(';'). + Append(negativeTenThousand).Append(';'). + Append(negativeTenThousand).Append(';'). + Append(negativeTenThousand).Append(';'). + Append(negativeTenThousand).Append(';'). + Append(negativeTenThousand).Append(';'). + Append(negativeTenThousand).Append(';'). + Append(negativeTenThousand).Append(';'). + Append(negativeTenThousand). + AppendLine(); + } + } + if (result.ToString().Split('\n').Length != (eight + 2)) + throw new Exception(string.Concat("Must have ", eight, " samples")); + } + else + { + char del = '\t'; + _ = result.Append(x.AreaCountAvg).Append(del). // 001 - AreaCountAvg + Append(x.AreaCountMax).Append(del). // 002 - AreaCountMax + Append(x.AreaCountMin).Append(del). // 003 - AreaCountMin + Append(x.AreaCountStdDev).Append(del). // 004 - AreaCountStdDev + Append(x.AreaTotalAvg).Append(del). // 005 - AreaTotalAvg + Append(x.AreaTotalMax).Append(del). // 006 - AreaTotalMax + Append(x.AreaTotalMin).Append(del). // 007 - AreaTotalMin + Append(x.AreaTotalStdDev).Append(del). // 008 - AreaTotalStdDev + Append(x.Date).Append(del). // 009 - + Append(x.HazeAverageAvg).Append(del). // 010 - Haze Average + Append(x.HazeAverageMax).Append(del). // 011 - + Append(x.HazeAverageMin).Append(del). // 012 - + Append(x.HazeAverageStdDev).Append(del). // 013 - + Append(x.HazeRegionAvg).Append(del). // 014 - + Append(x.HazeRegionMax).Append(del). // 015 - + Append(x.HazeRegionMin).Append(del). // 016 - + Append(x.HazeRegionStdDev).Append(del). // 017 - + Append(x.Lot).Append(del). // 018 - + Append(x.LPDCM2Avg).Append(del). // 019 - + Append(x.LPDCM2Max).Append(del). // 020 - + Append(x.LPDCM2Min).Append(del). // 021 - + Append(x.LPDCM2StdDev).Append(del). // 022 - + Append(x.LPDCountAvg).Append(del). // 023 - + Append(x.LPDCountMax).Append(del). // 024 - + Append(x.LPDCM2Min).Append(del). // 025 - + Append(x.LPDCountStdDev).Append(del). // 026 - + Append(x.Employee).Append(del). // 027 - + Append(x.RDS).Append(del). // 028 - Lot + Append(x.Reactor).Append(del). // 029 - Process + Append(x.Recipe.Replace(";", string.Empty)).Append(del). // 030 - Part + Append(x.ScratchCountAvg).Append(del). // 031 - Scratch Count + Append(x.ScratchCountMax).Append(del). // 032 - + Append(x.ScratchCountMin).Append(del). // 033 - + Append(x.ScratchTotalStdDev).Append(del). // 034 - + Append(x.ScratchTotalAvg).Append(del). // 035 - Scratch Length + Append(x.ScratchTotalMax).Append(del). // 036 - + Append(x.ScratchTotalMin).Append(del). // 037 - + Append(x.ScratchTotalStdDev).Append(del). // 038 - + Append(x.SumOfDefectsAvg).Append(del). // 039 - Average Sum of Defects + Append(x.SumOfDefectsMax).Append(del). // 040 - Max Sum of Defects + Append(x.SumOfDefectsMin).Append(del). // 041 - Min Sum of Defects + Append(x.SumOfDefectsStdDev).Append(del). // 042 - SumOfDefectsStdDev + Append(logistics.MesEntity).Append(del). // 043 - + AppendLine(); + } + return result.ToString(); + } + + private static void UpdateDataPDF(List descriptions, string checkFileName) + { + string value; + object possiblePage; + object possibleString; + object possibleCOSArray; + java.util.List tokenList; + java.util.List arrayList; + java.io.OutputStream outputStream; + List updateValues = new(); + StringBuilder stringBuilder = new(); + java.util.ListIterator tokenIterator; + java.util.ListIterator arrayIterator; + java.io.File file = new(checkFileName); + string reactorLoadLock = descriptions[0].Comments; + org.apache.pdfbox.pdmodel.common.PDStream pdStream; + org.apache.pdfbox.pdmodel.common.PDStream updatedStream; + org.apache.pdfbox.pdfparser.PDFStreamParser pdfStreamParser; + org.apache.pdfbox.pdfwriter.ContentStreamWriter contentStreamWriter; + org.apache.pdfbox.pdmodel.PDDocument pdDocument = org.apache.pdfbox.pdmodel.PDDocument.load(file); + org.apache.pdfbox.pdmodel.PDDocumentCatalog pdDocumentCatalog = pdDocument.getDocumentCatalog(); + java.util.List pagesList = pdDocumentCatalog.getAllPages(); + java.util.ListIterator pageIterator = pagesList.listIterator(); + for (short i = 1; i < short.MaxValue; i++) + { + if (!pageIterator.hasNext()) + break; + possiblePage = pageIterator.next(); + if (possiblePage is not org.apache.pdfbox.pdmodel.PDPage page) + continue; + pdStream = page.getContents(); + pdfStreamParser = new org.apache.pdfbox.pdfparser.PDFStreamParser(pdStream); + pdfStreamParser.parse(); + tokenList = pdfStreamParser.getTokens(); + tokenIterator = tokenList.listIterator(); + for (short t = 1; i < short.MaxValue; t++) + { + if (!tokenIterator.hasNext()) + break; + possibleCOSArray = tokenIterator.next(); + if (possibleCOSArray is not org.apache.pdfbox.cos.COSArray cossArray) + continue; + _ = stringBuilder.Clear(); + arrayList = cossArray.toList(); + arrayIterator = arrayList.listIterator(); + for (short a = 1; i < short.MaxValue; a++) + { + if (!arrayIterator.hasNext()) + break; + possibleString = arrayIterator.next(); + if (possibleString is not org.apache.pdfbox.cos.COSString cossString) + continue; + value = cossString.getString(); + _ = stringBuilder.Append(value); + if (value != "]") + continue; + updateValues.Add(value); + value = stringBuilder.ToString(); + if (value.Contains("[]")) + cossArray.setString(a - 1, string.Concat("*", reactorLoadLock, "]")); + else + cossArray.setString(a - 1, string.Concat(" {*", reactorLoadLock, "}]")); + } + } + if (updateValues.Any()) + { + updatedStream = new org.apache.pdfbox.pdmodel.common.PDStream(pdDocument); + outputStream = updatedStream.createOutputStream(); + contentStreamWriter = new org.apache.pdfbox.pdfwriter.ContentStreamWriter(outputStream); + contentStreamWriter.writeTokens(tokenList); + outputStream.close(); + page.setContents(updatedStream); + } + } + if (updateValues.Any()) + pdDocument.save(checkFileName); + pdDocument.close(); + } + + internal static void PostOpenInsightMetrologyViewerAttachments(IFileRead fileRead, Logistics logistics, string openInsightMetrologyViewerAPI, DateTime dateTime, string logisticsSequenceMemoryDirectory, List descriptions, string matchDirectory) + { + if (fileRead is null) + { } + if (dateTime == DateTime.MinValue) + { } + if (logisticsSequenceMemoryDirectory is null) + { } + if (descriptions is null) + { } + if (matchDirectory is null) + { } + string checkFileName; + string[] pclFiles = Directory.GetFiles(matchDirectory, "*.pcl", SearchOption.TopDirectoryOnly); + if (pclFiles.Length != 1) + throw new Exception("Invalid source file count!"); + string sourceFileNameNoExt = Path.GetFileNameWithoutExtension(pclFiles[0]); + string wsResultsMemoryFile = string.Concat(logisticsSequenceMemoryDirectory, @"\", nameof(WS.Results), ".json"); + if (!File.Exists(wsResultsMemoryFile)) + throw new Exception(string.Concat("Memory file <", wsResultsMemoryFile, "> doesn't exist!")); + string json = File.ReadAllText(wsResultsMemoryFile); + WS.Results metrologyWSRequest = JsonSerializer.Deserialize(json); + long wsResultsHeaderID = metrologyWSRequest.HeaderID; + List dataAttachments = new(); + List headerAttachments = new(); + checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_data.pdf"); + if (!File.Exists(checkFileName)) + throw new Exception("Header file doesn't exist!"); + else + { + UpdateDataPDF(descriptions, checkFileName); + headerAttachments.Add(new WS.Attachment(descriptions[0].HeaderUniqueId, "Data.pdf", checkFileName)); + } + foreach (pcl.Description description in descriptions) + { + checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_", description.Slot.Replace('*', 's'), "_image.pdf"); + if (File.Exists(checkFileName)) + dataAttachments.Add(new WS.Attachment(description.UniqueId, "Image.pdf", checkFileName)); + checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_", description.Slot.Replace('*', 's'), "_data.pdf"); + if (File.Exists(checkFileName)) + dataAttachments.Add(new WS.Attachment(description.UniqueId, "Data.pdf", checkFileName)); + } + if (dataAttachments.Count == 0 || dataAttachments.Count != descriptions.Count) + throw new Exception("Invalid attachment count!"); + WS.AttachFiles(openInsightMetrologyViewerAPI, wsResultsHeaderID, headerAttachments, dataAttachments); + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/MET08DDUPSFS6420/WSRequest.cs b/Adaptation/FileHandlers/MET08DDUPSFS6420/WSRequest.cs new file mode 100644 index 0000000..02069fd --- /dev/null +++ b/Adaptation/FileHandlers/MET08DDUPSFS6420/WSRequest.cs @@ -0,0 +1,199 @@ +using Adaptation.Shared; +using Adaptation.Shared.Properties; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Adaptation.FileHandlers.MET08DDUPSFS6420; + +public class WSRequest +{ + + public long Id { get; set; } + public string AreaCountAvg { get; set; } + public string AreaCountMax { get; set; } + public string AreaCountMin { get; set; } + public string AreaCountStdDev { get; set; } + public string AreaTotalAvg { get; set; } + public string AreaTotalMax { get; set; } + public string AreaTotalMin { get; set; } + public string AreaTotalStdDev { get; set; } + public string Date { get; set; } + public string HazeAverageAvg { get; set; } + public string HazeAverageMax { get; set; } + public string HazeAverageMin { get; set; } + public string HazeAverageStdDev { get; set; } + public string HazeRegionAvg { get; set; } + public string HazeRegionMax { get; set; } + public string HazeRegionMin { get; set; } + public string HazeRegionStdDev { get; set; } + public string Layer { get; set; } + public string LotID { get; set; } + public string LPDCM2Avg { get; set; } + public string LPDCM2Max { get; set; } + public string LPDCM2Min { get; set; } + public string LPDCM2StdDev { get; set; } + public string LPDCountAvg { get; set; } + public string LPDCountMax { get; set; } + public string LPDCountMin { get; set; } + public string LPDCountStdDev { get; set; } + public string Operator { get; set; } + public string ParseErrorText { get; set; } + public string PSN { get; set; } + public string RDS { get; set; } + public string Reactor { get; set; } + public string Recipe { get; set; } + public string ScratchCountAvg { get; set; } + public string ScratchCountMax { get; set; } + public string ScratchCountMin { get; set; } + public string ScratchCountStdDev { get; set; } + public string ScratchTotalAvg { get; set; } + public string ScratchTotalMax { get; set; } + public string ScratchTotalMin { get; set; } + public string ScratchTotalStdDev { get; set; } + public string SumOfDefectsAvg { get; set; } + public string SumOfDefectsMax { get; set; } + public string SumOfDefectsMin { get; set; } + public string SumOfDefectsStdDev { get; set; } + public string Title { get; set; } + public string UniqueId { get; set; } + public string Zone { get; set; } + + public string CellName { get; set; } + public string Data { get; set; } + public int i { get; set; } + public List Details { get; protected set; } + + [Obsolete("For json")] public WSRequest() { } + + internal WSRequest(IFileRead fileRead, Logistics logistics, List descriptions) + { + if (fileRead is null) + { } + i = -1; + Id = 0; + Zone = null; + Layer = null; + Title = null; + Data = "*Data*"; + Details = new List(); + CellName = logistics.MesEntity; + pcl.Description x = descriptions[0]; + //Header + { + AreaCountAvg = x.AreaCountAvg; + AreaCountMax = x.AreaCountMax; + AreaCountMin = x.AreaCountMin; + AreaCountStdDev = x.AreaCountStdDev; + AreaTotalAvg = x.AreaTotalAvg; + AreaTotalMax = x.AreaTotalMax; + AreaTotalMin = x.AreaTotalMin; + AreaTotalStdDev = x.AreaTotalStdDev; + Date = x.Date; + HazeAverageAvg = x.HazeAverageAvg; + HazeAverageMax = x.HazeAverageMax; + HazeAverageMin = x.HazeAverageMin; + HazeAverageStdDev = x.HazeAverageStdDev; + HazeRegionAvg = x.HazeRegionAvg; + HazeRegionMax = x.HazeRegionMax; + HazeRegionMin = x.HazeRegionMin; + HazeRegionStdDev = x.HazeRegionStdDev; + LotID = x.Lot; + LPDCM2Avg = x.LPDCM2Avg; + LPDCM2Max = x.LPDCM2Max; + LPDCM2Min = x.LPDCM2Min; + LPDCM2StdDev = x.LPDCM2StdDev; + LPDCountAvg = x.LPDCountAvg; + LPDCountMax = x.LPDCountMax; + LPDCountMin = x.LPDCountMin; + LPDCountStdDev = x.LPDCountStdDev; + ParseErrorText = x.ParseErrorText; + PSN = x.PSN; + RDS = x.RDS; + Reactor = x.Reactor; + Recipe = x.Recipe; + ScratchCountAvg = x.ScratchCountAvg; + ScratchCountMax = x.ScratchCountMax; + ScratchCountMin = x.ScratchCountMin; + ScratchCountStdDev = x.ScratchCountStdDev; + ScratchTotalAvg = x.ScratchTotalAvg; + ScratchTotalMax = x.ScratchTotalMax; + ScratchTotalMin = x.ScratchTotalMin; + ScratchTotalStdDev = x.ScratchTotalStdDev; + SumOfDefectsAvg = x.SumOfDefectsAvg; + SumOfDefectsMax = x.SumOfDefectsMax; + SumOfDefectsMin = x.SumOfDefectsMin; + SumOfDefectsStdDev = x.SumOfDefectsStdDev; + UniqueId = x.UniqueId; + } + pcl.Detail detail; + foreach (pcl.Description description in descriptions) + { + detail = new pcl.Detail + { + Data = "*Data*", + i = -1, + Id = 0, //item.Id, + AreaCount = description.AreaCount, + AreaTotal = description.AreaTotal, + Bin1 = description.Bin1, + Bin2 = description.Bin2, + Bin3 = description.Bin3, + Bin4 = description.Bin4, + Bin5 = description.Bin5, + Bin6 = description.Bin6, + Bin7 = description.Bin7, + Bin8 = description.Bin8, + Comments = description.Comments, + Date = description.Date, + Diameter = description.Diameter, + Exclusion = description.Exclusion, + Gain = description.Gain, + HazeAverage = description.HazeAverage, + HazePeak = description.HazePeak, + HazeRegion = description.HazeRegion, + HazeRng = description.HazeRng, + HeaderUniqueId = description.HeaderUniqueId, + LPDCM2 = description.LPDCM2, + LPDCount = description.LPDCount, + Laser = description.Laser, + Mean = description.Mean, + Recipe = description.Recipe, + ScratchCount = description.ScratchCount, + ScratchTotal = description.ScratchTotal, + Slot = description.Slot, + Sort = description.Sort, + StdDev = description.StdDev, + SumOfDefects = description.SumOfDefects, + Thresh = description.Thresh, + Thruput = description.Thruput, + Title = null, + UniqueId = description.UniqueId + }; + Details.Add(detail); + } + Date = logistics.DateTimeFromSequence.ToString(); + if (UniqueId is null && Details.Any()) + UniqueId = Details[0].HeaderUniqueId; + for (int i = 0; i < Details.Count; i++) + { + if (string.IsNullOrEmpty(Details[i].Bin1)) + Details[i].Bin1 = null; + if (string.IsNullOrEmpty(Details[i].Bin2)) + Details[i].Bin2 = null; + if (string.IsNullOrEmpty(Details[i].Bin3)) + Details[i].Bin3 = null; + if (string.IsNullOrEmpty(Details[i].Bin4)) + Details[i].Bin4 = null; + if (string.IsNullOrEmpty(Details[i].Bin5)) + Details[i].Bin5 = null; + if (string.IsNullOrEmpty(Details[i].Bin6)) + Details[i].Bin6 = null; + if (string.IsNullOrEmpty(Details[i].Bin7)) + Details[i].Bin7 = null; + if (string.IsNullOrEmpty(Details[i].Bin8)) + Details[i].Bin8 = null; + } + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/ManualOIEntry/FileRead.cs b/Adaptation/FileHandlers/ManualOIEntry/FileRead.cs new file mode 100644 index 0000000..3790120 --- /dev/null +++ b/Adaptation/FileHandlers/ManualOIEntry/FileRead.cs @@ -0,0 +1,145 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared; +using Adaptation.Shared.Duplicator; +using Adaptation.Shared.Methods; +using Infineon.Monitoring.MonA; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; + +namespace Adaptation.FileHandlers.IsManualOIEntry; + +public class FileRead : Shared.FileRead, IFileRead +{ + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new Logistics(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) + { + bool isErrorFile = exception is not null; + if (!isErrorFile && !string.IsNullOrEmpty(_Logistics.ReportFullPath)) + { + FileInfo fileInfo = new(_Logistics.ReportFullPath); + if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) + File.SetLastWriteTime(_Logistics.ReportFullPath, fileInfo.CreationTime); + } + Move(extractResults, exception); + } + + void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); + + string IFileRead.GetEventDescription() + { + string result = _Description.GetEventDescription(); + return result; + } + + List IFileRead.GetHeaderNames() + { + List results = _Description.GetHeaderNames(); + return results; + } + + string[] IFileRead.Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception) + { + string[] results = Move(extractResults, to, from, resolvedFileLocation, exception); + return results; + } + + JsonProperty[] IFileRead.GetDefault() + { + JsonProperty[] results = _Description.GetDefault(this, _Logistics); + return results; + } + + Dictionary IFileRead.GetDisplayNamesJsonElement() + { + Dictionary results = _Description.GetDisplayNamesJsonElement(this); + return results; + } + + List IFileRead.GetDescriptions(IFileRead fileRead, List tests, IProcessData processData) + { + List results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); + return results; + } + + Tuple> IFileRead.GetExtractResult(string reportFullPath, string eventName) + { + Tuple> results; + if (string.IsNullOrEmpty(eventName)) + throw new Exception(); + _ReportFullPath = reportFullPath; + DateTime dateTime = DateTime.Now; + results = GetExtractResult(reportFullPath, dateTime); + if (results.Item3 is null) + results = new Tuple>(results.Item1, Array.Empty(), JsonSerializer.Deserialize("[]"), results.Item4); + if (results.Item3.Length > 0 && _IsEAFHosted) + WritePDSF(this, results.Item3); + UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); + return results; + } + + Tuple> IFileRead.ReExtract() + { + Tuple> results; + List headerNames = _Description.GetHeaderNames(); + Dictionary keyValuePairs = _Description.GetDisplayNamesJsonElement(this); + results = ReExtract(this, headerNames, keyValuePairs); + return results; + } + + void IFileRead.CheckTests(Test[] tests, bool extra) + { + if (_Description is not Description) + throw new Exception(); + } + + void IFileRead.Callback(object state) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + if (dateTime == DateTime.MinValue) + { } + Tuple> results = new(string.Empty, null, null, new List()); + string monARessource; + const string site = "sjc"; + string equipment = string.Empty; + string description = string.Empty; + string stateName = "MANUAL_OI_ENTRY"; + string json = File.ReadAllText(reportFullPath); + JsonElement jsonElement = JsonSerializer.Deserialize(json); + foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) + { + if (jsonProperty.Name == "Equipment") + equipment = jsonProperty.Value.ToString(); + else if (jsonProperty.Name == "Description") + description = jsonProperty.Value.ToString(); + } + if (string.IsNullOrEmpty(equipment)) + monARessource = _CellInstanceName; + else + monARessource = equipment; + const string monInURL = "http://moninhttp.sjc.infineon.com/input/text"; + MonIn monIn = MonIn.GetInstance(monInURL); + if (_IsEAFHosted) + _ = monIn.SendStatus(site, monARessource, stateName, State.Warning, description); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/ToArchive/FileRead.cs b/Adaptation/FileHandlers/ToArchive/FileRead.cs new file mode 100644 index 0000000..236f390 --- /dev/null +++ b/Adaptation/FileHandlers/ToArchive/FileRead.cs @@ -0,0 +1,140 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared; +using Adaptation.Shared.Duplicator; +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; + +namespace Adaptation.FileHandlers.ToArchive; + +public class FileRead : Shared.FileRead, IFileRead +{ + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new Logistics(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) + { + bool isErrorFile = exception is not null; + if (!isErrorFile && !string.IsNullOrEmpty(_Logistics.ReportFullPath)) + { + FileInfo fileInfo = new(_Logistics.ReportFullPath); + if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) + File.SetLastWriteTime(_Logistics.ReportFullPath, fileInfo.CreationTime); + } + Move(extractResults, exception); + } + + void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); + + string IFileRead.GetEventDescription() + { + string result = _Description.GetEventDescription(); + return result; + } + + List IFileRead.GetHeaderNames() + { + List results = _Description.GetHeaderNames(); + return results; + } + + string[] IFileRead.Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception) + { + string[] results = Move(extractResults, to, from, resolvedFileLocation, exception); + return results; + } + + JsonProperty[] IFileRead.GetDefault() + { + JsonProperty[] results = _Description.GetDefault(this, _Logistics); + return results; + } + + Dictionary IFileRead.GetDisplayNamesJsonElement() + { + Dictionary results = _Description.GetDisplayNamesJsonElement(this); + return results; + } + + List IFileRead.GetDescriptions(IFileRead fileRead, List tests, IProcessData processData) + { + List results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); + return results; + } + + Tuple> IFileRead.GetExtractResult(string reportFullPath, string eventName) + { + Tuple> results; + if (string.IsNullOrEmpty(eventName)) + throw new Exception(); + _ReportFullPath = reportFullPath; + DateTime dateTime = DateTime.Now; + results = GetExtractResult(reportFullPath, dateTime); + if (results.Item3 is null) + results = new Tuple>(results.Item1, Array.Empty(), JsonSerializer.Deserialize("[]"), results.Item4); + if (results.Item3.Length > 0 && _IsEAFHosted) + WritePDSF(this, results.Item3); + UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); + return results; + } + + Tuple> IFileRead.ReExtract() + { + Tuple> results; + List headerNames = _Description.GetHeaderNames(); + Dictionary keyValuePairs = _Description.GetDisplayNamesJsonElement(this); + results = ReExtract(this, headerNames, keyValuePairs); + return results; + } + + void IFileRead.CheckTests(Test[] tests, bool extra) + { + if (_Description is not Description) + throw new Exception(); + } + + void IFileRead.Callback(object state) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + if (dateTime == DateTime.MinValue) + { } + Tuple> results = new(string.Empty, null, null, new List()); + _Logistics = new Logistics(this, reportFullPath, useSplitForMID: true); + SetFileParameterLotIDToLogisticsMID(); + + string[] segments = Path.GetFileNameWithoutExtension(reportFullPath).Split('_'); + string duplicateDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\", segments[0]); + if (segments.Length > 2) + duplicateDirectory = string.Concat(duplicateDirectory, @"-", segments[2]); + if (!Directory.Exists(duplicateDirectory)) + _ = Directory.CreateDirectory(duplicateDirectory); + + string logisticsSequence = _Logistics.Sequence.ToString(); + bool isDummyRun = _DummyRuns.Any() && _DummyRuns.ContainsKey(_Logistics.JobID) && _DummyRuns[_Logistics.JobID].Any() && (from l in _DummyRuns[_Logistics.JobID] where l == _Logistics.Sequence select 1).Any(); + + List> tuples = new(); + + string destinationDirectory = WriteScopeInfo(_ProgressPath, _Logistics, dateTime, duplicateDirectory, tuples); + if (isDummyRun) + Shared0607(reportFullPath, duplicateDirectory, logisticsSequence, destinationDirectory); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/pcl/Description.cs b/Adaptation/FileHandlers/pcl/Description.cs new file mode 100644 index 0000000..9b7e6fd --- /dev/null +++ b/Adaptation/FileHandlers/pcl/Description.cs @@ -0,0 +1,499 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; + +namespace Adaptation.FileHandlers.pcl; + +public class Description : IDescription, Shared.Properties.IDescription +{ + + public int Test { get; set; } + public int Count { get; set; } + public int Index { get; set; } + // + public string EventName { get; set; } + public string NullData { get; set; } + public string JobID { get; set; } + public string Sequence { get; set; } + public string MesEntity { get; set; } + public string ReportFullPath { get; set; } + public string ProcessJobID { get; set; } + public string MID { get; set; } + // + public string Date { get; set; } + public string Employee { get; set; } + public string Lot { get; set; } + public string PSN { get; set; } + public string Reactor { get; set; } + public string Recipe { get; set; } + // + public string Comments { get; set; } + public string Diameter { get; set; } + public string Exclusion { get; set; } + public string Gain { get; set; } + public string HeaderUniqueId { get; set; } + public string Laser { get; set; } + public string ParseErrorText { get; set; } + public string RDS { get; set; } + public string Slot { get; set; } + public string UniqueId { get; set; } + // + public string AreaCount { get; set; } + public string AreaCountAvg { get; set; } + public string AreaCountMax { get; set; } + public string AreaCountMin { get; set; } + public string AreaCountStdDev { get; set; } + public string AreaTotal { get; set; } + public string AreaTotalAvg { get; set; } + public string AreaTotalMax { get; set; } + public string AreaTotalMin { get; set; } + public string AreaTotalStdDev { get; set; } + public string Bin1 { get; set; } + public string Bin2 { get; set; } + public string Bin3 { get; set; } + public string Bin4 { get; set; } + public string Bin5 { get; set; } + public string Bin6 { get; set; } + public string Bin7 { get; set; } + public string Bin8 { get; set; } + public string HazeAverage { get; set; } + public string HazeAverageAvg { get; set; } + public string HazeAverageMax { get; set; } + public string HazeAverageMin { get; set; } + public string HazeAverageStdDev { get; set; } + public string HazePeak { get; set; } + public string HazeRegion { get; set; } + public string HazeRegionAvg { get; set; } + public string HazeRegionMax { get; set; } + public string HazeRegionMin { get; set; } + public string HazeRegionStdDev { get; set; } + public string HazeRng { get; set; } + public string LPDCM2 { get; set; } + public string LPDCM2Avg { get; set; } + public string LPDCM2Max { get; set; } + public string LPDCM2Min { get; set; } + public string LPDCM2StdDev { get; set; } + public string LPDCount { get; set; } + public string LPDCountAvg { get; set; } + public string LPDCountMax { get; set; } + public string LPDCountMin { get; set; } + public string LPDCountStdDev { get; set; } + public string Mean { get; set; } + public string ScratchCount { get; set; } + public string ScratchCountAvg { get; set; } + public string ScratchCountMax { get; set; } + public string ScratchCountMin { get; set; } + public string ScratchCountStdDev { get; set; } + public string ScratchTotal { get; set; } + public string ScratchTotalAvg { get; set; } + public string ScratchTotalMax { get; set; } + public string ScratchTotalMin { get; set; } + public string ScratchTotalStdDev { get; set; } + public string Sort { get; set; } + public string StdDev { get; set; } + public string SumOfDefects { get; set; } + public string SumOfDefectsAvg { get; set; } + public string SumOfDefectsMax { get; set; } + public string SumOfDefectsMin { get; set; } + public string SumOfDefectsStdDev { get; set; } + public string Thresh { get; set; } + public string Thruput { get; set; } + // + public object Data { get; set; } + public object Parameters { get; set; } + + string IDescription.GetEventDescription() => "File Has been read and parsed"; + + List IDescription.GetNames(IFileRead fileRead, Logistics logistics) + { + List results = new(); + IDescription description = GetDefault(fileRead, logistics); + string json = JsonSerializer.Serialize(description, description.GetType()); + object @object = JsonSerializer.Deserialize(json); + if (@object is not JsonElement jsonElement) + throw new Exception(); + foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) + results.Add(jsonProperty.Name); + return results; + } + + List IDescription.GetDetailNames() + { + List results = new() + { + nameof(Comments), + nameof(Diameter), + nameof(Exclusion), + nameof(Gain), + nameof(HeaderUniqueId), + nameof(Laser), + nameof(ParseErrorText), + nameof(RDS), + nameof(Slot), + nameof(UniqueId) + }; + return results; + } + + List IDescription.GetHeaderNames() + { + List results = new() + { + nameof(Date), + nameof(Employee), + nameof(Lot), + nameof(PSN), + nameof(Reactor), + nameof(Recipe) + }; + return results; + } + + IDescription IDescription.GetDisplayNames() + { + Description result = GetDisplayNames(); + return result; + } + + List IDescription.GetParameterNames() + { + List results = new() + { + nameof(AreaCount), + nameof(AreaCountAvg), + nameof(AreaCountMax), + nameof(AreaCountMin), + nameof(AreaCountStdDev), + nameof(AreaTotal), + nameof(AreaTotalAvg), + nameof(AreaTotalMax), + nameof(AreaTotalMin), + nameof(AreaTotalStdDev), + nameof(Bin1), + nameof(Bin2), + nameof(Bin3), + nameof(Bin4), + nameof(Bin5), + nameof(Bin6), + nameof(Bin7), + nameof(Bin8), + nameof(HazeAverage), + nameof(HazeAverageAvg), + nameof(HazeAverageMax), + nameof(HazeAverageMin), + nameof(HazeAverageStdDev), + nameof(HazePeak), + nameof(HazeRegion), + nameof(HazeRegionAvg), + nameof(HazeRegionMax), + nameof(HazeRegionMin), + nameof(HazeRegionStdDev), + nameof(HazeRng), + nameof(LPDCM2), + nameof(LPDCM2Avg), + nameof(LPDCM2Max), + nameof(LPDCM2Min), + nameof(LPDCM2StdDev), + nameof(LPDCount), + nameof(LPDCountAvg), + nameof(LPDCountMax), + nameof(LPDCountMin), + nameof(LPDCountStdDev), + nameof(Mean), + nameof(ScratchCount), + nameof(ScratchCountAvg), + nameof(ScratchCountMax), + nameof(ScratchCountMin), + nameof(ScratchCountStdDev), + nameof(ScratchTotal), + nameof(ScratchTotalAvg), + nameof(ScratchTotalMax), + nameof(ScratchTotalMin), + nameof(ScratchTotalStdDev), + nameof(Sort), + nameof(StdDev), + nameof(SumOfDefects), + nameof(SumOfDefectsAvg), + nameof(SumOfDefectsMax), + nameof(SumOfDefectsMin), + nameof(SumOfDefectsStdDev), + nameof(Thresh), + nameof(Thruput) + }; + return results; + } + + JsonProperty[] IDescription.GetDefault(IFileRead fileRead, Logistics logistics) + { + JsonProperty[] results; + IDescription description = GetDefault(fileRead, logistics); + string json = JsonSerializer.Serialize(description, description.GetType()); + object @object = JsonSerializer.Deserialize(json); + results = ((JsonElement)@object).EnumerateObject().ToArray(); + return results; + } + + List IDescription.GetPairedParameterNames() + { + List results = new(); + return results; + } + + List IDescription.GetIgnoreParameterNames(Test test) + { + List results = new(); + return results; + } + + IDescription IDescription.GetDefaultDescription(IFileRead fileRead, Logistics logistics) + { + Description result = GetDefault(fileRead, logistics); + return result; + } + + Dictionary IDescription.GetDisplayNamesJsonElement(IFileRead fileRead) + { + Dictionary results = new(); + IDescription description = GetDisplayNames(); + string json = JsonSerializer.Serialize(description, description.GetType()); + JsonElement jsonElement = JsonSerializer.Deserialize(json); + foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) + { + if (!results.ContainsKey(jsonProperty.Name)) + results.Add(jsonProperty.Name, string.Empty); + if (jsonProperty.Value is JsonElement jsonPropertyValue) + results[jsonProperty.Name] = jsonPropertyValue.ToString(); + } + return results; + } + + List IDescription.GetDescriptions(IFileRead fileRead, Logistics logistics, List tests, IProcessData iProcessData) + { + List results = new(); + if (iProcessData is null || !iProcessData.Details.Any() || iProcessData is not ProcessData processData) + results.Add(GetDefault(fileRead, logistics)); + else + { + string nullData; + Description description; + object configDataNullData = fileRead.NullData; + if (configDataNullData is null) + nullData = string.Empty; + else + nullData = configDataNullData.ToString(); + for (int i = 0; i < iProcessData.Details.Count; i++) + { + if (iProcessData.Details[i] is not Detail detail) + continue; + description = new Description + { + Test = (int)tests[i], + Count = tests.Count, + Index = i, + // + EventName = fileRead.EventName, + NullData = nullData, + JobID = fileRead.CellInstanceName, + Sequence = logistics.Sequence.ToString(), + MesEntity = logistics.MesEntity, + ReportFullPath = logistics.ReportFullPath, + ProcessJobID = logistics.ProcessJobID, + MID = logistics.MID, + // + Date = processData.Date, + Employee = processData.PSN, + Lot = processData.Lot, + PSN = processData.PSN, + Reactor = processData.Reactor, + Recipe = processData.Recipe, + // + Comments = detail.Comments, + Diameter = detail.Diameter, + Exclusion = detail.Exclusion, + Gain = detail.Gain, + HeaderUniqueId = detail.UniqueId, + Laser = detail.Laser, + ParseErrorText = processData.ParseErrorText, + RDS = processData.RDS, + Slot = detail.Slot, + UniqueId = detail.UniqueId, + // + AreaCount = detail.AreaCount, + AreaCountAvg = processData.AreaCountAvg, + AreaCountMax = processData.AreaCountMax, + AreaCountMin = processData.AreaCountMin, + AreaCountStdDev = processData.AreaCountStdDev, + AreaTotal = detail.AreaTotal, + AreaTotalAvg = processData.AreaTotalAvg, + AreaTotalMax = processData.AreaTotalMax, + AreaTotalMin = processData.AreaTotalMin, + AreaTotalStdDev = processData.AreaTotalStdDev, + Bin1 = detail.Bin1, + Bin2 = detail.Bin2, + Bin3 = detail.Bin3, + Bin4 = detail.Bin4, + Bin5 = detail.Bin5, + Bin6 = detail.Bin6, + Bin7 = detail.Bin7, + Bin8 = detail.Bin8, + HazeAverage = detail.HazeAverage, + HazeAverageAvg = processData.HazeAverageAvg, + HazeAverageMax = processData.HazeAverageMax, + HazeAverageMin = processData.HazeAverageMin, + HazeAverageStdDev = processData.HazeAverageStdDev, + HazePeak = detail.HazePeak, + HazeRegion = detail.HazeRegion, + HazeRegionAvg = processData.HazeRegionAvg, + HazeRegionMax = processData.HazeRegionMax, + HazeRegionMin = processData.HazeRegionMin, + HazeRegionStdDev = processData.HazeRegionStdDev, + HazeRng = detail.HazeRng, + LPDCM2 = detail.LPDCM2, + LPDCM2Avg = processData.LPDCM2Avg, + LPDCM2Max = processData.LPDCM2Max, + LPDCM2Min = processData.LPDCM2Min, + LPDCM2StdDev = processData.LPDCM2StdDev, + LPDCount = detail.LPDCount, + LPDCountAvg = processData.LPDCountAvg, + LPDCountMax = processData.LPDCountMax, + LPDCountMin = processData.LPDCountMin, + LPDCountStdDev = processData.LPDCountStdDev, + Mean = detail.Mean, + ScratchCount = detail.ScratchCount, + ScratchCountAvg = processData.ScratchCountAvg, + ScratchCountMax = processData.ScratchCountMax, + ScratchCountMin = processData.ScratchCountMin, + ScratchCountStdDev = processData.ScratchCountStdDev, + ScratchTotal = detail.ScratchTotal, + ScratchTotalAvg = processData.ScratchTotalAvg, + ScratchTotalMax = processData.ScratchTotalMax, + ScratchTotalMin = processData.ScratchTotalMin, + ScratchTotalStdDev = processData.ScratchTotalStdDev, + Sort = detail.Sort, + StdDev = detail.StdDev, + SumOfDefects = detail.SumOfDefects, + SumOfDefectsAvg = processData.SumOfDefectsAvg, + SumOfDefectsMax = processData.SumOfDefectsMax, + SumOfDefectsMin = processData.SumOfDefectsMin, + SumOfDefectsStdDev = processData.SumOfDefectsStdDev, + Thresh = detail.Thresh, + Thruput = detail.Thruput + }; + results.Add(description); + } + } + return results; + } + + private static Description GetDisplayNames() + { + Description result = new(); + return result; + } + + private Description GetDefault(IFileRead fileRead, Logistics logistics) + { + Description result = new() + { + Test = -1, + Count = 0, + Index = -1, + // + EventName = fileRead.EventName, + NullData = fileRead.NullData, + JobID = fileRead.CellInstanceName, + Sequence = logistics.Sequence.ToString(), + MesEntity = fileRead.MesEntity, + ReportFullPath = logistics.ReportFullPath, + ProcessJobID = logistics.ProcessJobID, + MID = logistics.MID, + // + Date = nameof(Date), + Employee = nameof(Employee), + Lot = nameof(Lot), + PSN = nameof(PSN), + Reactor = nameof(Reactor), + Recipe = nameof(Recipe), + // + Comments = nameof(Comments), + Diameter = nameof(Diameter), + Exclusion = nameof(Exclusion), + Gain = nameof(Gain), + HeaderUniqueId = nameof(HeaderUniqueId), + Laser = nameof(Laser), + ParseErrorText = nameof(ParseErrorText), + RDS = nameof(RDS), + Slot = nameof(Slot), + UniqueId = nameof(UniqueId), + // + AreaCount = nameof(AreaCount), + AreaCountAvg = nameof(AreaCountAvg), + AreaCountMax = nameof(AreaCountMax), + AreaCountMin = nameof(AreaCountMin), + AreaCountStdDev = nameof(AreaCountStdDev), + AreaTotal = nameof(AreaTotal), + AreaTotalAvg = nameof(AreaTotalAvg), + AreaTotalMax = nameof(AreaTotalMax), + AreaTotalMin = nameof(AreaTotalMin), + AreaTotalStdDev = nameof(AreaTotalStdDev), + Bin1 = nameof(Bin1), + Bin2 = nameof(Bin2), + Bin3 = nameof(Bin3), + Bin4 = nameof(Bin4), + Bin5 = nameof(Bin5), + Bin6 = nameof(Bin6), + Bin7 = nameof(Bin7), + Bin8 = nameof(Bin8), + HazeAverage = nameof(HazeAverage), + HazeAverageAvg = nameof(HazeAverageAvg), + HazeAverageMax = nameof(HazeAverageMax), + HazeAverageMin = nameof(HazeAverageMin), + HazeAverageStdDev = nameof(HazeAverageStdDev), + HazePeak = nameof(HazePeak), + HazeRegion = nameof(HazeRegion), + HazeRegionAvg = nameof(HazeRegionAvg), + HazeRegionMax = nameof(HazeRegionMax), + HazeRegionMin = nameof(HazeRegionMin), + HazeRegionStdDev = nameof(HazeRegionStdDev), + HazeRng = nameof(HazeRng), + LPDCM2 = nameof(LPDCM2), + LPDCM2Avg = nameof(LPDCM2Avg), + LPDCM2Max = nameof(LPDCM2Max), + LPDCM2Min = nameof(LPDCM2Min), + LPDCM2StdDev = nameof(LPDCM2StdDev), + LPDCount = nameof(LPDCount), + LPDCountAvg = nameof(LPDCountAvg), + LPDCountMax = nameof(LPDCountMax), + LPDCountMin = nameof(LPDCountMin), + LPDCountStdDev = nameof(LPDCountStdDev), + Mean = nameof(Mean), + ScratchCount = nameof(ScratchCount), + ScratchCountAvg = nameof(ScratchCountAvg), + ScratchCountMax = nameof(ScratchCountMax), + ScratchCountMin = nameof(ScratchCountMin), + ScratchCountStdDev = nameof(ScratchCountStdDev), + ScratchTotal = nameof(ScratchTotal), + ScratchTotalAvg = nameof(ScratchTotalAvg), + ScratchTotalMax = nameof(ScratchTotalMax), + ScratchTotalMin = nameof(ScratchTotalMin), + ScratchTotalStdDev = nameof(ScratchTotalStdDev), + Sort = nameof(Sort), + StdDev = nameof(StdDev), + SumOfDefects = nameof(SumOfDefects), + SumOfDefectsAvg = nameof(SumOfDefectsAvg), + SumOfDefectsMax = nameof(SumOfDefectsMax), + SumOfDefectsMin = nameof(SumOfDefectsMin), + SumOfDefectsStdDev = nameof(SumOfDefectsStdDev), + Thresh = nameof(Thresh), + Thruput = nameof(Thruput), + // + Data = nameof(Data), + Parameters = nameof(Parameters) + }; + return result; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/pcl/Detail.cs b/Adaptation/FileHandlers/pcl/Detail.cs new file mode 100644 index 0000000..f5c111c --- /dev/null +++ b/Adaptation/FileHandlers/pcl/Detail.cs @@ -0,0 +1,45 @@ +namespace Adaptation.FileHandlers.pcl; + +public class Detail +{ + + public long Id { get; set; } + public string AreaCount { get; set; } + public string AreaTotal { get; set; } + public string Bin1 { get; set; } + public string Bin2 { get; set; } + public string Bin3 { get; set; } + public string Bin4 { get; set; } + public string Bin5 { get; set; } + public string Bin6 { get; set; } + public string Bin7 { get; set; } + public string Bin8 { get; set; } + public string Comments { get; set; } + public string Date { get; set; } + public string Diameter { get; set; } + public string Exclusion { get; set; } + public string Gain { get; set; } + public string HazeAverage { get; set; } + public string HazePeak { get; set; } + public string HazeRegion { get; set; } + public string HazeRng { get; set; } + public string HeaderUniqueId { get; set; } + public string LPDCM2 { get; set; } + public string LPDCount { get; set; } + public string Laser { get; set; } + public string Mean { get; set; } + public string Recipe { get; set; } + public string ScratchCount { get; set; } + public string ScratchTotal { get; set; } + public string Slot { get; set; } + public string Sort { get; set; } + public string StdDev { get; set; } + public string SumOfDefects { get; set; } + public string Thresh { get; set; } + public string Thruput { get; set; } + public string Title { get; set; } + public string UniqueId { get; set; } + public string Data { get; set; } + public int i { get; set; } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/pcl/FileRead.cs b/Adaptation/FileHandlers/pcl/FileRead.cs new file mode 100644 index 0000000..6a75feb --- /dev/null +++ b/Adaptation/FileHandlers/pcl/FileRead.cs @@ -0,0 +1,131 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace Adaptation.FileHandlers.pcl; + +public class FileRead : Shared.FileRead, IFileRead +{ + + private readonly string _GhostPCLFileName; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), true, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new Logistics(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + _GhostPCLFileName = string.Concat(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), @"\gpcl6win64.exe"); + if (_IsEAFHosted && !File.Exists(_GhostPCLFileName)) + throw new Exception("Ghost PCL FileName doesn't Exist!"); + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) => Move(extractResults, exception); + + void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); + + string IFileRead.GetEventDescription() + { + string result = _Description.GetEventDescription(); + return result; + } + + List IFileRead.GetHeaderNames() + { + List results = _Description.GetHeaderNames(); + return results; + } + + string[] IFileRead.Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception) + { + string[] results = Move(extractResults, to, from, resolvedFileLocation, exception); + return results; + } + + JsonProperty[] IFileRead.GetDefault() + { + JsonProperty[] results = _Description.GetDefault(this, _Logistics); + return results; + } + + Dictionary IFileRead.GetDisplayNamesJsonElement() + { + Dictionary results = _Description.GetDisplayNamesJsonElement(this); + return results; + } + + List IFileRead.GetDescriptions(IFileRead fileRead, List tests, IProcessData processData) + { + List results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); + return results; + } + + Tuple> IFileRead.GetExtractResult(string reportFullPath, string eventName) + { + Tuple> results; + if (string.IsNullOrEmpty(eventName)) + throw new Exception(); + _ReportFullPath = reportFullPath; + DateTime dateTime = DateTime.Now; + results = GetExtractResult(reportFullPath, dateTime); + if (results.Item3 is null) + results = new Tuple>(results.Item1, Array.Empty(), JsonSerializer.Deserialize("[]"), results.Item4); + if (results.Item3.Length > 0 && _IsEAFHosted) + WritePDSF(this, results.Item3); + UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); + return results; + } + + Tuple> IFileRead.ReExtract() + { + Tuple> results; + List headerNames = _Description.GetHeaderNames(); + Dictionary keyValuePairs = _Description.GetDisplayNamesJsonElement(this); + results = ReExtract(this, headerNames, keyValuePairs); + return results; + } + + void IFileRead.CheckTests(Test[] tests, bool extra) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); + + void IFileRead.Callback(object state) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + Tuple> results = new(string.Empty, null, null, new List()); + _Logistics = new Logistics(this, reportFullPath, useSplitForMID: true); + SetFileParameterLotIDToLogisticsMID(); + if (reportFullPath.Length < _MinFileLength) + results.Item4.Add(new FileInfo(reportFullPath)); + else + { + IProcessData iProcessData = new ProcessData(this, _Logistics, results.Item4, _GhostPCLFileName); + if (iProcessData is ProcessData processData) + { + string mid = string.Concat(processData.Reactor, "-", processData.RDS, "-", processData.PSN); + mid = Regex.Replace(mid, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; + _Logistics.MID = mid; + SetFileParameterLotID(mid); + _Logistics.ProcessJobID = processData.Reactor; + } + if (!iProcessData.Details.Any()) + throw new Exception(string.Concat("No Data - ", dateTime.Ticks)); + results = iProcessData.GetResults(this, _Logistics, results.Item4); + } + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/pcl/ProcessData.cs b/Adaptation/FileHandlers/pcl/ProcessData.cs new file mode 100644 index 0000000..6c7cf83 --- /dev/null +++ b/Adaptation/FileHandlers/pcl/ProcessData.cs @@ -0,0 +1,672 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using log4net; +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace Adaptation.FileHandlers.pcl; + +public class ProcessData : IProcessData +{ + + private int _I; + private string _Data; + + private readonly ILog _Log; + private readonly List _Details; + + public string JobID { get; set; } + public string MesEntity { get; set; } + public string AreaCountAvg { get; set; } + public string AreaCountMax { get; set; } + public string AreaCountMin { get; set; } + public string AreaCountStdDev { get; set; } + public string AreaTotalAvg { get; set; } + public string AreaTotalMax { get; set; } + public string AreaTotalMin { get; set; } + public string AreaTotalStdDev { get; set; } + public string Date { get; set; } + public string HazeAverageAvg { get; set; } + public string HazeAverageMax { get; set; } + public string HazeAverageMin { get; set; } + public string HazeAverageStdDev { get; set; } + public string HazeRegionAvg { get; set; } + public string HazeRegionMax { get; set; } + public string HazeRegionMin { get; set; } + public string HazeRegionStdDev { get; set; } + public string LPDCM2Avg { get; set; } + public string LPDCM2Max { get; set; } + public string LPDCM2Min { get; set; } + public string LPDCM2StdDev { get; set; } + public string LPDCountAvg { get; set; } + public string LPDCountMax { get; set; } + public string LPDCountMin { get; set; } + public string LPDCountStdDev { get; set; } + public string Lot { get; set; } + public string ParseErrorText { get; set; } + public string PSN { get; set; } + public string RDS { get; set; } + public string Reactor { get; set; } + public string Recipe { get; set; } + public string ScratchCountAvg { get; set; } + public string ScratchCountMax { get; set; } + public string ScratchCountMin { get; set; } + public string ScratchCountStdDev { get; set; } + public string ScratchTotalAvg { get; set; } + public string ScratchTotalMax { get; set; } + public string ScratchTotalMin { get; set; } + public string ScratchTotalStdDev { get; set; } + public string SumOfDefectsAvg { get; set; } + public string SumOfDefectsMax { get; set; } + public string SumOfDefectsMin { get; set; } + public string SumOfDefectsStdDev { get; set; } + public string UniqueId { get; set; } + + List Shared.Properties.IProcessData.Details => _Details; + + public ProcessData(IFileRead fileRead, Logistics logistics, List fileInfoCollection, string ghostPCLFileName) + { + fileInfoCollection.Clear(); + _Details = new List(); + _I = 0; + _Data = string.Empty; + JobID = logistics.JobID; + MesEntity = logistics.MesEntity; + _Log = LogManager.GetLogger(typeof(ProcessData)); + Parse(fileRead, logistics, fileInfoCollection, ghostPCLFileName); + } + + string IProcessData.GetCurrentReactor(IFileRead fileRead, Logistics logistics, Dictionary reactors) => throw new Exception(string.Concat("See ", nameof(Parse))); + + Tuple> IProcessData.GetResults(IFileRead fileRead, Logistics logistics, List fileInfoCollection) + { + Tuple> results; + List tests = new(); + foreach (object item in _Details) + tests.Add(Test.Tencor); + List descriptions = fileRead.GetDescriptions(fileRead, tests, this); + if (tests.Count != descriptions.Count) + throw new Exception(); + for (int i = 0; i < tests.Count; i++) + { + if (descriptions[i] is not Description description) + throw new Exception(); + if (description.Test != (int)tests[i]) + throw new Exception(); + } + List fileReadDescriptions = (from l in descriptions select (Description)l).ToList(); + string json = JsonSerializer.Serialize(fileReadDescriptions, fileReadDescriptions.GetType()); + JsonElement[] jsonElements = JsonSerializer.Deserialize(json); + results = new Tuple>(logistics.Logistics1[0], tests.ToArray(), jsonElements, fileInfoCollection); + return results; + } + + /// + /// Test and fix a data line from the Lot Summary page if there are two values that are merged. + /// + /// data line from Lot Summary + private void FixToEolArray(ref string[] toEol) + { + const int MAX_COLUMNS = 9; + int[] mColumnWidths = new int[MAX_COLUMNS] { 8, 6, 6, 6, 6, 7, 7, 5, 7 }; + // is it short at least one data point + if (toEol.Length < MAX_COLUMNS) + { + _Log.Debug($"****FixToEolArray - Starting array:"); + _Log.Debug(toEol); + _Log.Debug($"****FixToEolArray - Column widths:"); + _Log.Debug(mColumnWidths); + string leftVal, rightVal; + + // size up and assign a working list + List toEolList = new(toEol); + if (string.IsNullOrEmpty(toEolList[toEolList.Count - 1])) + toEolList.RemoveAt(toEolList.Count - 1); // removes a null element at end + _Log.Debug($"****FixToEolArray - New toEolList:"); + _Log.Debug(toEolList); + for (int i = toEolList.Count; i < MAX_COLUMNS; i++) + toEolList.Insert(0, ""); // insert to top of list + _Log.Debug(toEolList); + + // start at the end + for (int i = MAX_COLUMNS - 1; i >= 0; i--) + { + // test for a bad value - does it have too many characters + _Log.Debug($"****FixToEolArray - toEolList[i].Length: {toEolList[i].Length}, mColumnWidths[i]: {mColumnWidths[i]}"); + if (toEolList[i].Length > mColumnWidths[i]) + { + // split it up into its two parts + leftVal = toEolList[i].Substring(0, toEolList[i].Length - mColumnWidths[i]); + rightVal = toEolList[i].Substring(leftVal.Length); + _Log.Debug($"****FixToEolArray - Split leftVal: {leftVal}"); + _Log.Debug($"****FixToEolArray - Split rightVal: {rightVal}"); + + // insert new value + toEolList[i] = rightVal; + toEolList.Insert(i, leftVal); + if (string.IsNullOrEmpty(toEolList[0])) + toEolList.RemoveAt(0); // removes a null element at end + _Log.Debug($"****FixToEolArray - Fixed toEolList:"); + _Log.Debug(toEolList); + } + } + toEol = toEolList.ToArray(); + _Log.Debug($"****FixToEolArray - Ending array:"); + _Log.Debug(toEol); + } + } + + private void ScanPast(string text) + { + int num = _Data.IndexOf(text, _I); + if (num > -1) + _I = num + text.Length; + else + _I = _Data.Length; + } + + private string GetBefore(string text) + { + int num = _Data.IndexOf(text, _I); + if (num > -1) + { + string str = _Data.Substring(_I, num - _I); + _I = num + text.Length; + return str.Trim(); + } + string str1 = _Data.Substring(_I); + _I = _Data.Length; + return str1.Trim(); + } + + private string GetBefore(string text, bool trim) + { + if (trim) + return GetBefore(text); + int num = _Data.IndexOf(text, _I); + if (num > -1) + { + string str = _Data.Substring(_I, num - _I); + _I = num + text.Length; + return str; + } + string str1 = _Data.Substring(_I); + _I = _Data.Length; + return str1; + } + + private static bool IsNullOrWhiteSpace(string text) + { + for (int index = 0; index < text.Length; ++index) + { + if (!char.IsWhiteSpace(text[index])) + return false; + } + return true; + } + + private bool IsBlankLine() + { + int num = _Data.IndexOf("\n", _I); + return IsNullOrWhiteSpace(num > -1 ? _Data.Substring(_I, num - _I) : _Data.Substring(_I)); + } + + private string GetToEOL() => GetBefore("\n"); + + private string GetToEOL(bool trim) + { + if (trim) + return GetToEOL(); + return GetBefore("\n", false); + } + + private string GetToText(string text) => _Data.Substring(_I, _Data.IndexOf(text, _I) - _I).Trim(); + + private string GetToken() + { + while (_I < _Data.Length && IsNullOrWhiteSpace(_Data.Substring(_I, 1))) + ++_I; + int j = _I; + while (j < _Data.Length && !IsNullOrWhiteSpace(_Data.Substring(j, 1))) + ++j; + string str = _Data.Substring(_I, j - _I); + _I = j; + return str.Trim(); + } + + private string PeekNextLine() + { + int j = _I; + string toEol = GetToEOL(); + _I = j; + return toEol; + } + + private void ParseLotSummary(IFileRead fileRead, ILogistics logistics, string headerFileName, Dictionary pages, Dictionary> slots) + { + if (fileRead is null) + { } + _I = 0; + //string headerText; + //string altHeaderFileName = Path.ChangeExtension(headerFileName, ".txt"); + //if (File.Exists(altHeaderFileName)) + // headerText = File.ReadAllText(altHeaderFileName); + //else + //{ + // //Pdfbox, IKVM.AWT.WinForms + // org.apache.pdfbox.pdmodel.PDDocument pdfDocument = org.apache.pdfbox.pdmodel.PDDocument.load(headerFileName); + // org.apache.pdfbox.util.PDFTextStripper stripper = new org.apache.pdfbox.util.PDFTextStripper(); + // headerText = stripper.getText(pdfDocument); + // pdfDocument.close(); + // File.AppendAllText(altHeaderFileName, headerText); + //} + //result.Id = h; + //result.Title = h; + //result.Zone = h; + //result.PSN = h; + //result.Layer = h; + ParseErrorText = string.Empty; + if (!pages.ContainsKey(headerFileName)) + throw new Exception(); + _I = 0; + _Data = pages[headerFileName]; + ScanPast("Date:"); + Date = GetToEOL(); + ScanPast("Recipe ID:"); + Recipe = GetBefore("LotID:"); + Recipe = Recipe.Replace(";", ""); + if (_Data.Contains("[]")) + Lot = GetBefore("[]"); + else if (_Data.Contains("[7]")) + Lot = GetBefore("[7]"); + else + Lot = GetBefore("["); + + // Remove illegal characters \/:*?"<>| found in the Lot. + Lot = Regex.Replace(Lot, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; + + // determine number of wafers and their slot numbers + _Log.Debug(_Data.Substring(_I)); + string slot; + string toEOL; + int slotCount = _Data.Substring(_I).Split('*').Length - 1; + _Log.Debug($"****HeaderFile - Slot Count: {slotCount}."); + for (int i = 0; i < slotCount; i++) + { + ScanPast("*"); + toEOL = GetToEOL(false); + slot = string.Concat("*", toEOL.Substring(0, 2)); + if (!slots.ContainsKey(slot)) + slots.Add(slot, new List()); + } + _Log.Debug($"****HeaderFile - Slots:"); + _Log.Debug(slots); + + ScanPast("Min:"); + + string[] toEol1 = GetToEOL(false).Trim().Split(' '); + _Log.Debug($"****HeaderFile - toEol1 Count: {toEol1.Length}."); + FixToEolArray(ref toEol1); + LPDCountMin = toEol1[0].Trim(); + LPDCM2Min = toEol1[1].Trim(); + AreaCountMin = toEol1[2].Trim(); + AreaTotalMin = toEol1[3].Trim(); + ScratchCountMin = toEol1[4].Trim(); + ScratchTotalMin = toEol1[5].Trim(); + SumOfDefectsMin = toEol1[6].Trim(); + HazeRegionMin = toEol1[7].Trim(); + HazeAverageMin = toEol1[8].Trim(); + ScanPast("Max:"); + + string[] toEol2 = GetToEOL(false).Trim().Split(' '); + _Log.Debug($"****HeaderFile - toEol2 Count: {toEol2.Length}."); + FixToEolArray(ref toEol2); + LPDCountMax = toEol2[0].Trim(); + LPDCM2Max = toEol2[1].Trim(); + AreaCountMax = toEol2[2].Trim(); + AreaTotalMax = toEol2[3].Trim(); + ScratchCountMax = toEol2[4].Trim(); + ScratchTotalMax = toEol2[5].Trim(); + SumOfDefectsMax = toEol2[6].Trim(); + HazeRegionMax = toEol2[7].Trim(); + HazeAverageMax = toEol2[8].Trim(); + ScanPast("Average:"); + + string[] toEol3 = GetToEOL(false).Trim().Split(' '); + _Log.Debug($"****HeaderFile - toEol3 Count: {toEol3.Length}."); + FixToEolArray(ref toEol3); + LPDCountAvg = toEol3[0].Trim(); + LPDCM2Avg = toEol3[1].Trim(); + AreaCountAvg = toEol3[2].Trim(); + AreaTotalAvg = toEol3[3].Trim(); + ScratchCountAvg = toEol3[4].Trim(); + ScratchTotalAvg = toEol3[5].Trim(); + SumOfDefectsAvg = toEol3[6].Trim(); + HazeRegionAvg = toEol3[7].Trim(); + HazeAverageAvg = toEol3[8].Trim(); + ScanPast("Std Dev:"); + + string[] toEol4 = GetToEOL(false).Trim().Split(' '); + _Log.Debug($"****HeaderFile - toEol4 Count: {toEol4.Length}."); + FixToEolArray(ref toEol4); + LPDCountStdDev = toEol4[0].Trim(); + LPDCM2StdDev = toEol4[1].Trim(); + AreaCountStdDev = toEol4[2].Trim(); + AreaTotalStdDev = toEol4[3].Trim(); + ScratchCountStdDev = toEol4[4].Trim(); + ScratchTotalStdDev = toEol4[5].Trim(); + SumOfDefectsStdDev = toEol4[6].Trim(); + HazeRegionStdDev = toEol4[7].Trim(); + HazeAverageStdDev = toEol4[8].Trim(); + + string[] segments = Lot.Split('-'); + if (segments.Length > 0) + Reactor = segments[0]; + if (segments.Length > 1) + RDS = segments[1]; + if (segments.Length > 2) + PSN = segments[2]; + // Example of header.UniqueId is TENCOR1_33-289217-4693_201901300556533336 + UniqueId = string.Format("{0}_{1}_{2}", logistics.JobID, Lot, Path.GetFileNameWithoutExtension(logistics.ReportFullPath)); + } + + private Detail ParseWaferSummary(string waferFileName, Dictionary pages) + { + Detail result = new() { Data = "*Data*", i = -1, }; + _I = 0; + //string waferText; + //string altWaferFileName = Path.ChangeExtension(waferFileName, ".txt"); + //if (File.Exists(altWaferFileName)) + // waferText = File.ReadAllText(altWaferFileName); + //else + //{ + // //Pdfbox, IKVM.AWT.WinForms + // org.apache.pdfbox.pdmodel.PDDocument pdfDocument = org.apache.pdfbox.pdmodel.PDDocument.load(waferFileName); + // org.apache.pdfbox.util.PDFTextStripper dataStripper = new org.apache.pdfbox.util.PDFTextStripper(); + // waferText = dataStripper.getText(pdfDocument); + // pdfDocument.close(); + // File.AppendAllText(altWaferFileName, waferText); + //} + List stringList = new(); + result.HeaderUniqueId = UniqueId; + result.Id = 0; + result.Title = null; + if (!pages.ContainsKey(waferFileName)) + throw new Exception(); + _I = 0; + _Data = pages[waferFileName]; + ScanPast("Date:"); + result.Date = GetToEOL(); + ScanPast("ID#"); + result.Slot = GetToEOL(); + if (result.Slot.Length > 5) + result.Slot = string.Concat(result.Slot.Substring(0, 5), "... - ***"); + //result.Slot = result.Slot.Replace("*", ""); + ScanPast("Comments:"); + result.Comments = GetToEOL(); + ScanPast("Sort:"); + result.Sort = GetToEOL(); + ScanPast("LPD Count:"); + result.LPDCount = GetToEOL(); + ScanPast("LPD / cm2:"); + result.LPDCM2 = GetToEOL(); + while (GetBefore(":").Contains("Bin")) + stringList.Add(GetToEOL()); + if (stringList.Count >= 1) + result.Bin1 = stringList[0]; + if (stringList.Count >= 2) + result.Bin2 = stringList[1]; + if (stringList.Count >= 3) + result.Bin3 = stringList[2]; + if (stringList.Count >= 4) + result.Bin4 = stringList[3]; + if (stringList.Count >= 5) + result.Bin5 = stringList[4]; + if (stringList.Count >= 6) + result.Bin6 = stringList[5]; + if (stringList.Count >= 7) + result.Bin7 = stringList[6]; + if (stringList.Count >= 8) + result.Bin8 = stringList[7]; + result.Mean = GetToEOL(); + ScanPast("Std Dev:"); + result.StdDev = GetToEOL(); + ScanPast("Area Count:"); + result.AreaCount = GetToEOL(); + ScanPast("Area Total:"); + result.AreaTotal = GetToEOL(); + ScanPast("Scratch Count:"); + result.ScratchCount = GetToEOL(); + ScanPast("Scratch Total:"); + result.ScratchTotal = GetToEOL(); + ScanPast("Sum of All Defects:"); + result.SumOfDefects = GetToEOL(); + ScanPast("Haze Region:"); + result.HazeRegion = GetToEOL(); + ScanPast("Haze Average:"); + result.HazeAverage = GetToEOL(); + ScanPast("Haze Peak:"); + result.HazePeak = GetToEOL(); + ScanPast("Laser:"); + result.Laser = GetBefore("Gain:"); + result.Gain = GetBefore("Diameter:"); + result.Diameter = GetToEOL(); + ScanPast("Thresh:"); + result.Thresh = GetBefore("Exclusion:"); + result.Exclusion = GetToEOL(); + ScanPast("Haze Rng:"); + result.HazeRng = GetBefore("Thruput:"); + result.Thruput = GetToEOL(); + ScanPast("Recipe ID:"); + result.Recipe = GetToEOL(); + result.UniqueId = string.Format("{0}_{1}", UniqueId, result.Slot.Replace("*", string.Empty).TrimStart('0')); + return result; + } + + /// + /// Convert the raw data file to parsable file format - in this case from PCL to PDF + /// + /// source file to be converted to PDF + /// + private static string ConvertSourceFileToPdf(string ghostPCLFileName, Logistics logistics) + { + string result = Path.ChangeExtension(logistics.ReportFullPath, ".pdf"); + if (!File.Exists(result)) + { + //string arguments = string.Concat("-i \"", sourceFile, "\" -o \"", result, "\""); + string arguments = string.Concat("-dSAFER -dBATCH -dNOPAUSE -sOutputFile=\"", result, "\" -sDEVICE=pdfwrite \"", logistics.ReportFullPath, "\""); + //Process process = Process.Start(configData.LincPDFCFileName, arguments); + Process process = Process.Start(ghostPCLFileName, arguments); + _ = process.WaitForExit(30000); + if (!File.Exists(result)) + throw new Exception("PDF file wasn't created"); + } + return result; + } + + private void Parse(IFileRead fileRead, Logistics logistics, List fileInfoCollection, string ghostPCLFileName) + { + object item; + string pageText; + string pagePDFFile; + string pageTextFile; + List sourceFiles = new(); + List missingSlots = new(); + List dataFiles = new(); + Dictionary pages = new(); + string sourcePath = Path.GetDirectoryName(logistics.ReportFullPath); + Dictionary> slots = new(); + string sourceFileNamePdf = ConvertSourceFileToPdf(ghostPCLFileName, logistics); + sourceFiles.Add(sourceFileNamePdf); + string sourceFileNameNoExt = Path.GetFileNameWithoutExtension(logistics.ReportFullPath); + ////PdfSharp open pdf + //using (PdfSharp.Pdf.PdfDocument sourceDocument = PdfSharp.Pdf.IO.PdfReader.Open(sourceFileNamePdf, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import)) + //{ + // for (int idxPage = 0; idxPage < sourceDocument.PageCount; idxPage++) + // { + // // split the pdf into separate pages. Odd pages are wafer image, even are wafer summary. Last page is Lot Summary. + // _Log.Debug($"****ParseData - Splitting page: {idxPage}, sourceDocument: {sourceDocument.FullPath}, sourcePathFileNoExt: {sourcePathFileNoExt}"); + // //SplitPage(sourceDocument, sourcePathFileNoExt, idxPage); + // pageNum = idxPage + 1; + // pageFile = string.Format("{0}_{1}.pdf", sourcePathFileNoExt, pageNum); + // _Log.Debug($"****SplitPage - Page {pageNum} Source file: {sourceDocument.FullPath}"); + // _Log.Debug($"****SplitPage - Page {pageNum} Output file: {pageFile}"); + // //PdfSharp Create new document + // PdfSharp.Pdf.PdfDocument outputDocument = new PdfSharp.Pdf.PdfDocument { Version = sourceDocument.Version }; + // outputDocument.Info.Title = string.Format("Page {0} of {1}", pageNum, sourceDocument.Info.Title); + // outputDocument.Info.Creator = sourceDocument.Info.Creator; + // outputDocument.AddPage(sourceDocument.Pages[idxPage]); + // outputDocument.Pages[0].CropBox = new PdfSharp.Pdf.PdfRectangle(new PdfSharp.Drawing.XRect(0, 100, 700, 700)); + // outputDocument.Save(pageFile); + // } + // sourceDocumentPageCount = sourceDocument.PageCount; + // sourceDocument.Close(); + //} + java.io.File file = new(sourceFileNamePdf); + org.apache.pdfbox.util.Splitter splitter = new(); + org.apache.pdfbox.pdmodel.PDDocument pdDocument = org.apache.pdfbox.pdmodel.PDDocument.load(file); + java.util.List list = splitter.split(pdDocument); + java.util.ListIterator iterator = list.listIterator(); + org.apache.pdfbox.util.PDFTextStripper dataStripper = new(); + for (short i = 1; i < short.MaxValue; i++) + { + if (!iterator.hasNext()) + break; + item = iterator.next(); + pagePDFFile = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", i, ".pdf"); + pageTextFile = Path.ChangeExtension(pagePDFFile, ".txt"); + if (File.Exists(pageTextFile)) + { + pageText = File.ReadAllText(pageTextFile); + sourceFiles.Add(pageTextFile); + if (item is not org.apache.pdfbox.pdmodel.PDDocument pd) + continue; + pd.close(); + } + else if (File.Exists(pagePDFFile)) + { + org.apache.pdfbox.pdmodel.PDDocument document = org.apache.pdfbox.pdmodel.PDDocument.load(pagePDFFile); + pageText = dataStripper.getText(document); + document.close(); + sourceFiles.Add(pagePDFFile); + if (item is not org.apache.pdfbox.pdmodel.PDDocument pd) + continue; + pd.close(); + } + else + { + if (item is not org.apache.pdfbox.pdmodel.PDDocument pd) + continue; + pageText = dataStripper.getText(pd); + pd.save(pagePDFFile); + sourceFiles.Add(pagePDFFile); + pd.close(); + File.WriteAllText(pageTextFile, pageText); + sourceFiles.Add(pageTextFile); + } + pages.Add(pagePDFFile, pageText); + } + pdDocument.close(); + // parse lot summary + _Log.Debug($"****ParseData - Parsing lot summary"); + List> pageMapping = new(); + string headerFileName = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", pages.Count, ".pdf"); + ParseLotSummary(fileRead, logistics, headerFileName, pages, slots); + foreach (KeyValuePair keyValuePair in pages) + { + if (keyValuePair.Key == headerFileName) + continue; + if (string.IsNullOrEmpty(keyValuePair.Value.Trim())) + { + pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); + continue; + } + if (!pages.ContainsKey(keyValuePair.Key)) + throw new Exception(); + Detail dataFile = ParseWaferSummary(keyValuePair.Key, pages); + if (string.IsNullOrEmpty(dataFile.Recipe) || dataFile.Recipe != Recipe) + { + missingSlots.Add(keyValuePair.Key); + pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); + continue; + } + if (!slots.ContainsKey(dataFile.Slot)) + { + missingSlots.Add(keyValuePair.Key); + pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); + continue; + } + pageMapping.Add(new Tuple(keyValuePair.Key, string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", dataFile.Slot.Replace('*', 's'), "_data.pdf"))); + slots[dataFile.Slot].Add(dataFile); + } + string checkFileName = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_data.pdf"); + if (!File.Exists(checkFileName)) + { + File.Move(headerFileName, checkFileName); + _ = sourceFiles.Remove(headerFileName); + sourceFiles.Add(checkFileName); + } + checkFileName = string.Empty; + for (int i = pageMapping.Count - 1; i > -1; i--) + { + if (!string.IsNullOrEmpty(pageMapping[i].Item2)) + { + checkFileName = pageMapping[i].Item2; + if (!File.Exists(checkFileName)) + { + File.Move(pageMapping[i].Item1, checkFileName); + _ = sourceFiles.Remove(pageMapping[i].Item1); + sourceFiles.Add(checkFileName); + } + } + else if (!string.IsNullOrEmpty(checkFileName)) + { + //if (i == 0 || !string.IsNullOrEmpty(pageMapping[i - 1].Item2)) + //{ + checkFileName = checkFileName.Replace("_data.pdf", "_image.pdf"); + if (!File.Exists(checkFileName)) + { + File.Move(pageMapping[i].Item1, checkFileName); + _ = sourceFiles.Remove(pageMapping[i].Item1); + sourceFiles.Add(checkFileName); + } + //} + checkFileName = string.Empty; + } + } + foreach (KeyValuePair> keyValuePair in slots) + { + if (!keyValuePair.Value.Any() || keyValuePair.Value[0] is null) + missingSlots.Add(string.Concat("Slot ", keyValuePair.Key, ") is missing.")); + else + { + foreach (Detail data in keyValuePair.Value) + dataFiles.Add(data); + } + } + if (missingSlots.Any()) + { + string missingSlotsFile = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_MissingSlots.txt"); + File.WriteAllLines(missingSlotsFile, missingSlots); + sourceFiles.Add(missingSlotsFile); + } + Date = DateTime.Parse(Date).ToString(); + //Equipment data is wrong!!! + Date = DateTime.Now.ToString(); + //Equipment data is wrong!!! + //for (int i = 0; i < dataFiles.Count; i++) + // dataFiles[i].Date = DateTime.Parse(dataFiles[i].Date).ToString(); + foreach (string sourceFile in sourceFiles) + fileInfoCollection.Add(new FileInfo(sourceFile)); + fileInfoCollection.Add(new FileInfo(logistics.ReportFullPath)); + } + +} \ No newline at end of file diff --git a/Adaptation/Helpers/ConfigData.Level.cs b/Adaptation/Helpers/ConfigData.Level.cs deleted file mode 100644 index 6da48af..0000000 --- a/Adaptation/Helpers/ConfigData.Level.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Adaptation.Helpers -{ - - public partial class ConfigData - { - public enum Level - { - IsXToOpenInsightMetrologyViewer, //MetrologyWS.SendData(logic, string.Concat("http://", serverName, "/api/inbound/Tencor"), headerAttachments, detailAttachments); - IsXToIQSSi, //bool WriteFileSPC(Dictionary - IsXToIQSGaN, //GAN_PPTST - IsXToOpenInsight, //bool WriteFileOpenInsight(Dictionary - IsXToOpenInsightMetrologyViewerAttachments, //Site-Two - IsXToAPC, - IsXToSPaCe, - IsXToArchive, - IsArchive, - IsDummy, - IsManualOIEntry, - IsTIBCO, - IsNaEDA - } - - public static List> LevelTuples - { - get - { - return new List> - { - new Tuple(0, Level.IsNaEDA, @"\EC_EDA\Staging\Traces\~\Source"), - new Tuple(15, Level.IsXToOpenInsightMetrologyViewer, @"\EC_EAFLog\TracesMES\~\Source"), - new Tuple(36, Level.IsXToIQSSi, @"\EC_SPC_Si\Traces\~\PollPath"), - new Tuple(36, Level.IsXToIQSGaN, @"\EC_SPC_GaN\Traces\~\PollPath"), - new Tuple(36, Level.IsXToOpenInsight, @"\\messa01ec.ec.local\APPS\Metrology\~\Source"), - new Tuple(36, Level.IsXToOpenInsightMetrologyViewerAttachments, @"\EC_Characterization_Si\In Process\~\Source"), - new Tuple(360, Level.IsXToAPC, @"\EC_APC\Staging\Traces\~\PollPath"), - new Tuple(-36, Level.IsXToSPaCe, @"\EC_SPC_Si\Traces\~\Source"), - new Tuple(180, Level.IsXToArchive, @"\EC_EAFLog\TracesArchive\~\Source"), - new Tuple(36, Level.IsArchive, @"\EC_Characterization_Si\Processed") - //new Tuple("IsDummy" - }; - } - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/ConfigData.cs b/Adaptation/Helpers/ConfigData.cs deleted file mode 100644 index 9fd9994..0000000 --- a/Adaptation/Helpers/ConfigData.cs +++ /dev/null @@ -1,614 +0,0 @@ -using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; -using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; -using Adaptation.Shared; -using Adaptation.Shared.Metrology; -using Infineon.Monitoring.MonA; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Text.Json; -using System.Threading; - -namespace Adaptation.Helpers -{ - - public partial class ConfigData : ConfigDataBase - { - - internal const object NullData = null; - internal const int MinFileLength = 100; - - public string IqsFile { get; private set; } - public string TracePath { get; private set; } - public Level? Duplicator { get; private set; } - public string IfxChannel { get; private set; } - public string IfxSubject { get; private set; } - public string MemoryPath { get; private set; } - public string NoWaferMap { get; private set; } - public string VillachPath { get; private set; } - public string ProgressPath { get; private set; } - public string IqsQueryFilter { get; private set; } - public string IfxSubjectPrefix { get; private set; } - public string GhostPCLFileName { get; private set; } - public string OpenInsightSiViewer { get; private set; } - public string OpenInsightFilePattern { get; private set; } - public string ConnectionStringLSL2SQL { get; private set; } - public string OIContextDataSearchPath { get; private set; } - public string OIContextDataResultsPath { get; private set; } - public string OIContextDataPendingPath { get; private set; } - public string IfxConfigurationLocation { get; private set; } - public string OpenInsightMetrogyViewerAPI { get; private set; } - public List TransportSetupMessages { get; private set; } - public string IfxConfigurationLocationLocalCopy { get; private set; } - public static Dictionary> DummyRuns { get; private set; } - - private Timer _Timer; - private int _LastDummyRunIndex; - private readonly Calendar _Calendar; - private readonly string _ReportFullPath; - - public ConfigData(ILogic logic, string cellName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, IList modelObjectParameterDefinitions, string parameterizedModelObjectDefinitionType, bool isEAFHosted) : - base(cellName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, isEAFHosted) - { - _LastDummyRunIndex = -1; - UseCyclicalForDescription = false; - CultureInfo cultureInfo = new CultureInfo("en-US"); - _Calendar = cultureInfo.Calendar; - string firstSourceFileFilter = fileConnectorConfiguration.SourceFileFilter.Split('|')[0]; - if (DummyRuns is null) - DummyRuns = new Dictionary>(); - bool isDuplicator = cellInstanceConnectionName.StartsWith(cellName); - int level = (cellInstanceConnectionName.Length - cellInstanceConnectionName.Replace("-", string.Empty).Length); - if (!isDuplicator) - Duplicator = null; - else - { - CellNames.Add(cellName, cellName); - MesEntities.Add(cellName, cellName); - Duplicator = (Level)level; - } - if (isDuplicator) - ProcessDataDescription = new Duplicator.Description(); - else - ProcessDataDescription = new ProcessData.FileRead.Description(); - if (!isDuplicator) - { - //Verify(fileConnectorConfiguration, cellInstanceConnectionName); - if (!EafHosted) - VerifyProcessDataDescription(logic); - else - WriteExportAliases(logic, cellName, cellInstanceConnectionName); - } - GhostPCLFileName = string.Concat(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), @"\gpcl6win64.exe"); - if (EafHosted && Duplicator.HasValue && Duplicator.Value == Level.IsXToOpenInsightMetrologyViewerAttachments && !File.Exists(GhostPCLFileName)) - throw new Exception("Ghost PCL FileName doesn't Exist!"); - //LincPDFCFileName = string.Concat(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), @"\LincPDFC.exe"); - if (!modelObjectParameterDefinitions.Any()) - { - CellNames.Add(cellName, "****"); - MesEntities.Add(cellName, "****"); - } - else - { - int index; - string key; - string variable = string.Empty; - Dictionary iqsSection = new Dictionary(); - Dictionary pathSection = new Dictionary(); - Dictionary tibcoSection = new Dictionary(); - Dictionary commonSection = new Dictionary(); - Dictionary openInsightSection = new Dictionary(); - Dictionary connectionStringsSection = new Dictionary(); - foreach (ModelObjectParameterDefinition modelObjectParameterDefinition in modelObjectParameterDefinitions) - { - if (!modelObjectParameterDefinition.Name.Contains('.')) - continue; - else if (modelObjectParameterDefinition.Name.StartsWith("Description.") && (modelObjectParameterDefinition.Name.EndsWith(".EventName") || modelObjectParameterDefinition.Name.EndsWith(".EquipmentType"))) - continue; - index = modelObjectParameterDefinition.Name.IndexOf("."); - if (index <= -1) - continue; - key = modelObjectParameterDefinition.Name.Substring(0, index); - variable = modelObjectParameterDefinition.Name.Substring(index + 1); - if (key == "COMMON") - commonSection.Add(variable, modelObjectParameterDefinition.Value); - else if (key == "CONNECTION STRINGS") - connectionStringsSection.Add(variable, modelObjectParameterDefinition.Value); - else if (key == "IQS") - iqsSection.Add(variable, modelObjectParameterDefinition.Value); - else if (key == "OpenInsight") - openInsightSection.Add(variable, modelObjectParameterDefinition.Value); - else if (key == "PATH") - pathSection.Add(variable, modelObjectParameterDefinition.Value); - //else if (key == "REACTOR") - // reactorTuples.Add(new Tuple(variable, modelObjectParameterDefinition.Value)); - else if (key == "TIBCO") - tibcoSection.Add(variable, modelObjectParameterDefinition.Value); - else - throw new Exception(); - } - if (!iqsSection.Any()) - throw new Exception("IQS section is missing from configuration"); - else - { - key = "FILE"; - if (iqsSection.ContainsKey(key)) - IqsFile = iqsSection[key]; - else - throw new Exception(string.Concat("Missing IQS Configuration entry for ", key)); - if (string.IsNullOrEmpty(IqsFile)) - throw new Exception(string.Format("IQS key {0} is empty", key)); - key = "QUERY"; - if (iqsSection.ContainsKey(key)) - IqsQueryFilter = iqsSection[key]; - else - throw new Exception(string.Concat("Missing IQS Configuration entry for ", key)); - if (string.IsNullOrEmpty(IqsQueryFilter)) - throw new Exception(string.Format("IQS key {0} is empty", key)); - } - if (!pathSection.Any()) - throw new Exception("Path section is missing from configuration"); - else - { - key = "TRACE"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - TracePath = pathSection[key]; - if (!string.IsNullOrEmpty(TracePath) && !Directory.Exists(TracePath)) - Directory.CreateDirectory(TracePath); - key = "VILLACH"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - VillachPath = pathSection[key]; - if (!string.IsNullOrEmpty(VillachPath) && !Directory.Exists(VillachPath)) - Directory.CreateDirectory(VillachPath); - key = "Progress"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - ProgressPath = pathSection[key]; - if (!string.IsNullOrEmpty(ProgressPath) && Directory.Exists(Path.GetPathRoot(ProgressPath)) && !Directory.Exists(ProgressPath)) - Directory.CreateDirectory(ProgressPath); - key = "Memory"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - MemoryPath = pathSection[key]; - if (!string.IsNullOrEmpty(MemoryPath) && !Directory.Exists(MemoryPath)) - Directory.CreateDirectory(MemoryPath); - key = "OIContextDataSearch"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - OIContextDataSearchPath = pathSection[key]; - if (!string.IsNullOrEmpty(OIContextDataSearchPath) && !Directory.Exists(OIContextDataSearchPath)) - Directory.CreateDirectory(OIContextDataSearchPath); - key = "OIContextDataPending"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - OIContextDataPendingPath = pathSection[key]; - if (!string.IsNullOrEmpty(OIContextDataPendingPath) && !Directory.Exists(OIContextDataPendingPath)) - Directory.CreateDirectory(OIContextDataPendingPath); - key = "OIContextDataResults"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - OIContextDataResultsPath = pathSection[key]; - if (!string.IsNullOrEmpty(OIContextDataResultsPath) && !Directory.Exists(OIContextDataResultsPath)) - Directory.CreateDirectory(OIContextDataResultsPath); - } - if (!commonSection.Any()) - throw new Exception("Common section is missing from configuration"); - else - { - key = "CELL_NAMES"; - if (!commonSection.ContainsKey(key) || !commonSection[key].Contains(';') || !commonSection[key].Contains(':')) - throw new Exception(); - else - { - string[] segments; - string[] cellNames = commonSection[key].Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); - foreach (string item in cellNames) - { - segments = item.Split(':'); - CellNames.Add(segments[0].Trim(), segments[1].Trim()); - } - } - if (!string.IsNullOrEmpty(cellName) && !CellNames.ContainsKey(cellName)) - throw new Exception(); - key = "MES_ENTITIES"; - if (!commonSection.ContainsKey(key) || !commonSection[key].Contains(';') || !commonSection[key].Contains(':')) - throw new Exception(); - else - { - string[] segments; - string[] mesEntity = commonSection[key].Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); - foreach (string item in mesEntity) - { - segments = item.Split(':'); - MesEntities.Add(segments[0].Trim(), segments[1].Trim()); - } - } - if (!string.IsNullOrEmpty(cellName) && !MesEntities.ContainsKey(cellName)) - throw new Exception(); - key = "NoWaferMap"; - if (commonSection.ContainsKey(key)) - NoWaferMap = commonSection[key]; - if (string.IsNullOrEmpty(NoWaferMap)) - throw new Exception(string.Format("Common key {0} is empty", key)); - if (Duplicator.HasValue && Duplicator.Value == Level.IsXToOpenInsightMetrologyViewerAttachments && !File.Exists(NoWaferMap)) - throw new Exception(string.Format("Common key {0} is doesn't exist!", key)); - } - if (!connectionStringsSection.Any()) - throw new Exception("Connection Strings section is missing from configuration"); - else - { - key = "LSL2SQL"; - if (connectionStringsSection.ContainsKey(key)) - ConnectionStringLSL2SQL = connectionStringsSection[key]; - else - throw new Exception(string.Format("{0} is missing from Equipment Type Configuration", key)); - if (string.IsNullOrEmpty(ConnectionStringLSL2SQL)) - throw new Exception(string.Format("Connection String key {0} is empty", key)); - } - if (!openInsightSection.Any()) - throw new Exception("OpenInsight section is missing from configuration"); - else - { - key = "MetrologyViewerAPI"; - if (openInsightSection.ContainsKey(key)) - OpenInsightMetrogyViewerAPI = openInsightSection[key]; - if (string.IsNullOrEmpty(OpenInsightMetrogyViewerAPI)) - throw new Exception(string.Format("OpenInsight key {0} is empty", key)); - if (!OpenInsightMetrogyViewerAPI.Contains(":") || !OpenInsightMetrogyViewerAPI.Contains(".")) - throw new Exception(string.Format("OpenInsight key {0} is invalid", key)); - key = "SiViewer"; - if (openInsightSection.ContainsKey(key)) - OpenInsightSiViewer = openInsightSection[key]; - if (string.IsNullOrEmpty(OpenInsightSiViewer)) - throw new Exception(string.Format("OpenInsight key {0} is empty", key)); - if (!OpenInsightSiViewer.Contains(":") || !OpenInsightSiViewer.Contains(".")) - throw new Exception(string.Format("OpenInsight key {0} is invalid", key)); - key = "FilePattern"; - if (openInsightSection.ContainsKey(key)) - OpenInsightFilePattern = openInsightSection[key]; - else - throw new Exception(string.Concat("Missing OpenInsight Configuration entry for ", key)); - if (string.IsNullOrEmpty(OpenInsightFilePattern)) - throw new Exception(string.Format("OpenInsight key {0} is empty", key)); - } - if (!MesEntities.Any()) - throw new Exception(); - if (!tibcoSection.Any()) - throw new Exception("TIBCO section is missing from configuration"); - else - { - key = "IFX_CHANNEL"; - if (tibcoSection.ContainsKey(key)) - IfxChannel = tibcoSection[key]; - else - throw new Exception("IFX_CHANNEL is missing from Equipment Type Configuration"); - if (string.IsNullOrEmpty(IfxChannel)) - throw new Exception(string.Format("TIBCO section key {0} is empty", key)); - key = "IFX_SUBJECT_PREFIX"; - if (tibcoSection.ContainsKey(key)) - IfxSubjectPrefix = tibcoSection[key]; - else - throw new Exception("IFX_SUBJECT_PREFIX is missing from Equipment Type Configuration"); - if (string.IsNullOrEmpty(IfxSubjectPrefix)) - throw new Exception(string.Format("TIBCO section key {0} is empty", key)); - key = "IFX_CONFIGURATION_LOCATION"; - if (tibcoSection.ContainsKey(key)) - IfxConfigurationLocation = tibcoSection[key]; - else - throw new Exception("IFX_CONFIGURATION_LOCATION is missing from Equipment Type Configuration"); - if (string.IsNullOrEmpty(IfxConfigurationLocation)) - throw new Exception(string.Format("TIBCO section key {0} is empty", key)); - key = "IFX_CONFIGURATION_LOCATION_LOCAL_COPY"; - if (tibcoSection.ContainsKey(key)) - IfxConfigurationLocationLocalCopy = tibcoSection[key]; - else - throw new Exception("IFX_CONFIGURATION_LOCATION_LOCAL_COPY is missing from Equipment Type Configuration"); - if (string.IsNullOrEmpty(IfxConfigurationLocationLocalCopy)) - throw new Exception(string.Format("TIBCO section key {0} is empty", key)); - key = "IFX_SUBJECT"; - if (tibcoSection.ContainsKey(key)) - IfxSubject = tibcoSection[key]; - else - throw new Exception("IFX_SUBJECT KEY is missing from Equipment Type Configuration"); - if (string.IsNullOrEmpty(IfxSubject)) - throw new Exception(string.Format("TIBCO section key {0} is empty", key)); - if (Duplicator.HasValue && Duplicator.Value == Level.IsTIBCO) - { - Si.Transport.Initialize(this); - if (!string.IsNullOrEmpty(fileConnectorConfiguration.SourceFileLocation)) - TransportSetupMessages = Si.Transport.Setup(useSleep: true, setIfxTransport: true); - else - TransportSetupMessages = Si.Transport.Setup(useSleep: false, setIfxTransport: false); - } - } - if (IsSourceTimer || IsDatabaseExportToIPDSF || (Duplicator.HasValue && Duplicator.Value == Level.IsDummy)) - { - if (!Directory.Exists(fileConnectorConfiguration.SourceFileLocation)) - Directory.CreateDirectory(fileConnectorConfiguration.SourceFileLocation); - _ReportFullPath = string.Concat(fileConnectorConfiguration.SourceFileLocation, firstSourceFileFilter.Replace("*", @"\")); - if (Debugger.IsAttached || fileConnectorConfiguration.PreProcessingMode == FileConnectorConfiguration.PreProcessingModeEnum.Process) - Callback(null); - else - { - int milliSeconds; - milliSeconds = (int)((fileConnectorConfiguration.FileScanningIntervalInSeconds * 1000) / 2); - _Timer = new Timer(Callback, null, milliSeconds, Timeout.Infinite); - milliSeconds += 2000; - } - } - } - } - - public void CheckProcessDataDescription(Dictionary> results, bool extra) - { - foreach (Test test in results.Keys) - { - if (test == Test.Tencor) - { - if (!(ProcessDataDescription is ProcessData.FileRead.Description)) - ProcessDataDescription = new ProcessData.FileRead.Description(); - } - else - throw new Exception(); - } - } - - private void CallbackIsDummy(string traceDummyFile, List> tuples, bool fileConnectorConfigurationIncludeSubDirectories, bool includeSubDirectoriesExtra) - { - int fileCount; - string[] files; - string monARessource; - string checkDirectory; - string sourceArchiveFile; - string inProcessDirectory; - const string site = "sjc"; - const string monInURL = "http://moninhttp.sjc.infineon.com/input/text"; - MonIn monIn = MonIn.GetInstance(monInURL); - string stateName = string.Concat("Dummy_", _EventName); - foreach (Tuple item in tuples) - { - monARessource = item.Item1; - sourceArchiveFile = item.Item2; - inProcessDirectory = item.Item3; - checkDirectory = item.Item4; - fileCount = item.Item5; - try - { - if (fileCount > 0 || string.IsNullOrEmpty(checkDirectory)) - { - File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Warning.ToString() }); - monIn.SendStatus(site, monARessource, stateName, State.Warning); - for (int i = 1; i < 12; i++) - Thread.Sleep(500); - } - else if (inProcessDirectory == checkDirectory) - continue; - if (!EafHosted) - continue; - if (!File.Exists(sourceArchiveFile)) - continue; - if (!long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) - continue; - ZipFile.ExtractToDirectory(sourceArchiveFile, inProcessDirectory); - if (fileConnectorConfigurationIncludeSubDirectories && includeSubDirectoriesExtra) - { - if (_EventName == EventName.FileRead) - checkDirectory = string.Concat(checkDirectory, @"\", sequence); - else if (_EventName == EventName.FileReadDaily) - checkDirectory = string.Concat(checkDirectory, @"\Source\", sequence); - else - throw new Exception(); - } - if (fileConnectorConfigurationIncludeSubDirectories) - files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.AllDirectories); - else - files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.TopDirectoryOnly); - if (files.Length > 250) - throw new Exception("Safety net!"); - foreach (string file in files) - File.SetLastWriteTime(file, new DateTime(sequence)); - if (!fileConnectorConfigurationIncludeSubDirectories) - { - foreach (string file in files) - File.Move(file, string.Concat(checkDirectory, @"\", Path.GetFileName(file))); - } - else - { - string[] directories = Directory.GetDirectories(inProcessDirectory, "*", SearchOption.AllDirectories); - foreach (string directory in directories) - Directory.CreateDirectory(string.Concat(checkDirectory, directory.Substring(inProcessDirectory.Length))); - foreach (string file in files) - File.Move(file, string.Concat(checkDirectory, file.Substring(inProcessDirectory.Length))); - } - File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Ok.ToString() }); - monIn.SendStatus(site, monARessource, stateName, State.Ok); - } - catch (Exception exception) - { - File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Critical.ToString(), exception.Message, exception.StackTrace }); - monIn.SendStatus(site, monARessource, stateName, State.Critical); - try - { - Eaf.Core.Smtp.ISmtp smtp = Eaf.Core.Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); - Eaf.Core.Smtp.EmailMessage emailMessage = new Eaf.Core.Smtp.EmailMessage(string.Concat("Exception:", EquipmentElementName), string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace), Eaf.Core.Smtp.MailPriority.High); - smtp.Send(emailMessage); - } - catch (Exception) { } - } - } - } - - private void CallbackIsDummy() - { - DateTime dateTime = DateTime.Now; - bool check = (dateTime.Hour > 7 && dateTime.Hour < 18 && dateTime.DayOfWeek != DayOfWeek.Sunday && dateTime.DayOfWeek != DayOfWeek.Saturday); - if (check) - { - int fileCount; - string[] files; - string monARessource; - string checkDirectory; - string sourceArchiveFile; - string sourceFileLocation; - string targetFileLocation; - string inProcessDirectory; - string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - string traceDummyDirectory = string.Concat(Path.GetPathRoot(TracePath), @"\TracesDummy\", CellName, @"\Source\", dateTime.ToString("yyyy"), "___Week_", weekOfYear); - if (!Directory.Exists(traceDummyDirectory)) - Directory.CreateDirectory(traceDummyDirectory); - string traceDummyFile = string.Concat(traceDummyDirectory, @"\", dateTime.Ticks, " - ", CellName, ".txt"); - File.AppendAllText(traceDummyFile, string.Empty); - List> tuples = new List>(); - foreach (var keyValuePair in CellNames) - { - monARessource = keyValuePair.Key; - if (!keyValuePair.Value.Contains(@"\")) - continue; - foreach (string sourceFileFilter in FileConnectorConfiguration.SourceFileFilter.Split('|')) - { - if (sourceFileFilter.ToLower().StartsWith(keyValuePair.Value.Replace(@"\", string.Empty))) - sourceFileLocation = Path.GetFullPath(FileConnectorConfiguration.SourceFileLocation); - else if (FileConnectorConfiguration.SourceFileLocation.ToLower().EndsWith(keyValuePair.Value)) - sourceFileLocation = Path.GetFullPath(FileConnectorConfiguration.SourceFileLocation); - else - sourceFileLocation = Path.GetFullPath(string.Concat(FileConnectorConfiguration.SourceFileLocation, @"\", keyValuePair.Value)); - sourceArchiveFile = Path.GetFullPath(string.Concat(sourceFileLocation, @"\", sourceFileFilter)); - targetFileLocation = Path.GetFullPath(string.Concat(FileConnectorConfiguration.TargetFileLocation, @"\", keyValuePair.Value)); - if (!File.Exists(sourceArchiveFile)) - continue; - if (!DummyRuns.ContainsKey(monARessource)) - DummyRuns.Add(monARessource, new List()); - tuples.Add(new Tuple(monARessource, sourceFileLocation, targetFileLocation, sourceArchiveFile, 0)); - } - } - File.AppendAllLines(traceDummyFile, from l in tuples select l.Item4); - if (tuples.Any()) - { - _LastDummyRunIndex += 1; - if (_LastDummyRunIndex >= tuples.Count) - _LastDummyRunIndex = 0; - monARessource = tuples[_LastDummyRunIndex].Item1; - sourceFileLocation = tuples[_LastDummyRunIndex].Item2; - targetFileLocation = tuples[_LastDummyRunIndex].Item3; - sourceArchiveFile = tuples[_LastDummyRunIndex].Item4; - //fileCount = tuples[_LastDummyRunIndex].Item5; - tuples.Clear(); - if (long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) - { - if (!DummyRuns[monARessource].Contains(sequence)) - DummyRuns[monARessource].Add(sequence); - inProcessDirectory = string.Concat(ProgressPath, @"\", monARessource, @"\Dummy_in process\", sequence); - checkDirectory = inProcessDirectory; - if (!Directory.Exists(checkDirectory)) - Directory.CreateDirectory(checkDirectory); - files = Directory.GetFiles(checkDirectory, "*", SearchOption.AllDirectories); - fileCount = files.Length; - if (files.Any()) - { - if (files.Length > 250) - throw new Exception("Safety net!"); - try - { - foreach (string file in files) - File.Delete(file); - } - catch (Exception) { } - } - tuples.Add(new Tuple(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); - checkDirectory = targetFileLocation; - files = Directory.GetFiles(checkDirectory, string.Concat("*", sequence, "*"), SearchOption.TopDirectoryOnly); - fileCount = files.Length; - tuples.Add(new Tuple(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); - } - } - if (tuples.Any()) - CallbackIsDummy(traceDummyFile, tuples, FileConnectorConfiguration.IncludeSubDirectories.Value, includeSubDirectoriesExtra: false); - } - } - - private void Callback(object state) - { - try - { - if (Duplicator is null) - { - if (File.Exists(_ReportFullPath)) - File.Delete(_ReportFullPath); - File.WriteAllText(_ReportFullPath, string.Empty); - } - else if (Duplicator.Value == Level.IsDummy) - CallbackIsDummy(); - else - throw new Exception(); - } - catch (Exception exception) - { - try - { - Eaf.Core.Smtp.ISmtp smtp = Eaf.Core.Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); - Eaf.Core.Smtp.EmailMessage emailMessage = new Eaf.Core.Smtp.EmailMessage(string.Concat("Exception:", EquipmentElementName), string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace), Eaf.Core.Smtp.MailPriority.High); - smtp.Send(emailMessage); - } - catch (Exception) { } - } - try - { - TimeSpan timeSpan; - if (IsDatabaseExportToIPDSF) - timeSpan = new TimeSpan(DateTime.Now.AddMinutes(1).Ticks - DateTime.Now.Ticks); - else if (IsSourceTimer) - timeSpan = new TimeSpan(DateTime.Now.AddMinutes(15).Ticks - DateTime.Now.Ticks); - else if (Duplicator.HasValue && Duplicator.Value == Level.IsDummy) - timeSpan = new TimeSpan(DateTime.Now.AddSeconds(FileConnectorConfiguration.FileScanningIntervalInSeconds.Value).Ticks - DateTime.Now.Ticks); - else if (Duplicator.HasValue) - timeSpan = new TimeSpan(DateTime.Now.AddSeconds(30).Ticks - DateTime.Now.Ticks); - else - timeSpan = new TimeSpan(DateTime.Now.AddDays(.5).Ticks - DateTime.Now.Ticks); - if (!(_Timer is null)) - _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); - else - _Timer = new Timer(Callback, null, (long)timeSpan.TotalMilliseconds, Timeout.Infinite); - } - catch (Exception exception) - { - try - { - Eaf.Core.Smtp.ISmtp smtp = Eaf.Core.Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); - Eaf.Core.Smtp.EmailMessage emailMessage = new Eaf.Core.Smtp.EmailMessage(string.Concat("Exception:", EquipmentElementName), string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace), Eaf.Core.Smtp.MailPriority.High); - smtp.Send(emailMessage); - } - catch (Exception) { } - } - } - - public Tuple> IsManualOIEntry(string reportFullPath) - { - Tuple> results; - string monARessource; - const string site = "sjc"; - string equipment = string.Empty; - string description = string.Empty; - string stateName = "MANUAL_OI_ENTRY"; - string json = File.ReadAllText(reportFullPath); - JsonElement jsonElement = JsonSerializer.Deserialize(json); - results = new Tuple>(string.Empty, jsonElement, new List()); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - { - if (jsonProperty.Name == "Equipment") - equipment = jsonProperty.Value.ToString(); - else if (jsonProperty.Name == "Description") - description = jsonProperty.Value.ToString(); - } - if (string.IsNullOrEmpty(equipment)) - monARessource = CellName; - else - monARessource = equipment; - const string monInURL = "http://moninhttp.sjc.infineon.com/input/text"; - MonIn monIn = MonIn.GetInstance(monInURL); - if (EafHosted) - monIn.SendStatus(site, monARessource, stateName, State.Warning, description); - return results; - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/ProcessData.DataFile.cs b/Adaptation/Helpers/ProcessData.DataFile.cs deleted file mode 100644 index caab53d..0000000 --- a/Adaptation/Helpers/ProcessData.DataFile.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace Adaptation.Helpers -{ - - public partial class ProcessData - { - - public class DataFile - { - - public long Id { get; set; } - public string AreaCount { get; set; } - public string AreaTotal { get; set; } - public string Bin1 { get; set; } - public string Bin2 { get; set; } - public string Bin3 { get; set; } - public string Bin4 { get; set; } - public string Bin5 { get; set; } - public string Bin6 { get; set; } - public string Bin7 { get; set; } - public string Bin8 { get; set; } - public string Comments { get; set; } - public string Date { get; set; } - public string Diameter { get; set; } - public string Exclusion { get; set; } - public string Gain { get; set; } - public string HazeAverage { get; set; } - public string HazePeak { get; set; } - public string HazeRegion { get; set; } - public string HazeRng { get; set; } - public string HeaderUniqueId { get; set; } - public string LPDCM2 { get; set; } - public string LPDCount { get; set; } - public string Laser { get; set; } - public string Mean { get; set; } - public string Recipe { get; set; } - public string ScratchCount { get; set; } - public string ScratchTotal { get; set; } - public string Slot { get; set; } - public string Sort { get; set; } - public string StdDev { get; set; } - public string SumOfDefects { get; set; } - public string Thresh { get; set; } - public string Thruput { get; set; } - public string Title { get; set; } - public string UniqueId { get; set; } - public string Data { get; set; } - public int i { get; set; } - - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/ProcessData.FileRead.Description.cs b/Adaptation/Helpers/ProcessData.FileRead.Description.cs deleted file mode 100644 index a22c722..0000000 --- a/Adaptation/Helpers/ProcessData.FileRead.Description.cs +++ /dev/null @@ -1,473 +0,0 @@ -using Adaptation.Shared; -using Adaptation.Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; - -namespace Adaptation.Helpers -{ - - public partial class ProcessData - { - - public class FileRead - { - - public class Description : IProcessDataDescription - { - - public int Test { get; set; } - public int Count { get; set; } - public int Index { get; set; } - // - public string EventName { get; set; } - public string NullData { get; set; } - public string JobID { get; set; } - public string Sequence { get; set; } - public string MesEntity { get; set; } - public string ReportFullPath { get; set; } - public string ProcessJobID { get; set; } - public string MID { get; set; } - // - public string Date { get; set; } - public string Employee { get; set; } - public string Lot { get; set; } - public string PSN { get; set; } - public string Reactor { get; set; } - public string Recipe { get; set; } - // - public string Comments { get; set; } - public string Diameter { get; set; } - public string Exclusion { get; set; } - public string Gain { get; set; } - public string HeaderUniqueId { get; set; } - public string Laser { get; set; } - public string ParseErrorText { get; set; } - public string RDS { get; set; } - public string Slot { get; set; } - public string UniqueId { get; set; } - // - public string AreaCount { get; set; } - public string AreaCountAvg { get; set; } - public string AreaCountMax { get; set; } - public string AreaCountMin { get; set; } - public string AreaCountStdDev { get; set; } - public string AreaTotal { get; set; } - public string AreaTotalAvg { get; set; } - public string AreaTotalMax { get; set; } - public string AreaTotalMin { get; set; } - public string AreaTotalStdDev { get; set; } - public string Bin1 { get; set; } - public string Bin2 { get; set; } - public string Bin3 { get; set; } - public string Bin4 { get; set; } - public string Bin5 { get; set; } - public string Bin6 { get; set; } - public string Bin7 { get; set; } - public string Bin8 { get; set; } - public string HazeAverage { get; set; } - public string HazeAverageAvg { get; set; } - public string HazeAverageMax { get; set; } - public string HazeAverageMin { get; set; } - public string HazeAverageStdDev { get; set; } - public string HazePeak { get; set; } - public string HazeRegion { get; set; } - public string HazeRegionAvg { get; set; } - public string HazeRegionMax { get; set; } - public string HazeRegionMin { get; set; } - public string HazeRegionStdDev { get; set; } - public string HazeRng { get; set; } - public string LPDCM2 { get; set; } - public string LPDCM2Avg { get; set; } - public string LPDCM2Max { get; set; } - public string LPDCM2Min { get; set; } - public string LPDCM2StdDev { get; set; } - public string LPDCount { get; set; } - public string LPDCountAvg { get; set; } - public string LPDCountMax { get; set; } - public string LPDCountMin { get; set; } - public string LPDCountStdDev { get; set; } - public string Mean { get; set; } - public string ScratchCount { get; set; } - public string ScratchCountAvg { get; set; } - public string ScratchCountMax { get; set; } - public string ScratchCountMin { get; set; } - public string ScratchCountStdDev { get; set; } - public string ScratchTotal { get; set; } - public string ScratchTotalAvg { get; set; } - public string ScratchTotalMax { get; set; } - public string ScratchTotalMin { get; set; } - public string ScratchTotalStdDev { get; set; } - public string Sort { get; set; } - public string StdDev { get; set; } - public string SumOfDefects { get; set; } - public string SumOfDefectsAvg { get; set; } - public string SumOfDefectsMax { get; set; } - public string SumOfDefectsMin { get; set; } - public string SumOfDefectsStdDev { get; set; } - public string Thresh { get; set; } - public string Thruput { get; set; } - // - public object Data { get; set; } - public object Parameters { get; set; } - - public string GetEventName() { return nameof(FileRead); } - public string GetEventDescription() { return "File Has been read and parsed"; } - - public List GetHeaderNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List - { - nameof(Date), - nameof(Employee), - nameof(Lot), - nameof(PSN), - nameof(Reactor), - nameof(Recipe) - }; - return results; - } - - public List GetDetailNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List - { - nameof(Comments), - nameof(Diameter), - nameof(Exclusion), - nameof(Gain), - nameof(HeaderUniqueId), - nameof(Laser), - nameof(ParseErrorText), - nameof(RDS), - nameof(Slot), - nameof(UniqueId) - }; - return results; - } - - public List GetParameterNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List - { - nameof(AreaCount), - nameof(AreaCountAvg), - nameof(AreaCountMax), - nameof(AreaCountMin), - nameof(AreaCountStdDev), - nameof(AreaTotal), - nameof(AreaTotalAvg), - nameof(AreaTotalMax), - nameof(AreaTotalMin), - nameof(AreaTotalStdDev), - nameof(Bin1), - nameof(Bin2), - nameof(Bin3), - nameof(Bin4), - nameof(Bin5), - nameof(Bin6), - nameof(Bin7), - nameof(Bin8), - nameof(HazeAverage), - nameof(HazeAverageAvg), - nameof(HazeAverageMax), - nameof(HazeAverageMin), - nameof(HazeAverageStdDev), - nameof(HazePeak), - nameof(HazeRegion), - nameof(HazeRegionAvg), - nameof(HazeRegionMax), - nameof(HazeRegionMin), - nameof(HazeRegionStdDev), - nameof(HazeRng), - nameof(LPDCM2), - nameof(LPDCM2Avg), - nameof(LPDCM2Max), - nameof(LPDCM2Min), - nameof(LPDCM2StdDev), - nameof(LPDCount), - nameof(LPDCountAvg), - nameof(LPDCountMax), - nameof(LPDCountMin), - nameof(LPDCountStdDev), - nameof(Mean), - nameof(ScratchCount), - nameof(ScratchCountAvg), - nameof(ScratchCountMax), - nameof(ScratchCountMin), - nameof(ScratchCountStdDev), - nameof(ScratchTotal), - nameof(ScratchTotalAvg), - nameof(ScratchTotalMax), - nameof(ScratchTotalMin), - nameof(ScratchTotalStdDev), - nameof(Sort), - nameof(StdDev), - nameof(SumOfDefects), - nameof(SumOfDefectsAvg), - nameof(SumOfDefectsMax), - nameof(SumOfDefectsMin), - nameof(SumOfDefectsStdDev), - nameof(Thresh), - nameof(Thruput) - }; - return results; - } - - public List GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test) - { - List results = new List(); - return results; - } - - public List GetNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - IProcessDataDescription processDataDescription = GetDefault(logic, configDataBase); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - object @object = JsonSerializer.Deserialize(json); - if (!(@object is JsonElement jsonElement)) - throw new Exception(); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - results.Add(jsonProperty.Name); - return results; - } - - public IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase) - { - Description result = new Description(); - return result; - } - - public IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase) - { - Description result = new Description - { - Test = -1, - Count = 0, - Index = -1, - // - EventName = GetEventName(), - NullData = string.Empty, - JobID = logic.Logistics.JobID, - Sequence = logic.Logistics.Sequence.ToString(), - MesEntity = logic.Logistics.MesEntity, - ReportFullPath = logic.Logistics.ReportFullPath, - ProcessJobID = logic.Logistics.ProcessJobID, - MID = logic.Logistics.MID, - // - Date = nameof(Date), - Employee = nameof(Employee), - Lot = nameof(Lot), - PSN = nameof(PSN), - Reactor = nameof(Reactor), - Recipe = nameof(Recipe), - // - Comments = nameof(Comments), - Diameter = nameof(Diameter), - Exclusion = nameof(Exclusion), - Gain = nameof(Gain), - HeaderUniqueId = nameof(HeaderUniqueId), - Laser = nameof(Laser), - ParseErrorText = nameof(ParseErrorText), - RDS = nameof(RDS), - Slot = nameof(Slot), - UniqueId = nameof(UniqueId), - // - AreaCount = nameof(AreaCount), - AreaCountAvg = nameof(AreaCountAvg), - AreaCountMax = nameof(AreaCountMax), - AreaCountMin = nameof(AreaCountMin), - AreaCountStdDev = nameof(AreaCountStdDev), - AreaTotal = nameof(AreaTotal), - AreaTotalAvg = nameof(AreaTotalAvg), - AreaTotalMax = nameof(AreaTotalMax), - AreaTotalMin = nameof(AreaTotalMin), - AreaTotalStdDev = nameof(AreaTotalStdDev), - Bin1 = nameof(Bin1), - Bin2 = nameof(Bin2), - Bin3 = nameof(Bin3), - Bin4 = nameof(Bin4), - Bin5 = nameof(Bin5), - Bin6 = nameof(Bin6), - Bin7 = nameof(Bin7), - Bin8 = nameof(Bin8), - HazeAverage = nameof(HazeAverage), - HazeAverageAvg = nameof(HazeAverageAvg), - HazeAverageMax = nameof(HazeAverageMax), - HazeAverageMin = nameof(HazeAverageMin), - HazeAverageStdDev = nameof(HazeAverageStdDev), - HazePeak = nameof(HazePeak), - HazeRegion = nameof(HazeRegion), - HazeRegionAvg = nameof(HazeRegionAvg), - HazeRegionMax = nameof(HazeRegionMax), - HazeRegionMin = nameof(HazeRegionMin), - HazeRegionStdDev = nameof(HazeRegionStdDev), - HazeRng = nameof(HazeRng), - LPDCM2 = nameof(LPDCM2), - LPDCM2Avg = nameof(LPDCM2Avg), - LPDCM2Max = nameof(LPDCM2Max), - LPDCM2Min = nameof(LPDCM2Min), - LPDCM2StdDev = nameof(LPDCM2StdDev), - LPDCount = nameof(LPDCount), - LPDCountAvg = nameof(LPDCountAvg), - LPDCountMax = nameof(LPDCountMax), - LPDCountMin = nameof(LPDCountMin), - LPDCountStdDev = nameof(LPDCountStdDev), - Mean = nameof(Mean), - ScratchCount = nameof(ScratchCount), - ScratchCountAvg = nameof(ScratchCountAvg), - ScratchCountMax = nameof(ScratchCountMax), - ScratchCountMin = nameof(ScratchCountMin), - ScratchCountStdDev = nameof(ScratchCountStdDev), - ScratchTotal = nameof(ScratchTotal), - ScratchTotalAvg = nameof(ScratchTotalAvg), - ScratchTotalMax = nameof(ScratchTotalMax), - ScratchTotalMin = nameof(ScratchTotalMin), - ScratchTotalStdDev = nameof(ScratchTotalStdDev), - Sort = nameof(Sort), - StdDev = nameof(StdDev), - SumOfDefects = nameof(SumOfDefects), - SumOfDefectsAvg = nameof(SumOfDefectsAvg), - SumOfDefectsMax = nameof(SumOfDefectsMax), - SumOfDefectsMin = nameof(SumOfDefectsMin), - SumOfDefectsStdDev = nameof(SumOfDefectsStdDev), - Thresh = nameof(Thresh), - Thruput = nameof(Thruput), - // - Data = nameof(Data), - Parameters = nameof(Parameters) - }; - return result; - } - - public List GetDescription(ILogic logic, ConfigDataBase configDataBase, List tests, IProcessData iProcessData) - { - List results = new List(); - if (iProcessData is null || !(iProcessData is ProcessData processData) || processData.Header is null || !processData.Details.Any()) - results.Add(GetDefault(logic, configDataBase)); - else - { - string nullData; - Description description; - object configDataNullData = ConfigData.NullData; - if (configDataNullData is null) - nullData = string.Empty; - else - nullData = configDataNullData.ToString(); - for (int i = 0; i < processData.Details.Count; i++) - { - description = new Description - { - Test = (int)tests[i], - Count = tests.Count, - Index = i, - // - EventName = GetEventName(), - NullData = nullData, - JobID = logic.Logistics.JobID, - Sequence = logic.Logistics.Sequence.ToString(), - MesEntity = logic.Logistics.MesEntity, - ReportFullPath = logic.Logistics.ReportFullPath, - ProcessJobID = logic.Logistics.ProcessJobID, - MID = logic.Logistics.MID, - // - Date = processData.Header.Date, - Employee = processData.Header.PSN, - Lot = processData.Header.Lot, - PSN = processData.Header.PSN, - Reactor = processData.Header.Reactor, - Recipe = processData.Header.Recipe, - // - Comments = processData.Details[i].Comments, - Diameter = processData.Details[i].Diameter, - Exclusion = processData.Details[i].Exclusion, - Gain = processData.Details[i].Gain, - HeaderUniqueId = processData.Details[i].HeaderUniqueId, - Laser = processData.Details[i].Laser, - ParseErrorText = processData.Header.ParseErrorText, - RDS = processData.Header.RDS, - Slot = processData.Details[i].Slot, - UniqueId = processData.Details[i].UniqueId, - // - AreaCount = processData.Details[i].AreaCount, - AreaCountAvg = processData.Header.AreaCountAvg, - AreaCountMax = processData.Header.AreaCountMax, - AreaCountMin = processData.Header.AreaCountMin, - AreaCountStdDev = processData.Header.AreaCountStdDev, - AreaTotal = processData.Details[i].AreaTotal, - AreaTotalAvg = processData.Header.AreaTotalAvg, - AreaTotalMax = processData.Header.AreaTotalMax, - AreaTotalMin = processData.Header.AreaTotalMin, - AreaTotalStdDev = processData.Header.AreaTotalStdDev, - Bin1 = processData.Details[i].Bin1, - Bin2 = processData.Details[i].Bin2, - Bin3 = processData.Details[i].Bin3, - Bin4 = processData.Details[i].Bin4, - Bin5 = processData.Details[i].Bin5, - Bin6 = processData.Details[i].Bin6, - Bin7 = processData.Details[i].Bin7, - Bin8 = processData.Details[i].Bin8, - HazeAverage = processData.Details[i].HazeAverage, - HazeAverageAvg = processData.Header.HazeAverageAvg, - HazeAverageMax = processData.Header.HazeAverageMax, - HazeAverageMin = processData.Header.HazeAverageMin, - HazeAverageStdDev = processData.Header.HazeAverageStdDev, - HazePeak = processData.Details[i].HazePeak, - HazeRegion = processData.Details[i].HazeRegion, - HazeRegionAvg = processData.Header.HazeRegionAvg, - HazeRegionMax = processData.Header.HazeRegionMax, - HazeRegionMin = processData.Header.HazeRegionMin, - HazeRegionStdDev = processData.Header.HazeRegionStdDev, - HazeRng = processData.Details[i].HazeRng, - LPDCM2 = processData.Details[i].LPDCM2, - LPDCM2Avg = processData.Header.LPDCM2Avg, - LPDCM2Max = processData.Header.LPDCM2Max, - LPDCM2Min = processData.Header.LPDCM2Min, - LPDCM2StdDev = processData.Header.LPDCM2StdDev, - LPDCount = processData.Details[i].LPDCount, - LPDCountAvg = processData.Header.LPDCountAvg, - LPDCountMax = processData.Header.LPDCountMax, - LPDCountMin = processData.Header.LPDCountMin, - LPDCountStdDev = processData.Header.LPDCountStdDev, - Mean = processData.Details[i].Mean, - ScratchCount = processData.Details[i].ScratchCount, - ScratchCountAvg = processData.Header.ScratchCountAvg, - ScratchCountMax = processData.Header.ScratchCountMax, - ScratchCountMin = processData.Header.ScratchCountMin, - ScratchCountStdDev = processData.Header.ScratchCountStdDev, - ScratchTotal = processData.Details[i].ScratchTotal, - ScratchTotalAvg = processData.Header.ScratchTotalAvg, - ScratchTotalMax = processData.Header.ScratchTotalMax, - ScratchTotalMin = processData.Header.ScratchTotalMin, - ScratchTotalStdDev = processData.Header.ScratchTotalStdDev, - Sort = processData.Details[i].Sort, - StdDev = processData.Details[i].StdDev, - SumOfDefects = processData.Details[i].SumOfDefects, - SumOfDefectsAvg = processData.Header.SumOfDefectsAvg, - SumOfDefectsMax = processData.Header.SumOfDefectsMax, - SumOfDefectsMin = processData.Header.SumOfDefectsMin, - SumOfDefectsStdDev = processData.Header.SumOfDefectsStdDev, - Thresh = processData.Details[i].Thresh, - Thruput = processData.Details[i].Thruput - }; - results.Add(description); - } - } - return results; - } - - } - - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/ProcessData.HeaderFile.cs b/Adaptation/Helpers/ProcessData.HeaderFile.cs deleted file mode 100644 index 91da79e..0000000 --- a/Adaptation/Helpers/ProcessData.HeaderFile.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace Adaptation.Helpers -{ - - public partial class ProcessData - { - - public class HeaderFile - { - - public string JobID { get; set; } - public string MesEntity { get; set; } - public string AreaCountAvg { get; set; } - public string AreaCountMax { get; set; } - public string AreaCountMin { get; set; } - public string AreaCountStdDev { get; set; } - public string AreaTotalAvg { get; set; } - public string AreaTotalMax { get; set; } - public string AreaTotalMin { get; set; } - public string AreaTotalStdDev { get; set; } - public string Date { get; set; } - public string HazeAverageAvg { get; set; } - public string HazeAverageMax { get; set; } - public string HazeAverageMin { get; set; } - public string HazeAverageStdDev { get; set; } - public string HazeRegionAvg { get; set; } - public string HazeRegionMax { get; set; } - public string HazeRegionMin { get; set; } - public string HazeRegionStdDev { get; set; } - public string LPDCM2Avg { get; set; } - public string LPDCM2Max { get; set; } - public string LPDCM2Min { get; set; } - public string LPDCM2StdDev { get; set; } - public string LPDCountAvg { get; set; } - public string LPDCountMax { get; set; } - public string LPDCountMin { get; set; } - public string LPDCountStdDev { get; set; } - public string Lot { get; set; } - public string ParseErrorText { get; set; } - public string PSN { get; set; } - public string RDS { get; set; } - public string Reactor { get; set; } - public string Recipe { get; set; } - public string ScratchCountAvg { get; set; } - public string ScratchCountMax { get; set; } - public string ScratchCountMin { get; set; } - public string ScratchCountStdDev { get; set; } - public string ScratchTotalAvg { get; set; } - public string ScratchTotalMax { get; set; } - public string ScratchTotalMin { get; set; } - public string ScratchTotalStdDev { get; set; } - public string SumOfDefectsAvg { get; set; } - public string SumOfDefectsMax { get; set; } - public string SumOfDefectsMin { get; set; } - public string SumOfDefectsStdDev { get; set; } - public string UniqueId { get; set; } - - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/ProcessData.WSRequest.cs b/Adaptation/Helpers/ProcessData.WSRequest.cs deleted file mode 100644 index 2ec0b15..0000000 --- a/Adaptation/Helpers/ProcessData.WSRequest.cs +++ /dev/null @@ -1,203 +0,0 @@ -using Adaptation.Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Adaptation.Helpers -{ - - public partial class ProcessData - { - public class WSRequest - { - - public long Id { get; set; } - public string AreaCountAvg { get; set; } - public string AreaCountMax { get; set; } - public string AreaCountMin { get; set; } - public string AreaCountStdDev { get; set; } - public string AreaTotalAvg { get; set; } - public string AreaTotalMax { get; set; } - public string AreaTotalMin { get; set; } - public string AreaTotalStdDev { get; set; } - public string Date { get; set; } - public string HazeAverageAvg { get; set; } - public string HazeAverageMax { get; set; } - public string HazeAverageMin { get; set; } - public string HazeAverageStdDev { get; set; } - public string HazeRegionAvg { get; set; } - public string HazeRegionMax { get; set; } - public string HazeRegionMin { get; set; } - public string HazeRegionStdDev { get; set; } - public string Layer { get; set; } - public string LotID { get; set; } - public string LPDCM2Avg { get; set; } - public string LPDCM2Max { get; set; } - public string LPDCM2Min { get; set; } - public string LPDCM2StdDev { get; set; } - public string LPDCountAvg { get; set; } - public string LPDCountMax { get; set; } - public string LPDCountMin { get; set; } - public string LPDCountStdDev { get; set; } - public string Operator { get; set; } - public string ParseErrorText { get; set; } - public string PSN { get; set; } - public string RDS { get; set; } - public string Reactor { get; set; } - public string Recipe { get; set; } - public string ScratchCountAvg { get; set; } - public string ScratchCountMax { get; set; } - public string ScratchCountMin { get; set; } - public string ScratchCountStdDev { get; set; } - public string ScratchTotalAvg { get; set; } - public string ScratchTotalMax { get; set; } - public string ScratchTotalMin { get; set; } - public string ScratchTotalStdDev { get; set; } - public string SumOfDefectsAvg { get; set; } - public string SumOfDefectsMax { get; set; } - public string SumOfDefectsMin { get; set; } - public string SumOfDefectsStdDev { get; set; } - public string Title { get; set; } - public string UniqueId { get; set; } - public string Zone { get; set; } - - public string CellName { get; set; } - public string Data { get; set; } - public int i { get; set; } - public List Details { get; protected set; } - - [Obsolete("For json")] public WSRequest() { } - - internal WSRequest(ILogic logic, List descriptions) - { - i = -1; - Id = 0; - Zone = null; - Layer = null; - Title = null; - Data = "*Data*"; - Details = new List(); - CellName = logic.Logistics.MesEntity; - FileRead.Description x = descriptions[0]; - //Header - { - AreaCountAvg = x.AreaCountAvg; - AreaCountMax = x.AreaCountMax; - AreaCountMin = x.AreaCountMin; - AreaCountStdDev = x.AreaCountStdDev; - AreaTotalAvg = x.AreaTotalAvg; - AreaTotalMax = x.AreaTotalMax; - AreaTotalMin = x.AreaTotalMin; - AreaTotalStdDev = x.AreaTotalStdDev; - Date = x.Date; - HazeAverageAvg = x.HazeAverageAvg; - HazeAverageMax = x.HazeAverageMax; - HazeAverageMin = x.HazeAverageMin; - HazeAverageStdDev = x.HazeAverageStdDev; - HazeRegionAvg = x.HazeRegionAvg; - HazeRegionMax = x.HazeRegionMax; - HazeRegionMin = x.HazeRegionMin; - HazeRegionStdDev = x.HazeRegionStdDev; - LotID = x.Lot; - LPDCM2Avg = x.LPDCM2Avg; - LPDCM2Max = x.LPDCM2Max; - LPDCM2Min = x.LPDCM2Min; - LPDCM2StdDev = x.LPDCM2StdDev; - LPDCountAvg = x.LPDCountAvg; - LPDCountMax = x.LPDCountMax; - LPDCountMin = x.LPDCountMin; - LPDCountStdDev = x.LPDCountStdDev; - ParseErrorText = x.ParseErrorText; - PSN = x.PSN; - RDS = x.RDS; - Reactor = x.Reactor; - Recipe = x.Recipe; - ScratchCountAvg = x.ScratchCountAvg; - ScratchCountMax = x.ScratchCountMax; - ScratchCountMin = x.ScratchCountMin; - ScratchCountStdDev = x.ScratchCountStdDev; - ScratchTotalAvg = x.ScratchTotalAvg; - ScratchTotalMax = x.ScratchTotalMax; - ScratchTotalMin = x.ScratchTotalMin; - ScratchTotalStdDev = x.ScratchTotalStdDev; - SumOfDefectsAvg = x.SumOfDefectsAvg; - SumOfDefectsMax = x.SumOfDefectsMax; - SumOfDefectsMin = x.SumOfDefectsMin; - SumOfDefectsStdDev = x.SumOfDefectsStdDev; - UniqueId = x.UniqueId; - } - DataFile dataFile; - foreach (FileRead.Description description in descriptions) - { - dataFile = new DataFile - { - Data = "*Data*", - i = -1, - Id = 0, //item.Id, - AreaCount = description.AreaCount, - AreaTotal = description.AreaTotal, - Bin1 = description.Bin1, - Bin2 = description.Bin2, - Bin3 = description.Bin3, - Bin4 = description.Bin4, - Bin5 = description.Bin5, - Bin6 = description.Bin6, - Bin7 = description.Bin7, - Bin8 = description.Bin8, - Comments = description.Comments, - Date = description.Date, - Diameter = description.Diameter, - Exclusion = description.Exclusion, - Gain = description.Gain, - HazeAverage = description.HazeAverage, - HazePeak = description.HazePeak, - HazeRegion = description.HazeRegion, - HazeRng = description.HazeRng, - HeaderUniqueId = description.HeaderUniqueId, - LPDCM2 = description.LPDCM2, - LPDCount = description.LPDCount, - Laser = description.Laser, - Mean = description.Mean, - Recipe = description.Recipe, - ScratchCount = description.ScratchCount, - ScratchTotal = description.ScratchTotal, - Slot = description.Slot, - Sort = description.Sort, - StdDev = description.StdDev, - SumOfDefects = description.SumOfDefects, - Thresh = description.Thresh, - Thruput = description.Thruput, - Title = null, - UniqueId = description.UniqueId - }; - Details.Add(dataFile); - } - Date = logic.Logistics.DateTimeFromSequence.ToString(); - if (UniqueId is null && Details.Any()) - UniqueId = Details[0].HeaderUniqueId; - for (int i = 0; i < Details.Count; i++) - { - if (string.IsNullOrEmpty(Details[i].Bin1)) - Details[i].Bin1 = null; - if (string.IsNullOrEmpty(Details[i].Bin2)) - Details[i].Bin2 = null; - if (string.IsNullOrEmpty(Details[i].Bin3)) - Details[i].Bin3 = null; - if (string.IsNullOrEmpty(Details[i].Bin4)) - Details[i].Bin4 = null; - if (string.IsNullOrEmpty(Details[i].Bin5)) - Details[i].Bin5 = null; - if (string.IsNullOrEmpty(Details[i].Bin6)) - Details[i].Bin6 = null; - if (string.IsNullOrEmpty(Details[i].Bin7)) - Details[i].Bin7 = null; - if (string.IsNullOrEmpty(Details[i].Bin8)) - Details[i].Bin8 = null; - } - } - - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/ProcessData.cs b/Adaptation/Helpers/ProcessData.cs deleted file mode 100644 index bdb7a0a..0000000 --- a/Adaptation/Helpers/ProcessData.cs +++ /dev/null @@ -1,912 +0,0 @@ -using Adaptation.Shared; -using Adaptation.Shared.Metrology; -using log4net; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Text.RegularExpressions; - -namespace Adaptation.Helpers -{ - - public partial class ProcessData : IProcessData - { - - public HeaderFile Header { get; private set; } - public List Details { get; private set; } - - private int _I; - private readonly ILog _Log; - private string _Data; - - public ProcessData(ILogic logic, ConfigData configData, List fileInfoCollection) - { - Header = null; - fileInfoCollection.Clear(); - _I = 0; - _Data = string.Empty; - Details = new List(); - _Log = LogManager.GetLogger(typeof(ProcessData)); - Tuple> tuple = Parse(logic, configData, fileInfoCollection); - Details.AddRange(tuple.Item2); - Header = tuple.Item1; - } - - public Tuple> GetResults(ILogic logic, ConfigDataBase configDataBase, List fileInfoCollection) - { - Tuple> results; - if (!(configDataBase is ConfigData configData)) - throw new Exception(); - List tests = new List(); - List descriptions; - EventName eventName = configData.GetEventNameValue(); - if (eventName == EventName.FileRead && Details.Any()) - { - foreach (DataFile item in Details) - tests.Add(Test.Tencor); - descriptions = configData.GetDescription(logic, tests, this); - } - else - throw new Exception(); - if (!configData.EafHosted) - { - new FileRead.Description().GetDescription(logic, configData, tests, this); - } - if (tests.Count != descriptions.Count) - throw new Exception(); - for (int i = 0; i < tests.Count; i++) - { - if (descriptions[i].Test != (int)tests[i]) - throw new Exception(); - } - string json; - if (descriptions[0] is Duplicator.Description) - { - List duplicatorDescriptions = (from l in descriptions select (Duplicator.Description)l).ToList(); - json = JsonSerializer.Serialize(duplicatorDescriptions, duplicatorDescriptions.GetType()); - } - else if (descriptions[0] is FileRead.Description) - { - List fileReadDescriptions = (from l in descriptions select (FileRead.Description)l).ToList(); - json = JsonSerializer.Serialize(fileReadDescriptions, fileReadDescriptions.GetType()); - } - else - throw new Exception(); - object @object = JsonSerializer.Deserialize(json); - if (!(@object is JsonElement jsonElement)) - throw new Exception(); - results = new Tuple>(logic.Logistics.Logistics1[0], jsonElement, fileInfoCollection); - return results; - } - - public static Dictionary> GetKeyValuePairs(ConfigData configData, JsonElement jsonElement, List processDataDescriptions, bool extra = false) - { - Dictionary> results = configData.GetKeyValuePairs(processDataDescriptions); - configData.CheckProcessDataDescription(results, extra); - return results; - } - - public static List GetProcessDataFileReadDescriptions(ConfigData configData, JsonElement jsonElement) - { - List results = new List(); - List processDataDescriptions = configData.GetIProcessDataDescriptions(jsonElement); - foreach (IProcessDataDescription processDataDescription in processDataDescriptions) - { - if (!(processDataDescription is FileRead.Description description)) - continue; - results.Add(description); - } - return results; - } - - public static string GetLines(ILogic logic, List descriptions, bool ganPPTST) - { - StringBuilder result = new StringBuilder(); - FileRead.Description x = descriptions[0]; - if (ganPPTST) - { - string slot; - string reactor; - const int eight = 8; - DateTime dateTime = DateTime.Parse(x.Date); - string lot = x.Lot.ToLower().Replace("69-", string.Empty).Replace("71-", string.Empty).Replace("-", string.Empty); - if (string.IsNullOrEmpty(x.Lot) || x.Lot.Length < 2) - reactor = "R"; - else - reactor = string.Concat("R", x.Lot.Substring(0, 2)); - result.Append(nameof(x.Date)).Append(";"). - Append("Part").Append(";"). - Append(nameof(x.Reactor)).Append(";"). - Append("Lot").Append(";"). - Append(nameof(DataFile.Slot)).Append(";"). - Append(nameof(DataFile.Bin1)).Append(";"). - Append(nameof(DataFile.Bin2)).Append(";"). - Append(nameof(DataFile.Bin3)).Append(";"). - Append(nameof(DataFile.Bin4)).Append(";"). - Append(nameof(DataFile.Bin5)).Append(";"). - Append(nameof(DataFile.Bin6)).Append(";"). - Append("Bin9"). - AppendLine(); - foreach (FileRead.Description description in descriptions) - { - slot = description.Slot.Replace("*", string.Empty); - result.Append("!").Append(dateTime.ToString("MM/dd/yyyy HH:mm:ss")).Append(";"). - Append("Particle Adder;"). - Append(reactor).Append(";"). - Append(lot).Append(";"). - Append(slot).Append(";"). - Append(description.Bin1).Append(";"). - Append(description.Bin2).Append(";"). - Append(description.Bin3).Append(";"). - Append(description.Bin4).Append(";"). - Append(description.Bin5).Append(";"). - Append(description.Bin6).Append(";"). - Append(description.AreaCount). - AppendLine(); - } - if (descriptions.Count != eight) - { - string negitiveTenThousand = "-10000"; - for (int i = descriptions.Count; i < eight; i++) - { - result.Append("!").Append(dateTime.ToString("MM/dd/yyyy HH:mm:ss")).Append(";"). - Append("Particle Adder;"). - Append(reactor).Append(";"). - Append(lot).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand). - AppendLine(); - } - } - if (result.ToString().Split('\n').Length != (eight + 2)) - throw new Exception(string.Concat("Must have ", eight, " samples")); - } - else - { - char del = '\t'; - result.Append(x.AreaCountAvg).Append(del). // 001 - AreaCountAvg - Append(x.AreaCountMax).Append(del). // 002 - AreaCountMax - Append(x.AreaCountMin).Append(del). // 003 - AreaCountMin - Append(x.AreaCountStdDev).Append(del). // 004 - AreaCountStdDev - Append(x.AreaTotalAvg).Append(del). // 005 - AreaTotalAvg - Append(x.AreaTotalMax).Append(del). // 006 - AreaTotalMax - Append(x.AreaTotalMin).Append(del). // 007 - AreaTotalMin - Append(x.AreaTotalStdDev).Append(del). // 008 - AreaTotalStdDev - Append(x.Date).Append(del). // 009 - - Append(x.HazeAverageAvg).Append(del). // 010 - Haze Average - Append(x.HazeAverageMax).Append(del). // 011 - - Append(x.HazeAverageMin).Append(del). // 012 - - Append(x.HazeAverageStdDev).Append(del). // 013 - - Append(x.HazeRegionAvg).Append(del). // 014 - - Append(x.HazeRegionMax).Append(del). // 015 - - Append(x.HazeRegionMin).Append(del). // 016 - - Append(x.HazeRegionStdDev).Append(del). // 017 - - Append(x.Lot).Append(del). // 018 - - Append(x.LPDCM2Avg).Append(del). // 019 - - Append(x.LPDCM2Max).Append(del). // 020 - - Append(x.LPDCM2Min).Append(del). // 021 - - Append(x.LPDCM2StdDev).Append(del). // 022 - - Append(x.LPDCountAvg).Append(del). // 023 - - Append(x.LPDCountMax).Append(del). // 024 - - Append(x.LPDCM2Min).Append(del). // 025 - - Append(x.LPDCountStdDev).Append(del). // 026 - - Append(x.Employee).Append(del). // 027 - - Append(x.RDS).Append(del). // 028 - Lot - Append(x.Reactor).Append(del). // 029 - Process - Append(x.Recipe.Replace(";", string.Empty)).Append(del). // 030 - Part - Append(x.ScratchCountAvg).Append(del). // 031 - Scratch Count - Append(x.ScratchCountMax).Append(del). // 032 - - Append(x.ScratchCountMin).Append(del). // 033 - - Append(x.ScratchTotalStdDev).Append(del). // 034 - - Append(x.ScratchTotalAvg).Append(del). // 035 - Scratch Length - Append(x.ScratchTotalMax).Append(del). // 036 - - Append(x.ScratchTotalMin).Append(del). // 037 - - Append(x.ScratchTotalStdDev).Append(del). // 038 - - Append(x.SumOfDefectsAvg).Append(del). // 039 - Average Sum of Defects - Append(x.SumOfDefectsMax).Append(del). // 040 - Max Sum of Defects - Append(x.SumOfDefectsMin).Append(del). // 041 - Min Sum of Defects - Append(x.SumOfDefectsStdDev).Append(del). // 042 - SumOfDefectsStdDev - Append(logic.Logistics.MesEntity).Append(del). // 043 - - AppendLine(); - } - return result.ToString(); - } - - private static void UpdateDataPDF(List descriptions, string checkFileName) - { - string value; - object possiblePage; - object possibleString; - object possibleCOSArray; - java.util.List tokenList; - java.util.List arrayList; - java.io.OutputStream outputStream; - java.util.ListIterator tokenIterator; - java.util.ListIterator arrayIterator; - List updateValues = new List(); - string reactorLoadLock = descriptions[0].Comments; - StringBuilder stringBuilder = new StringBuilder(); - java.io.File file = new java.io.File(checkFileName); - org.apache.pdfbox.pdmodel.common.PDStream pdStream; - org.apache.pdfbox.pdmodel.common.PDStream updatedStream; - org.apache.pdfbox.pdfparser.PDFStreamParser pdfStreamParser; - org.apache.pdfbox.pdfwriter.ContentStreamWriter contentStreamWriter; - org.apache.pdfbox.pdmodel.PDDocument pdDocument = org.apache.pdfbox.pdmodel.PDDocument.load(file); - org.apache.pdfbox.pdmodel.PDDocumentCatalog pdDocumentCatalog = pdDocument.getDocumentCatalog(); - java.util.List pagesList = pdDocumentCatalog.getAllPages(); - java.util.ListIterator pageIterator = pagesList.listIterator(); - for (short i = 1; i < short.MaxValue; i++) - { - if (!pageIterator.hasNext()) - break; - possiblePage = pageIterator.next(); - if (!(possiblePage is org.apache.pdfbox.pdmodel.PDPage page)) - continue; - pdStream = page.getContents(); - pdfStreamParser = new org.apache.pdfbox.pdfparser.PDFStreamParser(pdStream); - pdfStreamParser.parse(); - tokenList = pdfStreamParser.getTokens(); - tokenIterator = tokenList.listIterator(); - for (short t = 1; i < short.MaxValue; t++) - { - if (!tokenIterator.hasNext()) - break; - possibleCOSArray = tokenIterator.next(); - if (!(possibleCOSArray is org.apache.pdfbox.cos.COSArray cossArray)) - continue; - stringBuilder.Clear(); - arrayList = cossArray.toList(); - arrayIterator = arrayList.listIterator(); - for (short a = 1; i < short.MaxValue; a++) - { - if (!arrayIterator.hasNext()) - break; - possibleString = arrayIterator.next(); - if (!(possibleString is org.apache.pdfbox.cos.COSString cossString)) - continue; - value = cossString.getString(); - stringBuilder.Append(value); - if (value != "]") - continue; - updateValues.Add(value); - value = stringBuilder.ToString(); - if (value.Contains("[]")) - cossArray.setString(a - 1, string.Concat("*", reactorLoadLock, "]")); - else - cossArray.setString(a - 1, string.Concat(" {*", reactorLoadLock, "}]")); - } - } - if (updateValues.Any()) - { - updatedStream = new org.apache.pdfbox.pdmodel.common.PDStream(pdDocument); - outputStream = updatedStream.createOutputStream(); - contentStreamWriter = new org.apache.pdfbox.pdfwriter.ContentStreamWriter(outputStream); - contentStreamWriter.writeTokens(tokenList); - outputStream.close(); - page.setContents(updatedStream); - } - } - if (updateValues.Any()) - pdDocument.save(checkFileName); - pdDocument.close(); - } - - internal static void PostOpenInsightMetrologyViewerAttachments(ILog log, ConfigData configData, Logistics logistics, DateTime dateTime, string logisticsSequenceMemoryDirectory, List descriptions, string matchDirectory) - { - string checkFileName; - string[] pclFiles = Directory.GetFiles(matchDirectory, "*.pcl", SearchOption.TopDirectoryOnly); - if (pclFiles.Length != 1) - throw new Exception("Invalid source file count!"); - string sourceFileNameNoExt = Path.GetFileNameWithoutExtension(pclFiles[0]); - string wsResultsMemoryFile = string.Concat(logisticsSequenceMemoryDirectory, @"\", nameof(WS.Results), ".json"); - if (!File.Exists(wsResultsMemoryFile)) - throw new Exception(string.Concat("Memory file <", wsResultsMemoryFile, "> doesn't exist!")); - string json = File.ReadAllText(wsResultsMemoryFile); - WS.Results metrologyWSRequest = JsonSerializer.Deserialize(json); - long wsResultsHeaderID = metrologyWSRequest.HeaderID; - List dataAttachments = new List(); - List headerAttachments = new List(); - checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_data.pdf"); - if (!File.Exists(checkFileName)) - log.Debug("Header file doesn't exist!"); - else - { - UpdateDataPDF(descriptions, checkFileName); - headerAttachments.Add(new WS.Attachment(descriptions[0].HeaderUniqueId, "Data.pdf", checkFileName)); - } - foreach (FileRead.Description description in descriptions) - { - checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_", description.Slot.Replace('*', 's'), "_image.pdf"); - if (File.Exists(checkFileName)) - dataAttachments.Add(new WS.Attachment(description.UniqueId, "Image.pdf", checkFileName)); - checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_", description.Slot.Replace('*', 's'), "_data.pdf"); - if (File.Exists(checkFileName)) - dataAttachments.Add(new WS.Attachment(description.UniqueId, "Data.pdf", checkFileName)); - } - if (dataAttachments.Count == 0 || dataAttachments.Count != descriptions.Count) - log.Debug("Invalid attachment count!"); - WS.AttachFiles(configData.OpenInsightMetrogyViewerAPI, wsResultsHeaderID, headerAttachments, dataAttachments); - } - - /// - /// Convert the raw data file to parsable file format - in this case from PCL to PDF - /// - /// source file to be converted to PDF - /// - private static string ConvertSourceFileToPdf(ConfigData configData, string sourceFile) - { - string result = Path.ChangeExtension(sourceFile, ".pdf"); - if (!File.Exists(result)) - { - //string arguments = string.Concat("-i \"", sourceFile, "\" -o \"", result, "\""); - string arguments = string.Concat("-dSAFER -dBATCH -dNOPAUSE -sOutputFile=\"", result, "\" -sDEVICE=pdfwrite \"", sourceFile, "\""); - //Process process = Process.Start(configData.LincPDFCFileName, arguments); - Process process = Process.Start(configData.GhostPCLFileName, arguments); - process.WaitForExit(30000); - if (!File.Exists(result)) - throw new Exception("PDF file wasn't created"); - } - return result; - } - - /// - /// Test and fix a data line from the Lot Summary page if there are two values that are merged. - /// - /// data line from Lot Summary - private void FixToEolArray(ref string[] toEol) - { - const int MAX_COLUMNS = 9; - int[] mColumnWidths = new int[MAX_COLUMNS] { 8, 6, 6, 6, 6, 7, 7, 5, 7 }; - // is it short at least one data point - if (toEol.Length < MAX_COLUMNS) - { - _Log.Debug($"****FixToEolArray - Starting array:"); - _Log.Debug(toEol); - _Log.Debug($"****FixToEolArray - Column widths:"); - _Log.Debug(mColumnWidths); - string leftVal, rightVal; - - // size up and assign a working list - List toEolList = new List(toEol); - if (string.IsNullOrEmpty(toEolList[toEolList.Count - 1])) - toEolList.RemoveAt(toEolList.Count - 1); // removes a null element at end - _Log.Debug($"****FixToEolArray - New toEolList:"); - _Log.Debug(toEolList); - for (int i = toEolList.Count; i < MAX_COLUMNS; i++) - toEolList.Insert(0, ""); // insert to top of list - _Log.Debug(toEolList); - - // start at the end - for (int i = MAX_COLUMNS - 1; i >= 0; i--) - { - // test for a bad value - does it have too many characters - _Log.Debug($"****FixToEolArray - toEolList[i].Length: {toEolList[i].Length}, mColumnWidths[i]: {mColumnWidths[i]}"); - if (toEolList[i].Length > mColumnWidths[i]) - { - // split it up into its two parts - leftVal = toEolList[i].Substring(0, toEolList[i].Length - mColumnWidths[i]); - rightVal = toEolList[i].Substring(leftVal.Length); - _Log.Debug($"****FixToEolArray - Split leftVal: {leftVal}"); - _Log.Debug($"****FixToEolArray - Split rightVal: {rightVal}"); - - // insert new value - toEolList[i] = rightVal; - toEolList.Insert(i, leftVal); - if (string.IsNullOrEmpty(toEolList[0])) - toEolList.RemoveAt(0); // removes a null element at end - _Log.Debug($"****FixToEolArray - Fixed toEolList:"); - _Log.Debug(toEolList); - } - } - toEol = toEolList.ToArray(); - _Log.Debug($"****FixToEolArray - Ending array:"); - _Log.Debug(toEol); - } - } - - private void ScanPast(string text) - { - int num = _Data.IndexOf(text, _I); - if (num > -1) - _I = num + text.Length; - else - _I = _Data.Length; - } - - private string GetBefore(string text) - { - int num = _Data.IndexOf(text, _I); - if (num > -1) - { - string str = _Data.Substring(_I, num - _I); - _I = num + text.Length; - return str.Trim(); - } - string str1 = _Data.Substring(_I); - _I = _Data.Length; - return str1.Trim(); - } - - private string GetBefore(string text, bool trim) - { - if (trim) - return GetBefore(text); - int num = _Data.IndexOf(text, _I); - if (num > -1) - { - string str = _Data.Substring(_I, num - _I); - _I = num + text.Length; - return str; - } - string str1 = _Data.Substring(_I); - _I = _Data.Length; - return str1; - } - - private bool IsNullOrWhiteSpace(string text) - { - for (int index = 0; index < text.Length; ++index) - { - if (!char.IsWhiteSpace(text[index])) - return false; - } - return true; - } - - private bool IsBlankLine() - { - int num = _Data.IndexOf("\n", _I); - return IsNullOrWhiteSpace(num > -1 ? _Data.Substring(_I, num - _I) : _Data.Substring(_I)); - } - - private string GetToEOL() - { - return GetBefore("\n"); - } - - private string GetToEOL(bool trim) - { - if (trim) - return GetToEOL(); - return GetBefore("\n", false); - } - - private string GetToText(string text) - { - return _Data.Substring(_I, _Data.IndexOf(text, _I) - _I).Trim(); - } - - private string GetToken() - { - while (_I < _Data.Length && IsNullOrWhiteSpace(_Data.Substring(_I, 1))) - ++_I; - int j = _I; - while (j < _Data.Length && !IsNullOrWhiteSpace(_Data.Substring(j, 1))) - ++j; - string str = _Data.Substring(_I, j - _I); - _I = j; - return str.Trim(); - } - - private string PeekNextLine() - { - int j = _I; - string toEol = GetToEOL(); - _I = j; - return toEol; - } - - private HeaderFile ParseLotSummary(ILogic logic, string headerFileName, Dictionary pages, Dictionary> slots) - { - HeaderFile result = new HeaderFile { JobID = logic.Logistics.JobID, MesEntity = logic.Logistics.MesEntity, Date = DateTime.Now.ToString() }; - _I = 0; - //string headerText; - //string altHeaderFileName = Path.ChangeExtension(headerFileName, ".txt"); - //if (File.Exists(altHeaderFileName)) - // headerText = File.ReadAllText(altHeaderFileName); - //else - //{ - // //Pdfbox, IKVM.AWT.WinForms - // org.apache.pdfbox.pdmodel.PDDocument pdfDocument = org.apache.pdfbox.pdmodel.PDDocument.load(headerFileName); - // org.apache.pdfbox.util.PDFTextStripper stripper = new org.apache.pdfbox.util.PDFTextStripper(); - // headerText = stripper.getText(pdfDocument); - // pdfDocument.close(); - // File.AppendAllText(altHeaderFileName, headerText); - //} - //result.Id = h; - //result.Title = h; - //result.Zone = h; - //result.PSN = h; - //result.Layer = h; - result.ParseErrorText = string.Empty; - if (!pages.ContainsKey(headerFileName)) - throw new Exception(); - _I = 0; - _Data = pages[headerFileName]; - ScanPast("Date:"); - result.Date = GetToEOL(); - ScanPast("Recipe ID:"); - result.Recipe = GetBefore("LotID:"); - result.Recipe = result.Recipe.Replace(";", ""); - if (_Data.Contains("[]")) - result.Lot = GetBefore("[]"); - else if (_Data.Contains("[7]")) - result.Lot = GetBefore("[7]"); - else - result.Lot = GetBefore("["); - - // Remove illegal characters \/:*?"<>| found in the Lot. - result.Lot = Regex.Replace(result.Lot, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; - - // determine number of wafers and their slot numbers - _Log.Debug(_Data.Substring(_I)); - string slot; - string toEOL; - int slotCount = _Data.Substring(_I).Split('*').Length - 1; - _Log.Debug($"****HeaderFile - Slot Count: {slotCount}."); - for (int i = 0; i < slotCount; i++) - { - ScanPast("*"); - toEOL = GetToEOL(false); - slot = string.Concat("*", toEOL.Substring(0, 2)); - if (!slots.ContainsKey(slot)) - slots.Add(slot, new List()); - } - _Log.Debug($"****HeaderFile - Slots:"); - _Log.Debug(slots); - - ScanPast("Min:"); - - string[] toEol1 = GetToEOL(false).Trim().Split(' '); - _Log.Debug($"****HeaderFile - toEol1 Count: {toEol1.Length}."); - FixToEolArray(ref toEol1); - result.LPDCountMin = toEol1[0].Trim(); - result.LPDCM2Min = toEol1[1].Trim(); - result.AreaCountMin = toEol1[2].Trim(); - result.AreaTotalMin = toEol1[3].Trim(); - result.ScratchCountMin = toEol1[4].Trim(); - result.ScratchTotalMin = toEol1[5].Trim(); - result.SumOfDefectsMin = toEol1[6].Trim(); - result.HazeRegionMin = toEol1[7].Trim(); - result.HazeAverageMin = toEol1[8].Trim(); - ScanPast("Max:"); - - string[] toEol2 = GetToEOL(false).Trim().Split(' '); - _Log.Debug($"****HeaderFile - toEol2 Count: {toEol2.Length}."); - FixToEolArray(ref toEol2); - result.LPDCountMax = toEol2[0].Trim(); - result.LPDCM2Max = toEol2[1].Trim(); - result.AreaCountMax = toEol2[2].Trim(); - result.AreaTotalMax = toEol2[3].Trim(); - result.ScratchCountMax = toEol2[4].Trim(); - result.ScratchTotalMax = toEol2[5].Trim(); - result.SumOfDefectsMax = toEol2[6].Trim(); - result.HazeRegionMax = toEol2[7].Trim(); - result.HazeAverageMax = toEol2[8].Trim(); - ScanPast("Average:"); - - string[] toEol3 = GetToEOL(false).Trim().Split(' '); - _Log.Debug($"****HeaderFile - toEol3 Count: {toEol3.Length}."); - FixToEolArray(ref toEol3); - result.LPDCountAvg = toEol3[0].Trim(); - result.LPDCM2Avg = toEol3[1].Trim(); - result.AreaCountAvg = toEol3[2].Trim(); - result.AreaTotalAvg = toEol3[3].Trim(); - result.ScratchCountAvg = toEol3[4].Trim(); - result.ScratchTotalAvg = toEol3[5].Trim(); - result.SumOfDefectsAvg = toEol3[6].Trim(); - result.HazeRegionAvg = toEol3[7].Trim(); - result.HazeAverageAvg = toEol3[8].Trim(); - ScanPast("Std Dev:"); - - string[] toEol4 = GetToEOL(false).Trim().Split(' '); - _Log.Debug($"****HeaderFile - toEol4 Count: {toEol4.Length}."); - FixToEolArray(ref toEol4); - result.LPDCountStdDev = toEol4[0].Trim(); - result.LPDCM2StdDev = toEol4[1].Trim(); - result.AreaCountStdDev = toEol4[2].Trim(); - result.AreaTotalStdDev = toEol4[3].Trim(); - result.ScratchCountStdDev = toEol4[4].Trim(); - result.ScratchTotalStdDev = toEol4[5].Trim(); - result.SumOfDefectsStdDev = toEol4[6].Trim(); - result.HazeRegionStdDev = toEol4[7].Trim(); - result.HazeAverageStdDev = toEol4[8].Trim(); - - string[] segments = result.Lot.Split('-'); - if (segments.Length > 0) - result.Reactor = segments[0]; - if (segments.Length > 1) - result.RDS = segments[1]; - if (segments.Length > 2) - result.PSN = segments[2]; - // Example of header.UniqueId is TENCOR1_33-289217-4693_201901300556533336 - result.UniqueId = string.Format("{0}_{1}_{2}", logic.Logistics.JobID, result.Lot, Path.GetFileNameWithoutExtension(logic.Logistics.ReportFullPath)); - return result; - } - - private DataFile ParseWaferSummary(HeaderFile headerFile, string waferFileName, Dictionary pages) - { - DataFile result = new DataFile { Data = "*Data*", i = -1, }; - _I = 0; - //string waferText; - //string altWaferFileName = Path.ChangeExtension(waferFileName, ".txt"); - //if (File.Exists(altWaferFileName)) - // waferText = File.ReadAllText(altWaferFileName); - //else - //{ - // //Pdfbox, IKVM.AWT.WinForms - // org.apache.pdfbox.pdmodel.PDDocument pdfDocument = org.apache.pdfbox.pdmodel.PDDocument.load(waferFileName); - // org.apache.pdfbox.util.PDFTextStripper dataStripper = new org.apache.pdfbox.util.PDFTextStripper(); - // waferText = dataStripper.getText(pdfDocument); - // pdfDocument.close(); - // File.AppendAllText(altWaferFileName, waferText); - //} - List stringList = new List(); - result.HeaderUniqueId = headerFile.UniqueId; - result.Id = 0; - result.Title = null; - if (!pages.ContainsKey(waferFileName)) - throw new Exception(); - _I = 0; - _Data = pages[waferFileName]; - ScanPast("Date:"); - result.Date = GetToEOL(); - ScanPast("ID#"); - result.Slot = GetToEOL(); - if (result.Slot.Length > 5) - result.Slot = string.Concat(result.Slot.Substring(0, 5), "... - ***"); - //result.Slot = result.Slot.Replace("*", ""); - ScanPast("Comments:"); - result.Comments = GetToEOL(); - ScanPast("Sort:"); - result.Sort = GetToEOL(); - ScanPast("LPD Count:"); - result.LPDCount = GetToEOL(); - ScanPast("LPD / cm2:"); - result.LPDCM2 = GetToEOL(); - while (GetBefore(":").Contains("Bin")) - stringList.Add(GetToEOL()); - if (stringList.Count >= 1) - result.Bin1 = stringList[0]; - if (stringList.Count >= 2) - result.Bin2 = stringList[1]; - if (stringList.Count >= 3) - result.Bin3 = stringList[2]; - if (stringList.Count >= 4) - result.Bin4 = stringList[3]; - if (stringList.Count >= 5) - result.Bin5 = stringList[4]; - if (stringList.Count >= 6) - result.Bin6 = stringList[5]; - if (stringList.Count >= 7) - result.Bin7 = stringList[6]; - if (stringList.Count >= 8) - result.Bin8 = stringList[7]; - result.Mean = GetToEOL(); - ScanPast("Std Dev:"); - result.StdDev = GetToEOL(); - ScanPast("Area Count:"); - result.AreaCount = GetToEOL(); - ScanPast("Area Total:"); - result.AreaTotal = GetToEOL(); - ScanPast("Scratch Count:"); - result.ScratchCount = GetToEOL(); - ScanPast("Scratch Total:"); - result.ScratchTotal = GetToEOL(); - ScanPast("Sum of All Defects:"); - result.SumOfDefects = GetToEOL(); - ScanPast("Haze Region:"); - result.HazeRegion = GetToEOL(); - ScanPast("Haze Average:"); - result.HazeAverage = GetToEOL(); - ScanPast("Haze Peak:"); - result.HazePeak = GetToEOL(); - ScanPast("Laser:"); - result.Laser = GetBefore("Gain:"); - result.Gain = GetBefore("Diameter:"); - result.Diameter = GetToEOL(); - ScanPast("Thresh:"); - result.Thresh = GetBefore("Exclusion:"); - result.Exclusion = GetToEOL(); - ScanPast("Haze Rng:"); - result.HazeRng = GetBefore("Thruput:"); - result.Thruput = GetToEOL(); - ScanPast("Recipe ID:"); - result.Recipe = GetToEOL(); - result.UniqueId = string.Format("{0}_{1}", headerFile.UniqueId, result.Slot.Replace("*", string.Empty).TrimStart('0')); - return result; - } - - private Tuple> Parse(ILogic logic, ConfigData configData, List fileInfoCollection) - { - Tuple> result; - object item; - string pageText; - string pagePDFFile; - string pageTextFile; - List sourceFiles = new List(); - List missingSlots = new List(); - List dataFiles = new List(); - Dictionary pages = new Dictionary(); - string sourcePath = Path.GetDirectoryName(logic.Logistics.ReportFullPath); - Dictionary> slots = new Dictionary>(); - string sourceFileNamePdf = ConvertSourceFileToPdf(configData, logic.Logistics.ReportFullPath); - sourceFiles.Add(sourceFileNamePdf); - string sourceFileNameNoExt = Path.GetFileNameWithoutExtension(logic.Logistics.ReportFullPath); - ////PdfSharp open pdf - //using (PdfSharp.Pdf.PdfDocument sourceDocument = PdfSharp.Pdf.IO.PdfReader.Open(sourceFileNamePdf, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import)) - //{ - // for (int idxPage = 0; idxPage < sourceDocument.PageCount; idxPage++) - // { - // // split the pdf into seperate pages. Odd pages are wafer image, even are wafer summary. Last page is Lot Summary. - // _Log.Debug($"****ParseData - Splitting page: {idxPage}, sourceDocument: {sourceDocument.FullPath}, sourcePathFileNoExt: {sourcePathFileNoExt}"); - // //SplitPage(sourceDocument, sourcePathFileNoExt, idxPage); - // pageNum = idxPage + 1; - // pageFile = string.Format("{0}_{1}.pdf", sourcePathFileNoExt, pageNum); - // _Log.Debug($"****SplitPage - Page {pageNum} Source file: {sourceDocument.FullPath}"); - // _Log.Debug($"****SplitPage - Page {pageNum} Output file: {pageFile}"); - // //PdfSharp Create new document - // PdfSharp.Pdf.PdfDocument outputDocument = new PdfSharp.Pdf.PdfDocument { Version = sourceDocument.Version }; - // outputDocument.Info.Title = string.Format("Page {0} of {1}", pageNum, sourceDocument.Info.Title); - // outputDocument.Info.Creator = sourceDocument.Info.Creator; - // outputDocument.AddPage(sourceDocument.Pages[idxPage]); - // outputDocument.Pages[0].CropBox = new PdfSharp.Pdf.PdfRectangle(new PdfSharp.Drawing.XRect(0, 100, 700, 700)); - // outputDocument.Save(pageFile); - // } - // sourceDocumentPageCount = sourceDocument.PageCount; - // sourceDocument.Close(); - //} - java.io.File file = new java.io.File(sourceFileNamePdf); - org.apache.pdfbox.util.Splitter splitter = new org.apache.pdfbox.util.Splitter(); - org.apache.pdfbox.pdmodel.PDDocument pdDocument = org.apache.pdfbox.pdmodel.PDDocument.load(file); - java.util.List list = splitter.split(pdDocument); - java.util.ListIterator iterator = list.listIterator(); - org.apache.pdfbox.util.PDFTextStripper dataStripper = new org.apache.pdfbox.util.PDFTextStripper(); - for (short i = 1; i < short.MaxValue; i++) - { - if (!iterator.hasNext()) - break; - item = iterator.next(); - pagePDFFile = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", i, ".pdf"); - pageTextFile = Path.ChangeExtension(pagePDFFile, ".txt"); - if (File.Exists(pageTextFile)) - { - pageText = File.ReadAllText(pageTextFile); - sourceFiles.Add(pageTextFile); - if (!(item is org.apache.pdfbox.pdmodel.PDDocument pd)) - continue; - pd.close(); - } - else if (File.Exists(pagePDFFile)) - { - org.apache.pdfbox.pdmodel.PDDocument document = org.apache.pdfbox.pdmodel.PDDocument.load(pagePDFFile); - pageText = dataStripper.getText(document); - document.close(); - sourceFiles.Add(pagePDFFile); - if (!(item is org.apache.pdfbox.pdmodel.PDDocument pd)) - continue; - pd.close(); - } - else - { - if (!(item is org.apache.pdfbox.pdmodel.PDDocument pd)) - continue; - pageText = dataStripper.getText(pd); - pd.save(pagePDFFile); - sourceFiles.Add(pagePDFFile); - pd.close(); - File.WriteAllText(pageTextFile, pageText); - sourceFiles.Add(pageTextFile); - } - pages.Add(pagePDFFile, pageText); - } - pdDocument.close(); - // parse lot summary - _Log.Debug($"****ParseData - Parsing lot summary"); - List> pageMapping = new List>(); - string headerFileName = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", pages.Count, ".pdf"); - HeaderFile headerFile = ParseLotSummary(logic, headerFileName, pages, slots); - foreach (KeyValuePair keyValuePair in pages) - { - if (keyValuePair.Key == headerFileName) - continue; - if (string.IsNullOrEmpty(keyValuePair.Value.Trim())) - { - pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); - continue; - } - if (!pages.ContainsKey(keyValuePair.Key)) - throw new Exception(); - DataFile dataFile = ParseWaferSummary(headerFile, keyValuePair.Key, pages); - if (string.IsNullOrEmpty(dataFile.Recipe) || dataFile.Recipe != headerFile.Recipe) - { - missingSlots.Add(keyValuePair.Key); - pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); - continue; - } - if (!slots.ContainsKey(dataFile.Slot)) - { - missingSlots.Add(keyValuePair.Key); - pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); - continue; - } - pageMapping.Add(new Tuple(keyValuePair.Key, string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", dataFile.Slot.Replace('*', 's'), "_data.pdf"))); - slots[dataFile.Slot].Add(dataFile); - } - string checkFileName = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_data.pdf"); - if (!File.Exists(checkFileName)) - { - File.Move(headerFileName, checkFileName); - sourceFiles.Remove(headerFileName); - sourceFiles.Add(checkFileName); - } - checkFileName = string.Empty; - for (int i = pageMapping.Count - 1; i > -1; i--) - { - if (!string.IsNullOrEmpty(pageMapping[i].Item2)) - { - checkFileName = pageMapping[i].Item2; - if (!File.Exists(checkFileName)) - { - File.Move(pageMapping[i].Item1, checkFileName); - sourceFiles.Remove(pageMapping[i].Item1); - sourceFiles.Add(checkFileName); - } - } - else if (!string.IsNullOrEmpty(checkFileName)) - { - //if (i == 0 || !string.IsNullOrEmpty(pageMapping[i - 1].Item2)) - //{ - checkFileName = checkFileName.Replace("_data.pdf", "_image.pdf"); - if (!File.Exists(checkFileName)) - { - File.Move(pageMapping[i].Item1, checkFileName); - sourceFiles.Remove(pageMapping[i].Item1); - sourceFiles.Add(checkFileName); - } - //} - checkFileName = string.Empty; - } - } - foreach (KeyValuePair> keyValuePair in slots) - { - if (!keyValuePair.Value.Any() || keyValuePair.Value[0] is null) - missingSlots.Add(string.Concat("Slot ", keyValuePair.Key, ") is missing.")); - else - { - foreach (DataFile data in keyValuePair.Value) - dataFiles.Add(data); - } - } - if (missingSlots.Any()) - { - string missingSlotsFile = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_MissingSlots.txt"); - File.WriteAllLines(missingSlotsFile, missingSlots); - sourceFiles.Add(missingSlotsFile); - } - headerFile.Date = DateTime.Parse(headerFile.Date).ToString(); - //Equipment data is wrong!!! - headerFile.Date = DateTime.Now.ToString(); - //Equipment data is wrong!!! - //for (int i = 0; i < dataFiles.Count; i++) - // dataFiles[i].Date = DateTime.Parse(dataFiles[i].Date).ToString(); - foreach (string sourceFile in sourceFiles) - fileInfoCollection.Add(new FileInfo(sourceFile)); - fileInfoCollection.Add(new FileInfo(logic.Logistics.ReportFullPath)); - result = new Tuple>(headerFile, dataFiles); - return result; - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/Si/Transport.Input.cs b/Adaptation/Helpers/Si/Transport.Input.cs deleted file mode 100644 index 05d0ee9..0000000 --- a/Adaptation/Helpers/Si/Transport.Input.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Adaptation.Si -{ - - internal partial class Transport - { - - public class Input - { - public string Sequence { get; set; } - public string Area { get; set; } - public string EquipmentType { get; set; } - public string MesEntity { get; set; } - public string MID { get; set; } - public string Recipe { get; set; } - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/Si/Transport.Item.cs b/Adaptation/Helpers/Si/Transport.Item.cs deleted file mode 100644 index 3b0d0ff..0000000 --- a/Adaptation/Helpers/Si/Transport.Item.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Adaptation.Si -{ - - internal partial class Transport - { - - public class Item - { - public string Name { get; set; } //WaferLot //UniqueID - public string Type { get; set; } //SatelliteGroup //Sort - public string Number { get; set; } //PocketNumber //Slot - public string Qty { get; set; } //1 - public string CarrierName { get; set; } //PROCESS_GROUP - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/Si/Transport.Job.cs b/Adaptation/Helpers/Si/Transport.Job.cs deleted file mode 100644 index e83fa2c..0000000 --- a/Adaptation/Helpers/Si/Transport.Job.cs +++ /dev/null @@ -1,198 +0,0 @@ -using Adaptation.Helpers; -using System; -using System.Collections.Generic; -using System.Data.SqlClient; -using System.Globalization; -using System.IO; -using System.Text; -using System.Text.Json; - -namespace Adaptation.Si -{ - - internal partial class Transport - { - - public class Job - { - - public string AutomationMode { get; } - public string BasicType { get; } - public string Equipment { get; } - public string JobName { get; } - public string LotName { get; } - public string PackageName { get; } - public string ProcessSpecName { get; } - public string ProcessType { get; } - public string ProductName { get; } - public string Qty { get; } - public string RecipeName { get; } - public string StateModel { get; } - // - public bool IsAreaSi { get; } - public DateTime DateTime { get; } - public List Items { get; } - - public Job(ConfigData configData, string mid) - { - Items = new List(); - if (mid[0] != '{' || mid[mid.Length - 1] != '}' || !mid.Contains("\"Si\"")) - IsAreaSi = false; - else - { - string[] segments; - const string hypen = "-"; - Input input = JsonSerializer.Deserialize(mid); - IsAreaSi = input.Area == "Si"; - if (!long.TryParse(input.Sequence, out long sequence)) - DateTime = DateTime.Now; - else - DateTime = new DateTime(sequence); - if (!string.IsNullOrEmpty(input.MID) && input.MID.Length > 9 && input.MID[2] == hypen[0] && input.MID[9] == hypen[0]) - segments = input.MID.Split(hypen[0]); - else - segments = new string[] { hypen, hypen, hypen }; - // - AutomationMode = string.Concat(DateTime.Ticks, ".", input.MesEntity); - if (segments[1] == hypen) - BasicType = hypen; - else - BasicType = GetBasicType(configData, hypen, segments[1]); - Equipment = input.MesEntity; - JobName = DateTime.Ticks.ToString(); - if (segments[0] == hypen) - LotName = input.MID; - else - LotName = segments[1]; - PackageName = hypen; //WAFER_ID WaferLot - ProcessSpecName = hypen; //WAFER_POS PocketNumber - ProcessType = segments[0]; - ProductName = segments[2].Split('.')[0]; - Qty = "1"; - RecipeName = input.Recipe; - StateModel = input.EquipmentType; - Items.Add(new Item { Name = "0", Type = "NA", Number = (0 + 1).ToString(), Qty = "1", CarrierName = hypen }); - MoveOldFiles(configData); - } - } - - public string GetBasicType(ConfigData configData, string hypen, string rds) - { - string result; - // string json; - // string loadLock; - // JsonElement jsonElement; - // DateTime dateTime = DateTime.Now; - // string rdsFile = Path.Combine(configData.OIContextDataResultsPath, $"{DateTime.Ticks}.rds"); - // string jsonFile = Path.Combine(configData.OIContextDataResultsPath, $"{DateTime.Ticks}.json"); - // File.WriteAllText(Path.Combine(configData.OIContextDataSearchPath, $"{DateTime.Ticks}.rds"), rds); - // CultureInfo cultureInfo = new CultureInfo("en-US"); - // Calendar calendar = cultureInfo.Calendar; - // string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - // string yearWeek = string.Concat(dateTime.ToString("yyyy"), "___Week_", weekOfYear); - // string resultsDirectory = Path.Combine(configData.OIContextDataResultsPath, yearWeek); - // if (!Directory.Exists(resultsDirectory)) - // Directory.CreateDirectory(resultsDirectory); - // long breakAfter = dateTime.AddSeconds(60).Ticks; - // for (int i = 0; i < short.MaxValue; i++) - // { - // if (File.Exists(rdsFile) && File.Exists(jsonFile)) - // { - // loadLock = string.Empty; - // json = File.ReadAllText(jsonFile); - // jsonElement = JsonSerializer.Deserialize(json); - // if (jsonElement.ValueKind == JsonValueKind.Object) - // { - // foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - // { - // if (jsonProperty.Name != "LoadLock") - // continue; - // loadLock = jsonProperty.Value.ToString(); - // } - // } - // if (string.IsNullOrEmpty(loadLock)) - // File.Move(jsonFile, Path.Combine(configData.OIContextDataResultsPath, $"{DateTime.Ticks}.err")); - // else - // { - // File.Move(rdsFile, Path.Combine(configData.OIContextDataResultsPath, yearWeek, $"{DateTime.Ticks}.rds")); - // File.Move(jsonFile, Path.Combine(configData.OIContextDataResultsPath, yearWeek, $"{DateTime.Ticks}.json")); - // result = loadLock; - // } - // break; - // } - // if (DateTime.Now.Ticks > breakAfter) - // break; - // } - object scalar = null; - StringBuilder sql = new StringBuilder(); - sql.Append(" SELECT "). - Append(" CASE "). - Append(" WHEN LOAD_LOCK_SIDE = 'L' THEN 'Left - ' "). - Append(" WHEN LOAD_LOCK_SIDE = 'R' THEN 'Right - ' "). - Append(" ELSE LOAD_LOCK_SIDE "). - Append(" END + REACTOR_TYPE AS LOAD_LOCK "). - Append(" FROM [LSL2SQL].[dbo].[REACT_RUN] "). - Append($" WHERE RDS_NO = '{rds}' "); - //Append(" AND LOAD_SIG != '' "); - try - { - using (SqlConnection sqlConnection = new SqlConnection(configData.ConnectionStringLSL2SQL)) - { - sqlConnection.Open(); - using (SqlCommand sqlCommand = new SqlCommand(sql.ToString(), sqlConnection)) - scalar = sqlCommand.ExecuteScalar(); - sqlConnection.Close(); - } - } - catch (Exception) - { - } - if (scalar is null) - result = hypen; - else - result = scalar.ToString(); - return result; - } - - private void MoveOldFiles(ConfigData configData) - { - string yearWeek; - string[] oldFiles; - FileInfo fileInfo; - string weekOfYear; - string moveDirectory; - DateTime daysOld = DateTime.Now.AddDays(-2); - CultureInfo cultureInfo = new CultureInfo("en-US"); - Calendar calendar = cultureInfo.Calendar; - string[] directories = new string[] { configData.OIContextDataSearchPath, configData.OIContextDataPendingPath, configData.OIContextDataResultsPath }; - foreach (string directory in directories) - { - try - { - oldFiles = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly); - foreach (string oldFile in oldFiles) - { - fileInfo = new FileInfo(oldFile); - if (!fileInfo.Exists || fileInfo.LastWriteTime > daysOld) - continue; - weekOfYear = calendar.GetWeekOfYear(fileInfo.LastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - yearWeek = string.Concat(fileInfo.LastWriteTime.ToString("yyyy"), "___Week_", weekOfYear); - moveDirectory = Path.Combine(fileInfo.DirectoryName, yearWeek); - if (!Directory.Exists(moveDirectory)) - Directory.CreateDirectory(moveDirectory); - try - { File.Move(oldFile, Path.Combine(moveDirectory, fileInfo.Name)); } - catch (Exception) { } - } - } - catch (Exception) - { - } - } - } - - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/Si/Transport.Logistics.cs b/Adaptation/Helpers/Si/Transport.Logistics.cs deleted file mode 100644 index 55311c4..0000000 --- a/Adaptation/Helpers/Si/Transport.Logistics.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace Adaptation.Si -{ - - internal partial class Transport - { - /// - /// EDA-Configurator.pdf - /// CDS Namespace Reply Variables - /// - private class Logistics - { - - /// - /// Basic Type - /// - public string BASIC_TYPE { get; set; } - - /// - /// Text for additional infromation - /// - public string INFO { get; set; } - - /// - /// Unique assignment of lot processing to the basic cell (Dresden) - /// - public string JOBID { get; set; } - - /// - /// Equipment name used in MES - /// - public string MES_ENTITY { get; set; } - - /// - /// Lot number, name for a lot - /// - public string MID { get; set; } - - /// - /// Recipe (Process Program ID) - /// - public string PPID { get; set; } - - /// - /// Process group (e.g. C5PR) - /// - public string PROCESS_GROUP { get; set; } - - /// - /// Product name - /// - public string PRODUCT { get; set; } - - /// - /// Total number of wafers in lot - /// - public string TOTAL_NUMBER_OF_WAFERS { get; set; } - - /// - /// Equipment sequence number - /// - public string SEQUENCE { get; set; } - - /// - /// Unique wafer number (barcode, OCR) - /// - public string WAFER_ID { get; set; } - - /// - /// Wafer position in a tube (Furnace) - /// - public string WAFER_POS { get; set; } - - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Helpers/Si/Transport.cs b/Adaptation/Helpers/Si/Transport.cs deleted file mode 100644 index 254229e..0000000 --- a/Adaptation/Helpers/Si/Transport.cs +++ /dev/null @@ -1,218 +0,0 @@ -using Adaptation.Helpers; -using Infineon.Yoda; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Threading; - -namespace Adaptation.Si -{ - - internal partial class Transport - { - - private static object _IfxTransport; - private static ConfigData _ConfigData; - - internal static void Initialize(ConfigData configData) - { - _IfxTransport = null; - _ConfigData = configData; - } - - internal static List Setup(bool useSleep, bool setIfxTransport) - { - List results = new List(); - if (useSleep) - { - for (int i = 1; i < 4; i++) - Thread.Sleep(500); - } - if (setIfxTransport) - { - results.Add(string.Concat("IfxTransport Subject: ", _ConfigData.IfxSubject)); - IfxDoc ifxDoc = new IfxDoc(); - ifxDoc.Add(IfxConst.SUBJECT_PREFIX, _ConfigData.IfxSubjectPrefix); - ifxDoc.Add(IfxConst.IFX_CHANNEL, _ConfigData.IfxChannel); - ifxDoc.Add(IfxConst.IFX_CONFIGURATION_LOCATION, _ConfigData.IfxConfigurationLocation); - ifxDoc.Add(IfxConst.IFX_CONFIGURATION_LOCATION_LOCAL_COPY, _ConfigData.IfxConfigurationLocationLocalCopy); - results.Add(string.Concat("IfxTransport Config: ", ifxDoc)); - _IfxTransport = new IfxTransport(); - IfxTransport ifxTransport = (IfxTransport)_IfxTransport; - ifxTransport.Create(ifxDoc); - if (useSleep) - { - for (int i = 1; i < 10; i++) - Thread.Sleep(500); - } - results.Add(string.Concat("IfxTransport Current Daemon: ", ifxTransport.CurrentDaemon)); - results.Add(string.Concat("IfxTransport Current Network: ", ifxTransport.CurrentNetwork)); - results.Add(string.Concat("IfxTransport Current Service: ", ifxTransport.CurrentService)); - results.Add(string.Concat("IfxTransport Current PoolName: ", ifxTransport.CurrentPoolName)); - } - for (int i = 1; i < 3; i++) - Thread.Sleep(500); - if (_IfxTransport is null) - throw new Exception(); - else - { - IfxTransport ifxTransport = (IfxTransport)_IfxTransport; - string[] subjects = _ConfigData.IfxSubject.Split('|'); - foreach (string subject in subjects) - ifxTransport.Subscribe(string.Concat(_ConfigData.IfxSubjectPrefix, ".", subject)); - ifxTransport.ReliableMessage += MainTransport_ReliableMessage; - for (int i = 1; i < 3; i++) - Thread.Sleep(500); - } - return results; - } - - private static void MoveSourceFiles(string[] sourceFiles, string pdsfFileLogistics, Calendar calendar) - { - DateTime dateTime; - string weekOfYear; - string checkDirectory; - foreach (string pdsfFile in sourceFiles) - { - if (pdsfFile == pdsfFileLogistics) - continue; - dateTime = new FileInfo(pdsfFile).LastWriteTime; - weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - checkDirectory = string.Concat(Path.GetDirectoryName(pdsfFile), @"\_ Logistics Archive\", dateTime.ToString("yyyy"), "_Week_", weekOfYear); - if (!Directory.Exists(checkDirectory)) - Directory.CreateDirectory(checkDirectory); - try - { File.Move(pdsfFile, string.Concat(checkDirectory, @"\", Path.GetFileName(pdsfFile))); } - catch (Exception) { } - } - } - - private static string GetJobsMID(IfxDoc envelopeDocument) - { - string mid; - if (envelopeDocument is null || !envelopeDocument.FieldExists("LotName")) - mid = string.Empty; - else - mid = envelopeDocument.GetFieldByName("LotName").ToString(); - return mid; - } - - private static IfxDoc GetJobsReply(Job job) - { - IfxDoc result = new IfxDoc(); - IfxDoc itemDoc; - IfxDoc jobDoc = new IfxDoc(); - IfxDoc lotDoc = new IfxDoc(); - IfxDoc recipeDoc = new IfxDoc(); - List itemDocs = new List(); - jobDoc.Add("AutomationMode", job.AutomationMode); - jobDoc.Add("CreationTimestamp", job.DateTime); - jobDoc.Add("CreationUser", "-"); - jobDoc.Add("CurrentState", true); - jobDoc.Add("Equipment", job.Equipment); - jobDoc.Add("JobName", job.JobName); - jobDoc.Add("LastUpdateTimestamp", job.DateTime); - jobDoc.Add("LastUpdateUser", "-"); - jobDoc.Add("ProcessType", job.ProcessType); - jobDoc.Add("StateModel", job.StateModel); - jobDoc.Add("Status", "-"); - lotDoc.Add("BasicType", job.BasicType); - lotDoc.Add("IsActive", true); - lotDoc.Add("LotName", job.LotName); - lotDoc.Add("LotState", "-"); - lotDoc.Add("PackageName", job.PackageName); - lotDoc.Add("ProcessSpecName", job.ProcessSpecName); - lotDoc.Add("ProductName", job.ProductName); - lotDoc.Add("Qty", job.Qty); - lotDoc.Add("Qty2", "-"); - recipeDoc.Add("RecipeName", job.RecipeName); - lotDoc.Add("SpecName", "-"); - foreach (Item item in job.Items) - { - itemDoc = new IfxDoc(); - itemDoc.Add("Name", item.Name); - itemDoc.Add("Type", item.Type); - itemDoc.Add("Number", item.Number); - itemDoc.Add("Qty", item.Qty); - itemDoc.Add("CarrierName", item.CarrierName); - itemDocs.Add(itemDoc); - } - jobDoc.Add("Recipe", recipeDoc); - lotDoc.Add("Items", itemDocs.ToArray()); - jobDoc.Add("Lots", new IfxDoc[] { lotDoc }); - result.Add("FAJobs", new IfxDoc[] { jobDoc }); - result.Add("IFX_ECD", "0"); - result.Add("IFX_ETX", 0); - return result; - } - - private static void MainTransport_ReliableMessage(string subject, string replySubject, IfxEnvelope ifxEnvelope) - { - try - { - string mid = string.Empty; - string[] sourceFiles = null; - DateTime dateTime = DateTime.Now; - string pdsfFileLogistics = string.Empty; - IfxDoc envelopeDocument = ifxEnvelope.ExtractDocument(); - CultureInfo cultureInfo = new CultureInfo("en-US"); - Calendar calendar = cultureInfo.Calendar; - string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - string weekOfYearSegment = string.Concat(@"\", dateTime.ToString("yyyy"), "_Week_", weekOfYear, @"\", dateTime.ToString("yyyy-MM-dd")); - if (!string.IsNullOrEmpty(_ConfigData.FileConnectorConfiguration.SourceFileLocation)) - { - string directory = string.Concat(_ConfigData.FileConnectorConfiguration.SourceFileLocation, weekOfYearSegment); - if (!Directory.Exists(directory)) - Directory.CreateDirectory(directory); - string fileName = string.Concat(directory, @"\", subject.Replace(".", "~"), " - ", DateTime.Now.Ticks, ".xml"); - try - { envelopeDocument.SaveAsXml(fileName); } - catch (Exception) { } - } - if (!subject.EndsWith("GETJOBS")) - throw new Exception(); - mid = GetJobsMID(envelopeDocument); - Job job = new Job(_ConfigData, mid); - if (job.IsAreaSi) - { - IfxDoc sendReply = GetJobsReply(job); - ifxEnvelope.Transport.SendReply(ifxEnvelope, sendReply); - if (!string.IsNullOrEmpty(_ConfigData.FileConnectorConfiguration.TargetFileLocation)) - { - string directory = string.Concat(_ConfigData.FileConnectorConfiguration.TargetFileLocation, weekOfYearSegment); - if (!Directory.Exists(directory)) - Directory.CreateDirectory(directory); - string fileName = string.Concat(directory, @"\", subject.Replace(".", "~"), " - ", DateTime.Now.Ticks, ".xml"); - try - { sendReply.SaveAsXml(fileName); } - catch (Exception) { } - } - } - if (!(sourceFiles is null) && !string.IsNullOrEmpty(pdsfFileLogistics)) - MoveSourceFiles(sourceFiles, pdsfFileLogistics, calendar); - } - catch (Exception exception) - { - try - { - Eaf.Core.Smtp.ISmtp smtp = Eaf.Core.Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); - Eaf.Core.Smtp.EmailMessage emailMessage = new Eaf.Core.Smtp.EmailMessage(string.Concat("Exception:", _ConfigData.EquipmentElementName, ":MainTransport_ReliableMessage"), string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace), Eaf.Core.Smtp.MailPriority.High); - smtp.Send(emailMessage); - } - catch (Exception) { } - string directory = _ConfigData.FileConnectorConfiguration.ErrorTargetFileLocation; - if (!string.IsNullOrEmpty(directory) && Directory.Exists(directory)) - { - string fileName = string.Concat(directory, @"\", subject.Replace(".", "~"), " - ", DateTime.Now.Ticks, ".txt"); - try - { File.WriteAllLines(fileName, new string[] { exception.Message, string.Empty, string.Empty, exception.StackTrace }); } - catch (Exception) { } - } - } - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs b/Adaptation/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs index b6cb4b8..8cf469f 100644 --- a/Adaptation/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs +++ b/Adaptation/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs @@ -1,13 +1,17 @@ -namespace Adaptation.Ifx.Eaf.Common.Configuration -{ - [System.Runtime.Serialization.DataContractAttribute] - public class ConnectionSetting - { - public ConnectionSetting(string name, string value) { } +namespace Adaptation.Ifx.Eaf.Common.Configuration; + +[System.Runtime.Serialization.DataContractAttribute] +public class ConnectionSetting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public ConnectionSetting(string name, string value) { } + + [System.Runtime.Serialization.DataMemberAttribute] + public string Name { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string Value { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string Name { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string Value { get; set; } - } } \ No newline at end of file diff --git a/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/File.cs b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/File.cs index 4726692..1e5d6eb 100644 --- a/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/File.cs +++ b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/File.cs @@ -1,19 +1,23 @@ using System; using System.Collections.Generic; -namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component +namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component; + +public class File { - public class File - { - public File(string filePath) { throw new NotImplementedException(); } - public File(string filePath, DateTime timeFileFound) { throw new NotImplementedException(); } - public string Path { get; } - public DateTime TimeFound { get; } - public bool IsErrorFile { get; } - public Dictionary ContentParameters { get; } +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public File(string filePath) => throw new NotImplementedException(); + public File(string filePath, DateTime timeFileFound) => throw new NotImplementedException(); + + public string Path { get; } + public DateTime TimeFound { get; } + public bool IsErrorFile { get; } + public Dictionary ContentParameters { get; } + + public File UpdateContentParameters(Dictionary contentParameters) => throw new NotImplementedException(); + public File UpdateParsingStatus(bool isErrorFile) => throw new NotImplementedException(); - public File UpdateContentParameters(Dictionary contentParameters) { throw new NotImplementedException(); } - public File UpdateParsingStatus(bool isErrorFile) { throw new NotImplementedException(); } - } } \ No newline at end of file diff --git a/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs index 561725e..5ab689e 100644 --- a/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs +++ b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs @@ -2,34 +2,39 @@ using System; using System.Collections.Generic; -namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component +namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component; + +public class FilePathGenerator { - public class FilePathGenerator - { - public const char PLACEHOLDER_IDENTIFIER = '%'; - public const char PLACEHOLDER_SEPARATOR = ':'; - public const string PLACEHOLDER_NOT_AVAILABLE = "NA"; - public const string PLACEHOLDER_ORIGINAL_FILE_NAME = "OriginalFileName"; - public const string PLACEHOLDER_ORIGINAL_FILE_EXTENSION = "OriginalFileExtension"; - public const string PLACEHOLDER_DATE_TIME = "DateTime"; - public const string PLACEHOLDER_SUB_FOLDER = "SubFolder"; - public const string PLACEHOLDER_CELL_NAME = "CellName"; - public FilePathGenerator(FileConnectorConfiguration config, Dictionary customPattern = null) { throw new NotImplementedException(); } - public FilePathGenerator(FileConnectorConfiguration config, File file, bool isErrorFile = false, Dictionary customPattern = null) { throw new NotImplementedException(); } - public FilePathGenerator(FileConnectorConfiguration config, string sourceFilePath, bool isErrorFile = false, Dictionary customPattern = null) { throw new NotImplementedException(); } +#pragma warning disable CA1822 +#pragma warning disable CA2254 +#pragma warning disable IDE0060 - protected string SubFolderPath { get; } - protected FileConnectorConfiguration Configuration { get; } - protected File File { get; } - protected bool IsErrorFile { get; } - protected string DefaultPlaceHolderValue { get; } + public const char PLACEHOLDER_IDENTIFIER = '%'; + public const char PLACEHOLDER_SEPARATOR = ':'; + public const string PLACEHOLDER_NOT_AVAILABLE = "NA"; + public const string PLACEHOLDER_ORIGINAL_FILE_NAME = "OriginalFileName"; + public const string PLACEHOLDER_ORIGINAL_FILE_EXTENSION = "OriginalFileExtension"; + public const string PLACEHOLDER_DATE_TIME = "DateTime"; + public const string PLACEHOLDER_SUB_FOLDER = "SubFolder"; + public const string PLACEHOLDER_CELL_NAME = "CellName"; + + public FilePathGenerator(FileConnectorConfiguration config, Dictionary customPattern = null) => throw new NotImplementedException(); + public FilePathGenerator(FileConnectorConfiguration config, File file, bool isErrorFile = false, Dictionary customPattern = null) => throw new NotImplementedException(); + public FilePathGenerator(FileConnectorConfiguration config, string sourceFilePath, bool isErrorFile = false, Dictionary customPattern = null) => throw new NotImplementedException(); + + protected string SubFolderPath { get; } + protected FileConnectorConfiguration Configuration { get; } + protected File File { get; } + protected bool IsErrorFile { get; } + protected string DefaultPlaceHolderValue { get; } + + public string GetFullTargetPath() => throw new NotImplementedException(); + public virtual string GetTargetFileName() => throw new NotImplementedException(); + public string GetTargetFolder(bool throwExceptionIfNotExist = true) => throw new NotImplementedException(); + protected virtual string GetSubFolder(string folderPattern, string subFolderPath) => throw new NotImplementedException(); + protected virtual string PrepareFolderPath(string targetFolderPath, string subFolderPath) => throw new NotImplementedException(); + protected string ReplacePlaceholder(string inputPath) => throw new NotImplementedException(); - public string GetFullTargetPath() { throw new NotImplementedException(); } - public virtual string GetTargetFileName() { throw new NotImplementedException(); } - public string GetTargetFolder(bool throwExceptionIfNotExist = true) { throw new NotImplementedException(); } - protected virtual string GetSubFolder(string folderPattern, string subFolderPath) { throw new NotImplementedException(); } - protected virtual string PrepareFolderPath(string targetFolderPath, string subFolderPath) { throw new NotImplementedException(); } - protected string ReplacePlaceholder(string inputPath) { throw new NotImplementedException(); } - } } \ No newline at end of file diff --git a/Adaptation/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs index 5eafd1c..4e4aa83 100644 --- a/Adaptation/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs +++ b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs @@ -2,134 +2,133 @@ using System; using System.Collections.Generic; -namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration +namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; + +[System.Runtime.Serialization.DataContractAttribute] +public class FileConnectorConfiguration { - [System.Runtime.Serialization.DataContractAttribute] - public class FileConnectorConfiguration + public const ulong IDLE_EVENT_WAIT_TIME_DEFAULT = 360; + public const ulong FILE_HANDLE_TIMEOUT_DEFAULT = 15; + + [System.Runtime.Serialization.DataMemberAttribute] + public virtual bool? TriggerOnChanged { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual long? PostProcessingRetries { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual bool? CopySourceFolderStructure { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public IfPostProcessingFailsEnum? IfPostProcessingFailsAction { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string AlternateTargetFolder { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public long? FileHandleTimeout { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public bool? DeleteEmptySourceSubFolders { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public long? IdleEventWaitTimeInSeconds { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string FileAgeThreshold { get; set; } + public bool? FolderAgeCheckIndividualSubFolders { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual ZipModeEnum? ZipMode { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public FileAgeFilterEnum? FileAgeFilterMode { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string ZipTargetFileName { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string ZipErrorTargetFileName { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public long? ZipFileSubFolderLevel { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string DefaultPlaceHolderValue { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public bool? UseZip64Mode { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public List ConnectionSettings { get; set; } + public string SourceDirectoryCloaking { get; set; } + public string FolderAgeThreshold { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual long? FileScanningIntervalInSeconds { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual bool? TriggerOnCreated { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual long? ZipFileTime { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string SourceFileLocation { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string SourceFileFilter { get; set; } + public List SourceFileFilters { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual bool? IncludeSubDirectories { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual FileScanningOptionEnum? FileScanningOption { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string TargetFileLocation { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string ErrorTargetFileLocation { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string TargetFileName { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual long? FileHandleWaitTime { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public IfFileExistEnum? IfFileExistAction { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public long? ConnectionRetryInterval { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public PreProcessingModeEnum? PreProcessingMode { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public PostProcessingModeEnum? PostProcessingMode { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public PostProcessingModeEnum? ErrorPostProcessingMode { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public virtual long? ZipFileAmount { get; set; } + [System.Runtime.Serialization.DataMemberAttribute] + public string ErrorTargetFileName { get; set; } + + public void Initialize() => throw new NotImplementedException(); + + public enum PostProcessingModeEnum { - public const ulong IDLE_EVENT_WAIT_TIME_DEFAULT = 360; - public const ulong FILE_HANDLE_TIMEOUT_DEFAULT = 15; - - [System.Runtime.Serialization.DataMemberAttribute] - public virtual bool? TriggerOnChanged { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? PostProcessingRetries { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual bool? CopySourceFolderStructure { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public IfPostProcessingFailsEnum? IfPostProcessingFailsAction { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string AlternateTargetFolder { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public long? FileHandleTimeout { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public bool? DeleteEmptySourceSubFolders { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public long? IdleEventWaitTimeInSeconds { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string FileAgeThreshold { get; set; } - public bool? FolderAgeCheckIndividualSubFolders { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual ZipModeEnum? ZipMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public FileAgeFilterEnum? FileAgeFilterMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string ZipTargetFileName { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string ZipErrorTargetFileName { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public long? ZipFileSubFolderLevel { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string DefaultPlaceHolderValue { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public bool? UseZip64Mode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public List ConnectionSettings { get; set; } - public string SourceDirectoryCloaking { get; set; } - public string FolderAgeThreshold { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? FileScanningIntervalInSeconds { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual bool? TriggerOnCreated { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? ZipFileTime { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string SourceFileLocation { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string SourceFileFilter { get; set; } - public List SourceFileFilters { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual bool? IncludeSubDirectories { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual FileScanningOptionEnum? FileScanningOption { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string TargetFileLocation { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string ErrorTargetFileLocation { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string TargetFileName { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? FileHandleWaitTime { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public IfFileExistEnum? IfFileExistAction { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public long? ConnectionRetryInterval { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public PreProcessingModeEnum? PreProcessingMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public PostProcessingModeEnum? PostProcessingMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public PostProcessingModeEnum? ErrorPostProcessingMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? ZipFileAmount { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string ErrorTargetFileName { get; set; } - - public void Initialize() { throw new NotImplementedException(); } - - public enum PostProcessingModeEnum - { - None = 0, - Move = 1, - Copy = 2, - Rename = 3, - Zip = 4, - Delete = 5, - MoveFolder = 6, - CopyFolder = 7, - DeleteFolder = 8 - } - public enum PreProcessingModeEnum - { - None = 0, - Process = 1 - } - public enum IfFileExistEnum - { - Overwrite = 0, - LeaveFiles = 1, - Delete = 2 - } - public enum IfPostProcessingFailsEnum - { - LeaveFiles = 0, - Delete = 1 - } - public enum FileScanningOptionEnum - { - FileWatcher = 0, - TimeBased = 1 - } - public enum ZipModeEnum - { - ZipByAmountOrTime = 0, - ZipByFileName = 1, - ZipBySubFolderName = 2 - } - public enum FileAgeFilterEnum - { - IgnoreNewer = 0, - IgnoreOlder = 1 - } + None = 0, + Move = 1, + Copy = 2, + Rename = 3, + Zip = 4, + Delete = 5, + MoveFolder = 6, + CopyFolder = 7, + DeleteFolder = 8 + } + public enum PreProcessingModeEnum + { + None = 0, + Process = 1 + } + public enum IfFileExistEnum + { + Overwrite = 0, + LeaveFiles = 1, + Delete = 2 + } + public enum IfPostProcessingFailsEnum + { + LeaveFiles = 0, + Delete = 1 + } + public enum FileScanningOptionEnum + { + FileWatcher = 0, + TimeBased = 1 + } + public enum ZipModeEnum + { + ZipByAmountOrTime = 0, + ZipByFileName = 1, + ZipBySubFolderName = 2 + } + public enum FileAgeFilterEnum + { + IgnoreNewer = 0, + IgnoreOlder = 1 } } \ No newline at end of file diff --git a/Adaptation/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs b/Adaptation/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs index 55d81fd..9d9aa53 100644 --- a/Adaptation/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs +++ b/Adaptation/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs @@ -2,13 +2,18 @@ using System; using System.Collections.Generic; -namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.SelfDescription -{ - public class FileConnectorParameterTypeDefinitionProvider - { - public FileConnectorParameterTypeDefinitionProvider() { } +namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.SelfDescription; + +public class FileConnectorParameterTypeDefinitionProvider +{ + +#pragma warning disable CA1822 +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public FileConnectorParameterTypeDefinitionProvider() { } + + public IEnumerable GetAllParameterTypeDefinition() => null; + public ParameterTypeDefinition GetParameterTypeDefinition(string name) => null; - public IEnumerable GetAllParameterTypeDefinition() { return null; } - public ParameterTypeDefinition GetParameterTypeDefinition(string name) { return null; } - } } \ No newline at end of file diff --git a/Adaptation/MET08DDUPSFS6420.Tests.csproj b/Adaptation/MET08DDUPSFS6420.Tests.csproj index 1351f7a..9dd0272 100644 --- a/Adaptation/MET08DDUPSFS6420.Tests.csproj +++ b/Adaptation/MET08DDUPSFS6420.Tests.csproj @@ -11,7 +11,7 @@ trx - ../../../Trunk/MET08DDUPSFS6420/05_TestResults/TestResults + ../../../../MET08DDUPSFS6420/05_TestResults/TestResults true diff --git a/Adaptation/PeerGroup/GCL/Annotations/NotNullAttribute.cs b/Adaptation/PeerGroup/GCL/Annotations/NotNullAttribute.cs index c4e64f0..e32df4c 100644 --- a/Adaptation/PeerGroup/GCL/Annotations/NotNullAttribute.cs +++ b/Adaptation/PeerGroup/GCL/Annotations/NotNullAttribute.cs @@ -1,10 +1,9 @@ using System; -namespace Adaptation.PeerGroup.GCL.Annotations +namespace Adaptation.PeerGroup.GCL.Annotations; + +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.Delegate, AllowMultiple = false, Inherited = true)] +public sealed class NotNullAttribute : Attribute { - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.Delegate, AllowMultiple = false, Inherited = true)] - public sealed class NotNullAttribute : Attribute - { - public NotNullAttribute() { } - } + public NotNullAttribute() { } } \ No newline at end of file diff --git a/Adaptation/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs b/Adaptation/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs index 82138e2..af1ea65 100644 --- a/Adaptation/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs +++ b/Adaptation/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs @@ -1,8 +1,7 @@ -namespace Adaptation.PeerGroup.GCL.SecsDriver +namespace Adaptation.PeerGroup.GCL.SecsDriver; + +public enum HsmsConnectionMode { - public enum HsmsConnectionMode - { - Active = 0, - Passive = 1 - } + Active = 0, + Passive = 1 } \ No newline at end of file diff --git a/Adaptation/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs b/Adaptation/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs index b52c7a3..eecd8b7 100644 --- a/Adaptation/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs +++ b/Adaptation/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs @@ -1,8 +1,7 @@ -namespace Adaptation.PeerGroup.GCL.SecsDriver +namespace Adaptation.PeerGroup.GCL.SecsDriver; + +public enum HsmsSessionMode { - public enum HsmsSessionMode - { - MultiSession = 0, - SingleSession = 1 - } + MultiSession = 0, + SingleSession = 1 } \ No newline at end of file diff --git a/Adaptation/PeerGroup/GCL/SecsDriver/SecsTransportType.cs b/Adaptation/PeerGroup/GCL/SecsDriver/SecsTransportType.cs index 81181f0..5e68d64 100644 --- a/Adaptation/PeerGroup/GCL/SecsDriver/SecsTransportType.cs +++ b/Adaptation/PeerGroup/GCL/SecsDriver/SecsTransportType.cs @@ -1,8 +1,7 @@ -namespace Adaptation.PeerGroup.GCL.SecsDriver +namespace Adaptation.PeerGroup.GCL.SecsDriver; + +public enum SecsTransportType { - public enum SecsTransportType - { - HSMS = 0, - Serial = 1 - } + HSMS = 0, + Serial = 1 } \ No newline at end of file diff --git a/Adaptation/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs b/Adaptation/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs index 4511319..a5bd2c3 100644 --- a/Adaptation/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs +++ b/Adaptation/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs @@ -1,16 +1,15 @@ -namespace Adaptation.PeerGroup.GCL.SecsDriver +namespace Adaptation.PeerGroup.GCL.SecsDriver; + +public enum SerialBaudRate { - public enum SerialBaudRate - { - Baud9600 = 0, - Baud19200 = 1, - Baud4800 = 2, - Baud2400 = 3, - Baud1200 = 4, - Baud300 = 5, - Baud150 = 6, - Baud38400 = 7, - Baud57600 = 8, - Baud115200 = 9 - } + Baud9600 = 0, + Baud19200 = 1, + Baud4800 = 2, + Baud2400 = 3, + Baud1200 = 4, + Baud300 = 5, + Baud150 = 6, + Baud38400 = 7, + Baud57600 = 8, + Baud115200 = 9 } \ No newline at end of file diff --git a/Adaptation/Shared/Deposition/DEP08EGANAIXG5H.cs b/Adaptation/Shared/Deposition/DEP08EGANAIXG5H.cs deleted file mode 100644 index 27ba413..0000000 --- a/Adaptation/Shared/Deposition/DEP08EGANAIXG5H.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Adaptation.Shared.Deposition -{ - - public class DEP08EGANAIXG5 - { - - public enum Test - { - GRATXTCenter = Deposition.Test.GRATXTCenter, - GRATXTEdge = Deposition.Test.GRATXTEdge, - GRAXMLCenter = Deposition.Test.GRAXMLCenter, - GRAXMLEdgeN = Deposition.Test.GRAXMLEdgeN, - Health = Deposition.Test.Health, - Temps = Deposition.Test.Temps, - ToolTime = Deposition.Test.ToolTime - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Deposition/Test.cs b/Adaptation/Shared/Deposition/Test.cs deleted file mode 100644 index 2bfa2fd..0000000 --- a/Adaptation/Shared/Deposition/Test.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Adaptation.Shared.Deposition -{ - - public enum Test - { - AFMRoughness = -1, - GRATXTCenter = 0, - GRATXTEdge = 1, - GRAXMLCenter = 2, - GRAXMLEdgeN = 3, - Health = 4, - Temps = 5, - ToolTime = 6 - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Description.cs b/Adaptation/Shared/Description.cs deleted file mode 100644 index c63a405..0000000 --- a/Adaptation/Shared/Description.cs +++ /dev/null @@ -1,192 +0,0 @@ -using Adaptation.Eaf.Core; -using Adaptation.Eaf.EquipmentCore.Control; -using Adaptation.Eaf.EquipmentCore.DataCollection.Reporting; -using Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription; -using Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; -using Adaptation.Ifx.Eaf.EquipmentConnector.File.SelfDescription; -using Adaptation.Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; - -namespace Adaptation.Shared -{ - - public class Description - { - - public enum RowColumn - { - Test = 1000, - Count, - Index - } - - public enum LogisticsColumn - { - EventName = 2000, - NullData, - JobID, - Sequence, - MesEntity, - ReportFullPath, - ProcessJobID, - MID - } - - public enum Param - { - String = 0, - Integer = 2, - Double = 3, - Boolean = 4, - StructuredType = 5 - } - - internal const string FileFound = "FileFound"; - - - public List EquipmentParameters { get; private set; } - public List ParameterTypeDefinitions { get; private set; } - - private readonly bool _UseCyclical; - private readonly List _HeaderNames; - private readonly Dictionary _KeyIndexPairs; - private readonly ParameterTypeDefinition _StructuredType; - private readonly FileConnectorParameterTypeDefinitionProvider _FileConnectorParameterTypeDefinitionProvider; - - public Description(ILogic logic, ConfigDataBase configDataBase, IEquipmentControl equipmentControl) - { - _KeyIndexPairs = new Dictionary(); - _HeaderNames = configDataBase.GetHeaderNames(logic); - _UseCyclical = configDataBase.UseCyclicalForDescription; - _StructuredType = new StructuredType(nameof(StructuredType), string.Empty, new List()); - _FileConnectorParameterTypeDefinitionProvider = new FileConnectorParameterTypeDefinitionProvider(); - EquipmentParameters = new List(); - ParameterTypeDefinitions = new List { _StructuredType }; - Dictionary>> keyValuePairsCollection = configDataBase.GetParameterInfo(logic, allowNull: false); - List results = GetParameterValues(equipmentControl, keyValuePairsCollection); - } - - private List GetParameterValues(IEquipmentControl equipmentControl, Dictionary>> keyValuePairsCollection) - { - List results = new List(); - Enum param; - object value; - Enum[] @params; - string description; - List list; - EquipmentParameter equipmentParameter; - ParameterTypeDefinition parameterTypeDefinition; - bool addToEquipmentParameters = !EquipmentParameters.Any(); - foreach (KeyValuePair>> keyValuePair in keyValuePairsCollection) - { - if (!addToEquipmentParameters && !_KeyIndexPairs.ContainsKey(keyValuePair.Key)) - continue; - @params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray(); - if (@params.Length != 1) - throw new Exception(); - if (keyValuePair.Value[0].Item2 != keyValuePair.Key) - throw new Exception(); - param = @params[0]; - if (!addToEquipmentParameters) - equipmentParameter = EquipmentParameters[_KeyIndexPairs[keyValuePair.Key]]; - else - { - description = keyValuePair.Value[0].Item3; - _KeyIndexPairs.Add(keyValuePair.Key, EquipmentParameters.Count()); - if (param is Param.StructuredType || (_UseCyclical && !_HeaderNames.Contains(keyValuePair.Key))) - parameterTypeDefinition = _StructuredType; - else - parameterTypeDefinition = _FileConnectorParameterTypeDefinitionProvider.GetParameterTypeDefinition(param.ToString()); - equipmentParameter = new EquipmentParameter(keyValuePair.Key, parameterTypeDefinition, description); - EquipmentParameters.Add(equipmentParameter); - } - if (!_UseCyclical || _HeaderNames.Contains(keyValuePair.Key)) - value = keyValuePair.Value[0].Item4; - else - { - list = new List(); - for (int i = 0; i < keyValuePair.Value.Count; i++) - list.Add(new object[] { i, keyValuePair.Value[i].Item4 }); - value = list; - } - if (equipmentControl is null || !(param is Param.StructuredType)) - results.Add(new ParameterValue(equipmentParameter, value, DateTime.Now)); - else - results.Add(equipmentControl.DataCollection.CreateParameterValue(equipmentParameter, value)); - } - return results; - } - - public List GetParameterValues(ILogic logic, IEquipmentControl equipmentControl, JsonElement jsonElement, int? i = null, Dictionary keyValuePairs = null) - { - List results = new List(); - if (_UseCyclical && (i is null || i.Value > 0)) - throw new Exception(); - if (jsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - Enum param; - Tuple tuple; - JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray(); - Dictionary>> keyValuePairsCollection = new Dictionary>>(); - for (int r = i.Value; r < jsonElements.Length; r++) - { - foreach (JsonProperty jsonProperty in jsonElement[r].EnumerateObject()) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array) - { - param = Param.StructuredType; - //jValue = jObject.Value("Item1"); - throw new NotImplementedException("Item1"); - } - else - { - switch (jsonProperty.Value.ValueKind) - { - case JsonValueKind.String: - param = Param.String; - break; - case JsonValueKind.Number: - param = Param.Double; - break; - case JsonValueKind.True: - case JsonValueKind.False: - param = Param.Boolean; - break; - case JsonValueKind.Null: - param = Param.String; - break; - default: - param = Param.StructuredType; - break; - } - } - tuple = new Tuple(param, jsonProperty.Name, string.Empty, jsonProperty.Value.ToString()); - if (!keyValuePairsCollection.ContainsKey(jsonProperty.Name)) - keyValuePairsCollection.Add(jsonProperty.Name, new List>()); - keyValuePairsCollection[jsonProperty.Name].Add(tuple); - } - if (!_UseCyclical) - break; - } - results = GetParameterValues(equipmentControl, keyValuePairsCollection); - return results; - } - - public static string GetCellName() - { - string result; - if (Backbone.Instance?.CellName is null) - result = string.Empty; - else - result = Backbone.Instance.CellName; - if (result.Contains("-IO")) - result = result.Replace("-IO", string.Empty); - return result; - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Duplicator/Description.cs b/Adaptation/Shared/Duplicator/Description.cs new file mode 100644 index 0000000..abbb7a4 --- /dev/null +++ b/Adaptation/Shared/Duplicator/Description.cs @@ -0,0 +1,142 @@ +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; + +namespace Adaptation.Shared.Duplicator; + +public class Description : IDescription, Properties.IDescription +{ + + public int Test { get; set; } + public int Count { get; set; } + public int Index { get; set; } + // + public string EventName { get; set; } + public string NullData { get; set; } + public string JobID { get; set; } + public string Sequence { get; set; } + public string MesEntity { get; set; } + public string ReportFullPath { get; set; } + public string ProcessJobID { get; set; } + public string MID { get; set; } + public string Date { get; set; } //2021-10-23 + + string IDescription.GetEventDescription() => "File Has been read and parsed"; + + List IDescription.GetNames(IFileRead fileRead, Logistics logistics) + { + List results = new(); + IDescription description = GetDefault(fileRead, logistics); + string json = JsonSerializer.Serialize(description, description.GetType()); + object @object = JsonSerializer.Deserialize(json); + if (@object is not JsonElement jsonElement) + throw new Exception(); + foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) + results.Add(jsonProperty.Name); + return results; + } + + List IDescription.GetDetailNames() + { + List results = new(); + return results; + } + + List IDescription.GetHeaderNames() + { + List results = new(); + return results; + } + + IDescription IDescription.GetDisplayNames() + { + Description result = GetDisplayNames(); + return result; + } + + List IDescription.GetParameterNames() + { + List results = new(); + return results; + } + + JsonProperty[] IDescription.GetDefault(IFileRead fileRead, Logistics logistics) + { + JsonProperty[] results; + IDescription description = GetDefault(fileRead, logistics); + string json = JsonSerializer.Serialize(description, description.GetType()); + object @object = JsonSerializer.Deserialize(json); + results = ((JsonElement)@object).EnumerateObject().ToArray(); + return results; + } + + List IDescription.GetPairedParameterNames() + { + List results = new(); + return results; + } + + List IDescription.GetIgnoreParameterNames(Test test) + { + List results = new(); + return results; + } + + IDescription IDescription.GetDefaultDescription(IFileRead fileRead, Logistics logistics) + { + Description result = GetDefault(fileRead, logistics); + return result; + } + + Dictionary IDescription.GetDisplayNamesJsonElement(IFileRead fileRead) + { + Dictionary results = new(); + IDescription description = GetDisplayNames(); + string json = JsonSerializer.Serialize(description, description.GetType()); + JsonElement jsonElement = JsonSerializer.Deserialize(json); + foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) + { + if (!results.ContainsKey(jsonProperty.Name)) + results.Add(jsonProperty.Name, string.Empty); + if (jsonProperty.Value is JsonElement jsonPropertyValue) + results[jsonProperty.Name] = jsonPropertyValue.ToString(); + } + return results; + } + + List IDescription.GetDescriptions(IFileRead fileRead, Logistics logistics, List tests, IProcessData iProcessData) + { + List results = new(); + return results; + } + + private static Description GetDisplayNames() + { + Description result = new(); + return result; + } + + private static Description GetDefault(IFileRead fileRead, Logistics logistics) + { + Description result = new() + { + Test = -1, + Count = 0, + Index = -1, + // + EventName = fileRead.EventName, + NullData = fileRead.NullData, + JobID = fileRead.CellInstanceName, + Sequence = logistics.Sequence.ToString(), + MesEntity = fileRead.MesEntity, + ReportFullPath = logistics.ReportFullPath, + ProcessJobID = logistics.ProcessJobID, + MID = logistics.MID, + Date = logistics.DateTimeFromSequence.ToUniversalTime().ToString("MM/dd/yyyy HH:mm:ss") + }; + return result; + } + +} \ No newline at end of file diff --git a/Adaptation/Shared/EquipmentType.cs b/Adaptation/Shared/EquipmentType.cs deleted file mode 100644 index 12db24d..0000000 --- a/Adaptation/Shared/EquipmentType.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace Adaptation.Shared -{ - - public enum EquipmentType - { - FileEquipment, - SemiEquipment, - // - DEP08EGANAIXG5, - // - MET08ANLYSDIFAAST230_Semi, - MET08DDUPSFS6420, - MET08DDUPSP1TBI, - MET08RESIHGCV, - MET08RESIMAPCDE, - MET08THFTIRQS408M, - MET08THFTIRSTRATUS, - // - MET08AFMD3100, - MET08BVHGPROBE, - MET08CVHGPROBE802B150, - MET08CVHGPROBE802B150_Monthly, - MET08CVHGPROBE802B150_Weekly, - MET08DDINCAN8620, - MET08DDINCAN8620_Daily, - MET08EBEAMINTEGRITY26, - MET08HALLHL5580, - MET08HALLHL5580_Monthly, - MET08HALLHL5580_Weekly, - MET08MESMICROSCOPE, - MET08NDFRESIMAP151C, - MET08NDFRESIMAP151C_Verification, - MET08PLMAPRPM, - MET08PLMAPRPM_Daily, - MET08PLMAPRPM_Verification, - MET08PLMPPLATO, - MET08PRFUSB4000, - MET08PRFUSB4000_Daily, - MET08PRFUSB4000_Monthly, - MET08PRFUSB4000_Weekly, - MET08PRFUSB4000_Verification, - MET08PRFUSB4000_Villach, - MET08UVH44GS100M, - MET08VPDSUBCON, - MET08WGEOMX203641Q, - MET08WGEOMX203641Q_Verification, - MET08XRDXPERTPROMRDXL, - MET08XRDXPERTPROMRDXL_Monthly, - MET08XRDXPERTPROMRDXL_Weekly, - METBRXRAYJV7300L - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/ExtendedParameter.cs b/Adaptation/Shared/ExtendedParameter.cs deleted file mode 100644 index e5c523f..0000000 --- a/Adaptation/Shared/ExtendedParameter.cs +++ /dev/null @@ -1,178 +0,0 @@ -using Adaptation.Shared.Metrology; -using System; -using System.Collections.Generic; - -namespace Adaptation.Shared -{ - - public class ExtendedParameter - { - - public string DiplayName { get; set; } - public string ControlPlanName { get; set; } - public bool? CriticalToShip { get; set; } - public string Unit { get; set; } - public double? LSL { get; set; } - public double? TSL { get; set; } - public double? USL { get; set; } - public string Value { get; set; } - public bool? Ignore { get; set; } - - //public class ExtractorKeys - public string Lot { get; set; } //1 - public string ToolID { get; set; } //2 - public string Process { get; set; } //3 - public string WaferID { get; set; } //4 - public string Part { get; set; } //5 - public string Recipe { get; set; } //6 - public string ProcessFlow { get; set; } //7 - - //public class DataKeys - public string Employee { get; set; } //1 - public string SID { get; set; } //2 - public string WaferRegion { get; set; } //3 - public string WaferScribe { get; set; } //4 - public string WaferPosition { get; set; } //5 - public string X { get; set; } //6 - public string Y { get; set; } //7 - public string EAFCellInstance { get; set; } //8 - public string EAFReference { get; set; } //9 - public string IQSReference { get; set; } //10 - - public ExtendedParameter(Logistics logistics, string diplayName, string controlPlanName) - { - DiplayName = diplayName; - ControlPlanName = controlPlanName; - CriticalToShip = null; - Unit = string.Empty; - LSL = null; - TSL = null; - USL = null; - Ignore = null; - Value = string.Empty; - //public class ExtractorKeys - Lot = string.Empty; //1 - ToolID = string.Empty; //2 - Process = string.Empty; //3 - WaferID = string.Empty; //4 - Part = string.Empty; //5 - Recipe = string.Empty; //6 - ProcessFlow = string.Empty; //7 - //public class DataKeys - Employee = string.Empty; //1 - SID = string.Empty; //2 - WaferRegion = string.Empty; //3 - WaferScribe = string.Empty; //4 - WaferPosition = string.Empty; //5 - X = string.Empty; //6 - Y = string.Empty; //7 - EAFCellInstance = string.Empty; //8 - EAFReference = string.Empty; //9 - IQSReference = string.Empty; //10 - // - Lot = "-"; - SID = "-"; - Part = "-"; - if (!(logistics is null)) - { - ToolID = logistics.MesEntity; - EAFCellInstance = logistics.JobID; - } - } - - public override string ToString() - { - return Value; - } - - internal void Set(EquipmentType equipmentType, string queryFilter, Dictionary allColumnCollection) - { - Column key; - EAFReference = equipmentType.ToString(); - if (string.IsNullOrEmpty(queryFilter)) - IQSReference = null; - else - IQSReference = queryFilter; - // - key = Column.SID; - if (!allColumnCollection.ContainsKey(key)) - SID = "-"; - else - SID = allColumnCollection[key]; - key = Column.Employee; - if (!allColumnCollection.ContainsKey(key)) - Employee = "AUTO"; - else - Employee = allColumnCollection[key]; - // - key = Column.Lot; - if (allColumnCollection.ContainsKey(key)) - Lot = allColumnCollection[key]; - // - key = Column.Part; - if (allColumnCollection.ContainsKey(key)) - Part = allColumnCollection[key]; - // - key = Column.Process; - if (allColumnCollection.ContainsKey(key)) - Process = allColumnCollection[key]; - // - key = Column.Recipe; - if (allColumnCollection.ContainsKey(key)) - Recipe = allColumnCollection[key]; - // - key = Column.Wafer_ID; - if (allColumnCollection.ContainsKey(key)) - WaferID = allColumnCollection[key]; - key = Column.Denton_Gun_Pocket; - if (allColumnCollection.ContainsKey(key)) - WaferID = allColumnCollection[key]; - key = Column.WaferPocket_Candela; - if (allColumnCollection.ContainsKey(key)) - WaferID = allColumnCollection[key]; - key = Column.WaferPocket_Warp; - if (allColumnCollection.ContainsKey(key)) - WaferID = allColumnCollection[key]; - // - key = Column.Wafer_ID; - if (allColumnCollection.ContainsKey(key)) - WaferID = allColumnCollection[key]; - key = Column.Denton_Gun_Pocket; - if (allColumnCollection.ContainsKey(key)) - WaferID = allColumnCollection[key]; - key = Column.WaferPocket_Candela; - if (allColumnCollection.ContainsKey(key)) - WaferID = allColumnCollection[key]; - key = Column.WaferPocket_Warp; - if (allColumnCollection.ContainsKey(key)) - WaferID = allColumnCollection[key]; - // - key = Column.Wafer_Region; - if (allColumnCollection.ContainsKey(key)) - WaferRegion = allColumnCollection[key]; - key = Column.Wafer_Scribe; - if (allColumnCollection.ContainsKey(key)) - WaferScribe = allColumnCollection[key]; - key = Column.WaferPosition_BV; - if (allColumnCollection.ContainsKey(key)) - WaferPosition = allColumnCollection[key]; - key = Column.WaferPosition_CV; - if (allColumnCollection.ContainsKey(key)) - WaferPosition = allColumnCollection[key]; - key = Column.WaferPosition_Hall; - if (allColumnCollection.ContainsKey(key)) - WaferPosition = allColumnCollection[key]; - key = Column.WaferPosition_PR; - if (allColumnCollection.ContainsKey(key)) - WaferPosition = allColumnCollection[key]; - key = Column.X_Coord; - if (allColumnCollection.ContainsKey(key)) - X = allColumnCollection[key]; - key = Column.Y_Coord; - if (allColumnCollection.ContainsKey(key)) - Y = allColumnCollection[key]; - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/ExtractResult.cs b/Adaptation/Shared/ExtractResult.cs deleted file mode 100644 index 11443d5..0000000 --- a/Adaptation/Shared/ExtractResult.cs +++ /dev/null @@ -1,652 +0,0 @@ -using Adaptation.Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Adaptation.Shared -{ - - public class ExtractResult - { - - public object ProcessData { get; internal set; } - public long LastTicksDuration { get; private set; } - public long BreakAfterSeconds { get; private set; } - public Enum[] EnumColumns { get; protected set; } - public List SourceFiles { get; private set; } - public Column[] PairedColumns { get; protected set; } - public Dictionary> Headers { get; protected set; } - public Dictionary> Details { get; protected set; } - public Dictionary> Parameters { get; protected set; } - public Dictionary> ExtendedParameters { get; protected set; } - public Dictionary> DatabaseHeaders { get; protected set; } - public Dictionary> DatabaseDetails { get; protected set; } - public Dictionary> RowColumns { get; protected set; } - public Dictionary>> IgnoreIndeices { get; protected set; } - public Dictionary> LogisticsColumns { get; protected set; } - - public ExtractResult(ExtractResult extractResult, long breakAfterSeconds, Enum[] enumColumns, Column[] pairedColumns) - { - if (enumColumns is null) - enumColumns = new Enum[] { }; - if (pairedColumns is null) - pairedColumns = new Column[] { }; - ProcessData = null; - EnumColumns = enumColumns; - PairedColumns = pairedColumns; - SourceFiles = new List(); - if (!(extractResult is null) && !(extractResult.SourceFiles is null)) - SourceFiles.AddRange(extractResult.SourceFiles); - BreakAfterSeconds = breakAfterSeconds; - List headers = new List(); - List details = new List(); - List parameters = new List(); - List databaseHeaders = new List(); - List databaseDetails = new List(); - UpdateLastTicksDuration(breakAfterSeconds * 10000000); - Common(headers, details, parameters, databaseHeaders, databaseDetails); - } - - private void Common(List headers, List details, List parameters, List databaseHeaders, List databaseDetails) - { - Headers = new Dictionary>(); - Details = new Dictionary>(); - Parameters = new Dictionary>(); - ExtendedParameters = new Dictionary>(); - DatabaseHeaders = new Dictionary>(); - DatabaseDetails = new Dictionary>(); - IgnoreIndeices = new Dictionary>>(); - LogisticsColumns = new Dictionary>(); - foreach (var item in headers) - Headers.Add(item, new List()); - foreach (var item in details) - Details.Add(item, new List()); - foreach (var item in parameters) - Parameters.Add(item, new List()); - foreach (var item in parameters) - ExtendedParameters.Add(item, new List()); - foreach (var item in databaseHeaders) - DatabaseHeaders.Add(item, new List()); - foreach (var item in databaseDetails) - DatabaseDetails.Add(item, new List()); - Array array; - array = Enum.GetValues(typeof(Description.RowColumn)); - RowColumns = new Dictionary>(); - foreach (Description.RowColumn item in array) - RowColumns.Add(item, new List()); - array = Enum.GetValues(typeof(Description.LogisticsColumn)); - foreach (Description.LogisticsColumn item in array) - LogisticsColumns.Add(item, new List()); - } - - internal void Reset() - { - ProcessData = null; - SourceFiles.Clear(); - List headers = new List(); - List details = new List(); - List parameters = new List(); - List databaseHeaders = new List(); - List databaseDetails = new List(); - foreach (var item in Headers) - headers.Add(item.Key); - foreach (var item in Details) - details.Add(item.Key); - foreach (var item in Parameters) - parameters.Add(item.Key); - foreach (var item in DatabaseHeaders) - databaseHeaders.Add(item.Key); - foreach (var item in DatabaseDetails) - databaseDetails.Add(item.Key); - Common(headers, details, parameters, databaseHeaders, databaseDetails); - } - - public ExtractResult ShallowCopy() - { - return (ExtractResult)MemberwiseClone(); - } - - internal void HeadersAddRange(Enum column) - { - Headers.Add(column, new List()); - } - - internal void HeadersAddRange(params Enum[] columns) - { - foreach (var item in columns) - Headers.Add(item, new List()); - } - - internal void HeadersAddRange(List columns) - { - foreach (var item in columns) - Headers.Add(item, new List()); - } - - internal void DetailsAddRange(Enum column) - { - Details.Add(column, new List()); - } - - internal void DetailsAddRange(params Enum[] columns) - { - foreach (var item in columns) - Details.Add(item, new List()); - } - - internal void DetailsAddRange(List columns) - { - foreach (var item in columns) - Details.Add(item, new List()); - } - - internal void ParametersAddRange(Enum column) - { - Parameters.Add(column, new List()); - } - - internal void ParametersAddRange(params Enum[] columns) - { - foreach (var item in columns) - Parameters.Add(item, new List()); - } - - internal void ParametersAddRange(List columns) - { - foreach (var item in columns) - Parameters.Add(item, new List()); - } - - internal void DatabaseHeadersAddRange(Enum column) - { - DatabaseHeaders.Add(column, new List()); - } - - internal void DatabaseHeadersAddRange(params Enum[] columns) - { - foreach (var item in columns) - DatabaseHeaders.Add(item, new List()); - } - - internal void DatabaseHeadersAddRange(List columns) - { - foreach (var item in columns) - DatabaseHeaders.Add(item, new List()); - } - - internal void DatabaseDetailsAddRange(Enum column) - { - DatabaseDetails.Add(column, new List()); - } - - internal void DatabaseDetailsAddRange(params Enum[] columns) - { - foreach (var item in columns) - DatabaseDetails.Add(item, new List()); - } - - internal void DatabaseDetailsAddRange(List columns) - { - foreach (var item in columns) - DatabaseDetails.Add(item, new List()); - } - - internal int GetCount() - { - int result = 0; - List counts = new List - { - RowColumns[Description.RowColumn.Test].Count() - }; - foreach (var item in Headers) - counts.Add(item.Value.Count()); - foreach (var item in Details) - counts.Add(item.Value.Count()); - foreach (var item in Parameters) - counts.Add(item.Value.Count()); - foreach (var item in DatabaseHeaders) - counts.Add(item.Value.Count()); - foreach (var item in DatabaseDetails) - counts.Add(item.Value.Count()); - result = counts.Max(); - if (counts.Distinct().Count() != 1) - throw new Exception(); - return result; - } - - private Dictionary> Merge(List>> keyValuePairs) - { - Dictionary> results = new Dictionary>(); - foreach (var element in keyValuePairs) - results.Add(element.Key, element.Value); - return results; - } - - private List>> GetAllColumnKeyValuePairs() - { - List>> results = new List>>(); - foreach (var item in Headers) - results.Add(new KeyValuePair>(item.Key, item.Value)); - foreach (var item in Details) - results.Add(new KeyValuePair>(item.Key, item.Value)); - foreach (var item in Parameters) - results.Add(new KeyValuePair>(item.Key, item.Value)); - foreach (var item in DatabaseHeaders) - results.Add(new KeyValuePair>(item.Key, item.Value)); - foreach (var item in DatabaseDetails) - results.Add(new KeyValuePair>(item.Key, item.Value)); - return results; - } - - internal Dictionary> GetAllColumnCollection() - { - Dictionary> results; - if (!EnumColumns.Any()) - { - List>> keyValuePairs = GetAllColumnKeyValuePairs(); - results = Merge(keyValuePairs); - } - else - { - results = new Dictionary>(); - foreach (var item in EnumColumns) - results.Add(item, new List()); - foreach (var item in PairedColumns) - results.Add(item, new List()); - foreach (var item in Headers) - results[item.Key].AddRange(item.Value); - foreach (var item in Details) - results[item.Key].AddRange(item.Value); - foreach (var item in Parameters) - results[item.Key].AddRange(item.Value); - foreach (var item in DatabaseHeaders) - results[item.Key].AddRange(item.Value); - foreach (var item in DatabaseDetails) - results[item.Key].AddRange(item.Value); - int count = GetCount(); - foreach (var keyValuePair in results) - { - for (int i = keyValuePair.Value.Count; i < count; i++) - results[keyValuePair.Key].Add(string.Empty); - } - } - return results; - } - - private Dictionary Merge(List> keyValuePairs) - { - Dictionary results = new Dictionary(); - foreach (var element in keyValuePairs) - results.Add(element.Key, element.Value); - return results; - } - - private List> GetAllColumnKeyValuePairs(int? i) - { - List> results = new List>(); - if (i.HasValue) - { - foreach (var item in Headers) - results.Add(new KeyValuePair(item.Key, item.Value[i.Value])); - foreach (var item in Details) - results.Add(new KeyValuePair(item.Key, item.Value[i.Value])); - foreach (var item in Parameters) - results.Add(new KeyValuePair(item.Key, item.Value[i.Value])); - foreach (var item in DatabaseHeaders) - results.Add(new KeyValuePair(item.Key, item.Value[i.Value])); - foreach (var item in DatabaseDetails) - results.Add(new KeyValuePair(item.Key, item.Value[i.Value])); - } - return results; - } - - internal Dictionary GetAllColumnCollection(int? i) - { - Dictionary results; - List> keyValuePairs = GetAllColumnKeyValuePairs(i); - results = Merge(keyValuePairs); - return results; - } - - private List>> GetToolHeadersAndDatabaseHeadersColumnKeyValuePairs() - { - List>> results = new List>>(); - foreach (var item in Headers) - results.Add(new KeyValuePair>(item.Key, item.Value)); - foreach (var item in DatabaseHeaders) - results.Add(new KeyValuePair>(item.Key, item.Value)); - return results; - } - - internal Dictionary> GetToolHeadersAndDatabaseHeadersCollection() - { - Dictionary> results; - List>> keyValuePairs = GetToolHeadersAndDatabaseHeadersColumnKeyValuePairs(); - results = Merge(keyValuePairs); - return results; - } - - private List>> GetToolDetailsAndDatabaseDetailsColumnKeyValuePairs() - { - List>> results = new List>>(); - foreach (var item in Details) - results.Add(new KeyValuePair>(item.Key, item.Value)); - foreach (var item in Parameters) - results.Add(new KeyValuePair>(item.Key, item.Value)); - foreach (var item in DatabaseDetails) - results.Add(new KeyValuePair>(item.Key, item.Value)); - return results; - } - - internal Dictionary> GetToolDetailsAndDatabaseDetailsCollection() - { - Dictionary> results; - List>> keyValuePairs = GetToolDetailsAndDatabaseDetailsColumnKeyValuePairs(); - results = Merge(keyValuePairs); - return results; - } - - internal Dictionary> GetTests() - { - Dictionary> results = new Dictionary>(); - Test test; - for (int i = 0; i < RowColumns[Description.RowColumn.Test].Count; i++) - { - test = (Test)RowColumns[Description.RowColumn.Test][i]; - if (!results.ContainsKey(test)) - results.Add(test, new List()); - results[test].Add(i); - } - return results; - } - - internal void FillIn(string nullData, int count, Enum[] currentColumns) - { - foreach (Enum column in Headers.Keys) - { - for (int i = Headers[column].Count(); i < count; i++) - Headers[column].Add(nullData); - } - foreach (Enum column in Details.Keys) - { - for (int i = Details[column].Count(); i < count; i++) - Details[column].Add(nullData); - } - if (!(currentColumns is null)) - { - foreach (Enum column in currentColumns) - { - for (int i = Parameters[column].Count(); i < count; i++) - Parameters[column].Add(nullData); - } - } - foreach (Enum column in Parameters.Keys) - { - for (int i = Parameters[column].Count(); i < count; i++) - Parameters[column].Add(string.Empty); - } - foreach (Enum column in DatabaseHeaders.Keys) - { - for (int i = DatabaseHeaders[column].Count(); i < count; i++) - DatabaseHeaders[column].Add(string.Empty); - } - foreach (Enum column in DatabaseDetails.Keys) - { - for (int i = DatabaseDetails[column].Count(); i < count; i++) - DatabaseDetails[column].Add(string.Empty); - } - if (RowColumns[Description.RowColumn.Count].Count() != RowColumns[Description.RowColumn.Test].Count()) - { - count = RowColumns[Description.RowColumn.Test].Count(); - RowColumns[Description.RowColumn.Count].Clear(); - for (int i = 0; i < count; i++) - RowColumns[Description.RowColumn.Count].Add(count); - } - } - - internal void SetCollections(Logistics logistics, Dictionary>> rawData) - { - Array array; - Column? column; - bool recordStartPresent = false; - Description.RowColumn? rowColumn; - Description.LogisticsColumn? logisticsColumn; - array = Enum.GetValues(typeof(Description.RowColumn)); - Dictionary headers = new Dictionary(); - Dictionary details = new Dictionary(); - Dictionary parameters = new Dictionary(); - Dictionary databaseHeaders = new Dictionary(); - Dictionary databaseDetails = new Dictionary(); - Dictionary> rowColumns = new Dictionary>(); - foreach (var item in Headers) - headers.Add(item.Key.ToString(), item.Key); - foreach (var item in Details) - headers.Add(item.Key.ToString(), item.Key); - foreach (var item in Parameters) - headers.Add(item.Key.ToString(), item.Key); - foreach (var item in DatabaseHeaders) - headers.Add(item.Key.ToString(), item.Key); - foreach (var item in DatabaseDetails) - headers.Add(item.Key.ToString(), item.Key); - foreach (Description.RowColumn item in array) - rowColumns.Add(item, new List()); - foreach (var element in rawData) - { - foreach (var item in element.Value) - { - column = null; - rowColumn = null; - logisticsColumn = null; - if (item.Key == "Time") - continue; - else if (item.Key == "A_LOGISTICS") - continue; - else if (item.Key == "B_LOGISTICS") - continue; - else if (item.Key == "EventId") - continue; - else if (item.Key == ProcessDataStandardFormat.RecordStart) - { - recordStartPresent = true; - continue; - } - if (Enum.TryParse(item.Key, out Column columnTry)) - column = columnTry; - else - { - if (Enum.TryParse(item.Key, out Description.LogisticsColumn logisticsColumnTry)) - logisticsColumn = logisticsColumnTry; - else - { - if (Enum.TryParse(item.Key, out Description.RowColumn rowColumnTry)) - rowColumn = rowColumnTry; - } - } - if (rowColumn.HasValue) - rowColumns[rowColumn.Value].AddRange(item.Value); - else if (logisticsColumn.HasValue) - LogisticsColumns[logisticsColumn.Value].AddRange(item.Value); - else if (column.HasValue) - { - if (Headers.ContainsKey(column.Value)) - Headers[column.Value].AddRange(item.Value); - else if (Details.ContainsKey(column.Value)) - Details[column.Value].AddRange(item.Value); - else if (Parameters.ContainsKey(column.Value)) - Parameters[column.Value].AddRange(item.Value); - else if (DatabaseHeaders.ContainsKey(column.Value)) - DatabaseHeaders[column.Value].AddRange(item.Value); - else if (DatabaseDetails.ContainsKey(column.Value)) - DatabaseDetails[column.Value].AddRange(item.Value); - else - { - if (!recordStartPresent) - throw new Exception(); - } - } - else - { - if (headers.ContainsKey(item.Key)) - Headers[headers[item.Key]].AddRange(item.Value); - else if (details.ContainsKey(item.Key)) - Details[details[item.Key]].AddRange(item.Value); - else if (parameters.ContainsKey(item.Key)) - Parameters[parameters[item.Key]].AddRange(item.Value); - else if (databaseHeaders.ContainsKey(item.Key)) - DatabaseHeaders[databaseHeaders[item.Key]].AddRange(item.Value); - else if (databaseDetails.ContainsKey(item.Key)) - DatabaseDetails[databaseDetails[item.Key]].AddRange(item.Value); - else - { - if (!recordStartPresent) - throw new Exception(); - } - } - } - } - foreach (var element in rowColumns) - { - for (int i = 0; i < element.Value.Count(); i++) - { - int.TryParse(element.Value[i], out int rowColumnTry); - RowColumns[element.Key].Add(rowColumnTry); - } - } - array = Enum.GetValues(typeof(Description.RowColumn)); - foreach (Description.RowColumn item in array) - { - if (!RowColumns.ContainsKey(item)) - throw new Exception(); - } - array = Enum.GetValues(typeof(Description.LogisticsColumn)); - foreach (Description.LogisticsColumn item in array) - { - if (!LogisticsColumns.ContainsKey(item)) - throw new Exception(); - } - int count = rowColumns[Description.RowColumn.Test].Count(); - foreach (var element in DatabaseHeaders) - { - for (int i = element.Value.Count(); i < count; i++) - element.Value.Add(string.Empty); - } - foreach (var element in DatabaseDetails) - { - for (int i = element.Value.Count(); i < count; i++) - element.Value.Add(string.Empty); - } - string nullData; - if (logistics.NullData is null) - nullData = string.Empty; - else - nullData = logistics.NullData.ToString(); - Dictionary> keyValuePairs; - foreach (Test key in rawData.Keys) - { - IgnoreIndeices.Add(key, new Dictionary>()); - for (int g = 1; g < 4; g++) - { - switch (g) - { - case 1: - keyValuePairs = Details; - break; - case 2: - keyValuePairs = Parameters; - break; - case 3: - keyValuePairs = DatabaseDetails; - break; - default: - throw new Exception(); - } - foreach (var element in keyValuePairs) - { - IgnoreIndeices[key].Add(element.Key, new List()); - if (!element.Value.Any()) - { - for (int i = 0; i < RowColumns[Description.RowColumn.Test].Count(); i++) - { - IgnoreIndeices[key][element.Key].Add(i); - element.Value.Add(string.Empty); - } - } - else - { - for (int i = 0; i < element.Value.Count(); i++) - { - if (RowColumns[Description.RowColumn.Test][i] == (int)key) - { - if (string.IsNullOrEmpty(element.Value[i])) - IgnoreIndeices[key][element.Key].Add(i); - else if (!(logistics.NullData is null) && element.Value[i] == nullData) - IgnoreIndeices[key][element.Key].Add(i); - } - } - } - } - } - } - if (recordStartPresent) - FillIn(string.Empty, RowColumns[Description.RowColumn.Test].Count(), currentColumns: null); - GetCount(); - } - - internal void UpdateLastTicksDuration(long ticksDuration) - { - if (ticksDuration < 50000000) - ticksDuration = 50000000; - LastTicksDuration = (long)Math.Ceiling(ticksDuration * .667); - } - - private string GetTupleFile(Logistics logistics, ScopeInfo scopeInfo, string duplicateDirectory) - { - string result; - string rds; - string dateValue; - string datePlaceholder; - string[] segments = logistics.MID.Split('-'); - if (segments.Length < 2) - rds = "%RDS%"; - else - rds = segments[1]; - segments = scopeInfo.FileName.Split(new string[] { "DateTime:" }, StringSplitOptions.RemoveEmptyEntries); - if (segments.Length == 0) - result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileNameWithoutExtension.Replace("%RDS%", rds)); - else - { - datePlaceholder = "%DateTime%"; - segments = segments[1].Split('%'); - dateValue = logistics.DateTimeFromSequence.ToString(segments[0]); - foreach (string segment in scopeInfo.FileName.Split('%')) - { - if (!segment.Contains(segments[0])) - continue; - datePlaceholder = string.Concat('%', segment, '%'); - } - result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileName.Replace("%RDS%", rds).Replace(datePlaceholder, dateValue)); - } - if (result.Contains('%')) - throw new Exception("Placeholder exists!"); - return result; - } - - internal void AutoAdd(Enum key, string value) - { - if (Headers.ContainsKey(key)) - Headers[key].Add(value); - else if (Details.ContainsKey(key)) - Details[key].Add(value); - else if (Parameters.ContainsKey(key)) - Parameters[key].Add(value); - else if (DatabaseHeaders.ContainsKey(key)) - DatabaseHeaders[key].Add(value); - else if (DatabaseDetails.ContainsKey(key)) - DatabaseDetails[key].Add(value); - else - throw new Exception(); - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/FileRead.cs b/Adaptation/Shared/FileRead.cs new file mode 100644 index 0000000..c30ebf5 --- /dev/null +++ b/Adaptation/Shared/FileRead.cs @@ -0,0 +1,813 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared.Methods; +using log4net; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading; + +namespace Adaptation.Shared; + +public class FileRead : Properties.IFileRead +{ + + protected string _NullData; + protected readonly ILog _Log; + protected long _MinFileLength; + protected Logistics _Logistics; + protected readonly ISMTP _SMTP; + protected readonly int _Hyphens; + protected readonly bool _IsEvent; + protected string _ReportFullPath; + protected long _LastTicksDuration; + protected readonly bool _IsEAFHosted; + protected readonly string _EventName; + protected readonly string _MesEntity; + protected readonly string _TracePath; + protected readonly bool _IsDuplicator; + protected readonly Calendar _Calendar; + protected readonly bool _IsSourceTimer; + protected readonly string _VillachPath; + protected readonly string _ProgressPath; + protected readonly string _EquipmentType; + protected readonly long _BreakAfterSeconds; + protected readonly string _ExceptionSubject; + protected readonly string _CellInstanceName; + protected readonly string _EventNameFileRead; + protected readonly IDescription _Description; + protected readonly bool _UseCyclicalForDescription; + protected readonly string _CellInstanceConnectionName; + protected readonly string _CellInstanceConnectionNameBase; + protected readonly Dictionary> _DummyRuns; + protected readonly Dictionary _FileParameter; + protected readonly string _ParameterizedModelObjectDefinitionType; + protected readonly FileConnectorConfiguration _FileConnectorConfiguration; + protected readonly IList _ModelObjectParameterDefinitions; + + bool Properties.IFileRead.IsEvent => _IsEvent; + string Properties.IFileRead.NullData => _NullData; + string Properties.IFileRead.EventName => _EventName; + string Properties.IFileRead.MesEntity => _MesEntity; + bool Properties.IFileRead.IsEAFHosted => _IsEAFHosted; + string Properties.IFileRead.EquipmentType => _EquipmentType; + string Properties.IFileRead.ReportFullPath => _ReportFullPath; + string Properties.IFileRead.CellInstanceName => _CellInstanceName; + string Properties.IFileRead.ExceptionSubject => _ExceptionSubject; + bool Properties.IFileRead.UseCyclicalForDescription => _UseCyclicalForDescription; + string Properties.IFileRead.CellInstanceConnectionName => _CellInstanceConnectionName; + string Properties.IFileRead.ParameterizedModelObjectDefinitionType => _ParameterizedModelObjectDefinitionType; + + public FileRead(IDescription description, bool isEvent, ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) + { + _SMTP = smtp; + _IsEvent = isEvent; + _DummyRuns = dummyRuns; + _LastTicksDuration = 0; + _IsEAFHosted = isEAFHosted; + _Description = description; + _FileParameter = fileParameter; + _ReportFullPath = string.Empty; + _CellInstanceName = cellInstanceName; + _Calendar = new CultureInfo("en-US").Calendar; + _Log = LogManager.GetLogger(typeof(FileRead)); + _UseCyclicalForDescription = useCyclicalForDescription; + _CellInstanceConnectionName = cellInstanceConnectionName; + _ModelObjectParameterDefinitions = modelObjectParameters; + _FileConnectorConfiguration = fileConnectorConfiguration; + _ParameterizedModelObjectDefinitionType = parameterizedModelObjectDefinitionType; + _IsSourceTimer = fileConnectorConfiguration.SourceFileFilter.StartsWith("*Timer.txt"); + string cellInstanceConnectionNameBase = cellInstanceConnectionName.Replace("-", string.Empty); + _Hyphens = cellInstanceConnectionName.Length - cellInstanceConnectionNameBase.Length; + _ExceptionSubject = string.Concat("Exception:", _CellInstanceConnectionName, _FileConnectorConfiguration?.SourceDirectoryCloaking); + string suffix; + string[] segments = _ParameterizedModelObjectDefinitionType.Split('.'); + string @namespace = segments[0]; + string eventNameFileRead = "FileRead"; + string eventName = segments[segments.Length - 1]; + bool isDuplicator = segments[0] == cellInstanceName; + _IsDuplicator = isDuplicator; + _CellInstanceConnectionNameBase = cellInstanceConnectionNameBase; + if (eventName == eventNameFileRead) + suffix = string.Empty; + else + suffix = string.Concat('_', eventName.Split(new string[] { eventNameFileRead }, StringSplitOptions.RemoveEmptyEntries)[1]); + string parameterizedModelObjectDefinitionTypeAppended = string.Concat(@namespace, suffix); + if (!isEAFHosted) + { + if (string.IsNullOrEmpty(equipmentTypeName) || equipmentTypeName != parameterizedModelObjectDefinitionTypeAppended) + throw new Exception(cellInstanceConnectionName); + if (string.IsNullOrEmpty(equipmentDictionaryName) && isEvent) + throw new Exception(cellInstanceConnectionName); + if (!string.IsNullOrEmpty(equipmentDictionaryName) && !isEvent) + throw new Exception(cellInstanceConnectionName); + // if (string.IsNullOrEmpty(equipmentDictionaryName) && !isEvent) + // throw new Exception(cellInstanceConnectionName); + // if (!string.IsNullOrEmpty(equipmentDictionaryName) && isEvent) + // throw new Exception(cellInstanceConnectionName); + } + ModelObjectParameterDefinition[] paths = GetProperties(cellInstanceConnectionName, modelObjectParameters, "Path."); + if (paths.Length < 4) + throw new Exception(cellInstanceConnectionName); + if (isDuplicator) + _MesEntity = string.Empty; + else + _MesEntity = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, string.Concat("CellInstance.", cellInstanceName, ".Alias")); + _TracePath = (from l in paths where l.Name.EndsWith("Trace") select l.Value).FirstOrDefault(); + _VillachPath = (from l in paths where l.Name.EndsWith("Villach") select l.Value).FirstOrDefault(); + _ProgressPath = (from l in paths where l.Name.EndsWith("Progress") select l.Value).FirstOrDefault(); + _EventName = eventName; + _EventNameFileRead = eventNameFileRead; + _EquipmentType = parameterizedModelObjectDefinitionTypeAppended; + long breakAfterSeconds; + if (_FileConnectorConfiguration is null) + breakAfterSeconds = 360; + else + { + if (_FileConnectorConfiguration.FileScanningOption == FileConnectorConfiguration.FileScanningOptionEnum.TimeBased) + breakAfterSeconds = 360; + else + breakAfterSeconds = Math.Abs(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value); + } + _BreakAfterSeconds = breakAfterSeconds; + UpdateLastTicksDuration(breakAfterSeconds * 10000000); + if (_IsDuplicator) + { + if (string.IsNullOrEmpty(_FileConnectorConfiguration.TargetFileLocation) || string.IsNullOrEmpty(_FileConnectorConfiguration.ErrorTargetFileLocation)) + throw new Exception("_Configuration is empty?"); + if (_FileConnectorConfiguration.TargetFileLocation.Contains('%') || _FileConnectorConfiguration.ErrorTargetFileLocation.Contains('%')) + throw new Exception("_Configuration is incorrect for a duplicator!"); + if (_FileConnectorConfiguration is not null) + { + if (string.IsNullOrEmpty(_FileConnectorConfiguration.SourceDirectoryCloaking)) + throw new Exception("SourceDirectoryCloaking is empty?"); + if (!_FileConnectorConfiguration.SourceDirectoryCloaking.StartsWith("~")) + throw new Exception("SourceDirectoryCloaking is incorrect for a duplicator!"); + } + } + } + + protected static string GetPropertyValue(string cellInstanceConnectionName, IList modelObjectParameters, string propertyName) + { + string result; + List results = (from l in modelObjectParameters where l.Name == propertyName select l.Value).ToList(); + if (results.Count != 1) + throw new Exception(cellInstanceConnectionName); + result = results[0]; + return result; + } + + 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()) + throw new Exception(cellInstanceConnectionName); + return results; + } + + 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()) + throw new Exception(cellInstanceConnectionName); + return results; + } + + protected void UpdateLastTicksDuration(long ticksDuration) + { + if (ticksDuration < 50000000) + ticksDuration = 50000000; + _LastTicksDuration = (long)Math.Ceiling(ticksDuration * .667); + } + + protected void WaitForThread(Thread thread, List threadExceptions) + { + if (thread is not null) + { + ThreadState threadState; + for (short i = 0; i < short.MaxValue; i++) + { + if (thread is null) + break; + else + { + threadState = thread.ThreadState; + if (threadState is not ThreadState.Running and not ThreadState.WaitSleepJoin) + break; + } + Thread.Sleep(500); + } + lock (threadExceptions) + { + if (threadExceptions.Any()) + { + foreach (Exception item in threadExceptions) + _Log.Error(string.Concat(item.Message, Environment.NewLine, Environment.NewLine, item.StackTrace)); + Exception exception = threadExceptions[0]; + threadExceptions.Clear(); + throw exception; + } + } + } + } + + protected void CreateProgressDirectory(string[] exceptionLines) + { + string progressDirectory; + StringBuilder stringBuilder = new(); + if (_Hyphens == 0) + progressDirectory = Path.Combine(_ProgressPath, _CellInstanceConnectionName); + else + { + _ = stringBuilder.Clear(); + for (int i = 0; i < _Hyphens; i++) + { + if (i > 0 && (i % 2) == 0) + _ = stringBuilder.Append(' '); + _ = stringBuilder.Append('-'); + } + progressDirectory = string.Concat(_ProgressPath, @"\", (_Hyphens + 1).ToString().PadLeft(2, '0'), " ", stringBuilder).Trim(); + } + DateTime dateTime = DateTime.Now; + string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + progressDirectory = string.Concat(progressDirectory, @"\", dateTime.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.MID, "_", _Logistics.Sequence, "_", DateTime.Now.Ticks - _Logistics.Sequence); + if (!Directory.Exists(progressDirectory)) + _ = Directory.CreateDirectory(progressDirectory); + if (exceptionLines is not null) + { + string fileName = string.Concat(progressDirectory, @"\readme.txt"); + try + { File.WriteAllLines(fileName, exceptionLines); } + catch (Exception) { } + } + } + + 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 }; + Shared0449(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 IEnumerable GetDirectoriesRecursively(string path, string directoryNameSegment = null) + { + Queue queue = new(); + queue.Enqueue(path); + while (queue.Count > 0) + { + path = queue.Dequeue(); + foreach (string subDirectory in Directory.GetDirectories(path)) + { + queue.Enqueue(subDirectory); + if (string.IsNullOrEmpty(directoryNameSegment) || Path.GetFileName(subDirectory).Contains(directoryNameSegment)) + yield return subDirectory; + } + } + } + + protected string GetProcessedDirectory(string progressPath, Logistics logistics, DateTime dateTime, string duplicateDirectory) + { + string result = duplicateDirectory; + string logisticsSequence = logistics.Sequence.ToString(); + string[] matchDirectories; + if (!_IsEAFHosted) + matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(logistics.ReportFullPath)) }; + else + matchDirectories = new string[] { GetDirectoriesRecursively(Path.GetDirectoryName(progressPath), logisticsSequence).FirstOrDefault() }; + if (matchDirectories.Length == 0 || string.IsNullOrEmpty(matchDirectories[0])) + matchDirectories = Directory.GetDirectories(duplicateDirectory, string.Concat('*', logisticsSequence, '*'), SearchOption.AllDirectories); + if ((matchDirectories is null) || matchDirectories.Length != 1) + throw new Exception("Didn't find directory by logistics sequence"); + if (!matchDirectories[0].Contains("_processed")) + { + result = string.Concat(matchDirectories[0].Split(new string[] { logisticsSequence }, StringSplitOptions.None)[0], logistics.DateTimeFromSequence.ToString("yyyy-MM-dd_hh;mm_tt_"), dateTime.Ticks - logistics.Sequence, "_processed"); + Directory.Move(matchDirectories[0], result); + result = string.Concat(result, @"\", logistics.Sequence); + if (!Directory.Exists(result)) + _ = Directory.CreateDirectory(result); + } + return result; + } + + protected string WriteScopeInfo(string progressPath, Logistics logistics, DateTime dateTime, string duplicateDirectory, List> tuples) + { + string result = GetProcessedDirectory(progressPath, logistics, dateTime, duplicateDirectory); + string tupleFile; + string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath); + string duplicateFile = string.Concat(result, @"\", fileName, ".pdsf"); + foreach (Tuple tuple in tuples) + { + if (tuple.Item1.FileName.StartsWith(@"\")) + tupleFile = tuple.Item1.FileName; + else + tupleFile = string.Concat(result, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc"); + File.WriteAllText(tupleFile, tuple.Item2); + } + File.Copy(logistics.ReportFullPath, duplicateFile, overwrite: true); + return result; + } + + protected static string GetTupleFile(Logistics logistics, Properties.IScopeInfo scopeInfo, string duplicateDirectory) + { + string result; + string rds; + string dateValue; + string datePlaceholder; + string[] segments = logistics.MID.Split('-'); + if (segments.Length < 2) + rds = "%RDS%"; + else + rds = segments[1]; + segments = scopeInfo.FileName.Split(new string[] { "DateTime:" }, StringSplitOptions.RemoveEmptyEntries); + if (segments.Length == 0) + result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileNameWithoutExtension.Replace("%RDS%", rds)); + else + { + datePlaceholder = "%DateTime%"; + segments = segments[1].Split('%'); + dateValue = logistics.DateTimeFromSequence.ToString(segments[0]); + foreach (string segment in scopeInfo.FileName.Split('%')) + { + if (!segment.Contains(segments[0])) + continue; + datePlaceholder = string.Concat('%', segment, '%'); + } + result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileName.Replace("%RDS%", rds).Replace(datePlaceholder, dateValue)); + } + if (result.Contains('%')) + throw new Exception("Placeholder exists!"); + return result; + } + + protected void WaitForFileConsumption(string sourceDirectoryCloaking, Logistics logistics, DateTime dateTime, string successDirectory, string duplicateDirectory, string duplicateFile, List> tuples) + { + bool check; + long preWait; + string tupleFile; + List consumedFileIndices = new(); + List duplicateFiles = new(); + bool moreThanAnHour = (_BreakAfterSeconds > 3600); + StringBuilder stringBuilder = new(); + long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks; + if (moreThanAnHour) + preWait = dateTime.AddSeconds(30).Ticks; + else + preWait = dateTime.AddTicks(_LastTicksDuration).Ticks; + if (!tuples.Any()) + duplicateFiles.Add(duplicateFile); + string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath); + string successFile = string.Concat(successDirectory, @"\", Path.GetFileName(logistics.ReportFullPath)); + foreach (Tuple tuple in tuples) + { + if (tuple.Item1.FileName.StartsWith(@"\")) + tupleFile = tuple.Item1.FileName; + else if (!tuple.Item1.FileName.Contains('%')) + tupleFile = string.Concat(duplicateDirectory, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc"); + else + tupleFile = GetTupleFile(logistics, tuple.Item1, duplicateDirectory); + duplicateFiles.Add(tupleFile); + File.WriteAllText(tupleFile, tuple.Item2); + } + for (short i = 0; i < short.MaxValue; i++) + { + if (DateTime.Now.Ticks > preWait) + break; + Thread.Sleep(500); + } + 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])) + 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(500); + } + } + } + + 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(_VillachPath, _EquipmentType, "Target"); + 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, Exception exception) + { + bool isErrorFile = exception is not null; + if (!isErrorFile && _IsDuplicator) + { + if (_IsEAFHosted && !string.IsNullOrEmpty(_ProgressPath)) + CreateProgressDirectory(exceptionLines: null); + } + if (!_IsEAFHosted) + { + string to; + if (!_FileConnectorConfiguration.TargetFileLocation.EndsWith(Path.DirectorySeparatorChar.ToString())) + to = _FileConnectorConfiguration.TargetFileLocation; + else + to = Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation); + foreach (KeyValuePair keyValuePair in _FileParameter) + to = to.Replace(string.Concat('%', keyValuePair.Key, '%'), keyValuePair.Value); + if (to.Contains('%')) + _Log.Debug("Can't debug without EAF Hosting"); + else + _ = Move(extractResults, to, _FileConnectorConfiguration.SourceFileLocation, resolvedFileLocation: string.Empty, exception: null); + } + } + + protected void TriggerEvents(Tuple> extractResults, List headerNames, Dictionary keyValuePairs) + { + object value; + string description; + List list; + for (int i = 0; i < extractResults.Item3.Length; i++) + { + _Log.Debug(string.Concat("TriggerEvent - {", _Logistics.ReportFullPath, "} ", i, " of ", extractResults.Item3.Length)); + foreach (JsonProperty jsonProperty in extractResults.Item3[i].EnumerateObject()) + { + if (jsonProperty.Value.ValueKind != JsonValueKind.String || !keyValuePairs.ContainsKey(jsonProperty.Name)) + description = string.Empty; + else + description = keyValuePairs[jsonProperty.Name].Split('|')[0]; + if (!_UseCyclicalForDescription || headerNames.Contains(jsonProperty.Name)) + value = jsonProperty.Value.ToString(); + else + { + list = new List(); + for (int z = 0; z < extractResults.Item3.Length; z++) + list.Add(new object[] { z, extractResults.Item3[z].GetProperty(jsonProperty.Name).ToString() }); + value = list; + } + } + if (_UseCyclicalForDescription) + break; + } + } + + protected Tuple> ReExtract(IFileRead fileRead, List headerNames, Dictionary keyValuePairs) + { + Tuple> results; + if (!Directory.Exists(_FileConnectorConfiguration.SourceFileLocation)) + results = null; + else + { + string[] segments; + string[] matches = null; + foreach (string subSourceFileFilter in _FileConnectorConfiguration.SourceFileFilters) + { + segments = subSourceFileFilter.Split('\\'); + if (_FileConnectorConfiguration.IncludeSubDirectories.Value) + matches = Directory.GetFiles(_FileConnectorConfiguration.SourceFileLocation, segments.Last(), SearchOption.AllDirectories); + else + matches = Directory.GetFiles(_FileConnectorConfiguration.SourceFileLocation, segments.Last(), SearchOption.TopDirectoryOnly); + if (matches.Any()) + break; + } + if (matches is null || !matches.Any()) + results = null; + else + { + _ReportFullPath = matches[0]; + results = fileRead.GetExtractResult(_ReportFullPath, _EventName); + if (!_IsEAFHosted) + TriggerEvents(results, headerNames, keyValuePairs); + } + } + return results; + } + + protected static Dictionary> GetKeyValuePairs(List descriptions) + { + Dictionary> results = new(); + Test testKey; + for (int i = 0; i < descriptions.Count; i++) + { + testKey = (Test)descriptions[i].Test; + if (!results.ContainsKey(testKey)) + results.Add(testKey, new List()); + results[testKey].Add(descriptions[i]); + } + return results; + } + + 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 Tuple>> GetTuple(IFileRead fileRead, IEnumerable descriptions, bool extra = false) + { + Tuple>> result; + Dictionary> keyValuePairs = GetKeyValuePairs(descriptions.ToList()); + Test[] tests = (from l in keyValuePairs select l.Key).ToArray(); + fileRead.CheckTests(tests, extra); + result = new Tuple>>(tests, keyValuePairs); + return result; + } + + protected void Shared0449(string to, string[] exceptionLines) + { + if (_IsDuplicator) + CreateProgressDirectory(exceptionLines: null); + else + { + 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 void Shared1880(string itemFile, List directories, FileInfo sourceFile, bool isErrorFile) + { + string itemDirectory; + directories.Add(Path.GetDirectoryName(sourceFile.FullName)); + itemDirectory = Path.GetDirectoryName(itemFile); + FileConnectorConfiguration.PostProcessingModeEnum processingModeEnum; + if (!isErrorFile) + processingModeEnum = _FileConnectorConfiguration.PostProcessingMode.Value; + else + processingModeEnum = _FileConnectorConfiguration.ErrorPostProcessingMode.Value; + if (processingModeEnum != FileConnectorConfiguration.PostProcessingModeEnum.Delete && !Directory.Exists(itemDirectory)) + { + _ = Directory.CreateDirectory(itemDirectory); + FileInfo fileInfo = new(_Logistics.ReportFullPath); + Directory.SetCreationTime(itemDirectory, fileInfo.LastWriteTime); + } + if (_IsEAFHosted) + { + switch (processingModeEnum) + { + case FileConnectorConfiguration.PostProcessingModeEnum.Move: + File.Move(sourceFile.FullName, itemFile); + break; + case FileConnectorConfiguration.PostProcessingModeEnum.Copy: + File.Copy(sourceFile.FullName, itemFile); + break; + case FileConnectorConfiguration.PostProcessingModeEnum.Delete: + File.Delete(sourceFile.FullName); + break; + default: + throw new Exception(); + } + } + } + + protected void Shared1811(string to, FileInfo sourceFile) + { + if (!_IsDuplicator && _FileConnectorConfiguration.SourceFileFilter != "*" && sourceFile.Exists && sourceFile.Length < _MinFileLength) + { + string directoryName = Path.GetFileName(to); + string jobIdDirectory = Path.GetDirectoryName(to); + DateTime dateTime = DateTime.Now.AddMinutes(-15); + string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + string weekDirectory = string.Concat(_Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); + string destinationDirectory = string.Concat(jobIdDirectory, @"\_ Ignore 100 bytes\", weekDirectory, @"\", directoryName); + if (!Directory.Exists(destinationDirectory)) + _ = Directory.CreateDirectory(destinationDirectory); + File.Move(sourceFile.FullName, string.Concat(destinationDirectory, @"\", sourceFile.Name)); + try + { + string[] checkDirectories = Directory.GetDirectories(jobIdDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string checkDirectory in checkDirectories) + { + if (!checkDirectory.Contains('_')) + continue; + if (Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly).Any()) + continue; + if (Directory.GetFiles(checkDirectory, "*", SearchOption.TopDirectoryOnly).Any()) + continue; + if (Directory.GetDirectories(checkDirectory, "*", SearchOption.AllDirectories).Any()) + continue; + if (Directory.GetFiles(checkDirectory, "*", SearchOption.AllDirectories).Any()) + continue; + if (new DirectoryInfo(checkDirectory).CreationTime > dateTime) + continue; + Directory.Delete(checkDirectory, recursive: false); + } + } + catch (Exception) { throw; } + } + } + + protected void Shared0231(List directories) + { + if (_FileConnectorConfiguration.PostProcessingMode != FileConnectorConfiguration.PostProcessingModeEnum.Copy) + { + foreach (string directory in (from l in directories orderby l.Split('\\').Length descending select l).Distinct()) + { + if (Directory.Exists(directory) && !Directory.GetFiles(directory).Any()) + Directory.Delete(directory); + } + } + } + + protected void Shared0413(DateTime dateTime, bool isDummyRun, string successDirectory, string duplicateDirectory, List> tuples, string duplicateFile) + { + if (!isDummyRun && _IsEAFHosted) + WaitForFileConsumption(_FileConnectorConfiguration.SourceDirectoryCloaking, _Logistics, dateTime, successDirectory, duplicateDirectory, duplicateFile, tuples); + else + { + long breakAfter = DateTime.Now.AddSeconds(_FileConnectorConfiguration.ConnectionRetryInterval.Value).Ticks; + for (short i = 0; i < short.MaxValue; i++) + { + if (!_IsEAFHosted || DateTime.Now.Ticks > breakAfter) + break; + Thread.Sleep(500); + } + } + } + + protected static void Shared0607(string reportFullPath, string duplicateDirectory, string logisticsSequence, string destinationDirectory) + { + if (destinationDirectory == duplicateDirectory) + throw new Exception("Check Target File Folder for %LotIDWithLogisticsSequence%_in process on CI (not Duplicator)"); + if (destinationDirectory.EndsWith(logisticsSequence)) + destinationDirectory = Path.GetDirectoryName(destinationDirectory); + string[] deleteFiles = Directory.GetFiles(destinationDirectory, "*", SearchOption.AllDirectories); + if (deleteFiles.Length > 250) + throw new Exception("Safety net!"); + foreach (string file in deleteFiles) + File.Delete(file); + Directory.Delete(destinationDirectory, recursive: true); + File.Delete(reportFullPath); + } + + protected string[] Shared1567(string reportFullPath, List> tuples) + { + string[] results; + string historicalText; + string logisticsSequence = _Logistics.Sequence.ToString(); + string jobIdDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation)), @"\", _Logistics.JobID); + if (!Directory.Exists(jobIdDirectory)) + _ = Directory.CreateDirectory(jobIdDirectory); + string[] matchDirectories; + if (!_IsEAFHosted) + matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(reportFullPath)) }; + else + matchDirectories = Directory.GetDirectories(jobIdDirectory, string.Concat(_Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly); + if ((matchDirectories is null) || matchDirectories.Length != 1) + throw new Exception("Didn't find directory by logistics sequence"); + string fileName = Path.GetFileNameWithoutExtension(reportFullPath); + string sequenceDirectory = string.Concat(matchDirectories[0], @"\", logisticsSequence); + if (!Directory.Exists(sequenceDirectory)) + _ = Directory.CreateDirectory(sequenceDirectory); + foreach (Tuple tuple in tuples) + { + fileName = string.Concat(sequenceDirectory, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc"); + if (_IsEAFHosted) + File.WriteAllText(fileName, tuple.Item2); + else + { + if (File.Exists(fileName)) + { + historicalText = File.ReadAllText(fileName); + if (tuple.Item2 != historicalText) + throw new Exception("File doesn't match historical!"); + } + } + } + results = matchDirectories; + return results; + } + + protected void Shared1277(string reportFullPath, string destinationDirectory, string logisticsSequence, string jobIdDirectory, string json) + { + string ecCharacterizationSi = Path.GetDirectoryName(Path.GetDirectoryName(jobIdDirectory)); + string destinationJobIdDirectory = string.Concat(ecCharacterizationSi, @"\Processed\", _Logistics.JobID); + if (!Directory.Exists(destinationJobIdDirectory)) + _ = Directory.CreateDirectory(destinationJobIdDirectory); + destinationJobIdDirectory = string.Concat(destinationJobIdDirectory, @"\", Path.GetFileName(destinationDirectory).Split(new string[] { logisticsSequence }, StringSplitOptions.None)[0], _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd_hh;mm_tt_"), DateTime.Now.Ticks - _Logistics.Sequence); + string sequenceDirectory = string.Concat(destinationJobIdDirectory, @"\", logisticsSequence); + string jsonFileName = string.Concat(sequenceDirectory, @"\", Path.GetFileNameWithoutExtension(reportFullPath), ".json"); + Directory.Move(destinationDirectory, destinationJobIdDirectory); + if (!Directory.Exists(sequenceDirectory)) + _ = Directory.CreateDirectory(sequenceDirectory); + File.Copy(reportFullPath, string.Concat(sequenceDirectory, @"\", Path.GetFileName(reportFullPath)), overwrite: true); + File.WriteAllText(jsonFileName, json); + } + +} + +// 2022-02-14 -> Shared - FileRead \ No newline at end of file diff --git a/Adaptation/Shared/IProcessData.cs b/Adaptation/Shared/IProcessData.cs deleted file mode 100644 index e2159b1..0000000 --- a/Adaptation/Shared/IProcessData.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Adaptation.Shared.Metrology; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.Json; - -namespace Adaptation.Shared -{ - public interface IProcessData - { - - Tuple> GetResults(ILogic logic, ConfigDataBase configData, List fileInfoCollection); - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/IProcessDataDescription.cs b/Adaptation/Shared/IProcessDataDescription.cs deleted file mode 100644 index 82b5a5c..0000000 --- a/Adaptation/Shared/IProcessDataDescription.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Adaptation.Shared.Metrology; -using System.Collections.Generic; - -namespace Adaptation.Shared -{ - - public interface IProcessDataDescription - { - - int Test { get; set; } - int Count { get; set; } - int Index { get; set; } - IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase); - IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase); - List GetDescription(ILogic logic, ConfigDataBase configDataBase, List tests, IProcessData iProcessData); - List GetDetailNames(ILogic logic, ConfigDataBase configDataBase); - List GetHeaderNames(ILogic logic, ConfigDataBase configDataBase); - List GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test); - List GetNames(ILogic logic, ConfigDataBase configDataBase); - List GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase); - List GetParameterNames(ILogic logic, ConfigDataBase configDataBase); - string GetEventDescription(); - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/IQSRecord.cs b/Adaptation/Shared/IQSRecord.cs deleted file mode 100644 index ed7800e..0000000 --- a/Adaptation/Shared/IQSRecord.cs +++ /dev/null @@ -1,239 +0,0 @@ -using Adaptation.Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Adaptation.Shared -{ - - public class IQSRecord - { - - public string SID { get; protected set; } - public string Part { get; protected set; } - public string Process { get; protected set; } - public string Lot { get; protected set; } - public string SampleSize { get; protected set; } - public string ParameterName { get; protected set; } - public string TestNumber { get; protected set; } - public string ParameterValue { get; protected set; } - public string WaferID { get; protected set; } - public string WaferScribe { get; protected set; } - public string Pocket { get; protected set; } - public string EpiThicknessMean { get; protected set; } - public string WaferRegion { get; protected set; } - public string ToolID { get; protected set; } - public string EmployeeID { get; protected set; } - public string EmployeeName { get; protected set; } - public string Date { get; protected set; } - public Column Column { get; protected set; } - - public IQSRecord(object sID, object part, object process, object lot, object sampleSize, object parameterName, object testNumber, object parameterValue, object waferID, object waferScribe, object pocket, object epiThicknessMean, object waferRegion, object toolID, object employeeID, object employeeName, object date, Dictionary keyValuePairs) - { - if (sID is null) - SID = string.Empty; - else - SID = sID.ToString(); - if (part is null) - Part = string.Empty; - else - Part = part.ToString(); - if (process is null) - Process = string.Empty; - else - Process = process.ToString(); - if (lot is null) - Lot = string.Empty; - else - Lot = lot.ToString(); - if (sampleSize is null) - SampleSize = string.Empty; - else - SampleSize = sampleSize.ToString(); - if (parameterName is null) - ParameterName = string.Empty; - else - ParameterName = parameterName.ToString(); - if (testNumber is null) - TestNumber = string.Empty; - else - TestNumber = testNumber.ToString(); - if (parameterValue is null) - ParameterValue = string.Empty; - else - ParameterValue = parameterValue.ToString(); - if (waferID is null) - WaferID = string.Empty; - else - WaferID = waferID.ToString(); - if (waferScribe is null) - WaferScribe = string.Empty; - else - WaferScribe = waferScribe.ToString(); - if (pocket is null) - Pocket = string.Empty; - else - Pocket = pocket.ToString(); - if (epiThicknessMean is null) - EpiThicknessMean = string.Empty; - else - EpiThicknessMean = epiThicknessMean.ToString(); - if (waferRegion is null) - WaferRegion = string.Empty; - else - WaferRegion = waferRegion.ToString(); - if (toolID is null) - ToolID = string.Empty; - else - ToolID = toolID.ToString(); - if (employeeID is null) - EmployeeID = string.Empty; - else - EmployeeID = employeeID.ToString(); - if (employeeName is null) - EmployeeName = string.Empty; - else - EmployeeName = employeeName.ToString(); - if (date is null) - Date = string.Empty; - else - Date = date.ToString(); - if (parameterName is null || !keyValuePairs.ContainsKey(parameterName.ToString())) - Column = Column.AFM_Roughness; - else - Column = keyValuePairs[parameterName.ToString()]; - } - - private static string GetBaseTableJoins() - { - StringBuilder result = new StringBuilder(); - result.Append(" from [irmnspc].[dbo].sgrp_ext se "). - Append(" join [irmnspc].[dbo].test_dat td on se.f_test = td.f_test "). - Append(" join [irmnspc].[dbo].part_dat pd on se.f_part = pd.f_part "). - Append(" join [irmnspc].[dbo].part_lot pl on se.f_lot = pl.f_lot "). - Append(" join [irmnspc].[dbo].prcs_dat pr on se.f_prcs = pr.f_prcs "). - Append(" join [irmnspc].[dbo].empl_inf em on se.f_empl = em.f_empl "); - return result.ToString(); - } - - internal static StringBuilder GetIqsRecordsSinceSql() - { - StringBuilder result = new StringBuilder(); - result.Append(" select "). - Append(" se.f_sgrp [sid], concat(se.f_sgrp, ', ', td.f_name, ', ', pd.f_name, ', ', pl.f_name, ', ', pr.f_name, ', ', em.f_name, ', ', se.f_sgtm) [csv] "). - Append(GetBaseTableJoins()). - Append(" where se.f_sgrp >= 1543459064 "). - Append(" and se.f_sgrp > ( @lastSID - 20 ) "). - Append(" /* and dateadd(hh, -7, (dateadd(ss, convert(bigint, se.f_sgtm), '19700101'))) >= '2019-08-25 00:00:00.000' */ "). - Append(" and td.f_name = @key "). - Append(" group by se.f_sgrp, td.f_name, pd.f_name, pl.f_name, pr.f_name, em.f_name, se.f_sgtm "). - Append(" order by se.f_sgrp, pd.f_name, td.f_name "); - return result; - } - - internal static StringBuilder GetIqsRecordsSql() - { - StringBuilder result = new StringBuilder(); - result.Append(" select "). - Append(" ta.id [SID], "). - Append(" ta.ms [Part], "). - Append(" ta.pr [Process], "). - Append(" ta.lt [Lot], "). - Append(" ta.sz [Sample Size], "). - Append(" ta.pn [Parameter Name], "). - Append(" ta.tn [Test Number], "). - Append(" ta.pv [Parameter Value], "). - Append(" tb.v1337859646 [Wafer ID], "). - Append(" tb.v1337859592 [Wafer Scribe], "). - Append(" tb.v1342510661 [Pocket], "). - Append(" tb.v1340294286 [Epi Thickness Mean], "). - Append(" tb.v1345566180 [Wafer Region], "). - Append(" tb.v1363881711 [Tool ID], "). - Append(" ta.em [Employee ID], "). - Append(" ta.en [Employee Name], "). - Append(" ta.dt [Date] "). - Append(" from ( "). - Append(" select "). - Append(" se.f_sgrp id, "). - Append(" se.f_sgsz sz, "). - Append(" concat(se.f_tsno, '.', se.f_sbno) tn, "). - Append(" se.f_val pv, "). - Append(" se.f_empl em, "). - Append(" dateadd(hh, -7, (dateadd(ss, convert(bigint, se.f_sgtm), '19700101'))) dt, "). - Append(" td.f_name pn, "). - Append(" pd.f_name as ms, "). - Append(" pl.f_name lt, "). - Append(" pr.f_name pr, "). - Append(" em.f_name en "). - Append(GetBaseTableJoins()). - Append(" where se.f_sgrp = @sid "). - Append(" ) as ta "). - Append(" join ( "). - Append(" select "). - Append(" se.f_sgrp id, "). - Append(" max(case when dd.f_dsgp = 1337859646 then dd.f_name end) as v1337859646, "). - Append(" max(case when dd.f_dsgp = 1337859592 then dd.f_name end) as v1337859592, "). - Append(" max(case when dd.f_dsgp = 1342510661 then dd.f_name end) as v1342510661, "). - Append(" max(case when dd.f_dsgp = 1340294286 then dd.f_name end) as v1340294286, "). - Append(" max(case when dd.f_dsgp = 1345566180 then dd.f_name end) as v1345566180, "). - Append(" max(case when dd.f_dsgp = 1363881711 then dd.f_name end) as v1363881711 "). - Append(" from [irmnspc].[dbo].sgrp_ext se "). - Append(" join [irmnspc].[dbo].test_dat td on se.f_test = td.f_test "). - Append(" join [irmnspc].[dbo].sgrp_dsc sd on se.f_sgrp = sd.f_sgrp "). - Append(" join [irmnspc].[dbo].desc_dat dd on sd.f_desc = dd.f_desc "). - Append(" and isnull(dd.f_name, '') <> '' "). - Append(" where se.f_sgrp = @sid "). - Append(" and dd.f_dsgp in (1337859646 /* Wafer ID */, 1337859592 /* Wafer Scribe */, 1342510661 /* Pocket */, 1340294286 /* Epi Thickness Mean */, 1345566180 /* Wafer Region */, 1363881711 /* Tool ID */) "). - Append(" group by se.f_sgrp "). - Append(" ) tb on ta.id = tb.id "). - Append(" order by ta.id desc, ta.ms, ta.pr, ta.lt, ta.sz, ta.tn, ta.dt, ta.pn "); - return result; - } - - internal static List GetIqsRecords(Dictionary> rawData, int count) - { - List results = new List(); - IQSRecord iqsRecord; - List c0 = rawData[0]; - List c1 = rawData[1]; - List c2 = rawData[2]; - List c3 = rawData[3]; - List c4 = rawData[4]; - List c5 = rawData[5]; - List c6 = rawData[6]; - List c7 = rawData[7]; - List c8 = rawData[8]; - List c9 = rawData[9]; - List cA = rawData[10]; - List cB = rawData[11]; - List cC = rawData[12]; - List cD = rawData[13]; - List cE = rawData[14]; - List cF = rawData[15]; - List cG = rawData[16]; - if (c0.Any()) - { - Array array = Enum.GetValues(typeof(Column)); - Dictionary keyValuePairs = new Dictionary(); - foreach (Column column in array) - keyValuePairs.Add(column.GetDiplayName(), column); - for (int i = 0; i < c0.Count; i++) - { - iqsRecord = new IQSRecord(c0[i], c1[i], c2[i], c3[i], c4[i], c5[i], c6[i], c7[i], c8[i], c9[i], cA[i], cB[i], cC[i], cD[i], cE[i], cF[i], cG[i], keyValuePairs); - results.Add(iqsRecord); - } - } - return results; - } - - public override string ToString() - { - //(1337859646 /* Wafer ID */, 1337859592 /* Wafer Scribe */, 1342510661 /* Pocket */, 1340294286 /* Epi Thickness Mean */, 1345566180 /* Wafer Region */, 1363881711 /* Tool ID */) "). - //return string.Concat(SID, Part, Process, Lot, SampleSize, TestNumber, WaferID, WaferScribe, Pocket, EpiThicknessMean, WaferRegion, ToolID, EmployeeID, EmployeeName, Date); - return string.Concat(SID, Part, Process, Lot, SampleSize, TestNumber, EmployeeID, EmployeeName, Date); - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/IScopeInfo.cs b/Adaptation/Shared/IScopeInfo.cs deleted file mode 100644 index 83b91dc..0000000 --- a/Adaptation/Shared/IScopeInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace Adaptation.Shared -{ - - public interface IScopeInfo - { - - Enum Enum { get; } - string HTML { get; } - string Title { get; } - string FileName { get; } - int TestValue { get; } - string Header { get; } - string QueryFilter { get; } - string FileNameWithoutExtension { get; } - EquipmentType EquipmentType { get; } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/IsEnvironment.cs b/Adaptation/Shared/IsEnvironment.cs deleted file mode 100644 index c24b236..0000000 --- a/Adaptation/Shared/IsEnvironment.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; - -namespace Shared -{ - - public class IsEnvironment - { - - public enum Name - { - LinuxDevelopment, - LinuxProduction, - LinuxStaging, - OSXDevelopment, - OSXProduction, - OSXStaging, - WindowsDevelopment, - WindowsProduction, - WindowsStaging - } - - public bool DebuggerWasAttachedDuringConstructor { get; private set; } - public bool Development { get; private set; } - public bool Linux { get; private set; } - public bool OSX { get; private set; } - public bool Production { get; private set; } - public bool Staging { get; private set; } - public bool Windows { get; private set; } - public string Profile { get; private set; } - public string AppSettingsFileName { get; private set; } - public string ASPNetCoreEnvironment { get; private set; } - - public IsEnvironment(string testCategory) - { - if (testCategory.EndsWith(".json")) - { - Production = testCategory == "appsettings.json"; - Staging = testCategory.EndsWith(nameof(Staging)); - OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - Development = testCategory.EndsWith(nameof(Development)); - Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; - Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - } - else - { - DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; - OSX = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(OSX)); - ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - Linux = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Linux)); - Staging = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Staging)); - Windows = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Windows)); - Production = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Production)); - Development = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Development)); - } - Profile = GetProfile(); - AppSettingsFileName = GetAppSettingsFileName(processesCount: null); - } - - public IsEnvironment(bool isDevelopment, bool isStaging, bool isProduction) - { - Staging = isStaging; - Production = isProduction; - Development = isDevelopment; - OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; - Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - Profile = GetProfile(); - AppSettingsFileName = GetAppSettingsFileName(processesCount: null); - } - - public IsEnvironment(int? processesCount, bool nullASPNetCoreEnvironmentIsDevelopment, bool nullASPNetCoreEnvironmentIsProduction) - { - OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; - Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - if (nullASPNetCoreEnvironmentIsDevelopment && nullASPNetCoreEnvironmentIsProduction) - throw new Exception(); - else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsProduction) - Production = true; - else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsDevelopment) - Development = true; - else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && !nullASPNetCoreEnvironmentIsDevelopment && !nullASPNetCoreEnvironmentIsProduction) - throw new Exception(); - else - { - Staging = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Staging)); - Production = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Production)); - Development = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Development)); - } - Profile = GetProfile(); - AppSettingsFileName = GetAppSettingsFileName(processesCount); - } - - private string GetProfile() - { - string result; - if (Windows && Production) - result = nameof(Production); - else if (Windows && Staging) - result = nameof(Staging); - else if (Windows && Development) - result = nameof(Development); - else if (Linux && Production) - result = nameof(Name.LinuxProduction); - else if (Linux && Staging) - result = nameof(Name.LinuxStaging); - else if (Linux && Development) - result = nameof(Name.LinuxDevelopment); - else if (OSX && Production) - result = nameof(Name.OSXProduction); - else if (OSX && Staging) - result = nameof(Name.OSXStaging); - else if (OSX && Development) - result = nameof(Name.OSXDevelopment); - else - throw new Exception(); - return result; - } - - private string GetAppSettingsFileName(int? processesCount) - { - string result; - if (Production) - { - if (processesCount is null) - result = "appsettings.json"; - else - result = $"appsettings.{processesCount}.json"; - } - else - { - string environment; - if (Staging) - environment = nameof(Staging); - else if (Development) - environment = nameof(Development); - else - throw new Exception(); - if (processesCount is null) - result = $"appsettings.{environment}.json"; - else - result = $"appsettings.{environment}.{processesCount}.json"; - } - return result; - } - - public static string GetEnvironmentName(IsEnvironment isEnvironment) - { - string result; - if (isEnvironment.Windows) - result = nameof(IsEnvironment.Windows); - else if (isEnvironment.Linux) - result = nameof(IsEnvironment.Linux); - else if (isEnvironment.OSX) - result = nameof(IsEnvironment.OSX); - else - throw new Exception(); - return result; - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Logistics.cs b/Adaptation/Shared/Logistics.cs index 89aacac..c441b3f 100644 --- a/Adaptation/Shared/Logistics.cs +++ b/Adaptation/Shared/Logistics.cs @@ -1,244 +1,208 @@ -using System; +using Adaptation.Shared.Methods; +using System; using System.Collections.Generic; using System.IO; using System.Linq; -namespace Adaptation.Shared +namespace Adaptation.Shared; + +public class Logistics : ILogistics { - public class Logistics + public object NullData { get; private set; } + public string JobID { get; private set; } //CellName + public long Sequence { get; private set; } //Ticks + public DateTime DateTimeFromSequence { get; private set; } + public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; } + public string MesEntity { get; private set; } //SPC + public string ReportFullPath { get; private set; } //Extract file + public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics) + public string MID { get; set; } //Lot & Pocket || Lot + public List Tags { get; set; } + public List Logistics1 { get; set; } + public List Logistics2 { get; set; } + + public Logistics(IFileRead fileRead) { + DateTime dateTime = DateTime.Now; + NullData = null; + Sequence = dateTime.Ticks; + DateTimeFromSequence = dateTime; + JobID = fileRead.CellInstanceName; + TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + MesEntity = DefaultMesEntity(dateTime); + ReportFullPath = string.Empty; + ProcessJobID = nameof(ProcessJobID); + MID = nameof(MID); + Tags = new List(); + Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); + Logistics2 = new List(); + } - public object NullData { get; private set; } - public string JobID { get; private set; } //CellName - public long Sequence { get; private set; } //Ticks - public DateTime DateTimeFromSequence { get; private set; } - public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; } - public string MesEntity { get; private set; } //SPC - public string ReportFullPath { get; private set; } //Extract file - public string ProcessJobID { get; internal set; } //Reactor (duplicate but I want it in the logistics) - public string MID { get; internal set; } //Lot & Pocket || Lot - public List Tags { get; internal set; } - public List Logistics1 { get; internal set; } - public List Logistics2 { get; internal set; } - - public Logistics() + public Logistics(IFileRead fileRead, string reportFullPath, bool useSplitForMID, int? fileInfoLength = null) + { + if (string.IsNullOrEmpty(fileRead.CellInstanceName)) + throw new Exception(); + if (string.IsNullOrEmpty(fileRead.MesEntity)) + throw new Exception(); + NullData = fileRead.NullData; + FileInfo fileInfo = new(reportFullPath); + DateTime dateTime = fileInfo.LastWriteTime; + if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value) + dateTime = dateTime.AddTicks(-1); + JobID = fileRead.CellInstanceName; + Sequence = dateTime.Ticks; + DateTimeFromSequence = dateTime; + TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + MesEntity = fileRead.MesEntity; + ReportFullPath = fileInfo.FullName; + ProcessJobID = nameof(ProcessJobID); + string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); + if (useSplitForMID) + { + if (fileNameWithoutExtension.IndexOf(".") > -1) + fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim(); + if (fileNameWithoutExtension.IndexOf("_") > -1) + fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim(); + if (fileNameWithoutExtension.IndexOf("-") > -1) + fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim(); + } + MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower()); + Tags = new List(); + Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); + Logistics2 = new List(); + } + + public Logistics(string reportFullPath, string logistics) + { + string key; + DateTime dateTime; + string[] segments; + Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); + if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1")) { - DateTime dateTime = DateTime.Now; NullData = null; - JobID = Description.GetCellName(); + JobID = "null"; + dateTime = new FileInfo(reportFullPath).LastWriteTime; Sequence = dateTime.Ticks; DateTimeFromSequence = dateTime; TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; MesEntity = DefaultMesEntity(dateTime); - ReportFullPath = string.Empty; - ProcessJobID = nameof(ProcessJobID); - MID = nameof(MID); + ReportFullPath = reportFullPath; + ProcessJobID = "R##"; + MID = "null"; Tags = new List(); Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); Logistics2 = new List(); } - - public Logistics(object nullData, Dictionary cellNames, Dictionary mesEntities, FileInfo fileInfo, bool useSplitForMID, int? fileInfoLength = null) + else { - NullData = nullData; - string mesEntity = string.Empty; - string jobID = Description.GetCellName(); - DateTime dateTime = fileInfo.LastWriteTime; - if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value) - dateTime = dateTime.AddTicks(-1); - if (string.IsNullOrEmpty(jobID)) + string logistics1Line1 = Logistics1[0]; + key = "NULL_DATA="; + if (!logistics1Line1.Contains(key)) + NullData = null; + else { - if (cellNames.Count == 1) - jobID = cellNames.ElementAt(0).Key; - else - { - foreach (var element in cellNames) - { - if (fileInfo.FullName.IndexOf(element.Key, StringComparison.OrdinalIgnoreCase) > -1 || fileInfo.FullName.IndexOf(element.Value, StringComparison.OrdinalIgnoreCase) > -1) - { - jobID = element.Key; - break; - } - } - } + segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + NullData = segments[1].Split(';')[0]; + } + key = "JOBID="; + if (!logistics1Line1.Contains(key)) + JobID = "null"; + else + { + segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + JobID = segments[1].Split(';')[0]; + } + key = "SEQUENCE="; + if (!logistics1Line1.Contains(key)) + dateTime = new FileInfo(reportFullPath).LastWriteTime; + else + { + segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks) + dateTime = new FileInfo(reportFullPath).LastWriteTime; + else + dateTime = new DateTime(sequence); } - if (string.IsNullOrEmpty(jobID)) - throw new Exception(); - if (mesEntities.ContainsKey(jobID)) - mesEntity = mesEntities[jobID]; - else if (mesEntities.Count == 1) - mesEntity = mesEntities.ElementAt(0).Value; - // - if (string.IsNullOrEmpty(mesEntity)) - throw new Exception(); - JobID = jobID; Sequence = dateTime.Ticks; DateTimeFromSequence = dateTime; TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; - MesEntity = mesEntity; - ReportFullPath = fileInfo.FullName; - ProcessJobID = nameof(ProcessJobID); - string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); - if (useSplitForMID) + DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime; + if (TotalSecondsSinceLastWriteTimeFromSequence > 600) { - if (fileNameWithoutExtension.IndexOf(".") > -1) - fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim(); - if (fileNameWithoutExtension.IndexOf("_") > -1) - fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim(); - if (fileNameWithoutExtension.IndexOf("-") > -1) - fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim(); + if (lastWriteTime != dateTime) + try + { File.SetLastWriteTime(reportFullPath, dateTime); } + catch (Exception) { } } - MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower()); - Tags = new List(); - Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); - Logistics2 = new List(); - } - - public Logistics(string reportFullPath, string logistics) - { - string key; - DateTime dateTime; - string[] segments; - Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); - if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1")) - { - NullData = null; - JobID = "null"; - dateTime = new FileInfo(reportFullPath).LastWriteTime; - Sequence = dateTime.Ticks; - DateTimeFromSequence = dateTime; - TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + key = "MES_ENTITY="; + if (!logistics1Line1.Contains(key)) MesEntity = DefaultMesEntity(dateTime); - ReportFullPath = reportFullPath; - ProcessJobID = "R##"; - MID = "null"; - Tags = new List(); - Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); - Logistics2 = new List(); - } else { - string logistics1Line1 = Logistics1[0]; - key = "NULL_DATA="; - if (!logistics1Line1.Contains(key)) - NullData = null; - else - { - segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - NullData = segments[1].Split(';')[0]; - } - key = "JOBID="; - if (!logistics1Line1.Contains(key)) - JobID = "null"; - else - { - segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - JobID = segments[1].Split(';')[0]; - } - key = "SEQUENCE="; - if (!logistics1Line1.Contains(key)) - dateTime = new FileInfo(reportFullPath).LastWriteTime; - else - { - segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks) - dateTime = new FileInfo(reportFullPath).LastWriteTime; - else - dateTime = new DateTime(sequence); - } - Sequence = dateTime.Ticks; - DateTimeFromSequence = dateTime; - TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; - DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime; - if (TotalSecondsSinceLastWriteTimeFromSequence > 600) - { - if (lastWriteTime != dateTime) - try - { File.SetLastWriteTime(reportFullPath, dateTime); } - catch (Exception) { } - } - key = "MES_ENTITY="; - if (!logistics1Line1.Contains(key)) - MesEntity = DefaultMesEntity(dateTime); - else - { - segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - MesEntity = segments[1].Split(';')[0]; - } - ReportFullPath = reportFullPath; - key = "PROCESS_JOBID="; - if (!logistics1Line1.Contains(key)) - ProcessJobID = "R##"; - else - { - segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - ProcessJobID = segments[1].Split(';')[0]; - } - key = "MID="; - if (!logistics1Line1.Contains(key)) - MID = "null"; - else - { - segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - MID = segments[1].Split(';')[0]; - } + segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + MesEntity = segments[1].Split(';')[0]; } - Logistics2 logistics2; - Tags = new List(); - Logistics2 = new List(); - for (int i = 1; i < Logistics1.Count(); i++) + ReportFullPath = reportFullPath; + key = "PROCESS_JOBID="; + if (!logistics1Line1.Contains(key)) + ProcessJobID = "R##"; + else { - if (Logistics1[i].StartsWith("LOGISTICS_2")) - { - logistics2 = new Logistics2(Logistics1[i]); - Logistics2.Add(logistics2); - } + segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + ProcessJobID = segments[1].Split(';')[0]; } - for (int i = Logistics1.Count() - 1; i > -1; i--) + key = "MID="; + if (!logistics1Line1.Contains(key)) + MID = "null"; + else { - if (Logistics1[i].StartsWith("LOGISTICS_2")) - Logistics1.RemoveAt(i); + segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + MID = segments[1].Split(';')[0]; } } - - public Logistics ShallowCopy() + Logistics2 logistics2; + Tags = new List(); + Logistics2 = new List(); + for (int i = 1; i < Logistics1.Count; i++) { - return (Logistics)MemberwiseClone(); + if (Logistics1[i].StartsWith("LOGISTICS_2")) + { + logistics2 = new Logistics2(Logistics1[i]); + Logistics2.Add(logistics2); + } } - - private string DefaultMesEntity(DateTime dateTime) + for (int i = Logistics1.Count - 1; i > -1; i--) { - return string.Concat(dateTime.Ticks, "_MES_ENTITY"); - } - - internal string GetLotViaMostCommonMethod() - { - return MID.Substring(0, MID.Length - 2); - } - - internal string GetPocketNumberViaMostCommonMethod() - { - return MID.Substring(MID.Length - 2); - } - - internal void Update(string dateTime, string processJobID, string mid) - { - if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted)) - dateTimeCasted = DateTime.Now; - NullData = null; - //JobID = Description.GetCellName(); - Sequence = dateTimeCasted.Ticks; - DateTimeFromSequence = dateTimeCasted; - TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds; - //MesEntity = DefaultMesEntity(dateTime); - //ReportFullPath = string.Empty; - ProcessJobID = processJobID; - MID = mid; - Tags = new List(); - Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); - Logistics2 = new List(); + if (Logistics1[i].StartsWith("LOGISTICS_2")) + Logistics1.RemoveAt(i); } } + public Logistics ShallowCopy() => (Logistics)MemberwiseClone(); + + private static string DefaultMesEntity(DateTime dateTime) => string.Concat(dateTime.Ticks, "_MES_ENTITY"); + + internal string GetLotViaMostCommonMethod() => MID.Substring(0, MID.Length - 2); + + internal string GetPocketNumberViaMostCommonMethod() => MID.Substring(MID.Length - 2); + + internal void Update(string dateTime, string processJobID, string mid) + { + if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted)) + dateTimeCasted = DateTime.Now; + NullData = null; + //JobID = Description.GetCellName(); + Sequence = dateTimeCasted.Ticks; + DateTimeFromSequence = dateTimeCasted; + TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds; + //MesEntity = DefaultMesEntity(dateTime); + //ReportFullPath = string.Empty; + ProcessJobID = processJobID; + MID = mid; + Tags = new List(); + Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); + Logistics2 = new List(); + } } \ No newline at end of file diff --git a/Adaptation/Shared/Logistics2.cs b/Adaptation/Shared/Logistics2.cs index 0f0f2f2..a067258 100644 --- a/Adaptation/Shared/Logistics2.cs +++ b/Adaptation/Shared/Logistics2.cs @@ -1,80 +1,78 @@ using System; -namespace Adaptation.Shared +namespace Adaptation.Shared; + +public class Logistics2 : Methods.ILogistics2 { - public class Logistics2 + + public string MID { get; private set; } + public string RunNumber { get; private set; } + public string SatelliteGroup { get; private set; } + public string PartNumber { get; private set; } + public string PocketNumber { get; private set; } + public string WaferLot { get; private set; } + public string Recipe { get; private set; } + + public Logistics2(string logistics2) { - - public string MID { get; private set; } - public string RunNumber { get; private set; } - public string SatelliteGroup { get; private set; } - public string PartNumber { get; private set; } - public string PocketNumber { get; private set; } - public string WaferLot { get; private set; } - public string Recipe { get; private set; } - - public Logistics2(string logistics2) + string key; + string[] segments; + key = "JOBID="; + if (!logistics2.Contains(key)) + MID = "null"; + else { - string key; - string[] segments; - key = "JOBID="; - if (!logistics2.Contains(key)) - MID = "null"; - else - { - segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - MID = segments[1].Split(';')[0]; - } - key = "MID="; - if (!logistics2.Contains(key)) - RunNumber = "null"; - else - { - segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - RunNumber = segments[1].Split(';')[0]; - } - key = "INFO="; - if (!logistics2.Contains(key)) - SatelliteGroup = "null"; - else - { - segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - SatelliteGroup = segments[1].Split(';')[0]; - } - key = "PRODUCT="; - if (!logistics2.Contains(key)) - PartNumber = "null"; - else - { - segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - PartNumber = segments[1].Split(';')[0]; - } - key = "CHAMBER="; - if (!logistics2.Contains(key)) - PocketNumber = "null"; - else - { - segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - PocketNumber = segments[1].Split(';')[0]; - } - key = "WAFER_ID="; - if (!logistics2.Contains(key)) - WaferLot = "null"; - else - { - segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - WaferLot = segments[1].Split(';')[0]; - } - key = "PPID="; - if (!logistics2.Contains(key)) - Recipe = "null"; - else - { - segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); - Recipe = segments[1].Split(';')[0]; - } + segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + MID = segments[1].Split(';')[0]; + } + key = "MID="; + if (!logistics2.Contains(key)) + RunNumber = "null"; + else + { + segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + RunNumber = segments[1].Split(';')[0]; + } + key = "INFO="; + if (!logistics2.Contains(key)) + SatelliteGroup = "null"; + else + { + segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + SatelliteGroup = segments[1].Split(';')[0]; + } + key = "PRODUCT="; + if (!logistics2.Contains(key)) + PartNumber = "null"; + else + { + segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + PartNumber = segments[1].Split(';')[0]; + } + key = "CHAMBER="; + if (!logistics2.Contains(key)) + PocketNumber = "null"; + else + { + segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + PocketNumber = segments[1].Split(';')[0]; + } + key = "WAFER_ID="; + if (!logistics2.Contains(key)) + WaferLot = "null"; + else + { + segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + WaferLot = segments[1].Split(';')[0]; + } + key = "PPID="; + if (!logistics2.Contains(key)) + Recipe = "null"; + else + { + segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); + Recipe = segments[1].Split(';')[0]; } - } } \ No newline at end of file diff --git a/Adaptation/Shared/Methods/IDescription.cs b/Adaptation/Shared/Methods/IDescription.cs new file mode 100644 index 0000000..30dc635 --- /dev/null +++ b/Adaptation/Shared/Methods/IDescription.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Text.Json; + +namespace Adaptation.Shared.Methods; + +public interface IDescription +{ + + string GetEventDescription(); + List GetDetailNames(); + List GetHeaderNames(); + IDescription GetDisplayNames(); + List GetParameterNames(); + List GetPairedParameterNames(); + List GetIgnoreParameterNames(Test test); + List GetNames(IFileRead fileRead, Logistics logistics); + JsonProperty[] GetDefault(IFileRead fileRead, Logistics logistics); + Dictionary GetDisplayNamesJsonElement(IFileRead fileRead); + IDescription GetDefaultDescription(IFileRead fileRead, Logistics logistics); + List GetDescriptions(IFileRead fileRead, Logistics logistics, List tests, IProcessData iProcessData); + +} \ No newline at end of file diff --git a/Adaptation/Shared/Methods/IFileRead.cs b/Adaptation/Shared/Methods/IFileRead.cs new file mode 100644 index 0000000..13c2379 --- /dev/null +++ b/Adaptation/Shared/Methods/IFileRead.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.Json; + +namespace Adaptation.Shared.Methods; + +public interface IFileRead : Properties.IFileRead +{ + + void WaitForThread(); + JsonProperty[] GetDefault(); + void Callback(object state); + string GetEventDescription(); + List GetHeaderNames(); + void CheckTests(Test[] tests, bool extra); + Dictionary GetDisplayNamesJsonElement(); + Tuple> ReExtract(); + List GetDescriptions(IFileRead fileRead, List tests, IProcessData processData); + void Move(Tuple> extractResults, Exception exception = null); + Tuple> GetExtractResult(string reportFullPath, string eventName); + string[] Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception); + +} \ No newline at end of file diff --git a/Adaptation/Shared/Methods/ILogistics.cs b/Adaptation/Shared/Methods/ILogistics.cs new file mode 100644 index 0000000..ea9ca27 --- /dev/null +++ b/Adaptation/Shared/Methods/ILogistics.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Shared.Methods; + +public interface ILogistics : Properties.ILogistics +{ +} \ No newline at end of file diff --git a/Adaptation/Shared/Methods/ILogistics2.cs b/Adaptation/Shared/Methods/ILogistics2.cs new file mode 100644 index 0000000..35b9e57 --- /dev/null +++ b/Adaptation/Shared/Methods/ILogistics2.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Shared.Methods; + +public interface ILogistics2 : Properties.ILogistics2 +{ +} \ No newline at end of file diff --git a/Adaptation/Shared/Methods/IProcessData.cs b/Adaptation/Shared/Methods/IProcessData.cs new file mode 100644 index 0000000..e3fdeab --- /dev/null +++ b/Adaptation/Shared/Methods/IProcessData.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.Json; + +namespace Adaptation.Shared.Methods; + +public interface IProcessData : Properties.IProcessData +{ + + string GetCurrentReactor(IFileRead fileRead, Logistics logistics, Dictionary reactors); + Tuple> GetResults(IFileRead fileRead, Logistics logistics, List fileInfoCollection); + +} \ No newline at end of file diff --git a/Adaptation/Shared/Methods/ISMTP.cs b/Adaptation/Shared/Methods/ISMTP.cs new file mode 100644 index 0000000..378da64 --- /dev/null +++ b/Adaptation/Shared/Methods/ISMTP.cs @@ -0,0 +1,8 @@ +namespace Adaptation.Shared.Methods; + +public interface ISMTP +{ + void SendLowPriorityEmailMessage(string subject, string body); + void SendHighPriorityEmailMessage(string subject, string body); + void SendNormalPriorityEmailMessage(string subject, string body); +} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/Column.cs b/Adaptation/Shared/Metrology/Column.cs deleted file mode 100644 index b03e6fe..0000000 --- a/Adaptation/Shared/Metrology/Column.cs +++ /dev/null @@ -1,1605 +0,0 @@ -using System; - -namespace Adaptation.Shared.Metrology -{ - - public static class ColumnGet - { - - public static string GetDiplayName(this Column column) - { - string results; - switch (column) - { - //case Column._8in_Total_Warp_Verification: results = "8in Total Warp Verification"; break; - //case Column.AFM_Monthly_Y: results = "AFM-Monthly Y"; break; - //case Column.AFM_Monthly: results = "AFM_Monthly"; break; - case Column.AFM_Pit_Count: - results = "AFM Pit Count"; - break; - case Column.AFM_Roughness: - results = "AFM Roughness"; - break; - //case Column.Adder_Bin_1: results = "Adder Bin 1"; break; - //case Column.Adder_Bin_2: results = "Adder Bin 2"; break; - //case Column.Adder_Bin_3: results = "Adder Bin 3"; break; - //case Column.Adder_Bin_4: results = "Adder Bin 4"; break; - //case Column.Adder_Bin_5: results = "Adder Bin 5"; break; - //case Column.Adder_Bin_6: results = "Adder Bin 6"; break; - //case Column.Adder_Bin_9: results = "Adder Bin 9"; break; - case Column.Al_B_B_WTAVG: - results = "Al% B.B. WTAVG"; - break; - case Column.Al_B_B_: - results = "Al% B.B."; - break; - case Column.Al_Barrier_WTAVG: - results = "Al% Barrier WTAVG"; - break; - case Column.Al_Barrier: - results = "Al% Barrier"; - break; - case Column.Al_SLS_WTAVG: - results = "Al% SLS WTAVG"; - break; - case Column.Al_SLS: - results = "Al% SLS"; - break; - case Column.Al_TL1_WTAVG: - results = "Al% TL1 WTAVG"; - break; - case Column.Al_TL1: - results = "Al% TL1"; - break; - case Column.Al_TL2_WTAVG: - results = "Al% TL2 WTAVG"; - break; - //case Column.BV_Resistance: results = "BV Resistance"; break; //BV Monthly Verification - case Column.BandEdge_V: - results = "BandEdge_V"; - break; - case Column.BandEdge_V_XY: - results = "BandEdge_V_XY"; - break; - case Column.BandEdge_nm: - results = "BandEdge_nm"; - break; - case Column.Barrier_Composition_RPM_XY: - results = "Barrier_Composition_RPM_XY"; - break; - case Column.Bow_Calibration: - results = "Bow Calibration"; - break; - case Column.Bow_Range: - results = "Bow Range"; - break; - case Column.Bow: - results = "Bow"; - break; - case Column.BowCenter: - results = "BowCenter"; - break; - case Column.BowX: - results = "BowX"; - break; - case Column.BowY: - results = "BowY"; - break; - case Column.Breakdown_Voltage_Edge: - results = "Breakdown Voltage - Edge"; - break; - case Column.Breakdown_VoltageMiddle: - results = "Breakdown Voltage - Middle"; - break; - case Column.Breakdown_Voltage: - results = "Breakdown Voltage"; - break; - case Column.CV_C_at_10V: - results = "CV C at -10V"; - break; - case Column.CV_Nd_Min: - results = "CV Nd Min"; - break; - //case Column.Candela_Large_LPD_Quarterly: results = "Candela Large LPD Quarterly"; break; - //case Column.Candela_Medium_LPD_Quarterly: results = "Candela Medium LPD Quarterly"; break; - //case Column.Candela_Small_LPD_Quarterly: results = "Candela Small LPD Quarterly"; break; - //case Column.Candela_Total_Quarterly: results = "Candela Total Quarterly"; break; - case Column.Candela_102_83nm: - results = "102-83nm"; - break; - case Column.Candela_1_1um: - results = "1.1um"; - break; - case Column.Candela_496nm: - results = "496nm"; - break; - case Column.Candela_600nm: - results = "600nm"; - break; - case Column.Candela_8620_Small: - results = "Candela 8620 Small"; - break; - case Column.Candela_Crack_Verification: - results = "Crack Verification"; - break; - case Column.Candela_Cracking: - results = "Candela Cracking"; - break; - case Column.Candela_Cracking_Acceptable: - results = "Candela Cracking Acceptable"; - break; - case Column.Candela_Crater: - results = "Candela Crater"; - break; - case Column.Candela_Crater_Verification: - results = "Crater verification"; - break; - case Column.Candela_Haze: - results = "Candela Haze"; - break; - case Column.Candela_LPD_Large: - results = "Candela LPD Large"; - break; - case Column.Candela_LPD_Medium: - results = "Candela LPD Medium"; - break; - case Column.Candela_LPD_Small: - results = "Candela LPD Small"; - break; - case Column.Candela_Large_Verification: - results = "Large Verification"; - break; - case Column.Candela_Medium_Verification: - results = "Medium Verification"; - break; - case Column.Candela_Pits: - results = "Candela Pits"; - break; - case Column.Candela_Pits_Verification: - results = "Pits verification"; - break; - case Column.Candela_SPE: - results = "Candela SPE"; - break; - case Column.Candela_SPE_Verification: - results = "SPE verification"; - break; - case Column.Candela_Slip: - results = "Candela Slip"; - break; - case Column.Candela_Small_Verification: - results = "Small Verification"; - break; - case Column.Candela_Spirals: - results = "Candela Spirals"; - break; - case Column.Candela_Spirals_Verification: - results = "Candela Spirals Verification"; - break; - case Column.Candela_Total_Defects: - results = "Candela Total Defects"; - break; - case Column.Candela_Total_PSL: - results = "Candela Total PSL"; - break; - case Column.Candela__1_1um: - results = ">1.1um"; - break; - //case Column.Comment: results = "Comment"; break; - //case Column.Conductivity: results = "Conductivity"; break; - case Column.Contact_Symmetry: - results = "Contact Symmetry"; - break; - //case Column.Cracking_verification: results = "Cracking verification"; break; - //case Column.Crater_verification: results = "Crater verification"; break; - case Column.Date: - results = "Date"; - break; - case Column.Denton_Crystal_Life: - results = "Denton_Crystal_Life"; - break; - case Column.Denton_Current_AVG: - results = "Denton_Current_AVG"; - break; - case Column.Denton_Current_STDEV: - results = "Denton_Current_STDEV"; - break; - case Column.Denton_Deposition_Power_AVG: - results = "Denton_Deposition_Power_AVG"; - break; - case Column.Denton_Deposition_Power_STDEV: - results = "Denton_Deposition_Power_STDEV"; - break; - case Column.Denton_Deposition_Rate_AVG: - results = "Denton_Deposition_Rate_AVG"; - break; - case Column.Denton_Deposition_Rate_STDEV: - results = "Denton_Deposition_Rate_STDEV"; - break; - case Column.Denton_Gun_Pocket: - results = "Denton_Gun_Pocket"; - break; - case Column.Denton_Pumpdown_Time: - results = "Denton_Pumpdown_Time"; - break; - case Column.Denton_Voltage_AVG: - results = "Denton_Voltage_AVG"; - break; - case Column.Denton_Voltage_STDEV: - results = "Denton_Voltage_STDEV"; - break; - case Column.Employee: - results = "Employee"; - break; - case Column.Epi_Thickness_Mean: - results = "Epi Thickness Mean"; - break; - case Column.Epi_Thickness_Mean_XY: - results = "Epi Thickness Mean_XY"; - break; - case Column.Epi_Thickness_Std_Dev_: - results = "Epi Thickness Std Dev %"; - break; - case Column.FWHM_006_WTAVG: - results = "FWHM 006 WTAVG"; - break; - case Column.FWHM_006: - results = "FWHM 006"; - break; - case Column.FWHM_105_WTAVG: - results = "FWHM 105 WTAVG"; - break; - case Column.FWHM_105: - results = "FWHM 105"; - break; - case Column.Hall_Rs: - results = "Hall Rs"; - break; - case Column.Hall_Mobility_verif_sample: - results = "Hall_Mobility_verif_sample"; - break; - case Column.Hall_Ns_verif_sample: - results = "Hall_Ns_verif_sample"; - break; - case Column.Hall_Rs_verif_sample: - results = "Hall_Rs_verif_sample"; - break; - case Column.Job: - results = "Job"; - break; - case Column.LEI_RS_Average_value: - results = "LEI RS Average value"; - break; - case Column.LEI_RS_Maximum_value: - results = "LEI RS Maximum value"; - break; - case Column.LEI_RS_Minimum_value: - results = "LEI RS Minimum value"; - break; - case Column.LEI_RS_STDEV: - results = "LEI RS STDEV"; - break; - case Column.LEI_RS_STDEV_: - results = "LEI RS STDEV%"; - break; - //case Column.Large_Adder_Sum: results = "Large Adder Sum"; break; - case Column.Lot: - results = "Lot"; - break; - //case Column.Medium_Adder_Sum: results = "Medium Adder Sum"; break; - case Column.Microscope_Center_5x: - results = "Microscope Center 5x"; - break; - case Column.Microscope_Center_50x: - results = "Microscope Center 50x"; - break; - case Column.Microscope_Middle_5x: - results = "Microscope Middle 5x"; - break; - case Column.Microscope_Middle_50x: - results = "Microscope Middle 50x"; - break; - case Column.Microscope_Edge_5x: - results = "Microscope Edge 5x"; - break; - case Column.Microscope_Edge_50x: - results = "Microscope Edge 50x"; - break; - case Column.Mobility_Verification: - results = "Mobility Verification"; - break; - case Column.Mobility: - results = "Mobility"; - break; - case Column.Ns_Verification: - results = "Ns Verification"; - break; - case Column.PL_Edge_Wavelength: - results = "PL Edge Wavelength"; - break; - case Column.PL_Ratio: - results = "PL Ratio"; - break; - case Column.PR_Barrier_Composition: - results = "PR Barrier Composition"; - break; - case Column.PR_Peak: - results = "PR Peak"; - break; - case Column.Part: - results = "Part"; - break; - //case Column.Particles_verification: results = "Particles verification"; break; - //case Column.Pits_verification: results = "Pits verification"; break; - //case Column.Pocket: results = "Pocket"; break; - //case Column.Post_Bin_1: results = "Post Bin 1"; break; - //case Column.Post_Bin_2: results = "Post Bin 2"; break; - //case Column.Post_Bin_3: results = "Post Bin 3"; break; - //case Column.Post_Bin_4: results = "Post Bin 4"; break; - //case Column.Post_Bin_5: results = "Post Bin 5"; break; - //case Column.Post_Bin_6: results = "Post Bin 6"; break; - //case Column.Post_Bin_9: results = "Post Bin 9"; break; - //case Column.Pre_Bin_1: results = "Pre Bin 1"; break; - //case Column.Pre_Bin_2: results = "Pre Bin 2"; break; - //case Column.Pre_Bin_3: results = "Pre Bin 3"; break; - //case Column.Pre_Bin_4: results = "Pre Bin 4"; break; - //case Column.Pre_Bin_5: results = "Pre Bin 5"; break; - //case Column.Pre_Bin_6: results = "Pre Bin 6"; break; - //case Column.Pre_Bin_9: results = "Pre Bin 9"; break; - case Column.Process: - results = "Process"; - break; - //case Column.RPM_verif_Thickness_1: results = "RPM_verif_Thickness_1"; break; - //case Column.RPM_verif_Thickness_2: results = "RPM_verif_Thickness_2"; break; - //case Column.RPM_verif_Thickness_3: results = "RPM_verif_Thickness_3"; break; - //case Column.RPM_verif_Thickness_Average: results = "RPM_verif_Thickness_Average"; break; - //case Column.RTA_oxide_Thk_Change: results = "RTA oxide Thk Change"; break; - //case Column.RTA_oxide_post_anneal_Thk: results = "RTA oxide post-anneal Thk"; break; - //case Column.RTA_oxide_pre_anneal_Thk: results = "RTA oxide pre-anneal Thk"; break; - case Column.Recipe: - results = "Recipe"; - break; - //case Column.Resistivity_2_ohm_cm: results = "Resistivity 2 ohm cm"; break; //LEI Weekly Verification - //case Column.Resistivity_600_ohm_cm: results = "Resistivity 600 ohm cm"; break; //LEI Weekly Verification - case Column.Rs_verification: - results = "Rs verification"; - break; - case Column.Rs_verif_100kohm: - results = "Rs_verif_100kohm"; - break; - case Column.Rs_verif_10ohm: - results = "Rs_verif_10ohm"; - break; - case Column.Rs_verif_1kohm: - results = "Rs_verif_1kohm"; - break; - case Column.SID: - results = "SID"; - break; - case Column.SL_Period_WTAVG: - results = "SL Period WTAVG"; - break; - case Column.SL_Period: - results = "SL Period"; - break; - //case Column.SPE_verification: results = "SPE verification"; break; - //case Column.Sample_ID: results = "Sample ID"; break; - case Column.Sheet_Concentration: - results = "Sheet Concentration"; - break; - //case Column.Size: results = "Size"; break; - //case Column.Small_Adder_Sum: results = "Small Adder Sum"; break; - //case Column.Spirals_verification: results = "Spirals verification"; break; - case Column.Time: - results = "Time"; - break; - case Column.Tool_ID: - results = "Tool ID"; - break; - //case Column.Total_LPD_Adder: results = "Total LPD Adder"; break; - //case Column.Total_Verification: results = "Total Verification"; break; - case Column.Total_Warp_Calibration: - results = "Total Warp Calibration"; - break; - case Column.UV_Broken: - results = "UV Broken"; - break; - case Column.UV_Chipping: - results = "UV Chipping"; - break; - case Column.UV_Cracking_0_3mm_: - results = "UV Cracking (0-3mm)"; - break; - case Column.UV_Cracking_3_7mm_: - results = "UV Cracking (3-7mm)"; - break; - case Column.UV_Cracking_7mm_: - results = "UV Cracking (>7mm)"; - break; - case Column.UV_Crazing: - results = "UV Crazing"; - break; - case Column.UV_Crazing_Acceptable: - results = "UV Crazing Acceptable"; - break; - case Column.UV_FULL_Characterization_Wafer: - results = "UV FULL Characterization Wafer"; - break; - case Column.UV_Haze_count_: - results = "UV Haze (count)"; - break; - case Column.UV_LIGHT_Characterization_Wafer: - results = "UV LIGHT Characterization Wafer"; - break; - case Column.UV_Non_rotation: - results = "UV Non-rotation"; - break; - case Column.UV_Other: - results = "UV Other"; - break; - case Column.UV_Scratch_count_: - results = "UV Scratch (count)"; - break; - case Column.UV_Slip_count_: - results = "UV Slip (count)"; - break; - case Column.UV_True_Haze: - results = "UV True Haze"; - break; - case Column.UV_True_Haze_Acceptable: - results = "UV True Haze Acceptable"; - break; - case Column.UV_SPE_1mm_count: - results = "UV-SPE (>1mm) count"; - break; - case Column.UV_SPE_count_: - results = "UV-SPE (count)"; - break; - case Column.Verification_Contact_Symmetry: - results = "Verification Contact Symmetry"; - break; - case Column.Vp_Pinch_Off_Voltage: - results = "Vp Pinch Off Voltage"; - break; - case Column.Wafer_ID: - results = "Wafer ID"; - break; - //case Column.Wafer_Pocket: results = "Wafer Pocket"; break; - case Column.Wafer_Region: - results = "Wafer Region"; - break; - case Column.Wafer_Scribe: - results = "Wafer Scribe"; - break; - case Column.WaferPocket_Candela: - results = "WaferPocket_Candela"; - break; - case Column.WaferPocket_Warp: - results = "WaferPocket_Warp"; - break; - case Column.WaferPosition_CV: - results = "WaferPosition_CV"; - break; - case Column.WaferPosition_BV: - results = "WaferPosition_BV"; - break; - case Column.WaferPosition_Hall: - results = "WaferPosition_Hall"; - break; - case Column.WaferPosition_PR: - results = "WaferPosition_PR"; - break; - case Column.Warp: - results = "Warp"; - break; - case Column.X_Coord: - results = "X-Coord"; - break; - case Column.XRD_2_Theta_Peak_002: - results = "XRD 2 Theta Peak 002"; - break; - case Column.XRD_2_Theta_Peak_101: - results = "XRD 2 Theta Peak 101"; - break; - case Column.XRD_2_Theta_Position: - results = "XRD 2-Theta Position"; - break; - case Column.XRD_2_Theta_Position_Si_1: - results = "XRD 2-Theta Position Si 1"; - break; - case Column.XRD_2_Theta_Position_Si_2: - results = "XRD 2-Theta Position Si 2"; - break; - case Column.XRD_2_Theta_Position_Si_3: - results = "XRD 2-Theta Position Si 3"; - break; - case Column.XRD_Peak_002_Intensity: - results = "XRD Peak 002 Intensity"; - break; - case Column.XRD_Peak_101_Intensity: - results = "XRD Peak 101 Intensity"; - break; - case Column.XRD_Weekly_AL_Center: - results = "XRD Weekly AL% Center"; - break; - case Column.XRD_Weekly_Back_Barrier_Al_: - results = "Back Barrier Al%"; - break; - case Column.XRD_Weekly_Barrier_Al_: - results = "Barrier Al%"; - break; - case Column.XRD_Weekly_FWHM_002: - results = "XRD Weekly FWHM 002"; - break; - case Column.XRD_Weekly_FWHM_101: - results = "XRD Weekly FWHM 101"; - break; - case Column.XRD_Weekly_FWHM_105: - results = "XRD Weekly FWHM 105"; - break; - case Column.XRD_Weekly_Fringe_thick_0_0_: - results = "XRD Weekly Fringe thick (0,0)"; - break; - case Column.XRD_Weekly_Fringe_thick_48_48_: - results = "XRD Weekly Fringe thick (48,48)"; - break; - case Column.XRD_Weekly_Intensity: - results = "XRD Weekly Intensity"; - break; - case Column.XRD_Weekly_Super_Lattice_Al_: - results = "Super Lattice Al%"; - break; - case Column.XRD_Weekly_Super_Lattice_period: - results = "Super Lattice period"; - break; - case Column.XRD_Weekly_Super_Lattice_tks: - results = "Super Lattice tks"; - break; - case Column.XRR_Thickness_nm_WTAVG: - results = "XRR Thickness (nm) WTAVG"; - break; - case Column.XRR_Thickness_nm_: - results = "XRR Thickness (nm)"; - break; - case Column.Y_Coord: - results = "Y-Coord"; - break; - case Column.YellowBand_Power_mW_: - results = "YellowBand_Power (mW)"; - break; - case Column.YellowBand_V: - results = "YellowBand_V"; - break; - case Column.YellowBand_V_XY: - results = "YellowBand_V_XY"; - break; - case Column.YellowBand_nm: - results = "YellowBand_nm"; - break; - //case Column.pH: results = "pH"; break; - case Column.Ag: - results = "Ag"; - break; - case Column.Al: - results = "Al"; - break; - case Column.As: - results = "As"; - break; - case Column.Au: - results = "Au"; - break; - case Column.B: - results = "B"; - break; - case Column.Ba: - results = "Ba"; - break; - case Column.Ca: - results = "Ca"; - break; - case Column.Ce: - results = "Ce"; - break; - case Column.Co: - results = "Co"; - break; - case Column.Cr: - results = "Cr"; - break; - case Column.Cu: - results = "Cu"; - break; - case Column.Fe: - results = "Fe"; - break; - case Column.Ga: - results = "Ga"; - break; - case Column.Ge: - results = "Ge"; - break; - case Column.Hf: - results = "Hf"; - break; - case Column.K: - results = "K"; - break; - case Column.Li: - results = "Li"; - break; - case Column.Mg: - results = "Mg"; - break; - case Column.Mn: - results = "Mn"; - break; - case Column.Mo: - results = "Mo"; - break; - case Column.Na: - results = "Na"; - break; - case Column.Ni: - results = "Ni"; - break; - case Column.P: - results = "P"; - break; - case Column.Pb: - results = "Pb"; - break; - case Column.Sn: - results = "Sn"; - break; - case Column.Ta: - results = "Ta"; - break; - case Column.Ti: - results = "Ti"; - break; - case Column.W: - results = "W"; - break; - case Column.Y: - results = "Y"; - break; - case Column.Zn: - results = "Zn"; - break; - default: - throw new Exception(); - } - return results; - } - - public static Description.Param GetParam(this Column column) - { - Description.Param results; - switch (column) - { - //case Column._8in_Total_Warp_Verification: results = Description.Param.String; break; - //case Column.AFM_Monthly_Y: results = Description.Param.String; break; - //case Column.AFM_Monthly: results = Description.Param.String; break; - case Column.AFM_Pit_Count: - results = Description.Param.String; - break; - case Column.AFM_Roughness: - results = Description.Param.String; - break; - //case Column.Adder_Bin_1: results = Description.Param.String; break; - //case Column.Adder_Bin_2: results = Description.Param.String; break; - //case Column.Adder_Bin_3: results = Description.Param.String; break; - //case Column.Adder_Bin_4: results = Description.Param.String; break; - //case Column.Adder_Bin_5: results = Description.Param.String; break; - //case Column.Adder_Bin_6: results = Description.Param.String; break; - //case Column.Adder_Bin_9: results = Description.Param.String; break; - case Column.Al_B_B_WTAVG: - results = Description.Param.String; - break; - case Column.Al_B_B_: - results = Description.Param.String; - break; - case Column.Al_Barrier_WTAVG: - results = Description.Param.String; - break; - case Column.Al_Barrier: - results = Description.Param.String; - break; - case Column.Al_SLS_WTAVG: - results = Description.Param.String; - break; - case Column.Al_SLS: - results = Description.Param.String; - break; - case Column.Al_TL1_WTAVG: - results = Description.Param.String; - break; - case Column.Al_TL1: - results = Description.Param.String; - break; - case Column.Al_TL2_WTAVG: - results = Description.Param.String; - break; - //case Column.BV_Resistance: results = Description.Param.String; break; - case Column.BandEdge_V: - results = Description.Param.String; - break; - case Column.BandEdge_V_XY: - results = Description.Param.String; - break; - case Column.BandEdge_nm: - results = Description.Param.String; - break; - case Column.Barrier_Composition_RPM_XY: - results = Description.Param.String; - break; - case Column.Bow_Calibration: - results = Description.Param.String; - break; - case Column.Bow_Range: - results = Description.Param.String; - break; - case Column.Bow: - results = Description.Param.String; - break; - case Column.BowCenter: - results = Description.Param.String; - break; - case Column.BowX: - results = Description.Param.String; - break; - case Column.BowY: - results = Description.Param.String; - break; - case Column.Breakdown_Voltage_Edge: - results = Description.Param.String; - break; - case Column.Breakdown_VoltageMiddle: - results = Description.Param.String; - break; - case Column.Breakdown_Voltage: - results = Description.Param.String; - break; - case Column.CV_C_at_10V: - results = Description.Param.String; - break; - case Column.CV_Nd_Min: - results = Description.Param.String; - break; - //case Column.Candela_Large_LPD_Quarterly: results = Description.Param.String; break; - //case Column.Candela_Medium_LPD_Quarterly: results = Description.Param.String; break; - //case Column.Candela_Small_LPD_Quarterly: results = Description.Param.String; break; - //case Column.Candela_Total_Quarterly: results = Description.Param.String; break; - case Column.Candela_102_83nm: - results = Description.Param.String; - break; - case Column.Candela_1_1um: - results = Description.Param.String; - break; - case Column.Candela_496nm: - results = Description.Param.String; - break; - case Column.Candela_600nm: - results = Description.Param.String; - break; - case Column.Candela_8620_Small: - results = Description.Param.String; - break; - case Column.Candela_Crack_Verification: - results = Description.Param.String; - break; - case Column.Candela_Cracking: - results = Description.Param.String; - break; - case Column.Candela_Cracking_Acceptable: - results = Description.Param.String; - break; - case Column.Candela_Crater: - results = Description.Param.String; - break; - case Column.Candela_Crater_Verification: - results = Description.Param.String; - break; - case Column.Candela_Haze: - results = Description.Param.String; - break; - case Column.Candela_LPD_Large: - results = Description.Param.String; - break; - case Column.Candela_LPD_Medium: - results = Description.Param.String; - break; - case Column.Candela_LPD_Small: - results = Description.Param.String; - break; - case Column.Candela_Large_Verification: - results = Description.Param.String; - break; - case Column.Candela_Medium_Verification: - results = Description.Param.String; - break; - case Column.Candela_Pits: - results = Description.Param.String; - break; - case Column.Candela_Pits_Verification: - results = Description.Param.String; - break; - case Column.Candela_SPE: - results = Description.Param.String; - break; - case Column.Candela_SPE_Verification: - results = Description.Param.String; - break; - case Column.Candela_Slip: - results = Description.Param.String; - break; - case Column.Candela_Small_Verification: - results = Description.Param.String; - break; - case Column.Candela_Spirals: - results = Description.Param.String; - break; - case Column.Candela_Spirals_Verification: - results = Description.Param.String; - break; - case Column.Candela_Total_Defects: - results = Description.Param.String; - break; - case Column.Candela_Total_PSL: - results = Description.Param.String; - break; - case Column.Candela__1_1um: - results = Description.Param.String; - break; - //case Column.Comment: results = Description.Param.String; break; - //case Column.Conductivity: results = Description.Param.String; break; - case Column.Contact_Symmetry: - results = Description.Param.String; - break; - //case Column.Cracking_verification: results = Description.Param.String; break; - //case Column.Crater_verification: results = Description.Param.String; break; - case Column.Date: - results = Description.Param.String; - break; - case Column.Denton_Crystal_Life: - results = Description.Param.String; - break; - case Column.Denton_Current_AVG: - results = Description.Param.String; - break; - case Column.Denton_Current_STDEV: - results = Description.Param.String; - break; - case Column.Denton_Deposition_Power_AVG: - results = Description.Param.String; - break; - case Column.Denton_Deposition_Power_STDEV: - results = Description.Param.String; - break; - case Column.Denton_Deposition_Rate_AVG: - results = Description.Param.String; - break; - case Column.Denton_Deposition_Rate_STDEV: - results = Description.Param.String; - break; - case Column.Denton_Gun_Pocket: - results = Description.Param.String; - break; - case Column.Denton_Pumpdown_Time: - results = Description.Param.String; - break; - case Column.Denton_Voltage_AVG: - results = Description.Param.String; - break; - case Column.Denton_Voltage_STDEV: - results = Description.Param.String; - break; - case Column.Employee: - results = Description.Param.String; - break; - case Column.Epi_Thickness_Mean: - results = Description.Param.String; - break; - case Column.Epi_Thickness_Mean_XY: - results = Description.Param.String; - break; - case Column.Epi_Thickness_Std_Dev_: - results = Description.Param.String; - break; - case Column.FWHM_006_WTAVG: - results = Description.Param.String; - break; - case Column.FWHM_006: - results = Description.Param.String; - break; - case Column.FWHM_105_WTAVG: - results = Description.Param.String; - break; - case Column.FWHM_105: - results = Description.Param.String; - break; - case Column.Hall_Rs: - results = Description.Param.String; - break; - case Column.Hall_Mobility_verif_sample: - results = Description.Param.String; - break; - case Column.Hall_Ns_verif_sample: - results = Description.Param.String; - break; - case Column.Hall_Rs_verif_sample: - results = Description.Param.String; - break; - case Column.Job: - results = Description.Param.String; - break; - case Column.LEI_RS_Average_value: - results = Description.Param.String; - break; - case Column.LEI_RS_Maximum_value: - results = Description.Param.String; - break; - case Column.LEI_RS_Minimum_value: - results = Description.Param.String; - break; - case Column.LEI_RS_STDEV: - results = Description.Param.String; - break; - case Column.LEI_RS_STDEV_: - results = Description.Param.String; - break; - //case Column.Large_Adder_Sum: results = Description.Param.String; break; - case Column.Lot: - results = Description.Param.String; - break; - //case Column.Medium_Adder_Sum: results = Description.Param.String; break; - case Column.Microscope_Center_5x: - results = Description.Param.String; - break; - case Column.Microscope_Center_50x: - results = Description.Param.String; - break; - case Column.Microscope_Middle_5x: - results = Description.Param.String; - break; - case Column.Microscope_Middle_50x: - results = Description.Param.String; - break; - case Column.Microscope_Edge_5x: - results = Description.Param.String; - break; - case Column.Microscope_Edge_50x: - results = Description.Param.String; - break; - case Column.Mobility_Verification: - results = Description.Param.String; - break; - case Column.Mobility: - results = Description.Param.String; - break; - case Column.Ns_Verification: - results = Description.Param.String; - break; - case Column.PL_Edge_Wavelength: - results = Description.Param.String; - break; - case Column.PL_Ratio: - results = Description.Param.String; - break; - case Column.PR_Barrier_Composition: - results = Description.Param.String; - break; - case Column.PR_Peak: - results = Description.Param.String; - break; - case Column.Part: - results = Description.Param.String; - break; - //case Column.Particles_verification: results = Description.Param.String; break; - //case Column.Pits_verification: results = Description.Param.String; break; - //case Column.Pocket: results = Description.Param.String; break; - //case Column.Post_Bin_1: results = Description.Param.String; break; - //case Column.Post_Bin_2: results = Description.Param.String; break; - //case Column.Post_Bin_3: results = Description.Param.String; break; - //case Column.Post_Bin_4: results = Description.Param.String; break; - //case Column.Post_Bin_5: results = Description.Param.String; break; - //case Column.Post_Bin_6: results = Description.Param.String; break; - //case Column.Post_Bin_9: results = Description.Param.String; break; - //case Column.Pre_Bin_1: results = Description.Param.String; break; - //case Column.Pre_Bin_2: results = Description.Param.String; break; - //case Column.Pre_Bin_3: results = Description.Param.String; break; - //case Column.Pre_Bin_4: results = Description.Param.String; break; - //case Column.Pre_Bin_5: results = Description.Param.String; break; - //case Column.Pre_Bin_6: results = Description.Param.String; break; - //case Column.Pre_Bin_9: results = Description.Param.String; break; - case Column.Process: - results = Description.Param.String; - break; - //case Column.RPM_verif_Thickness_1: results = Description.Param.String; break; - //case Column.RPM_verif_Thickness_2: results = Description.Param.String; break; - //case Column.RPM_verif_Thickness_3: results = Description.Param.String; break; - //case Column.RPM_verif_Thickness_Average: results = Description.Param.String; break; - //case Column.RTA_oxide_Thk_Change: results = Description.Param.String; break; - //case Column.RTA_oxide_post_anneal_Thk: results = Description.Param.String; break; - //case Column.RTA_oxide_pre_anneal_Thk: results = Description.Param.String; break; - case Column.Recipe: - results = Description.Param.String; - break; - //case Column.Resistivity_2_ohm_cm: results = Description.Param.String; break; - //case Column.Resistivity_600_ohm_cm: results = Description.Param.String; break; - case Column.Rs_verification: - results = Description.Param.String; - break; - case Column.Rs_verif_100kohm: - results = Description.Param.String; - break; - case Column.Rs_verif_10ohm: - results = Description.Param.String; - break; - case Column.Rs_verif_1kohm: - results = Description.Param.String; - break; - case Column.SID: - results = Description.Param.String; - break; - case Column.SL_Period_WTAVG: - results = Description.Param.String; - break; - case Column.SL_Period: - results = Description.Param.String; - break; - //case Column.SPE_verification: results = Description.Param.String; break; - //case Column.Sample_ID: results = Description.Param.String; break; - case Column.Sheet_Concentration: - results = Description.Param.String; - break; - //case Column.Size: results = Description.Param.String; break; - //case Column.Small_Adder_Sum: results = Description.Param.String; break; - //case Column.Spirals_verification: results = Description.Param.String; break; - case Column.Time: - results = Description.Param.String; - break; - case Column.Tool_ID: - results = Description.Param.String; - break; - //case Column.Total_LPD_Adder: results = Description.Param.String; break; - //case Column.Total_Verification: results = Description.Param.String; break; - case Column.Total_Warp_Calibration: - results = Description.Param.String; - break; - case Column.UV_Broken: - results = Description.Param.String; - break; - case Column.UV_Chipping: - results = Description.Param.String; - break; - case Column.UV_Cracking_0_3mm_: - results = Description.Param.String; - break; - case Column.UV_Cracking_3_7mm_: - results = Description.Param.String; - break; - case Column.UV_Cracking_7mm_: - results = Description.Param.String; - break; - case Column.UV_Crazing: - results = Description.Param.String; - break; - case Column.UV_Crazing_Acceptable: - results = Description.Param.String; - break; - case Column.UV_FULL_Characterization_Wafer: - results = Description.Param.String; - break; - case Column.UV_Haze_count_: - results = Description.Param.String; - break; - case Column.UV_LIGHT_Characterization_Wafer: - results = Description.Param.String; - break; - case Column.UV_Non_rotation: - results = Description.Param.String; - break; - case Column.UV_Other: - results = Description.Param.String; - break; - case Column.UV_Scratch_count_: - results = Description.Param.String; - break; - case Column.UV_Slip_count_: - results = Description.Param.String; - break; - case Column.UV_True_Haze: - results = Description.Param.String; - break; - case Column.UV_True_Haze_Acceptable: - results = Description.Param.String; - break; - case Column.UV_SPE_1mm_count: - results = Description.Param.String; - break; - case Column.UV_SPE_count_: - results = Description.Param.String; - break; - case Column.Verification_Contact_Symmetry: - results = Description.Param.String; - break; - case Column.Vp_Pinch_Off_Voltage: - results = Description.Param.String; - break; - case Column.Wafer_ID: - results = Description.Param.String; - break; - //case Column.Wafer_Pocket: results = Description.Param.String; break; - case Column.Wafer_Region: - results = Description.Param.String; - break; - case Column.Wafer_Scribe: - results = Description.Param.String; - break; - case Column.WaferPocket_Candela: - results = Description.Param.String; - break; - case Column.WaferPocket_Warp: - results = Description.Param.String; - break; - case Column.WaferPosition_CV: - results = Description.Param.String; - break; - case Column.WaferPosition_BV: - results = Description.Param.String; - break; - case Column.WaferPosition_Hall: - results = Description.Param.String; - break; - case Column.WaferPosition_PR: - results = Description.Param.String; - break; - case Column.Warp: - results = Description.Param.String; - break; - case Column.X_Coord: - results = Description.Param.String; - break; - case Column.XRD_2_Theta_Peak_002: - results = Description.Param.String; - break; - case Column.XRD_2_Theta_Peak_101: - results = Description.Param.String; - break; - case Column.XRD_2_Theta_Position: - results = Description.Param.String; - break; - case Column.XRD_2_Theta_Position_Si_1: - results = Description.Param.String; - break; - case Column.XRD_2_Theta_Position_Si_2: - results = Description.Param.String; - break; - case Column.XRD_2_Theta_Position_Si_3: - results = Description.Param.String; - break; - case Column.XRD_Peak_002_Intensity: - results = Description.Param.String; - break; - case Column.XRD_Peak_101_Intensity: - results = Description.Param.String; - break; - case Column.XRD_Weekly_AL_Center: - results = Description.Param.String; - break; - case Column.XRD_Weekly_Back_Barrier_Al_: - results = Description.Param.String; - break; - case Column.XRD_Weekly_Barrier_Al_: - results = Description.Param.String; - break; - case Column.XRD_Weekly_FWHM_002: - results = Description.Param.String; - break; - case Column.XRD_Weekly_FWHM_101: - results = Description.Param.String; - break; - case Column.XRD_Weekly_FWHM_105: - results = Description.Param.String; - break; - case Column.XRD_Weekly_Fringe_thick_0_0_: - results = Description.Param.String; - break; - case Column.XRD_Weekly_Fringe_thick_48_48_: - results = Description.Param.String; - break; - case Column.XRD_Weekly_Intensity: - results = Description.Param.String; - break; - case Column.XRD_Weekly_Super_Lattice_Al_: - results = Description.Param.String; - break; - case Column.XRD_Weekly_Super_Lattice_period: - results = Description.Param.String; - break; - case Column.XRD_Weekly_Super_Lattice_tks: - results = Description.Param.String; - break; - case Column.XRR_Thickness_nm_WTAVG: - results = Description.Param.String; - break; - case Column.XRR_Thickness_nm_: - results = Description.Param.String; - break; - case Column.Y_Coord: - results = Description.Param.String; - break; - case Column.YellowBand_Power_mW_: - results = Description.Param.String; - break; - case Column.YellowBand_V: - results = Description.Param.String; - break; - case Column.YellowBand_V_XY: - results = Description.Param.String; - break; - case Column.YellowBand_nm: - results = Description.Param.String; - break; - //case Column.pH: results = Description.Param.String; break; - case Column.Ag: - results = Description.Param.String; - break; - case Column.Al: - results = Description.Param.String; - break; - case Column.As: - results = Description.Param.String; - break; - case Column.Au: - results = Description.Param.String; - break; - case Column.B: - results = Description.Param.String; - break; - case Column.Ba: - results = Description.Param.String; - break; - case Column.Ca: - results = Description.Param.String; - break; - case Column.Ce: - results = Description.Param.String; - break; - case Column.Co: - results = Description.Param.String; - break; - case Column.Cr: - results = Description.Param.String; - break; - case Column.Cu: - results = Description.Param.String; - break; - case Column.Fe: - results = Description.Param.String; - break; - case Column.Ga: - results = Description.Param.String; - break; - case Column.Ge: - results = Description.Param.String; - break; - case Column.Hf: - results = Description.Param.String; - break; - case Column.K: - results = Description.Param.String; - break; - case Column.Li: - results = Description.Param.String; - break; - case Column.Mg: - results = Description.Param.String; - break; - case Column.Mn: - results = Description.Param.String; - break; - case Column.Mo: - results = Description.Param.String; - break; - case Column.Na: - results = Description.Param.String; - break; - case Column.Ni: - results = Description.Param.String; - break; - case Column.P: - results = Description.Param.String; - break; - case Column.Pb: - results = Description.Param.String; - break; - case Column.Sn: - results = Description.Param.String; - break; - case Column.Ta: - results = Description.Param.String; - break; - case Column.Ti: - results = Description.Param.String; - break; - case Column.W: - results = Description.Param.String; - break; - case Column.Y: - results = Description.Param.String; - break; - case Column.Zn: - results = Description.Param.String; - break; - default: - throw new Exception(); - } - return results; - } - - } - - public enum Column - { - //_8in_Total_Warp_Verification, - //AFM_Monthly_Y, - //AFM_Monthly, - AFM_Pit_Count, - AFM_Roughness, - //Adder_Bin_1, - //Adder_Bin_2, - //Adder_Bin_3, - //Adder_Bin_4, - //Adder_Bin_5, - //Adder_Bin_6, - //Adder_Bin_9, - Al_B_B_WTAVG, - Al_B_B_, - Al_Barrier_WTAVG, - Al_Barrier, - Al_SLS_WTAVG, - Al_SLS, - Al_TL1_WTAVG, - Al_TL1, - Al_TL2_WTAVG, - //BV_Resistance, - BandEdge_V, - BandEdge_V_XY, - BandEdge_nm, - Barrier_Composition_RPM_XY, - Bow_Calibration, - Bow_Range, - Bow, - BowCenter, - BowX, - BowY, - Breakdown_Voltage_Edge, - Breakdown_VoltageMiddle, - Breakdown_Voltage, - CV_C_at_10V, - CV_Nd_Min, - //Candela_Large_LPD_Quarterly, - //Candela_Medium_LPD_Quarterly, - //Candela_Small_LPD_Quarterly, - //Candela_Total_Quarterly, - Candela_102_83nm, - Candela_1_1um, - Candela_496nm, - Candela_600nm, - Candela_8620_Small, - Candela_Crack_Verification, - Candela_Cracking, - Candela_Cracking_Acceptable, - Candela_Crater, - Candela_Crater_Verification, - Candela_Haze, - Candela_LPD_Large, - Candela_LPD_Medium, - Candela_LPD_Small, - Candela_Large_Verification, - Candela_Medium_Verification, - Candela_Pits, - Candela_Pits_Verification, - Candela_SPE, - Candela_SPE_Verification, - Candela_Slip, - Candela_Small_Verification, - Candela_Spirals, - Candela_Spirals_Verification, - Candela_Total_Defects, - Candela_Total_PSL, - Candela__1_1um, - //Comment, - //Conductivity, - Contact_Symmetry, - //Cracking_verification, - //Crater_verification, - Date, - Denton_Crystal_Life, - Denton_Current_AVG, - Denton_Current_STDEV, - Denton_Deposition_Power_AVG, - Denton_Deposition_Power_STDEV, - Denton_Deposition_Rate_AVG, - Denton_Deposition_Rate_STDEV, - Denton_Gun_Pocket, - Denton_Pumpdown_Time, - Denton_Voltage_AVG, - Denton_Voltage_STDEV, - Employee, - Epi_Thickness_Mean, - Epi_Thickness_Mean_XY, - Epi_Thickness_Std_Dev_, - FWHM_006_WTAVG, - FWHM_006, - FWHM_105_WTAVG, - FWHM_105, - Hall_Rs, - Hall_Mobility_verif_sample, - Hall_Ns_verif_sample, - Hall_Rs_verif_sample, - Job, - LEI_RS_Average_value, - LEI_RS_Maximum_value, - LEI_RS_Minimum_value, - LEI_RS_STDEV, - LEI_RS_STDEV_, - //Large_Adder_Sum, - Lot, - //Medium_Adder_Sum, - Microscope_Center_50x, - Microscope_Center_5x, - Microscope_Edge_50x, - Microscope_Edge_5x, - Microscope_Middle_50x, - Microscope_Middle_5x, - Mobility_Verification, - Mobility, - Ns_Verification, - PL_Edge_Wavelength, - PL_Ratio, - PR_Barrier_Composition, - PR_Peak, - Part, - //Particles_verification, - //Pits_verification, - //Pocket, - //Post_Bin_1, - //Post_Bin_2, - //Post_Bin_3, - //Post_Bin_4, - //Post_Bin_5, - //Post_Bin_6, - //Post_Bin_9, - //Pre_Bin_1, - //Pre_Bin_2, - //Pre_Bin_3, - //Pre_Bin_4, - //Pre_Bin_5, - //Pre_Bin_6, - //Pre_Bin_9, - Process, - //RPM_verif_Thickness_1, - //RPM_verif_Thickness_2, - //RPM_verif_Thickness_3, - //RPM_verif_Thickness_Average, - //RTA_oxide_Thk_Change, - //RTA_oxide_post_anneal_Thk, - //RTA_oxide_pre_anneal_Thk, - Recipe, - //Resistivity_2_ohm_cm, - //Resistivity_600_ohm_cm, - Rs_verification, - Rs_verif_100kohm, - Rs_verif_10ohm, - Rs_verif_1kohm, - SID, - SL_Period_WTAVG, - SL_Period, - //SPE_verification, - //Sample_ID, - Sheet_Concentration, - //Size, - //Small_Adder_Sum, - //Spirals_verification, - Time, - Tool_ID, - //Total_LPD_Adder, - //Total_Verification, - Total_Warp_Calibration, - UV_Broken, - UV_Chipping, - UV_Cracking_0_3mm_, - UV_Cracking_3_7mm_, - UV_Cracking_7mm_, - UV_Crazing, - UV_Crazing_Acceptable, - UV_FULL_Characterization_Wafer, - UV_Haze_count_, - UV_LIGHT_Characterization_Wafer, - UV_Non_rotation, - UV_Other, - UV_Scratch_count_, - UV_Slip_count_, - UV_True_Haze, - UV_True_Haze_Acceptable, - UV_SPE_1mm_count, - UV_SPE_count_, - Verification_Contact_Symmetry, - Vp_Pinch_Off_Voltage, - Wafer_ID, - //Wafer_Pocket, - Wafer_Region, - Wafer_Scribe, - WaferPocket_Candela, - WaferPocket_Warp, - WaferPosition_CV, - WaferPosition_BV, - WaferPosition_Hall, - WaferPosition_PR, - Warp, - X_Coord, - XRD_2_Theta_Peak_002, - XRD_2_Theta_Peak_101, - XRD_2_Theta_Position, - XRD_2_Theta_Position_Si_1, - XRD_2_Theta_Position_Si_2, - XRD_2_Theta_Position_Si_3, - XRD_Peak_002_Intensity, - XRD_Peak_101_Intensity, - XRD_Weekly_AL_Center, - XRD_Weekly_Back_Barrier_Al_, - XRD_Weekly_Barrier_Al_, - XRD_Weekly_FWHM_002, - XRD_Weekly_FWHM_101, - XRD_Weekly_FWHM_105, - XRD_Weekly_Fringe_thick_0_0_, - XRD_Weekly_Fringe_thick_48_48_, - XRD_Weekly_Intensity, - XRD_Weekly_Super_Lattice_Al_, - XRD_Weekly_Super_Lattice_period, - XRD_Weekly_Super_Lattice_tks, - XRR_Thickness_nm_, - XRR_Thickness_nm_WTAVG, - Y_Coord, - YellowBand_Power_mW_, - YellowBand_V, - YellowBand_V_XY, - YellowBand_nm, - //pH, - Ag, - Al, - As, - Au, - B, - Ba, - Ca, - Ce, - Co, - Cr, - Cu, - Fe, - Ga, - Ge, - Hf, - K, - Li, - Mg, - Mn, - Mo, - Na, - Ni, - P, - Pb, - Sn, - Ta, - Ti, - W, - Y, - Zn - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/ConfigDataBase.cs b/Adaptation/Shared/Metrology/ConfigDataBase.cs deleted file mode 100644 index d89d907..0000000 --- a/Adaptation/Shared/Metrology/ConfigDataBase.cs +++ /dev/null @@ -1,419 +0,0 @@ -using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Adaptation.Shared.Metrology -{ - - public class ConfigDataBase - { - - public bool UseCyclicalForDescription { get; protected set; } - public Dictionary CellNames { get; protected set; } - public Dictionary MesEntities { get; protected set; } - public IProcessDataDescription ProcessDataDescription { get; protected set; } - - public bool IsEvent { get; private set; } - public bool EafHosted { get; private set; } - public string CellName { get; private set; } - public bool IsSourceTimer { get; private set; } - public EquipmentType EquipmentType => _EquipmentType; - public string EquipmentElementName { get; private set; } - public bool IsDatabaseExportToIPDSF { get; private set; } - public EquipmentType? EquipmentConnection => _EquipmentConnection; - public FileConnectorConfiguration FileConnectorConfiguration { get; private set; } - - protected readonly EventName _EventName; - protected readonly EquipmentType _EquipmentType; - protected readonly EquipmentType? _EquipmentConnection; - protected readonly Dictionary _Reactors; - - public ConfigDataBase(string cellName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, bool isEAFHosted) - { - CellName = cellName; - EafHosted = isEAFHosted; - EquipmentType equipmentTypeValue; - _Reactors = new Dictionary(); - CellNames = new Dictionary(); - MesEntities = new Dictionary(); - EquipmentElementName = cellInstanceConnectionName; - FileConnectorConfiguration = fileConnectorConfiguration; - string[] segments = parameterizedModelObjectDefinitionType.Split('.'); - IsSourceTimer = (fileConnectorConfiguration.SourceFileFilter.StartsWith("*Timer.txt")); - string cellInstanceConnectionNameBase = cellInstanceConnectionName.Replace("-", string.Empty); - IsDatabaseExportToIPDSF = (fileConnectorConfiguration.SourceFileLocation.Contains("DatabaseExport")); - if (!Enum.TryParse(segments[segments.Length - 1], out EventName eventNameValue)) - throw new Exception(cellInstanceConnectionName); - if (!Enum.TryParse(cellInstanceConnectionNameBase, out equipmentTypeValue)) - _EquipmentConnection = null; - else - _EquipmentConnection = equipmentTypeValue; - string suffix; - switch (eventNameValue) - { - case EventName.FileRead: - suffix = string.Empty; - break; - case EventName.FileReadDaily: - suffix = "_Daily"; - break; - case EventName.FileReadWeekly: - suffix = "_Weekly"; - break; - case EventName.FileReadMonthly: - suffix = "_Monthly"; - break; - case EventName.FileReadVerification: - suffix = "_Verification"; - break; - default: - throw new Exception(cellInstanceConnectionName); - } - string parameterizedModelObjectDefinitionTypeAppended = string.Concat(segments[0], suffix); - IsEvent = cellInstanceConnectionNameBase != parameterizedModelObjectDefinitionTypeAppended; - _EventName = eventNameValue; - if (!Enum.TryParse(parameterizedModelObjectDefinitionTypeAppended, out equipmentTypeValue)) - throw new Exception(cellInstanceConnectionName); - _EquipmentType = equipmentTypeValue; - if (!isEAFHosted && equipmentTypeName != parameterizedModelObjectDefinitionTypeAppended) - throw new Exception(cellInstanceConnectionName); - } - - public string GetEventName() - { - string result = _EventName.ToString(); - return result; - } - - public EventName GetEventNameValue() - { - EventName result = _EventName; - return result; - } - - public string GetEquipmentType() - { - string result; - if (_EquipmentConnection is null) - result = _EquipmentType.ToString(); - else - result = _EquipmentConnection.Value.ToString(); - return result; - } - - public string GetEventDescription() - { - string result = ProcessDataDescription.GetEventDescription(); - return result; - } - - public IProcessDataDescription GetDefault(ILogic logic) - { - IProcessDataDescription result = ProcessDataDescription.GetDefault(logic, this); - return result; - } - - public IProcessDataDescription GetDisplayNames(ILogic logic) - { - IProcessDataDescription result = ProcessDataDescription.GetDisplayNames(logic, this); - return result; - } - - public List GetDetailNames(ILogic logic) - { - List results = ProcessDataDescription.GetDetailNames(logic, this); - return results; - } - - public List GetHeaderNames(ILogic logic) - { - List results = ProcessDataDescription.GetHeaderNames(logic, this); - return results; - } - - public List GetNames(ILogic logic) - { - List results = ProcessDataDescription.GetNames(logic, this); - return results; - } - - public List GetPairedParameterNames(ILogic logic) - { - List results = ProcessDataDescription.GetPairedParameterNames(logic, this); - return results; - } - - public List GetParameterNames(ILogic logic) - { - List results = ProcessDataDescription.GetParameterNames(logic, this); - return results; - } - - public List GetDescription(ILogic logic, List tests, IProcessData iProcessData) - { - List results = ProcessDataDescription.GetDescription(logic, this, tests, iProcessData); - return results; - } - - public string GetCurrentReactor(ILogic logic) - { - string result = string.Empty; - foreach (KeyValuePair keyValuePair in _Reactors) - { - foreach (string filePrefix in keyValuePair.Value.Split('|')) - { - if (logic.Logistics.MID.StartsWith(filePrefix) || (_EventName != EventName.FileRead && MesEntities.ContainsKey(logic.Logistics.JobID) && keyValuePair.Value == MesEntities[logic.Logistics.JobID])) - { - result = keyValuePair.Key; - break; - } - } - } - if (string.IsNullOrEmpty(result) && _Reactors.Count == 1) - result = _Reactors.ElementAt(0).Key; - return result; - } - - protected JsonElement GetDefaultJsonElement(ILogic logic) - { - JsonElement result; - IProcessDataDescription processDataDescription = ProcessDataDescription.GetDefault(logic, this); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - object @object = JsonSerializer.Deserialize(json); - result = (JsonElement)@object; - return result; - } - - public Dictionary>> GetParameterInfo(ILogic logic, bool allowNull) - { - Dictionary>> results = new Dictionary>>(); - string description; - Enum param; - Tuple tuple; - JsonElement defaultJsonElement = GetDefaultJsonElement(logic); - Dictionary keyValuePairs = GetDisplayNamesJsonElement(logic); - foreach (JsonProperty jsonProperty in defaultJsonElement.EnumerateObject()) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull) - throw new Exception(); - if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array) - { - description = string.Empty; - param = Description.Param.StructuredType; - //jValue = jObject.Value("Item1"); - throw new NotImplementedException("Item1"); - } - else - { - switch (jsonProperty.Value.ValueKind) - { - case JsonValueKind.String: - param = Description.Param.String; - break; - case JsonValueKind.Number: - param = Description.Param.Double; - break; - case JsonValueKind.True: - case JsonValueKind.False: - param = Description.Param.Boolean; - break; - case JsonValueKind.Null: - param = Description.Param.String; - break; - default: - param = Description.Param.StructuredType; - break; - } - } - if (!keyValuePairs.ContainsKey(jsonProperty.Name)) - description = string.Empty; - else - description = keyValuePairs[jsonProperty.Name]; - tuple = new Tuple(param, jsonProperty.Name, description, jsonProperty.Value.ToString()); - if (!results.ContainsKey(jsonProperty.Name)) - results.Add(jsonProperty.Name, new List>()); - results[jsonProperty.Name].Add(tuple); - } - return results; - } - - protected void WriteExportAliases(ILogic logic, string cellName, string equipmentElementName) - { - int i = 0; - Enum param; - object value; - Enum[] @params; - string description; - StringBuilder stringBuilder = new StringBuilder(); - string shareRoot = @"\\messv02ecc1.ec.local\EC_EDA"; - string shareDirectory = string.Concat(shareRoot, @"\Staging\Pdsf\", cellName, @"\ExportAliases\", equipmentElementName); - Dictionary>> keyValuePairs; - if (!(logic is null)) - keyValuePairs = GetParameterInfo(logic, allowNull: false); - else - keyValuePairs = new Dictionary>>(); - stringBuilder.AppendLine("\"AliasName\";\"Condition\";\"EventId\";\"ExceptionId\";\"Formula\";\"HardwareId\";\"OrderId\";\"ParameterName\";\"Remark\";\"ReportName\";\"SourceId\";\"Use\""); - if (!Directory.Exists(shareRoot)) - return; - if (!Directory.Exists(shareDirectory)) - Directory.CreateDirectory(shareDirectory); - string shareFile = string.Concat(shareDirectory, @"\", DateTime.Now.Ticks, ".csv"); - foreach (KeyValuePair>> keyValuePair in keyValuePairs) - { - i += 1; - @params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray(); - if (@params.Length != 1) - throw new Exception(); - if (keyValuePair.Value[0].Item2 != keyValuePair.Key) - throw new Exception(); - param = @params[0]; - if (!(param is Description.Param.String)) - stringBuilder.AppendLine($"\"{keyValuePair.Key}\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{keyValuePair.Key}\";\"\";\"{cellName}/{EquipmentElementName}/{_EventName}\";\"\";\"True\""); - else - { - description = keyValuePair.Value[0].Item3.Split('|')[0]; - if (string.IsNullOrEmpty(description)) - continue; - value = keyValuePair.Value[0].Item4; - stringBuilder.AppendLine($"\"'{description}'\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{value}\";\"\";\"{cellName}/{EquipmentElementName}/{_EventName}\";\"\";\"True\""); - } - } - if (keyValuePairs.Any()) - File.WriteAllText(shareFile, stringBuilder.ToString()); - } - - public Dictionary GetDisplayNamesJsonElement(ILogic logic) - { - Dictionary results = new Dictionary(); - IProcessDataDescription processDataDescription = ProcessDataDescription.GetDisplayNames(logic, this); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - JsonElement jsonElement = JsonSerializer.Deserialize(json); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - { - if (!results.ContainsKey(jsonProperty.Name)) - results.Add(jsonProperty.Name, string.Empty); - if (jsonProperty.Value is JsonElement jsonPropertyValue) - results[jsonProperty.Name] = jsonPropertyValue.ToString(); - } - return results; - } - - public List GetIgnoreParameterNames(ILogic logic, Test test, bool includePairedParameterNames) - { - List results = ProcessDataDescription.GetIgnoreParameterNames(logic, this, test); - if (includePairedParameterNames) - { - string value; - List pairedParameterNames = ProcessDataDescription.GetPairedParameterNames(logic, this); - IProcessDataDescription processDataDescription = ProcessDataDescription.GetDisplayNames(logic, this); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - object @object = JsonSerializer.Deserialize(json); - if (!(@object is JsonElement jsonElement)) - throw new Exception(); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array) - throw new Exception(); - value = jsonProperty.Value.ToString(); - if (!results.Contains(jsonProperty.Name) && pairedParameterNames.Contains(jsonProperty.Name) && (string.IsNullOrEmpty(value) || value[0] == '|')) - results.Add(jsonProperty.Name); - } - } - return results; - } - - public List GetProcessDataDescriptions(JsonElement jsonElement) - { - List results; - if (jsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString }; - results = JsonSerializer.Deserialize>(jsonElement.ToString(), jsonSerializerOptions); - return results; - } - - public Dictionary> GetKeyValuePairs(List processDataDescriptions) - { - Dictionary> results = new Dictionary>(); - Test testKey; - for (int i = 0; i < processDataDescriptions.Count; i++) - { - testKey = (Test)processDataDescriptions[i].Test; - if (!results.ContainsKey(testKey)) - results.Add(testKey, new List()); - results[testKey].Add(processDataDescriptions[i]); - } - return results; - } - - public Dictionary> GetKeyValuePairs(JsonElement jsonElement, List processDataDescriptions, Test test) - { - Dictionary> results = new Dictionary>(); - Test testKey; - if (jsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray(); - if (processDataDescriptions.Count != jsonElements.Length) - throw new Exception(); - for (int i = 0; i < processDataDescriptions.Count; i++) - { - testKey = (Test)processDataDescriptions[i].Test; - if (testKey != test) - continue; - foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject()) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array) - throw new Exception(); - if (!results.ContainsKey(jsonProperty.Name)) - results.Add(jsonProperty.Name, new List()); - results[jsonProperty.Name].Add(jsonProperty.Value.ToString()); - } - } - return results; - } - - protected void VerifyProcessDataDescription(ILogic logic) - { - string description; - bool allowNull = false; - JsonElement defaultJsonElement = GetDefaultJsonElement(logic); - Dictionary keyValuePairs = GetDisplayNamesJsonElement(logic); - JsonProperty[] jsonProperties = defaultJsonElement.EnumerateObject().ToArray(); - foreach (JsonProperty jsonProperty in jsonProperties) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull) - throw new Exception(); - if (!(jsonProperty.Value.ValueKind is JsonValueKind.String) || !keyValuePairs.ContainsKey(jsonProperty.Name)) - description = string.Empty; - else - description = keyValuePairs[jsonProperty.Name].Split('|')[0]; - } - } - - public List GetIProcessDataDescriptions(JsonElement jsonElement) - { - List results = new List(); - if (jsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - object @object; - Type type = ProcessDataDescription.GetType(); - JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray(); - JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString }; - for (int i = 0; i < jsonElements.Length; i++) - { - @object = JsonSerializer.Deserialize(jsonElements[i].ToString(), type, jsonSerializerOptions); - if (!(@object is IProcessDataDescription processDataDescription)) - continue; - results.Add(processDataDescription); - } - return results; - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/EventName.cs b/Adaptation/Shared/Metrology/EventName.cs deleted file mode 100644 index 0a1cf0d..0000000 --- a/Adaptation/Shared/Metrology/EventName.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public enum EventName - { - FileRead, - FileReadDaily, - FileReadMonthly, - FileReadVerification, - FileReadWeekly - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/ILogic.cs b/Adaptation/Shared/Metrology/ILogic.cs deleted file mode 100644 index 01176cf..0000000 --- a/Adaptation/Shared/Metrology/ILogic.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; -using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Text.Json; - -namespace Adaptation.Shared.Metrology -{ - - public interface ILogic - { - - ILogic ShallowCopy(); - Logistics Logistics { get; } - - void ConfigurationRestore(); - string GetConfigurationErrorTargetFileLocation(); - string GetConfigurationSourceFileLocation(); - string GetConfigurationTarget2FileLocation(); - string GetConfigurationTargetFileLocation(); - string GetConfigurationTargetFileName(); - Tuple> GetExtractResult(string reportFullPath, string eventName); - object GetFilePathGeneratorInfo(string reportFullPath, bool isErrorFile); - string GetReportFullPath(Dictionary keyValuePairs); - string GetTarget2FileLocation(); - void Move(string reportFullPath, Tuple> extractResults, Exception exception = null); - Tuple> ReExtract(string searchDirectory, string sourceFileFilter); - void ReflectionCreateSelfDescription(string equipmentElementName, int? input, string cellName, string debugConfig, string[] strings, bool[] booleans, long[] numbers, string[] enums); - ConfigDataBase ReflectionCreateSelfDescriptionV2(string json); - string ResolveErrorTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = ""); - string ResolveSourcePlaceHolders(string reportFullPath, bool createDirectory = true); - string ResolveTarget2PlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = ""); - string ResolveTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = ""); - void SetFileParameter(string key, string value); - void SetFileParameterLotID(string value, bool includeLogisticsSequence = false); - void SetFileParameterLotIDToLogisticsMID(bool includeLogisticsSequence = true); - void SetFileParameterSystemDateTimeToLogisticsSequence(); - void SetPlaceHolder(string reportFullPath, string key, string value); - void SetTarget2FileLocation(string value); - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/MET08DDUPSFS6420.cs b/Adaptation/Shared/Metrology/MET08DDUPSFS6420.cs deleted file mode 100644 index 2214dc4..0000000 --- a/Adaptation/Shared/Metrology/MET08DDUPSFS6420.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public class MET08DDUPSFS6420 - { - - public enum Test - { - Tencor = Metrology.Test.Tencor - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/MET08DDUPSP1TBI.cs b/Adaptation/Shared/Metrology/MET08DDUPSP1TBI.cs deleted file mode 100644 index 751e9a4..0000000 --- a/Adaptation/Shared/Metrology/MET08DDUPSP1TBI.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public class MET08DDUPSP1TBI - { - - public enum Test - { - SP1 = Metrology.Test.SP1 - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/MET08RESIHGCV.cs b/Adaptation/Shared/Metrology/MET08RESIHGCV.cs deleted file mode 100644 index 36d411f..0000000 --- a/Adaptation/Shared/Metrology/MET08RESIHGCV.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public class MET08RESIHGCV - { - - public enum Test - { - HgCV = Metrology.Test.HgCV - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/MET08RESIMAPCDE.cs b/Adaptation/Shared/Metrology/MET08RESIMAPCDE.cs deleted file mode 100644 index 2628764..0000000 --- a/Adaptation/Shared/Metrology/MET08RESIMAPCDE.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public class MET08RESIMAPCDE - { - - public enum Test - { - CDE = Metrology.Test.CDE - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/MET08THFTIRQS408M.cs b/Adaptation/Shared/Metrology/MET08THFTIRQS408M.cs deleted file mode 100644 index 07aa62d..0000000 --- a/Adaptation/Shared/Metrology/MET08THFTIRQS408M.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public class MET08THFTIRQS408M - { - - public enum Test - { - BioRadQS408M = Metrology.Test.BioRadQS408M - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/MET08THFTIRSTRATUS.cs b/Adaptation/Shared/Metrology/MET08THFTIRSTRATUS.cs deleted file mode 100644 index 4e4ce83..0000000 --- a/Adaptation/Shared/Metrology/MET08THFTIRSTRATUS.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public class MET08THFTIRSTRATUS - { - - public enum Test - { - BioRadStratus = Metrology.Test.BioRadStratus - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/MET08XRDXPERTPROMRDXL.cs b/Adaptation/Shared/Metrology/MET08XRDXPERTPROMRDXL.cs deleted file mode 100644 index 15dc076..0000000 --- a/Adaptation/Shared/Metrology/MET08XRDXPERTPROMRDXL.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public class MET08XRDXPERTPROMRDXL - { - - public enum Test - { - XRDXY = Metrology.Test.XRDXY, - XRDWeightedAverage = Metrology.Test.XRDWeightedAverage, - MonthlyXRD = Metrology.Test.MonthlyXRD, - WeeklyXRD = Metrology.Test.WeeklyXRD, - WeeklyXRDAIcomp = Metrology.Test.WeeklyXRDAIcomp, - WeeklyXRDFWHM002 = Metrology.Test.WeeklyXRDFWHM002, - WeeklyXRDFWHM105 = Metrology.Test.WeeklyXRDFWHM105, - WeeklyXRDSLStks = Metrology.Test.WeeklyXRDSLStks, - WeeklyXRDXRR = Metrology.Test.WeeklyXRDXRR, - JVXRD = Metrology.Test.JVXRD - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/OISiViewer.cs b/Adaptation/Shared/Metrology/OISiViewer.cs deleted file mode 100644 index d29b992..0000000 --- a/Adaptation/Shared/Metrology/OISiViewer.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace Adaptation.Shared.Metrology -{ - - internal class OISiViewer - { - - private static System.Net.WebClient _WebClient; - - internal static string WebClientDownloadString(string baseAddress, ConfigDataBase configDataBase, string reportFullPath, bool isErrorFile, string target) - { - string result = string.Empty; - if (System.Diagnostics.Debugger.IsAttached) - result = DateTime.Now.ToString(); - else - { - if (string.IsNullOrEmpty(baseAddress) || !baseAddress.Contains(":") || !baseAddress.Contains(".")) - throw new Exception("Invalid URL"); - try - { - if (_WebClient is null) - _WebClient = new System.Net.WebClient(); - string address = string.Concat(baseAddress, "/Home/ExtractMove/?equipment_connection=", configDataBase.GetEquipmentType(), "&is_error_file=", isErrorFile); - _WebClient.OpenRead(address); - result = _WebClient.ResponseHeaders["Date"]; - _WebClient.CancelAsync(); - } - catch (Exception) { } - } - return result; - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/ProcessData.Duplicator.cs b/Adaptation/Shared/Metrology/ProcessData.Duplicator.cs deleted file mode 100644 index 1a7dc26..0000000 --- a/Adaptation/Shared/Metrology/ProcessData.Duplicator.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.Json; - -namespace Adaptation.Shared.Metrology -{ - - public class Duplicator - { - - public class Description : IProcessDataDescription - { - - public int Test { get; set; } - public int Count { get; set; } - public int Index { get; set; } - // - public string EventName { get; set; } - public string NullData { get; set; } - public string JobID { get; set; } - public string Sequence { get; set; } - public string MesEntity { get; set; } - public string ReportFullPath { get; set; } - public string ProcessJobID { get; set; } - public string MID { get; set; } - public string Date { get; set; } //2021-02-22 - - public string GetEventDescription() { return "File Has been read and parsed"; } - - public List GetHeaderNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetDetailNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetParameterNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test) - { - List results = new List(); - return results; - } - - public List GetNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - IProcessDataDescription processDataDescription = GetDefault(logic, configDataBase); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - object @object = JsonSerializer.Deserialize(json); - if (!(@object is JsonElement jsonElement)) - throw new Exception(); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - results.Add(jsonProperty.Name); - return results; - } - - public IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase) - { - Description result = new Description(); - return result; - } - - public IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase) - { - Description result = new Description - { - Test = -1, - Count = 0, - Index = -1, - // - EventName = configDataBase.GetEventName(), - NullData = string.Empty, - JobID = logic.Logistics.JobID, - Sequence = logic.Logistics.Sequence.ToString(), - MesEntity = logic.Logistics.MesEntity, - ReportFullPath = logic.Logistics.ReportFullPath, - ProcessJobID = logic.Logistics.ProcessJobID, - MID = logic.Logistics.MID, - Date = logic.Logistics.DateTimeFromSequence.ToUniversalTime().ToString("MM/dd/yyyy HH:mm:ss"), - }; - return result; - } - - public List GetDescription(ILogic logic, ConfigDataBase configDataBase, List tests, IProcessData iProcessData) - { - List results = new List(); - return results; - } - - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/ProcessDataStandardFormat.cs b/Adaptation/Shared/Metrology/ProcessDataStandardFormat.cs deleted file mode 100644 index 478b208..0000000 --- a/Adaptation/Shared/Metrology/ProcessDataStandardFormat.cs +++ /dev/null @@ -1,527 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json; - -namespace Adaptation.Shared.Metrology -{ - - public class ProcessDataStandardFormat - { - - public const string RecordStart = "RECORD_START"; - - public enum SearchFor - { - EquipmentIntegration = 1, - BusinessIntegration = 2, - SystemExport = 3, - Archive = 4 - } - - public static string GetPDSFText(ILogic logic, string eventName, string equipmentType, JsonElement jsonElement, string logisticsText) - { - string result; - if (jsonElement.ValueKind != JsonValueKind.Array) - result = string.Empty; - else - { - int columns = 0; - List lines; - string endOffset = "E#######T"; - string dataOffset = "D#######T"; - string headerOffset = "H#######T"; - string format = "MM/dd/yyyy HH:mm:ss"; - StringBuilder stringBuilder = new StringBuilder(); - lines = new string[] { "HEADER_TAG\tHEADER_VALUE", "FORMAT\t2.00", "NUMBER_PASSES\t0001", string.Concat("HEADER_OFFSET\t", headerOffset), string.Concat("DATA_OFFSET\t", dataOffset), string.Concat("END_OFFSET\t", endOffset) }.ToList(); - stringBuilder.Append("\"Time\"").Append('\t'); - stringBuilder.Append("\"A_LOGISTICS\"").Append('\t'); - stringBuilder.Append("\"B_LOGISTICS\"").Append('\t'); - JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray(); - for (int i = 0; i < jsonElements.Length;) - { - foreach (JsonProperty jsonProperty in jsonElements[0].EnumerateObject()) - { - columns += 1; - stringBuilder.Append("\"").Append(jsonProperty.Name).Append("\"").Append('\t'); - } - break; - } - stringBuilder.Remove(stringBuilder.Length - 1, 1); - lines.Add(stringBuilder.ToString()); - for (int i = 0; i < jsonElements.Length; i++) - { - stringBuilder.Clear(); - stringBuilder.Append("0.1").Append('\t'); - stringBuilder.Append("1").Append('\t'); - stringBuilder.Append("2").Append('\t'); - foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject()) - stringBuilder.Append(jsonProperty.Value).Append('\t'); - stringBuilder.Remove(stringBuilder.Length - 1, 1); - lines.Add(stringBuilder.ToString()); - } - lines.Add(string.Concat("NUM_DATA_ROWS ", jsonElements.Length.ToString().PadLeft(9, '0'))); - lines.Add(string.Concat("NUM_DATA_COLUMNS ", (columns + 3).ToString().PadLeft(9, '0'))); - lines.Add("DELIMITER ;"); - lines.Add(string.Concat("START_TIME_FORMAT ", format)); - lines.Add(string.Concat("START_TIME ", logic.Logistics.DateTimeFromSequence.ToString(format))); //12/26/2019 15:22:44 - lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "A_LOGISTICS")); - lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "B_LOGISTICS")); - if (!string.IsNullOrEmpty(logisticsText)) - lines.Add(logisticsText); - else - { - lines.Add(string.Concat("LOGISTICS_1", '\t', "A_CHAMBER=;A_INFO=", eventName, ";A_INFO2=", equipmentType, ";A_JOBID=", logic.Logistics.JobID, ";A_MES_ENTITY=", logic.Logistics.MesEntity, ";A_MID=", logic.Logistics.MID, ";A_NULL_DATA=", logic.Logistics.NullData, ";A_PPID=NO_PPID;A_PROCESS_JOBID=", logic.Logistics.ProcessJobID, ";A_PRODUCT=;A_SEQUENCE=", logic.Logistics.Sequence, ";A_WAFER_ID=;")); - lines.Add(string.Concat("LOGISTICS_2", '\t', "B_CHAMBER=;B_INFO=", eventName, ";B_INFO2=", equipmentType, ";B_JOBID=", logic.Logistics.JobID, ";B_MES_ENTITY=", logic.Logistics.MesEntity, ";B_MID=", logic.Logistics.MID, ";B_NULL_DATA=", logic.Logistics.NullData, ";B_PPID=NO_PPID;B_PROCESS_JOBID=", logic.Logistics.ProcessJobID, ";B_PRODUCT=;B_SEQUENCE=", logic.Logistics.Sequence, ";B_WAFER_ID=;")); - lines.Add("END_HEADER"); - } - stringBuilder.Clear(); - foreach (string line in lines) - stringBuilder.AppendLine(line); - result = stringBuilder.ToString(); - result = result.Replace(headerOffset, result.IndexOf("NUM_DATA_ROWS").ToString().PadLeft(9, '0')). - Replace(dataOffset, result.IndexOf('"').ToString().PadLeft(9, '0')). - Replace(endOffset, result.Length.ToString().PadLeft(9, '0')); - } - return result; - } - - public static Tuple GetLogisticsColumnsAndBody(string reportFullPath, string[] lines = null) - { - string segment; - List body = new List(); - StringBuilder logistics = new StringBuilder(); - if (lines is null) - lines = File.ReadAllLines(reportFullPath); - string[] segments; - if (lines.Length < 7) - segments = new string[] { }; - else - segments = lines[6].Trim().Split('\t'); - List columns = new List(); - for (int c = 0; c < segments.Length; c++) - { - segment = segments[c].Substring(1, segments[c].Length - 2); - if (!columns.Contains(segment)) - columns.Add(segment); - else - { - for (short i = 1; i < short.MaxValue; i++) - { - segment = string.Concat(segment, "_", i); - if (!columns.Contains(segment)) - { - columns.Add(segment); - break; - } - } - } - } - bool lookForLogistics = false; - for (int r = 7; r < lines.Count(); r++) - { - if (lines[r].StartsWith("NUM_DATA_ROWS")) - lookForLogistics = true; - if (!lookForLogistics) - { - body.Add(lines[r]); - continue; - } - if (lines[r].StartsWith("LOGISTICS_1")) - { - for (int i = r; i < lines.Count(); i++) - { - if (lines[r].StartsWith("END_HEADER")) - break; - logistics.AppendLine(lines[i]); - } - break; - } - } - return new Tuple(logistics.ToString(), columns.ToArray(), body.ToArray()); - } - - public static JsonElement GetArray(Tuple pdsf, bool lookForNumbers = false) - { - JsonElement result; - string logistics = pdsf.Item1; - string[] columns = pdsf.Item2; - string[] bodyLines = pdsf.Item3; - if (!bodyLines.Any() || !bodyLines[0].Contains('\t')) - result = JsonSerializer.Deserialize("[]"); - else - { - string value; - string[] segments; - StringBuilder stringBuilder = new StringBuilder(); - foreach (string bodyLine in bodyLines) - { - stringBuilder.Append('{'); - segments = bodyLine.Trim().Split('\t'); - if (!lookForNumbers) - { - for (int c = 1; c < segments.Length; c++) - { - value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); - stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\","); - } - } - else - { - for (int c = 1; c < segments.Length; c++) - { - value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); - if (string.IsNullOrEmpty(value)) - stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append("null,"); - else if (value.All(char.IsDigit)) - stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append(","); - else - stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\","); - } - } - stringBuilder.Remove(stringBuilder.Length - 1, 1); - stringBuilder.AppendLine("},"); - } - stringBuilder.Remove(stringBuilder.Length - 3, 3); - result = JsonSerializer.Deserialize(string.Concat("[", stringBuilder, "]")); - } - return result; - } - - public static Dictionary> GetDictionary(Tuple pdsf) - { - Dictionary> results = new Dictionary>(); - string[] segments; - string[] columns = pdsf.Item2; - string[] bodyLines = pdsf.Item3; - foreach (string column in columns) - results.Add(column, new List()); - foreach (string bodyLine in bodyLines) - { - segments = bodyLine.Split('\t'); - for (int c = 1; c < segments.Length; c++) - { - if (c >= columns.Length) - continue; - results[columns[c]].Add(segments[c]); - } - } - return results; - } - - public static Tuple>>> GetTestDictionary(Tuple pdsf) - { - Dictionary>> results = new Dictionary>>(); - string testColumn = Description.RowColumn.Test.ToString(); - Dictionary> keyValuePairs = GetDictionary(pdsf); - if (!keyValuePairs.ContainsKey(testColumn)) - throw new Exception(); - int min; - int max; - Test testKey; - List vs; - string columnKey; - Dictionary> tests = new Dictionary>(); - for (int i = 0; i < keyValuePairs[testColumn].Count; i++) - { - if (Enum.TryParse(keyValuePairs[testColumn][i], out Test test)) - { - if (!results.ContainsKey(test)) - { - tests.Add(test, new List()); - results.Add(test, new Dictionary>()); - } - tests[test].Add(i); - } - } - foreach (KeyValuePair> testKeyValuePair in tests) - { - testKey = testKeyValuePair.Key; - min = testKeyValuePair.Value.Min(); - max = testKeyValuePair.Value.Max() + 1; - foreach (KeyValuePair> keyValuePair in keyValuePairs) - results[testKey].Add(keyValuePair.Key, new List()); - foreach (KeyValuePair> keyValuePair in keyValuePairs) - { - vs = keyValuePair.Value; - columnKey = keyValuePair.Key; - for (int i = min; i < max; i++) - { - if (vs.Count > i) - results[testKey][columnKey].Add(vs[i]); - else - results[testKey][columnKey].Add(string.Empty); - } - } - } - return new Tuple>>>(pdsf.Item1, results); - } - - private static string GetString(SearchFor searchFor, bool addSpaces, char separator = ' ') - { - if (!addSpaces) - return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), searchFor); - else - return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), separator, searchFor.ToString().Replace("In", string.Concat(separator, "In")).Replace("Ex", string.Concat(separator, "Ex"))); - } - - public static string EquipmentIntegration(bool addSpaces = true, char separator = ' ') - { - return GetString(SearchFor.EquipmentIntegration, addSpaces, separator); - } - - public static string BusinessIntegration(bool addSpaces = true, char separator = ' ') - { - return GetString(SearchFor.BusinessIntegration, addSpaces, separator); - } - - public static string SystemExport(bool addSpaces = true, char separator = ' ') - { - return GetString(SearchFor.SystemExport, addSpaces, separator); - } - - public static string Archive(bool addSpaces = true, char separator = ' ') - { - return GetString(SearchFor.Archive, addSpaces, separator); - } - - public static string GetLines(Logistics logistics, IScopeInfo scopeInfo, Dictionary> keyValuePairs, Enum[] enumColumns, string dateFormat, string timeFormat, Column[] pairedColumns, bool useDateTimeFromSequence = true, string format = "", Dictionary alternateDisplayName = null, Enum[] ignoreColumns = null) - { - StringBuilder result = new StringBuilder(); - if (useDateTimeFromSequence && !string.IsNullOrEmpty(format)) - throw new Exception(); - else if (!useDateTimeFromSequence && string.IsNullOrEmpty(format)) - throw new Exception(); - int start; - string ckey; - string pKey; - int pairedColumnsCount; - string firstDuplicate = "_1"; - if (ignoreColumns is null) - ignoreColumns = new Enum[] { }; - if (alternateDisplayName is null) - alternateDisplayName = new Dictionary(); - string columnDate = Column.Date.ToString(); - string columnTime = Column.Time.ToString(); - List columnKeys = new List(); - foreach (Enum item in enumColumns) - { - if (ignoreColumns.Contains(item)) - continue; - columnKeys.Add(item.ToString()); - } - result.AppendLine(scopeInfo.Header); - StringBuilder line = new StringBuilder(); - int count = keyValuePairs[Description.RowColumn.Count.ToString()].Count(); - string nullData; - if (logistics.NullData is null) - nullData = string.Empty; - else - nullData = logistics.NullData.ToString(); - if (pairedColumns is null) - { - start = -1; - pairedColumnsCount = 0; - } - else - { - start = 0; - pairedColumnsCount = pairedColumns.Length; - } - for (int r = 0; r < count; r++) - { - for (int p = start; p < pairedColumnsCount; p++) - { - if (pairedColumnsCount == 0) - pKey = string.Empty; - else if (!(ignoreColumns is null) && ignoreColumns.Contains(pairedColumns[p])) - continue; - else - { - pKey = pairedColumns[p].ToString(); - if (!keyValuePairs.ContainsKey(pKey)) - continue; - else if (keyValuePairs[pKey][r] == nullData) - continue; - } - if (pairedColumnsCount == 0 || !string.IsNullOrEmpty(pKey)) - { - line.Clear(); - line.Append("!"); - for (int i = 0; i < columnKeys.Count; i++) - { - ckey = columnKeys[i]; - if (!keyValuePairs.ContainsKey(ckey)) - line.Append(string.Empty); - else - { - if (useDateTimeFromSequence && ckey == columnDate) - line.Append(logistics.DateTimeFromSequence.ToString(dateFormat)); - else if (useDateTimeFromSequence && ckey == columnTime) - line.Append(logistics.DateTimeFromSequence.ToString(timeFormat)); - else if (!useDateTimeFromSequence && ckey == columnDate && keyValuePairs[ckey][r].Length == format.Length) - line.Append(DateTime.ParseExact(keyValuePairs[ckey][r], format, CultureInfo.InvariantCulture).ToString(dateFormat)); - else if (!useDateTimeFromSequence && ckey == columnTime && keyValuePairs.ContainsKey(string.Concat(ckey, firstDuplicate)) && keyValuePairs[string.Concat(ckey, firstDuplicate)][r].Length == format.Length) - line.Append(DateTime.ParseExact(keyValuePairs[string.Concat(ckey, firstDuplicate)][r], format, CultureInfo.InvariantCulture).ToString(timeFormat)); - else - line.Append(keyValuePairs[ckey][r]); - } - line.Append(';'); - } - if (pairedColumnsCount > 0) - { - if (!alternateDisplayName.ContainsKey(pairedColumns[p])) - line.Append(pairedColumns[p].GetDiplayName()); - else - line.Append(alternateDisplayName[pairedColumns[p]]); - line.Append(';'); - line.Append(keyValuePairs[pKey][r]); - line.Append(';'); - } - line.Remove(line.Length - 1, 1); - result.AppendLine(line.ToString()); - } - } - } - return result.ToString(); - } - - public static string GetLines(Logistics logistics, IScopeInfo scopeInfo, List names, Dictionary> keyValuePairs, string dateFormat, string timeFormat, List pairedParameterNames, bool useDateTimeFromSequence = true, string format = "", List ignoreParameterNames = null) - { - StringBuilder result = new StringBuilder(); - if (ignoreParameterNames is null) - ignoreParameterNames = new List(); - if (useDateTimeFromSequence && !string.IsNullOrEmpty(format)) - throw new Exception(); - else if (!useDateTimeFromSequence && string.IsNullOrEmpty(format)) - throw new Exception(); - string nullData; - const string columnDate = "Date"; - const string columnTime = "Time"; - const string firstDuplicate = "_1"; - result.AppendLine(scopeInfo.Header); - StringBuilder line = new StringBuilder(); - if (logistics.NullData is null) - nullData = string.Empty; - else - nullData = logistics.NullData.ToString(); - int count = (from l in keyValuePairs select l.Value.Count).Min(); - for (int r = 0; r < count; r++) - { - line.Clear(); - line.Append("!"); - foreach (KeyValuePair> keyValuePair in keyValuePairs) - { - if (!names.Contains(keyValuePair.Key)) - continue; - if (ignoreParameterNames.Contains(keyValuePair.Key)) - continue; - if (pairedParameterNames.Contains(keyValuePair.Key)) - { - if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData) - continue; - else - result.Append(line).Append(keyValuePair.Key).Append(';').AppendLine(keyValuePair.Value[r]); - } - else - { - if (useDateTimeFromSequence && keyValuePair.Key == columnDate) - line.Append(logistics.DateTimeFromSequence.ToString(dateFormat)); - else if (useDateTimeFromSequence && keyValuePair.Key == columnTime) - line.Append(logistics.DateTimeFromSequence.ToString(timeFormat)); - else if (!useDateTimeFromSequence && keyValuePair.Key == columnDate && keyValuePair.Value[r].Length == format.Length) - line.Append(DateTime.ParseExact(keyValuePair.Value[r], format, CultureInfo.InvariantCulture).ToString(dateFormat)); - else if (!useDateTimeFromSequence && keyValuePair.Key == columnTime && keyValuePairs.ContainsKey(string.Concat(keyValuePair.Key, firstDuplicate)) && keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r].Length == format.Length) - line.Append(DateTime.ParseExact(keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r], format, CultureInfo.InvariantCulture).ToString(timeFormat)); - else if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData) - line.Append(nullData); - else - line.Append(keyValuePair.Value[r]); - line.Append(';'); - } - } - if (!pairedParameterNames.Any()) - { - line.Remove(line.Length - 1, 1); - result.AppendLine(line.ToString()); - } - } - return result.ToString(); - } - - public static List PDSFToFixedWidth(string reportFullPath) - { - List results = new List(); - if (!File.Exists(reportFullPath)) - throw new Exception(); - int[] group; - string line; - int startsAt = 0; - string[] segments; - int? currentGroup = null; - char inputSeperator = '\t'; - char outputSeperator = '\t'; - List vs = new List(); - List groups = new List(); - string[] lines = File.ReadAllLines(reportFullPath); - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < lines.Length; i++) - { - if (string.IsNullOrEmpty(lines[i])) - continue; - segments = lines[i].Split(inputSeperator); - if (currentGroup is null) - currentGroup = segments.Length; - if (segments.Length != currentGroup) - { - currentGroup = segments.Length; - groups.Add(new int[] { startsAt, i - 1 }); - startsAt = i; - } - } - if (startsAt == lines.Length - 1 && lines[0].Split(inputSeperator).Length != currentGroup) - groups.Add(new int[] { lines.Length - 1, lines.Length - 1 }); - for (int g = 0; g < groups.Count; g++) - { - vs.Clear(); - group = groups[g]; - line = lines[group[0]]; - segments = line.Split(inputSeperator); - for (int s = 0; s < segments.Length; s++) - vs.Add(segments[s].Length); - for (int i = group[0]; i <= group[1]; i++) - { - line = lines[i]; - segments = line.Split(inputSeperator); - for (int s = 0; s < segments.Length; s++) - { - if (vs[s] < segments[s].Length) - vs[s] = segments[s].Length; - } - } - stringBuilder.Clear(); - for (int s = 0; s < segments.Length; s++) - stringBuilder.Append((s + 1).ToString().PadLeft(vs[s], ' ')).Append(outputSeperator); - stringBuilder.Remove(stringBuilder.Length - 1, 1); - results.Add(stringBuilder.ToString()); - for (int i = group[0]; i <= group[1]; i++) - { - line = lines[i]; - stringBuilder.Clear(); - segments = line.Split(inputSeperator); - for (int s = 0; s < segments.Length; s++) - stringBuilder.Append(segments[s].PadLeft(vs[s], ' ')).Append(outputSeperator); - stringBuilder.Remove(stringBuilder.Length - 1, 1); - results.Add(stringBuilder.ToString()); - } - results.Add(string.Empty); - } - return results; - } - - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/ScopeInfo.cs b/Adaptation/Shared/Metrology/ScopeInfo.cs index 037d8a6..2de909e 100644 --- a/Adaptation/Shared/Metrology/ScopeInfo.cs +++ b/Adaptation/Shared/Metrology/ScopeInfo.cs @@ -1,409 +1,300 @@ using System; using System.IO; -namespace Adaptation.Shared.Metrology +namespace Adaptation.Shared.Metrology; + +public class ScopeInfo : Properties.IScopeInfo { - public class ScopeInfo : IScopeInfo + public Test Test { get; private set; } + public Enum Enum { get; private set; } + public string HTML { get; private set; } + public string Title { get; private set; } + public string FileName { get; private set; } + public int TestValue { get; private set; } + public string Header { get; private set; } + public string QueryFilter { get; private set; } + public string FileNameWithoutExtension { get; private set; } + + public ScopeInfo(Test test, string fileName, string queryFilter = "", string title = "", string html = "") { - - public Test Test { get; private set; } - public Enum Enum { get; private set; } - public string HTML { get; private set; } - public string Title { get; private set; } - public string FileName { get; private set; } - public int TestValue { get; private set; } - public string Header { get; private set; } - public string QueryFilter { get; private set; } - public string FileNameWithoutExtension { get; private set; } - public EquipmentType EquipmentType { get; private set; } - - public ScopeInfo(ILogic logic, ConfigDataBase configDataBase, Test test) - { - Enum = test; - Test = test; - TestValue = (int)test; - if (configDataBase.EquipmentConnection is null) - EquipmentType = configDataBase.EquipmentType; - else - EquipmentType = configDataBase.EquipmentConnection.Value; - string eventName = GetEventNameAndSetRemaining(); - if (eventName != configDataBase.GetEventName()) - { - File.Move(logic.Logistics.ReportFullPath, Path.ChangeExtension(logic.Logistics.ReportFullPath, eventName)); - throw new Exception(); - } - else if (EquipmentType != configDataBase.EquipmentType && EquipmentType != configDataBase.EquipmentConnection) - { - File.Move(logic.Logistics.ReportFullPath, Path.ChangeExtension(logic.Logistics.ReportFullPath, EquipmentType.ToString())); - throw new Exception(); - } - } - - public ScopeInfo(ILogic logic, ConfigDataBase configDataBase, Test test, string fileName, string queryFilter, string title = "", string html = "") - { - Enum = test; - Test = test; - TestValue = (int)test; - if (configDataBase.EquipmentConnection is null) - EquipmentType = configDataBase.EquipmentType; - else - EquipmentType = configDataBase.EquipmentConnection.Value; - FileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); - Header = string.Empty; - QueryFilter = queryFilter; - Title = title; - HTML = html; - FileName = fileName; - } - - public ScopeInfo ShallowCopy() - { - return (ScopeInfo)MemberwiseClone(); - } - - private string GetEventNameAndSetRemaining() - { - EventName eventName; - switch (Test) - { - case Test.AFMRoughness: - EquipmentType = EquipmentType.MET08AFMD3100; - eventName = EventName.FileRead; - FileNameWithoutExtension = "afm_iqs_01"; - Header = string.Empty; - QueryFilter = "AFM Roughness"; - Title = "AFM"; - HTML = @"GaN Epi Data\10 - afm.html"; - break; - case Test.BreakdownVoltageCenter: - EquipmentType = EquipmentType.MET08BVHGPROBE; - eventName = EventName.FileRead; - FileNameWithoutExtension = "bv_iqs_01"; - Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; - QueryFilter = "Breakdown Voltage"; - Title = "Breakdown Voltage-Center"; - HTML = @"GaN Epi Data\03 - bv-production.html"; - break; - case Test.BreakdownVoltageEdge: - EquipmentType = EquipmentType.MET08BVHGPROBE; - eventName = EventName.FileRead; - FileNameWithoutExtension = "bv_iqs_01_Edge"; - Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; - QueryFilter = "Breakdown Voltage - Edge"; - Title = "Breakdown Voltage-Edge"; - HTML = @"GaN Epi Data\03 - bv-production.html"; - break; - case Test.BreakdownVoltageMiddle8in: - EquipmentType = EquipmentType.MET08BVHGPROBE; - eventName = EventName.FileRead; - FileNameWithoutExtension = "bv_iqs_01_Middle"; - Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; - QueryFilter = "Breakdown Voltage - Middle"; - Title = "Breakdown Voltage-Middle (8 in)"; - HTML = @"GaN Epi Data\03 - bv-production.html"; - break; - case Test.CV: - EquipmentType = EquipmentType.MET08CVHGPROBE802B150; - eventName = EventName.FileRead; - FileNameWithoutExtension = "cv_iqs_01"; - Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; - QueryFilter = "CV_Ns"; - Title = "CV"; - HTML = @"GaN Epi Data\05 - cv.html"; - break; - case Test.MonthlyCV: - EquipmentType = EquipmentType.MET08CVHGPROBE802B150_Monthly; - eventName = EventName.FileReadMonthly; - FileNameWithoutExtension = "cv_iqs_01"; - Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; - QueryFilter = "CV_Ns"; - Title = "CV Monthly Verification"; - HTML = @"Metrology\07 - cv_verif_monthly.html"; - break; - case Test.WeeklyCV: - EquipmentType = EquipmentType.MET08CVHGPROBE802B150_Weekly; - eventName = EventName.FileReadWeekly; - FileNameWithoutExtension = "cv_iqs_01"; - Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; - QueryFilter = "CV_Ns"; - Title = "CV Weekly Verification"; - HTML = @"Metrology\16 - cv_verif_weekly.html"; - break; - case Test.CandelaKlarfDC: - EquipmentType = EquipmentType.MET08DDINCAN8620; - eventName = EventName.FileRead; - FileNameWithoutExtension = "candela_iqs_01"; - Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count"; - QueryFilter = "Candela Cracking"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.CandelaLaser: - EquipmentType = EquipmentType.MET08DDINCAN8620; - eventName = EventName.FileRead; - FileNameWithoutExtension = "candela_iqs_01"; - Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;Pits;Tool ID;Defect Count"; - QueryFilter = "Candela Cracking"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.CandelaVerify: - EquipmentType = EquipmentType.MET08DDINCAN8620; - eventName = EventName.FileRead; - FileNameWithoutExtension = "candela_iqs_01"; - Header = string.Concat("LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;RunID;Reactor;", "Slip Lines;Cracks;Epi Def;Haze Spot;Small LPD;Medium LPD;Large LPD;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count"); - QueryFilter = "Candela Cracking"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.CandelaPSL: - EquipmentType = EquipmentType.MET08DDINCAN8620_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "candela_iqs_01"; - Header = string.Empty; - QueryFilter = "102-83nm"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.CandelaProdU: - EquipmentType = EquipmentType.MET08DDINCAN8620_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "candela_iqs_01"; - Header = string.Empty; - QueryFilter = "SPE verification"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.Denton: - EquipmentType = EquipmentType.MET08EBEAMINTEGRITY26; - eventName = EventName.FileRead; - FileNameWithoutExtension = "denton_iqs_01"; - Header = "Tool;fDate;Run;Recipe;Operator;Name;Value"; - QueryFilter = "Denton_Voltage_AVG"; - Title = "Denton Data"; - HTML = @"Support Process\03 - ebeam02_denton_v1.html"; - break; - case Test.Hall: - EquipmentType = EquipmentType.MET08HALLHL5580; - eventName = EventName.FileRead; - FileNameWithoutExtension = "hall_iqs_01"; - Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; - QueryFilter = "Hall Rs"; - Title = "Hall Data"; - HTML = @"GaN Epi Data\04 - hall.html"; - break; - case Test.MonthlyHall: - EquipmentType = EquipmentType.MET08HALLHL5580_Monthly; - eventName = EventName.FileReadMonthly; - FileNameWithoutExtension = "hall_iqs_01"; - Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; - QueryFilter = "Hall Rs"; - Title = "Hall Monthly Verification"; - HTML = @"Metrology\06 - hall_verif_monthly.html"; - break; - case Test.WeeklyHall: - EquipmentType = EquipmentType.MET08HALLHL5580_Weekly; - eventName = EventName.FileReadWeekly; - FileNameWithoutExtension = "hall_iqs_01"; - Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; - QueryFilter = "Hall Rs"; - Title = "Hall Weekly Verification"; - HTML = @"Metrology\15 - hall_verif_weekly.html"; - break; - case Test.Lehighton: - EquipmentType = EquipmentType.MET08NDFRESIMAP151C; - eventName = EventName.FileRead; - FileNameWithoutExtension = "lei_iqs_01"; - Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value"; - QueryFilter = "LEI RS Average value"; - Title = "Lehighton"; - HTML = @"GaN Epi Data\13 - lehighton.html"; - break; - case Test.VerificationLehighton: - EquipmentType = EquipmentType.MET08NDFRESIMAP151C_Verification; - eventName = EventName.FileRead; - FileNameWithoutExtension = "___"; - Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value"; - QueryFilter = "___"; - Title = "LEI Weekly Verification 2 Ohm cm"; - HTML = @"Metrology\14 - lei_verif_weekly.html.html"; - break; - case Test.Microscope: - EquipmentType = EquipmentType.MET08MESMICROSCOPE; - eventName = EventName.FileRead; - FileNameWithoutExtension = string.Empty; - Header = string.Empty; - QueryFilter = "Microscope Center 5x"; - Title = "Total Microscope Defects"; - HTML = string.Empty; - break; - case Test.RPMXY: - EquipmentType = EquipmentType.MET08PLMAPRPM; - eventName = EventName.FileRead; - FileNameWithoutExtension = "RPM_Data"; - Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value"; - QueryFilter = "Barrier_Composition_RPM_XY"; - Title = "RPM XY Data ***&*** View Data"; - HTML = @"GaN Epi Data\09 - rpm --- 08 - photoluminescence.html"; - break; - case Test.RPMAverage: - EquipmentType = EquipmentType.MET08PLMAPRPM; - eventName = EventName.FileRead; - FileNameWithoutExtension = "RPMdata-short"; - Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File"; - QueryFilter = "Epi Thickness Mean"; - Title = "RPM Average Data"; - HTML = @"GaN Epi Data\09 - rpm.html"; - break; - case Test.RPMPLRatio: - EquipmentType = EquipmentType.MET08PLMAPRPM; - eventName = EventName.FileRead; - FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short"; - Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID"; - QueryFilter = "PL Ratio"; - Title = "Photoluminescence: PL Ratio"; - HTML = @"GaN Epi Data\08 - photoluminescence.html"; - break; - case Test.DailyRPMXY: - EquipmentType = EquipmentType.MET08PLMAPRPM_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "RPM_Data"; - Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value"; - QueryFilter = "Barrier_Composition_RPM_XY"; - Title = ""; - HTML = @"Metrology\?"; - break; - case Test.DailyRPMAverage: - EquipmentType = EquipmentType.MET08PLMAPRPM_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "RPMdata-short"; - Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File"; - QueryFilter = "Epi Thickness Mean"; - Title = ""; - HTML = @"Metrology\?"; - break; - case Test.DailyRPMPLRatio: - EquipmentType = EquipmentType.MET08PLMAPRPM_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short"; - Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID"; - QueryFilter = "PL Ratio"; - Title = "RPM Daily Verification"; - HTML = @"Metrology\17 - rpm_verif_daily.html"; - break; - case Test.VerificationRPM: - EquipmentType = EquipmentType.MET08PLMAPRPM_Verification; - eventName = EventName.FileReadVerification; - FileNameWithoutExtension = "PhotoLuminescence_Ver"; - Header = "Part;Process;Date;Test;Value"; - QueryFilter = "PL Edge Wavelength"; - Title = "PL Daily Verification - [PL Edge Wavelength]"; - HTML = @"Metrology\18 - photoluminescence_verif_daily.html"; - break; - case Test.Photoreflectance: - EquipmentType = EquipmentType.MET08PRFUSB4000; - eventName = EventName.FileRead; - FileNameWithoutExtension = "photoreflect_iqs_01"; - Header = "Lot;Date;Part;Reactor;Scribe;Pocket;Tool;Point;WaferPosition_PR;PR_Peak"; - QueryFilter = "PR Barrier Composition"; - Title = "Photoreflectance 6 in, Photoreflectance 8 in"; - HTML = @"GaN Epi Data\07 - photoreflectance.html"; - break; - case Test.UV: - EquipmentType = EquipmentType.MET08UVH44GS100M; - eventName = EventName.FileRead; - FileNameWithoutExtension = "uv_iqs_01"; - Header = string.Empty; - QueryFilter = "UV Broken"; - Title = "UV"; - HTML = @"GaN Epi Data\15 - uv 2.1.html"; - break; - case Test.VpdIcpmsAnalyte: - EquipmentType = EquipmentType.MET08VPDSUBCON; - eventName = EventName.FileRead; - FileNameWithoutExtension = "VPD_iqs_01"; - Header = "Reactor;RunID;RunDate;PartNumber;PocketNumber;WaferScribe;Analyte;Value"; - QueryFilter = "Mg"; - Title = "VpdIcpmsAnalyteData"; - HTML = @""; - break; - case Test.WarpAndBow: - EquipmentType = EquipmentType.MET08WGEOMX203641Q; - eventName = EventName.FileRead; - FileNameWithoutExtension = "warp_iqs_01"; - Header = "fDate;fRecipeName;fProductId;g4Scribe;warp;bow;tool;Reactor;Pocket ID;bow_range;BowX;BowY;CenterBow"; - QueryFilter = "BowCenter"; - Title = "Warp and Bow"; - HTML = @"GaN Epi Data\14 - warp.html"; - break; - case Test.VerificationWarpAndBow: - EquipmentType = EquipmentType.MET08WGEOMX203641Q_Verification; - eventName = EventName.FileReadVerification; - FileNameWithoutExtension = "warp_ver_iqs_01"; - Header = "Part;Process;Date;WaferScribe;totWarp;bow"; - QueryFilter = "Bow Calibration"; - Title = "6 Inch Warp/Bow Daily Verification, 8 Inch Warp/Bow Daily Verification"; - HTML = @"Metrology\19 - warp_cal_daily.html"; - break; - case Test.XRDXY: - EquipmentType = EquipmentType.MET08XRDXPERTPROMRDXL; - eventName = EventName.FileRead; - FileNameWithoutExtension = "xrd_iqs_NEW_01"; - Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group"; - QueryFilter = "SL Period"; - Title = "XRD XY Raw Data Viewer"; - HTML = @"GaN Epi Data\11 - xrd.html"; - break; - case Test.XRDWeightedAverage: - EquipmentType = EquipmentType.MET08XRDXPERTPROMRDXL; - eventName = EventName.FileRead; - FileNameWithoutExtension = "xrd_iqs_NEW_01_WtAVG"; - Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;Name;Value;Group"; - //QueryFilter = "Al% Barrier WTAVG"; - QueryFilter = "SL Period WTAVG"; - Title = "XRD Weighted Average Data"; - HTML = @"GaN Epi Data\11 - xrd.html"; - break; - case Test.MonthlyXRD: - EquipmentType = EquipmentType.MET08XRDXPERTPROMRDXL_Monthly; - eventName = EventName.FileReadMonthly; - FileNameWithoutExtension = "xrd_monthly_ver_iqs_01"; - Header = "Part;Process;Date;TestName;Value"; - QueryFilter = "XRD 2-Theta Position"; - Title = "XRD Monthly Verification"; - HTML = @"Metrology\03 - xrd_verif_monthly.html"; - break; - case Test.WeeklyXRD: - EquipmentType = EquipmentType.MET08XRDXPERTPROMRDXL_Weekly; - eventName = EventName.FileReadWeekly; - FileNameWithoutExtension = "xrd_weekly_ver_iqs_01"; - Header = "Part;Process;Lot;Date;TestName;Value"; - QueryFilter = "XRD Weekly AL% Center"; - Title = "XRD Weekly Verification"; - HTML = @"Metrology\12 - xrd_verif_weekly.html"; - break; - case Test.JVXRD: - EquipmentType = EquipmentType.METBRXRAYJV7300L; - eventName = EventName.FileRead; - FileNameWithoutExtension = "xrd_iqs_NEW_01"; - Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group"; - QueryFilter = "SL Period"; - Title = "XRD XY Raw Data Viewer"; - HTML = @"GaN Epi Data\11 - xrd.html"; - break; - default: - throw new Exception(); - } - FileName = string.Concat(FileNameWithoutExtension, ".txt"); - return eventName.ToString(); - } - - public override string ToString() - { - return string.Concat(EquipmentType, " - (", Enum, ""); - } - + Enum = test; + Test = test; + HTML = html; + Title = title; + FileName = fileName; + TestValue = (int)test; + Header = string.Empty; + QueryFilter = queryFilter; + FileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); } + public ScopeInfo(Test test) + { + Enum = test; + Test = test; + TestValue = (int)test; + switch (Test) + { + case Test.AFMRoughness: + FileNameWithoutExtension = "afm_iqs_01"; + Header = string.Empty; + QueryFilter = "AFM Roughness"; + Title = "AFM"; + HTML = @"GaN Epi Data\10 - afm.html"; + break; + case Test.BreakdownVoltageCenter: + FileNameWithoutExtension = "bv_iqs_01"; + Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; + QueryFilter = "Breakdown Voltage"; + Title = "Breakdown Voltage-Center"; + HTML = @"GaN Epi Data\03 - bv-production.html"; + break; + case Test.BreakdownVoltageEdge: + FileNameWithoutExtension = "bv_iqs_01_Edge"; + Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; + QueryFilter = "Breakdown Voltage - Edge"; + Title = "Breakdown Voltage-Edge"; + HTML = @"GaN Epi Data\03 - bv-production.html"; + break; + case Test.BreakdownVoltageMiddle8in: + FileNameWithoutExtension = "bv_iqs_01_Middle"; + Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; + QueryFilter = "Breakdown Voltage - Middle"; + Title = "Breakdown Voltage-Middle (8 in)"; + HTML = @"GaN Epi Data\03 - bv-production.html"; + break; + case Test.CV: + FileNameWithoutExtension = "cv_iqs_01"; + Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; + QueryFilter = "CV_Ns"; + Title = "CV"; + HTML = @"GaN Epi Data\05 - cv.html"; + break; + case Test.MonthlyCV: + FileNameWithoutExtension = "cv_iqs_01"; + Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; + QueryFilter = "CV_Ns"; + Title = "CV Monthly Verification"; + HTML = @"Metrology\07 - cv_verif_monthly.html"; + break; + case Test.WeeklyCV: + FileNameWithoutExtension = "cv_iqs_01"; + Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; + QueryFilter = "CV_Ns"; + Title = "CV Weekly Verification"; + HTML = @"Metrology\16 - cv_verif_weekly.html"; + break; + case Test.CandelaKlarfDC: + FileNameWithoutExtension = "candela_iqs_01"; + Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count"; + QueryFilter = "Candela Cracking"; + Title = "Candela"; + HTML = @"GaN Epi Data\12 - candela.html"; + break; + case Test.CandelaLaser: + FileNameWithoutExtension = "candela_iqs_01"; + Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;Pits;Tool ID;Defect Count"; + QueryFilter = "Candela Cracking"; + Title = "Candela"; + HTML = @"GaN Epi Data\12 - candela.html"; + break; + case Test.CandelaVerify: + FileNameWithoutExtension = "candela_iqs_01"; + Header = string.Concat("LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;RunID;Reactor;", "Slip Lines;Cracks;Epi Def;Haze Spot;Small LPD;Medium LPD;Large LPD;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count"); + QueryFilter = "Candela Cracking"; + Title = "Candela"; + HTML = @"GaN Epi Data\12 - candela.html"; + break; + case Test.CandelaPSL: + FileNameWithoutExtension = "candela_iqs_01"; + Header = string.Empty; + QueryFilter = "102-83nm"; + Title = "Candela"; + HTML = @"GaN Epi Data\12 - candela.html"; + break; + case Test.CandelaProdU: + FileNameWithoutExtension = "candela_iqs_01"; + Header = string.Empty; + QueryFilter = "SPE verification"; + Title = "Candela"; + HTML = @"GaN Epi Data\12 - candela.html"; + break; + case Test.Denton: + FileNameWithoutExtension = "denton_iqs_01"; + Header = "Tool;fDate;Run;Recipe;Operator;Name;Value"; + QueryFilter = "Denton_Voltage_AVG"; + Title = "Denton Data"; + HTML = @"Support Process\03 - ebeam02_denton_v1.html"; + break; + case Test.Hall: + FileNameWithoutExtension = "hall_iqs_01"; + Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; + QueryFilter = "Hall Rs"; + Title = "Hall Data"; + HTML = @"GaN Epi Data\04 - hall.html"; + break; + case Test.MonthlyHall: + FileNameWithoutExtension = "hall_iqs_01"; + Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; + QueryFilter = "Hall Rs"; + Title = "Hall Monthly Verification"; + HTML = @"Metrology\06 - hall_verif_monthly.html"; + break; + case Test.WeeklyHall: + FileNameWithoutExtension = "hall_iqs_01"; + Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; + QueryFilter = "Hall Rs"; + Title = "Hall Weekly Verification"; + HTML = @"Metrology\15 - hall_verif_weekly.html"; + break; + case Test.Lehighton: + FileNameWithoutExtension = "lei_iqs_01"; + Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value"; + QueryFilter = "LEI RS Average value"; + Title = "Lehighton"; + HTML = @"GaN Epi Data\13 - lehighton.html"; + break; + case Test.VerificationLehighton: + FileNameWithoutExtension = "___"; + Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value"; + QueryFilter = "___"; + Title = "LEI Weekly Verification 2 Ohm cm"; + HTML = @"Metrology\14 - lei_verif_weekly.html.html"; + break; + case Test.Microscope: + FileNameWithoutExtension = string.Empty; + Header = string.Empty; + QueryFilter = "Microscope Center 5x"; + Title = "Total Microscope Defects"; + HTML = string.Empty; + break; + case Test.RPMXY: + FileNameWithoutExtension = "RPM_Data"; + Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value"; + QueryFilter = "Barrier_Composition_RPM_XY"; + Title = "RPM XY Data ***&*** View Data"; + HTML = @"GaN Epi Data\09 - rpm --- 08 - photoluminescence.html"; + break; + case Test.RPMAverage: + FileNameWithoutExtension = "RPMdata-short"; + Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File"; + QueryFilter = "Epi Thickness Mean"; + Title = "RPM Average Data"; + HTML = @"GaN Epi Data\09 - rpm.html"; + break; + case Test.RPMPLRatio: + FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short"; + Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID"; + QueryFilter = "PL Ratio"; + Title = "Photoluminescence: PL Ratio"; + HTML = @"GaN Epi Data\08 - photoluminescence.html"; + break; + case Test.DailyRPMXY: + FileNameWithoutExtension = "RPM_Data"; + Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value"; + QueryFilter = "Barrier_Composition_RPM_XY"; + Title = ""; + HTML = @"Metrology\?"; + break; + case Test.DailyRPMAverage: + FileNameWithoutExtension = "RPMdata-short"; + Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File"; + QueryFilter = "Epi Thickness Mean"; + Title = ""; + HTML = @"Metrology\?"; + break; + case Test.DailyRPMPLRatio: + FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short"; + Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID"; + QueryFilter = "PL Ratio"; + Title = "RPM Daily Verification"; + HTML = @"Metrology\17 - rpm_verif_daily.html"; + break; + case Test.VerificationRPM: + FileNameWithoutExtension = "PhotoLuminescence_Ver"; + Header = "Part;Process;Date;Test;Value"; + QueryFilter = "PL Edge Wavelength"; + Title = "PL Daily Verification - [PL Edge Wavelength]"; + HTML = @"Metrology\18 - photoluminescence_verif_daily.html"; + break; + case Test.Photoreflectance: + FileNameWithoutExtension = "photoreflect_iqs_01"; + Header = "Lot;Date;Part;Reactor;Scribe;Pocket;Tool;Point;WaferPosition_PR;PR_Peak"; + QueryFilter = "PR Barrier Composition"; + Title = "Photoreflectance 6 in, Photoreflectance 8 in"; + HTML = @"GaN Epi Data\07 - photoreflectance.html"; + break; + case Test.UV: + FileNameWithoutExtension = "uv_iqs_01"; + Header = string.Empty; + QueryFilter = "UV Broken"; + Title = "UV"; + HTML = @"GaN Epi Data\15 - uv 2.1.html"; + break; + case Test.VpdIcpmsAnalyte: + FileNameWithoutExtension = "VPD_iqs_01"; + Header = "Reactor;RunID;RunDate;PartNumber;PocketNumber;WaferScribe;Analyte;Value"; + QueryFilter = "Mg"; + Title = "VpdIcpmsAnalyteData"; + HTML = @""; + break; + case Test.WarpAndBow: + FileNameWithoutExtension = "warp_iqs_01"; + Header = "fDate;fRecipeName;fProductId;g4Scribe;warp;bow;tool;Reactor;Pocket ID;bow_range;BowX;BowY;CenterBow"; + QueryFilter = "BowCenter"; + Title = "Warp and Bow"; + HTML = @"GaN Epi Data\14 - warp.html"; + break; + case Test.VerificationWarpAndBow: + FileNameWithoutExtension = "warp_ver_iqs_01"; + Header = "Part;Process;Date;WaferScribe;totWarp;bow"; + QueryFilter = "Bow Calibration"; + Title = "6 Inch Warp/Bow Daily Verification, 8 Inch Warp/Bow Daily Verification"; + HTML = @"Metrology\19 - warp_cal_daily.html"; + break; + case Test.XRDXY: + FileNameWithoutExtension = "xrd_iqs_NEW_01"; + Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group"; + QueryFilter = "SL Period"; + Title = "XRD XY Raw Data Viewer"; + HTML = @"GaN Epi Data\11 - xrd.html"; + break; + case Test.XRDWeightedAverage: + FileNameWithoutExtension = "xrd_iqs_NEW_01_WtAVG"; + Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;Name;Value;Group"; + //QueryFilter = "Al% Barrier WTAVG"; + QueryFilter = "SL Period WTAVG"; + Title = "XRD Weighted Average Data"; + HTML = @"GaN Epi Data\11 - xrd.html"; + break; + case Test.MonthlyXRD: + FileNameWithoutExtension = "xrd_monthly_ver_iqs_01"; + Header = "Part;Process;Date;TestName;Value"; + QueryFilter = "XRD 2-Theta Position"; + Title = "XRD Monthly Verification"; + HTML = @"Metrology\03 - xrd_verif_monthly.html"; + break; + case Test.WeeklyXRD: + FileNameWithoutExtension = "xrd_weekly_ver_iqs_01"; + Header = "Part;Process;Lot;Date;TestName;Value"; + QueryFilter = "XRD Weekly AL% Center"; + Title = "XRD Weekly Verification"; + HTML = @"Metrology\12 - xrd_verif_weekly.html"; + break; + case Test.JVXRD: + FileNameWithoutExtension = "xrd_iqs_NEW_01"; + Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group"; + QueryFilter = "SL Period"; + Title = "XRD XY Raw Data Viewer"; + HTML = @"GaN Epi Data\11 - xrd.html"; + break; + default: + throw new Exception(); + } + FileName = string.Concat(FileNameWithoutExtension, ".txt"); + } + + public ScopeInfo ShallowCopy() => (ScopeInfo)MemberwiseClone(); + } \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/Test.cs b/Adaptation/Shared/Metrology/Test.cs deleted file mode 100644 index 3771e68..0000000 --- a/Adaptation/Shared/Metrology/Test.cs +++ /dev/null @@ -1,57 +0,0 @@ -namespace Adaptation.Shared.Metrology -{ - - public enum Test - { - AFMRoughness = 34, - BioRadQS408M = 25, - BioRadStratus = 26, - BreakdownVoltageCenter = 0, - BreakdownVoltageEdge = 1, - BreakdownVoltageMiddle8in = 2, - CandelaKlarfDC = 6, - CandelaLaser = 36, - CandelaProdU = 39, - CandelaPSL = 38, - CandelaVerify = 37, - CDE = 24, - CV = 3, - DailyRPMAverage = 19, - DailyRPMPLRatio = 20, - DailyRPMXY = 18, - Denton = 9, - DiffusionLength = 45, - Hall = 10, - HgCV = 23, - Lehighton = 13, - Microscope = 46, - MonthlyCV = 4, - MonthlyHall = 11, - MonthlyXRD = 32, - Photoreflectance = 22, - PlatoA = 48, //Largest - RPMAverage = 16, - RPMPLRatio = 17, - RPMXY = 15, - SP1 = 8, - Tencor = 7, - UV = 35, - VerificationLehighton = 14, - VerificationRPM = 21, - VerificationWarpAndBow = 29, - VpdIcpmsAnalyte = 27, - WarpAndBow = 28, - WeeklyCV = 5, - WeeklyHall = 12, - WeeklyXRD = 33, - WeeklyXRDAIcomp = 40, - WeeklyXRDFWHM002 = 41, - WeeklyXRDFWHM105 = 42, - WeeklyXRDSLStks = 43, - WeeklyXRDXRR = 44, - XRDWeightedAverage = 31, - JVXRD = 47, - XRDXY = 30 - } - -} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/WS.Attachment.cs b/Adaptation/Shared/Metrology/WS.Attachment.cs index 540e760..ea105ed 100644 --- a/Adaptation/Shared/Metrology/WS.Attachment.cs +++ b/Adaptation/Shared/Metrology/WS.Attachment.cs @@ -1,22 +1,19 @@ -namespace Adaptation.Shared.Metrology +namespace Adaptation.Shared.Metrology; + +public partial class WS { - - public partial class WS + public class Attachment { - public class Attachment + + public string UniqueId { get; set; } + public string DestinationFileName { get; set; } + public string SourceFileName { get; set; } + + public Attachment(string uniqueId, string destinationFileName, string sourceFileName) { - - public string UniqueId { get; set; } - public string DestinationFileName { get; set; } - public string SourceFileName { get; set; } - - public Attachment(string uniqueId, string destinationFileName, string sourceFileName) - { - UniqueId = uniqueId; - DestinationFileName = destinationFileName; - SourceFileName = sourceFileName; - } - + UniqueId = uniqueId; + DestinationFileName = destinationFileName; + SourceFileName = sourceFileName; } } diff --git a/Adaptation/Shared/Metrology/WS.Results.cs b/Adaptation/Shared/Metrology/WS.Results.cs index ada4b97..2d1c603 100644 --- a/Adaptation/Shared/Metrology/WS.Results.cs +++ b/Adaptation/Shared/Metrology/WS.Results.cs @@ -1,33 +1,27 @@ using System.Collections.Generic; using System.Text.Json; -namespace Adaptation.Shared.Metrology +namespace Adaptation.Shared.Metrology; + +public partial class WS { - - public partial class WS + // this class represents the response from the Inbound API endpoint + public class Results { - // this class represents the response from the Inbound API endpoint - public class Results - { - // true or false if data was written to the database - public bool Success { get; set; } + // true or false if data was written to the database + public bool Success { get; set; } - // if true, contains ID of the Header record in the database - public long HeaderID { get; set; } + // if true, contains ID of the Header record in the database + public long HeaderID { get; set; } - // if false, this collection will contain a list of errors - public List Errors { get; set; } + // if false, this collection will contain a list of errors + public List Errors { get; set; } - // this collection will contain a list of warnings, they will not prevent data from being saved - public List Warnings { get; set; } - - // this is just a helper function to make displaying the results easier - public override string ToString() - { - return JsonSerializer.Serialize(this, GetType()); - } - } + // this collection will contain a list of warnings, they will not prevent data from being saved + public List Warnings { get; set; } + // this is just a helper function to make displaying the results easier + public override string ToString() => JsonSerializer.Serialize(this, GetType()); } } \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/WS.cs b/Adaptation/Shared/Metrology/WS.cs index 1fa6b5a..e08d4e3 100644 --- a/Adaptation/Shared/Metrology/WS.cs +++ b/Adaptation/Shared/Metrology/WS.cs @@ -1,127 +1,123 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net.Http; using System.Text; using System.Text.Json; -namespace Adaptation.Shared.Metrology +namespace Adaptation.Shared.Metrology; + +public partial class WS { - public partial class WS + public static Tuple SendData(string url, object payload, int timeoutSeconds = 120) { - - public static Tuple SendData(string url, object payload, int timeoutSeconds = 120) + Results results = new(); + string resultsJson = string.Empty; + try { - Results results = new Results(); - string resultsJson = string.Empty; - try + string json = JsonSerializer.Serialize(payload, payload.GetType()); + if (string.IsNullOrEmpty(url) || !url.Contains(':') || !url.Contains('.')) + throw new Exception("Invalid URL"); + using (HttpClient httpClient = new()) { - string json = JsonSerializer.Serialize(payload, payload.GetType()); - if (string.IsNullOrEmpty(url) || !url.Contains(":") || !url.Contains(".")) - throw new Exception("Invalid URL"); - using (HttpClient httpClient = new HttpClient()) - { - httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0); - HttpRequestMessage httpRequestMessage = new HttpRequestMessage - { - RequestUri = new Uri(url), - Method = HttpMethod.Post, - Content = new StringContent(json, Encoding.UTF8, "application/json") - }; - HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead).Result; - resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result; - results = JsonSerializer.Deserialize(resultsJson); - } - if (!results.Success) - results.Errors.Add(results.ToString()); - } - catch (Exception e) - { - Exception exception = e; - StringBuilder stringBuilder = new StringBuilder(); - while (!(exception is null)) - { - stringBuilder.AppendLine(exception.Message); - exception = exception.InnerException; - } - if (results.Errors is null) - results.Errors = new List(); - results.Errors.Add(stringBuilder.ToString()); - } - return new Tuple(resultsJson, results); - } - - // this method is a wrapper for attaching a file to either a header or data record - // URL is the same URL used for SendData, ex: http://localhost/api/inbound/CDE - // attachToHeaderId is the ID returned by SendData - // attachToDataUniqueId is the string unique ID for the data record, aka the Title of the Sharepoint list entry - // fileContents is a byte array with the contents of the file - // fileName is which attachment this is, image.pdf, data.pdf, data.txt, header.pdf, etc - // timeoutSeconds is configured as the request timeout - // this method will either succeed or throw an exception - // also, this has been made synchronous - public static void AttachFile(string url, long attachToHeaderId, string attachToDataUniqueId, byte[] fileContents, string fileName, int timeoutSeconds = 60) - { - using (HttpClient httpClient = new HttpClient()) - { - string requestUrl = url + "/attachment?headerid=" + attachToHeaderId.ToString(); - if (!string.IsNullOrWhiteSpace(attachToDataUniqueId)) - { - requestUrl += "&datauniqueid="; - requestUrl += System.Net.WebUtility.UrlEncode(attachToDataUniqueId); - } - requestUrl += "&filename="; // this is just so the web server log shows the filename - requestUrl += System.Net.WebUtility.UrlEncode(fileName); - httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0); - - MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent(); - ByteArrayContent byteArrayContent = new ByteArrayContent(fileContents); - byteArrayContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); - - multipartFormDataContent.Add(byteArrayContent, "attachment", fileName); - - HttpResponseMessage httpResponseMessage = httpClient.PostAsync(requestUrl, multipartFormDataContent).Result; - - if (httpResponseMessage.IsSuccessStatusCode) - return; - - string resultBody = httpResponseMessage.Content.ReadAsStringAsync().Result; - - throw new Exception("Attachment failed: " + resultBody); + HttpRequestMessage httpRequestMessage = new() + { + RequestUri = new Uri(url), + Method = HttpMethod.Post, + Content = new StringContent(json, Encoding.UTF8, "application/json") + }; + HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead).Result; + resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result; + results = JsonSerializer.Deserialize(resultsJson); } + if (!results.Success) + results.Errors.Add(results.ToString()); } - - public static void AttachFiles(string url, long headerID, List headerAttachments = null, List dataAttachments = null) + catch (Exception e) { - try + Exception exception = e; + StringBuilder stringBuilder = new(); + while (exception is not null) { - if (!(headerAttachments is null)) - { - foreach (Attachment attachment in headerAttachments) - AttachFile(url, headerID, "", System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); - } - if (!(dataAttachments is null)) - { - foreach (Attachment attachment in dataAttachments) - AttachFile(url, headerID, attachment.UniqueId, System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); - } - //MessageBox.Show(r.ToString()); - } - catch (Exception e) - { - Exception exception = e; - StringBuilder stringBuilder = new StringBuilder(); - while (!(exception is null)) - { - stringBuilder.AppendLine(exception.Message); - exception = exception.InnerException; - } - //MessageBox.Show(msgs.ToString(), "Exception", //MessageBoxButtons.OK, //MessageBoxIcon.Error); - throw new Exception(stringBuilder.ToString()); + _ = stringBuilder.AppendLine(exception.Message); + exception = exception.InnerException; } + if (results.Errors is null) + results.Errors = new List(); + results.Errors.Add(stringBuilder.ToString()); } + return new Tuple(resultsJson, results); + } + // this method is a wrapper for attaching a file to either a header or data record + // URL is the same URL used for SendData, ex: http://localhost/api/inbound/TENCOR + // attachToHeaderId is the ID returned by SendData + // attachToDataUniqueId is the string unique ID for the data record, aka the Title of the Sharepoint list entry + // fileContents is a byte array with the contents of the file + // fileName is which attachment this is, image.pdf, data.pdf, data.txt, header.pdf, etc + // timeoutSeconds is configured as the request timeout + // this method will either succeed or throw an exception + // also, this has been made synchronous + public static void AttachFile(string url, long attachToHeaderId, string attachToDataUniqueId, byte[] fileContents, string fileName, int timeoutSeconds = 60) + { + using HttpClient httpClient = new(); + string requestUrl = url + "/attachment?headerid=" + attachToHeaderId.ToString(); + if (!string.IsNullOrWhiteSpace(attachToDataUniqueId)) + { + requestUrl += "&datauniqueid="; + requestUrl += System.Net.WebUtility.UrlEncode(attachToDataUniqueId); + } + requestUrl += "&filename="; // this is just so the web server log shows the filename + requestUrl += System.Net.WebUtility.UrlEncode(fileName); + + httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0); + + MultipartFormDataContent multipartFormDataContent = new(); + ByteArrayContent byteArrayContent = new(fileContents); + byteArrayContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); + + multipartFormDataContent.Add(byteArrayContent, "attachment", fileName); + + HttpResponseMessage httpResponseMessage = httpClient.PostAsync(requestUrl, multipartFormDataContent).Result; + + if (httpResponseMessage.IsSuccessStatusCode) + return; + + string resultBody = httpResponseMessage.Content.ReadAsStringAsync().Result; + + throw new Exception("Attachment failed: " + resultBody); + } + + public static void AttachFiles(string url, long headerID, List headerAttachments = null, List dataAttachments = null) + { + try + { + if (headerAttachments is not null) + { + foreach (Attachment attachment in headerAttachments) + AttachFile(url, headerID, "", System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); + } + if (dataAttachments is not null) + { + foreach (Attachment attachment in dataAttachments) + AttachFile(url, headerID, attachment.UniqueId, System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); + } + //MessageBox.Show(r.ToString()); + } + catch (Exception e) + { + Exception exception = e; + StringBuilder stringBuilder = new(); + while (exception is not null) + { + _ = stringBuilder.AppendLine(exception.Message); + exception = exception.InnerException; + } + //MessageBox.Show(msgs.ToString(), "Exception", //MessageBoxButtons.OK, //MessageBoxIcon.Error); + throw new Exception(stringBuilder.ToString()); + } } } \ No newline at end of file diff --git a/Adaptation/Shared/ParameterType.cs b/Adaptation/Shared/ParameterType.cs new file mode 100644 index 0000000..cd3fc15 --- /dev/null +++ b/Adaptation/Shared/ParameterType.cs @@ -0,0 +1,10 @@ +namespace Adaptation.Shared; + +public enum ParameterType +{ + String = 0, + Integer = 2, + Double = 3, + Boolean = 4, + StructuredType = 5 +} \ No newline at end of file diff --git a/Adaptation/Shared/ProcessDataStandardFormat.cs b/Adaptation/Shared/ProcessDataStandardFormat.cs new file mode 100644 index 0000000..251d1b4 --- /dev/null +++ b/Adaptation/Shared/ProcessDataStandardFormat.cs @@ -0,0 +1,411 @@ +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; + +namespace Adaptation.Shared; + +public class ProcessDataStandardFormat +{ + + public const string RecordStart = "RECORD_START"; + + public enum SearchFor + { + EquipmentIntegration = 1, + BusinessIntegration = 2, + SystemExport = 3, + Archive = 4 + } + + public static string GetPDSFText(IFileRead fileRead, Logistics logistics, JsonElement[] jsonElements, string logisticsText) + { + string result; + if (!jsonElements.Any()) + result = string.Empty; + else + { + int columns = 0; + List lines; + string endOffset = "E#######T"; + string dataOffset = "D#######T"; + string headerOffset = "H#######T"; + string format = "MM/dd/yyyy HH:mm:ss"; + StringBuilder stringBuilder = new(); + lines = new string[] { "HEADER_TAG\tHEADER_VALUE", "FORMAT\t2.00", "NUMBER_PASSES\t0001", string.Concat("HEADER_OFFSET\t", headerOffset), string.Concat("DATA_OFFSET\t", dataOffset), string.Concat("END_OFFSET\t", endOffset) }.ToList(); + _ = stringBuilder.Append("\"Time\"").Append('\t'); + _ = stringBuilder.Append("\"A_LOGISTICS\"").Append('\t'); + _ = stringBuilder.Append("\"B_LOGISTICS\"").Append('\t'); + for (int i = 0; i < jsonElements.Length;) + { + foreach (JsonProperty jsonProperty in jsonElements[0].EnumerateObject()) + { + columns += 1; + _ = stringBuilder.Append('"').Append(jsonProperty.Name).Append('"').Append('\t'); + } + break; + } + _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); + lines.Add(stringBuilder.ToString()); + for (int i = 0; i < jsonElements.Length; i++) + { + _ = stringBuilder.Clear(); + _ = stringBuilder.Append("0.1").Append('\t'); + _ = stringBuilder.Append('1').Append('\t'); + _ = stringBuilder.Append('2').Append('\t'); + foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject()) + _ = stringBuilder.Append(jsonProperty.Value).Append('\t'); + _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); + lines.Add(stringBuilder.ToString()); + } + lines.Add(string.Concat("NUM_DATA_ROWS ", jsonElements.Length.ToString().PadLeft(9, '0'))); + lines.Add(string.Concat("NUM_DATA_COLUMNS ", (columns + 3).ToString().PadLeft(9, '0'))); + lines.Add("DELIMITER ;"); + lines.Add(string.Concat("START_TIME_FORMAT ", format)); + lines.Add(string.Concat("START_TIME ", logistics.DateTimeFromSequence.ToString(format))); //12/26/2019 15:22:44 + lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "A_LOGISTICS")); + lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "B_LOGISTICS")); + if (!string.IsNullOrEmpty(logisticsText)) + lines.Add(logisticsText); + else + { + lines.Add(string.Concat("LOGISTICS_1", '\t', "A_CHAMBER=;A_INFO=", fileRead.EventName, ";A_INFO2=", fileRead.EquipmentType, ";A_JOBID=", fileRead.CellInstanceName, ";A_MES_ENTITY=", fileRead.MesEntity, ";A_MID=", logistics.MID, ";A_NULL_DATA=", fileRead.NullData, ";A_PPID=NO_PPID;A_PROCESS_JOBID=", logistics.ProcessJobID, ";A_PRODUCT=;A_SEQUENCE=", logistics.Sequence, ";A_WAFER_ID=;")); + lines.Add(string.Concat("LOGISTICS_2", '\t', "B_CHAMBER=;B_INFO=", fileRead.EventName, ";B_INFO2=", fileRead.EquipmentType, ";B_JOBID=", fileRead.CellInstanceName, ";B_MES_ENTITY=", fileRead.MesEntity, ";B_MID=", logistics.MID, ";B_NULL_DATA=", fileRead.NullData, ";B_PPID=NO_PPID;B_PROCESS_JOBID=", logistics.ProcessJobID, ";B_PRODUCT=;B_SEQUENCE=", logistics.Sequence, ";B_WAFER_ID=;")); + lines.Add("END_HEADER"); + } + _ = stringBuilder.Clear(); + foreach (string line in lines) + _ = stringBuilder.AppendLine(line); + result = stringBuilder.ToString(); + result = result.Replace(headerOffset, result.IndexOf("NUM_DATA_ROWS").ToString().PadLeft(9, '0')). + Replace(dataOffset, result.IndexOf('"').ToString().PadLeft(9, '0')). + Replace(endOffset, result.Length.ToString().PadLeft(9, '0')); + } + return result; + } + + public static Tuple GetLogisticsColumnsAndBody(string reportFullPath, string[] lines = null) + { + string segment; + List body = new(); + StringBuilder logistics = new(); + if (lines is null) + lines = File.ReadAllLines(reportFullPath); + string[] segments; + if (lines.Length < 7) + segments = Array.Empty(); + else + segments = lines[6].Trim().Split('\t'); + List columns = new(); + for (int c = 0; c < segments.Length; c++) + { + segment = segments[c].Substring(1, segments[c].Length - 2); + if (!columns.Contains(segment)) + columns.Add(segment); + else + { + for (short i = 1; i < short.MaxValue; i++) + { + segment = string.Concat(segment, "_", i); + if (!columns.Contains(segment)) + { + columns.Add(segment); + break; + } + } + } + } + bool lookForLogistics = false; + for (int r = 7; r < lines.Length; r++) + { + if (lines[r].StartsWith("NUM_DATA_ROWS")) + lookForLogistics = true; + if (!lookForLogistics) + { + body.Add(lines[r]); + continue; + } + if (lines[r].StartsWith("LOGISTICS_1")) + { + for (int i = r; i < lines.Length; i++) + { + if (lines[r].StartsWith("END_HEADER")) + break; + _ = logistics.AppendLine(lines[i]); + } + break; + } + } + return new Tuple(logistics.ToString(), columns.ToArray(), body.ToArray()); + } + + public static JsonElement[] GetArray(Tuple pdsf, bool lookForNumbers = false) + { + JsonElement[] results; + string logistics = pdsf.Item1; + string[] columns = pdsf.Item2; + string[] bodyLines = pdsf.Item3; + if (!bodyLines.Any() || !bodyLines[0].Contains('\t')) + results = JsonSerializer.Deserialize("[]"); + else + { + string value; + string[] segments; + StringBuilder stringBuilder = new(); + foreach (string bodyLine in bodyLines) + { + _ = stringBuilder.Append('{'); + segments = bodyLine.Trim().Split('\t'); + if (!lookForNumbers) + { + for (int c = 1; c < segments.Length; c++) + { + value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); + _ = stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\","); + } + } + else + { + for (int c = 1; c < segments.Length; c++) + { + value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); + if (string.IsNullOrEmpty(value)) + _ = stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append("null,"); + else if (value.All(char.IsDigit)) + _ = stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append(','); + else + _ = stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\","); + } + } + _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); + _ = stringBuilder.AppendLine("},"); + } + _ = stringBuilder.Remove(stringBuilder.Length - 3, 3); + results = JsonSerializer.Deserialize(string.Concat("[", stringBuilder, "]")); + } + return results; + } + + public static Dictionary> GetDictionary(Tuple pdsf) + { + Dictionary> results = new(); + string[] segments; + string[] columns = pdsf.Item2; + string[] bodyLines = pdsf.Item3; + foreach (string column in columns) + results.Add(column, new List()); + foreach (string bodyLine in bodyLines) + { + segments = bodyLine.Split('\t'); + for (int c = 1; c < segments.Length; c++) + { + if (c >= columns.Length) + continue; + results[columns[c]].Add(segments[c]); + } + } + return results; + } + + public static Tuple>>> GetTestDictionary(Tuple pdsf) + { + Dictionary>> results = new(); + string testColumn = nameof(Test); + Dictionary> keyValuePairs = GetDictionary(pdsf); + if (!keyValuePairs.ContainsKey(testColumn)) + throw new Exception(); + int min; + int max; + Test testKey; + List vs; + string columnKey; + Dictionary> tests = new(); + for (int i = 0; i < keyValuePairs[testColumn].Count; i++) + { + if (Enum.TryParse(keyValuePairs[testColumn][i], out Test test)) + { + if (!results.ContainsKey(test)) + { + tests.Add(test, new List()); + results.Add(test, new Dictionary>()); + } + tests[test].Add(i); + } + } + foreach (KeyValuePair> testKeyValuePair in tests) + { + testKey = testKeyValuePair.Key; + min = testKeyValuePair.Value.Min(); + max = testKeyValuePair.Value.Max() + 1; + foreach (KeyValuePair> keyValuePair in keyValuePairs) + results[testKey].Add(keyValuePair.Key, new List()); + foreach (KeyValuePair> keyValuePair in keyValuePairs) + { + vs = keyValuePair.Value; + columnKey = keyValuePair.Key; + for (int i = min; i < max; i++) + { + if (vs.Count > i) + results[testKey][columnKey].Add(vs[i]); + else + results[testKey][columnKey].Add(string.Empty); + } + } + } + return new Tuple>>>(pdsf.Item1, results); + } + + private static string GetString(SearchFor searchFor, bool addSpaces, char separator = ' ') + { + if (!addSpaces) + return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), searchFor); + else + return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), separator, searchFor.ToString().Replace("In", string.Concat(separator, "In")).Replace("Ex", string.Concat(separator, "Ex"))); + } + + public static string EquipmentIntegration(bool addSpaces = true, char separator = ' ') => GetString(SearchFor.EquipmentIntegration, addSpaces, separator); + + public static string BusinessIntegration(bool addSpaces = true, char separator = ' ') => GetString(SearchFor.BusinessIntegration, addSpaces, separator); + + public static string SystemExport(bool addSpaces = true, char separator = ' ') => GetString(SearchFor.SystemExport, addSpaces, separator); + + public static string Archive(bool addSpaces = true, char separator = ' ') => GetString(SearchFor.Archive, addSpaces, separator); + + public static string GetLines(Logistics logistics, Properties.IScopeInfo scopeInfo, List names, Dictionary> keyValuePairs, string dateFormat, string timeFormat, List pairedParameterNames, bool useDateTimeFromSequence = true, string format = "", List ignoreParameterNames = null) + { + StringBuilder result = new(); + if (ignoreParameterNames is null) + ignoreParameterNames = new List(); + if (useDateTimeFromSequence && !string.IsNullOrEmpty(format)) + throw new Exception(); + else if (!useDateTimeFromSequence && string.IsNullOrEmpty(format)) + throw new Exception(); + string nullData; + const string columnDate = "Date"; + const string columnTime = "Time"; + const string firstDuplicate = "_1"; + _ = result.AppendLine(scopeInfo.Header); + StringBuilder line = new(); + if (logistics.NullData is null) + nullData = string.Empty; + else + nullData = logistics.NullData.ToString(); + int count = (from l in keyValuePairs select l.Value.Count).Min(); + for (int r = 0; r < count; r++) + { + _ = line.Clear(); + _ = line.Append('!'); + foreach (KeyValuePair> keyValuePair in keyValuePairs) + { + if (!names.Contains(keyValuePair.Key)) + continue; + if (ignoreParameterNames.Contains(keyValuePair.Key)) + continue; + if (pairedParameterNames.Contains(keyValuePair.Key)) + { + if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData) + continue; + else + _ = result.Append(line).Append(keyValuePair.Key).Append(';').AppendLine(keyValuePair.Value[r]); + } + else + { + if (useDateTimeFromSequence && keyValuePair.Key == columnDate) + _ = line.Append(logistics.DateTimeFromSequence.ToString(dateFormat)); + else if (useDateTimeFromSequence && keyValuePair.Key == columnTime) + _ = line.Append(logistics.DateTimeFromSequence.ToString(timeFormat)); + else if (!useDateTimeFromSequence && keyValuePair.Key == columnDate && keyValuePair.Value[r].Length == format.Length) + _ = line.Append(DateTime.ParseExact(keyValuePair.Value[r], format, CultureInfo.InvariantCulture).ToString(dateFormat)); + else if (!useDateTimeFromSequence && keyValuePair.Key == columnTime && keyValuePairs.ContainsKey(string.Concat(keyValuePair.Key, firstDuplicate)) && keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r].Length == format.Length) + _ = line.Append(DateTime.ParseExact(keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r], format, CultureInfo.InvariantCulture).ToString(timeFormat)); + else if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData) + _ = line.Append(nullData); + else + _ = line.Append(keyValuePair.Value[r]); + _ = line.Append(';'); + } + } + if (!pairedParameterNames.Any()) + { + _ = line.Remove(line.Length - 1, 1); + _ = result.AppendLine(line.ToString()); + } + } + return result.ToString(); + } + + public static List PDSFToFixedWidth(string reportFullPath) + { + List results = new(); + if (!File.Exists(reportFullPath)) + throw new Exception(); + int[] group; + string line; + int startsAt = 0; + string[] segments; + int? currentGroup = null; + char inputSeperator = '\t'; + char outputSeperator = '\t'; + List vs = new(); + List groups = new(); + string[] lines = File.ReadAllLines(reportFullPath); + StringBuilder stringBuilder = new(); + for (int i = 0; i < lines.Length; i++) + { + if (string.IsNullOrEmpty(lines[i])) + continue; + segments = lines[i].Split(inputSeperator); + if (currentGroup is null) + currentGroup = segments.Length; + if (segments.Length != currentGroup) + { + currentGroup = segments.Length; + groups.Add(new int[] { startsAt, i - 1 }); + startsAt = i; + } + } + if (startsAt == lines.Length - 1 && lines[0].Split(inputSeperator).Length != currentGroup) + groups.Add(new int[] { lines.Length - 1, lines.Length - 1 }); + for (int g = 0; g < groups.Count; g++) + { + vs.Clear(); + group = groups[g]; + line = lines[group[0]]; + segments = line.Split(inputSeperator); + for (int s = 0; s < segments.Length; s++) + vs.Add(segments[s].Length); + for (int i = group[0]; i <= group[1]; i++) + { + line = lines[i]; + segments = line.Split(inputSeperator); + for (int s = 0; s < segments.Length; s++) + { + if (vs[s] < segments[s].Length) + vs[s] = segments[s].Length; + } + } + _ = stringBuilder.Clear(); + for (int s = 0; s < segments.Length; s++) + _ = stringBuilder.Append((s + 1).ToString().PadLeft(vs[s], ' ')).Append(outputSeperator); + _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); + results.Add(stringBuilder.ToString()); + for (int i = group[0]; i <= group[1]; i++) + { + line = lines[i]; + _ = stringBuilder.Clear(); + segments = line.Split(inputSeperator); + for (int s = 0; s < segments.Length; s++) + _ = stringBuilder.Append(segments[s].PadLeft(vs[s], ' ')).Append(outputSeperator); + _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); + results.Add(stringBuilder.ToString()); + } + results.Add(string.Empty); + } + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Properties/IDescription.cs b/Adaptation/Shared/Properties/IDescription.cs new file mode 100644 index 0000000..93e6de5 --- /dev/null +++ b/Adaptation/Shared/Properties/IDescription.cs @@ -0,0 +1,10 @@ +namespace Adaptation.Shared.Properties; + +public interface IDescription +{ + + int Test { get; } + int Count { get; } + int Index { get; } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Properties/IFileRead.cs b/Adaptation/Shared/Properties/IFileRead.cs new file mode 100644 index 0000000..2e85ac9 --- /dev/null +++ b/Adaptation/Shared/Properties/IFileRead.cs @@ -0,0 +1,17 @@ +namespace Adaptation.Shared.Properties; + +public interface IFileRead +{ + bool IsEvent { get; } + string NullData { get; } + string MesEntity { get; } + bool IsEAFHosted { get; } + string EventName { get; } + string EquipmentType { get; } + string ReportFullPath { get; } + string CellInstanceName { get; } + string ExceptionSubject { get; } + bool UseCyclicalForDescription { get; } + string CellInstanceConnectionName { get; } + string ParameterizedModelObjectDefinitionType { get; } +} \ No newline at end of file diff --git a/Adaptation/Shared/Properties/ILogistics.cs b/Adaptation/Shared/Properties/ILogistics.cs new file mode 100644 index 0000000..dc1a106 --- /dev/null +++ b/Adaptation/Shared/Properties/ILogistics.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace Adaptation.Shared.Properties; + +public interface ILogistics +{ + + public object NullData { get; } + public string JobID { get; } //CellName + public long Sequence { get; } //Ticks + public DateTime DateTimeFromSequence { get; } + public double TotalSecondsSinceLastWriteTimeFromSequence { get; } + public string MesEntity { get; } //SPC + public string ReportFullPath { get; } //Extract file + public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics) + public string MID { get; set; } //Lot & Pocket || Lot + public List Tags { get; set; } + public List Logistics1 { get; set; } + public List Logistics2 { get; set; } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Properties/ILogistics2.cs b/Adaptation/Shared/Properties/ILogistics2.cs new file mode 100644 index 0000000..ae8a15a --- /dev/null +++ b/Adaptation/Shared/Properties/ILogistics2.cs @@ -0,0 +1,14 @@ +namespace Adaptation.Shared.Properties; + +public interface ILogistics2 +{ + + public string MID { get; } + public string RunNumber { get; } + public string SatelliteGroup { get; } + public string PartNumber { get; } + public string PocketNumber { get; } + public string WaferLot { get; } + public string Recipe { get; } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Properties/IProcessData.cs b/Adaptation/Shared/Properties/IProcessData.cs new file mode 100644 index 0000000..e378288 --- /dev/null +++ b/Adaptation/Shared/Properties/IProcessData.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Adaptation.Shared.Properties; + +public interface IProcessData +{ + + List Details { get; } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Properties/IScopeInfo.cs b/Adaptation/Shared/Properties/IScopeInfo.cs new file mode 100644 index 0000000..10d7385 --- /dev/null +++ b/Adaptation/Shared/Properties/IScopeInfo.cs @@ -0,0 +1,17 @@ +using System; + +namespace Adaptation.Shared.Properties; + +public interface IScopeInfo +{ + + Enum Enum { get; } + string HTML { get; } + string Title { get; } + string FileName { get; } + int TestValue { get; } + string Header { get; } + string QueryFilter { get; } + string FileNameWithoutExtension { get; } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Test.cs b/Adaptation/Shared/Test.cs new file mode 100644 index 0000000..aeb4bea --- /dev/null +++ b/Adaptation/Shared/Test.cs @@ -0,0 +1,58 @@ +namespace Adaptation.Shared; + +public enum Test +{ + AFMRoughness = 34, + BioRadQS408M = 25, + BioRadStratus = 26, + BreakdownVoltageCenter = 0, + BreakdownVoltageEdge = 1, + BreakdownVoltageMiddle8in = 2, + CandelaKlarfDC = 6, + CandelaLaser = 36, + CandelaProdU = 39, + CandelaPSL = 38, + CandelaVerify = 37, + CDE = 24, + CV = 3, + DailyRPMAverage = 19, + DailyRPMPLRatio = 20, + DailyRPMXY = 18, + Denton = 9, + DiffusionLength = 45, + GRATXTCenter = 51, + GRATXTEdge = 52, //Largest + GrowthRateXML = 50, + Hall = 10, + HgCV = 23, + JVXRD = 47, + Lehighton = 13, + LogbookCAC = 49, + Microscope = 46, + MonthlyCV = 4, + MonthlyHall = 11, + MonthlyXRD = 32, + Photoreflectance = 22, + PlatoA = 48, + RPMAverage = 16, + RPMPLRatio = 17, + RPMXY = 15, + SP1 = 8, + Tencor = 7, + UV = 35, + VerificationLehighton = 14, + VerificationRPM = 21, + VerificationWarpAndBow = 29, + VpdIcpmsAnalyte = 27, + WarpAndBow = 28, + WeeklyCV = 5, + WeeklyHall = 12, + WeeklyXRD = 33, + WeeklyXRDAIcomp = 40, + WeeklyXRDFWHM002 = 41, + WeeklyXRDFWHM105 = 42, + WeeklyXRDSLStks = 43, + WeeklyXRDXRR = 44, + XRDWeightedAverage = 31, + XRDXY = 30, +} \ No newline at end of file diff --git a/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/MET08DDUPSFS6420.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/MET08DDUPSFS6420.cs new file mode 100644 index 0000000..5f774b9 --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/MET08DDUPSFS6420.cs @@ -0,0 +1,177 @@ +using Adaptation.Shared.Methods; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shared; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace _Tests.CreateSelfDescription.Staging.v2_39_0; + +[TestClass] +public class MET08DDUPSFS6420 : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static MET08DDUPSFS6420 EAFLoggingUnitTesting { get; private set; } + + public MET08DDUPSFS6420() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public MET08DDUPSFS6420(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new MET08DDUPSFS6420(testContext); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); + string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); + File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); + File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); + } + + [ClassCleanup()] + public static void ClassCleanup() + { + if (EAFLoggingUnitTesting.Logger is not null) + EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); + if (EAFLoggingUnitTesting is not null) + EAFLoggingUnitTesting.Dispose(); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420() + { + string check = "~IsXToOpenInsightMetrologyViewer"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_() + { + string check = "~IsXToIQSSi"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420__() + { + string check = "~IsXToOpenInsight"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420___() + { + string check = "~IsXToOpenInsightMetrologyViewerAttachments"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420____() + { + string check = "~IsXToAPC"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_____() + { + string check = "~IsXToSPaCe"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420______() + { + string check = "~IsXToArchive"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_______() + { + string check = "~IsArchive"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420________() + { + string check = "~IsDummy"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR1.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR1.cs new file mode 100644 index 0000000..722f779 --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR1.cs @@ -0,0 +1,59 @@ +using Adaptation.Shared; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shared; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Text.Json; +using System.Threading; + +namespace _Tests.CreateSelfDescription.Staging.v2_39_0; + +[TestClass] +public class TENCOR1 : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static TENCOR1 EAFLoggingUnitTesting { get; private set; } + + public TENCOR1() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public TENCOR1(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new TENCOR1(testContext); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); + string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); + File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); + File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); + } + + [ClassCleanup()] + public static void ClassCleanup() + { + if (EAFLoggingUnitTesting.Logger is not null) + EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); + if (EAFLoggingUnitTesting is not null) + EAFLoggingUnitTesting.Dispose(); + } + + [TestMethod] + public void Staging__v2_39_0__TENCOR1__() + { + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR2.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR2.cs new file mode 100644 index 0000000..8044505 --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR2.cs @@ -0,0 +1,54 @@ +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shared; +using System; +using System.Diagnostics; +using System.IO; + +namespace _Tests.CreateSelfDescription.Staging.v2_39_0; + +[TestClass] +public class TENCOR2 : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static TENCOR2 EAFLoggingUnitTesting { get; private set; } + + public TENCOR2() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public TENCOR2(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new TENCOR2(testContext); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); + string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); + File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); + File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); + } + + [ClassCleanup()] + public static void ClassCleanup() + { + if (EAFLoggingUnitTesting.Logger is not null) + EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); + if (EAFLoggingUnitTesting is not null) + EAFLoggingUnitTesting.Dispose(); + } + + [TestMethod] + public void Staging__v2_39_0__TENCOR2__() + { + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR3-EQPT.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR3-EQPT.cs new file mode 100644 index 0000000..c63307a --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR3-EQPT.cs @@ -0,0 +1,65 @@ +using Adaptation.Shared.Methods; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shared; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace _Tests.CreateSelfDescription.Staging.v2_39_0; + +[TestClass] +public class TENCOR3_EQPT : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static TENCOR3_EQPT EAFLoggingUnitTesting { get; private set; } + + public TENCOR3_EQPT() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public TENCOR3_EQPT(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new TENCOR3_EQPT(testContext); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); + string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); + File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); + File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); + } + + [ClassCleanup()] + public static void ClassCleanup() + { + if (EAFLoggingUnitTesting.Logger is not null) + EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); + if (EAFLoggingUnitTesting is not null) + EAFLoggingUnitTesting.Dispose(); + } + + [TestMethod] + public void Staging__v2_39_0__TENCOR3_EQPT__DownloadRsMFile() + { + string check = "WafrMeas.log|.RsM"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR3.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR3.cs new file mode 100644 index 0000000..c54ff28 --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.39.0/TENCOR3.cs @@ -0,0 +1,65 @@ +using Adaptation.Shared.Methods; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shared; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace _Tests.CreateSelfDescription.Staging.v2_39_0; + +[TestClass] +public class TENCOR3 : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static TENCOR3 EAFLoggingUnitTesting { get; private set; } + + public TENCOR3() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public TENCOR3(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new TENCOR3(testContext); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); + string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); + File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); + File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); + } + + [ClassCleanup()] + public static void ClassCleanup() + { + if (EAFLoggingUnitTesting.Logger is not null) + EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); + if (EAFLoggingUnitTesting is not null) + EAFLoggingUnitTesting.Dispose(); + } + + [TestMethod] + public void Staging__v2_39_0__TENCOR3__RsM() + { + string check = "*.RsM"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Extract/Staging/v2.39.0/MET08DDUPSFS6420.cs b/Adaptation/_Tests/Extract/Staging/v2.39.0/MET08DDUPSFS6420.cs new file mode 100644 index 0000000..5c0c229 --- /dev/null +++ b/Adaptation/_Tests/Extract/Staging/v2.39.0/MET08DDUPSFS6420.cs @@ -0,0 +1,82 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Text.Json; + +namespace _Tests.Extract.Staging.v2_39_0; + +[TestClass] +public class MET08DDUPSFS6420 +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + private static CreateSelfDescription.Staging.v2_39_0.MET08DDUPSFS6420 _MET08DDUPSFS6420; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + CreateSelfDescription.Staging.v2_39_0.MET08DDUPSFS6420.ClassInitialize(testContext); + _MET08DDUPSFS6420 = CreateSelfDescription.Staging.v2_39_0.MET08DDUPSFS6420.EAFLoggingUnitTesting; + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420(); + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420637710931421087642__Normal() + { + string check = "~IsXToOpenInsightMetrologyViewer"; + MethodBase methodBase = new StackFrame().GetMethod(); + _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420(); + string[] variables = _MET08DDUPSFS6420.AdaptationTesting.GetVariables(methodBase, check); + Tuple pdsf = Helpers.Metrology.GetLogisticsColumnsAndBody(variables[2], variables[4]); + IFileRead fileRead = _MET08DDUPSFS6420.AdaptationTesting.Get(methodBase, sourceFileLocation: variables[2], sourceFileFilter: variables[3], useCyclicalForDescription: false); + Tuple> extractResult = fileRead.ReExtract(); + Assert.IsFalse(string.IsNullOrEmpty(extractResult?.Item1)); + Assert.IsTrue(extractResult.Item3.Length > 0, "extractResult Array Length check!"); + Assert.IsNotNull(extractResult.Item4); + Logistics logistics = new(fileRead); + Tuple pdsfNew = Helpers.Metrology.GetLogisticsColumnsAndBody(fileRead, logistics, extractResult, pdsf); + Helpers.Metrology.CompareSave(variables[5], pdsf, pdsfNew); + Assert.IsTrue(pdsf.Item1 == pdsfNew.Item1, "Item1 check!"); + string[] json = Helpers.Metrology.GetItem2(pdsf, pdsfNew); + Helpers.Metrology.CompareSaveJSON(variables[5], json); + Assert.IsTrue(json[0] == json[1], "Item2 check!"); + string[] join = Helpers.Metrology.GetItem3(pdsf, pdsfNew); + Helpers.Metrology.CompareSaveTSV(variables[5], join); + Assert.IsTrue(join[0] == join[1], "Item3 (Join) check!"); + Helpers.Metrology.UpdatePassDirectory(variables[2]); + } + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_(); + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420__() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420__(); + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420___() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420___(); + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420____() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420____(); + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_____() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_____(); + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420______() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420______(); + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_______() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420_______(); + + [TestMethod] + public void Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420________() => _MET08DDUPSFS6420.Staging__v2_39_0__MET08DDUPSFS6420__MET08DDUPSFS6420________(); + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR1.cs b/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR1.cs new file mode 100644 index 0000000..e69de29 diff --git a/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR2.cs b/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR2.cs new file mode 100644 index 0000000..e69de29 diff --git a/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR3-EQPT.cs b/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR3-EQPT.cs new file mode 100644 index 0000000..2548e58 --- /dev/null +++ b/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR3-EQPT.cs @@ -0,0 +1,32 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Text.Json; + +namespace _Tests.Extract.Staging.v2_39_0; + +[TestClass] +public class TENCOR3_EQPT +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + private static CreateSelfDescription.Staging.v2_39_0.TENCOR3_EQPT _TENCOR3_EQPT; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + CreateSelfDescription.Staging.v2_39_0.TENCOR3_EQPT.ClassInitialize(testContext); + _TENCOR3_EQPT = CreateSelfDescription.Staging.v2_39_0.TENCOR3_EQPT.EAFLoggingUnitTesting; + } + + [TestMethod] + public void Staging__v2_39_0__TENCOR3_EQPT__DownloadRsMFile() => _TENCOR3_EQPT.Staging__v2_39_0__TENCOR3_EQPT__DownloadRsMFile(); + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR3.cs b/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR3.cs new file mode 100644 index 0000000..c800e27 --- /dev/null +++ b/Adaptation/_Tests/Extract/Staging/v2.39.0/TENCOR3.cs @@ -0,0 +1,32 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Text.Json; + +namespace _Tests.Extract.Staging.v2_39_0; + +[TestClass] +public class TENCOR3 +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + private static CreateSelfDescription.Staging.v2_39_0.TENCOR3 _TENCOR3; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + CreateSelfDescription.Staging.v2_39_0.TENCOR3.ClassInitialize(testContext); + _TENCOR3 = CreateSelfDescription.Staging.v2_39_0.TENCOR3.EAFLoggingUnitTesting; + } + + [TestMethod] + public void Staging__v2_39_0__TENCOR3__RsM() => _TENCOR3.Staging__v2_39_0__TENCOR3__RsM(); + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Helpers/Metrology.cs b/Adaptation/_Tests/Helpers/Metrology.cs new file mode 100644 index 0000000..0d41570 --- /dev/null +++ b/Adaptation/_Tests/Helpers/Metrology.cs @@ -0,0 +1,156 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.Json; + +namespace _Tests.Helpers; + +public class Metrology +{ + + internal static Tuple GetLogisticsColumnsAndBody(string fileFullName) + { + Tuple results; + results = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(fileFullName); + Assert.IsFalse(string.IsNullOrEmpty(results.Item1)); + Assert.IsTrue(results.Item2.Length > 0, "Column check"); + Assert.IsTrue(results.Item3.Length > 0, "Body check"); + return results; + } + + internal static Tuple GetLogisticsColumnsAndBody(string searchDirectory, string searchPattern) + { + Tuple results; + if (searchPattern.Length > 3 && !searchPattern.Contains('*') && File.Exists(searchPattern)) + results = GetLogisticsColumnsAndBody(searchPattern); + else + { + string[] pdsfFiles; + pdsfFiles = Directory.GetFiles(searchDirectory, searchPattern, SearchOption.TopDirectoryOnly); + if (!pdsfFiles.Any()) + _ = Process.Start("explorer.exe", searchDirectory); + Assert.IsTrue(pdsfFiles.Any(), "GetFiles check"); + results = GetLogisticsColumnsAndBody(pdsfFiles[0]); + } + Assert.IsFalse(string.IsNullOrEmpty(results.Item1)); + Assert.IsTrue(results.Item2.Length > 0, "Column check"); + Assert.IsTrue(results.Item3.Length > 0, "Body check"); + return results; + } + + internal static Tuple GetLogisticsColumnsAndBody(IFileRead fileRead, Logistics logistics, Tuple> extractResult, Tuple pdsf) + { + Tuple results; + string text = ProcessDataStandardFormat.GetPDSFText(fileRead, logistics, extractResult.Item3, logisticsText: pdsf.Item1); + string[] lines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + results = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(logistics.ReportFullPath, lines); + Assert.IsFalse(string.IsNullOrEmpty(results.Item1)); + Assert.IsTrue(results.Item2.Length > 0, "Column check"); + Assert.IsTrue(results.Item3.Length > 0, "Body check"); + return results; + } + + internal static string[] GetItem2(Tuple pdsf, Tuple pdsfNew) + { + JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true }; + string jsonOld = JsonSerializer.Serialize(pdsf.Item2, pdsf.Item2.GetType(), jsonSerializerOptions); + string jsonNew = JsonSerializer.Serialize(pdsfNew.Item2, pdsfNew.Item2.GetType(), jsonSerializerOptions); + return new string[] { jsonOld, jsonNew }; + } + + internal static string[] GetItem3(Tuple pdsf, Tuple pdsfNew) + { + string joinOld = string.Join(Environment.NewLine, from l in pdsf.Item3 select string.Join('\t', from t in l.Split('\t') where !t.Contains(@"\\") select t)); + string joinNew = string.Join(Environment.NewLine, from l in pdsfNew.Item3 select string.Join('\t', from t in l.Split('\t') where !t.Contains(@"\\") select t)); + return new string[] { joinOld, joinNew }; + } + + internal static void UpdatePassDirectory(string searchDirectory) + { + DateTime dateTime = DateTime.Now; + try + { Directory.SetLastWriteTime(searchDirectory, dateTime); } + catch (System.Exception) { } + string ticksDirectory = Path.GetDirectoryName(searchDirectory); + try + { Directory.SetLastWriteTime(ticksDirectory, dateTime); } + catch (System.Exception) { } + string[] directories = Directory.GetDirectories(searchDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string directory in directories) + { + try + { Directory.SetLastWriteTime(directory, dateTime); } + catch (System.Exception) { } + } + } + + internal static string GetFileName(MethodBase methodBase) + { + string result; + string connectionName; + string seperator = "__"; + string connectionNameAndTicks; + string[] segments = methodBase.Name.Split(new string[] { seperator }, StringSplitOptions.None); + string environment = segments[0]; + string rawVersionName = segments[1]; + string equipmentTypeDirectory = segments[2]; + string ticks = DateTime.Now.Ticks.ToString(); + string comment = segments[segments.Length - 1]; + string versionName = segments[1].Replace('_', '.'); + string before = string.Concat(environment, seperator, rawVersionName, seperator, equipmentTypeDirectory, seperator); + string after = methodBase.Name.Substring(before.Length); + if (after.Length < ticks.Length) + { + connectionName = after; + } + else + { + connectionNameAndTicks = after.Substring(0, after.Length - 2 - comment.Length); + connectionName = connectionNameAndTicks.Substring(0, connectionNameAndTicks.Length - ticks.Length); + ticks = connectionNameAndTicks.Substring(connectionName.Length); + } + result = Path.Combine(environment, equipmentTypeDirectory, versionName, $"{environment}__{rawVersionName}__{equipmentTypeDirectory}__{connectionName}", ticks, $"{connectionName.Replace('_', '-')}.json"); + if (result.Contains('/')) + result = string.Concat('/', result); + else + result = string.Concat('\\', result); + return result; + } + + internal static void CompareSaveTSV(string textFileDirectory, string[] join) + { + if (join[0] != join[1]) + { + _ = Process.Start("explorer.exe", textFileDirectory); + File.WriteAllText(Path.Combine(textFileDirectory, "0.tsv"), join[0]); + File.WriteAllText(Path.Combine(textFileDirectory, "1.tsv"), join[1]); + } + } + + internal static void CompareSaveJSON(string textFileDirectory, string[] json) + { + if (json[0] != json[1]) + { + _ = Process.Start("explorer.exe", textFileDirectory); + File.WriteAllText(Path.Combine(textFileDirectory, "0.json"), json[0]); + File.WriteAllText(Path.Combine(textFileDirectory, "1.json"), json[1]); + } + } + + internal static void CompareSave(string textFileDirectory, Tuple pdsf, Tuple pdsfNew) + { + if (pdsf.Item1 != pdsfNew.Item1) + { + _ = Process.Start("explorer.exe", textFileDirectory); + File.WriteAllText(Path.Combine(textFileDirectory, "0.dat"), pdsf.Item1); + File.WriteAllText(Path.Combine(textFileDirectory, "1.dat"), pdsfNew.Item1); + } + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/AdaptationTesting.cs b/Adaptation/_Tests/Shared/AdaptationTesting.cs new file mode 100644 index 0000000..8378736 --- /dev/null +++ b/Adaptation/_Tests/Shared/AdaptationTesting.cs @@ -0,0 +1,1061 @@ +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.Common.Configuration; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared.Methods; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shared.PasteSpecialXml.EAF.XML.API.CellInstance; +using Shared.PasteSpecialXml.EAF.XML.API.ConfigurationData; +using Shared.PasteSpecialXml.EAF.XML.API.EquipmentDictionary; +using Shared.PasteSpecialXml.EAF.XML.API.EquipmentType; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Xml; +using System.Xml.Linq; +using System.Xml.Serialization; + +namespace Shared; + +public class AdaptationTesting : ISMTP +{ + + protected readonly string _Environment; + protected readonly string _HostNameAndPort; + protected readonly TestContext _TestContext; + protected readonly bool _SkipEquipmentDictionary; + protected readonly Dictionary _CellInstanceVersions; + protected readonly Dictionary _EquipmentTypeVersions; + protected readonly Dictionary _ParameterizedModelObjectDefinitionTypes; + protected readonly Dictionary _EquipmentDictionaryVersions; + protected readonly Dictionary _FileConnectorConfigurations; + protected readonly Dictionary> _ModelObjectParameters; + protected readonly Dictionary>> _EquipmentDictionaryEventDescriptions; + + public string Environment => _Environment; + public TestContext TestContext => _TestContext; + public string HostNameAndPort => _HostNameAndPort; + public bool SkipEquipmentDictionary => _SkipEquipmentDictionary; + public Dictionary CellInstanceVersions => _CellInstanceVersions; + public Dictionary EquipmentTypeVersions => _EquipmentTypeVersions; + public Dictionary> ModelObjectParameters => _ModelObjectParameters; + public Dictionary EquipmentDictionaryVersions => _EquipmentDictionaryVersions; + public Dictionary FileConnectorConfigurations => _FileConnectorConfigurations; + public Dictionary ParameterizedModelObjectDefinitionTypes => _ParameterizedModelObjectDefinitionTypes; + public Dictionary>> EquipmentDictionaryEventDescriptions => _EquipmentDictionaryEventDescriptions; + + void ISMTP.SendLowPriorityEmailMessage(string subject, string body) => throw new NotImplementedException(); + + void ISMTP.SendHighPriorityEmailMessage(string subject, string body) => throw new NotImplementedException(); + + void ISMTP.SendNormalPriorityEmailMessage(string subject, string body) => throw new NotImplementedException(); + + public AdaptationTesting(TestContext testContext, bool skipEquipmentDictionary) + { + + string environment = GetEnvironment(testContext); + string hostNameAndPort = GetHostNameAndPort(environment); + _TestContext = testContext; + _Environment = environment; + _HostNameAndPort = hostNameAndPort; + _SkipEquipmentDictionary = skipEquipmentDictionary; + _CellInstanceVersions = new Dictionary(); + _EquipmentTypeVersions = new Dictionary(); + _ParameterizedModelObjectDefinitionTypes = new Dictionary(); + _EquipmentDictionaryVersions = new Dictionary(); + _FileConnectorConfigurations = new Dictionary(); + _ModelObjectParameters = new Dictionary>(); + _EquipmentDictionaryEventDescriptions = new Dictionary>>(); + } + + protected static string GetEnvironment(TestContext testContext) + { + string result = testContext.TestName.Split('_')[0]; + return result; + } + + protected static string GetHostNameAndPort(string environment) + { + string result; + result = environment switch + { + "LocalHost" => "localhost:9003", + "Development" => "eaf-dev.mes.infineon.com:9003", + "Staging" => "eaf-staging.mes.infineon.com:9003", + "Production" => "eaf-prod.mes.infineon.com:9003", + _ => throw new Exception(), + }; + return result; + } + + protected string GetTestResultsDirectory() + { + string result = string.Empty; + string testResults = "05_TestResults"; + string checkDirectory = _TestContext.TestResultsDirectory; + if (string.IsNullOrEmpty(checkDirectory) || !checkDirectory.Contains(testResults)) + throw new Exception(); + string rootDirectory = Path.GetPathRoot(checkDirectory); + for (int i = 0; i < int.MaxValue; i++) + { + checkDirectory = Path.GetDirectoryName(checkDirectory); + if (string.IsNullOrEmpty(checkDirectory) || checkDirectory == rootDirectory) + break; + if (checkDirectory.EndsWith(testResults) && Directory.Exists(checkDirectory)) + { + result = checkDirectory; + break; + } + } + if (string.IsNullOrEmpty(result)) + throw new Exception(); + return result; + } + + protected static string GetCellInstanceConnectionName(string cellInstanceConnectionName) + { + string result; + if (string.IsNullOrEmpty(cellInstanceConnectionName) || cellInstanceConnectionName[cellInstanceConnectionName.Length - 1] != '_') + result = cellInstanceConnectionName; + else + { + bool check = false; + List chars = new(); + StringBuilder stringBuilder = new(); + for (int i = cellInstanceConnectionName.Length - 1; i > -1; i--) + { + if (!check && cellInstanceConnectionName[i] != '_') + check = true; + else if (!check && cellInstanceConnectionName[i] == '_') + chars.Add('-'); + if (check) + chars.Add(cellInstanceConnectionName[i]); + } + for (int i = chars.Count - 1; i > -1; i--) + _ = stringBuilder.Append(chars[i]); + result = stringBuilder.ToString(); + } + return result; + } + + private static string GetMethodBaseNameWithActualCICN(string methodBaseName, string cellInstanceName, string cellInstanceConnectionNameFromMethodBaseName, string cellInstanceConnectionName, string ticks) + { + string results; + if (string.IsNullOrEmpty(cellInstanceConnectionNameFromMethodBaseName) || string.IsNullOrEmpty(cellInstanceConnectionName)) + results = methodBaseName; + else if (cellInstanceConnectionNameFromMethodBaseName.Length != cellInstanceConnectionName.Length) + throw new Exception(); + else + { + string[] segments = methodBaseName.Split(new string[] { cellInstanceName }, StringSplitOptions.None); + if (segments.Length == 2) + results = methodBaseName.Replace(cellInstanceConnectionNameFromMethodBaseName, cellInstanceConnectionName); + else if (segments.Length != 3) + throw new Exception(); + else if (string.IsNullOrEmpty(ticks)) + results = string.Concat(segments[0], cellInstanceName, segments[1], cellInstanceConnectionName); + else if (!segments[2].Contains(ticks)) + throw new Exception(); + else + results = string.Concat(segments[0], cellInstanceName, segments[1], cellInstanceConnectionName, ticks, segments[2].Split(new string[] { ticks }, StringSplitOptions.None)[1]); + } + if (methodBaseName.Length != results.Length) + throw new Exception(); + return results; + } + + internal string[] GetSegments(string methodBaseName) + { + List results; + string fileFullName; + string comment; + string[] textFiles; + string seperator = "__"; + string connectionNameAndTicks; + string cellInstanceConnectionName; + string ticks = DateTime.Now.Ticks.ToString(); + string cellInstanceConnectionNameFromMethodBaseName; + string testResultsDirectory = GetTestResultsDirectory(); + string[] segments = methodBaseName.Split(new string[] { seperator }, StringSplitOptions.None); + if (segments[0] != _Environment) + throw new Exception(); + string rawVersionName = segments[1]; + string rawCellInstanceName = segments[2]; + string cellInstanceVersionName = segments[1].Replace('_', '.'); + string cellInstanceName = segments[2].Replace('_', '-').Replace("_EQPT", "-EQPT"); + string before = string.Concat(_Environment, seperator, rawVersionName, seperator, cellInstanceName, seperator); + string after = methodBaseName.Substring(before.Length); + string versionDirectory = Path.Combine(testResultsDirectory, _Environment, cellInstanceName, cellInstanceVersionName); + if (!Directory.Exists(versionDirectory)) + _ = Directory.CreateDirectory(versionDirectory); + comment = segments[segments.Length - 1]; + if (after.Length < ticks.Length || after == comment) + { + ticks = string.Empty; + cellInstanceConnectionNameFromMethodBaseName = string.Empty; + } + else + { + connectionNameAndTicks = after.Substring(0, after.Length - 2 - comment.Length); + if (connectionNameAndTicks.Length - ticks.Length < 1) + { + ticks = string.Empty; + cellInstanceConnectionNameFromMethodBaseName = string.Empty; + } + else + { + cellInstanceConnectionNameFromMethodBaseName = connectionNameAndTicks.Substring(0, connectionNameAndTicks.Length - ticks.Length); + ticks = connectionNameAndTicks.Substring(cellInstanceConnectionNameFromMethodBaseName.Length); + } + } + if (string.IsNullOrEmpty(ticks) || string.IsNullOrEmpty(cellInstanceConnectionNameFromMethodBaseName) || !long.TryParse(ticks, out _)) + { + ticks = string.Empty; + comment = string.Empty; + cellInstanceConnectionNameFromMethodBaseName = after; + } + cellInstanceConnectionName = GetCellInstanceConnectionName(cellInstanceConnectionNameFromMethodBaseName); + string methodBaseNameWithActualCICN = GetMethodBaseNameWithActualCICN(methodBaseName, rawCellInstanceName, cellInstanceConnectionNameFromMethodBaseName, cellInstanceConnectionName, ticks); + if (string.IsNullOrEmpty(ticks)) + { + textFiles = Array.Empty(); + fileFullName = Path.Combine(versionDirectory, methodBaseNameWithActualCICN, $"{cellInstanceConnectionNameFromMethodBaseName}.json"); + } + else + { + segments = methodBaseNameWithActualCICN.Split(new string[] { ticks }, StringSplitOptions.None); + string textDirectory = Path.Combine(versionDirectory, segments[0], string.Concat(ticks, segments[1])); + fileFullName = Path.Combine(versionDirectory, segments[0], $"{cellInstanceConnectionNameFromMethodBaseName}.json"); + if (!Directory.Exists(textDirectory)) + { + textFiles = Array.Empty(); + string renameDirectory = Path.Combine(Path.GetDirectoryName(textDirectory), $"_Rename - {Path.GetFileName(textDirectory)}"); + _ = Directory.CreateDirectory(renameDirectory); + _ = Process.Start("explorer.exe", renameDirectory); + File.WriteAllText(Path.Combine(renameDirectory, $"{nameof(FileConnectorConfiguration.SourceFileFilter)}.txt"), string.Empty); + File.WriteAllText(Path.Combine(renameDirectory, $"{nameof(FileConnectorConfiguration.SourceFileLocation)}.txt"), string.Empty); + } + else + { + textFiles = Directory.GetFiles(textDirectory, "*.txt", SearchOption.TopDirectoryOnly); + if (!textFiles.Any()) + { + _ = Process.Start("explorer.exe", textDirectory); + File.WriteAllText(Path.Combine(textDirectory, "_ Why.why"), string.Empty); + } + } + } + results = new List + { + _Environment, + rawCellInstanceName, + cellInstanceName, + cellInstanceVersionName, + cellInstanceConnectionNameFromMethodBaseName, + cellInstanceConnectionName, + ticks, + comment, + fileFullName + }; + results.AddRange(textFiles); + return results.ToArray(); + } + + internal string[] GetSegments(MethodBase methodBase) + { + string[] results = GetSegments(methodBase.Name); + return results; + } + + internal static string GetEnvironment(string[] segments) => segments[0]; + + internal static string GetRawCellInstanceName(string[] segments) => segments[1]; + + internal static string GetCellInstanceName(string[] segments) => segments[2]; + + internal static string GetCellInstanceVersionName(string[] segments) => segments[3]; + + internal static string GetCellInstanceConnectionNameFromMethodBaseName(string[] segments) => segments[4]; + + internal static string GetCellInstanceConnectionName(string[] segments) => segments[5]; + + internal static string GetTicks(string[] segments) => segments[6]; + + internal static string GetComment(string[] segments) => segments[7]; + + internal static FileInfo GetFileName(string[] segments) => new(segments[8]); + + internal static string[] GetTextFiles(string[] segments) + { + List results = new(); + if (segments.Length > 8) + { + for (int i = 9; i < segments.Length; i++) + results.Add(segments[i]); + } + return results.ToArray(); + } + + protected static Stream ToStream(string @this) + { + MemoryStream memoryStream = new(); + StreamWriter streamWriter = new(memoryStream); + streamWriter.Write(@this); + streamWriter.Flush(); + memoryStream.Position = 0; + return memoryStream; + } + + internal static T ParseXML(string @this, bool throwExceptions) where T : class + { + object result = null; + try + { + Stream stream = ToStream(@this.Trim()); + XmlReader xmlReader = XmlReader.Create(stream, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document }); + XmlSerializer xmlSerializer = new(typeof(T), typeof(T).GetNestedTypes()); + result = xmlSerializer.Deserialize(xmlReader); + stream.Dispose(); + } + catch (Exception) + { + if (throwExceptions) + throw; + } + return result as T; + } + + protected static CellInstanceVersion GetCellInstanceVersion(string url) + { + CellInstanceVersion result; + byte[] byteArray; + ConfigurationData configurationData; + string decodedCellInstanceConfigurationData; + string xml; + try + { + xml = XDocument.Load(url).ToString(); + } + catch (System.Exception exception) + { + throw new Exception(string.Concat(url, System.Environment.NewLine, exception.Message)); + } + configurationData = ParseXML(xml, throwExceptions: true); + byteArray = Convert.FromBase64String(configurationData.Data); + decodedCellInstanceConfigurationData = Encoding.Unicode.GetString(byteArray); + if (xml.Length <= 41) + throw new Exception(string.Concat("xml isn't valid {", xml, "}")); + decodedCellInstanceConfigurationData = decodedCellInstanceConfigurationData.Substring(41).Replace("i:type", "i___type"); + result = ParseXML(decodedCellInstanceConfigurationData, throwExceptions: true); + return result; + } + + protected Tuple GetCellInstanceVersionTuple(string cellInstanceName, string cellInstanceVersionName) + { + Tuple result; + CellInstanceVersion cellInstanceVersion; + string cellInstanceServiceV2 = string.Concat("http://", _HostNameAndPort, "/CellInstanceServiceV2/", cellInstanceName, "/", cellInstanceVersionName, "/configuration"); + if (_CellInstanceVersions.ContainsKey(cellInstanceServiceV2)) + cellInstanceVersion = _CellInstanceVersions[cellInstanceServiceV2]; + else + { + cellInstanceVersion = GetCellInstanceVersion(cellInstanceServiceV2); + _CellInstanceVersions.Add(cellInstanceServiceV2, cellInstanceVersion); + } + result = new Tuple(cellInstanceServiceV2, cellInstanceVersion); + return result; + } + + protected static Dictionary GetComponentModelComponentsIndexes(CellInstanceVersion cellInstanceVersion, string cellInstanceConnectionName) + { + Dictionary results = new(); + ComponentsCellComponent componentsCellComponent; + if (cellInstanceVersion.ComponentModel.Components is not null) + { + for (int i = 0; i < cellInstanceVersion.ComponentModel.Components.Length; i++) + { + componentsCellComponent = cellInstanceVersion.ComponentModel.Components[i]; + for (int j = 0; j < componentsCellComponent.Children.Length; j++) + { + if (string.IsNullOrEmpty(componentsCellComponent.Children[j].Equipment.Name)) + continue; + results.Add(componentsCellComponent.Children[j].Name, new int[] { i, j }); + } + } + } + if (!results.Any() || (!string.IsNullOrEmpty(cellInstanceConnectionName) && !results.ContainsKey(cellInstanceConnectionName))) + throw new Exception("Match not found (check test method name matches Mango)!"); + return results; + } + + protected static int[] GetCellInstanceConnectionNameIndexes(string cellInstanceConnectionName, Dictionary componentModelComponentsIndexes) + { + int[] result; + if (string.IsNullOrEmpty(cellInstanceConnectionName)) + result = componentModelComponentsIndexes.ElementAt(0).Value; + else + { + if (componentModelComponentsIndexes is null || !componentModelComponentsIndexes.ContainsKey(cellInstanceConnectionName)) + throw new Exception(); + result = componentModelComponentsIndexes[cellInstanceConnectionName]; + } + return result; + } + + protected string[] GetCSharpTextB(FileInfo fileInfo, string cellInstanceName, string cellInstanceVersionName, CellInstanceVersion cellInstanceVersion) + { + List results = new(); + string check; + string loopName; + string equipmentTypeName; + string methodName = string.Empty; + string extractText = string.Empty; + StringBuilder stringBuilder = new(); + string createSelfDescriptionText = string.Empty; + List componentsCellComponentCellComponentEquipmentNames = new(); + string cellInstanceNameWithoutHyphen = cellInstanceName.Replace('-', '_'); + ComponentsCellComponentCellComponent componentsCellComponentCellComponent; + List componentsCellComponentCellComponentEquipmentTypeNames = new(); + string cellInstanceVersionNameAsCode = cellInstanceVersionName.Replace('.', '_'); + List componentsCellComponentCellComponentEquipmentDictionaryNames = new(); + const string sourceDirectoryCloaking = nameof(FileConnectorConfiguration.SourceDirectoryCloaking); + for (int i = 1; i < 3; i++) + { + if (i == 2) + loopName = "Extract"; + else if (i == 1) + loopName = "CreateSelfDescription"; + else + throw new Exception(); + if (i == 2) + _ = stringBuilder. + AppendLine("using Microsoft.VisualStudio.TestTools.UnitTesting;"). + AppendLine("using Shared;"). + AppendLine("using System.Diagnostics;"); + else if (i == 1) + _ = stringBuilder. + AppendLine("using Adaptation.Shared.Methods;"). + AppendLine("using Microsoft.Extensions.Logging;"). + AppendLine("using Microsoft.VisualStudio.TestTools.UnitTesting;"). + AppendLine("using Shared;"). + AppendLine("using System;"). + AppendLine("using System.Collections.Generic;"). + AppendLine("using System.Diagnostics;"). + AppendLine("using System.IO;"). + AppendLine("using System.Reflection;"). + AppendLine("using System.Text.Json;"). + AppendLine("using System.Threading;"); + else + throw new Exception(); + _ = stringBuilder.AppendLine(). + Append("namespace _Tests.").Append(loopName).Append('.').Append(_Environment).Append('.').AppendLine(cellInstanceVersionNameAsCode). + AppendLine("{"). + AppendLine(). + AppendLine("[TestClass]"); + if (i == 2) + _ = stringBuilder. + Append("public class ").AppendLine(cellInstanceNameWithoutHyphen). + AppendLine("{"). + AppendLine(). + Append("private static CreateSelfDescription.").Append(_Environment).Append('.').Append(cellInstanceVersionNameAsCode).Append('.').Append(cellInstanceNameWithoutHyphen).Append(" _").Append(cellInstanceNameWithoutHyphen).AppendLine(";"); + else if (i == 1) + _ = stringBuilder. + Append("public class ").Append(cellInstanceNameWithoutHyphen).AppendLine(" : EAFLoggingUnitTesting"). + AppendLine("{"). + AppendLine(). + Append("private static ").Append(cellInstanceNameWithoutHyphen).AppendLine(" _EAFLoggingUnitTesting;"). + Append("internal static ").Append(cellInstanceNameWithoutHyphen).AppendLine(" EAFLoggingUnitTesting => _EAFLoggingUnitTesting;"); + else + throw new Exception(); + if (i == 2) + _ = stringBuilder.AppendLine(); + else if (i == 1) + _ = stringBuilder. + AppendLine(). + Append("public ").Append(cellInstanceNameWithoutHyphen).AppendLine("() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false)"). + AppendLine("{"). + AppendLine("if (_EAFLoggingUnitTesting is null)"). + AppendLine("throw new Exception();"). + AppendLine("}"). + AppendLine(). + Append("public ").Append(cellInstanceNameWithoutHyphen).AppendLine("(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false)"). + AppendLine("{"). + AppendLine("}"). + AppendLine(); + else + throw new Exception(); + _ = stringBuilder. + AppendLine("[ClassInitialize]"). + AppendLine("public static void ClassInitialize(TestContext testContext)"). + AppendLine("{"); + if (i == 2) + _ = stringBuilder. + Append("CreateSelfDescription.").Append(_Environment).Append('.').Append(cellInstanceVersionNameAsCode).Append('.').Append(cellInstanceNameWithoutHyphen).AppendLine(".ClassInitialize(testContext);"). + Append('_').Append(cellInstanceNameWithoutHyphen).Append(" = CreateSelfDescription.").Append(_Environment).Append('.').Append(cellInstanceVersionNameAsCode).Append('.').Append(cellInstanceNameWithoutHyphen).AppendLine(".EAFLoggingUnitTesting;"). + AppendLine("}"); + else if (i == 1) + _ = stringBuilder. + AppendLine("if (_EAFLoggingUnitTesting is null)"). + Append("_EAFLoggingUnitTesting = new ").Append(cellInstanceNameWithoutHyphen).AppendLine("(testContext);"). + AppendLine("_EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, \" - ClassInitialize\"));"). + AppendLine("string[] fileNameAndText = _EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName);"). + AppendLine("File.WriteAllText(fileNameAndText[0], fileNameAndText[1]);"). + AppendLine("File.WriteAllText(fileNameAndText[2], fileNameAndText[3]);"). + AppendLine("}"); + else + throw new Exception(); + if (i == 2) + _ = stringBuilder.AppendLine(); + else if (i == 1) + _ = stringBuilder. + AppendLine(). + AppendLine("[ClassCleanup()]"). + AppendLine("public static void ClassCleanup()"). + AppendLine("{"). + AppendLine("if (!(_EAFLoggingUnitTesting.Logger is null))"). + AppendLine("_EAFLoggingUnitTesting.Logger.LogInformation(\"Cleanup\");"). + AppendLine("if (!(_EAFLoggingUnitTesting is null))"). + AppendLine("_EAFLoggingUnitTesting.Dispose();"). + AppendLine("}"). + AppendLine(); + else + throw new Exception(); + foreach (ComponentsCellComponent componentsCellComponent in cellInstanceVersion.ComponentModel.Components) + { + if (componentsCellComponent.Children.Length != 1) + continue; + componentsCellComponentCellComponent = componentsCellComponent.Children[0]; + if (componentsCellComponentCellComponent.Equipment.EquipmentDictionaries?.CellEquipmentDictionaryReference?.DictionaryName is not null) + componentsCellComponentCellComponentEquipmentDictionaryNames.Add(componentsCellComponentCellComponent.Equipment.EquipmentDictionaries?.CellEquipmentDictionaryReference?.DictionaryName); + componentsCellComponentCellComponentEquipmentNames.Add(componentsCellComponentCellComponent.Equipment.Name); + componentsCellComponentCellComponentEquipmentTypeNames.Add(componentsCellComponentCellComponent.Equipment.EquipmentType.Name); + methodName = $"{_Environment}__{cellInstanceVersionNameAsCode}__{cellInstanceNameWithoutHyphen}__{componentsCellComponentCellComponent.Equipment.Name.Replace('-', '_')}"; + if (componentsCellComponentCellComponent?.Equipment?.ConnectionSettings?.Setting is null) + check = string.Empty; + else + check = (from l in componentsCellComponentCellComponent.Equipment.ConnectionSettings.Setting where l.Name == sourceDirectoryCloaking select l.Value).FirstOrDefault(); + if (string.IsNullOrEmpty(check)) + check = componentsCellComponentCellComponent.Equipment.SourceFileFilter; + _ = stringBuilder. + AppendLine("[TestMethod]"). + Append("public void ").Append(methodName).AppendLine("()"). + AppendLine("{"); + if (i == 2) + _ = stringBuilder.Append('_').Append(cellInstanceNameWithoutHyphen).Append('.').Append(methodName).AppendLine("();"); + else if (i == 1) + { + if (componentsCellComponentCellComponent.Equipment.EquipmentType.Version != cellInstanceVersionName) + throw new Exception("Versions should match!"); + equipmentTypeName = componentsCellComponentCellComponent.Equipment.EquipmentType.Name; + _ = stringBuilder. + Append("string check = \"").Append(check.Split('\\').Last()).AppendLine("\";"). + AppendLine("MethodBase methodBase = new StackFrame().GetMethod();"). + AppendLine("_EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, \" - Getting configuration\"));"). + AppendLine("string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase);"). + AppendLine("Assert.IsTrue(fileNameAndJson[1].Contains(check));"). + AppendLine("File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]);"); + if (componentsCellComponentCellComponent.Equipment.EquipmentType.Name == componentsCellComponentCellComponentEquipmentTypeNames[0]) + _ = stringBuilder. + AppendLine("IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false);"). + AppendLine("Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName));"); + _ = stringBuilder. + AppendLine("_EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, \" - Exit\"));"); + } + else + throw new Exception(); + _ = stringBuilder. + AppendLine("}"). + AppendLine(); + } + _ = stringBuilder. + AppendLine("}"). + AppendLine(). + AppendLine("}"). + AppendLine(). + AppendLine("// dotnet build --runtime win-x64"). + Append("// dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.").Append(loopName).Append('.').Append(_Environment).Append('.').Append(cellInstanceVersionNameAsCode).AppendLine("\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")"). + Append("// dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.").Append(loopName).Append('.').Append(_Environment).Append('.').Append(cellInstanceVersionNameAsCode).Append(" & ClassName~").Append(cellInstanceNameWithoutHyphen).AppendLine("\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")"). + Append("// dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.").Append(loopName).Append('.').Append(_Environment).Append('.').Append(cellInstanceVersionNameAsCode).Append(" & ClassName~").Append(cellInstanceNameWithoutHyphen).Append(" & ").Append(methodName).AppendLine("\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")"); + if (i == 2) + extractText = stringBuilder.ToString().Trim(); + else if (i == 1) + createSelfDescriptionText = stringBuilder.ToString().Trim(); + else + throw new Exception(); + _ = stringBuilder.Clear(); + } + if (componentsCellComponentCellComponentEquipmentDictionaryNames.Any() && string.IsNullOrEmpty(cellInstanceVersion.FrozenBy)) + { + if (!cellInstanceVersion.CellCommunicatingRule.EndsWith(".Communicating") || !(from l in componentsCellComponentCellComponentEquipmentNames where l == cellInstanceVersion.CellCommunicatingRule.Split('.')[0] select true).Any()) + throw new Exception($"{methodName} - CellCommunicatingRule not correct in Mango!"); + if (!cellInstanceVersion.CellNotCommunicatingRule.EndsWith(".NotCommunicating") || !(from l in componentsCellComponentCellComponentEquipmentNames where l == cellInstanceVersion.CellNotCommunicatingRule.Split('.')[0] select true).Any()) + throw new Exception($"{methodName} - CellNotCommunicatingRule not correct in Mango!"); + } + string versionLevelDirectory = Path.GetDirectoryName(fileInfo.DirectoryName); + results.Add(Path.Combine(versionLevelDirectory, $"{cellInstanceName}-0-CreateSelfDescription.txt")); + results.Add(createSelfDescriptionText); + results.Add(Path.Combine(versionLevelDirectory, $"{cellInstanceName}-1-Extract.txt")); + results.Add(extractText); + return results.ToArray(); + } + + protected static FileConnectorConfiguration GetFileConnectorConfiguration(string json, ComponentsCellComponentCellComponent componentsCellComponentCellComponent) + { + FileConnectorConfiguration result; + const string sourceDirectoryCloaking = nameof(FileConnectorConfiguration.SourceDirectoryCloaking); + JsonSerializerOptions jsonSerializerOptions = new() + { Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } }; + json = json.Replace(string.Concat("\"", nameof(FileConnectorConfiguration.ConnectionSettings), "\":"), string.Concat("\"Ignore", nameof(FileConnectorConfiguration.ConnectionSettings), "\":")); + result = JsonSerializer.Deserialize(json, jsonSerializerOptions); + if (string.IsNullOrEmpty(result.SourceFileFilter)) + result.SourceFileFilter = string.Empty; + if (result.ErrorTargetFileLocation is null) + result.ErrorTargetFileLocation = string.Empty; + if (result.SourceFileLocation is null) + result.SourceFileLocation = string.Empty; + if (result.TargetFileLocation is null) + result.TargetFileLocation = string.Empty; + if (result.FolderAgeCheckIndividualSubFolders is null) + result.FolderAgeCheckIndividualSubFolders = false; + result.ConnectionSettings = new List(); + result.SourceFileFilters = result.SourceFileFilter.Split('|').ToList(); + if (componentsCellComponentCellComponent.Equipment?.ConnectionSettings is not null) + { + foreach (Setting setting in componentsCellComponentCellComponent.Equipment.ConnectionSettings.Setting) + result.ConnectionSettings.Add(new ConnectionSetting(null, null) { Name = setting.Name, Value = setting.Value }); + } + IEnumerable sourceDirectoryCloakingCollection = (from l in result.ConnectionSettings where l.Name == sourceDirectoryCloaking select l); + if (sourceDirectoryCloakingCollection.Any()) + result.SourceDirectoryCloaking = sourceDirectoryCloakingCollection.First().Value; + else + { + result.SourceDirectoryCloaking = string.Empty; + result.ConnectionSettings.Add(new ConnectionSetting(null, null) { Name = sourceDirectoryCloaking, Value = string.Empty }); + } + return result; + } + + protected Tuple GetFileConnectorConfigurationTuple(Tuple cellInstanceVersionTuple, string cellInstanceConnectionName) + { + Tuple result; + FileConnectorConfiguration fileConnectorConfiguration; + string cellInstanceServiceV2With = string.Concat(cellInstanceVersionTuple.Item1, '/', cellInstanceConnectionName); + if (_FileConnectorConfigurations.ContainsKey(cellInstanceServiceV2With)) + fileConnectorConfiguration = _FileConnectorConfigurations[cellInstanceServiceV2With]; + else + { + Dictionary componentModelComponentsIndexes = GetComponentModelComponentsIndexes(cellInstanceVersionTuple.Item2, cellInstanceConnectionName); + int[] cellInstanceConnectionNameIndexes = GetCellInstanceConnectionNameIndexes(cellInstanceConnectionName, componentModelComponentsIndexes); + ComponentsCellComponentCellComponent componentsCellComponentCellComponent = cellInstanceVersionTuple.Item2.ComponentModel.Components[cellInstanceConnectionNameIndexes[0]].Children[cellInstanceConnectionNameIndexes[1]]; + string json = JsonSerializer.Serialize(componentsCellComponentCellComponent.Equipment, new JsonSerializerOptions { WriteIndented = true }); + fileConnectorConfiguration = GetFileConnectorConfiguration(json, componentsCellComponentCellComponent); + _FileConnectorConfigurations.Add(cellInstanceServiceV2With, fileConnectorConfiguration); + } + result = new Tuple(cellInstanceServiceV2With, fileConnectorConfiguration); + return result; + } + + protected static EquipmentTypeVersion GetEquipmentTypeVersion(string url) + { + EquipmentTypeVersion result; + byte[] byteArray; + ConfigurationData configurationData; + string decodedCellInstanceConfigurationData; + string xml; + try + { + xml = XDocument.Load(url).ToString(); + } + catch (System.Exception exception) + { + throw new Exception(string.Concat(url, System.Environment.NewLine, exception.Message)); + } + configurationData = ParseXML(xml, throwExceptions: true); + byteArray = Convert.FromBase64String(configurationData.Data); + decodedCellInstanceConfigurationData = Encoding.Unicode.GetString(byteArray); + if (xml.Length <= 41) + throw new Exception(string.Concat("xml isn't valid {", xml, "}")); + decodedCellInstanceConfigurationData = decodedCellInstanceConfigurationData.Substring(41).Replace("i:type", "i___type"); + result = ParseXML(decodedCellInstanceConfigurationData, throwExceptions: true); + return result; + } + + protected Tuple GetEquipmentTypeVersionTuple(CellInstanceVersion cellInstanceVersion, string cellInstanceConnectionName) + { + Tuple result; + EquipmentTypeVersion equipmentTypeVersion; + Dictionary componentModelComponentsIndexes = GetComponentModelComponentsIndexes(cellInstanceVersion, cellInstanceConnectionName); + int[] cellInstanceConnectionNameIndexes = GetCellInstanceConnectionNameIndexes(cellInstanceConnectionName, componentModelComponentsIndexes); + ComponentsCellComponentCellComponent componentsCellComponentCellComponent = cellInstanceVersion.ComponentModel.Components[cellInstanceConnectionNameIndexes[0]].Children[cellInstanceConnectionNameIndexes[1]]; + string equipmentTypeServiceV2 = string.Concat("http://", _HostNameAndPort, "/EquipmentTypeServiceV2/", componentsCellComponentCellComponent.Equipment.EquipmentType.Name, "/", componentsCellComponentCellComponent.Equipment.EquipmentType.Version, "/configuration"); + if (_EquipmentTypeVersions.ContainsKey(equipmentTypeServiceV2)) + equipmentTypeVersion = _EquipmentTypeVersions[equipmentTypeServiceV2]; + else + { + equipmentTypeVersion = GetEquipmentTypeVersion(equipmentTypeServiceV2); + _EquipmentTypeVersions.Add(equipmentTypeServiceV2, equipmentTypeVersion); + } + result = new Tuple(equipmentTypeServiceV2, componentsCellComponentCellComponent.Equipment.EquipmentType.Name, componentsCellComponentCellComponent.Equipment.EquipmentType.Version, equipmentTypeVersion); + return result; + } + + protected Tuple GetParameterizedModelObjectDefinitionTypeTuple(Tuple equipmentTypeVersionTuple) + { + Tuple result; + string parameterizedModelObjectDefinitionType; + if (_FileConnectorConfigurations.ContainsKey(equipmentTypeVersionTuple.Item1)) + parameterizedModelObjectDefinitionType = _ParameterizedModelObjectDefinitionTypes[equipmentTypeVersionTuple.Item1]; + else + parameterizedModelObjectDefinitionType = equipmentTypeVersionTuple.Item4.FileHandlerObjectTypes.ParameterizedModelObjectDefinition.Type; + result = new Tuple(equipmentTypeVersionTuple.Item1, parameterizedModelObjectDefinitionType); + return result; + } + + protected IList GetModelObjectParameters(string json) + { + IList results; + JsonSerializerOptions jsonSerializerOptions = new() + { Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } }; + JsonElement jsonElement = JsonSerializer.Deserialize(json); + string parameters = "Parameters"; + string fileHandlerObjectTypes = nameof(FileHandlerObjectTypes); + string parameterizedModelObjectDefinition = nameof(ParameterizedModelObjectDefinition); + if (!json.Contains(fileHandlerObjectTypes) || !json.Contains(parameterizedModelObjectDefinition)) + throw new Exception(); + jsonElement = jsonElement.GetProperty(fileHandlerObjectTypes); + if (jsonElement.ValueKind != JsonValueKind.Object) + throw new Exception(); + jsonElement = jsonElement.GetProperty(parameterizedModelObjectDefinition); + if (jsonElement.ValueKind != JsonValueKind.Object) + throw new Exception(); + jsonElement = jsonElement.GetProperty(parameters); + if (jsonElement.ValueKind != JsonValueKind.Array) + throw new Exception(); + results = JsonSerializer.Deserialize>(jsonElement.ToString(), jsonSerializerOptions); + return results; + } + + protected Tuple> GetModelObjectParameters(Tuple equipmentTypeVersionTuple) + { + Tuple> result; + IList modelObjectParameters; + if (_FileConnectorConfigurations.ContainsKey(equipmentTypeVersionTuple.Item1)) + modelObjectParameters = _ModelObjectParameters[equipmentTypeVersionTuple.Item1]; + else + { + string json = JsonSerializer.Serialize(equipmentTypeVersionTuple.Item4, new JsonSerializerOptions { WriteIndented = true }); + modelObjectParameters = GetModelObjectParameters(json); + } + result = new Tuple>(equipmentTypeVersionTuple.Item1, modelObjectParameters); + return result; + } + + protected string[] GetEquipmentDictionaryStrings(ComponentsCellComponentCellComponentEquipment componentsCellComponentCellComponentEquipment, EquipmentTypeVersion equipmentTypeVersion) + { + string[] results; + string equipmentDictionaryName; + string equipmentDictionaryVersionName; + if (_SkipEquipmentDictionary || equipmentTypeVersion?.EventActionSequences is null || !equipmentTypeVersion.EventActionSequences.Any() || !(from l in equipmentTypeVersion.EventActionSequences where l.HandledEvent.StartsWith("Equipment.FileRead") select 1).Any()) + { + equipmentDictionaryName = string.Empty; + equipmentDictionaryVersionName = string.Empty; + } + else + { + if (componentsCellComponentCellComponentEquipment?.EquipmentDictionaries.CellEquipmentDictionaryReference is null) + { + // equipmentDictionaryName = equipmentTypeVersion.Dictionaries.EquipmentTypeDictionaryReference.DictionaryName; + // equipmentDictionaryVersionName = equipmentTypeVersion.Dictionaries.EquipmentTypeDictionaryReference.DictionaryVersion; + equipmentDictionaryName = string.Empty; + equipmentDictionaryVersionName = string.Empty; + } + else + { + equipmentDictionaryName = componentsCellComponentCellComponentEquipment.EquipmentDictionaries.CellEquipmentDictionaryReference.DictionaryName; + equipmentDictionaryVersionName = componentsCellComponentCellComponentEquipment.EquipmentDictionaries.CellEquipmentDictionaryReference.DictionaryVersion; + } + } + results = new string[] { equipmentDictionaryName, equipmentDictionaryVersionName }; + return results; + } + + protected static EquipmentDictionaryVersion GetEquipmentDictionaryVersion(string url) + { + EquipmentDictionaryVersion result; + string xml; + try + { + xml = XDocument.Load(url).ToString(); + } + catch (System.Exception exception) + { + throw new Exception(string.Concat(url, System.Environment.NewLine, exception.Message)); + } + ConfigurationData configurationData = ParseXML(xml, throwExceptions: true); + byte[] byteArray = Convert.FromBase64String(configurationData.Data); + string decodedCellInstanceConfigurationData = Encoding.Unicode.GetString(byteArray); + if (xml.Length <= 41) + throw new Exception(string.Concat("xml isn't valid {", xml, "}")); + decodedCellInstanceConfigurationData = decodedCellInstanceConfigurationData.Substring(41).Replace("i:type", "i___type"); + result = ParseXML(decodedCellInstanceConfigurationData, throwExceptions: true); + return result; + } + + protected Tuple GetEquipmentDictionaryVersionTuple(CellInstanceVersion cellInstanceVersion, string cellInstanceConnectionName, EquipmentTypeVersion equipmentTypeVersion) + { + Tuple result; + string equipmentDictionaryName; + string equipmentDictionaryVersionName; + EquipmentDictionaryVersion equipmentDictionaryVersion; + Dictionary componentModelComponentsIndexes = GetComponentModelComponentsIndexes(cellInstanceVersion, cellInstanceConnectionName); + int[] cellInstanceConnectionNameIndexes = GetCellInstanceConnectionNameIndexes(cellInstanceConnectionName, componentModelComponentsIndexes); + ComponentsCellComponentCellComponent componentsCellComponentCellComponent = cellInstanceVersion.ComponentModel.Components[cellInstanceConnectionNameIndexes[0]].Children[cellInstanceConnectionNameIndexes[1]]; + string[] segments = GetEquipmentDictionaryStrings(componentsCellComponentCellComponent.Equipment, equipmentTypeVersion); + if (_SkipEquipmentDictionary || segments is null || segments.Length != 2 || string.IsNullOrEmpty(segments[0]) || string.IsNullOrEmpty(segments[1])) + { + equipmentDictionaryName = string.Empty; + equipmentDictionaryVersionName = string.Empty; + } + else + { + equipmentDictionaryName = segments[0]; + equipmentDictionaryVersionName = segments[1]; + } + string equipmentDictionaryServiceV2 = string.Concat("http://", _HostNameAndPort, "/EquipmentDictionaryServiceV2/", equipmentDictionaryName, "/", equipmentDictionaryVersionName, "/configuration"); + if (string.IsNullOrEmpty(equipmentDictionaryName) || string.IsNullOrEmpty(equipmentDictionaryVersionName)) + equipmentDictionaryVersion = null; + else + { + if (_EquipmentDictionaryVersions.ContainsKey(equipmentDictionaryServiceV2)) + equipmentDictionaryVersion = _EquipmentDictionaryVersions[equipmentDictionaryServiceV2]; + else + { + equipmentDictionaryVersion = GetEquipmentDictionaryVersion(equipmentDictionaryServiceV2); + _EquipmentDictionaryVersions.Add(equipmentDictionaryServiceV2, equipmentDictionaryVersion); + } + } + result = new Tuple(equipmentDictionaryServiceV2, equipmentDictionaryName, equipmentDictionaryVersionName, equipmentDictionaryVersion); + return result; + } + + protected Tuple>> GetEquipmentDictionaryIsAlwaysEnabledEventsTuple(Tuple equipmentDictionaryVersionTuple) + { + Tuple>> result; + List> results; + if (_SkipEquipmentDictionary) + results = new List>(); + else if (string.IsNullOrEmpty(equipmentDictionaryVersionTuple.Item1)) + throw new Exception(); + else if (equipmentDictionaryVersionTuple?.Item4?.Events?.Event is null) + results = new List>(); + else if (_EquipmentDictionaryEventDescriptions.ContainsKey(equipmentDictionaryVersionTuple.Item1)) + results = _EquipmentDictionaryEventDescriptions[equipmentDictionaryVersionTuple.Item1]; + else + { + results = new List>(); + foreach (EquipmentDictionaryVersionEventsEvent equipmentDictionaryVersionEventsEvent in equipmentDictionaryVersionTuple.Item4.Events.Event) + { + if (string.IsNullOrEmpty(equipmentDictionaryVersionEventsEvent.Description)) + continue; + if (!equipmentDictionaryVersionEventsEvent.IsAlwaysEnabled) + continue; + results.Add(new Tuple(equipmentDictionaryVersionEventsEvent.Name, equipmentDictionaryVersionEventsEvent.Description)); + } + } + result = new Tuple>>(equipmentDictionaryVersionTuple.Item1, results); + return result; + } + + protected Dictionary GetKeyValuePairs(string cellInstanceName, string cellInstanceVersionName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, List> equipmentDictionaryIsAlwaysEnabledEvents) + { + Dictionary results = new() + { + { nameof(Environment), _Environment }, + { nameof(HostNameAndPort), _HostNameAndPort }, + { nameof(cellInstanceName), cellInstanceName }, + { nameof(equipmentTypeName), equipmentTypeName }, + { nameof(cellInstanceVersionName), cellInstanceVersionName }, + { nameof(equipmentDictionaryName), equipmentDictionaryName }, + { nameof(cellInstanceConnectionName), cellInstanceConnectionName }, + { nameof(FileConnectorConfiguration), fileConnectorConfiguration }, + { nameof(IList), modelObjectParameters }, + { nameof(parameterizedModelObjectDefinitionType), parameterizedModelObjectDefinitionType }, + { nameof(equipmentDictionaryIsAlwaysEnabledEvents), equipmentDictionaryIsAlwaysEnabledEvents } + }; + return results; + } + + public string[] GetCSharpText(string testName) + { + string[] results; + string[] segments = GetSegments(testName); + FileInfo fileInfo = GetFileName(segments); + string cellInstanceName = GetCellInstanceName(segments); + string cellInstanceVersionName = GetCellInstanceVersionName(segments); + string cellInstanceConnectionName = GetCellInstanceConnectionName(segments); + if (!string.IsNullOrEmpty(cellInstanceConnectionName) && !Directory.Exists(fileInfo.DirectoryName)) + _ = Directory.CreateDirectory(fileInfo.Directory.FullName); + Tuple cellInstanceVersionTuple = GetCellInstanceVersionTuple(cellInstanceName, cellInstanceVersionName); + results = GetCSharpTextB(fileInfo, cellInstanceName, cellInstanceVersionName, cellInstanceVersionTuple.Item2); + return results; + } + + public string[] GetConfiguration(MethodBase methodBase) + { + string[] results; + string[] segments = GetSegments(methodBase.Name); + FileInfo fileInfo = GetFileName(segments); + string cellInstanceName = GetCellInstanceName(segments); + string cellInstanceVersionName = GetCellInstanceVersionName(segments); + string cellInstanceConnectionName = GetCellInstanceConnectionName(segments); + if (!string.IsNullOrEmpty(cellInstanceConnectionName) && !Directory.Exists(fileInfo.DirectoryName)) + _ = Directory.CreateDirectory(fileInfo.Directory.FullName); + Tuple cellInstanceVersionTuple = GetCellInstanceVersionTuple(cellInstanceName, cellInstanceVersionName); + Tuple fileConnectorConfigurationTuple = GetFileConnectorConfigurationTuple(cellInstanceVersionTuple, cellInstanceConnectionName); + Tuple equipmentTypeVersionTuple = GetEquipmentTypeVersionTuple(cellInstanceVersionTuple.Item2, cellInstanceConnectionName); + Tuple parameterizedModelObjectDefinitionTypeTuple = GetParameterizedModelObjectDefinitionTypeTuple(equipmentTypeVersionTuple); + Tuple> modelObjectParametersTuple = GetModelObjectParameters(equipmentTypeVersionTuple); + Tuple equipmentDictionaryVersionTuple = GetEquipmentDictionaryVersionTuple(cellInstanceVersionTuple.Item2, cellInstanceConnectionName, equipmentTypeVersionTuple.Item4); + Tuple>> equipmentDictionaryIsAlwaysEnabledEventsTuple = GetEquipmentDictionaryIsAlwaysEnabledEventsTuple(equipmentDictionaryVersionTuple); + Dictionary objects = GetKeyValuePairs(cellInstanceName, cellInstanceVersionName, cellInstanceConnectionName, fileConnectorConfigurationTuple.Item2, equipmentTypeVersionTuple.Item2, parameterizedModelObjectDefinitionTypeTuple.Item2, modelObjectParametersTuple.Item2, equipmentDictionaryVersionTuple.Item2, equipmentDictionaryIsAlwaysEnabledEventsTuple.Item2); + string json = JsonSerializer.Serialize(objects, new JsonSerializerOptions { WriteIndented = true }); + results = new string[] { fileInfo.FullName, json }; + return results; + } + + public IFileRead Get(MethodBase methodBase, string sourceFileLocation, string sourceFileFilter, bool useCyclicalForDescription) + { + IFileRead result; + string[] segments = GetSegments(methodBase.Name); + FileInfo fileInfo = GetFileName(segments); + string cellInstanceName = GetCellInstanceName(segments); + string cellInstanceVersionName = GetCellInstanceVersionName(segments); + Dictionary fileParameter = new(); + string cellInstanceConnectionName = GetCellInstanceConnectionName(segments); + if (!string.IsNullOrEmpty(cellInstanceConnectionName) && !Directory.Exists(fileInfo.DirectoryName)) + _ = Directory.CreateDirectory(fileInfo.Directory.FullName); + Dictionary> dummyRuns = new(); + Tuple cellInstanceVersionTuple = GetCellInstanceVersionTuple(cellInstanceName, cellInstanceVersionName); + Tuple fileConnectorConfigurationTuple = GetFileConnectorConfigurationTuple(cellInstanceVersionTuple, cellInstanceConnectionName); + Tuple equipmentTypeVersionTuple = GetEquipmentTypeVersionTuple(cellInstanceVersionTuple.Item2, cellInstanceConnectionName); + Tuple parameterizedModelObjectDefinitionTypeTuple = GetParameterizedModelObjectDefinitionTypeTuple(equipmentTypeVersionTuple); + Tuple> modelObjectParametersTuple = GetModelObjectParameters(equipmentTypeVersionTuple); + Tuple equipmentDictionaryVersionTuple = GetEquipmentDictionaryVersionTuple(cellInstanceVersionTuple.Item2, cellInstanceConnectionName, equipmentTypeVersionTuple.Item4); + + _ = GetEquipmentDictionaryIsAlwaysEnabledEventsTuple(equipmentDictionaryVersionTuple); + if (!string.IsNullOrEmpty(sourceFileLocation) && sourceFileLocation != fileConnectorConfigurationTuple.Item2.SourceFileLocation) + fileConnectorConfigurationTuple.Item2.SourceFileLocation = sourceFileLocation; + if (!string.IsNullOrEmpty(sourceFileFilter) && sourceFileFilter != fileConnectorConfigurationTuple.Item2.SourceFileFilter) + { + fileConnectorConfigurationTuple.Item2.SourceFileFilter = sourceFileFilter; + fileConnectorConfigurationTuple.Item2.SourceFileFilters = sourceFileFilter.Split('|').ToList(); + } + result = Adaptation.FileHandlers.CellInstanceConnectionName.Get(this, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfigurationTuple.Item2, equipmentTypeVersionTuple.Item2, parameterizedModelObjectDefinitionTypeTuple.Item2, modelObjectParametersTuple.Item2, equipmentDictionaryVersionTuple.Item2, dummyRuns, useCyclicalForDescription, isEAFHosted: false); + return result; + } + + public string[] GetVariables(MethodBase methodBase, string check) + { + string[] results; + string[] lines; + string ipdsfFile; + string textFileDirectory; + string fileNameWithoutExtension; + string searchPattern = "*.ipdsf"; + string sourceFileFilter = string.Empty; + string sourceFileLocation = string.Empty; + string[] segments = GetSegments(methodBase); + string ticks = GetTicks(segments); + FileInfo fileInfo = GetFileName(segments); + string[] textFiles = GetTextFiles(segments); + string cellInstanceName = GetCellInstanceName(segments); + string rawCellInstanceName = GetRawCellInstanceName(segments); + string cellInstanceConnectionName = GetCellInstanceConnectionName(segments); + string cellInstanceConnectionNameFromMethodBaseName = GetCellInstanceConnectionNameFromMethodBaseName(segments); + string methodBaseNameWithActualCICN = GetMethodBaseNameWithActualCICN(methodBase.Name, rawCellInstanceName, cellInstanceConnectionNameFromMethodBaseName, cellInstanceConnectionName, ticks); + if (!textFiles.Any()) + textFileDirectory = string.Empty; + else + textFileDirectory = Path.GetDirectoryName(textFiles[0]); + foreach (string textFile in textFiles) + { + lines = File.ReadAllLines(textFile); + if (lines.Length != 1) + continue; + fileNameWithoutExtension = Path.GetFileNameWithoutExtension(textFile); + if (fileNameWithoutExtension == nameof(FileConnectorConfiguration.SourceFileFilter)) + sourceFileFilter = lines[0]; + else if (fileNameWithoutExtension == nameof(FileConnectorConfiguration.SourceFileLocation)) + { + segments = lines[0].Split(new string[] { ticks }, StringSplitOptions.None); + if (segments.Length > 2) + throw new Exception("Ticks should only appear once in source file location!"); + if (segments.Length != 2) + throw new Exception("Ticks missing from source file location!"); + if (!segments[1].EndsWith(methodBaseNameWithActualCICN.Replace(ticks, string.Empty))) + throw new Exception("Method name missing from source file location!"); + sourceFileLocation = lines[0]; + } + } + if (!Directory.Exists(fileInfo.Directory.FullName)) + _ = Directory.CreateDirectory(fileInfo.Directory.FullName); + if (!fileInfo.Exists) + throw new Exception(); + string json = File.ReadAllText(fileInfo.FullName); + if (!json.Contains(check)) + throw new Exception(); + if (!json.Contains(nameof(FileConnectorConfiguration))) + throw new Exception(); + JsonElement jsonElement = JsonSerializer.Deserialize(json); + JsonElement fileConnectorConfigurationJsonElement = jsonElement.GetProperty(nameof(FileConnectorConfiguration)); + if (fileConnectorConfigurationJsonElement.ValueKind != JsonValueKind.Object) + throw new Exception(); + JsonSerializerOptions jsonSerializerOptions = new() + { Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } }; + FileConnectorConfiguration fileConnectorConfiguration = JsonSerializer.Deserialize(fileConnectorConfigurationJsonElement.ToString(), jsonSerializerOptions); + if (!string.IsNullOrEmpty(sourceFileFilter)) + fileConnectorConfiguration.SourceFileFilter = sourceFileFilter; + if (!string.IsNullOrEmpty(sourceFileLocation)) + fileConnectorConfiguration.SourceFileLocation = sourceFileLocation; + if (string.IsNullOrEmpty(sourceFileLocation)) + ipdsfFile = searchPattern; + else + { + string ipdsfDirectory = Path.Combine(sourceFileLocation, "ipdsf"); + if (!Directory.Exists(ipdsfDirectory)) + ipdsfFile = searchPattern; + else + { + string[] files = Directory.GetFiles(ipdsfDirectory, searchPattern, SearchOption.TopDirectoryOnly); + if (files.Any()) + ipdsfFile = files[0]; + else + ipdsfFile = searchPattern; + } + } + if (ipdsfFile == searchPattern) + throw new Exception(); + results = new string[] { fileInfo.FullName, json, fileConnectorConfiguration.SourceFileLocation, fileConnectorConfiguration.SourceFileFilter, ipdsfFile, textFileDirectory }; + if (string.IsNullOrEmpty(results[0])) + throw new Exception(); + if (string.IsNullOrEmpty(results[1])) + throw new Exception(); + if (string.IsNullOrEmpty(results[2])) + throw new Exception(); + if (string.IsNullOrEmpty(results[3])) + throw new Exception(); + if (string.IsNullOrEmpty(results[4])) + throw new Exception(); + if (string.IsNullOrEmpty(results[5])) + throw new Exception(); + return results; + } + +} +// namespace _Tests.Helpers { public class AdaptationTesting { } } +// 2022-02-02 -> AdaptationTesting \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/EAFLoggingUnitTesting.cs b/Adaptation/_Tests/Shared/EAFLoggingUnitTesting.cs new file mode 100644 index 0000000..4504bae --- /dev/null +++ b/Adaptation/_Tests/Shared/EAFLoggingUnitTesting.cs @@ -0,0 +1,28 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; + +namespace Shared; + +public class EAFLoggingUnitTesting : LoggingUnitTesting, IDisposable +{ + + protected readonly AdaptationTesting _AdaptationTesting; + + public AdaptationTesting AdaptationTesting => _AdaptationTesting; + + public EAFLoggingUnitTesting(TestContext testContext, Type declaringType, bool skipEquipmentDictionary) : + base(testContext, declaringType) + { + if (testContext is null || declaringType is null) + _AdaptationTesting = null; + else + _AdaptationTesting = new AdaptationTesting(testContext, skipEquipmentDictionary); + } + + public new void Dispose() + { + base.Dispose(); + GC.SuppressFinalize(this); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/IsEnvironment.cs b/Adaptation/_Tests/Shared/IsEnvironment.cs new file mode 100644 index 0000000..d47716e --- /dev/null +++ b/Adaptation/_Tests/Shared/IsEnvironment.cs @@ -0,0 +1,168 @@ +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace Shared; + +public class IsEnvironment +{ + + public enum Name + { + LinuxDevelopment, + LinuxProduction, + LinuxStaging, + OSXDevelopment, + OSXProduction, + OSXStaging, + WindowsDevelopment, + WindowsProduction, + WindowsStaging + } + + public bool DebuggerWasAttachedDuringConstructor { get; private set; } + public bool Development { get; private set; } + public bool Linux { get; private set; } + public bool OSX { get; private set; } + public bool Production { get; private set; } + public bool Staging { get; private set; } + public bool Windows { get; private set; } + public string Profile { get; private set; } + public string AppSettingsFileName { get; private set; } + public string ASPNetCoreEnvironment { get; private set; } + + public IsEnvironment(string testCategory) + { + if (testCategory.EndsWith(".json")) + { + Production = testCategory == "appsettings.json"; + Staging = testCategory.EndsWith(nameof(Staging)); + OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + Development = testCategory.EndsWith(nameof(Development)); + Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; + Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + } + else + { + DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; + OSX = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(OSX)); + ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + Linux = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Linux)); + Staging = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Staging)); + Windows = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Windows)); + Production = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Production)); + Development = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Development)); + } + Profile = GetProfile(); + AppSettingsFileName = GetAppSettingsFileName(processesCount: null); + } + + public IsEnvironment(bool isDevelopment, bool isStaging, bool isProduction) + { + Staging = isStaging; + Production = isProduction; + Development = isDevelopment; + OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; + Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + Profile = GetProfile(); + AppSettingsFileName = GetAppSettingsFileName(processesCount: null); + } + + public IsEnvironment(int? processesCount, bool nullASPNetCoreEnvironmentIsDevelopment, bool nullASPNetCoreEnvironmentIsProduction) + { + OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; + Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + if (nullASPNetCoreEnvironmentIsDevelopment && nullASPNetCoreEnvironmentIsProduction) + throw new Exception(); + else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsProduction) + Production = true; + else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsDevelopment) + Development = true; + else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && !nullASPNetCoreEnvironmentIsDevelopment && !nullASPNetCoreEnvironmentIsProduction) + throw new Exception(); + else + { + Staging = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Staging)); + Production = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Production)); + Development = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Development)); + } + Profile = GetProfile(); + AppSettingsFileName = GetAppSettingsFileName(processesCount); + } + + private string GetProfile() + { + string result; + if (Windows && Production) + result = nameof(Production); + else if (Windows && Staging) + result = nameof(Staging); + else if (Windows && Development) + result = nameof(Development); + else if (Linux && Production) + result = nameof(Name.LinuxProduction); + else if (Linux && Staging) + result = nameof(Name.LinuxStaging); + else if (Linux && Development) + result = nameof(Name.LinuxDevelopment); + else if (OSX && Production) + result = nameof(Name.OSXProduction); + else if (OSX && Staging) + result = nameof(Name.OSXStaging); + else if (OSX && Development) + result = nameof(Name.OSXDevelopment); + else + throw new Exception(); + return result; + } + + private string GetAppSettingsFileName(int? processesCount) + { + string result; + if (Production) + { + if (processesCount is null) + result = "appsettings.json"; + else + result = $"appsettings.{processesCount}.json"; + } + else + { + string environment; + if (Staging) + environment = nameof(Staging); + else if (Development) + environment = nameof(Development); + else + throw new Exception(); + if (processesCount is null) + result = $"appsettings.{environment}.json"; + else + result = $"appsettings.{environment}.{processesCount}.json"; + } + return result; + } + + public static string GetEnvironmentName(IsEnvironment isEnvironment) + { + string result; + if (isEnvironment.Windows) + result = nameof(IsEnvironment.Windows); + else if (isEnvironment.Linux) + result = nameof(IsEnvironment.Linux); + else if (isEnvironment.OSX) + result = nameof(IsEnvironment.OSX); + else + throw new Exception(); + return result; + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/LoggingUnitTesting.cs b/Adaptation/_Tests/Shared/LoggingUnitTesting.cs new file mode 100644 index 0000000..1f44068 --- /dev/null +++ b/Adaptation/_Tests/Shared/LoggingUnitTesting.cs @@ -0,0 +1,111 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.IO; + +namespace Shared; + +public class LoggingUnitTesting : UnitTesting, IDisposable +{ + + protected ILogger _Logger; + protected ILoggerFactory _LoggerFactory; + protected readonly LogLevel? _DefaultLogLevel; + protected readonly LogLevel? _Log4netProviderLogLevel; + protected readonly IConfigurationRoot _ConfigurationRoot; + public ILogger Logger => _Logger; + public LogLevel? DefaultLogLevel => _DefaultLogLevel; + public ILoggerFactory LoggerFactory => _LoggerFactory; + public IConfigurationRoot ConfigurationRoot => _ConfigurationRoot; + public LogLevel? Log4netProviderLogLevel => _Log4netProviderLogLevel; + + public LoggingUnitTesting(TestContext testContext, Type declaringType) : + base(testContext, declaringType) + { + _LoggerFactory = new LoggerFactory(); + if (testContext is null || declaringType is null) + { + _ConfigurationRoot = null; + _DefaultLogLevel = null; + _Log4netProviderLogLevel = null; + } + else + { + LogLevel logLevel; + IConfigurationSection configurationSection; + List logLevels = new(); + string defaultLogLevelSection = "Logging:LogLevel:Default"; + string log4netProviderLogLevelSection = "Logging:LogLevel:Log4netProvider"; + string[] sections = new string[] { defaultLogLevelSection, log4netProviderLogLevelSection }; + IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() + .AddEnvironmentVariables() + .AddJsonFile(_IsEnvironment.AppSettingsFileName, optional: false, reloadOnChange: true); + _ConfigurationRoot = configurationBuilder.Build(); + foreach (string section in sections) + { + configurationSection = _ConfigurationRoot.GetSection(section); + if (configurationSection is null) + logLevel = LogLevel.Debug; + else if (!Enum.TryParse(configurationSection.Value, out logLevel)) + logLevel = LogLevel.Debug; + logLevels.Add(logLevel); + } + _DefaultLogLevel = logLevels[0]; + _Log4netProviderLogLevel = logLevels[1]; + } + if (DefaultLogLevel.HasValue) + _LoggerFactory.AddProvider(new DebugProvider(DefaultLogLevel.Value)); + if (DefaultLogLevel.HasValue) + _LoggerFactory.AddProvider(new ConsoleProvider(DefaultLogLevel.Value)); + _Logger = _LoggerFactory.CreateLogger(); + } + + public static string GetEnvironmentSpecialDirectory() + { + string result = string.Empty; + string traceFile; + List directories = new(); + Environment.SpecialFolder[] specialFolders = new Environment.SpecialFolder[] + { + Environment.SpecialFolder.LocalApplicationData, + Environment.SpecialFolder.ApplicationData, + Environment.SpecialFolder.History, + Environment.SpecialFolder.CommonApplicationData, + Environment.SpecialFolder.InternetCache + }; + foreach (Environment.SpecialFolder specialFolder in specialFolders) + directories.Add(Environment.GetFolderPath(specialFolder)); + foreach (string directory in directories) + { + for (int i = 1; i < 3; i++) + { + if (i == 1) + result = directory; + else + result = string.Concat("D", directory.Substring(1)); + try + { + if (!Directory.Exists(result)) + _ = Directory.CreateDirectory(result); + traceFile = string.Concat(result, @"\", DateTime.Now.Ticks, ".txt"); + File.WriteAllText(traceFile, traceFile); + File.Delete(traceFile); + break; + } + catch (Exception) { result = string.Empty; } + } + if (!string.IsNullOrEmpty(result)) + break; + } + return result; + } + + public void Dispose() + { + _LoggerFactory.Dispose(); + GC.SuppressFinalize(this); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/CellInstance.cs b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/CellInstance.cs new file mode 100644 index 0000000..304f0b2 --- /dev/null +++ b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/CellInstance.cs @@ -0,0 +1,3056 @@ +namespace Shared.PasteSpecialXml.EAF.XML.API.CellInstance; + +// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities", IsNullable = false)] +public partial class CellInstanceVersion +{ + +#pragma warning disable IDE1006 // Naming Styles + + private string createdByField; + + private System.DateTime creationDateField; + + private object descriptionField; + + private ExtensionsVersionExtension[] extensionsField; + + private System.DateTime freezeDateField; + + private string frozenByField; + + private long idField; + + private bool isFrozenField; + + private bool isRetiredField; + + private System.DateTime retireDateField; + + private object retiredByField; + + private string cellCommunicatingRuleField; + + private string cellNotCommunicatingRuleField; + + private CellInstanceVersionCellSetting cellSettingField; + + private CellInstanceVersionComponentModel componentModelField; + + private SelectedDeploymentPackage[] deploymentPackagesField; + + private CellInstanceVersionEdaConnection edaConnectionField; + + private EquipmentConnectionSettings[] equipmentConnectionsField; + + private string nameField; + + private CellInstanceVersionParentInstance parentInstanceField; + + private CellInstanceVersionEdaTraceHandling edaTraceHandlingField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public string CreatedBy + { + get => this.createdByField; + set => this.createdByField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public System.DateTime CreationDate + { + get => this.creationDateField; + set => this.creationDateField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities", IsNullable = true)] + public object Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + [System.Xml.Serialization.XmlArrayItemAttribute("VersionExtension", IsNullable = false)] + public ExtensionsVersionExtension[] Extensions + { + get => this.extensionsField; + set => this.extensionsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public System.DateTime FreezeDate + { + get => this.freezeDateField; + set => this.freezeDateField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public string FrozenBy + { + get => this.frozenByField; + set => this.frozenByField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public bool IsFrozen + { + get => this.isFrozenField; + set => this.isFrozenField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public bool IsRetired + { + get => this.isRetiredField; + set => this.isRetiredField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public System.DateTime RetireDate + { + get => this.retireDateField; + set => this.retireDateField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities", IsNullable = true)] + public object RetiredBy + { + get => this.retiredByField; + set => this.retiredByField = value; + } + + /// + public string CellCommunicatingRule + { + get => this.cellCommunicatingRuleField; + set => this.cellCommunicatingRuleField = value; + } + + /// + public string CellNotCommunicatingRule + { + get => this.cellNotCommunicatingRuleField; + set => this.cellNotCommunicatingRuleField = value; + } + + /// + public CellInstanceVersionCellSetting CellSetting + { + get => this.cellSettingField; + set => this.cellSettingField = value; + } + + /// + public CellInstanceVersionComponentModel ComponentModel + { + get => this.componentModelField; + set => this.componentModelField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("SelectedDeploymentPackage", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Deployme" + + "nt", IsNullable = false)] + public SelectedDeploymentPackage[] DeploymentPackages + { + get => this.deploymentPackagesField; + set => this.deploymentPackagesField = value; + } + + /// + public CellInstanceVersionEdaConnection EdaConnection + { + get => this.edaConnectionField; + set => this.edaConnectionField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("EquipmentConnectionSettings", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances", IsNullable = false)] + public EquipmentConnectionSettings[] EquipmentConnections + { + get => this.equipmentConnectionsField; + set => this.equipmentConnectionsField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public CellInstanceVersionParentInstance ParentInstance + { + get => this.parentInstanceField; + set => this.parentInstanceField = value; + } + + /// + public CellInstanceVersionEdaTraceHandling EdaTraceHandling + { + get => this.edaTraceHandlingField; + set => this.edaTraceHandlingField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Deployme" + + "nt")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Deployme" + + "nt", IsNullable = false)] +public partial class SelectedDeploymentPackage +{ + + private long idField; + + private string packageNameField; + + private string packageVersionField; + + /// + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string PackageName + { + get => this.packageNameField; + set => this.packageNameField = value; + } + + /// + public string PackageVersion + { + get => this.packageVersionField; + set => this.packageVersionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances", IsNullable = false)] +public partial class EquipmentConnectionSettings +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] +public partial class ExtensionsVersionExtension +{ + + private long idField; + + private string classNameField; + + private object configurationField; + + private string nameField; + + private object editorsField; + + private string id1Field; + + private string i___typeField; + + /// + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Backbone" + + "s")] + public string ClassName + { + get => this.classNameField; + set => this.classNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Backbone" + + "s", IsNullable = true)] + public object Configuration + { + get => this.configurationField; + set => this.configurationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Backbone" + + "s")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tAutomationClient")] + public object Editors + { + get => this.editorsField; + set => this.editorsField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +public partial class CellInstanceVersionCellSetting +{ + + private long idField; + + private CellType cellTypeField; + + private string nameField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] + public CellType CellType + { + get => this.cellTypeField; + set => this.cellTypeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances", IsNullable = false)] +public partial class CellType +{ + + private long idField; + + private string nameField; + + private string versionField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Version + { + get => this.versionField; + set => this.versionField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +public partial class CellInstanceVersionComponentModel +{ + + private long idField; + + private ComponentsCellComponent[] componentsField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] + [System.Xml.Serialization.XmlArrayItemAttribute("CellComponent", IsNullable = false)] + public ComponentsCellComponent[] Components + { + get => this.componentsField; + set => this.componentsField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponent +{ + + private ComponentsCellComponentCellComponent[] childrenField; + + private ComponentsCellComponentEquipment equipmentField; + + private object equipmentObjectTypeField; + + private string nameField; + + private ComponentsCellComponentComponentParameter[] parametersField; + + private string typeField; + + private string idField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("CellComponent", IsNullable = false)] + public ComponentsCellComponentCellComponent[] Children + { + get => this.childrenField; + set => this.childrenField = value; + } + + /// + public ComponentsCellComponentEquipment Equipment + { + get => this.equipmentField; + set => this.equipmentField = value; + } + + /// + public object EquipmentObjectType + { + get => this.equipmentObjectTypeField; + set => this.equipmentObjectTypeField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ComponentParameter", IsNullable = false)] + public ComponentsCellComponentComponentParameter[] Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } + + /// + public string Type + { + get => this.typeField; + set => this.typeField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponentCellComponent +{ + + private object childrenField; + + private ComponentsCellComponentCellComponentEquipment equipmentField; + + private object equipmentObjectTypeField; + + private string nameField; + + private ComponentsCellComponentCellComponentComponentParameter[] parametersField; + + private string typeField; + + private string idField; + + /// + public object Children + { + get => this.childrenField; + set => this.childrenField = value; + } + + /// + public ComponentsCellComponentCellComponentEquipment Equipment + { + get => this.equipmentField; + set => this.equipmentField = value; + } + + /// + public object EquipmentObjectType + { + get => this.equipmentObjectTypeField; + set => this.equipmentObjectTypeField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ComponentParameter", IsNullable = false)] + public ComponentsCellComponentCellComponentComponentParameter[] Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } + + /// + public string Type + { + get => this.typeField; + set => this.typeField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponentCellComponentEquipment +{ + + private long idField; + + private ComponentsCellComponentChildrenCellComponentEquipmentEquipmentDictionaries equipmentDictionariesField; + + private ComponentsCellComponentCellComponentEquipmentEquipmentType equipmentTypeField; + + private string nameField; + + private string alternateTargetFolderField; + + private long connectionRetryIntervalField; + + private ConnectionSettings connectionSettingsField; + + private bool copySourceFolderStructureField; + + private string defaultPlaceHolderValueField; + + private bool deleteEmptySourceSubFoldersField; + + private string errorPostProcessingModeField; + + private string errorTargetFileLocationField; + + private string errorTargetFileNameField; + + private string fileAgeFilterModeField; + + private string fileAgeThresholdField; + + private long fileHandleTimeoutField; + + private long fileHandleWaitTimeField; + + private int fileScanningIntervalInSecondsField; + + private string fileScanningOptionField; + + private int idleEventWaitTimeInSecondsField; + + private string ifFileExistActionField; + + private string ifPostProcessingFailsActionField; + + private bool includeSubDirectoriesField; + + private string postProcessingModeField; + + private long postProcessingRetriesField; + + private string preProcessingModeField; + + private string skipSearchDirectoryNamesField; + + private string sourceFileFilterField; + + private string sourceFileLocationField; + + private string targetFileLocationField; + + private string targetFileNameField; + + private bool triggerOnChangedField; + + private bool triggerOnCreatedField; + + private bool useZip64ModeField; + + private string zipErrorTargetFileNameField; + + private long zipFileAmountField; + + private long zipFileSubFolderLevelField; + + private long zipFileTimeField; + + private string zipModeField; + + private string zipTargetFileNameField; + + private string baudRateField; + + private string connectionModeField; + + private byte deviceIdField; + + private bool deviceIdFieldSpecified; + + private string hostField; + + private string linkTestTimerField; + + private ushort portField; + + private bool portFieldSpecified; + + private string portTypeField; + + private string sessionModeField; + + private string t1InterCharacterField; + + private string t2ProtocolField; + + private string t3MessageReplyField; + + private string t4InterBlockField; + + private string t5ConnectionSeperationField; + + private string t6HsmsControlMessageField; + + private string t7ConnectionIdleField; + + private string t8NetworkIntercharacterField; + + private string id1Field; + + private string i___typeField; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + + /// + public ComponentsCellComponentChildrenCellComponentEquipmentEquipmentDictionaries EquipmentDictionaries + { + get => this.equipmentDictionariesField; + set => this.equipmentDictionariesField = value; + } + + /// + public ComponentsCellComponentCellComponentEquipmentEquipmentType EquipmentType + { + get => this.equipmentTypeField; + set => this.equipmentTypeField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string AlternateTargetFolder + { + get => this.alternateTargetFolderField; + set => this.alternateTargetFolderField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ConnectionRetryInterval + { + get => this.connectionRetryIntervalField; + set => this.connectionRetryIntervalField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public ConnectionSettings ConnectionSettings + { + get => this.connectionSettingsField; + set => this.connectionSettingsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool CopySourceFolderStructure + { + get => this.copySourceFolderStructureField; + set => this.copySourceFolderStructureField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string DefaultPlaceHolderValue + { + get => this.defaultPlaceHolderValueField; + set => this.defaultPlaceHolderValueField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool DeleteEmptySourceSubFolders + { + get => this.deleteEmptySourceSubFoldersField; + set => this.deleteEmptySourceSubFoldersField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorPostProcessingMode + { + get => this.errorPostProcessingModeField; + set => this.errorPostProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorTargetFileLocation + { + get => this.errorTargetFileLocationField; + set => this.errorTargetFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorTargetFileName + { + get => this.errorTargetFileNameField; + set => this.errorTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileAgeFilterMode + { + get => this.fileAgeFilterModeField; + set => this.fileAgeFilterModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileAgeThreshold + { + get => this.fileAgeThresholdField; + set => this.fileAgeThresholdField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long FileHandleTimeout + { + get => this.fileHandleTimeoutField; + set => this.fileHandleTimeoutField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long FileHandleWaitTime + { + get => this.fileHandleWaitTimeField; + set => this.fileHandleWaitTimeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public int FileScanningIntervalInSeconds + { + get => this.fileScanningIntervalInSecondsField; + set => this.fileScanningIntervalInSecondsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileScanningOption + { + get => this.fileScanningOptionField; + set => this.fileScanningOptionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public int IdleEventWaitTimeInSeconds + { + get => this.idleEventWaitTimeInSecondsField; + set => this.idleEventWaitTimeInSecondsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string IfFileExistAction + { + get => this.ifFileExistActionField; + set => this.ifFileExistActionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string IfPostProcessingFailsAction + { + get => this.ifPostProcessingFailsActionField; + set => this.ifPostProcessingFailsActionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool IncludeSubDirectories + { + get => this.includeSubDirectoriesField; + set => this.includeSubDirectoriesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string PostProcessingMode + { + get => this.postProcessingModeField; + set => this.postProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long PostProcessingRetries + { + get => this.postProcessingRetriesField; + set => this.postProcessingRetriesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string PreProcessingMode + { + get => this.preProcessingModeField; + set => this.preProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SkipSearchDirectoryNames + { + get => this.skipSearchDirectoryNamesField; + set => this.skipSearchDirectoryNamesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SourceFileFilter + { + get => this.sourceFileFilterField; + set => this.sourceFileFilterField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SourceFileLocation + { + get => this.sourceFileLocationField; + set => this.sourceFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string TargetFileLocation + { + get => this.targetFileLocationField; + set => this.targetFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string TargetFileName + { + get => this.targetFileNameField; + set => this.targetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool TriggerOnChanged + { + get => this.triggerOnChangedField; + set => this.triggerOnChangedField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool TriggerOnCreated + { + get => this.triggerOnCreatedField; + set => this.triggerOnCreatedField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool UseZip64Mode + { + get => this.useZip64ModeField; + set => this.useZip64ModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipErrorTargetFileName + { + get => this.zipErrorTargetFileNameField; + set => this.zipErrorTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileAmount + { + get => this.zipFileAmountField; + set => this.zipFileAmountField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileSubFolderLevel + { + get => this.zipFileSubFolderLevelField; + set => this.zipFileSubFolderLevelField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileTime + { + get => this.zipFileTimeField; + set => this.zipFileTimeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipMode + { + get => this.zipModeField; + set => this.zipModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipTargetFileName + { + get => this.zipTargetFileNameField; + set => this.zipTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances")] + public string BaudRate + { + get => this.baudRateField; + set => this.baudRateField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances")] + public string ConnectionMode + { + get => this.connectionModeField; + set => this.connectionModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances")] + public byte DeviceId + { + get => this.deviceIdField; + set => this.deviceIdField = value; + } + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool DeviceIdSpecified + { + get => this.deviceIdFieldSpecified; + set => this.deviceIdFieldSpecified = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances")] + public string Host + { + get => this.hostField; + set => this.hostField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string LinkTestTimer + { + get => this.linkTestTimerField; + set => this.linkTestTimerField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances")] + public ushort Port + { + get => this.portField; + set => this.portField = value; + } + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool PortSpecified + { + get => this.portFieldSpecified; + set => this.portFieldSpecified = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances")] + public string PortType + { + get => this.portTypeField; + set => this.portTypeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances")] + public string SessionMode + { + get => this.sessionModeField; + set => this.sessionModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string T1InterCharacter + { + get => this.t1InterCharacterField; + set => this.t1InterCharacterField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string T2Protocol + { + get => this.t2ProtocolField; + set => this.t2ProtocolField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string T3MessageReply + { + get => this.t3MessageReplyField; + set => this.t3MessageReplyField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string T4InterBlock + { + get => this.t4InterBlockField; + set => this.t4InterBlockField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string T5ConnectionSeperation + { + get => this.t5ConnectionSeperationField; + set => this.t5ConnectionSeperationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string T6HsmsControlMessage + { + get => this.t6HsmsControlMessageField; + set => this.t6HsmsControlMessageField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string T7ConnectionIdle + { + get => this.t7ConnectionIdleField; + set => this.t7ConnectionIdleField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Semicond" + + "uctor.CellInstances", DataType = "duration")] + public string T8NetworkIntercharacter + { + get => this.t8NetworkIntercharacterField; + set => this.t8NetworkIntercharacterField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponentChildrenCellComponentEquipmentEquipmentDictionaries +{ + + private CellEquipmentDictionaryReference cellEquipmentDictionaryReferenceField; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public CellEquipmentDictionaryReference CellEquipmentDictionaryReference + { + get => this.cellEquipmentDictionaryReferenceField; + set => this.cellEquipmentDictionaryReferenceField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities", IsNullable = false)] +public partial class CellEquipmentDictionaryReference +{ + + private string dictionaryNameField; + + private string dictionaryVersionField; + + private byte idField; + + private string id1Field; + + /// + public string DictionaryName + { + get => this.dictionaryNameField; + set => this.dictionaryNameField = value; + } + + /// + public string DictionaryVersion + { + get => this.dictionaryVersionField; + set => this.dictionaryVersionField = value; + } + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponentCellComponentEquipmentEquipmentType +{ + + private long idField; + + private string nameField; + + private string versionField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Version + { + get => this.versionField; + set => this.versionField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponentCellComponentComponentParameter +{ + + private object enumTypeField; + + private long idField; + + private string nameField; + + private string valueField; + + private string valueTypeField; + + private bool isOverrideField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation", IsNullable = true)] + public object EnumType + { + get => this.enumTypeField; + set => this.enumTypeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public string Value + { + get => this.valueField; + set => this.valueField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public string ValueType + { + get => this.valueTypeField; + set => this.valueTypeField = value; + } + + /// + public bool IsOverride + { + get => this.isOverrideField; + set => this.isOverrideField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponentEquipment +{ + + private long idField; + + private object equipmentDictionariesField; + + private ComponentsCellComponentEquipmentEquipmentType equipmentTypeField; + + private string nameField; + + private string alternateTargetFolderField; + + private long connectionRetryIntervalField; + + private ConnectionSettings connectionSettingsField; + + private bool copySourceFolderStructureField; + + private string defaultPlaceHolderValueField; + + private bool deleteEmptySourceSubFoldersField; + + private string errorPostProcessingModeField; + + private string errorTargetFileLocationField; + + private string errorTargetFileNameField; + + private string fileAgeFilterModeField; + + private string fileAgeThresholdField; + + private long fileHandleTimeoutField; + + private long fileHandleWaitTimeField; + + private int fileScanningIntervalInSecondsField; + + private string fileScanningOptionField; + + private int idleEventWaitTimeInSecondsField; + + private string ifFileExistActionField; + + private string ifPostProcessingFailsActionField; + + private bool includeSubDirectoriesField; + + private string postProcessingModeField; + + private long postProcessingRetriesField; + + private string preProcessingModeField; + + private string skipSearchDirectoryNamesField; + + private string sourceFileFilterField; + + private string sourceFileLocationField; + + private string targetFileLocationField; + + private string targetFileNameField; + + private bool triggerOnChangedField; + + private bool triggerOnCreatedField; + + private bool useZip64ModeField; + + private string zipErrorTargetFileNameField; + + private long zipFileAmountField; + + private long zipFileSubFolderLevelField; + + private long zipFileTimeField; + + private string zipModeField; + + private string zipTargetFileNameField; + + private string refField; + + private string id1Field; + + private string i___typeField; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public object EquipmentDictionaries + { + get => this.equipmentDictionariesField; + set => this.equipmentDictionariesField = value; + } + + /// + public ComponentsCellComponentEquipmentEquipmentType EquipmentType + { + get => this.equipmentTypeField; + set => this.equipmentTypeField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string AlternateTargetFolder + { + get => this.alternateTargetFolderField; + set => this.alternateTargetFolderField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ConnectionRetryInterval + { + get => this.connectionRetryIntervalField; + set => this.connectionRetryIntervalField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public ConnectionSettings ConnectionSettings + { + get => this.connectionSettingsField; + set => this.connectionSettingsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool CopySourceFolderStructure + { + get => this.copySourceFolderStructureField; + set => this.copySourceFolderStructureField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string DefaultPlaceHolderValue + { + get => this.defaultPlaceHolderValueField; + set => this.defaultPlaceHolderValueField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool DeleteEmptySourceSubFolders + { + get => this.deleteEmptySourceSubFoldersField; + set => this.deleteEmptySourceSubFoldersField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorPostProcessingMode + { + get => this.errorPostProcessingModeField; + set => this.errorPostProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorTargetFileLocation + { + get => this.errorTargetFileLocationField; + set => this.errorTargetFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorTargetFileName + { + get => this.errorTargetFileNameField; + set => this.errorTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileAgeFilterMode + { + get => this.fileAgeFilterModeField; + set => this.fileAgeFilterModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileAgeThreshold + { + get => this.fileAgeThresholdField; + set => this.fileAgeThresholdField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long FileHandleTimeout + { + get => this.fileHandleTimeoutField; + set => this.fileHandleTimeoutField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long FileHandleWaitTime + { + get => this.fileHandleWaitTimeField; + set => this.fileHandleWaitTimeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public int FileScanningIntervalInSeconds + { + get => this.fileScanningIntervalInSecondsField; + set => this.fileScanningIntervalInSecondsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileScanningOption + { + get => this.fileScanningOptionField; + set => this.fileScanningOptionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public int IdleEventWaitTimeInSeconds + { + get => this.idleEventWaitTimeInSecondsField; + set => this.idleEventWaitTimeInSecondsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string IfFileExistAction + { + get => this.ifFileExistActionField; + set => this.ifFileExistActionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string IfPostProcessingFailsAction + { + get => this.ifPostProcessingFailsActionField; + set => this.ifPostProcessingFailsActionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool IncludeSubDirectories + { + get => this.includeSubDirectoriesField; + set => this.includeSubDirectoriesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string PostProcessingMode + { + get => this.postProcessingModeField; + set => this.postProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long PostProcessingRetries + { + get => this.postProcessingRetriesField; + set => this.postProcessingRetriesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string PreProcessingMode + { + get => this.preProcessingModeField; + set => this.preProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SkipSearchDirectoryNames + { + get => this.skipSearchDirectoryNamesField; + set => this.skipSearchDirectoryNamesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SourceFileFilter + { + get => this.sourceFileFilterField; + set => this.sourceFileFilterField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SourceFileLocation + { + get => this.sourceFileLocationField; + set => this.sourceFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string TargetFileLocation + { + get => this.targetFileLocationField; + set => this.targetFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string TargetFileName + { + get => this.targetFileNameField; + set => this.targetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool TriggerOnChanged + { + get => this.triggerOnChangedField; + set => this.triggerOnChangedField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool TriggerOnCreated + { + get => this.triggerOnCreatedField; + set => this.triggerOnCreatedField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool UseZip64Mode + { + get => this.useZip64ModeField; + set => this.useZip64ModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipErrorTargetFileName + { + get => this.zipErrorTargetFileNameField; + set => this.zipErrorTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileAmount + { + get => this.zipFileAmountField; + set => this.zipFileAmountField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileSubFolderLevel + { + get => this.zipFileSubFolderLevelField; + set => this.zipFileSubFolderLevelField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileTime + { + get => this.zipFileTimeField; + set => this.zipFileTimeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipMode + { + get => this.zipModeField; + set => this.zipModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipTargetFileName + { + get => this.zipTargetFileNameField; + set => this.zipTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponentEquipmentEquipmentType +{ + + private long idField; + + private string nameField; + + private string versionField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Version + { + get => this.versionField; + set => this.versionField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +public partial class ComponentsCellComponentComponentParameter +{ + + private object enumTypeField; + + private long idField; + + private string nameField; + + private string valueField; + + private string valueTypeField; + + private bool isOverrideField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation", IsNullable = true)] + public object EnumType + { + get => this.enumTypeField; + set => this.enumTypeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public string Value + { + get => this.valueField; + set => this.valueField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public string ValueType + { + get => this.valueTypeField; + set => this.valueTypeField = value; + } + + /// + public bool IsOverride + { + get => this.isOverrideField; + set => this.isOverrideField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +public partial class CellInstanceVersionEdaConnection +{ + + private long idField; + + private int checkIntervalField; + + private int connectionTimeoutField; + + private object edaClientProxyFactoryProviderNameField; + + private long maxLostPingsField; + + private string portNameField; + + private int portNumberField; + + private string sSLEnabledField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public int CheckInterval + { + get => this.checkIntervalField; + set => this.checkIntervalField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public int ConnectionTimeout + { + get => this.connectionTimeoutField; + set => this.connectionTimeoutField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA", IsNullable = true)] + public object EdaClientProxyFactoryProviderName + { + get => this.edaClientProxyFactoryProviderNameField; + set => this.edaClientProxyFactoryProviderNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public long MaxLostPings + { + get => this.maxLostPingsField; + set => this.maxLostPingsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public string PortName + { + get => this.portNameField; + set => this.portNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public int PortNumber + { + get => this.portNumberField; + set => this.portNumberField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public string SSLEnabled + { + get => this.sSLEnabledField; + set => this.sSLEnabledField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +public partial class CellInstanceVersionParentInstance +{ + + private string currentActiveVersionField; + + private object currentHostField; + + private long idField; + + private object infoField; + + private bool isStartedField; + + private string nameField; + + private object startTimeField; + + private bool startableField; + + private object stopTimeField; + + private string targetActiveVersionField; + + private object targetHostField; + + private string id1Field; + + /// + public string CurrentActiveVersion + { + get => this.currentActiveVersionField; + set => this.currentActiveVersionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object CurrentHost + { + get => this.currentHostField; + set => this.currentHostField = value; + } + + /// + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object Info + { + get => this.infoField; + set => this.infoField = value; + } + + /// + public bool IsStarted + { + get => this.isStartedField; + set => this.isStartedField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object StartTime + { + get => this.startTimeField; + set => this.startTimeField = value; + } + + /// + public bool Startable + { + get => this.startableField; + set => this.startableField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object StopTime + { + get => this.stopTimeField; + set => this.stopTimeField = value; + } + + /// + public string TargetActiveVersion + { + get => this.targetActiveVersionField; + set => this.targetActiveVersionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object TargetHost + { + get => this.targetHostField; + set => this.targetHostField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +public partial class CellInstanceVersionEdaTraceHandling +{ + + private long maxParameterCollectionTimeDeltaField; + + private object mergeStrategyClassField; + + private object mergeStrategyParametersField; + + private long traceCleanupDaemonIntervalField; + + private TraceSourcePrimaryPrioritiesConnection[] traceSourcePrimaryPrioritiesField; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public long MaxParameterCollectionTimeDelta + { + get => this.maxParameterCollectionTimeDeltaField; + set => this.maxParameterCollectionTimeDeltaField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA", IsNullable = true)] + public object MergeStrategyClass + { + get => this.mergeStrategyClassField; + set => this.mergeStrategyClassField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public object MergeStrategyParameters + { + get => this.mergeStrategyParametersField; + set => this.mergeStrategyParametersField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public long TraceCleanupDaemonInterval + { + get => this.traceCleanupDaemonIntervalField; + set => this.traceCleanupDaemonIntervalField = value; + } + + /// + [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + [System.Xml.Serialization.XmlArrayItemAttribute("Connection", IsNullable = false)] + public TraceSourcePrimaryPrioritiesConnection[] TraceSourcePrimaryPriorities + { + get => this.traceSourcePrimaryPrioritiesField; + set => this.traceSourcePrimaryPrioritiesField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] +public partial class TraceSourcePrimaryPrioritiesConnection +{ + + private long idField; + + private object equipmentDictionariesField; + + private EquipmentType equipmentTypeField; + + private string nameField; + + private string alternateTargetFolderField; + + private long connectionRetryIntervalField; + + private ConnectionSettings connectionSettingsField; + + private bool copySourceFolderStructureField; + + private string defaultPlaceHolderValueField; + + private bool deleteEmptySourceSubFoldersField; + + private string errorPostProcessingModeField; + + private string errorTargetFileLocationField; + + private string errorTargetFileNameField; + + private string fileAgeFilterModeField; + + private string fileAgeThresholdField; + + private long fileHandleTimeoutField; + + private long fileHandleWaitTimeField; + + private int fileScanningIntervalInSecondsField; + + private string fileScanningOptionField; + + private int idleEventWaitTimeInSecondsField; + + private string ifFileExistActionField; + + private string ifPostProcessingFailsActionField; + + private bool includeSubDirectoriesField; + + private string postProcessingModeField; + + private long postProcessingRetriesField; + + private string preProcessingModeField; + + private string skipSearchDirectoryNamesField; + + private string sourceFileFilterField; + + private string sourceFileLocationField; + + private string targetFileLocationField; + + private string targetFileNameField; + + private bool triggerOnChangedField; + + private bool triggerOnCreatedField; + + private bool useZip64ModeField; + + private string zipErrorTargetFileNameField; + + private long zipFileAmountField; + + private long zipFileSubFolderLevelField; + + private long zipFileTimeField; + + private string zipModeField; + + private string zipTargetFileNameField; + + private string id1Field; + + private string i___typeField; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] + public object EquipmentDictionaries + { + get => this.equipmentDictionariesField; + set => this.equipmentDictionariesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] + public EquipmentType EquipmentType + { + get => this.equipmentTypeField; + set => this.equipmentTypeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string AlternateTargetFolder + { + get => this.alternateTargetFolderField; + set => this.alternateTargetFolderField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ConnectionRetryInterval + { + get => this.connectionRetryIntervalField; + set => this.connectionRetryIntervalField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public ConnectionSettings ConnectionSettings + { + get => this.connectionSettingsField; + set => this.connectionSettingsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool CopySourceFolderStructure + { + get => this.copySourceFolderStructureField; + set => this.copySourceFolderStructureField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string DefaultPlaceHolderValue + { + get => this.defaultPlaceHolderValueField; + set => this.defaultPlaceHolderValueField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool DeleteEmptySourceSubFolders + { + get => this.deleteEmptySourceSubFoldersField; + set => this.deleteEmptySourceSubFoldersField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorPostProcessingMode + { + get => this.errorPostProcessingModeField; + set => this.errorPostProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorTargetFileLocation + { + get => this.errorTargetFileLocationField; + set => this.errorTargetFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ErrorTargetFileName + { + get => this.errorTargetFileNameField; + set => this.errorTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileAgeFilterMode + { + get => this.fileAgeFilterModeField; + set => this.fileAgeFilterModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileAgeThreshold + { + get => this.fileAgeThresholdField; + set => this.fileAgeThresholdField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long FileHandleTimeout + { + get => this.fileHandleTimeoutField; + set => this.fileHandleTimeoutField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long FileHandleWaitTime + { + get => this.fileHandleWaitTimeField; + set => this.fileHandleWaitTimeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public int FileScanningIntervalInSeconds + { + get => this.fileScanningIntervalInSecondsField; + set => this.fileScanningIntervalInSecondsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string FileScanningOption + { + get => this.fileScanningOptionField; + set => this.fileScanningOptionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public int IdleEventWaitTimeInSeconds + { + get => this.idleEventWaitTimeInSecondsField; + set => this.idleEventWaitTimeInSecondsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string IfFileExistAction + { + get => this.ifFileExistActionField; + set => this.ifFileExistActionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string IfPostProcessingFailsAction + { + get => this.ifPostProcessingFailsActionField; + set => this.ifPostProcessingFailsActionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool IncludeSubDirectories + { + get => this.includeSubDirectoriesField; + set => this.includeSubDirectoriesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string PostProcessingMode + { + get => this.postProcessingModeField; + set => this.postProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long PostProcessingRetries + { + get => this.postProcessingRetriesField; + set => this.postProcessingRetriesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string PreProcessingMode + { + get => this.preProcessingModeField; + set => this.preProcessingModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SkipSearchDirectoryNames + { + get => this.skipSearchDirectoryNamesField; + set => this.skipSearchDirectoryNamesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SourceFileFilter + { + get => this.sourceFileFilterField; + set => this.sourceFileFilterField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string SourceFileLocation + { + get => this.sourceFileLocationField; + set => this.sourceFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string TargetFileLocation + { + get => this.targetFileLocationField; + set => this.targetFileLocationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string TargetFileName + { + get => this.targetFileNameField; + set => this.targetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool TriggerOnChanged + { + get => this.triggerOnChangedField; + set => this.triggerOnChangedField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool TriggerOnCreated + { + get => this.triggerOnCreatedField; + set => this.triggerOnCreatedField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public bool UseZip64Mode + { + get => this.useZip64ModeField; + set => this.useZip64ModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipErrorTargetFileName + { + get => this.zipErrorTargetFileNameField; + set => this.zipErrorTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileAmount + { + get => this.zipFileAmountField; + set => this.zipFileAmountField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileSubFolderLevel + { + get => this.zipFileSubFolderLevelField; + set => this.zipFileSubFolderLevelField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public long ZipFileTime + { + get => this.zipFileTimeField; + set => this.zipFileTimeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipMode + { + get => this.zipModeField; + set => this.zipModeField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] + public string ZipTargetFileName + { + get => this.zipTargetFileNameField; + set => this.zipTargetFileNameField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances", IsNullable = false)] +public partial class EquipmentType +{ + + private long idField; + + private string nameField; + + private string versionField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Version + { + get => this.versionField; + set => this.versionField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities", IsNullable = false)] +public partial class Extensions +{ + + private ExtensionsVersionExtension[] versionExtensionField; + + /// + [System.Xml.Serialization.XmlElementAttribute("VersionExtension")] + public ExtensionsVersionExtension[] VersionExtension + { + get => this.versionExtensionField; + set => this.versionExtensionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances", IsNullable = false)] +public partial class Components +{ + + private ComponentsCellComponent[] cellComponentField; + + /// + [System.Xml.Serialization.XmlElementAttribute("CellComponent")] + public ComponentsCellComponent[] CellComponent + { + get => this.cellComponentField; + set => this.cellComponentField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA", IsNullable = false)] +public partial class TraceSourcePrimaryPriorities +{ + + private TraceSourcePrimaryPrioritiesConnection[] connectionField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Connection")] + public TraceSourcePrimaryPrioritiesConnection[] Connection + { + get => this.connectionField; + set => this.connectionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances", IsNullable = false)] +public partial class ConnectionSettings +{ + + private Setting[] settingField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Setting", Namespace = "http://schemas.datacontract.org/2004/07/Ifx.ManagementInterfaceIfx.Common.Connect" + + "ionSettings")] + public Setting[] Setting + { + get => this.settingField; + set => this.settingField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Ifx.ManagementInterfaceIfx.Common.Connect" + + "ionSettings")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Ifx.ManagementInterfaceIfx.Common.Connect" + + "ionSettings", IsNullable = false)] +public partial class Setting +{ + + private string nameField; + + private string valueField; + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string Value + { + get => this.valueField; + set => this.valueField = value; + } +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/ConfigurationData.cs b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/ConfigurationData.cs new file mode 100644 index 0000000..40e7492 --- /dev/null +++ b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/ConfigurationData.cs @@ -0,0 +1,23 @@ +using System.Xml.Serialization; + +namespace Shared.PasteSpecialXml.EAF.XML.API.ConfigurationData; + +[XmlRoot(ElementName = "ChildBackboneMembers", Namespace = "http://schemas.datacontract.org/2004/07/EafManagement.Configuration.Services")] +public class ChildBackboneMembers +{ + [XmlAttribute(AttributeName = "nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] + public string Nil { get; set; } +} + +[XmlRoot(ElementName = "ConfigurationData", Namespace = "http://schemas.datacontract.org/2004/07/EafManagement.Configuration.Services")] +public class ConfigurationData +{ + [XmlElement(ElementName = "ChildBackboneMembers", Namespace = "http://schemas.datacontract.org/2004/07/EafManagement.Configuration.Services")] + public ChildBackboneMembers ChildBackboneMembers { get; set; } + [XmlElement(ElementName = "Data", Namespace = "http://schemas.datacontract.org/2004/07/EafManagement.Configuration.Services")] + public string Data { get; set; } + [XmlAttribute(AttributeName = "xmlns")] + public string Xmlns { get; set; } + [XmlAttribute(AttributeName = "i", Namespace = "http://www.w3.org/2000/xmlns/")] + public string I { get; set; } +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentDictionary.cs b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentDictionary.cs new file mode 100644 index 0000000..e54c13c --- /dev/null +++ b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentDictionary.cs @@ -0,0 +1,1300 @@ +namespace Shared.PasteSpecialXml.EAF.XML.API.EquipmentDictionary; + +// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization", IsNullable = false)] +public partial class EquipmentDictionaryVersion +{ + +#pragma warning disable IDE1006 // Naming Styles + + private EquipmentDictionaryVersionAlarms alarmsField; + + private string createdByField; + + private System.DateTime creationDateField; + + private EquipmentDictionaryVersionDataItems dataItemsField; + + private string descriptionField; + + private string dictionaryNameField; + + private EquipmentDictionaryVersionEquipmentSettings equipmentSettingsField; + + private EquipmentDictionaryVersionEvents eventsField; + + private System.DateTime freezeDateField; + + private object frozenByField; + + private bool isFrozenField; + + private bool isRetiredField; + + private string nameField; + + private EquipmentDictionaryVersionObjectTypes objectTypesField; + + private EquipmentDictionaryVersionReports reportsField; + + private System.DateTime retireDateField; + + private object retiredByField; + + private string schemaVersionField; + + private EquipmentDictionaryVersionValidityMapDataItemToEvent validityMapDataItemToEventField; + + private string idField; + + /// + public EquipmentDictionaryVersionAlarms Alarms + { + get => this.alarmsField; + set => this.alarmsField = value; + } + + /// + public string CreatedBy + { + get => this.createdByField; + set => this.createdByField = value; + } + + /// + public System.DateTime CreationDate + { + get => this.creationDateField; + set => this.creationDateField = value; + } + + /// + public EquipmentDictionaryVersionDataItems DataItems + { + get => this.dataItemsField; + set => this.dataItemsField = value; + } + + /// + public string Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public string DictionaryName + { + get => this.dictionaryNameField; + set => this.dictionaryNameField = value; + } + + /// + public EquipmentDictionaryVersionEquipmentSettings EquipmentSettings + { + get => this.equipmentSettingsField; + set => this.equipmentSettingsField = value; + } + + /// + public EquipmentDictionaryVersionEvents Events + { + get => this.eventsField; + set => this.eventsField = value; + } + + /// + public System.DateTime FreezeDate + { + get => this.freezeDateField; + set => this.freezeDateField = value; + } + + /// + public object FrozenBy + { + get => this.frozenByField; + set => this.frozenByField = value; + } + + /// + public bool IsFrozen + { + get => this.isFrozenField; + set => this.isFrozenField = value; + } + + /// + public bool IsRetired + { + get => this.isRetiredField; + set => this.isRetiredField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public EquipmentDictionaryVersionObjectTypes ObjectTypes + { + get => this.objectTypesField; + set => this.objectTypesField = value; + } + + /// + public EquipmentDictionaryVersionReports Reports + { + get => this.reportsField; + set => this.reportsField = value; + } + + /// + public System.DateTime RetireDate + { + get => this.retireDateField; + set => this.retireDateField = value; + } + + /// + public object RetiredBy + { + get => this.retiredByField; + set => this.retiredByField = value; + } + + /// + public string SchemaVersion + { + get => this.schemaVersionField; + set => this.schemaVersionField = value; + } + + /// + public EquipmentDictionaryVersionValidityMapDataItemToEvent ValidityMapDataItemToEvent + { + get => this.validityMapDataItemToEventField; + set => this.validityMapDataItemToEventField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionAlarms +{ + + private EquipmentDictionaryVersionAlarmsAlarm[] alarmField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Alarm")] + public EquipmentDictionaryVersionAlarmsAlarm[] Alarm + { + get => this.alarmField; + set => this.alarmField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionAlarmsAlarm +{ + + private object contextField; + + private string descriptionField; + + private bool isEnabledField; + + private bool isVirtualField; + + private bool isVirtualFieldSpecified; + + private string nameField; + + private object severityField; + + private int sourceIDField; + + private object textField; + + private string idField; + + /// + public object Context + { + get => this.contextField; + set => this.contextField = value; + } + + /// + public string Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public bool IsEnabled + { + get => this.isEnabledField; + set => this.isEnabledField = value; + } + + /// + public bool IsVirtual + { + get => this.isVirtualField; + set => this.isVirtualField = value; + } + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool IsVirtualSpecified + { + get => this.isVirtualFieldSpecified; + set => this.isVirtualFieldSpecified = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public object Severity + { + get => this.severityField; + set => this.severityField = value; + } + + /// + public int SourceID + { + get => this.sourceIDField; + set => this.sourceIDField = value; + } + + /// + public object Text + { + get => this.textField; + set => this.textField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionDataItems +{ + + private EquipmentDictionaryVersionDataItemsItem[] itemField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Item")] + public EquipmentDictionaryVersionDataItemsItem[] Item + { + get => this.itemField; + set => this.itemField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionDataItemsItem +{ + + private string dataTypeField; + + private string descriptionField; + + private bool isQueryableField; + + private string nameField; + + private uint sourceIDField; + + private object unitField; + + private string validityContextField; + + private string idField; + + /// + public string DataType + { + get => this.dataTypeField; + set => this.dataTypeField = value; + } + + /// + public string Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public bool IsQueryable + { + get => this.isQueryableField; + set => this.isQueryableField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public uint SourceID + { + get => this.sourceIDField; + set => this.sourceIDField = value; + } + + /// + public object Unit + { + get => this.unitField; + set => this.unitField = value; + } + + /// + public string ValidityContext + { + get => this.validityContextField; + set => this.validityContextField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionEquipmentSettings +{ + + private EquipmentDictionaryVersionEquipmentSettingsSetting[] settingField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Setting")] + public EquipmentDictionaryVersionEquipmentSettingsSetting[] Setting + { + get => this.settingField; + set => this.settingField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionEquipmentSettingsSetting +{ + + private object contextField; + + private string dataTypeField; + + private string descriptionField; + + private string initialValueField; + + private bool initializeField; + + private string nameField; + + private uint sourceIDField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object Context + { + get => this.contextField; + set => this.contextField = value; + } + + /// + public string DataType + { + get => this.dataTypeField; + set => this.dataTypeField = value; + } + + /// + public string Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public string InitialValue + { + get => this.initialValueField; + set => this.initialValueField = value; + } + + /// + public bool Initialize + { + get => this.initializeField; + set => this.initializeField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public uint SourceID + { + get => this.sourceIDField; + set => this.sourceIDField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionEvents +{ + + private EquipmentDictionaryVersionEventsEvent[] eventField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Event")] + public EquipmentDictionaryVersionEventsEvent[] Event + { + get => this.eventField; + set => this.eventField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionEventsEvent +{ + + private object contextField; + + private string descriptionField; + + private bool isAlwaysEnabledField; + + private bool isVirtualField; + + private string nameField; + + private string sourceIDField; + + private EquipmentDictionaryVersionEventsEventValidDataItems validDataItemsField; + + private string idField; + + /// + public object Context + { + get => this.contextField; + set => this.contextField = value; + } + + /// + public string Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public bool IsAlwaysEnabled + { + get => this.isAlwaysEnabledField; + set => this.isAlwaysEnabledField = value; + } + + /// + public bool IsVirtual + { + get => this.isVirtualField; + set => this.isVirtualField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string SourceID + { + get => this.sourceIDField; + set => this.sourceIDField = value; + } + + /// + public EquipmentDictionaryVersionEventsEventValidDataItems ValidDataItems + { + get => this.validDataItemsField; + set => this.validDataItemsField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionEventsEventValidDataItems +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypes +{ + + private EquipmentDictionaryVersionObjectTypesType[] typeField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Type")] + public EquipmentDictionaryVersionObjectTypesType[] Type + { + get => this.typeField; + set => this.typeField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesType +{ + + private EquipmentDictionaryVersionObjectTypesTypeAlarms alarmsField; + + private object baseTypeField; + + private EquipmentDictionaryVersionObjectTypesTypeDataItems dataItemsField; + + private EquipmentDictionaryVersionObjectTypesTypeEvents eventsField; + + private string nameField; + + private EquipmentDictionaryVersionObjectTypesTypeSettings settingsField; + + private string idField; + + /// + public EquipmentDictionaryVersionObjectTypesTypeAlarms Alarms + { + get => this.alarmsField; + set => this.alarmsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object BaseType + { + get => this.baseTypeField; + set => this.baseTypeField = value; + } + + /// + public EquipmentDictionaryVersionObjectTypesTypeDataItems DataItems + { + get => this.dataItemsField; + set => this.dataItemsField = value; + } + + /// + public EquipmentDictionaryVersionObjectTypesTypeEvents Events + { + get => this.eventsField; + set => this.eventsField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public EquipmentDictionaryVersionObjectTypesTypeSettings Settings + { + get => this.settingsField; + set => this.settingsField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeAlarms +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeDataItems +{ + + private EquipmentDictionaryVersionObjectTypesTypeDataItemsItem[] itemField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Item")] + public EquipmentDictionaryVersionObjectTypesTypeDataItemsItem[] Item + { + get => this.itemField; + set => this.itemField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeDataItemsItem +{ + + private EquipmentDictionaryVersionObjectTypesTypeDataItemsItemEquipmentDataItems equipmentDataItemsField; + + private string nameField; + + private object unitField; + + private string idField; + + /// + public EquipmentDictionaryVersionObjectTypesTypeDataItemsItemEquipmentDataItems EquipmentDataItems + { + get => this.equipmentDataItemsField; + set => this.equipmentDataItemsField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public object Unit + { + get => this.unitField; + set => this.unitField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeDataItemsItemEquipmentDataItems +{ + + private EquipmentDictionaryVersionObjectTypesTypeDataItemsItemEquipmentDataItemsItem[] itemField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Item")] + public EquipmentDictionaryVersionObjectTypesTypeDataItemsItemEquipmentDataItemsItem[] Item + { + get => this.itemField; + set => this.itemField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeDataItemsItemEquipmentDataItemsItem +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeEvents +{ + + private EquipmentDictionaryVersionObjectTypesTypeEventsEvent[] eventField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Event")] + public EquipmentDictionaryVersionObjectTypesTypeEventsEvent[] Event + { + get => this.eventField; + set => this.eventField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeEventsEvent +{ + + private EquipmentDictionaryVersionObjectTypesTypeEventsEventEquipmentEvents equipmentEventsField; + + private string nameField; + + private string stateModelField; + + private string idField; + + /// + public EquipmentDictionaryVersionObjectTypesTypeEventsEventEquipmentEvents EquipmentEvents + { + get => this.equipmentEventsField; + set => this.equipmentEventsField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string StateModel + { + get => this.stateModelField; + set => this.stateModelField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeEventsEventEquipmentEvents +{ + + private EquipmentDictionaryVersionObjectTypesTypeEventsEventEquipmentEventsEvent eventField; + + private string idField; + + /// + public EquipmentDictionaryVersionObjectTypesTypeEventsEventEquipmentEventsEvent Event + { + get => this.eventField; + set => this.eventField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeEventsEventEquipmentEventsEvent +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeSettings +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReports +{ + + private EquipmentDictionaryVersionReportsReport[] reportField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Report")] + public EquipmentDictionaryVersionReportsReport[] Report + { + get => this.reportField; + set => this.reportField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReport +{ + + private EquipmentDictionaryVersionReportsReportDataItems dataItemsField; + + private bool isPreDefinedField; + + private EquipmentDictionaryVersionReportsReportLinkEvents linkEventsField; + + private string nameField; + + private EquipmentDictionaryVersionReportsReportPreLinkedEvents preLinkedEventsField; + + private object sourceIdField; + + private string idField; + + /// + public EquipmentDictionaryVersionReportsReportDataItems DataItems + { + get => this.dataItemsField; + set => this.dataItemsField = value; + } + + /// + public bool IsPreDefined + { + get => this.isPreDefinedField; + set => this.isPreDefinedField = value; + } + + /// + public EquipmentDictionaryVersionReportsReportLinkEvents LinkEvents + { + get => this.linkEventsField; + set => this.linkEventsField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public EquipmentDictionaryVersionReportsReportPreLinkedEvents PreLinkedEvents + { + get => this.preLinkedEventsField; + set => this.preLinkedEventsField = value; + } + + /// + public object SourceId + { + get => this.sourceIdField; + set => this.sourceIdField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReportDataItems +{ + + private EquipmentDictionaryVersionReportsReportDataItemsItem[] itemField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Item")] + public EquipmentDictionaryVersionReportsReportDataItemsItem[] Item + { + get => this.itemField; + set => this.itemField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReportDataItemsItem +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReportLinkEvents +{ + + private EquipmentDictionaryVersionReportsReportLinkEventsEvent[] eventField; + + private string idField; + + /// + [System.Xml.Serialization.XmlElementAttribute("Event")] + public EquipmentDictionaryVersionReportsReportLinkEventsEvent[] Event + { + get => this.eventField; + set => this.eventField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReportLinkEventsEvent +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReportPreLinkedEvents +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionValidityMapDataItemToEvent +{ + + private object dataItemsField; + + /// + public object DataItems + { + get => this.dataItemsField; + set => this.dataItemsField = value; + } +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentType.cs b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentType.cs new file mode 100644 index 0000000..c5efa45 --- /dev/null +++ b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentType.cs @@ -0,0 +1,962 @@ +namespace Shared.PasteSpecialXml.EAF.XML.API.EquipmentType; + +// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities", IsNullable = false)] +public partial class EquipmentTypeVersion +{ + +#pragma warning disable IDE1006 // Naming Styles + + private string createdByField; + + private System.DateTime creationDateField; + + private object descriptionField; + + private ExtensionsVersionExtension[] extensionsField; + + private System.DateTime freezeDateField; + + private string frozenByField; + + private byte idField; + + private bool isFrozenField; + + private bool isRetiredField; + + private System.DateTime retireDateField; + + private object retiredByField; + + private SelectedDeploymentPackage[] deploymentPackagesField; + + private EquipmentTypeVersionDictionaries dictionariesField; + + private string nameField; + + private EquipmentTypeVersionParentType parentTypeField; + + private ParameterizedModelObjectDefinition[] equipmentComponentsField; + + private EventActionSequenceDefinition[] eventActionSequencesField; + + private object fileCommunicatorObjectTypesField; + + private FileConfiguration fileConfigurationField; + + private FileHandlerObjectTypes fileHandlerObjectTypesField; + + private ParameterizedModelObjectDefinition[] transientEquipmentObjectTypesField; + + private string id1Field; + + private string i___typeField; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public string CreatedBy + { + get => this.createdByField; + set => this.createdByField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public System.DateTime CreationDate + { + get => this.creationDateField; + set => this.creationDateField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities", IsNullable = true)] + public object Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + [System.Xml.Serialization.XmlArrayItemAttribute("VersionExtension", IsNullable = false)] + public ExtensionsVersionExtension[] Extensions + { + get => this.extensionsField; + set => this.extensionsField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public System.DateTime FreezeDate + { + get => this.freezeDateField; + set => this.freezeDateField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public string FrozenBy + { + get => this.frozenByField; + set => this.frozenByField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public bool IsFrozen + { + get => this.isFrozenField; + set => this.isFrozenField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public bool IsRetired + { + get => this.isRetiredField; + set => this.isRetiredField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public System.DateTime RetireDate + { + get => this.retireDateField; + set => this.retireDateField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities", IsNullable = true)] + public object RetiredBy + { + get => this.retiredByField; + set => this.retiredByField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("SelectedDeploymentPackage", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Deployme" + + "nt", IsNullable = false)] + public SelectedDeploymentPackage[] DeploymentPackages + { + get => this.deploymentPackagesField; + set => this.deploymentPackagesField = value; + } + + /// + public EquipmentTypeVersionDictionaries Dictionaries + { + get => this.dictionariesField; + set => this.dictionariesField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public EquipmentTypeVersionParentType ParentType + { + get => this.parentTypeField; + set => this.parentTypeField = value; + } + + /// + [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + [System.Xml.Serialization.XmlArrayItemAttribute("ParameterizedModelObjectDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation", IsNullable = false)] + public ParameterizedModelObjectDefinition[] EquipmentComponents + { + get => this.equipmentComponentsField; + set => this.equipmentComponentsField = value; + } + + /// + [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + [System.Xml.Serialization.XmlArrayItemAttribute("EventActionSequenceDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation", IsNullable = false)] + public EventActionSequenceDefinition[] EventActionSequences + { + get => this.eventActionSequencesField; + set => this.eventActionSequencesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + public object FileCommunicatorObjectTypes + { + get => this.fileCommunicatorObjectTypesField; + set => this.fileCommunicatorObjectTypesField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + public FileConfiguration FileConfiguration + { + get => this.fileConfigurationField; + set => this.fileConfigurationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + public FileHandlerObjectTypes FileHandlerObjectTypes + { + get => this.fileHandlerObjectTypesField; + set => this.fileHandlerObjectTypesField = value; + } + + /// + [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + [System.Xml.Serialization.XmlArrayItemAttribute("ParameterizedModelObjectDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation", IsNullable = false)] + public ParameterizedModelObjectDefinition[] TransientEquipmentObjectTypes + { + get => this.transientEquipmentObjectTypesField; + set => this.transientEquipmentObjectTypesField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Deployme" + + "nt")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Deployme" + + "nt", IsNullable = false)] +public partial class SelectedDeploymentPackage +{ + + private byte idField; + + private string packageNameField; + + private string packageVersionField; + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string PackageName + { + get => this.packageNameField; + set => this.packageNameField = value; + } + + /// + public string PackageVersion + { + get => this.packageVersionField; + set => this.packageVersionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] +public partial class ExtensionsVersionExtension +{ + + private byte idField; + + private string classNameField; + + private object configurationField; + + private string nameField; + + private string id1Field; + + private string i___typeField; + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Backbone" + + "s")] + public string ClassName + { + get => this.classNameField; + set => this.classNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Backbone" + + "s", IsNullable = true)] + public object Configuration + { + get => this.configurationField; + set => this.configurationField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Backbone" + + "s")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +public partial class EquipmentTypeVersionDictionaries +{ + + private EquipmentTypeVersionDictionariesEquipmentTypeDictionaryReference equipmentTypeDictionaryReferenceField; + + /// + public EquipmentTypeVersionDictionariesEquipmentTypeDictionaryReference EquipmentTypeDictionaryReference + { + get => this.equipmentTypeDictionaryReferenceField; + set => this.equipmentTypeDictionaryReferenceField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +public partial class EquipmentTypeVersionDictionariesEquipmentTypeDictionaryReference +{ + + private string dictionaryNameField; + + private string dictionaryVersionField; + + private byte idField; + + private string id1Field; + + /// + public string DictionaryName + { + get => this.dictionaryNameField; + set => this.dictionaryNameField = value; + } + + /// + public string DictionaryVersion + { + get => this.dictionaryVersionField; + set => this.dictionaryVersionField = value; + } + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +public partial class EquipmentTypeVersionParentType +{ + + private byte idField; + + private string nameField; + + private string id1Field; + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation", IsNullable = false)] +public partial class ParameterizedModelObjectDefinition +{ + + private byte idField; + + private string nameField; + + private ParameterizedModelObjectDefinitionModelObjectParameterDefinition[] parametersField; + + private string typeField; + + private string id1Field; + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ModelObjectParameterDefinition", IsNullable = false)] + public ParameterizedModelObjectDefinitionModelObjectParameterDefinition[] Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } + + /// + public string Type + { + get => this.typeField; + set => this.typeField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] +public partial class ParameterizedModelObjectDefinitionModelObjectParameterDefinition +{ + + private string enumTypeField; + + private byte idField; + + private string nameField; + + private string valueField; + + private string valueTypeField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public string EnumType + { + get => this.enumTypeField; + set => this.enumTypeField = value; + } + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string Value + { + get => this.valueField; + set => this.valueField = value; + } + + /// + public string ValueType + { + get => this.valueTypeField; + set => this.valueTypeField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation", IsNullable = false)] +public partial class EventActionSequenceDefinition +{ + + private EventActionSequenceDefinitionEventActionParameterDefinition[] actionsField; + + private string eventTypeField; + + private string handledEventField; + + private byte idField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("EventActionParameterDefinition", IsNullable = false)] + public EventActionSequenceDefinitionEventActionParameterDefinition[] Actions + { + get => this.actionsField; + set => this.actionsField = value; + } + + /// + public string EventType + { + get => this.eventTypeField; + set => this.eventTypeField = value; + } + + /// + public string HandledEvent + { + get => this.handledEventField; + set => this.handledEventField = value; + } + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public class FileConfiguration +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public class FileHandlerObjectTypes +{ + + private ParameterizedModelObjectDefinition parameterizedModelObjectDefinitionField; + + /// + [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public ParameterizedModelObjectDefinition ParameterizedModelObjectDefinition + { + get => this.parameterizedModelObjectDefinitionField; + set => this.parameterizedModelObjectDefinitionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities", IsNullable = false)] +public partial class Extensions +{ + + private ExtensionsVersionExtension[] versionExtensionField; + + /// + [System.Xml.Serialization.XmlElementAttribute("VersionExtension")] + public ExtensionsVersionExtension[] VersionExtension + { + get => this.versionExtensionField; + set => this.versionExtensionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public partial class EquipmentComponents +{ + + private ParameterizedModelObjectDefinition[] parameterizedModelObjectDefinitionField; + + /// + [System.Xml.Serialization.XmlElementAttribute("ParameterizedModelObjectDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public ParameterizedModelObjectDefinition[] ParameterizedModelObjectDefinition + { + get => this.parameterizedModelObjectDefinitionField; + set => this.parameterizedModelObjectDefinitionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public partial class EventActionSequences +{ + + private EventActionSequenceDefinition[] eventActionSequenceDefinitionField; + + /// + [System.Xml.Serialization.XmlElementAttribute("EventActionSequenceDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public EventActionSequenceDefinition[] EventActionSequenceDefinition + { + get => this.eventActionSequenceDefinitionField; + set => this.eventActionSequenceDefinitionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public partial class TransientEquipmentObjectTypes +{ + + private ParameterizedModelObjectDefinition[] parameterizedModelObjectDefinitionField; + + /// + [System.Xml.Serialization.XmlElementAttribute("ParameterizedModelObjectDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public ParameterizedModelObjectDefinition[] ParameterizedModelObjectDefinition + { + get => this.parameterizedModelObjectDefinitionField; + set => this.parameterizedModelObjectDefinitionField = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] +public partial class EventActionSequenceDefinitionEventActionParameterDefinition +{ + + private byte idField; + + private object nameField; + + private EventActionSequenceDefinitionEventActionParameterDefinitionModelObjectParameterDefinition[] parametersField; + + private string typeField; + + private byte positionField; + + private string id1Field; + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ModelObjectParameterDefinition", IsNullable = false)] + public EventActionSequenceDefinitionEventActionParameterDefinitionModelObjectParameterDefinition[] Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } + + /// + public string Type + { + get => this.typeField; + set => this.typeField = value; + } + + /// + public byte Position + { + get => this.positionField; + set => this.positionField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} + +/// +[System.SerializableAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] +public partial class EventActionSequenceDefinitionEventActionParameterDefinitionModelObjectParameterDefinition +{ + + private object categoryField; + + private object descriptionField; + + private object displayNameField; + + private object enumTypeField; + + private byte idField; + + private bool isMandatoryField; + + private string nameField; + + private byte orderField; + + private string valueField; + + private string valueTypeField; + + private string id1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object Category + { + get => this.categoryField; + set => this.categoryField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object DisplayName + { + get => this.displayNameField; + set => this.displayNameField = value; + } + + /// + [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] + public object EnumType + { + get => this.enumTypeField; + set => this.enumTypeField = value; + } + + /// + public byte Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public bool IsMandatory + { + get => this.isMandatoryField; + set => this.isMandatoryField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public byte Order + { + get => this.orderField; + set => this.orderField = value; + } + + /// + public string Value + { + get => this.valueField; + set => this.valueField = value; + } + + /// + public string ValueType + { + get => this.valueTypeField; + set => this.valueTypeField = value; + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute("Id", Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id1 + { + get => this.id1Field; + set => this.id1Field = value; + } +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/UnitTesting.cs b/Adaptation/_Tests/Shared/UnitTesting.cs new file mode 100644 index 0000000..161de0c --- /dev/null +++ b/Adaptation/_Tests/Shared/UnitTesting.cs @@ -0,0 +1,90 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.Json; +using System.Threading; + +namespace Shared; + +public class UnitTesting +{ + + protected readonly IsEnvironment _IsEnvironment; + + public IsEnvironment IsEnvironment => _IsEnvironment; + + public UnitTesting(TestContext testContext, Type declaringType) + { + if (testContext is null || declaringType is null) + _IsEnvironment = null; + else + { + string projectDirectory = GetProjectDirectory(testContext); + string json = JsonSerializer.Serialize(testContext.Properties); + string vsCodeDirectory = Path.Combine(projectDirectory, ".vscode"); + if (!Directory.Exists(vsCodeDirectory)) + _ = Directory.CreateDirectory(vsCodeDirectory); + string launchText = GetLaunchText(); + File.WriteAllText(Path.Combine(vsCodeDirectory, "launch.json"), launchText); + for (int i = 0; i < int.MaxValue; i++) + { + if (!json.Contains("Debugger.IsAttached") || Debugger.IsAttached) + break; + Thread.Sleep(500); + } + MethodBase methodBase = declaringType.GetMethod(testContext.TestName); + if (methodBase is not null) + { + TestCategoryAttribute testCategoryAttribute = methodBase.GetCustomAttribute(); + if (testCategoryAttribute is not null) + { + foreach (string testCategory in testCategoryAttribute.TestCategories) + _IsEnvironment = new IsEnvironment(testCategory); + } + } + if (_IsEnvironment is null) + _IsEnvironment = new IsEnvironment(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: Debugger.IsAttached, nullASPNetCoreEnvironmentIsProduction: !Debugger.IsAttached); + } + } + + internal static string GetProjectDirectory(TestContext testContext) + { + string result; + string[] checkFiles = null; + result = Path.GetDirectoryName(testContext.DeploymentDirectory); + for (int i = 0; i < int.MaxValue; i++) + { + if (string.IsNullOrEmpty(result)) + break; + checkFiles = Directory.GetFiles(result, "*.Tests.*proj", SearchOption.TopDirectoryOnly); + if (checkFiles.Any()) + break; + result = Path.GetDirectoryName(result); + } + if (string.IsNullOrEmpty(result) || checkFiles is null || !checkFiles.Any()) + throw new Exception(result); + return result; + } + + internal static string GetLaunchText() + { + StringBuilder result = new(); + _ = result. + AppendLine("{"). + AppendLine(" \"configurations\": ["). + AppendLine(" {"). + AppendLine(" \"name\": \".NET Core Attach\","). + AppendLine(" \"type\": \"coreclr\","). + AppendLine(" \"request\": \"attach\","). + AppendLine($" \"processId\": {Environment.ProcessId}"). + AppendLine(" }"). + AppendLine(" ]"). + AppendLine("}"); + return result.ToString(); + } + +} \ No newline at end of file diff --git a/Adaptation/appsettings.Development.json b/Adaptation/appsettings.Development.json new file mode 100644 index 0000000..923c216 --- /dev/null +++ b/Adaptation/appsettings.Development.json @@ -0,0 +1,139 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "Microsoft": "Warning", + "Log4netProvider": "Debug", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "Company": "Infineon Technologies Americas Corp.", + "Drives": [ + { + "Use": false, + "Letter": "a", + "Share": "Floppy Disk", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "c", + "Share": "SYSTEM", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "d", + "Share": "DATA", + "User": "", + "Password": "" + }, + { + "Use": true, + "Letter": "g", + "Share": "\\\\10.95.154.12\\testdata", + "User": "10.95.154.12\\Manager", + "Password": "D6QDJ5g6vjqnNyyRbfbj+g==" + }, + { + "Use": false, + "Letter": "h", + "Share": "\\\\10.95.154.13\\COM 5", + "User": "10.95.154.13\\user", + "Password": "tVyC7uPHtScZR8NLInSaxQ==" + }, + { + "Use": true, + "Letter": "i", + "Share": "\\\\messdv002.na.infineon.com\\Candela", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "j", + "Share": "\\\\messdv002.na.infineon.com\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": true, + "Letter": "k", + "Share": "\\\\messdv002.na.infineon.com\\GaN_NEC\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "l", + "Share": "TFS", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "m", + "Share": "\\\\messdv002.na.infineon.com\\MOCVD", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "n", + "Share": "\\\\10.95.154.22\\C", + "User": "10.95.154.22\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "o", + "Share": "\\\\10.95.154.16\\Aixtron", + "User": "10.95.154.16\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "p", + "Share": "\\\\10.95.154.15\\Aixtron", + "User": "10.95.154.15\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "q", + "Share": "\\\\10.95.154.21\\Data", + "User": "10.95.154.21\\XRD04Admin", + "Password": "v1NOsEOCvbnhzKabspPcCQ==" + }, + { + "Use": true, + "Letter": "r", + "Share": "\\\\10.95.154.23\\Data", + "User": "\"10.95.154.23\\infineon us\"", + "Password": "rzXkXdHKetDfsukhZKW0yA==" + }, + { + "Use": true, + "Letter": "s", + "Share": "\\\\messv02ecc1.ec.local\\EC_EAFRepository", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "t", + "Share": "\\\\messv02ecc1.ec.local\\EC_EDA", + "User": "EC\\ECEDASvc", + "Password": "IKsJmRVUH3xlv+RRELRbwoXYKwLvF4Re7k1Rigzpwf4=" + }, + { + "Use": false, + "Letter": "z", + "Share": "DVD Drive", + "User": "", + "Password": "" + } + ] +} \ No newline at end of file diff --git a/Adaptation/appsettings.json b/Adaptation/appsettings.json new file mode 100644 index 0000000..bfeb1ac --- /dev/null +++ b/Adaptation/appsettings.json @@ -0,0 +1,139 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Log4netProvider": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "Company": "Infineon Technologies Americas Corp.", + "Drives": [ + { + "Use": false, + "Letter": "a", + "Share": "Floppy Disk", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "c", + "Share": "SYSTEM", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "d", + "Share": "DATA", + "User": "", + "Password": "" + }, + { + "Use": true, + "Letter": "g", + "Share": "\\\\10.95.154.12\\testdata", + "User": "10.95.154.12\\Manager", + "Password": "D6QDJ5g6vjqnNyyRbfbj+g==" + }, + { + "Use": false, + "Letter": "h", + "Share": "\\\\10.95.154.13\\COM 5", + "User": "10.95.154.13\\user", + "Password": "tVyC7uPHtScZR8NLInSaxQ==" + }, + { + "Use": true, + "Letter": "i", + "Share": "\\\\messdv002.na.infineon.com\\Candela", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "j", + "Share": "\\\\messdv002.na.infineon.com\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": true, + "Letter": "k", + "Share": "\\\\messdv002.na.infineon.com\\GaN_NEC\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "l", + "Share": "TFS", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "m", + "Share": "\\\\messdv002.na.infineon.com\\MOCVD", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "n", + "Share": "\\\\10.95.154.22\\C", + "User": "10.95.154.22\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "o", + "Share": "\\\\10.95.154.16\\Aixtron", + "User": "10.95.154.16\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "p", + "Share": "\\\\10.95.154.15\\Aixtron", + "User": "10.95.154.15\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "q", + "Share": "\\\\10.95.154.21\\Data", + "User": "10.95.154.21\\XRD04Admin", + "Password": "v1NOsEOCvbnhzKabspPcCQ==" + }, + { + "Use": true, + "Letter": "r", + "Share": "\\\\10.95.154.23\\Data", + "User": "\"10.95.154.23\\infineon us\"", + "Password": "rzXkXdHKetDfsukhZKW0yA==" + }, + { + "Use": true, + "Letter": "s", + "Share": "\\\\messv02ecc1.ec.local\\EC_EAFRepository", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "t", + "Share": "\\\\messv02ecc1.ec.local\\EC_EDA", + "User": "EC\\ECEDASvc", + "Password": "IKsJmRVUH3xlv+RRELRbwoXYKwLvF4Re7k1Rigzpwf4=" + }, + { + "Use": false, + "Letter": "z", + "Share": "DVD Drive", + "User": "", + "Password": "" + } + ] +} \ No newline at end of file diff --git a/Adaptation/package.json b/Adaptation/package.json index 8247f48..d4e48e1 100644 --- a/Adaptation/package.json +++ b/Adaptation/package.json @@ -1,8 +1,27 @@ { "scripts": { + "Alpha": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "build": "dotnet build --runtime win-x64 --self-contained", - "dotnet-format": "dotnet format --report .vscode --verbosity detailed --severity error", + "dotnet-format": "dotnet format --report .vscode --verbosity detailed --severity warn", "pull": "git pull", - "garbage-collect": "git gc" + "garbage-collect": "git gc", + "AA-CreateSelfDescription.Staging.v2_39_0-TENCOR3_EQPT-Staging__v2_39_0__TENCOR3_EQPT__DownloadRsMFile": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0 & ClassName~TENCOR3_EQPT & Staging__v2_39_0__TENCOR3_EQPT__DownloadRsMFile\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "AT-CreateSelfDescription.Staging.v2_39_0-MET08DDUPSFS6420": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0 & ClassName~MET08DDUPSFS6420\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "AV-CreateSelfDescription.Staging.v2_39_0-TENCOR1_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0 & ClassName~TENCOR1_EQPT\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "AW-CreateSelfDescription.Staging.v2_39_0-TENCOR1": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0 & ClassName~TENCOR1\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "AV-CreateSelfDescription.Staging.v2_39_0-TENCOR2_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0 & ClassName~TENCOR2_EQPT\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "AW-CreateSelfDescription.Staging.v2_39_0-TENCOR2": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0 & ClassName~TENCOR2\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "AX-CreateSelfDescription.Staging.v2_39_0-TENCOR3_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0 & ClassName~TENCOR3_EQPT\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "AY-CreateSelfDescription.Staging.v2_39_0-TENCOR3": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0 & ClassName~TENCOR3\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "AZ-CreateSelfDescription.Staging.v2_39_0": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.CreateSelfDescription.Staging.v2_39_0\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BA-Extract.Staging.v2_39_0-TENCOR3-Staging__v2_39_0__TENCOR3__RsM643047560320000000__Normal": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0 & ClassName~TENCOR3 & Staging__v2_39_0__TENCOR3__RsM643047560320000000__Normal\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BT-Extract.Staging.v2_39_0-MET08DDUPSFS6420": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0 & ClassName~MET08DDUPSFS6420\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BV-Extract.Staging.v2_39_0-TENCOR1_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0 & ClassName~TENCOR1_EQPT\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BW-Extract.Staging.v2_39_0-TENCOR1": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0 & ClassName~TENCOR1\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BV-Extract.Staging.v2_39_0-TENCOR2_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0 & ClassName~TENCOR2_EQPT\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BW-Extract.Staging.v2_39_0-TENCOR2": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0 & ClassName~TENCOR2\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BX-Extract.Staging.v2_39_0-TENCOR3_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0 & ClassName~TENCOR3_EQPT\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BY-Extract.Staging.v2_39_0-TENCOR3": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0 & ClassName~TENCOR3\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")", + "BZ-Extract.Staging.v2_39_0": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~_Tests.Extract.Staging.v2_39_0\" --% -- TestRunParameters.Parameter(name=\\\"Debug\\\", value=\\\"Debugger.IsAttached\\\")" } } \ No newline at end of file diff --git a/FileHandlers/FileRead.cs b/FileHandlers/FileRead.cs index 80af930..19b374b 100644 --- a/FileHandlers/FileRead.cs +++ b/FileHandlers/FileRead.cs @@ -1,95 +1,350 @@ -using Eaf.Core.Smtp; -using Adaptation.Shared.Metrology; +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.FileHandlers; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using Adaptation.Shared; +using Adaptation.Shared.Methods; using Eaf.Core; +using Eaf.Core.Smtp; +using Eaf.EquipmentCore.DataCollection.Reporting; +using Eaf.EquipmentCore.SelfDescription.ElementDescription; +using Eaf.EquipmentCore.SelfDescription.EquipmentStructure; +using Eaf.EquipmentCore.SelfDescription.ParameterTypes; using Ifx.Eaf.EquipmentConnector.File.Component.Reader; +using Ifx.Eaf.EquipmentConnector.File.SelfDescription; using log4net; using Shared; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Reflection; using System.Text; using System.Text.Json; -using System.Linq; +using System.Text.Json.Serialization; +using System.Threading; -namespace MET08DDUPSFS6420.FileHandlers +namespace MET08DDUPSFS6420.FileHandlers; + +public partial class FileRead : FileReaderHandler, ISMTP { - public partial class FileRead : FileReaderHandler + private readonly ILog _Log; + private IFileRead _FileRead; + private EquipmentEvent _EquipmentEvent; + private readonly bool _UseCyclicalForDescription; + private FilePathGenerator _FilePathGeneratorForError; + private FilePathGenerator _FilePathGeneratorForTarget; + private readonly List _EquipmentParameters; + private static readonly Dictionary> _DummyRuns; + + static FileRead() => _DummyRuns = new Dictionary>(); + + public FileRead() { + if (FileParameter is null) + FileParameter = new Dictionary(); + _FileRead = null; + _UseCyclicalForDescription = false; + _Log = LogManager.GetLogger(typeof(FileRead)); + _EquipmentParameters = new List(); + } - private Adaptation.FileHandlers.FileRead _FileRead; - - public FileRead() + public override void CreateSelfDescription() + { + MethodBase methodBase = new StackFrame().GetMethod(); + _Log.Debug(string.Concat(methodBase.Name, " - Entry")); + try { - _Log = LogManager.GetLogger(typeof(FileRead)); - _FileRead = new Adaptation.FileHandlers.FileRead(); + if (Equipment is null) + throw new Exception(); + CreateSelfDescription(methodBase); + _Log.Debug(string.Concat(methodBase.Name, " - Try - Exit")); } - - public override bool Extract(string reportFullPath, string eventName) + catch (Exception ex) { - MethodBase methodBase = new StackFrame().GetMethod(); - _Log.Debug(string.Concat(methodBase.Name, " - Entry - {", reportFullPath, "}")); - Tuple> extractResults = null; - try + _Log.Error(string.Concat(methodBase.Name, " - Catch - Entry {", ex.Message, "}", Environment.NewLine, Environment.NewLine, ex.StackTrace)); + long breakAfter = DateTime.Now.AddSeconds(30).Ticks; + for (short i = 0; i < short.MaxValue; i++) { - extractResults = _FileRead.GetExtractResult(reportFullPath, eventName); - TriggerEvents(reportFullPath, extractResults); - _FileRead.Move(reportFullPath, extractResults); - FilePathGeneratorInfoMove(reportFullPath, extractResults); - _FileRead.WaitForThread(); - _Log.Debug(string.Concat(methodBase.Name, " - Try - Exit")); - return true; + if (DateTime.Now.Ticks > breakAfter) + break; + Thread.Sleep(500); } - catch (Exception ex) + throw; + } + } + + public override bool Extract(string reportFullPath, string eventName) + { + MethodBase methodBase = new StackFrame().GetMethod(); + _Log.Debug(string.Concat(methodBase.Name, " - Entry - {", reportFullPath, "}")); + Tuple> extractResults = null; + try + { + extractResults = _FileRead.GetExtractResult(reportFullPath, eventName); + TriggerEvents(extractResults); + _FileRead.Move(extractResults); + FilePathGeneratorInfoMove(extractResults); + _FileRead.WaitForThread(); + _Log.Debug(string.Concat(methodBase.Name, " - Try - Exit")); + return true; + } + catch (Exception ex) + { + _Log.Error(string.Concat(methodBase.Name, " - Catch - Entry {", ex.Message, "}", Environment.NewLine, Environment.NewLine, ex.StackTrace)); + _FileRead.Move(extractResults, exception: ex); + FilePathGeneratorInfoMove(extractResults, exception: ex); + return false; + } + } + + private void Send(EmailMessage emailMessage) + { + ISmtp smtp = Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); + if (smtp is not null) + smtp.Send(emailMessage); + } + + void ISMTP.SendLowPriorityEmailMessage(string subject, string body) + { + EmailMessage emailMessage = new(subject, body, MailPriority.Low); + Send(emailMessage); + } + + void ISMTP.SendHighPriorityEmailMessage(string subject, string body) + { + EmailMessage emailMessage = new(subject, body, MailPriority.High); + Send(emailMessage); + } + + void ISMTP.SendNormalPriorityEmailMessage(string subject, string body) + { + EmailMessage emailMessage = new(subject, body, MailPriority.Normal); + Send(emailMessage); + } + + private void AddParameterRangeAndEvent() + { + string description; + bool allowNull = false; + EquipmentParameter equipmentParameter; + JsonProperty[] jsonProperties = _FileRead.GetDefault(); + Dictionary keyValuePairs = _FileRead.GetDisplayNamesJsonElement(); + Dictionary parameterTypeDefinitions = new(); + FileConnectorParameterTypeDefinitionProvider fileConnectorParameterTypeDefinitionProvider = new(); + foreach (ParameterTypeDefinition parameterTypeDefinition in fileConnectorParameterTypeDefinitionProvider.GetAllParameterTypeDefinition()) + { + switch (parameterTypeDefinition.Name) { - _Log.Error(string.Concat(methodBase.Name, " - Catch - Entry {", ex.Message, "}", Environment.NewLine, Environment.NewLine, ex.StackTrace)); - _FileRead.Move(reportFullPath, extractResults, exception: ex); - FilePathGeneratorInfoMove(reportFullPath, extractResults, exception: ex); - return false; + case nameof(String): + parameterTypeDefinitions.Add(JsonValueKind.String, parameterTypeDefinition); + break; + case nameof(Double): + parameterTypeDefinitions.Add(JsonValueKind.Number, parameterTypeDefinition); + break; + case nameof(Boolean): + parameterTypeDefinitions.Add(JsonValueKind.True, parameterTypeDefinition); + parameterTypeDefinitions.Add(JsonValueKind.False, parameterTypeDefinition); + break; + default: + break; } } - - public Tuple> ReExtract(string searchDirectory, string sourceFileFilter) + foreach (JsonProperty jsonProperty in jsonProperties) { - Tuple> results = _FileRead.ReExtract(searchDirectory, sourceFileFilter); - if (!(results?.Item2 is null)) + if (jsonProperty.Value.ValueKind == JsonValueKind.Object && !parameterTypeDefinitions.ContainsKey(JsonValueKind.Object)) { - TriggerEvents(_FileRead.Logistics.ReportFullPath, results); - _FileRead.Move(_FileRead.Logistics.ReportFullPath, results); - FilePathGeneratorInfoMove(_FileRead.Logistics.ReportFullPath, results); + StructuredType structuredType = new(nameof(StructuredType), string.Empty, new List()); + parameterTypeDefinitions.Add(JsonValueKind.Object, structuredType); + Equipment.SelfDescriptionBuilder.AddParameterTypeDefinition(structuredType); } - return results; + if (!parameterTypeDefinitions.ContainsKey(jsonProperty.Value.ValueKind)) + throw new Exception(string.Concat('{', jsonProperty.Value.ValueKind, "} is not mapped!")); } - - private void FilePathGeneratorInfoMove(string reportFullPath, Tuple> extractResults, Exception exception = null) + foreach (JsonProperty jsonProperty in jsonProperties) { - bool isErrorFile = !(exception is null); - object filePathGeneratorInfo = GetFilePathGeneratorInfo(reportFullPath, isErrorFile); - Tuple tuple = _FileRead.GetOpenInsightTuple(); - if (filePathGeneratorInfo is null || !(filePathGeneratorInfo is FilePathGeneratorInfo filePathGenerator)) - OISiViewer.WebClientDownloadString(tuple.Item1, tuple.Item2, reportFullPath, isErrorFile, string.Empty); + if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull) + throw new Exception(); + if (jsonProperty.Value.ValueKind != JsonValueKind.String || !keyValuePairs.ContainsKey(jsonProperty.Name)) + description = string.Empty; + else + description = keyValuePairs[jsonProperty.Name].Split('|')[0]; + equipmentParameter = new EquipmentParameter(jsonProperty.Name, parameterTypeDefinitions[jsonProperty.Value.ValueKind], description); + _EquipmentParameters.Add(equipmentParameter); + } + _ = Equipment.SelfDescriptionBuilder.RootEquipmentElementBuilder.AddParameterRange(_EquipmentParameters); + _EquipmentEvent = new EquipmentEvent(_FileRead.EventName, _FileRead.GetEventDescription(), _EquipmentParameters); + _ = Equipment.SelfDescriptionBuilder.RootEquipmentElementBuilder.AddEvent(_EquipmentEvent); + } + + private void CreateSelfDescription(MethodBase methodBase) + { + string cellInstanceName; + string equipmentTypeName = string.Empty; + string equipmentDictionaryName = string.Empty; + EquipmentElement equipmentElement = Equipment.SelfDescriptionBuilder.RootEquipmentElementBuilder.Item; + if (Backbone.Instance?.CellName is null) + cellInstanceName = string.Empty; + else + cellInstanceName = Backbone.Instance.CellName; + string cellInstanceConnectionName = equipmentElement.Name; + FileConnectorConfiguration fileConnectorConfiguration = Mapper.Map(Configuration); + string parameterizedModelObjectDefinitionType = methodBase.DeclaringType.FullName; + IList modelObjectParameters = Mapper.Map(ConfiguredParameters); + _FileRead = CellInstanceConnectionName.Get(this, FileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, _DummyRuns, _UseCyclicalForDescription, isEAFHosted: true); + if (_FileRead.IsEvent) + AddParameterRangeAndEvent(); + } + + private object GetFilePathGeneratorInfo(string reportFullPath, bool isErrorFile) + { + FilePathGeneratorInfo result; + FilePathGenerator filePathGeneratorOriginal; + if (Configuration is null) + result = null; + else + { + if (isErrorFile) + { + if (_FilePathGeneratorForError is null) + _FilePathGeneratorForError = new FilePathGenerator(Configuration, reportFullPath, isErrorFile: true); + filePathGeneratorOriginal = _FilePathGeneratorForError; + } else { - OISiViewer.WebClientDownloadString(tuple.Item1, tuple.Item2, reportFullPath, isErrorFile, filePathGenerator.To); - string[] exceptionLines = _FileRead.Shared1124(reportFullPath, extractResults, filePathGenerator.To, filePathGenerator.From, filePathGenerator.ResolvedFileLocation, exception); - if (isErrorFile) + if (_FilePathGeneratorForTarget is null) + _FilePathGeneratorForTarget = new FilePathGenerator(Configuration, reportFullPath, isErrorFile: false); + filePathGeneratorOriginal = _FilePathGeneratorForTarget; + } + result = new FilePathGeneratorInfo(filePathGeneratorOriginal, reportFullPath, isErrorFile, FileParameter); + } + return result; + } + + private void FilePathGeneratorInfoMove(Tuple> extractResults, Exception exception = null) + { + bool isErrorFile = exception is not null; + object filePathGeneratorInfo = GetFilePathGeneratorInfo(_FileRead.ReportFullPath, isErrorFile); + if (filePathGeneratorInfo is not null and FilePathGeneratorInfo filePathGenerator) + { + string[] exceptionLines = _FileRead.Move(extractResults, filePathGenerator.To, filePathGenerator.From, filePathGenerator.ResolvedFileLocation, exception); + if (isErrorFile) + { + try { - try - { - StringBuilder stringBuilder = new StringBuilder(); - foreach (string item in exceptionLines) - stringBuilder.Append("<").Append(item).AppendLine(">"); - ISmtp smtp = Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); - EmailMessage emailMessage = new EmailMessage(string.Concat("Exception:", _ConfigDataBase.EquipmentElementName, _ConfigDataBase.FileConnectorConfiguration?.SourceDirectoryCloaking), stringBuilder.ToString(), MailPriority.High); - smtp.Send(emailMessage); - } - catch (Exception) { } + StringBuilder stringBuilder = new(); + foreach (string item in exceptionLines) + _ = stringBuilder.Append("<").Append(item).AppendLine(">"); + ISmtp smtp = Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); + EmailMessage emailMessage = new(_FileRead.ExceptionSubject, stringBuilder.ToString(), MailPriority.High); + smtp.Send(emailMessage); } + catch (Exception) { } } } + } + private List GetParameterValues(List headerNames, JsonElement[] jsonElements, int i) + { + List results = new(); + if (_UseCyclicalForDescription && i > 0) + throw new Exception(); + object value; + List list; + JsonProperty[] jsonProperties = jsonElements[i].EnumerateObject().ToArray(); + if (jsonProperties.Length != _EquipmentParameters.Count) + throw new Exception(); + for (int p = 0; p < jsonProperties.Length; p++) + { + if (!_UseCyclicalForDescription || headerNames.Contains(jsonProperties[p].Name)) + value = jsonProperties[p].Value.ToString(); + else + { + list = new List(); + for (int z = 0; z < jsonElements.Length; z++) + list.Add(new object[] { z, jsonElements[z].GetProperty(jsonProperties[p].Name).ToString() }); + value = list; + } + results.Add(new ParameterValue(_EquipmentParameters[p], value, DateTime.Now)); + } + return results; + } + + private void TriggerEvents(Tuple> extractResults) + { + List headerNames; + List parameters; + if (!_UseCyclicalForDescription) + headerNames = null; + else + headerNames = _FileRead.GetHeaderNames(); + for (int i = 0; i < extractResults.Item3.Length; i++) + { + if (_EquipmentEvent is not null) + { + _Log.Debug(string.Concat("TriggerEvent - {", _FileRead.ReportFullPath, "} ", i, " of ", extractResults.Item3.Length)); + parameters = GetParameterValues(headerNames, extractResults.Item3, i); + if (_EquipmentEvent is not null) + Equipment.DataCollection.TriggerEvent(_EquipmentEvent, parameters); + if (_UseCyclicalForDescription) + break; + } + } + } + + public Tuple> ReExtract(string json) + { + Tuple> results; + string cellInstanceName; + if (!json.Contains(nameof(cellInstanceName))) + throw new Exception(); + string equipmentTypeName; + if (!json.Contains(nameof(equipmentTypeName))) + throw new Exception(); + string equipmentDictionaryName; + if (!json.Contains(nameof(equipmentDictionaryName))) + throw new Exception(); + string cellInstanceConnectionName; + if (!json.Contains(nameof(cellInstanceConnectionName))) + throw new Exception(); + if (!json.Contains(nameof(FileConnectorConfiguration))) + throw new Exception(); + if (!json.Contains(nameof(IList))) + throw new Exception(); + string parameterizedModelObjectDefinitionType; + if (!json.Contains(nameof(parameterizedModelObjectDefinitionType))) + throw new Exception(); + Dictionary> dummyRuns = new(); + Dictionary fileParameter = new(); + MethodBase methodBase = new StackFrame().GetMethod(); + JsonElement jsonElement = JsonSerializer.Deserialize(json); + cellInstanceName = jsonElement.GetProperty(nameof(cellInstanceName)).ToString(); + equipmentTypeName = jsonElement.GetProperty(nameof(equipmentTypeName)).ToString(); + equipmentDictionaryName = jsonElement.GetProperty(nameof(equipmentDictionaryName)).ToString(); + cellInstanceConnectionName = jsonElement.GetProperty(nameof(cellInstanceConnectionName)).ToString(); + JsonElement fileConnectorConfigurationJsonElement = jsonElement.GetProperty(nameof(FileConnectorConfiguration)); + parameterizedModelObjectDefinitionType = jsonElement.GetProperty(nameof(parameterizedModelObjectDefinitionType)).ToString(); + if (fileConnectorConfigurationJsonElement.ValueKind != JsonValueKind.Object) + throw new Exception(); + JsonSerializerOptions jsonSerializerOptions = new() { Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } }; + FileConnectorConfiguration fileConnectorConfiguration = JsonSerializer.Deserialize(fileConnectorConfigurationJsonElement.ToString(), jsonSerializerOptions); + JsonElement modelObjectParameterDefinitionJsonElement = jsonElement.GetProperty(nameof(IList)); + if (modelObjectParameterDefinitionJsonElement.ValueKind != JsonValueKind.Array) + throw new Exception(); + IList modelObjectParameters = JsonSerializer.Deserialize>(modelObjectParameterDefinitionJsonElement.ToString(), jsonSerializerOptions); + _FileRead = CellInstanceConnectionName.Get(this, FileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, _DummyRuns, _UseCyclicalForDescription, isEAFHosted: false); + results = _FileRead.ReExtract(); + if (results?.Item2 is null) + throw new Exception(); + else + { + TriggerEvents(results); + _FileRead.Move(results); + FilePathGeneratorInfoMove(results); + } + return results; } } +// 2022-02-15 -> FileRead \ No newline at end of file diff --git a/FileHandlers/FileReadShared.cs b/FileHandlers/FileReadShared.cs deleted file mode 100644 index cedad10..0000000 --- a/FileHandlers/FileReadShared.cs +++ /dev/null @@ -1,249 +0,0 @@ -using Adaptation.Shared.Metrology; -using Eaf.Core; -using Eaf.EquipmentCore.DataCollection.Reporting; -using Eaf.EquipmentCore.SelfDescription.ElementDescription; -using Eaf.EquipmentCore.SelfDescription.EquipmentStructure; -using Eaf.Management.ConfigurationData.CellAutomation; -using Ifx.Eaf.EquipmentConnector.File.Configuration; -using log4net; -using Shared; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.Json; -using System.Threading; - -namespace MET08DDUPSFS6420.FileHandlers -{ - - public partial class FileRead - { - -#pragma warning disable CS0169 - private readonly ILog _Log; - private Description _Description; - private ConfigDataBase _ConfigDataBase; - private EquipmentEvent _EquipmentEvent; - private FilePathGenerator _FilePathGeneratorForError; - private FilePathGenerator _FilePathGeneratorForTarget; -#pragma warning restore CS0169 - - public override void CreateSelfDescription() - { - MethodBase methodBase = new StackFrame().GetMethod(); - _Log.Debug(string.Concat(methodBase.Name, " - Entry")); - try - { - if (Equipment is null) - throw new Exception(); - string cellInstanceName; - if (Backbone.Instance?.CellName is null) - cellInstanceName = string.Empty; - else - cellInstanceName = Backbone.Instance.CellName; - if (cellInstanceName.Contains("-IO")) - cellInstanceName = cellInstanceName.Replace("-IO", string.Empty); - EquipmentElement equipmentElement = Equipment.SelfDescriptionBuilder.RootEquipmentElementBuilder.Item; - Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration fileConnectorConfiguration = Map(Configuration); - IList modelObjectParameterDefinitions = Map(ConfiguredParameters); - _ConfigDataBase = _FileRead.GetConfigDataBase(methodBase, cellInstanceName, equipmentElement.Name, fileConnectorConfiguration, modelObjectParameterDefinitions, eafHosted: !(Equipment is null)); - if (Configuration.SourceFileLocation != _ConfigDataBase.FileConnectorConfiguration.SourceFileLocation) - Configuration.SourceFileLocation = _ConfigDataBase.FileConnectorConfiguration.SourceFileLocation; - _Description = new Description(_FileRead, _ConfigDataBase, Equipment); - _FileRead.Shared0749(); - if (FileParameter is null) - FileParameter = new Dictionary(); - _FileRead.Shared1301(FileParameter, fileConnectorConfiguration); - if (!(Equipment is null) && _ConfigDataBase.IsEvent) - { - if (_Description.ParameterTypeDefinitions.Any()) - { - foreach (Eaf.EquipmentCore.SelfDescription.ParameterTypes.ParameterTypeDefinition item in _Description.ParameterTypeDefinitions) - { - Equipment.SelfDescriptionBuilder.AddParameterTypeDefinition(item); - } - } - Equipment.SelfDescriptionBuilder.RootEquipmentElementBuilder.AddParameterRange(_Description.EquipmentParameters); - _EquipmentEvent = new EquipmentEvent(_ConfigDataBase.GetEventName(), _ConfigDataBase.GetEventDescription(), _Description.EquipmentParameters); - Equipment.SelfDescriptionBuilder.RootEquipmentElementBuilder.AddEvent(_EquipmentEvent); - } - _Log.Debug(string.Concat(methodBase.Name, " - Try - Exit")); - } - catch (Exception ex) - { - _Log.Error(string.Concat(methodBase.Name, " - Catch - Entry {", ex.Message, "}", Environment.NewLine, Environment.NewLine, ex.StackTrace)); - long breakAfter = DateTime.Now.AddSeconds(30).Ticks; - for (short i = 0; i < short.MaxValue; i++) - { - if (DateTime.Now.Ticks > breakAfter) - break; - Thread.Sleep(500); - } - throw; - } - } - - public object GetFilePathGeneratorInfo(string reportFullPath, bool isErrorFile) - { - FilePathGeneratorInfo result; - FilePathGenerator filePathGeneratorOriginal; - if (Configuration is null) - result = null; - else - { - if (isErrorFile) - { - if (_FilePathGeneratorForError is null) - _FilePathGeneratorForError = new FilePathGenerator(Configuration, reportFullPath, isErrorFile: true); - filePathGeneratorOriginal = _FilePathGeneratorForError; - } - else - { - if (_FilePathGeneratorForTarget is null) - _FilePathGeneratorForTarget = new FilePathGenerator(Configuration, reportFullPath, isErrorFile: false); - filePathGeneratorOriginal = _FilePathGeneratorForTarget; - } - result = new FilePathGeneratorInfo(filePathGeneratorOriginal, reportFullPath, isErrorFile, FileParameter); - } - return result; - } - - private Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration Map(FileConnectorConfiguration configuration) - { - Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration result = new Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration - { - AlternateTargetFolder = configuration.AlternateTargetFolder, - ConnectionRetryInterval = configuration.ConnectionRetryInterval, - ConnectionSettings = new List(), - CopySourceFolderStructure = configuration.CopySourceFolderStructure, - DefaultPlaceHolderValue = configuration.DefaultPlaceHolderValue, - //DeleteAbandonedEmptySourceSubFolders = configuration.DeleteAbandonedEmptySourceSubFolders, - DeleteEmptySourceSubFolders = configuration.DeleteEmptySourceSubFolders, - ErrorPostProcessingMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.PostProcessingModeEnum)configuration.ErrorPostProcessingMode, - ErrorTargetFileLocation = configuration.ErrorTargetFileLocation, - ErrorTargetFileName = configuration.ErrorTargetFileName, - FileAgeFilterMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.FileAgeFilterEnum)configuration.FileAgeFilterMode, - FileAgeThreshold = configuration.FileAgeThreshold, - //FileHandlers = configuration.FileHandlers, - FileHandleTimeout = (long)configuration.FileHandleTimeout, - FileHandleWaitTime = configuration.FileHandleWaitTime, - FileScanningIntervalInSeconds = configuration.FileScanningIntervalInSeconds, - FileScanningOption = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.FileScanningOptionEnum)configuration.FileScanningOption, - FolderAgeCheckIndividualSubFolders = configuration.FolderAgeCheckIndividualSubFolders, - FolderAgeThreshold = configuration.FolderAgeThreshold, - //FolderOperationsSubFolderLevel = configuration.FolderOperationsSubFolderLevel, - IdleEventWaitTimeInSeconds = (long)configuration.IdleEventWaitTimeInSeconds, - IfFileExistAction = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.IfFileExistEnum)configuration.IfFileExistAction, - IfPostProcessingFailsAction = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.IfPostProcessingFailsEnum)configuration.IfPostProcessingFailsAction, - IncludeSubDirectories = configuration.IncludeSubDirectories, - PostProcessingRetries = configuration.PostProcessingRetries, - PreProcessingMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.PreProcessingModeEnum)configuration.PreProcessingMode, - PostProcessingMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.PostProcessingModeEnum)configuration.PostProcessingMode, - SourceDirectoryCloaking = configuration.SourceDirectoryCloaking, - SourceFileFilter = configuration.SourceFileFilter, - SourceFileFilters = configuration.SourceFileFilters, - SourceFileLocation = configuration.SourceFileLocation, - TargetFileLocation = configuration.TargetFileLocation, - TargetFileName = configuration.TargetFileName, - TriggerOnChanged = configuration.TriggerOnChanged, - TriggerOnCreated = configuration.TriggerOnCreated, - UseZip64Mode = configuration.UseZip64Mode, - ZipErrorTargetFileName = configuration.ZipErrorTargetFileName, - ZipFileAmount = configuration.ZipFileAmount, - ZipFileSubFolderLevel = configuration.ZipFileSubFolderLevel, - ZipFileTime = configuration.ZipFileTime, - ZipMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.ZipModeEnum)configuration.ZipMode, - ZipTargetFileName = configuration.ZipTargetFileName, - }; - foreach (Ifx.Eaf.Common.Configuration.ConnectionSetting connectionSetting in configuration.ConnectionSettings) - result.ConnectionSettings.Add(new Adaptation.Ifx.Eaf.Common.Configuration.ConnectionSetting(connectionSetting.Name, connectionSetting.Value)); - return result; - } - - private IList Map(IList configuredParameters) - { - List results = new List(); - Adaptation.Eaf.Management.ConfigurationData.CellAutomation.ModelObjectParameterType modelObjectParameterType; - for (int i = 0; i < configuredParameters.Count; i++) - { - modelObjectParameterType = (Adaptation.Eaf.Management.ConfigurationData.CellAutomation.ModelObjectParameterType)configuredParameters[i].ValueType; - results.Add(new Adaptation.Eaf.Management.ConfigurationData.CellAutomation.ModelObjectParameterDefinition() { Id = i, Name = configuredParameters[i].Name, Value = configuredParameters[i].Value, ValueType = modelObjectParameterType, EnumType = modelObjectParameterType.ToString() }); - } - return results; - } - - public ConfigDataBase ReflectionCreateSelfDescriptionV2(string json) - { - ConfigDataBase result = _FileRead.ReflectionCreateSelfDescriptionV2(json); - _ConfigDataBase = result; - _Description = new Description(_FileRead, result, Equipment); - return result; - } - - private void TriggerEvents(string reportFullPath, Tuple> extractResults) - { - List parameters; - int count = extractResults.Item2.Value.GetArrayLength(); - for (int i = 0; i < count; i++) - { - _Log.Debug(string.Concat("TriggerEvent - {", reportFullPath, "} ", i, " of ", count)); - parameters = _Description.GetParameterValues(_FileRead, Equipment, extractResults.Item2.Value, i); - if (!(_EquipmentEvent is null)) - Equipment.DataCollection.TriggerEvent(_EquipmentEvent, parameters); - if (_ConfigDataBase.UseCyclicalForDescription) - break; - } - if (_ConfigDataBase.IsDatabaseExportToIPDSF && count > 0) - { - _Log.Debug(string.Concat("TriggerEvent - {", reportFullPath, "} ", null, " of ", count)); - parameters = _Description.GetParameterValues(_FileRead, Equipment, extractResults.Item2.Value, null); - if (!(_EquipmentEvent is null)) - Equipment.DataCollection.TriggerEvent(_EquipmentEvent, parameters); - } - } - - private void TriggerEvents(string reportFullPath, Tuple> extractResults, Dictionary eventDataList, int count) - { - const string DATA_LIST_KEY = "DataList"; - const int RESULT_CODE_SUCCESS = 0; - const string RESULT_CODE_KEY = "ReturnCode"; - const string RESULT_EMAIL_FAILURE_TYPE = "ReturnEmailFailureType"; - const string RESULT_EMAIL_FAILURE_NONE = "EmailFailureNone"; - const string RESULT_TEXT_KEY = "ReturnText"; - List parameters; - for (int i = 0; i < count; i++) - { - _Log.Debug(string.Concat("TriggerEvent - {", reportFullPath, "} ", i, " of ", count)); - //parameters = _Description.GetParameterValues(this, Equipment, extractResults.Item2, count, i); - // add the final results fields to the data dictionary - Dictionary finalDictionary = new Dictionary - { - [RESULT_CODE_KEY] = RESULT_CODE_SUCCESS, - [RESULT_TEXT_KEY] = "success", - [RESULT_EMAIL_FAILURE_TYPE] = RESULT_EMAIL_FAILURE_NONE, - [DATA_LIST_KEY] = eventDataList - }; - // trigger File Read event - //Equipment.DataCollection.TriggerEvent(mFileReadEvent, new List() { new ParameterValue(mMyParameter, finalDictionary) }); - // - parameters = _Description.GetParameterValues(_FileRead, Equipment, extractResults.Item2.Value, i, keyValuePairs: finalDictionary); - if (!(_EquipmentEvent is null)) - Equipment.DataCollection.TriggerEvent(_EquipmentEvent, parameters); - if (_ConfigDataBase.UseCyclicalForDescription) - break; - } - if (_ConfigDataBase.IsDatabaseExportToIPDSF && count > 0) - { - _Log.Debug(string.Concat("TriggerEvent - {", reportFullPath, "} ", null, " of ", count)); - parameters = _Description.GetParameterValues(_FileRead, Equipment, extractResults.Item2.Value, null); - if (!(_EquipmentEvent is null)) - Equipment.DataCollection.TriggerEvent(_EquipmentEvent, parameters); - } - } - - } - -} \ No newline at end of file diff --git a/Helpers/ConfigData.Level.cs b/Helpers/ConfigData.Level.cs deleted file mode 100644 index 13dceb1..0000000 --- a/Helpers/ConfigData.Level.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace MET08DDUPSFS6420.Helpers -{ - - public partial class ConfigData - { - public enum Level - { - IsXToOpenInsightMetrologyViewer, //MetrologyWS.SendData(logic, string.Concat("http://", serverName, "/api/inbound/Tencor"), headerAttachments, detailAttachments); - IsXToIQSSi, //bool WriteFileSPC(Dictionary - IsXToIQSGaN, //GAN_PPTST - IsXToOpenInsight, //bool WriteFileOpenInsight(Dictionary - IsXToOpenInsightMetrologyViewerAttachments, //Site-Two - IsXToAPC, - IsXToSPaCe, - IsXToArchive, - IsArchive, - IsDummy, - IsNaEDA - } - - public static List> LevelTuples - { - get - { - return new List> - { - new Tuple(0, Level.IsNaEDA, @"\EC_EDA\Staging\Traces\~\Source"), - new Tuple(15, Level.IsXToOpenInsightMetrologyViewer, @"\EC_EAFLog\TracesMES\~\Source"), - new Tuple(36, Level.IsXToIQSSi, @"\EC_SPC_Si\Traces\~\PollPath"), - new Tuple(36, Level.IsXToIQSGaN, @"\EC_SPC_GaN\Traces\~\PollPath"), - new Tuple(36, Level.IsXToOpenInsight, @"\\messa01ec.ec.local\APPS\Metrology\~\Source"), - new Tuple(36, Level.IsXToOpenInsightMetrologyViewerAttachments, @"\EC_Characterization_Si\In Process\~\Source"), - new Tuple(360, Level.IsXToAPC, @"\EC_APC\Staging\Traces\~\PollPath"), - new Tuple(-36, Level.IsXToSPaCe, @"\EC_SPC_Si\Traces\~\Source"), - new Tuple(180, Level.IsXToArchive, @"\EC_EAFLog\TracesArchive\~\Source"), - new Tuple(36, Level.IsArchive, @"\EC_Characterization_Si\Processed") - //new Tuple("IsDummy" - }; - } - } - - } - -} diff --git a/Helpers/ConfigData.cs b/Helpers/ConfigData.cs deleted file mode 100644 index 323fb69..0000000 --- a/Helpers/ConfigData.cs +++ /dev/null @@ -1,553 +0,0 @@ -using Eaf.Management.ConfigurationData.CellAutomation; -using Ifx.Eaf.EquipmentConnector.File.Configuration; -using Infineon.Monitoring.MonA; -using Shared; -using Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Text.Json; -using System.Threading; - -namespace MET08DDUPSFS6420.Helpers -{ - - public partial class ConfigData : ConfigDataBase - { - - internal const object NullData = null; - internal const int MinFileLength = 100; - - public string IqsFile { get; private set; } - public string OpenInsightFilePattern { get; private set; } - public string IqsQueryFilter { get; private set; } - public string TracePath { get; private set; } - public string VillachPath { get; private set; } - public string ProgressPath { get; private set; } - public string MemoryPath { get; private set; } - public bool IsSourceIPDSF { get; private set; } - public bool IsSourceTimer { get; private set; } - public bool IsDatabaseExportToIPDSF { get; private set; } - public string OpenInsightSiViewer { get; private set; } - public string OpenInsightMetrogyViewerAPI { get; private set; } - public Level? Duplicator { get; private set; } - public static Dictionary> DummyRuns { get; private set; } - public FileConnectorConfiguration FileConnectorConfiguration { get; private set; } - public string GhostPCLFileName { get; private set; } - public string NoWaferMap { get; private set; } - - private Timer _Timer; - private int _LastDummyRunIndex; - private readonly Calendar _Calendar; - private readonly string _ReportFullPath; - - public ConfigData(ILogic logic, string equipmentElementName, EquipmentConnection? equipmentConnection, string cellName, FileConnectorConfiguration fileConnectorConfiguration, IList configuredParameters, EventName? eventName, bool isEAFHosted) : base(equipmentElementName, equipmentConnection, cellName, eventName, isEAFHosted) - { - EafHosted = isEAFHosted; - _LastDummyRunIndex = -1; - UseCyclicalForDescription = false; - EquipmentConnection = equipmentConnection; - EquipmentElementName = equipmentElementName; - CultureInfo cultureInfo = new CultureInfo("en-US"); - _Calendar = cultureInfo.Calendar; - FileConnectorConfiguration = fileConnectorConfiguration; - string firstSourceFileFilter = fileConnectorConfiguration.SourceFileFilter.Split('|')[0]; - IsSourceIPDSF = (fileConnectorConfiguration.SourceFileFilter == "*.ipdsf"); - IsSourceTimer = (fileConnectorConfiguration.SourceFileFilter == "*Timer.txt"); - IsDatabaseExportToIPDSF = (fileConnectorConfiguration.SourceFileLocation.Contains("DatabaseExport")); - if (DummyRuns is null) - DummyRuns = new Dictionary>(); - bool isDuplicator = cellInstanceConnectionName.StartsWith(cellName); - int level = (cellInstanceConnectionName.Length - cellInstanceConnectionName.Replace("-", string.Empty).Length); - if (IsSourceIPDSF && isDuplicator) - IsSourceIPDSF = false; - if (!isDuplicator) - Duplicator = null; - else - { - CellNames.Add(cellName, cellName); - MesEntities.Add(cellName, cellName); - Duplicator = (Level)level; - } - IProcessDataDescription processDataDescription; - if (isDuplicator) - processDataDescription = new Duplicator.Description(); - else - { - switch (eventName.Value) - { - case EventName.FileRead: processDataDescription = new ProcessData.FileRead.Description(); break; - default: throw new Exception(); - } - } - _ProcessDataDescription = processDataDescription; - if (!isEAFHosted) - WriteExportAliases(logic, cellName); - GhostPCLFileName = string.Concat(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), @"\gpcl6win64.exe"); - if (EafHosted && Duplicator.HasValue && Duplicator.Value == Level.IsXToOpenInsightMetrologyViewerAttachments && !File.Exists(GhostPCLFileName)) - throw new Exception("Ghost PCL FileName doesn't Exist!"); - //LincPDFCFileName = string.Concat(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), @"\LincPDFC.exe"); - if (!modelObjectParameterDefinitions.Any()) - { - CellNames.Add(cellName, "****"); - MesEntities.Add(cellName, "****"); - } - else - { - int index; - string key; - string variable = string.Empty; - Dictionary iqsSection = new Dictionary(); - Dictionary pathSection = new Dictionary(); - Dictionary commonSection = new Dictionary(); - Dictionary openInsightSection = new Dictionary(); - foreach (ModelObjectParameterDefinition modelObjectParameterDefinition in modelObjectParameterDefinitions) - { - if (!modelObjectParameterDefinition.Name.Contains('.')) - continue; - index = modelObjectParameterDefinition.Name.IndexOf("."); - if (index <= -1) - continue; - key = modelObjectParameterDefinition.Name.Substring(0, index); - variable = modelObjectParameterDefinition.Name.Substring(index + 1); - if (key == "COMMON") - commonSection.Add(variable, modelObjectParameterDefinition.Value); - //else if (key == "CONNECTION STRINGS") - // connectionStringsSection.Add(variable, modelObjectParameterDefinition.Value); - else if (key == "IQS") - iqsSection.Add(variable, modelObjectParameterDefinition.Value); - else if (key == "OpenInsight") - openInsightSection.Add(variable, modelObjectParameterDefinition.Value); - else if (key == "PATH") - pathSection.Add(variable, modelObjectParameterDefinition.Value); - //else if (key == "REACTOR") - // reactorTuples.Add(new Tuple(variable, modelObjectParameterDefinition.Value)); - //else if (key == "TIBCO") - // tibcoSection.Add(variable, modelObjectParameterDefinition.Value); - else - throw new Exception(); - } - if (!iqsSection.Any()) - throw new Exception("IQS section is missing from configuration"); - else - { - key = "FILE"; - if (iqsSection.ContainsKey(key)) - IqsFile = iqsSection[key]; - else - throw new Exception(string.Concat("Missing IQS Configuration entry for ", key)); - if (string.IsNullOrEmpty(IqsFile)) - throw new Exception(string.Format("IQS key {0} is empty", key)); - key = "QUERY"; - if (iqsSection.ContainsKey(key)) - IqsQueryFilter = iqsSection[key]; - else - throw new Exception(string.Concat("Missing IQS Configuration entry for ", key)); - if (string.IsNullOrEmpty(IqsQueryFilter)) - throw new Exception(string.Format("IQS key {0} is empty", key)); - } - if (!pathSection.Any()) - throw new Exception("Path section is missing from configuration"); - else - { - key = "TRACE"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - TracePath = pathSection[key]; - if (!string.IsNullOrEmpty(TracePath) && !Directory.Exists(TracePath)) - Directory.CreateDirectory(TracePath); - key = "VILLACH"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - VillachPath = pathSection[key]; - if (!string.IsNullOrEmpty(VillachPath) && !Directory.Exists(VillachPath)) - Directory.CreateDirectory(VillachPath); - key = "Progress"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - ProgressPath = pathSection[key]; - if (!string.IsNullOrEmpty(ProgressPath) && Directory.Exists(Path.GetPathRoot(ProgressPath)) && !Directory.Exists(ProgressPath)) - Directory.CreateDirectory(ProgressPath); - key = "Memory"; - if (pathSection.ContainsKey(key) && pathSection[key].StartsWith(@"\\")) - MemoryPath = pathSection[key]; - if (!string.IsNullOrEmpty(MemoryPath) && !Directory.Exists(MemoryPath)) - Directory.CreateDirectory(MemoryPath); - } - if (!commonSection.Any()) - throw new Exception("Common section is missing from configuration"); - else - { - key = "CELL_NAMES"; - if (!commonSection.ContainsKey(key) || !commonSection[key].Contains(';') || !commonSection[key].Contains(':')) - throw new Exception(); - else - { - string[] segments; - string[] cellNames = commonSection[key].Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); - foreach (string item in cellNames) - { - segments = item.Split(':'); - CellNames.Add(segments[0].Trim(), segments[1].Trim()); - } - } - if (!string.IsNullOrEmpty(cellName) && !CellNames.ContainsKey(cellName)) - throw new Exception(); - key = "MES_ENTITIES"; - if (!commonSection.ContainsKey(key) || !commonSection[key].Contains(';') || !commonSection[key].Contains(':')) throw new Exception(); - else - { - string[] segments; - string[] mesEntity = commonSection[key].Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); - foreach (string item in mesEntity) - { - segments = item.Split(':'); - MesEntities.Add(segments[0].Trim(), segments[1].Trim()); - } - } - if (!string.IsNullOrEmpty(cellName) && !MesEntities.ContainsKey(cellName)) - throw new Exception(); - key = "NoWaferMap"; - if (commonSection.ContainsKey(key)) - NoWaferMap = commonSection[key]; - if (string.IsNullOrEmpty(NoWaferMap)) - throw new Exception(string.Format("Common key {0} is empty", key)); - if (Duplicator.HasValue && Duplicator.Value == Level.IsXToOpenInsightMetrologyViewerAttachments && !File.Exists(NoWaferMap)) - throw new Exception(string.Format("Common key {0} is doesn't exist!", key)); - } - if (!openInsightSection.Any()) - throw new Exception("OpenInsight section is missing from configuration"); - else - { - key = "MetrologyViewerAPI"; - if (openInsightSection.ContainsKey(key)) - OpenInsightMetrogyViewerAPI = openInsightSection[key]; - if (string.IsNullOrEmpty(OpenInsightMetrogyViewerAPI)) - throw new Exception(string.Format("OpenInsight key {0} is empty", key)); - if (!OpenInsightMetrogyViewerAPI.Contains(":") || !OpenInsightMetrogyViewerAPI.Contains(".")) - throw new Exception(string.Format("OpenInsight key {0} is invalid", key)); - key = "SiViewer"; - if (openInsightSection.ContainsKey(key)) - OpenInsightSiViewer = openInsightSection[key]; - if (string.IsNullOrEmpty(OpenInsightSiViewer)) - throw new Exception(string.Format("OpenInsight key {0} is empty", key)); - if (!OpenInsightSiViewer.Contains(":") || !OpenInsightSiViewer.Contains(".")) - throw new Exception(string.Format("OpenInsight key {0} is invalid", key)); - key = "FilePattern"; - if (openInsightSection.ContainsKey(key)) - OpenInsightFilePattern = openInsightSection[key]; - else - throw new Exception(string.Concat("Missing OpenInsight Configuration entry for ", key)); - if (string.IsNullOrEmpty(OpenInsightFilePattern)) - throw new Exception(string.Format("OpenInsight key {0} is empty", key)); - } - if (!MesEntities.Any()) - throw new Exception(); - if (IsSourceTimer || IsDatabaseExportToIPDSF || (Duplicator.HasValue && Duplicator.Value == Level.IsDummy)) - { - if (!Directory.Exists(fileConnectorConfiguration.SourceFileLocation)) - Directory.CreateDirectory(fileConnectorConfiguration.SourceFileLocation); - _ReportFullPath = string.Concat(fileConnectorConfiguration.SourceFileLocation, firstSourceFileFilter.Replace("*", @"\")); - if (Debugger.IsAttached || fileConnectorConfiguration.PreProcessingMode == FileConnectorConfiguration.PreProcessingModeEnum.Process) - Callback(null); - else - { - int milliSeconds; - milliSeconds = (fileConnectorConfiguration.FileScanningIntervalInSeconds * 1000) / 2; - _Timer = new Timer(Callback, null, milliSeconds, Timeout.Infinite); milliSeconds += 2000; - } - } - } - } - - private void CallbackIsDummy() - { - DateTime dateTime = DateTime.Now; - bool check = (dateTime.Hour > 7 && dateTime.Hour < 18 && dateTime.DayOfWeek != DayOfWeek.Sunday && dateTime.DayOfWeek != DayOfWeek.Saturday); - if (check) - { - int fileCount; - string[] files; - string monARessource; - string checkDirectory; - string sourceArchiveFile; - string sourceFileLocation; - string targetFileLocation; - string inProcessDirectory; - string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - string traceDummyDirectory = string.Concat(Path.GetPathRoot(TracePath), @"\TracesDummy\", _CellName, @"\Source\", dateTime.ToString("yyyy"), "___Week_", weekOfYear); - if (!Directory.Exists(traceDummyDirectory)) - Directory.CreateDirectory(traceDummyDirectory); - string traceDummyFile = string.Concat(traceDummyDirectory, @"\", dateTime.Ticks, " - ", _CellName, ".txt"); - File.AppendAllText(traceDummyFile, string.Empty); - List> tuples = new List>(); - foreach (var keyValuePair in CellNames) - { - monARessource = keyValuePair.Key; - if (!keyValuePair.Value.Contains(@"\")) - continue; - foreach (string sourceFileFilter in FileConnectorConfiguration.SourceFileFilter.Split('|')) - { - if (sourceFileFilter.ToLower().StartsWith(keyValuePair.Value.Replace(@"\", string.Empty))) - sourceFileLocation = Path.GetFullPath(FileConnectorConfiguration.SourceFileLocation); - else if (FileConnectorConfiguration.SourceFileLocation.ToLower().EndsWith(keyValuePair.Value)) - sourceFileLocation = Path.GetFullPath(FileConnectorConfiguration.SourceFileLocation); - else - sourceFileLocation = Path.GetFullPath(string.Concat(FileConnectorConfiguration.SourceFileLocation, @"\", keyValuePair.Value)); - sourceArchiveFile = Path.GetFullPath(string.Concat(sourceFileLocation, @"\", sourceFileFilter)); - targetFileLocation = Path.GetFullPath(string.Concat(FileConnectorConfiguration.TargetFileLocation, @"\", keyValuePair.Value)); - if (!File.Exists(sourceArchiveFile)) - continue; - if (!DummyRuns.ContainsKey(monARessource)) - DummyRuns.Add(monARessource, new List()); - tuples.Add(new Tuple(monARessource, sourceFileLocation, targetFileLocation, sourceArchiveFile, 0)); - } - } - File.AppendAllLines(traceDummyFile, from l in tuples select l.Item4); - if (tuples.Any()) - { - _LastDummyRunIndex += 1; - if (_LastDummyRunIndex >= tuples.Count) - _LastDummyRunIndex = 0; - monARessource = tuples[_LastDummyRunIndex].Item1; - sourceFileLocation = tuples[_LastDummyRunIndex].Item2; - targetFileLocation = tuples[_LastDummyRunIndex].Item3; - sourceArchiveFile = tuples[_LastDummyRunIndex].Item4; - //fileCount = tuples[_LastDummyRunIndex].Item5; - tuples.Clear(); - if (long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) - { - if (!DummyRuns[monARessource].Contains(sequence)) - DummyRuns[monARessource].Add(sequence); - inProcessDirectory = string.Concat(ProgressPath, @"\", monARessource, @"\Dummy_in process\", sequence); - checkDirectory = inProcessDirectory; - if (!Directory.Exists(checkDirectory)) - Directory.CreateDirectory(checkDirectory); - files = Directory.GetFiles(checkDirectory, "*", SearchOption.AllDirectories); - fileCount = files.Length; - if (files.Any()) - { - if (files.Length > 250) - throw new Exception("Safety net!"); - try - { - foreach (string file in files) - File.Delete(file); - } - catch (Exception) { } - } - tuples.Add(new Tuple(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); - checkDirectory = targetFileLocation; - files = Directory.GetFiles(checkDirectory, string.Concat("*", sequence, "*"), SearchOption.TopDirectoryOnly); - fileCount = files.Length; - tuples.Add(new Tuple(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); - } - } - if (tuples.Any()) - { - const string site = "sjc"; - MonIn monIn = MonIn.GetInstance(); - string stateName = string.Concat("Dummy_", _EventName); - foreach (Tuple item in tuples) - { - monARessource = item.Item1; - sourceArchiveFile = item.Item2; - inProcessDirectory = item.Item3; - checkDirectory = item.Item4; - fileCount = item.Item5; - try - { - if (fileCount > 0 || string.IsNullOrEmpty(checkDirectory)) - { - File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Warning.ToString() }); - monIn.SendStatus(site, monARessource, stateName, State.Warning); - for (int i = 1; i < 12; i++) - Thread.Sleep(500); - } - else if (inProcessDirectory != checkDirectory) - { - if (!File.Exists(sourceArchiveFile)) - continue; - if (!long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) - continue; - ZipFile.ExtractToDirectory(sourceArchiveFile, inProcessDirectory); - if (FileConnectorConfiguration.IncludeSubDirectories) - files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.AllDirectories); - else - files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.TopDirectoryOnly); - if (files.Length > 250) - throw new Exception("Safety net!"); - foreach (string file in files) - File.SetLastWriteTime(file, new DateTime(sequence)); - if (!FileConnectorConfiguration.IncludeSubDirectories) - { - foreach (string file in files) - File.Move(file, string.Concat(checkDirectory, @"\", Path.GetFileName(file))); - } - else - { - string[] directories = Directory.GetDirectories(inProcessDirectory, "*", SearchOption.AllDirectories); - foreach (string directory in directories) - Directory.CreateDirectory(string.Concat(checkDirectory, directory.Substring(inProcessDirectory.Length))); - foreach (string file in files) - File.Move(file, string.Concat(checkDirectory, file.Substring(inProcessDirectory.Length))); - } - File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Ok.ToString() }); - monIn.SendStatus(site, monARessource, stateName, State.Ok); - } - } - catch (Exception exception) - { - File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Critical.ToString(), exception.Message, exception.StackTrace }); - monIn.SendStatus(site, monARessource, stateName, State.Critical); - try - { - Eaf.Core.Smtp.ISmtp smtp = Eaf.Core.Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); - Eaf.Core.Smtp.EmailMessage emailMessage = new Eaf.Core.Smtp.EmailMessage(string.Concat("Exception:", EquipmentElementName), string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace), Eaf.Core.Smtp.MailPriority.High); - smtp.Send(emailMessage); - } - catch (Exception) { } - } - } - } - } - } - - private void Callback(object state) - { - try - { - if (Duplicator is null) - { - if (File.Exists(_ReportFullPath)) - File.Delete(_ReportFullPath); - File.WriteAllText(_ReportFullPath, string.Empty); - } - else if (Duplicator.Value == Level.IsDummy) - CallbackIsDummy(); - else - throw new Exception(); - } - catch (Exception exception) - { - try - { - Eaf.Core.Smtp.ISmtp smtp = Eaf.Core.Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); - Eaf.Core.Smtp.EmailMessage emailMessage = new Eaf.Core.Smtp.EmailMessage(string.Concat("Exception:", EquipmentElementName), string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace), Eaf.Core.Smtp.MailPriority.High); - smtp.Send(emailMessage); - } - catch (Exception) { } - } - try - { - TimeSpan timeSpan; - if (IsDatabaseExportToIPDSF) - timeSpan = new TimeSpan(DateTime.Now.AddMinutes(1).Ticks - DateTime.Now.Ticks); - else if (IsSourceTimer) - timeSpan = new TimeSpan(DateTime.Now.AddMinutes(15).Ticks - DateTime.Now.Ticks); - else if (Duplicator.HasValue && Duplicator.Value == Level.IsDummy) - timeSpan = new TimeSpan(DateTime.Now.AddSeconds(FileConnectorConfiguration.FileScanningIntervalInSeconds).Ticks - DateTime.Now.Ticks); - else if (Duplicator.HasValue) - timeSpan = new TimeSpan(DateTime.Now.AddSeconds(30).Ticks - DateTime.Now.Ticks); - else - timeSpan = new TimeSpan(DateTime.Now.AddDays(.5).Ticks - DateTime.Now.Ticks); - if (!(_Timer is null)) - _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); - else - _Timer = new Timer(Callback, null, (long)timeSpan.TotalMilliseconds, Timeout.Infinite); - } - catch (Exception exception) - { - try - { - Eaf.Core.Smtp.ISmtp smtp = Eaf.Core.Backbone.Instance.GetBackboneComponentsOfType().SingleOrDefault(); - Eaf.Core.Smtp.EmailMessage emailMessage = new Eaf.Core.Smtp.EmailMessage(string.Concat("Exception:", EquipmentElementName), string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace), Eaf.Core.Smtp.MailPriority.High); - smtp.Send(emailMessage); - } - catch (Exception) { } - } - } - - public string GetCurrentReactorKey(Logistics logistics) - { - throw new Exception(); - } - - public Tuple> GetResults(ILogic logic, List fileInfoCollection, ProcessData processData) - { - Tuple> results; - List tests = new List(); - List descriptions; - if (_EventName.Value == EventName.FileRead && processData.Details.Any()) - { - foreach (var item in processData.Details) - tests.Add(Test.Tencor); - descriptions = _ProcessDataDescription.GetDescription(logic, this, tests, processData); - } - else - throw new Exception(); - if (!EafHosted) - { - new ProcessData.FileRead.Description().GetDescription(logic, this, tests, processData); - } - if (tests.Count != descriptions.Count) - throw new Exception(); - for (int i = 0; i < tests.Count; i++) - { - if (descriptions[i].Test != (int)tests[i]) - throw new Exception(); - } - string json; - if (descriptions[0] is Duplicator.Description) - { - List duplicatorDescriptions = (from l in descriptions select (Duplicator.Description)l).ToList(); - json = JsonSerializer.Serialize(duplicatorDescriptions, duplicatorDescriptions.GetType()); - } - else if (descriptions[0] is ProcessData.FileRead.Description) - { - List fileReadDescriptions = (from l in descriptions select (ProcessData.FileRead.Description)l).ToList(); - json = JsonSerializer.Serialize(fileReadDescriptions, fileReadDescriptions.GetType()); - } - else - throw new Exception(); - object @object = JsonSerializer.Deserialize(json); - if (!(@object is JsonElement jsonElement)) - throw new Exception(); - results = new Tuple>(logic.Logistics.Logistics1[0], jsonElement, fileInfoCollection); - return results; - } - - public Dictionary> GetKeyValuePairs(JsonElement jsonElement, List processDataDescriptions, bool extra = false) - { - Dictionary> results = GetKeyValuePairs(processDataDescriptions); - List tests = new List(); - foreach (Test test in results.Keys) - { - if (test == Test.Tencor) - { - if (!(_ProcessDataDescription is ProcessData.FileRead.Description)) - _ProcessDataDescription = new ProcessData.FileRead.Description(); - } - else - throw new Exception(); - } - return results; - } - - public List GetProcessDataFileReadDescriptions(JsonElement jsonElement) - { - List results = new List(); - List processDataDescriptions = GetIProcessDataDescriptions(jsonElement); - foreach (IProcessDataDescription processDataDescription in processDataDescriptions) - { - if (!(processDataDescription is ProcessData.FileRead.Description description)) - continue; - results.Add(description); - } - return results; - } - - } - -} diff --git a/Helpers/ProcessData.DataFile.cs b/Helpers/ProcessData.DataFile.cs deleted file mode 100644 index 13fcc2f..0000000 --- a/Helpers/ProcessData.DataFile.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace MET08DDUPSFS6420.Helpers -{ - - public partial class ProcessData - { - - public class DataFile - { - - public long Id { get; set; } - public string AreaCount { get; set; } - public string AreaTotal { get; set; } - public string Bin1 { get; set; } - public string Bin2 { get; set; } - public string Bin3 { get; set; } - public string Bin4 { get; set; } - public string Bin5 { get; set; } - public string Bin6 { get; set; } - public string Bin7 { get; set; } - public string Bin8 { get; set; } - public string Comments { get; set; } - public string Date { get; set; } - public string Diameter { get; set; } - public string Exclusion { get; set; } - public string Gain { get; set; } - public string HazeAverage { get; set; } - public string HazePeak { get; set; } - public string HazeRegion { get; set; } - public string HazeRng { get; set; } - public string HeaderUniqueId { get; set; } - public string LPDCM2 { get; set; } - public string LPDCount { get; set; } - public string Laser { get; set; } - public string Mean { get; set; } - public string Recipe { get; set; } - public string ScratchCount { get; set; } - public string ScratchTotal { get; set; } - public string Slot { get; set; } - public string Sort { get; set; } - public string StdDev { get; set; } - public string SumOfDefects { get; set; } - public string Thresh { get; set; } - public string Thruput { get; set; } - public string Title { get; set; } - public string UniqueId { get; set; } - public string Data { get; set; } - public int i { get; set; } - - } - - } - -} diff --git a/Helpers/ProcessData.FileRead.Description.cs b/Helpers/ProcessData.FileRead.Description.cs deleted file mode 100644 index a7dd00a..0000000 --- a/Helpers/ProcessData.FileRead.Description.cs +++ /dev/null @@ -1,472 +0,0 @@ -using Shared; -using Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; - -namespace MET08DDUPSFS6420.Helpers -{ - - public partial class ProcessData - { - - public class FileRead - { - - public class Description : IProcessDataDescription - { - - public int Test { get; set; } - public int Count { get; set; } - public int Index { get; set; } - // - public string EventName { get; set; } - public string NullData { get; set; } - public string JobID { get; set; } - public string Sequence { get; set; } - public string MesEntity { get; set; } - public string ReportFullPath { get; set; } - public string ProcessJobID { get; set; } - public string MID { get; set; } - // - public string Date { get; set; } - public string Employee { get; set; } - public string Lot { get; set; } - public string PSN { get; set; } - public string Reactor { get; set; } - public string Recipe { get; set; } - // - public string Comments { get; set; } - public string Diameter { get; set; } - public string Exclusion { get; set; } - public string Gain { get; set; } - public string HeaderUniqueId { get; set; } - public string Laser { get; set; } - public string ParseErrorText { get; set; } - public string RDS { get; set; } - public string Slot { get; set; } - public string UniqueId { get; set; } - // - public string AreaCount { get; set; } - public string AreaCountAvg { get; set; } - public string AreaCountMax { get; set; } - public string AreaCountMin { get; set; } - public string AreaCountStdDev { get; set; } - public string AreaTotal { get; set; } - public string AreaTotalAvg { get; set; } - public string AreaTotalMax { get; set; } - public string AreaTotalMin { get; set; } - public string AreaTotalStdDev { get; set; } - public string Bin1 { get; set; } - public string Bin2 { get; set; } - public string Bin3 { get; set; } - public string Bin4 { get; set; } - public string Bin5 { get; set; } - public string Bin6 { get; set; } - public string Bin7 { get; set; } - public string Bin8 { get; set; } - public string HazeAverage { get; set; } - public string HazeAverageAvg { get; set; } - public string HazeAverageMax { get; set; } - public string HazeAverageMin { get; set; } - public string HazeAverageStdDev { get; set; } - public string HazePeak { get; set; } - public string HazeRegion { get; set; } - public string HazeRegionAvg { get; set; } - public string HazeRegionMax { get; set; } - public string HazeRegionMin { get; set; } - public string HazeRegionStdDev { get; set; } - public string HazeRng { get; set; } - public string LPDCM2 { get; set; } - public string LPDCM2Avg { get; set; } - public string LPDCM2Max { get; set; } - public string LPDCM2Min { get; set; } - public string LPDCM2StdDev { get; set; } - public string LPDCount { get; set; } - public string LPDCountAvg { get; set; } - public string LPDCountMax { get; set; } - public string LPDCountMin { get; set; } - public string LPDCountStdDev { get; set; } - public string Mean { get; set; } - public string ScratchCount { get; set; } - public string ScratchCountAvg { get; set; } - public string ScratchCountMax { get; set; } - public string ScratchCountMin { get; set; } - public string ScratchCountStdDev { get; set; } - public string ScratchTotal { get; set; } - public string ScratchTotalAvg { get; set; } - public string ScratchTotalMax { get; set; } - public string ScratchTotalMin { get; set; } - public string ScratchTotalStdDev { get; set; } - public string Sort { get; set; } - public string StdDev { get; set; } - public string SumOfDefects { get; set; } - public string SumOfDefectsAvg { get; set; } - public string SumOfDefectsMax { get; set; } - public string SumOfDefectsMin { get; set; } - public string SumOfDefectsStdDev { get; set; } - public string Thresh { get; set; } - public string Thruput { get; set; } - // - public object Data { get; set; } - public object Parameters { get; set; } - - public string GetEventName() { return nameof(FileRead); } - public string GetEventDescription() { return "File Has been read and parsed"; } - - public List GetHeaderNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List - { - nameof(Date), - nameof(Employee), - nameof(Lot), - nameof(PSN), - nameof(Reactor), - nameof(Recipe) - }; - return results; - } - - public List GetDetailNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List - { - nameof(Comments), - nameof(Diameter), - nameof(Exclusion), - nameof(Gain), - nameof(HeaderUniqueId), - nameof(Laser), - nameof(ParseErrorText), - nameof(RDS), - nameof(Slot), - nameof(UniqueId) - }; - return results; - } - - public List GetParameterNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List - { - nameof(AreaCount), - nameof(AreaCountAvg), - nameof(AreaCountMax), - nameof(AreaCountMin), - nameof(AreaCountStdDev), - nameof(AreaTotal), - nameof(AreaTotalAvg), - nameof(AreaTotalMax), - nameof(AreaTotalMin), - nameof(AreaTotalStdDev), - nameof(Bin1), - nameof(Bin2), - nameof(Bin3), - nameof(Bin4), - nameof(Bin5), - nameof(Bin6), - nameof(Bin7), - nameof(Bin8), - nameof(HazeAverage), - nameof(HazeAverageAvg), - nameof(HazeAverageMax), - nameof(HazeAverageMin), - nameof(HazeAverageStdDev), - nameof(HazePeak), - nameof(HazeRegion), - nameof(HazeRegionAvg), - nameof(HazeRegionMax), - nameof(HazeRegionMin), - nameof(HazeRegionStdDev), - nameof(HazeRng), - nameof(LPDCM2), - nameof(LPDCM2Avg), - nameof(LPDCM2Max), - nameof(LPDCM2Min), - nameof(LPDCM2StdDev), - nameof(LPDCount), - nameof(LPDCountAvg), - nameof(LPDCountMax), - nameof(LPDCountMin), - nameof(LPDCountStdDev), - nameof(Mean), - nameof(ScratchCount), - nameof(ScratchCountAvg), - nameof(ScratchCountMax), - nameof(ScratchCountMin), - nameof(ScratchCountStdDev), - nameof(ScratchTotal), - nameof(ScratchTotalAvg), - nameof(ScratchTotalMax), - nameof(ScratchTotalMin), - nameof(ScratchTotalStdDev), - nameof(Sort), - nameof(StdDev), - nameof(SumOfDefects), - nameof(SumOfDefectsAvg), - nameof(SumOfDefectsMax), - nameof(SumOfDefectsMin), - nameof(SumOfDefectsStdDev), - nameof(Thresh), - nameof(Thruput) - }; - return results; - } - - public List GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test) - { - List results = new List(); - return results; - } - - public List GetNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - IProcessDataDescription processDataDescription = GetDefault(logic, configDataBase); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - object @object = JsonSerializer.Deserialize(json); - if (!(@object is JsonElement jsonElement)) - throw new Exception(); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - results.Add(jsonProperty.Name); - return results; - } - - public IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase) - { - Description result = new Description(); - return result; - } - - public IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase) - { - Description result = new Description - { - Test = -1, - Count = 0, - Index = -1, - // - EventName = GetEventName(), - NullData = string.Empty, - JobID = logic.Logistics.JobID, - Sequence = logic.Logistics.Sequence.ToString(), - MesEntity = logic.Logistics.MesEntity, - ReportFullPath = logic.Logistics.ReportFullPath, - ProcessJobID = logic.Logistics.ProcessJobID, - MID = logic.Logistics.MID, - // - Date = nameof(Date), - Employee = nameof(Employee), - Lot = nameof(Lot), - PSN = nameof(PSN), - Reactor = nameof(Reactor), - Recipe = nameof(Recipe), - // - Comments = nameof(Comments), - Diameter = nameof(Diameter), - Exclusion = nameof(Exclusion), - Gain = nameof(Gain), - HeaderUniqueId = nameof(HeaderUniqueId), - Laser = nameof(Laser), - ParseErrorText = nameof(ParseErrorText), - RDS = nameof(RDS), - Slot = nameof(Slot), - UniqueId = nameof(UniqueId), - // - AreaCount = nameof(AreaCount), - AreaCountAvg = nameof(AreaCountAvg), - AreaCountMax = nameof(AreaCountMax), - AreaCountMin = nameof(AreaCountMin), - AreaCountStdDev = nameof(AreaCountStdDev), - AreaTotal = nameof(AreaTotal), - AreaTotalAvg = nameof(AreaTotalAvg), - AreaTotalMax = nameof(AreaTotalMax), - AreaTotalMin = nameof(AreaTotalMin), - AreaTotalStdDev = nameof(AreaTotalStdDev), - Bin1 = nameof(Bin1), - Bin2 = nameof(Bin2), - Bin3 = nameof(Bin3), - Bin4 = nameof(Bin4), - Bin5 = nameof(Bin5), - Bin6 = nameof(Bin6), - Bin7 = nameof(Bin7), - Bin8 = nameof(Bin8), - HazeAverage = nameof(HazeAverage), - HazeAverageAvg = nameof(HazeAverageAvg), - HazeAverageMax = nameof(HazeAverageMax), - HazeAverageMin = nameof(HazeAverageMin), - HazeAverageStdDev = nameof(HazeAverageStdDev), - HazePeak = nameof(HazePeak), - HazeRegion = nameof(HazeRegion), - HazeRegionAvg = nameof(HazeRegionAvg), - HazeRegionMax = nameof(HazeRegionMax), - HazeRegionMin = nameof(HazeRegionMin), - HazeRegionStdDev = nameof(HazeRegionStdDev), - HazeRng = nameof(HazeRng), - LPDCM2 = nameof(LPDCM2), - LPDCM2Avg = nameof(LPDCM2Avg), - LPDCM2Max = nameof(LPDCM2Max), - LPDCM2Min = nameof(LPDCM2Min), - LPDCM2StdDev = nameof(LPDCM2StdDev), - LPDCount = nameof(LPDCount), - LPDCountAvg = nameof(LPDCountAvg), - LPDCountMax = nameof(LPDCountMax), - LPDCountMin = nameof(LPDCountMin), - LPDCountStdDev = nameof(LPDCountStdDev), - Mean = nameof(Mean), - ScratchCount = nameof(ScratchCount), - ScratchCountAvg = nameof(ScratchCountAvg), - ScratchCountMax = nameof(ScratchCountMax), - ScratchCountMin = nameof(ScratchCountMin), - ScratchCountStdDev = nameof(ScratchCountStdDev), - ScratchTotal = nameof(ScratchTotal), - ScratchTotalAvg = nameof(ScratchTotalAvg), - ScratchTotalMax = nameof(ScratchTotalMax), - ScratchTotalMin = nameof(ScratchTotalMin), - ScratchTotalStdDev = nameof(ScratchTotalStdDev), - Sort = nameof(Sort), - StdDev = nameof(StdDev), - SumOfDefects = nameof(SumOfDefects), - SumOfDefectsAvg = nameof(SumOfDefectsAvg), - SumOfDefectsMax = nameof(SumOfDefectsMax), - SumOfDefectsMin = nameof(SumOfDefectsMin), - SumOfDefectsStdDev = nameof(SumOfDefectsStdDev), - Thresh = nameof(Thresh), - Thruput = nameof(Thruput), - // - Data = nameof(Data), - Parameters = nameof(Parameters) - }; - return result; - } - - public List GetDescription(ILogic logic, ConfigDataBase configDataBase, List tests, object payload) - { - List results = new List(); - if (payload is null || !(payload is ProcessData processData) || processData.Header is null || !processData.Details.Any()) - results.Add(GetDefault(logic, configDataBase)); - else - { - string nullData; - Description description; - if (ConfigData.NullData is null) - nullData = string.Empty; - else - nullData = ConfigData.NullData.ToString(); - for (int i = 0; i < processData.Details.Count; i++) - { - description = new Description - { - Test = (int)tests[i], - Count = processData.Details.Count, - Index = i, - // - EventName = GetEventName(), - NullData = nullData, - JobID = logic.Logistics.JobID, - Sequence = logic.Logistics.Sequence.ToString(), - MesEntity = logic.Logistics.MesEntity, - ReportFullPath = logic.Logistics.ReportFullPath, - ProcessJobID = logic.Logistics.ProcessJobID, - MID = logic.Logistics.MID, - // - Date = processData.Header.Date, - Employee = processData.Header.PSN, - Lot = processData.Header.Lot, - PSN = processData.Header.PSN, - Reactor = processData.Header.Reactor, - Recipe = processData.Header.Recipe, - // - Comments = processData.Details[i].Comments, - Diameter = processData.Details[i].Diameter, - Exclusion = processData.Details[i].Exclusion, - Gain = processData.Details[i].Gain, - HeaderUniqueId = processData.Details[i].HeaderUniqueId, - Laser = processData.Details[i].Laser, - ParseErrorText = processData.Header.ParseErrorText, - RDS = processData.Header.RDS, - Slot = processData.Details[i].Slot, - UniqueId = processData.Details[i].UniqueId, - // - AreaCount = processData.Details[i].AreaCount, - AreaCountAvg = processData.Header.AreaCountAvg, - AreaCountMax = processData.Header.AreaCountMax, - AreaCountMin = processData.Header.AreaCountMin, - AreaCountStdDev = processData.Header.AreaCountStdDev, - AreaTotal = processData.Details[i].AreaTotal, - AreaTotalAvg = processData.Header.AreaTotalAvg, - AreaTotalMax = processData.Header.AreaTotalMax, - AreaTotalMin = processData.Header.AreaTotalMin, - AreaTotalStdDev = processData.Header.AreaTotalStdDev, - Bin1 = processData.Details[i].Bin1, - Bin2 = processData.Details[i].Bin2, - Bin3 = processData.Details[i].Bin3, - Bin4 = processData.Details[i].Bin4, - Bin5 = processData.Details[i].Bin5, - Bin6 = processData.Details[i].Bin6, - Bin7 = processData.Details[i].Bin7, - Bin8 = processData.Details[i].Bin8, - HazeAverage = processData.Details[i].HazeAverage, - HazeAverageAvg = processData.Header.HazeAverageAvg, - HazeAverageMax = processData.Header.HazeAverageMax, - HazeAverageMin = processData.Header.HazeAverageMin, - HazeAverageStdDev = processData.Header.HazeAverageStdDev, - HazePeak = processData.Details[i].HazePeak, - HazeRegion = processData.Details[i].HazeRegion, - HazeRegionAvg = processData.Header.HazeRegionAvg, - HazeRegionMax = processData.Header.HazeRegionMax, - HazeRegionMin = processData.Header.HazeRegionMin, - HazeRegionStdDev = processData.Header.HazeRegionStdDev, - HazeRng = processData.Details[i].HazeRng, - LPDCM2 = processData.Details[i].LPDCM2, - LPDCM2Avg = processData.Header.LPDCM2Avg, - LPDCM2Max = processData.Header.LPDCM2Max, - LPDCM2Min = processData.Header.LPDCM2Min, - LPDCM2StdDev = processData.Header.LPDCM2StdDev, - LPDCount = processData.Details[i].LPDCount, - LPDCountAvg = processData.Header.LPDCountAvg, - LPDCountMax = processData.Header.LPDCountMax, - LPDCountMin = processData.Header.LPDCountMin, - LPDCountStdDev = processData.Header.LPDCountStdDev, - Mean = processData.Details[i].Mean, - ScratchCount = processData.Details[i].ScratchCount, - ScratchCountAvg = processData.Header.ScratchCountAvg, - ScratchCountMax = processData.Header.ScratchCountMax, - ScratchCountMin = processData.Header.ScratchCountMin, - ScratchCountStdDev = processData.Header.ScratchCountStdDev, - ScratchTotal = processData.Details[i].ScratchTotal, - ScratchTotalAvg = processData.Header.ScratchTotalAvg, - ScratchTotalMax = processData.Header.ScratchTotalMax, - ScratchTotalMin = processData.Header.ScratchTotalMin, - ScratchTotalStdDev = processData.Header.ScratchTotalStdDev, - Sort = processData.Details[i].Sort, - StdDev = processData.Details[i].StdDev, - SumOfDefects = processData.Details[i].SumOfDefects, - SumOfDefectsAvg = processData.Header.SumOfDefectsAvg, - SumOfDefectsMax = processData.Header.SumOfDefectsMax, - SumOfDefectsMin = processData.Header.SumOfDefectsMin, - SumOfDefectsStdDev = processData.Header.SumOfDefectsStdDev, - Thresh = processData.Details[i].Thresh, - Thruput = processData.Details[i].Thruput - }; - results.Add(description); - } - } - return results; - } - - } - - } - - } - -} \ No newline at end of file diff --git a/Helpers/ProcessData.HeaderFile.cs b/Helpers/ProcessData.HeaderFile.cs deleted file mode 100644 index dabf4a3..0000000 --- a/Helpers/ProcessData.HeaderFile.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace MET08DDUPSFS6420.Helpers -{ - - public partial class ProcessData - { - - public class HeaderFile - { - - public string JobID { get; set; } - public string MesEntity { get; set; } - public string AreaCountAvg { get; set; } - public string AreaCountMax { get; set; } - public string AreaCountMin { get; set; } - public string AreaCountStdDev { get; set; } - public string AreaTotalAvg { get; set; } - public string AreaTotalMax { get; set; } - public string AreaTotalMin { get; set; } - public string AreaTotalStdDev { get; set; } - public string Date { get; set; } - public string HazeAverageAvg { get; set; } - public string HazeAverageMax { get; set; } - public string HazeAverageMin { get; set; } - public string HazeAverageStdDev { get; set; } - public string HazeRegionAvg { get; set; } - public string HazeRegionMax { get; set; } - public string HazeRegionMin { get; set; } - public string HazeRegionStdDev { get; set; } - public string LPDCM2Avg { get; set; } - public string LPDCM2Max { get; set; } - public string LPDCM2Min { get; set; } - public string LPDCM2StdDev { get; set; } - public string LPDCountAvg { get; set; } - public string LPDCountMax { get; set; } - public string LPDCountMin { get; set; } - public string LPDCountStdDev { get; set; } - public string Lot { get; set; } - public string ParseErrorText { get; set; } - public string PSN { get; set; } - public string RDS { get; set; } - public string Reactor { get; set; } - public string Recipe { get; set; } - public string ScratchCountAvg { get; set; } - public string ScratchCountMax { get; set; } - public string ScratchCountMin { get; set; } - public string ScratchCountStdDev { get; set; } - public string ScratchTotalAvg { get; set; } - public string ScratchTotalMax { get; set; } - public string ScratchTotalMin { get; set; } - public string ScratchTotalStdDev { get; set; } - public string SumOfDefectsAvg { get; set; } - public string SumOfDefectsMax { get; set; } - public string SumOfDefectsMin { get; set; } - public string SumOfDefectsStdDev { get; set; } - public string UniqueId { get; set; } - - } - - } - -} diff --git a/Helpers/ProcessData.WSRequest.cs b/Helpers/ProcessData.WSRequest.cs deleted file mode 100644 index f6240af..0000000 --- a/Helpers/ProcessData.WSRequest.cs +++ /dev/null @@ -1,203 +0,0 @@ -using Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace MET08DDUPSFS6420.Helpers -{ - - public partial class ProcessData - { - public class WSRequest - { - - public long Id { get; set; } - public string AreaCountAvg { get; set; } - public string AreaCountMax { get; set; } - public string AreaCountMin { get; set; } - public string AreaCountStdDev { get; set; } - public string AreaTotalAvg { get; set; } - public string AreaTotalMax { get; set; } - public string AreaTotalMin { get; set; } - public string AreaTotalStdDev { get; set; } - public string Date { get; set; } - public string HazeAverageAvg { get; set; } - public string HazeAverageMax { get; set; } - public string HazeAverageMin { get; set; } - public string HazeAverageStdDev { get; set; } - public string HazeRegionAvg { get; set; } - public string HazeRegionMax { get; set; } - public string HazeRegionMin { get; set; } - public string HazeRegionStdDev { get; set; } - public string Layer { get; set; } - public string LotID { get; set; } - public string LPDCM2Avg { get; set; } - public string LPDCM2Max { get; set; } - public string LPDCM2Min { get; set; } - public string LPDCM2StdDev { get; set; } - public string LPDCountAvg { get; set; } - public string LPDCountMax { get; set; } - public string LPDCountMin { get; set; } - public string LPDCountStdDev { get; set; } - public string Operator { get; set; } - public string ParseErrorText { get; set; } - public string PSN { get; set; } - public string RDS { get; set; } - public string Reactor { get; set; } - public string Recipe { get; set; } - public string ScratchCountAvg { get; set; } - public string ScratchCountMax { get; set; } - public string ScratchCountMin { get; set; } - public string ScratchCountStdDev { get; set; } - public string ScratchTotalAvg { get; set; } - public string ScratchTotalMax { get; set; } - public string ScratchTotalMin { get; set; } - public string ScratchTotalStdDev { get; set; } - public string SumOfDefectsAvg { get; set; } - public string SumOfDefectsMax { get; set; } - public string SumOfDefectsMin { get; set; } - public string SumOfDefectsStdDev { get; set; } - public string Title { get; set; } - public string UniqueId { get; set; } - public string Zone { get; set; } - - public string CellName { get; set; } - public string Data { get; set; } - public int i { get; set; } - public List Details { get; protected set; } - - [Obsolete("For json")] public WSRequest() { } - - internal WSRequest(ILogic logic, List descriptions) - { - i = -1; - Id = 0; - Zone = null; - Layer = null; - Title = null; - Data = "*Data*"; - Details = new List(); - CellName = logic.Logistics.MesEntity; - FileRead.Description x = descriptions[0]; - //Header - { - AreaCountAvg = x.AreaCountAvg; - AreaCountMax = x.AreaCountMax; - AreaCountMin = x.AreaCountMin; - AreaCountStdDev = x.AreaCountStdDev; - AreaTotalAvg = x.AreaTotalAvg; - AreaTotalMax = x.AreaTotalMax; - AreaTotalMin = x.AreaTotalMin; - AreaTotalStdDev = x.AreaTotalStdDev; - Date = x.Date; - HazeAverageAvg = x.HazeAverageAvg; - HazeAverageMax = x.HazeAverageMax; - HazeAverageMin = x.HazeAverageMin; - HazeAverageStdDev = x.HazeAverageStdDev; - HazeRegionAvg = x.HazeRegionAvg; - HazeRegionMax = x.HazeRegionMax; - HazeRegionMin = x.HazeRegionMin; - HazeRegionStdDev = x.HazeRegionStdDev; - LotID = x.Lot; - LPDCM2Avg = x.LPDCM2Avg; - LPDCM2Max = x.LPDCM2Max; - LPDCM2Min = x.LPDCM2Min; - LPDCM2StdDev = x.LPDCM2StdDev; - LPDCountAvg = x.LPDCountAvg; - LPDCountMax = x.LPDCountMax; - LPDCountMin = x.LPDCountMin; - LPDCountStdDev = x.LPDCountStdDev; - ParseErrorText = x.ParseErrorText; - PSN = x.PSN; - RDS = x.RDS; - Reactor = x.Reactor; - Recipe = x.Recipe; - ScratchCountAvg = x.ScratchCountAvg; - ScratchCountMax = x.ScratchCountMax; - ScratchCountMin = x.ScratchCountMin; - ScratchCountStdDev = x.ScratchCountStdDev; - ScratchTotalAvg = x.ScratchTotalAvg; - ScratchTotalMax = x.ScratchTotalMax; - ScratchTotalMin = x.ScratchTotalMin; - ScratchTotalStdDev = x.ScratchTotalStdDev; - SumOfDefectsAvg = x.SumOfDefectsAvg; - SumOfDefectsMax = x.SumOfDefectsMax; - SumOfDefectsMin = x.SumOfDefectsMin; - SumOfDefectsStdDev = x.SumOfDefectsStdDev; - UniqueId = x.UniqueId; - } - DataFile dataFile; - foreach (FileRead.Description description in descriptions) - { - dataFile = new DataFile - { - Data = "*Data*", - i = -1, - Id = 0, //item.Id, - AreaCount = description.AreaCount, - AreaTotal = description.AreaTotal, - Bin1 = description.Bin1, - Bin2 = description.Bin2, - Bin3 = description.Bin3, - Bin4 = description.Bin4, - Bin5 = description.Bin5, - Bin6 = description.Bin6, - Bin7 = description.Bin7, - Bin8 = description.Bin8, - Comments = description.Comments, - Date = description.Date, - Diameter = description.Diameter, - Exclusion = description.Exclusion, - Gain = description.Gain, - HazeAverage = description.HazeAverage, - HazePeak = description.HazePeak, - HazeRegion = description.HazeRegion, - HazeRng = description.HazeRng, - HeaderUniqueId = description.HeaderUniqueId, - LPDCM2 = description.LPDCM2, - LPDCount = description.LPDCount, - Laser = description.Laser, - Mean = description.Mean, - Recipe = description.Recipe, - ScratchCount = description.ScratchCount, - ScratchTotal = description.ScratchTotal, - Slot = description.Slot, - Sort = description.Sort, - StdDev = description.StdDev, - SumOfDefects = description.SumOfDefects, - Thresh = description.Thresh, - Thruput = description.Thruput, - Title = null, - UniqueId = description.UniqueId - }; - Details.Add(dataFile); - } - Date = logic.Logistics.DateTimeFromSequence.ToString(); - if (UniqueId is null && Details.Any()) - UniqueId = Details[0].HeaderUniqueId; - for (int i = 0; i < Details.Count; i++) - { - if (string.IsNullOrEmpty(Details[i].Bin1)) - Details[i].Bin1 = null; - if (string.IsNullOrEmpty(Details[i].Bin2)) - Details[i].Bin2 = null; - if (string.IsNullOrEmpty(Details[i].Bin3)) - Details[i].Bin3 = null; - if (string.IsNullOrEmpty(Details[i].Bin4)) - Details[i].Bin4 = null; - if (string.IsNullOrEmpty(Details[i].Bin5)) - Details[i].Bin5 = null; - if (string.IsNullOrEmpty(Details[i].Bin6)) - Details[i].Bin6 = null; - if (string.IsNullOrEmpty(Details[i].Bin7)) - Details[i].Bin7 = null; - if (string.IsNullOrEmpty(Details[i].Bin8)) - Details[i].Bin8 = null; - } - } - - } - - } - -} diff --git a/Helpers/ProcessData.cs b/Helpers/ProcessData.cs deleted file mode 100644 index fa4cd77..0000000 --- a/Helpers/ProcessData.cs +++ /dev/null @@ -1,761 +0,0 @@ -using log4net; -using Shared; -using Shared.Metrology; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Text.RegularExpressions; - -namespace MET08DDUPSFS6420.Helpers -{ - - public partial class ProcessData - { - - public HeaderFile Header { get; private set; } - public List Details { get; private set; } - - private int _I; - private ILog _Log; - private string _Data; - - public ProcessData(ILogic logic, ConfigData configData, List fileInfoCollection) - { - Header = null; - fileInfoCollection.Clear(); - _I = 0; _Data = string.Empty; - Details = new List(); - _Log = LogManager.GetLogger(typeof(ProcessData)); - Tuple> tuple = Parse(logic, configData, fileInfoCollection); - Details.AddRange(tuple.Item2); - Header = tuple.Item1; - } - - public static string GetLines(ILogic logic, List descriptions, bool ganPPTST) - { - StringBuilder result = new StringBuilder(); - FileRead.Description x = descriptions[0]; - if (ganPPTST) - { - string slot; - string reactor; - const int eight = 8; - DateTime dateTime = DateTime.Parse(x.Date); - string lot = x.Lot.ToLower().Replace("69-", string.Empty).Replace("71-", string.Empty).Replace("-", string.Empty); - if (string.IsNullOrEmpty(x.Lot) || x.Lot.Length < 2) - reactor = "R"; - else - reactor = string.Concat("R", x.Lot.Substring(0, 2)); - result.Append(nameof(x.Date)).Append(";"). - Append("Part").Append(";"). - Append(nameof(x.Reactor)).Append(";"). - Append("Lot").Append(";"). - Append(nameof(DataFile.Slot)).Append(";"). - Append(nameof(DataFile.Bin1)).Append(";"). - Append(nameof(DataFile.Bin2)).Append(";"). - Append(nameof(DataFile.Bin3)).Append(";"). - Append(nameof(DataFile.Bin4)).Append(";"). - Append(nameof(DataFile.Bin5)).Append(";"). - Append(nameof(DataFile.Bin6)).Append(";"). - Append("Bin9"). - AppendLine(); - foreach (FileRead.Description description in descriptions) - { - slot = description.Slot.Replace("*", string.Empty); - result.Append("!").Append(dateTime.ToString("MM/dd/yyyy HH:mm:ss")).Append(";"). - Append("Particle Adder;"). - Append(reactor).Append(";"). - Append(lot).Append(";"). - Append(slot).Append(";"). - Append(description.Bin1).Append(";"). - Append(description.Bin2).Append(";"). - Append(description.Bin3).Append(";"). - Append(description.Bin4).Append(";"). - Append(description.Bin5).Append(";"). - Append(description.Bin6).Append(";"). - Append(description.AreaCount). - AppendLine(); - } - if (descriptions.Count != eight) - { - string negitiveTenThousand = "-10000"; - for (int i = descriptions.Count; i < eight; i++) - { - result.Append("!").Append(dateTime.ToString("MM/dd/yyyy HH:mm:ss")).Append(";"). - Append("Particle Adder;"). - Append(reactor).Append(";"). - Append(lot).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand).Append(";"). - Append(negitiveTenThousand). - AppendLine(); - } - } - if (result.ToString().Split('\n').Length != (eight + 2)) - throw new Exception(string.Concat("Must have ", eight, " samples")); - } - else - { - char del = '\t'; - result.Append(x.AreaCountAvg).Append(del). // 001 - AreaCountAvg - Append(x.AreaCountMax).Append(del). // 002 - AreaCountMax - Append(x.AreaCountMin).Append(del). // 003 - AreaCountMin - Append(x.AreaCountStdDev).Append(del). // 004 - AreaCountStdDev - Append(x.AreaTotalAvg).Append(del). // 005 - AreaTotalAvg - Append(x.AreaTotalMax).Append(del). // 006 - AreaTotalMax - Append(x.AreaTotalMin).Append(del). // 007 - AreaTotalMin - Append(x.AreaTotalStdDev).Append(del). // 008 - AreaTotalStdDev - Append(x.Date).Append(del). // 009 - - Append(x.HazeAverageAvg).Append(del). // 010 - Haze Average - Append(x.HazeAverageMax).Append(del). // 011 - - Append(x.HazeAverageMin).Append(del). // 012 - - Append(x.HazeAverageStdDev).Append(del). // 013 - - Append(x.HazeRegionAvg).Append(del). // 014 - - Append(x.HazeRegionMax).Append(del). // 015 - - Append(x.HazeRegionMin).Append(del). // 016 - - Append(x.HazeRegionStdDev).Append(del). // 017 - - Append(x.Lot).Append(del). // 018 - - Append(x.LPDCM2Avg).Append(del). // 019 - - Append(x.LPDCM2Max).Append(del). // 020 - - Append(x.LPDCM2Min).Append(del). // 021 - - Append(x.LPDCM2StdDev).Append(del). // 022 - - Append(x.LPDCountAvg).Append(del). // 023 - - Append(x.LPDCountMax).Append(del). // 024 - - Append(x.LPDCM2Min).Append(del). // 025 - - Append(x.LPDCountStdDev).Append(del). // 026 - - Append(x.Employee).Append(del). // 027 - - Append(x.RDS).Append(del). // 028 - Lot - Append(x.Reactor).Append(del). // 029 - Process - Append(x.Recipe.Replace(";", string.Empty)).Append(del). // 030 - Part - Append(x.ScratchCountAvg).Append(del). // 031 - Scratch Count - Append(x.ScratchCountMax).Append(del). // 032 - - Append(x.ScratchCountMin).Append(del). // 033 - - Append(x.ScratchTotalStdDev).Append(del). // 034 - - Append(x.ScratchTotalAvg).Append(del). // 035 - Scratch Length - Append(x.ScratchTotalMax).Append(del). // 036 - - Append(x.ScratchTotalMin).Append(del). // 037 - - Append(x.ScratchTotalStdDev).Append(del). // 038 - - Append(x.SumOfDefectsAvg).Append(del). // 039 - Average Sum of Defects - Append(x.SumOfDefectsMax).Append(del). // 040 - Max Sum of Defects - Append(x.SumOfDefectsMin).Append(del). // 041 - Min Sum of Defects - Append(x.SumOfDefectsStdDev).Append(del). // 042 - SumOfDefectsStdDev - Append(logic.Logistics.MesEntity).Append(del). // 043 - - AppendLine(); - } - return result.ToString(); - } - - internal static void PostOpenInsightMetrologyViewerAttachments(ILog log, ConfigData configData, Logistics logistics, DateTime dateTime, string logisticsSequenceMemoryDirectory, List descriptions, string matchDirectory) - { - string checkFileName; - string[] pclFiles = Directory.GetFiles(matchDirectory, "*.pcl", SearchOption.TopDirectoryOnly); - if (pclFiles.Length != 1) - throw new Exception("Invalid source file count!"); - string sourceFileNameNoExt = Path.GetFileNameWithoutExtension(pclFiles[0]); - string wsResultsMemoryFile = string.Concat(logisticsSequenceMemoryDirectory, @"\", nameof(WS.Results), ".json"); - if (!File.Exists(wsResultsMemoryFile)) - throw new Exception(string.Concat("Memory file <", wsResultsMemoryFile, "> doesn't exist!")); - string json = File.ReadAllText(wsResultsMemoryFile); - WS.Results metrologyWSRequest = JsonSerializer.Deserialize(json); - long wsResultsHeaderID = metrologyWSRequest.HeaderID; - List dataAttachments = new List(); - List headerAttachments = new List(); - checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_data.pdf"); - if (!File.Exists(checkFileName)) - log.Debug("Header file doesn't exist!"); - else - headerAttachments.Add(new WS.Attachment(descriptions[0].HeaderUniqueId, "Data.pdf", checkFileName)); - foreach (FileRead.Description description in descriptions) - { - checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_", description.Slot.Replace('*', 's'), "_image.pdf"); - if (File.Exists(checkFileName)) - dataAttachments.Add(new WS.Attachment(description.UniqueId, "Image.pdf", checkFileName)); - checkFileName = string.Concat(matchDirectory, @"\", sourceFileNameNoExt, "_", description.Slot.Replace('*', 's'), "_data.pdf"); - if (File.Exists(checkFileName)) - dataAttachments.Add(new WS.Attachment(description.UniqueId, "Data.pdf", checkFileName)); - } - if (dataAttachments.Count == 0 || dataAttachments.Count != descriptions.Count) - log.Debug("Invalid attachment count!"); - WS.AttachFiles(configData.OpenInsightMetrogyViewerAPI, wsResultsHeaderID, headerAttachments, dataAttachments); - } - - /// - /// Convert the raw data file to parsable file format - in this case from PCL to PDF - /// - /// source file to be converted to PDF - /// - private static string ConvertSourceFileToPdf(ConfigData configData, string sourceFile) - { - string result = Path.ChangeExtension(sourceFile, ".pdf"); - if (!File.Exists(result)) - { - //string arguments = string.Concat("-i \"", sourceFile, "\" -o \"", result, "\""); - string arguments = string.Concat("-dSAFER -dBATCH -dNOPAUSE -sOutputFile=\"", result, "\" -sDEVICE=pdfwrite \"", sourceFile, "\""); - //Process process = Process.Start(configData.LincPDFCFileName, arguments); - Process process = Process.Start(configData.GhostPCLFileName, arguments); - process.WaitForExit(30000); - if (!File.Exists(result)) - throw new Exception("PDF file wasn't created"); - } - return result; - } - - /// - /// Test and fix a data line from the Lot Summary page if there are two values that are merged. - /// - /// data line from Lot Summary - private void FixToEolArray(ref string[] toEol) - { - const int MAX_COLUMNS = 9; - int[] mColumnWidths = new int[MAX_COLUMNS] { 8, 6, 6, 6, 6, 7, 7, 5, 7 }; - // is it short at least one data point - if (toEol.Length < MAX_COLUMNS) - { - _Log.Debug($"****FixToEolArray - Starting array:"); - _Log.Debug(toEol); - _Log.Debug($"****FixToEolArray - Column widths:"); - _Log.Debug(mColumnWidths); - string leftVal, rightVal; - - // size up and assign a working list - List toEolList = new List(toEol); - if (string.IsNullOrEmpty(toEolList[toEolList.Count - 1])) - toEolList.RemoveAt(toEolList.Count - 1); // removes a null element at end - _Log.Debug($"****FixToEolArray - New toEolList:"); - _Log.Debug(toEolList); - for (int i = toEolList.Count; i < MAX_COLUMNS; i++) - toEolList.Insert(0, ""); // insert to top of list - _Log.Debug(toEolList); - - // start at the end - for (int i = MAX_COLUMNS - 1; i >= 0; i--) - { - // test for a bad value - does it have too many characters - _Log.Debug($"****FixToEolArray - toEolList[i].Length: {toEolList[i].Length}, mColumnWidths[i]: {mColumnWidths[i]}"); - if (toEolList[i].Length > mColumnWidths[i]) - { - // split it up into its two parts - leftVal = toEolList[i].Substring(0, toEolList[i].Length - mColumnWidths[i]); - rightVal = toEolList[i].Substring(leftVal.Length); - _Log.Debug($"****FixToEolArray - Split leftVal: {leftVal}"); - _Log.Debug($"****FixToEolArray - Split rightVal: {rightVal}"); - - // insert new value - toEolList[i] = rightVal; - toEolList.Insert(i, leftVal); - if (string.IsNullOrEmpty(toEolList[0])) - toEolList.RemoveAt(0); // removes a null element at end - _Log.Debug($"****FixToEolArray - Fixed toEolList:"); - _Log.Debug(toEolList); - } - } - toEol = toEolList.ToArray(); - _Log.Debug($"****FixToEolArray - Ending array:"); - _Log.Debug(toEol); - } - } - - private void ScanPast(string text) - { - int num = _Data.IndexOf(text, _I); - if (num > -1) - _I = num + text.Length; - else - _I = _Data.Length; - } - - private string GetBefore(string text) - { - int num = _Data.IndexOf(text, _I); - if (num > -1) - { - string str = _Data.Substring(_I, num - _I); - _I = num + text.Length; - return str.Trim(); - } - string str1 = _Data.Substring(_I); - _I = _Data.Length; - return str1.Trim(); - } - - private string GetBefore(string text, bool trim) - { - if (trim) - return GetBefore(text); - int num = _Data.IndexOf(text, _I); - if (num > -1) - { - string str = _Data.Substring(_I, num - _I); - _I = num + text.Length; - return str; - } - string str1 = _Data.Substring(_I); - _I = _Data.Length; - return str1; - } - - private bool IsNullOrWhiteSpace(string text) - { - for (int index = 0; index < text.Length; ++index) - { - if (!char.IsWhiteSpace(text[index])) - return false; - } - return true; - } - - private bool IsBlankLine() - { - int num = _Data.IndexOf("\n", _I); - return IsNullOrWhiteSpace(num > -1 ? _Data.Substring(_I, num - _I) : _Data.Substring(_I)); - } - - private string GetToEOL() - { - return GetBefore("\n"); - } - - private string GetToEOL(bool trim) - { - if (trim) - return GetToEOL(); - return GetBefore("\n", false); - } - - private string GetToText(string text) - { - return _Data.Substring(_I, _Data.IndexOf(text, _I) - _I).Trim(); - } - - private string GetToken() - { - while (_I < _Data.Length && IsNullOrWhiteSpace(_Data.Substring(_I, 1))) - ++_I; - int j = _I; - while (j < _Data.Length && !IsNullOrWhiteSpace(_Data.Substring(j, 1))) - ++j; - string str = _Data.Substring(_I, j - _I); - _I = j; - return str.Trim(); - } - - private string PeekNextLine() - { - int j = _I; - string toEol = GetToEOL(); - _I = j; - return toEol; - } - - private HeaderFile ParseLotSummary(ILogic logic, string headerFileName, Dictionary pages, Dictionary> slots) - { - HeaderFile result = new HeaderFile { JobID = logic.Logistics.JobID, MesEntity = logic.Logistics.MesEntity, Date = DateTime.Now.ToString() }; - _I = 0; - //string headerText; - //string altHeaderFileName = Path.ChangeExtension(headerFileName, ".txt"); - //if (File.Exists(altHeaderFileName)) - // headerText = File.ReadAllText(altHeaderFileName); - //else - //{ - // //Pdfbox, IKVM.AWT.WinForms - // org.apache.pdfbox.pdmodel.PDDocument pdfDocument = org.apache.pdfbox.pdmodel.PDDocument.load(headerFileName); - // org.apache.pdfbox.util.PDFTextStripper stripper = new org.apache.pdfbox.util.PDFTextStripper(); - // headerText = stripper.getText(pdfDocument); - // pdfDocument.close(); - // File.AppendAllText(altHeaderFileName, headerText); - //} - string h = string.Empty; - //result.Id = h; - //result.Title = h; - //result.Zone = h; - //result.PSN = h; - //result.Layer = h; - result.ParseErrorText = string.Empty; - if (!pages.ContainsKey(headerFileName)) - throw new Exception(); - _I = 0; _Data = pages[headerFileName]; - ScanPast("Date:"); - result.Date = GetToEOL(); - ScanPast("Recipe ID:"); - result.Recipe = GetBefore("LotID:"); - result.Recipe = result.Recipe.Replace(";", ""); - if (_Data.Contains("[]")) - result.Lot = GetBefore("[]"); - else if (_Data.Contains("[7]")) - result.Lot = GetBefore("[7]"); - else - result.Lot = GetBefore("["); - - // Remove illegal characters \/:*?"<>| found in the Lot. - result.Lot = Regex.Replace(result.Lot, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; - - // determine number of wafers and their slot numbers - _Log.Debug(_Data.Substring(_I)); - string slot; - string toEOL; - int slotCount = _Data.Substring(_I).Split('*').Length - 1; - _Log.Debug($"****HeaderFile - Slot Count: {slotCount}."); - for (int i = 0; i < slotCount; i++) - { - ScanPast("*"); - toEOL = GetToEOL(false); - slot = string.Concat("*", toEOL.Substring(0, 2)); - if (!slots.ContainsKey(slot)) - slots.Add(slot, new List()); - } - _Log.Debug($"****HeaderFile - Slots:"); - _Log.Debug(slots); - - ScanPast("Min:"); - - string[] toEol1 = GetToEOL(false).Trim().Split(' '); - _Log.Debug($"****HeaderFile - toEol1 Count: {toEol1.Length}."); - FixToEolArray(ref toEol1); - result.LPDCountMin = toEol1[0].Trim(); - result.LPDCM2Min = toEol1[1].Trim(); - result.AreaCountMin = toEol1[2].Trim(); - result.AreaTotalMin = toEol1[3].Trim(); - result.ScratchCountMin = toEol1[4].Trim(); - result.ScratchTotalMin = toEol1[5].Trim(); - result.SumOfDefectsMin = toEol1[6].Trim(); - result.HazeRegionMin = toEol1[7].Trim(); - result.HazeAverageMin = toEol1[8].Trim(); - ScanPast("Max:"); - - string[] toEol2 = GetToEOL(false).Trim().Split(' '); - _Log.Debug($"****HeaderFile - toEol2 Count: {toEol2.Length}."); - FixToEolArray(ref toEol2); - result.LPDCountMax = toEol2[0].Trim(); - result.LPDCM2Max = toEol2[1].Trim(); - result.AreaCountMax = toEol2[2].Trim(); - result.AreaTotalMax = toEol2[3].Trim(); - result.ScratchCountMax = toEol2[4].Trim(); - result.ScratchTotalMax = toEol2[5].Trim(); - result.SumOfDefectsMax = toEol2[6].Trim(); - result.HazeRegionMax = toEol2[7].Trim(); - result.HazeAverageMax = toEol2[8].Trim(); - ScanPast("Average:"); - - string[] toEol3 = GetToEOL(false).Trim().Split(' '); - _Log.Debug($"****HeaderFile - toEol3 Count: {toEol3.Length}."); - FixToEolArray(ref toEol3); - result.LPDCountAvg = toEol3[0].Trim(); - result.LPDCM2Avg = toEol3[1].Trim(); - result.AreaCountAvg = toEol3[2].Trim(); - result.AreaTotalAvg = toEol3[3].Trim(); - result.ScratchCountAvg = toEol3[4].Trim(); - result.ScratchTotalAvg = toEol3[5].Trim(); - result.SumOfDefectsAvg = toEol3[6].Trim(); - result.HazeRegionAvg = toEol3[7].Trim(); - result.HazeAverageAvg = toEol3[8].Trim(); - ScanPast("Std Dev:"); - - string[] toEol4 = GetToEOL(false).Trim().Split(' '); - _Log.Debug($"****HeaderFile - toEol4 Count: {toEol4.Length}."); - FixToEolArray(ref toEol4); - result.LPDCountStdDev = toEol4[0].Trim(); - result.LPDCM2StdDev = toEol4[1].Trim(); - result.AreaCountStdDev = toEol4[2].Trim(); - result.AreaTotalStdDev = toEol4[3].Trim(); - result.ScratchCountStdDev = toEol4[4].Trim(); - result.ScratchTotalStdDev = toEol4[5].Trim(); - result.SumOfDefectsStdDev = toEol4[6].Trim(); - result.HazeRegionStdDev = toEol4[7].Trim(); - result.HazeAverageStdDev = toEol4[8].Trim(); - - string[] segments = result.Lot.Split('-'); - if (segments.Length > 0) - result.Reactor = segments[0]; - if (segments.Length > 1) - result.RDS = segments[1]; - if (segments.Length > 2) - result.PSN = segments[2]; - // Example of header.UniqueId is TENCOR1_33-289217-4693_201901300556533336 - result.UniqueId = string.Format("{0}_{1}_{2}", logic.Logistics.JobID, result.Lot, Path.GetFileNameWithoutExtension(logic.Logistics.ReportFullPath)); - return result; - } - - private DataFile ParseWaferSummary(HeaderFile headerFile, string waferFileName, Dictionary pages) - { - DataFile result = new DataFile { Data = "*Data*", i = -1, }; - _I = 0; - //string waferText; - //string altWaferFileName = Path.ChangeExtension(waferFileName, ".txt"); - //if (File.Exists(altWaferFileName)) - // waferText = File.ReadAllText(altWaferFileName); - //else - //{ - // //Pdfbox, IKVM.AWT.WinForms - // org.apache.pdfbox.pdmodel.PDDocument pdfDocument = org.apache.pdfbox.pdmodel.PDDocument.load(waferFileName); - // org.apache.pdfbox.util.PDFTextStripper dataStripper = new org.apache.pdfbox.util.PDFTextStripper(); - // waferText = dataStripper.getText(pdfDocument); - // pdfDocument.close(); - // File.AppendAllText(altWaferFileName, waferText); - //} - List stringList = new List(); - result.HeaderUniqueId = headerFile.UniqueId; - result.Id = 0; - result.Title = null; - if (!pages.ContainsKey(waferFileName)) - throw new Exception(); - _I = 0; _Data = pages[waferFileName]; - ScanPast("Date:"); - result.Date = GetToEOL(); - ScanPast("ID#"); - result.Slot = GetToEOL(); - if (result.Slot.Length > 5) - result.Slot = string.Concat(result.Slot.Substring(0, 5), "... - ***"); - //result.Slot = result.Slot.Replace("*", ""); - ScanPast("Comments:"); - result.Comments = GetToEOL(); - ScanPast("Sort:"); - result.Sort = GetToEOL(); - ScanPast("LPD Count:"); - result.LPDCount = GetToEOL(); - ScanPast("LPD / cm2:"); - result.LPDCM2 = GetToEOL(); - while (GetBefore(":").Contains("Bin")) - stringList.Add(GetToEOL()); - if (stringList.Count >= 1) - result.Bin1 = stringList[0]; - if (stringList.Count >= 2) - result.Bin2 = stringList[1]; - if (stringList.Count >= 3) - result.Bin3 = stringList[2]; - if (stringList.Count >= 4) - result.Bin4 = stringList[3]; - if (stringList.Count >= 5) - result.Bin5 = stringList[4]; - if (stringList.Count >= 6) - result.Bin6 = stringList[5]; - if (stringList.Count >= 7) - result.Bin7 = stringList[6]; - if (stringList.Count >= 8) - result.Bin8 = stringList[7]; - result.Mean = GetToEOL(); - ScanPast("Std Dev:"); - result.StdDev = GetToEOL(); - ScanPast("Area Count:"); - result.AreaCount = GetToEOL(); - ScanPast("Area Total:"); - result.AreaTotal = GetToEOL(); - ScanPast("Scratch Count:"); - result.ScratchCount = GetToEOL(); - ScanPast("Scratch Total:"); - result.ScratchTotal = GetToEOL(); - ScanPast("Sum of All Defects:"); - result.SumOfDefects = GetToEOL(); - ScanPast("Haze Region:"); - result.HazeRegion = GetToEOL(); - ScanPast("Haze Average:"); - result.HazeAverage = GetToEOL(); - ScanPast("Haze Peak:"); - result.HazePeak = GetToEOL(); - ScanPast("Laser:"); - result.Laser = GetBefore("Gain:"); - result.Gain = GetBefore("Diameter:"); - result.Diameter = GetToEOL(); - ScanPast("Thresh:"); - result.Thresh = GetBefore("Exclusion:"); - result.Exclusion = GetToEOL(); - ScanPast("Haze Rng:"); - result.HazeRng = GetBefore("Thruput:"); - result.Thruput = GetToEOL(); - ScanPast("Recipe ID:"); - result.Recipe = GetToEOL(); - result.UniqueId = string.Format("{0}_{1}", headerFile.UniqueId, result.Slot.Replace("*", string.Empty).TrimStart('0')); - return result; - } - - private Tuple> Parse(ILogic logic, ConfigData configData, List fileInfoCollection) - { - Tuple> result; - object item; - string pageText; - string pagePDFFile; - string pageTextFile; - DataFile dataFile = null; - string pageFileName = string.Empty; - string missingWaferMessage = string.Empty; - List sourceFiles = new List(); - List missingSlots = new List(); - List dataFiles = new List(); - Dictionary pages = new Dictionary(); - string sourcePath = Path.GetDirectoryName(logic.Logistics.ReportFullPath); - Dictionary> slots = new Dictionary>(); - string sourceFileNamePdf = ConvertSourceFileToPdf(configData, logic.Logistics.ReportFullPath); - sourceFiles.Add(sourceFileNamePdf); - string sourceFileNameNoExt = Path.GetFileNameWithoutExtension(logic.Logistics.ReportFullPath); - ////PdfSharp open pdf - //using (PdfSharp.Pdf.PdfDocument sourceDocument = PdfSharp.Pdf.IO.PdfReader.Open(sourceFileNamePdf, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import)) - //{ - // for (int idxPage = 0; idxPage < sourceDocument.PageCount; idxPage++) - // { - // // split the pdf into seperate pages. Odd pages are wafer image, even are wafer summary. Last page is Lot Summary. - // _Log.Debug($"****ParseData - Splitting page: {idxPage}, sourceDocument: {sourceDocument.FullPath}, sourcePathFileNoExt: {sourcePathFileNoExt}"); - // //SplitPage(sourceDocument, sourcePathFileNoExt, idxPage); - // pageNum = idxPage + 1; - // pageFile = string.Format("{0}_{1}.pdf", sourcePathFileNoExt, pageNum); - // _Log.Debug($"****SplitPage - Page {pageNum} Source file: {sourceDocument.FullPath}"); - // _Log.Debug($"****SplitPage - Page {pageNum} Output file: {pageFile}"); - // //PdfSharp Create new document - // PdfSharp.Pdf.PdfDocument outputDocument = new PdfSharp.Pdf.PdfDocument { Version = sourceDocument.Version }; - // outputDocument.Info.Title = string.Format("Page {0} of {1}", pageNum, sourceDocument.Info.Title); - // outputDocument.Info.Creator = sourceDocument.Info.Creator; - // outputDocument.AddPage(sourceDocument.Pages[idxPage]); - // outputDocument.Pages[0].CropBox = new PdfSharp.Pdf.PdfRectangle(new PdfSharp.Drawing.XRect(0, 100, 700, 700)); - // outputDocument.Save(pageFile); - // } - // sourceDocumentPageCount = sourceDocument.PageCount; - // sourceDocument.Close(); - //} - java.io.File file = new java.io.File(sourceFileNamePdf); - org.apache.pdfbox.util.Splitter splitter = new org.apache.pdfbox.util.Splitter(); - org.apache.pdfbox.pdmodel.PDDocument pdDocument = org.apache.pdfbox.pdmodel.PDDocument.load(file); - java.util.List list = splitter.split(pdDocument); - java.util.ListIterator iterator = list.listIterator(); - org.apache.pdfbox.util.PDFTextStripper dataStripper = new org.apache.pdfbox.util.PDFTextStripper(); - for (short i = 1; i < short.MaxValue; i++) - { - if (!iterator.hasNext()) - break; - item = iterator.next(); - pagePDFFile = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", i, ".pdf"); - pageTextFile = Path.ChangeExtension(pagePDFFile, ".txt"); - if (File.Exists(pageTextFile)) - { - pageText = File.ReadAllText(pageTextFile); - sourceFiles.Add(pageTextFile); - if (!(item is org.apache.pdfbox.pdmodel.PDDocument pd)) - continue; - pd.close(); - } - else if (File.Exists(pagePDFFile)) - { - org.apache.pdfbox.pdmodel.PDDocument document = org.apache.pdfbox.pdmodel.PDDocument.load(pagePDFFile); - pageText = dataStripper.getText(document); - document.close(); - sourceFiles.Add(pagePDFFile); - if (!(item is org.apache.pdfbox.pdmodel.PDDocument pd)) - continue; - pd.close(); - } - else - { - if (!(item is org.apache.pdfbox.pdmodel.PDDocument pd)) - continue; - pageText = dataStripper.getText(pd); - pd.save(pagePDFFile); - sourceFiles.Add(pagePDFFile); - pd.close(); - File.WriteAllText(pageTextFile, pageText); - sourceFiles.Add(pageTextFile); - } - pages.Add(pagePDFFile, pageText); - } - pdDocument.close(); - // parse lot summary - _Log.Debug($"****ParseData - Parsing lot summary"); - List> pageMapping = new List>(); - string headerFileName = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", pages.Count, ".pdf"); - HeaderFile headerFile = ParseLotSummary(logic, headerFileName, pages, slots); - foreach (KeyValuePair keyValuePair in pages) - { - if (keyValuePair.Key == headerFileName) - continue; - if (string.IsNullOrEmpty(keyValuePair.Value.Trim())) - { - pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); - continue; - } - if (!pages.ContainsKey(keyValuePair.Key)) - throw new Exception(); - dataFile = ParseWaferSummary(headerFile, keyValuePair.Key, pages); - if (string.IsNullOrEmpty(dataFile.Recipe) || dataFile.Recipe != headerFile.Recipe) - { - missingSlots.Add(keyValuePair.Key); - pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); - continue; - } - if (!slots.ContainsKey(dataFile.Slot)) - { - missingSlots.Add(keyValuePair.Key); - pageMapping.Add(new Tuple(keyValuePair.Key, string.Empty)); - continue; - } - pageMapping.Add(new Tuple(keyValuePair.Key, string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_", dataFile.Slot.Replace('*', 's'), "_data.pdf"))); - slots[dataFile.Slot].Add(dataFile); - } - string checkFileName = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_data.pdf"); - if (!File.Exists(checkFileName)) - { - File.Move(headerFileName, checkFileName); - sourceFiles.Remove(headerFileName); - sourceFiles.Add(checkFileName); - } - checkFileName = string.Empty; - for (int i = pageMapping.Count - 1; i > -1; i--) - { - if (!string.IsNullOrEmpty(pageMapping[i].Item2)) - { - checkFileName = pageMapping[i].Item2; - if (!File.Exists(checkFileName)) - { - File.Move(pageMapping[i].Item1, checkFileName); - sourceFiles.Remove(pageMapping[i].Item1); - sourceFiles.Add(checkFileName); - } - } - else if (!string.IsNullOrEmpty(checkFileName)) - { - //if (i == 0 || !string.IsNullOrEmpty(pageMapping[i - 1].Item2)) - //{ - checkFileName = checkFileName.Replace("_data.pdf", "_image.pdf"); - if (!File.Exists(checkFileName)) - { - File.Move(pageMapping[i].Item1, checkFileName); - sourceFiles.Remove(pageMapping[i].Item1); - sourceFiles.Add(checkFileName); - } - //} - checkFileName = string.Empty; - } - } - foreach (KeyValuePair> keyValuePair in slots) - { - if (!keyValuePair.Value.Any() || keyValuePair.Value[0] is null) - missingSlots.Add(string.Concat("Slot ", keyValuePair.Key, ") is missing.")); - else - { - foreach (DataFile data in keyValuePair.Value) - dataFiles.Add(data); - } - } - if (missingSlots.Any()) - { - string missingSlotsFile = string.Concat(sourcePath, @"\", sourceFileNameNoExt, "_MissingSlots.txt"); - File.WriteAllLines(missingSlotsFile, missingSlots); - sourceFiles.Add(missingSlotsFile); - } - headerFile.Date = DateTime.Parse(headerFile.Date).ToString(); - //for (int i = 0; i < dataFiles.Count; i++) - // dataFiles[i].Date = DateTime.Parse(dataFiles[i].Date).ToString(); - foreach (string sourceFile in sourceFiles) - fileInfoCollection.Add(new FileInfo(sourceFile)); - fileInfoCollection.Add(new FileInfo(logic.Logistics.ReportFullPath)); - result = new Tuple>(headerFile, dataFiles); - return result; - } - - } - -} diff --git a/MET08DDUPSFS6420.csproj b/MET08DDUPSFS6420.csproj index ae64b60..34ce843 100644 --- a/MET08DDUPSFS6420.csproj +++ b/MET08DDUPSFS6420.csproj @@ -94,8 +94,20 @@ + + + - + + + + + + + + + + @@ -111,9 +123,24 @@ - - - + + + + + + + + + + + + + + + + + + @@ -123,36 +150,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -171,10 +177,6 @@ 5.0.1 - - - - - + \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index c20f46a..a42c397 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.36.0.0")] -[assembly: AssemblyFileVersion("2.36.0.0")] +[assembly: AssemblyVersion("2.36.3.0")] +[assembly: AssemblyFileVersion("2.36.3.0")] diff --git a/Shared/Deposition/Test.cs b/Shared/Deposition/Test.cs deleted file mode 100644 index 463ce66..0000000 --- a/Shared/Deposition/Test.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Shared.Deposition -{ - - public enum Test - { - AFMRoughness = -1, - GRATXTCenter = 0, - GRATXTEdge = 1, - GRAXMLCenter = 2, - GRAXMLEdgeN = 3, - Health = 4, - Temps = 5, - ToolTime = 6 - } - -} \ No newline at end of file diff --git a/Shared/Description.cs b/Shared/Description.cs deleted file mode 100644 index 839cfbb..0000000 --- a/Shared/Description.cs +++ /dev/null @@ -1,182 +0,0 @@ -using Adaptation.Shared.Metrology; -using Eaf.Core; -using Eaf.EquipmentCore.Control; -using Eaf.EquipmentCore.DataCollection.Reporting; -using Eaf.EquipmentCore.SelfDescription.ElementDescription; -using Eaf.EquipmentCore.SelfDescription.ParameterTypes; -using Ifx.Eaf.EquipmentConnector.File.SelfDescription; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; - -namespace Shared -{ - - public class Description - { - - public enum RowColumn - { - Test = 1000, - Count, - Index - } - - public enum LogisticsColumn - { - EventName = 2000, - NullData, - JobID, - Sequence, - MesEntity, - ReportFullPath, - ProcessJobID, - MID - } - - public enum Param - { - String = 0, - Integer = 2, - Double = 3, - Boolean = 4, - StructuredType = 5 - } - - internal const string FileFound = "FileFound"; - - - public List EquipmentParameters { get; private set; } - public List ParameterTypeDefinitions { get; private set; } - - private readonly bool _UseCyclical; - private readonly List _HeaderNames; - private readonly Dictionary _KeyIndexPairs; - private readonly ParameterTypeDefinition _StructuredType; - private readonly FileConnectorParameterTypeDefinitionProvider _FileConnectorParameterTypeDefinitionProvider; - - public Description(ILogic logic, ConfigDataBase configDataBase, IEquipmentControl equipmentControl) - { - _KeyIndexPairs = new Dictionary(); - _HeaderNames = configDataBase.GetHeaderNames(logic); - _UseCyclical = configDataBase.UseCyclicalForDescription; - _StructuredType = new StructuredType(nameof(StructuredType), string.Empty, new List()); - _FileConnectorParameterTypeDefinitionProvider = new FileConnectorParameterTypeDefinitionProvider(); - EquipmentParameters = new List(); - ParameterTypeDefinitions = new List { _StructuredType }; - Dictionary>> keyValuePairsCollection = configDataBase.GetParameterInfo(logic, allowNull: false); - List results = GetParameterValues(equipmentControl, keyValuePairsCollection); - } - - private List GetParameterValues(IEquipmentControl equipmentControl, Dictionary>> keyValuePairsCollection) - { - List results = new List(); - Enum param; - object value; - Enum[] @params; - string description; - List list; - EquipmentParameter equipmentParameter; - ParameterTypeDefinition parameterTypeDefinition; - bool addToEquipmentParameters = !EquipmentParameters.Any(); - foreach (KeyValuePair>> keyValuePair in keyValuePairsCollection) - { - if (!addToEquipmentParameters && !_KeyIndexPairs.ContainsKey(keyValuePair.Key)) - continue; - @params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray(); - if (@params.Length != 1) - throw new Exception(); - if (keyValuePair.Value[0].Item2 != keyValuePair.Key) - throw new Exception(); - param = @params[0]; - if (!addToEquipmentParameters) - equipmentParameter = EquipmentParameters[_KeyIndexPairs[keyValuePair.Key]]; - else - { - description = keyValuePair.Value[0].Item3; - _KeyIndexPairs.Add(keyValuePair.Key, EquipmentParameters.Count()); - if (param is Param.StructuredType || (_UseCyclical && !_HeaderNames.Contains(keyValuePair.Key))) - parameterTypeDefinition = _StructuredType; - else - parameterTypeDefinition = _FileConnectorParameterTypeDefinitionProvider.GetParameterTypeDefinition(param.ToString()); - equipmentParameter = new EquipmentParameter(keyValuePair.Key, parameterTypeDefinition, description); - EquipmentParameters.Add(equipmentParameter); - } - if (!_UseCyclical || _HeaderNames.Contains(keyValuePair.Key)) - value = keyValuePair.Value[0].Item4; - else - { - list = new List(); - for (int i = 0; i < keyValuePair.Value.Count; i++) - list.Add(new object[] { i, keyValuePair.Value[i].Item4 }); - value = list; - } - if (equipmentControl is null || !(param is Param.StructuredType)) - results.Add(new ParameterValue(equipmentParameter, value, DateTime.Now)); - else - results.Add(equipmentControl.DataCollection.CreateParameterValue(equipmentParameter, value)); - } - return results; - } - - public List GetParameterValues(ILogic logic, IEquipmentControl equipmentControl, JsonElement jsonElement, int? i = null, Dictionary keyValuePairs = null) - { - List results = new List(); - if (_UseCyclical && (i is null || i.Value > 0)) - throw new Exception(); - if (jsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - Enum param; - Tuple tuple; - JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray(); - Dictionary>> keyValuePairsCollection = new Dictionary>>(); - for (int r = i.Value; r < jsonElements.Length; r++) - { - foreach (JsonProperty jsonProperty in jsonElement[r].EnumerateObject()) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array) - { - param = Param.StructuredType; - //jValue = jObject.Value("Item1"); - throw new NotImplementedException("Item1"); - } - else - { - switch (jsonProperty.Value.ValueKind) - { - case JsonValueKind.String: param = Param.String; break; - case JsonValueKind.Number: param = Param.Double; break; - case JsonValueKind.True: - case JsonValueKind.False: param = Param.Boolean; break; - case JsonValueKind.Null: param = Param.String; break; - default: param = Param.StructuredType; break; - } - } - tuple = new Tuple(param, jsonProperty.Name, string.Empty, jsonProperty.Value.ToString()); - if (!keyValuePairsCollection.ContainsKey(jsonProperty.Name)) - keyValuePairsCollection.Add(jsonProperty.Name, new List>()); - keyValuePairsCollection[jsonProperty.Name].Add(tuple); - } - if (!_UseCyclical) - break; - } - results = GetParameterValues(equipmentControl, keyValuePairsCollection); - return results; - } - - public static string GetCellName() - { - string result; - if (Backbone.Instance?.CellName is null) - result = string.Empty; - else - result = Backbone.Instance.CellName; - if (result.Contains("-IO")) - result = result.Replace("-IO", string.Empty); - return result; - } - - } - -} diff --git a/Shared/FilePathGenerator.cs b/Shared/FilePathGenerator.cs index 0a441f6..da97777 100644 --- a/Shared/FilePathGenerator.cs +++ b/Shared/FilePathGenerator.cs @@ -1,35 +1,20 @@ -using Ifx.Eaf.EquipmentConnector.File.Component; -using Ifx.Eaf.EquipmentConnector.File.Configuration; using System.Collections.Generic; +using Ifx.Eaf.EquipmentConnector.File.Component; +using Ifx.Eaf.EquipmentConnector.File.Configuration; -namespace Shared +namespace Shared; + +public class FilePathGenerator : Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator { - public class FilePathGenerator : Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator - { + public FileConnectorConfiguration FileConnectorConfiguration { get; private set; } - public FileConnectorConfiguration FileConnectorConfiguration { get; private set; } + public FilePathGenerator(FileConnectorConfiguration config, Dictionary customPattern = null) : base(config, customPattern) => FileConnectorConfiguration = config; - public FilePathGenerator(FileConnectorConfiguration config, Dictionary customPattern = null) : base(config, customPattern) - { - FileConnectorConfiguration = config; - } + public FilePathGenerator(FileConnectorConfiguration config, File file, bool isErrorFile = false, Dictionary customPattern = null) : base(config, file, isErrorFile, customPattern) => FileConnectorConfiguration = config; - public FilePathGenerator(FileConnectorConfiguration config, File file, bool isErrorFile = false, Dictionary customPattern = null) : base(config, file, isErrorFile, customPattern) - { - FileConnectorConfiguration = config; - } + public FilePathGenerator(FileConnectorConfiguration config, string sourceFilePath, bool isErrorFile = false, Dictionary customPattern = null) : base(config, sourceFilePath, isErrorFile, customPattern) => FileConnectorConfiguration = config; - public FilePathGenerator(FileConnectorConfiguration config, string sourceFilePath, bool isErrorFile = false, Dictionary customPattern = null) : base(config, sourceFilePath, isErrorFile, customPattern) - { - FileConnectorConfiguration = config; - } - - public string GetSubFolderPath() - { - return SubFolderPath; - } - - } + public string GetSubFolderPath() => SubFolderPath; } diff --git a/Shared/FilePathGeneratorInfo.cs b/Shared/FilePathGeneratorInfo.cs index e44626b..8d5e287 100644 --- a/Shared/FilePathGeneratorInfo.cs +++ b/Shared/FilePathGeneratorInfo.cs @@ -1,67 +1,63 @@ -using System.IO; +using System.IO; -namespace Shared +namespace Shared; + +public class FilePathGeneratorInfo { - public class FilePathGeneratorInfo + public string To { get; protected set; } + public string From { get; protected set; } + public bool IsErrorFile { get; protected set; } + public string SubFolderPath { get; protected set; } + public string FirstDirectory { get; protected set; } + public string ReportFullPath { get; protected set; } + public string ResolvedFileLocation { get; protected set; } + + public FilePathGeneratorInfo(object originalFilePathGenerator, string reportFullPath, bool isErrorFile, System.Collections.Generic.Dictionary fileParameter) { - - public string To { get; protected set; } - public string From { get; protected set; } - public bool IsErrorFile { get; protected set; } - public string SubFolderPath { get; protected set; } - public string FirstDirectory { get; protected set; } - public string ReportFullPath { get; protected set; } - public string ResolvedFileLocation { get; protected set; } - - public FilePathGeneratorInfo(object originalFilePathGenerator, string reportFullPath, bool isErrorFile, System.Collections.Generic.Dictionary fileParameter) + ReportFullPath = reportFullPath; + IsErrorFile = isErrorFile; + if (originalFilePathGenerator is null || originalFilePathGenerator is not FilePathGenerator original) { - ReportFullPath = reportFullPath; - IsErrorFile = isErrorFile; - if (originalFilePathGenerator is null || !(originalFilePathGenerator is FilePathGenerator)) - { - FirstDirectory = string.Empty; - ResolvedFileLocation = string.Empty; - To = string.Empty; - From = string.Empty; - } - else - { - string directorySeparatorChar = Path.DirectorySeparatorChar.ToString(); - FilePathGenerator original = (FilePathGenerator)originalFilePathGenerator; - FilePathGenerator filePathGenerator = new FilePathGenerator(original.FileConnectorConfiguration, reportFullPath, isErrorFile); - SubFolderPath = filePathGenerator.GetSubFolderPath(); - if (string.IsNullOrEmpty(SubFolderPath)) - FirstDirectory = SubFolderPath; - else - FirstDirectory = SubFolderPath.Split(Path.DirectorySeparatorChar)[0]; - ResolvedFileLocation = filePathGenerator.GetTargetFolder(); - if (string.IsNullOrEmpty(ResolvedFileLocation) && string.IsNullOrEmpty(SubFolderPath)) - To = string.Empty; - else if (string.IsNullOrEmpty(SubFolderPath)) - To = ResolvedFileLocation; - else - To = string.Concat(ResolvedFileLocation.Replace(SubFolderPath, string.Empty), Path.DirectorySeparatorChar, FirstDirectory); -#if (true) - if (string.IsNullOrEmpty(original.FileConnectorConfiguration.DefaultPlaceHolderValue)) - original.FileConnectorConfiguration.DefaultPlaceHolderValue = "NA"; - if (!(fileParameter is null) && fileParameter.Count == 1 && To.Contains(original.FileConnectorConfiguration.DefaultPlaceHolderValue)) - { - foreach (var keyValuePair in fileParameter) - To = To.Replace(string.Concat(original.FileConnectorConfiguration.DefaultPlaceHolderValue), keyValuePair.Value); - } -#endif - if (original.FileConnectorConfiguration.SourceFileLocation.EndsWith(directorySeparatorChar)) - From = string.Concat(original.FileConnectorConfiguration.SourceFileLocation, FirstDirectory); - else - From = string.Concat(original.FileConnectorConfiguration.SourceFileLocation, Path.DirectorySeparatorChar, FirstDirectory); - if (From.EndsWith(directorySeparatorChar) && !To.EndsWith(directorySeparatorChar)) - To = string.Concat(To, Path.DirectorySeparatorChar); - else if (To.EndsWith(directorySeparatorChar) && !From.EndsWith(directorySeparatorChar)) - To = To.Remove(To.Length - 1, 1); - } + FirstDirectory = string.Empty; + ResolvedFileLocation = string.Empty; + To = string.Empty; + From = string.Empty; + } + else + { + string directorySeparatorChar = Path.DirectorySeparatorChar.ToString(); + FilePathGenerator filePathGenerator = new(original.FileConnectorConfiguration, reportFullPath, isErrorFile); + SubFolderPath = filePathGenerator.GetSubFolderPath(); + if (string.IsNullOrEmpty(SubFolderPath)) + FirstDirectory = SubFolderPath; + else + FirstDirectory = SubFolderPath.Split(Path.DirectorySeparatorChar)[0]; + ResolvedFileLocation = filePathGenerator.GetTargetFolder(); + if (string.IsNullOrEmpty(ResolvedFileLocation) && string.IsNullOrEmpty(SubFolderPath)) + To = string.Empty; + else if (string.IsNullOrEmpty(SubFolderPath)) + To = ResolvedFileLocation; + else + To = string.Concat(ResolvedFileLocation.Replace(SubFolderPath, string.Empty), Path.DirectorySeparatorChar, FirstDirectory); +#if (true) + if (string.IsNullOrEmpty(original.FileConnectorConfiguration.DefaultPlaceHolderValue)) + original.FileConnectorConfiguration.DefaultPlaceHolderValue = "NA"; + if (fileParameter is not null && fileParameter.Count == 1 && To.Contains(original.FileConnectorConfiguration.DefaultPlaceHolderValue)) + { + foreach (System.Collections.Generic.KeyValuePair keyValuePair in fileParameter) + To = To.Replace(string.Concat(original.FileConnectorConfiguration.DefaultPlaceHolderValue), keyValuePair.Value); + } +#endif + if (original.FileConnectorConfiguration.SourceFileLocation.EndsWith(directorySeparatorChar)) + From = string.Concat(original.FileConnectorConfiguration.SourceFileLocation, FirstDirectory); + else + From = string.Concat(original.FileConnectorConfiguration.SourceFileLocation, Path.DirectorySeparatorChar, FirstDirectory); + if (From.EndsWith(directorySeparatorChar) && !To.EndsWith(directorySeparatorChar)) + To = string.Concat(To, Path.DirectorySeparatorChar); + else if (To.EndsWith(directorySeparatorChar) && !From.EndsWith(directorySeparatorChar)) + To = To.Remove(To.Length - 1, 1); } - } } diff --git a/Shared/Mapper.cs b/Shared/Mapper.cs new file mode 100644 index 0000000..fe5c923 --- /dev/null +++ b/Shared/Mapper.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using Eaf.Management.ConfigurationData.CellAutomation; +using Ifx.Eaf.EquipmentConnector.File.Configuration; + +namespace Shared; + +public static class Mapper +{ + + internal static Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration Map(FileConnectorConfiguration configuration) + { + Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration result = new() + { + AlternateTargetFolder = configuration.AlternateTargetFolder, + ConnectionRetryInterval = configuration.ConnectionRetryInterval, + ConnectionSettings = new List(), + CopySourceFolderStructure = configuration.CopySourceFolderStructure, + DefaultPlaceHolderValue = configuration.DefaultPlaceHolderValue, + //DeleteAbandonedEmptySourceSubFolders = configuration.DeleteAbandonedEmptySourceSubFolders, + DeleteEmptySourceSubFolders = configuration.DeleteEmptySourceSubFolders, + ErrorPostProcessingMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.PostProcessingModeEnum)configuration.ErrorPostProcessingMode, + ErrorTargetFileLocation = configuration.ErrorTargetFileLocation, + ErrorTargetFileName = configuration.ErrorTargetFileName, + FileAgeFilterMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.FileAgeFilterEnum)configuration.FileAgeFilterMode, + FileAgeThreshold = configuration.FileAgeThreshold, + //FileHandlers = configuration.FileHandlers, + FileHandleTimeout = (long)configuration.FileHandleTimeout, + FileHandleWaitTime = configuration.FileHandleWaitTime, + FileScanningIntervalInSeconds = configuration.FileScanningIntervalInSeconds, + FileScanningOption = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.FileScanningOptionEnum)configuration.FileScanningOption, + FolderAgeCheckIndividualSubFolders = configuration.FolderAgeCheckIndividualSubFolders, + FolderAgeThreshold = configuration.FolderAgeThreshold, + //FolderOperationsSubFolderLevel = configuration.FolderOperationsSubFolderLevel, + IdleEventWaitTimeInSeconds = (long)configuration.IdleEventWaitTimeInSeconds, + IfFileExistAction = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.IfFileExistEnum)configuration.IfFileExistAction, + IfPostProcessingFailsAction = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.IfPostProcessingFailsEnum)configuration.IfPostProcessingFailsAction, + IncludeSubDirectories = configuration.IncludeSubDirectories, + PostProcessingRetries = configuration.PostProcessingRetries, + PreProcessingMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.PreProcessingModeEnum)configuration.PreProcessingMode, + PostProcessingMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.PostProcessingModeEnum)configuration.PostProcessingMode, + SourceDirectoryCloaking = configuration.SourceDirectoryCloaking, + SourceFileFilter = configuration.SourceFileFilter, + SourceFileFilters = configuration.SourceFileFilters, + SourceFileLocation = configuration.SourceFileLocation, + TargetFileLocation = configuration.TargetFileLocation, + TargetFileName = configuration.TargetFileName, + TriggerOnChanged = configuration.TriggerOnChanged, + TriggerOnCreated = configuration.TriggerOnCreated, + UseZip64Mode = configuration.UseZip64Mode, + ZipErrorTargetFileName = configuration.ZipErrorTargetFileName, + ZipFileAmount = configuration.ZipFileAmount, + ZipFileSubFolderLevel = configuration.ZipFileSubFolderLevel, + ZipFileTime = configuration.ZipFileTime, + ZipMode = (Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration.FileConnectorConfiguration.ZipModeEnum)configuration.ZipMode, + ZipTargetFileName = configuration.ZipTargetFileName, + }; + foreach (Ifx.Eaf.Common.Configuration.ConnectionSetting connectionSetting in configuration.ConnectionSettings) + result.ConnectionSettings.Add(new Adaptation.Ifx.Eaf.Common.Configuration.ConnectionSetting(connectionSetting.Name, connectionSetting.Value)); + return result; + } + + internal static IList Map(IList configuredParameters) + { + List results = new(); + Adaptation.Eaf.Management.ConfigurationData.CellAutomation.ModelObjectParameterType modelObjectParameterType; + for (int i = 0; i < configuredParameters.Count; i++) + { + modelObjectParameterType = (Adaptation.Eaf.Management.ConfigurationData.CellAutomation.ModelObjectParameterType)configuredParameters[i].ValueType; + results.Add(new Adaptation.Eaf.Management.ConfigurationData.CellAutomation.ModelObjectParameterDefinition() { Id = i, Name = configuredParameters[i].Name, Value = configuredParameters[i].Value, ValueType = modelObjectParameterType, EnumType = modelObjectParameterType.ToString() }); + } + return results; + } + +} diff --git a/Shared/Metrology/Column.cs b/Shared/Metrology/Column.cs deleted file mode 100644 index 517c0c7..0000000 --- a/Shared/Metrology/Column.cs +++ /dev/null @@ -1,803 +0,0 @@ -using System; - -namespace Shared.Metrology -{ - - public static class ColumnGet - { - - public static string GetDiplayName(this Column column) - { - string results; - switch (column) - { - //case Column._8in_Total_Warp_Verification: results = "8in Total Warp Verification"; break; - //case Column.AFM_Monthly_Y: results = "AFM-Monthly Y"; break; - //case Column.AFM_Monthly: results = "AFM_Monthly"; break; - case Column.AFM_Pit_Count: results = "AFM Pit Count"; break; - case Column.AFM_Roughness: results = "AFM Roughness"; break; - //case Column.Adder_Bin_1: results = "Adder Bin 1"; break; - //case Column.Adder_Bin_2: results = "Adder Bin 2"; break; - //case Column.Adder_Bin_3: results = "Adder Bin 3"; break; - //case Column.Adder_Bin_4: results = "Adder Bin 4"; break; - //case Column.Adder_Bin_5: results = "Adder Bin 5"; break; - //case Column.Adder_Bin_6: results = "Adder Bin 6"; break; - //case Column.Adder_Bin_9: results = "Adder Bin 9"; break; - case Column.Al_B_B_WTAVG: results = "Al% B.B. WTAVG"; break; - case Column.Al_B_B_: results = "Al% B.B."; break; - case Column.Al_Barrier_WTAVG: results = "Al% Barrier WTAVG"; break; - case Column.Al_Barrier: results = "Al% Barrier"; break; - case Column.Al_SLS_WTAVG: results = "Al% SLS WTAVG"; break; - case Column.Al_SLS: results = "Al% SLS"; break; - case Column.Al_TL1_WTAVG: results = "Al% TL1 WTAVG"; break; - case Column.Al_TL1: results = "Al% TL1"; break; - case Column.Al_TL2_WTAVG: results = "Al% TL2 WTAVG"; break; - //case Column.BV_Resistance: results = "BV Resistance"; break; //BV Monthly Verification - case Column.BandEdge_V: results = "BandEdge_V"; break; - case Column.BandEdge_V_XY: results = "BandEdge_V_XY"; break; - case Column.BandEdge_nm: results = "BandEdge_nm"; break; - case Column.Barrier_Composition_RPM_XY: results = "Barrier_Composition_RPM_XY"; break; - case Column.Bow_Calibration: results = "Bow Calibration"; break; - case Column.Bow_Range: results = "Bow Range"; break; - case Column.Bow: results = "Bow"; break; - case Column.BowCenter: results = "BowCenter"; break; - case Column.BowX: results = "BowX"; break; - case Column.BowY: results = "BowY"; break; - case Column.Breakdown_Voltage_Edge: results = "Breakdown Voltage - Edge"; break; - case Column.Breakdown_VoltageMiddle: results = "Breakdown Voltage - Middle"; break; - case Column.Breakdown_Voltage: results = "Breakdown Voltage"; break; - case Column.CV_C_at_10V: results = "CV C at -10V"; break; - case Column.CV_Nd_Min: results = "CV Nd Min"; break; - //case Column.Candela_Large_LPD_Quarterly: results = "Candela Large LPD Quarterly"; break; - //case Column.Candela_Medium_LPD_Quarterly: results = "Candela Medium LPD Quarterly"; break; - //case Column.Candela_Small_LPD_Quarterly: results = "Candela Small LPD Quarterly"; break; - //case Column.Candela_Total_Quarterly: results = "Candela Total Quarterly"; break; - case Column.Candela_102_83nm: results = "102-83nm"; break; - case Column.Candela_1_1um: results = "1.1um"; break; - case Column.Candela_496nm: results = "496nm"; break; - case Column.Candela_600nm: results = "600nm"; break; - case Column.Candela_8620_Small: results = "Candela 8620 Small"; break; - case Column.Candela_Crack_Verification: results = "Crack Verification"; break; - case Column.Candela_Cracking: results = "Candela Cracking"; break; - case Column.Candela_Cracking_Acceptable: results = "Candela Cracking Acceptable"; break; - case Column.Candela_Crater: results = "Candela Crater"; break; - case Column.Candela_Crater_Verification: results = "Crater verification"; break; - case Column.Candela_Haze: results = "Candela Haze"; break; - case Column.Candela_LPD_Large: results = "Candela LPD Large"; break; - case Column.Candela_LPD_Medium: results = "Candela LPD Medium"; break; - case Column.Candela_LPD_Small: results = "Candela LPD Small"; break; - case Column.Candela_Large_Verification: results = "Large Verification"; break; - case Column.Candela_Medium_Verification: results = "Medium Verification"; break; - case Column.Candela_Pits: results = "Candela Pits"; break; - case Column.Candela_Pits_Verification: results = "Pits verification"; break; - case Column.Candela_SPE: results = "Candela SPE"; break; - case Column.Candela_SPE_Verification: results = "SPE verification"; break; - case Column.Candela_Slip: results = "Candela Slip"; break; - case Column.Candela_Small_Verification: results = "Small Verification"; break; - case Column.Candela_Spirals: results = "Candela Spirals"; break; - case Column.Candela_Spirals_Verification: results = "Candela Spirals Verification"; break; - case Column.Candela_Total_Defects: results = "Candela Total Defects"; break; - case Column.Candela_Total_PSL: results = "Candela Total PSL"; break; - case Column.Candela__1_1um: results = ">1.1um"; break; - //case Column.Comment: results = "Comment"; break; - //case Column.Conductivity: results = "Conductivity"; break; - case Column.Contact_Symmetry: results = "Contact Symmetry"; break; - //case Column.Cracking_verification: results = "Cracking verification"; break; - //case Column.Crater_verification: results = "Crater verification"; break; - case Column.Date: results = "Date"; break; - case Column.Denton_Crystal_Life: results = "Denton_Crystal_Life"; break; - case Column.Denton_Current_AVG: results = "Denton_Current_AVG"; break; - case Column.Denton_Current_STDEV: results = "Denton_Current_STDEV"; break; - case Column.Denton_Deposition_Power_AVG: results = "Denton_Deposition_Power_AVG"; break; - case Column.Denton_Deposition_Power_STDEV: results = "Denton_Deposition_Power_STDEV"; break; - case Column.Denton_Deposition_Rate_AVG: results = "Denton_Deposition_Rate_AVG"; break; - case Column.Denton_Deposition_Rate_STDEV: results = "Denton_Deposition_Rate_STDEV"; break; - case Column.Denton_Gun_Pocket: results = "Denton_Gun_Pocket"; break; - case Column.Denton_Pumpdown_Time: results = "Denton_Pumpdown_Time"; break; - case Column.Denton_Voltage_AVG: results = "Denton_Voltage_AVG"; break; - case Column.Denton_Voltage_STDEV: results = "Denton_Voltage_STDEV"; break; - case Column.Employee: results = "Employee"; break; - case Column.Epi_Thickness_Mean: results = "Epi Thickness Mean"; break; - case Column.Epi_Thickness_Mean_XY: results = "Epi Thickness Mean_XY"; break; - case Column.Epi_Thickness_Std_Dev_: results = "Epi Thickness Std Dev %"; break; - case Column.FWHM_006_WTAVG: results = "FWHM 006 WTAVG"; break; - case Column.FWHM_006: results = "FWHM 006"; break; - case Column.FWHM_105_WTAVG: results = "FWHM 105 WTAVG"; break; - case Column.FWHM_105: results = "FWHM 105"; break; - case Column.Hall_Rs: results = "Hall Rs"; break; - case Column.Hall_Mobility_verif_sample: results = "Hall_Mobility_verif_sample"; break; - case Column.Hall_Ns_verif_sample: results = "Hall_Ns_verif_sample"; break; - case Column.Hall_Rs_verif_sample: results = "Hall_Rs_verif_sample"; break; - case Column.Job: results = "Job"; break; - case Column.LEI_RS_Average_value: results = "LEI RS Average value"; break; - case Column.LEI_RS_Maximum_value: results = "LEI RS Maximum value"; break; - case Column.LEI_RS_Minimum_value: results = "LEI RS Minimum value"; break; - case Column.LEI_RS_STDEV: results = "LEI RS STDEV"; break; - case Column.LEI_RS_STDEV_: results = "LEI RS STDEV%"; break; - //case Column.Large_Adder_Sum: results = "Large Adder Sum"; break; - case Column.Lot: results = "Lot"; break; - //case Column.Medium_Adder_Sum: results = "Medium Adder Sum"; break; - case Column.Microscope_Center_5x: results = "Microscope Center 5x"; break; - case Column.Microscope_Center_50x: results = "Microscope Center 50x"; break; - case Column.Microscope_Middle_5x: results = "Microscope Middle 5x"; break; - case Column.Microscope_Middle_50x: results = "Microscope Middle 50x"; break; - case Column.Microscope_Edge_5x: results = "Microscope Edge 5x"; break; - case Column.Microscope_Edge_50x: results = "Microscope Edge 50x"; break; - case Column.Mobility_Verification: results = "Mobility Verification"; break; - case Column.Mobility: results = "Mobility"; break; - case Column.Ns_Verification: results = "Ns Verification"; break; - case Column.PL_Edge_Wavelength: results = "PL Edge Wavelength"; break; - case Column.PL_Ratio: results = "PL Ratio"; break; - case Column.PR_Barrier_Composition: results = "PR Barrier Composition"; break; - case Column.PR_Peak: results = "PR Peak"; break; - case Column.Part: results = "Part"; break; - //case Column.Particles_verification: results = "Particles verification"; break; - //case Column.Pits_verification: results = "Pits verification"; break; - //case Column.Pocket: results = "Pocket"; break; - //case Column.Post_Bin_1: results = "Post Bin 1"; break; - //case Column.Post_Bin_2: results = "Post Bin 2"; break; - //case Column.Post_Bin_3: results = "Post Bin 3"; break; - //case Column.Post_Bin_4: results = "Post Bin 4"; break; - //case Column.Post_Bin_5: results = "Post Bin 5"; break; - //case Column.Post_Bin_6: results = "Post Bin 6"; break; - //case Column.Post_Bin_9: results = "Post Bin 9"; break; - //case Column.Pre_Bin_1: results = "Pre Bin 1"; break; - //case Column.Pre_Bin_2: results = "Pre Bin 2"; break; - //case Column.Pre_Bin_3: results = "Pre Bin 3"; break; - //case Column.Pre_Bin_4: results = "Pre Bin 4"; break; - //case Column.Pre_Bin_5: results = "Pre Bin 5"; break; - //case Column.Pre_Bin_6: results = "Pre Bin 6"; break; - //case Column.Pre_Bin_9: results = "Pre Bin 9"; break; - case Column.Process: results = "Process"; break; - //case Column.RPM_verif_Thickness_1: results = "RPM_verif_Thickness_1"; break; - //case Column.RPM_verif_Thickness_2: results = "RPM_verif_Thickness_2"; break; - //case Column.RPM_verif_Thickness_3: results = "RPM_verif_Thickness_3"; break; - //case Column.RPM_verif_Thickness_Average: results = "RPM_verif_Thickness_Average"; break; - //case Column.RTA_oxide_Thk_Change: results = "RTA oxide Thk Change"; break; - //case Column.RTA_oxide_post_anneal_Thk: results = "RTA oxide post-anneal Thk"; break; - //case Column.RTA_oxide_pre_anneal_Thk: results = "RTA oxide pre-anneal Thk"; break; - case Column.Recipe: results = "Recipe"; break; - //case Column.Resistivity_2_ohm_cm: results = "Resistivity 2 ohm cm"; break; //LEI Weekly Verification - //case Column.Resistivity_600_ohm_cm: results = "Resistivity 600 ohm cm"; break; //LEI Weekly Verification - case Column.Rs_verification: results = "Rs verification"; break; - case Column.Rs_verif_100kohm: results = "Rs_verif_100kohm"; break; - case Column.Rs_verif_10ohm: results = "Rs_verif_10ohm"; break; - case Column.Rs_verif_1kohm: results = "Rs_verif_1kohm"; break; - case Column.SID: results = "SID"; break; - case Column.SL_Period_WTAVG: results = "SL Period WTAVG"; break; - case Column.SL_Period: results = "SL Period"; break; - //case Column.SPE_verification: results = "SPE verification"; break; - //case Column.Sample_ID: results = "Sample ID"; break; - case Column.Sheet_Concentration: results = "Sheet Concentration"; break; - //case Column.Size: results = "Size"; break; - //case Column.Small_Adder_Sum: results = "Small Adder Sum"; break; - //case Column.Spirals_verification: results = "Spirals verification"; break; - case Column.Time: results = "Time"; break; - case Column.Tool_ID: results = "Tool ID"; break; - //case Column.Total_LPD_Adder: results = "Total LPD Adder"; break; - //case Column.Total_Verification: results = "Total Verification"; break; - case Column.Total_Warp_Calibration: results = "Total Warp Calibration"; break; - case Column.UV_Broken: results = "UV Broken"; break; - case Column.UV_Chipping: results = "UV Chipping"; break; - case Column.UV_Cracking_0_3mm_: results = "UV Cracking (0-3mm)"; break; - case Column.UV_Cracking_3_7mm_: results = "UV Cracking (3-7mm)"; break; - case Column.UV_Cracking_7mm_: results = "UV Cracking (>7mm)"; break; - case Column.UV_Crazing: results = "UV Crazing"; break; - case Column.UV_Crazing_Acceptable: results = "UV Crazing Acceptable"; break; - case Column.UV_FULL_Characterization_Wafer: results = "UV FULL Characterization Wafer"; break; - case Column.UV_Haze_count_: results = "UV Haze (count)"; break; - case Column.UV_LIGHT_Characterization_Wafer: results = "UV LIGHT Characterization Wafer"; break; - case Column.UV_Non_rotation: results = "UV Non-rotation"; break; - case Column.UV_Other: results = "UV Other"; break; - case Column.UV_Scratch_count_: results = "UV Scratch (count)"; break; - case Column.UV_Slip_count_: results = "UV Slip (count)"; break; - case Column.UV_True_Haze: results = "UV True Haze"; break; - case Column.UV_True_Haze_Acceptable: results = "UV True Haze Acceptable"; break; - case Column.UV_SPE_1mm_count: results = "UV-SPE (>1mm) count"; break; - case Column.UV_SPE_count_: results = "UV-SPE (count)"; break; - case Column.Verification_Contact_Symmetry: results = "Verification Contact Symmetry"; break; - case Column.Vp_Pinch_Off_Voltage: results = "Vp Pinch Off Voltage"; break; - case Column.Wafer_ID: results = "Wafer ID"; break; - //case Column.Wafer_Pocket: results = "Wafer Pocket"; break; - case Column.Wafer_Region: results = "Wafer Region"; break; - case Column.Wafer_Scribe: results = "Wafer Scribe"; break; - case Column.WaferPocket_Candela: results = "WaferPocket_Candela"; break; - case Column.WaferPocket_Warp: results = "WaferPocket_Warp"; break; - case Column.WaferPosition_CV: results = "WaferPosition_CV"; break; - case Column.WaferPosition_BV: results = "WaferPosition_BV"; break; - case Column.WaferPosition_Hall: results = "WaferPosition_Hall"; break; - case Column.WaferPosition_PR: results = "WaferPosition_PR"; break; - case Column.Warp: results = "Warp"; break; - case Column.X_Coord: results = "X-Coord"; break; - case Column.XRD_2_Theta_Peak_002: results = "XRD 2 Theta Peak 002"; break; - case Column.XRD_2_Theta_Peak_101: results = "XRD 2 Theta Peak 101"; break; - case Column.XRD_2_Theta_Position: results = "XRD 2-Theta Position"; break; - case Column.XRD_2_Theta_Position_Si_1: results = "XRD 2-Theta Position Si 1"; break; - case Column.XRD_2_Theta_Position_Si_2: results = "XRD 2-Theta Position Si 2"; break; - case Column.XRD_2_Theta_Position_Si_3: results = "XRD 2-Theta Position Si 3"; break; - case Column.XRD_Peak_002_Intensity: results = "XRD Peak 002 Intensity"; break; - case Column.XRD_Peak_101_Intensity: results = "XRD Peak 101 Intensity"; break; - case Column.XRD_Weekly_AL_Center: results = "XRD Weekly AL% Center"; break; - case Column.XRD_Weekly_Back_Barrier_Al_: results = "Back Barrier Al%"; break; - case Column.XRD_Weekly_Barrier_Al_: results = "Barrier Al%"; break; - case Column.XRD_Weekly_FWHM_002: results = "XRD Weekly FWHM 002"; break; - case Column.XRD_Weekly_FWHM_101: results = "XRD Weekly FWHM 101"; break; - case Column.XRD_Weekly_FWHM_105: results = "XRD Weekly FWHM 105"; break; - case Column.XRD_Weekly_Fringe_thick_0_0_: results = "XRD Weekly Fringe thick (0,0)"; break; - case Column.XRD_Weekly_Fringe_thick_48_48_: results = "XRD Weekly Fringe thick (48,48)"; break; - case Column.XRD_Weekly_Intensity: results = "XRD Weekly Intensity"; break; - case Column.XRD_Weekly_Super_Lattice_Al_: results = "Super Lattice Al%"; break; - case Column.XRD_Weekly_Super_Lattice_period: results = "Super Lattice period"; break; - case Column.XRD_Weekly_Super_Lattice_tks: results = "Super Lattice tks"; break; - case Column.XRR_Thickness_nm_WTAVG: results = "XRR Thickness (nm) WTAVG"; break; - case Column.XRR_Thickness_nm_: results = "XRR Thickness (nm)"; break; - case Column.Y_Coord: results = "Y-Coord"; break; - case Column.YellowBand_Power_mW_: results = "YellowBand_Power (mW)"; break; - case Column.YellowBand_V: results = "YellowBand_V"; break; - case Column.YellowBand_V_XY: results = "YellowBand_V_XY"; break; - case Column.YellowBand_nm: results = "YellowBand_nm"; break; - //case Column.pH: results = "pH"; break; - case Column.Ag: results = "Ag"; break; - case Column.Al: results = "Al"; break; - case Column.As: results = "As"; break; - case Column.Au: results = "Au"; break; - case Column.B: results = "B"; break; - case Column.Ba: results = "Ba"; break; - case Column.Ca: results = "Ca"; break; - case Column.Ce: results = "Ce"; break; - case Column.Co: results = "Co"; break; - case Column.Cr: results = "Cr"; break; - case Column.Cu: results = "Cu"; break; - case Column.Fe: results = "Fe"; break; - case Column.Ga: results = "Ga"; break; - case Column.Ge: results = "Ge"; break; - case Column.Hf: results = "Hf"; break; - case Column.K: results = "K"; break; - case Column.Li: results = "Li"; break; - case Column.Mg: results = "Mg"; break; - case Column.Mn: results = "Mn"; break; - case Column.Mo: results = "Mo"; break; - case Column.Na: results = "Na"; break; - case Column.Ni: results = "Ni"; break; - case Column.P: results = "P"; break; - case Column.Pb: results = "Pb"; break; - case Column.Sn: results = "Sn"; break; - case Column.Ta: results = "Ta"; break; - case Column.Ti: results = "Ti"; break; - case Column.W: results = "W"; break; - case Column.Y: results = "Y"; break; - case Column.Zn: results = "Zn"; break; - default: throw new Exception(); - } - return results; - } - - public static Description.Param GetParam(this Column column) - { - Description.Param results; - switch (column) - { - //case Column._8in_Total_Warp_Verification: results = Description.Param.String; break; - //case Column.AFM_Monthly_Y: results = Description.Param.String; break; - //case Column.AFM_Monthly: results = Description.Param.String; break; - case Column.AFM_Pit_Count: results = Description.Param.String; break; - case Column.AFM_Roughness: results = Description.Param.String; break; - //case Column.Adder_Bin_1: results = Description.Param.String; break; - //case Column.Adder_Bin_2: results = Description.Param.String; break; - //case Column.Adder_Bin_3: results = Description.Param.String; break; - //case Column.Adder_Bin_4: results = Description.Param.String; break; - //case Column.Adder_Bin_5: results = Description.Param.String; break; - //case Column.Adder_Bin_6: results = Description.Param.String; break; - //case Column.Adder_Bin_9: results = Description.Param.String; break; - case Column.Al_B_B_WTAVG: results = Description.Param.String; break; - case Column.Al_B_B_: results = Description.Param.String; break; - case Column.Al_Barrier_WTAVG: results = Description.Param.String; break; - case Column.Al_Barrier: results = Description.Param.String; break; - case Column.Al_SLS_WTAVG: results = Description.Param.String; break; - case Column.Al_SLS: results = Description.Param.String; break; - case Column.Al_TL1_WTAVG: results = Description.Param.String; break; - case Column.Al_TL1: results = Description.Param.String; break; - case Column.Al_TL2_WTAVG: results = Description.Param.String; break; - //case Column.BV_Resistance: results = Description.Param.String; break; - case Column.BandEdge_V: results = Description.Param.String; break; - case Column.BandEdge_V_XY: results = Description.Param.String; break; - case Column.BandEdge_nm: results = Description.Param.String; break; - case Column.Barrier_Composition_RPM_XY: results = Description.Param.String; break; - case Column.Bow_Calibration: results = Description.Param.String; break; - case Column.Bow_Range: results = Description.Param.String; break; - case Column.Bow: results = Description.Param.String; break; - case Column.BowCenter: results = Description.Param.String; break; - case Column.BowX: results = Description.Param.String; break; - case Column.BowY: results = Description.Param.String; break; - case Column.Breakdown_Voltage_Edge: results = Description.Param.String; break; - case Column.Breakdown_VoltageMiddle: results = Description.Param.String; break; - case Column.Breakdown_Voltage: results = Description.Param.String; break; - case Column.CV_C_at_10V: results = Description.Param.String; break; - case Column.CV_Nd_Min: results = Description.Param.String; break; - //case Column.Candela_Large_LPD_Quarterly: results = Description.Param.String; break; - //case Column.Candela_Medium_LPD_Quarterly: results = Description.Param.String; break; - //case Column.Candela_Small_LPD_Quarterly: results = Description.Param.String; break; - //case Column.Candela_Total_Quarterly: results = Description.Param.String; break; - case Column.Candela_102_83nm: results = Description.Param.String; break; - case Column.Candela_1_1um: results = Description.Param.String; break; - case Column.Candela_496nm: results = Description.Param.String; break; - case Column.Candela_600nm: results = Description.Param.String; break; - case Column.Candela_8620_Small: results = Description.Param.String; break; - case Column.Candela_Crack_Verification: results = Description.Param.String; break; - case Column.Candela_Cracking: results = Description.Param.String; break; - case Column.Candela_Cracking_Acceptable: results = Description.Param.String; break; - case Column.Candela_Crater: results = Description.Param.String; break; - case Column.Candela_Crater_Verification: results = Description.Param.String; break; - case Column.Candela_Haze: results = Description.Param.String; break; - case Column.Candela_LPD_Large: results = Description.Param.String; break; - case Column.Candela_LPD_Medium: results = Description.Param.String; break; - case Column.Candela_LPD_Small: results = Description.Param.String; break; - case Column.Candela_Large_Verification: results = Description.Param.String; break; - case Column.Candela_Medium_Verification: results = Description.Param.String; break; - case Column.Candela_Pits: results = Description.Param.String; break; - case Column.Candela_Pits_Verification: results = Description.Param.String; break; - case Column.Candela_SPE: results = Description.Param.String; break; - case Column.Candela_SPE_Verification: results = Description.Param.String; break; - case Column.Candela_Slip: results = Description.Param.String; break; - case Column.Candela_Small_Verification: results = Description.Param.String; break; - case Column.Candela_Spirals: results = Description.Param.String; break; - case Column.Candela_Spirals_Verification: results = Description.Param.String; break; - case Column.Candela_Total_Defects: results = Description.Param.String; break; - case Column.Candela_Total_PSL: results = Description.Param.String; break; - case Column.Candela__1_1um: results = Description.Param.String; break; - //case Column.Comment: results = Description.Param.String; break; - //case Column.Conductivity: results = Description.Param.String; break; - case Column.Contact_Symmetry: results = Description.Param.String; break; - //case Column.Cracking_verification: results = Description.Param.String; break; - //case Column.Crater_verification: results = Description.Param.String; break; - case Column.Date: results = Description.Param.String; break; - case Column.Denton_Crystal_Life: results = Description.Param.String; break; - case Column.Denton_Current_AVG: results = Description.Param.String; break; - case Column.Denton_Current_STDEV: results = Description.Param.String; break; - case Column.Denton_Deposition_Power_AVG: results = Description.Param.String; break; - case Column.Denton_Deposition_Power_STDEV: results = Description.Param.String; break; - case Column.Denton_Deposition_Rate_AVG: results = Description.Param.String; break; - case Column.Denton_Deposition_Rate_STDEV: results = Description.Param.String; break; - case Column.Denton_Gun_Pocket: results = Description.Param.String; break; - case Column.Denton_Pumpdown_Time: results = Description.Param.String; break; - case Column.Denton_Voltage_AVG: results = Description.Param.String; break; - case Column.Denton_Voltage_STDEV: results = Description.Param.String; break; - case Column.Employee: results = Description.Param.String; break; - case Column.Epi_Thickness_Mean: results = Description.Param.String; break; - case Column.Epi_Thickness_Mean_XY: results = Description.Param.String; break; - case Column.Epi_Thickness_Std_Dev_: results = Description.Param.String; break; - case Column.FWHM_006_WTAVG: results = Description.Param.String; break; - case Column.FWHM_006: results = Description.Param.String; break; - case Column.FWHM_105_WTAVG: results = Description.Param.String; break; - case Column.FWHM_105: results = Description.Param.String; break; - case Column.Hall_Rs: results = Description.Param.String; break; - case Column.Hall_Mobility_verif_sample: results = Description.Param.String; break; - case Column.Hall_Ns_verif_sample: results = Description.Param.String; break; - case Column.Hall_Rs_verif_sample: results = Description.Param.String; break; - case Column.Job: results = Description.Param.String; break; - case Column.LEI_RS_Average_value: results = Description.Param.String; break; - case Column.LEI_RS_Maximum_value: results = Description.Param.String; break; - case Column.LEI_RS_Minimum_value: results = Description.Param.String; break; - case Column.LEI_RS_STDEV: results = Description.Param.String; break; - case Column.LEI_RS_STDEV_: results = Description.Param.String; break; - //case Column.Large_Adder_Sum: results = Description.Param.String; break; - case Column.Lot: results = Description.Param.String; break; - //case Column.Medium_Adder_Sum: results = Description.Param.String; break; - case Column.Microscope_Center_5x: results = Description.Param.String; break; - case Column.Microscope_Center_50x: results = Description.Param.String; break; - case Column.Microscope_Middle_5x: results = Description.Param.String; break; - case Column.Microscope_Middle_50x: results = Description.Param.String; break; - case Column.Microscope_Edge_5x: results = Description.Param.String; break; - case Column.Microscope_Edge_50x: results = Description.Param.String; break; - case Column.Mobility_Verification: results = Description.Param.String; break; - case Column.Mobility: results = Description.Param.String; break; - case Column.Ns_Verification: results = Description.Param.String; break; - case Column.PL_Edge_Wavelength: results = Description.Param.String; break; - case Column.PL_Ratio: results = Description.Param.String; break; - case Column.PR_Barrier_Composition: results = Description.Param.String; break; - case Column.PR_Peak: results = Description.Param.String; break; - case Column.Part: results = Description.Param.String; break; - //case Column.Particles_verification: results = Description.Param.String; break; - //case Column.Pits_verification: results = Description.Param.String; break; - //case Column.Pocket: results = Description.Param.String; break; - //case Column.Post_Bin_1: results = Description.Param.String; break; - //case Column.Post_Bin_2: results = Description.Param.String; break; - //case Column.Post_Bin_3: results = Description.Param.String; break; - //case Column.Post_Bin_4: results = Description.Param.String; break; - //case Column.Post_Bin_5: results = Description.Param.String; break; - //case Column.Post_Bin_6: results = Description.Param.String; break; - //case Column.Post_Bin_9: results = Description.Param.String; break; - //case Column.Pre_Bin_1: results = Description.Param.String; break; - //case Column.Pre_Bin_2: results = Description.Param.String; break; - //case Column.Pre_Bin_3: results = Description.Param.String; break; - //case Column.Pre_Bin_4: results = Description.Param.String; break; - //case Column.Pre_Bin_5: results = Description.Param.String; break; - //case Column.Pre_Bin_6: results = Description.Param.String; break; - //case Column.Pre_Bin_9: results = Description.Param.String; break; - case Column.Process: results = Description.Param.String; break; - //case Column.RPM_verif_Thickness_1: results = Description.Param.String; break; - //case Column.RPM_verif_Thickness_2: results = Description.Param.String; break; - //case Column.RPM_verif_Thickness_3: results = Description.Param.String; break; - //case Column.RPM_verif_Thickness_Average: results = Description.Param.String; break; - //case Column.RTA_oxide_Thk_Change: results = Description.Param.String; break; - //case Column.RTA_oxide_post_anneal_Thk: results = Description.Param.String; break; - //case Column.RTA_oxide_pre_anneal_Thk: results = Description.Param.String; break; - case Column.Recipe: results = Description.Param.String; break; - //case Column.Resistivity_2_ohm_cm: results = Description.Param.String; break; - //case Column.Resistivity_600_ohm_cm: results = Description.Param.String; break; - case Column.Rs_verification: results = Description.Param.String; break; - case Column.Rs_verif_100kohm: results = Description.Param.String; break; - case Column.Rs_verif_10ohm: results = Description.Param.String; break; - case Column.Rs_verif_1kohm: results = Description.Param.String; break; - case Column.SID: results = Description.Param.String; break; - case Column.SL_Period_WTAVG: results = Description.Param.String; break; - case Column.SL_Period: results = Description.Param.String; break; - //case Column.SPE_verification: results = Description.Param.String; break; - //case Column.Sample_ID: results = Description.Param.String; break; - case Column.Sheet_Concentration: results = Description.Param.String; break; - //case Column.Size: results = Description.Param.String; break; - //case Column.Small_Adder_Sum: results = Description.Param.String; break; - //case Column.Spirals_verification: results = Description.Param.String; break; - case Column.Time: results = Description.Param.String; break; - case Column.Tool_ID: results = Description.Param.String; break; - //case Column.Total_LPD_Adder: results = Description.Param.String; break; - //case Column.Total_Verification: results = Description.Param.String; break; - case Column.Total_Warp_Calibration: results = Description.Param.String; break; - case Column.UV_Broken: results = Description.Param.String; break; - case Column.UV_Chipping: results = Description.Param.String; break; - case Column.UV_Cracking_0_3mm_: results = Description.Param.String; break; - case Column.UV_Cracking_3_7mm_: results = Description.Param.String; break; - case Column.UV_Cracking_7mm_: results = Description.Param.String; break; - case Column.UV_Crazing: results = Description.Param.String; break; - case Column.UV_Crazing_Acceptable: results = Description.Param.String; break; - case Column.UV_FULL_Characterization_Wafer: results = Description.Param.String; break; - case Column.UV_Haze_count_: results = Description.Param.String; break; - case Column.UV_LIGHT_Characterization_Wafer: results = Description.Param.String; break; - case Column.UV_Non_rotation: results = Description.Param.String; break; - case Column.UV_Other: results = Description.Param.String; break; - case Column.UV_Scratch_count_: results = Description.Param.String; break; - case Column.UV_Slip_count_: results = Description.Param.String; break; - case Column.UV_True_Haze: results = Description.Param.String; break; - case Column.UV_True_Haze_Acceptable: results = Description.Param.String; break; - case Column.UV_SPE_1mm_count: results = Description.Param.String; break; - case Column.UV_SPE_count_: results = Description.Param.String; break; - case Column.Verification_Contact_Symmetry: results = Description.Param.String; break; - case Column.Vp_Pinch_Off_Voltage: results = Description.Param.String; break; - case Column.Wafer_ID: results = Description.Param.String; break; - //case Column.Wafer_Pocket: results = Description.Param.String; break; - case Column.Wafer_Region: results = Description.Param.String; break; - case Column.Wafer_Scribe: results = Description.Param.String; break; - case Column.WaferPocket_Candela: results = Description.Param.String; break; - case Column.WaferPocket_Warp: results = Description.Param.String; break; - case Column.WaferPosition_CV: results = Description.Param.String; break; - case Column.WaferPosition_BV: results = Description.Param.String; break; - case Column.WaferPosition_Hall: results = Description.Param.String; break; - case Column.WaferPosition_PR: results = Description.Param.String; break; - case Column.Warp: results = Description.Param.String; break; - case Column.X_Coord: results = Description.Param.String; break; - case Column.XRD_2_Theta_Peak_002: results = Description.Param.String; break; - case Column.XRD_2_Theta_Peak_101: results = Description.Param.String; break; - case Column.XRD_2_Theta_Position: results = Description.Param.String; break; - case Column.XRD_2_Theta_Position_Si_1: results = Description.Param.String; break; - case Column.XRD_2_Theta_Position_Si_2: results = Description.Param.String; break; - case Column.XRD_2_Theta_Position_Si_3: results = Description.Param.String; break; - case Column.XRD_Peak_002_Intensity: results = Description.Param.String; break; - case Column.XRD_Peak_101_Intensity: results = Description.Param.String; break; - case Column.XRD_Weekly_AL_Center: results = Description.Param.String; break; - case Column.XRD_Weekly_Back_Barrier_Al_: results = Description.Param.String; break; - case Column.XRD_Weekly_Barrier_Al_: results = Description.Param.String; break; - case Column.XRD_Weekly_FWHM_002: results = Description.Param.String; break; - case Column.XRD_Weekly_FWHM_101: results = Description.Param.String; break; - case Column.XRD_Weekly_FWHM_105: results = Description.Param.String; break; - case Column.XRD_Weekly_Fringe_thick_0_0_: results = Description.Param.String; break; - case Column.XRD_Weekly_Fringe_thick_48_48_: results = Description.Param.String; break; - case Column.XRD_Weekly_Intensity: results = Description.Param.String; break; - case Column.XRD_Weekly_Super_Lattice_Al_: results = Description.Param.String; break; - case Column.XRD_Weekly_Super_Lattice_period: results = Description.Param.String; break; - case Column.XRD_Weekly_Super_Lattice_tks: results = Description.Param.String; break; - case Column.XRR_Thickness_nm_WTAVG: results = Description.Param.String; break; - case Column.XRR_Thickness_nm_: results = Description.Param.String; break; - case Column.Y_Coord: results = Description.Param.String; break; - case Column.YellowBand_Power_mW_: results = Description.Param.String; break; - case Column.YellowBand_V: results = Description.Param.String; break; - case Column.YellowBand_V_XY: results = Description.Param.String; break; - case Column.YellowBand_nm: results = Description.Param.String; break; - //case Column.pH: results = Description.Param.String; break; - case Column.Ag: results = Description.Param.String; break; - case Column.Al: results = Description.Param.String; break; - case Column.As: results = Description.Param.String; break; - case Column.Au: results = Description.Param.String; break; - case Column.B: results = Description.Param.String; break; - case Column.Ba: results = Description.Param.String; break; - case Column.Ca: results = Description.Param.String; break; - case Column.Ce: results = Description.Param.String; break; - case Column.Co: results = Description.Param.String; break; - case Column.Cr: results = Description.Param.String; break; - case Column.Cu: results = Description.Param.String; break; - case Column.Fe: results = Description.Param.String; break; - case Column.Ga: results = Description.Param.String; break; - case Column.Ge: results = Description.Param.String; break; - case Column.Hf: results = Description.Param.String; break; - case Column.K: results = Description.Param.String; break; - case Column.Li: results = Description.Param.String; break; - case Column.Mg: results = Description.Param.String; break; - case Column.Mn: results = Description.Param.String; break; - case Column.Mo: results = Description.Param.String; break; - case Column.Na: results = Description.Param.String; break; - case Column.Ni: results = Description.Param.String; break; - case Column.P: results = Description.Param.String; break; - case Column.Pb: results = Description.Param.String; break; - case Column.Sn: results = Description.Param.String; break; - case Column.Ta: results = Description.Param.String; break; - case Column.Ti: results = Description.Param.String; break; - case Column.W: results = Description.Param.String; break; - case Column.Y: results = Description.Param.String; break; - case Column.Zn: results = Description.Param.String; break; - default: throw new Exception(); - } - return results; - } - - } - - public enum Column - { - //_8in_Total_Warp_Verification, - //AFM_Monthly_Y, - //AFM_Monthly, - AFM_Pit_Count, - AFM_Roughness, - //Adder_Bin_1, - //Adder_Bin_2, - //Adder_Bin_3, - //Adder_Bin_4, - //Adder_Bin_5, - //Adder_Bin_6, - //Adder_Bin_9, - Al_B_B_WTAVG, - Al_B_B_, - Al_Barrier_WTAVG, - Al_Barrier, - Al_SLS_WTAVG, - Al_SLS, - Al_TL1_WTAVG, - Al_TL1, - Al_TL2_WTAVG, - //BV_Resistance, - BandEdge_V, - BandEdge_V_XY, - BandEdge_nm, - Barrier_Composition_RPM_XY, - Bow_Calibration, - Bow_Range, - Bow, - BowCenter, - BowX, - BowY, - Breakdown_Voltage_Edge, - Breakdown_VoltageMiddle, - Breakdown_Voltage, - CV_C_at_10V, - CV_Nd_Min, - //Candela_Large_LPD_Quarterly, - //Candela_Medium_LPD_Quarterly, - //Candela_Small_LPD_Quarterly, - //Candela_Total_Quarterly, - Candela_102_83nm, - Candela_1_1um, - Candela_496nm, - Candela_600nm, - Candela_8620_Small, - Candela_Crack_Verification, - Candela_Cracking, - Candela_Cracking_Acceptable, - Candela_Crater, - Candela_Crater_Verification, - Candela_Haze, - Candela_LPD_Large, - Candela_LPD_Medium, - Candela_LPD_Small, - Candela_Large_Verification, - Candela_Medium_Verification, - Candela_Pits, - Candela_Pits_Verification, - Candela_SPE, - Candela_SPE_Verification, - Candela_Slip, - Candela_Small_Verification, - Candela_Spirals, - Candela_Spirals_Verification, - Candela_Total_Defects, - Candela_Total_PSL, - Candela__1_1um, - //Comment, - //Conductivity, - Contact_Symmetry, - //Cracking_verification, - //Crater_verification, - Date, - Denton_Crystal_Life, - Denton_Current_AVG, - Denton_Current_STDEV, - Denton_Deposition_Power_AVG, - Denton_Deposition_Power_STDEV, - Denton_Deposition_Rate_AVG, - Denton_Deposition_Rate_STDEV, - Denton_Gun_Pocket, - Denton_Pumpdown_Time, - Denton_Voltage_AVG, - Denton_Voltage_STDEV, - Employee, - Epi_Thickness_Mean, - Epi_Thickness_Mean_XY, - Epi_Thickness_Std_Dev_, - FWHM_006_WTAVG, - FWHM_006, - FWHM_105_WTAVG, - FWHM_105, - Hall_Rs, - Hall_Mobility_verif_sample, - Hall_Ns_verif_sample, - Hall_Rs_verif_sample, - Job, - LEI_RS_Average_value, - LEI_RS_Maximum_value, - LEI_RS_Minimum_value, - LEI_RS_STDEV, - LEI_RS_STDEV_, - //Large_Adder_Sum, - Lot, - //Medium_Adder_Sum, - Microscope_Center_50x, - Microscope_Center_5x, - Microscope_Edge_50x, - Microscope_Edge_5x, - Microscope_Middle_50x, - Microscope_Middle_5x, - Mobility_Verification, - Mobility, - Ns_Verification, - PL_Edge_Wavelength, - PL_Ratio, - PR_Barrier_Composition, - PR_Peak, - Part, - //Particles_verification, - //Pits_verification, - //Pocket, - //Post_Bin_1, - //Post_Bin_2, - //Post_Bin_3, - //Post_Bin_4, - //Post_Bin_5, - //Post_Bin_6, - //Post_Bin_9, - //Pre_Bin_1, - //Pre_Bin_2, - //Pre_Bin_3, - //Pre_Bin_4, - //Pre_Bin_5, - //Pre_Bin_6, - //Pre_Bin_9, - Process, - //RPM_verif_Thickness_1, - //RPM_verif_Thickness_2, - //RPM_verif_Thickness_3, - //RPM_verif_Thickness_Average, - //RTA_oxide_Thk_Change, - //RTA_oxide_post_anneal_Thk, - //RTA_oxide_pre_anneal_Thk, - Recipe, - //Resistivity_2_ohm_cm, - //Resistivity_600_ohm_cm, - Rs_verification, - Rs_verif_100kohm, - Rs_verif_10ohm, - Rs_verif_1kohm, - SID, - SL_Period_WTAVG, - SL_Period, - //SPE_verification, - //Sample_ID, - Sheet_Concentration, - //Size, - //Small_Adder_Sum, - //Spirals_verification, - Time, - Tool_ID, - //Total_LPD_Adder, - //Total_Verification, - Total_Warp_Calibration, - UV_Broken, - UV_Chipping, - UV_Cracking_0_3mm_, - UV_Cracking_3_7mm_, - UV_Cracking_7mm_, - UV_Crazing, - UV_Crazing_Acceptable, - UV_FULL_Characterization_Wafer, - UV_Haze_count_, - UV_LIGHT_Characterization_Wafer, - UV_Non_rotation, - UV_Other, - UV_Scratch_count_, - UV_Slip_count_, - UV_True_Haze, - UV_True_Haze_Acceptable, - UV_SPE_1mm_count, - UV_SPE_count_, - Verification_Contact_Symmetry, - Vp_Pinch_Off_Voltage, - Wafer_ID, - //Wafer_Pocket, - Wafer_Region, - Wafer_Scribe, - WaferPocket_Candela, - WaferPocket_Warp, - WaferPosition_CV, - WaferPosition_BV, - WaferPosition_Hall, - WaferPosition_PR, - Warp, - X_Coord, - XRD_2_Theta_Peak_002, - XRD_2_Theta_Peak_101, - XRD_2_Theta_Position, - XRD_2_Theta_Position_Si_1, - XRD_2_Theta_Position_Si_2, - XRD_2_Theta_Position_Si_3, - XRD_Peak_002_Intensity, - XRD_Peak_101_Intensity, - XRD_Weekly_AL_Center, - XRD_Weekly_Back_Barrier_Al_, - XRD_Weekly_Barrier_Al_, - XRD_Weekly_FWHM_002, - XRD_Weekly_FWHM_101, - XRD_Weekly_FWHM_105, - XRD_Weekly_Fringe_thick_0_0_, - XRD_Weekly_Fringe_thick_48_48_, - XRD_Weekly_Intensity, - XRD_Weekly_Super_Lattice_Al_, - XRD_Weekly_Super_Lattice_period, - XRD_Weekly_Super_Lattice_tks, - XRR_Thickness_nm_, - XRR_Thickness_nm_WTAVG, - Y_Coord, - YellowBand_Power_mW_, - YellowBand_V, - YellowBand_V_XY, - YellowBand_nm, - //pH, - Ag, - Al, - As, - Au, - B, - Ba, - Ca, - Ce, - Co, - Cr, - Cu, - Fe, - Ga, - Ge, - Hf, - K, - Li, - Mg, - Mn, - Mo, - Na, - Ni, - P, - Pb, - Sn, - Ta, - Ti, - W, - Y, - Zn - } - -} \ No newline at end of file diff --git a/Shared/Metrology/ConfigDataBase.cs b/Shared/Metrology/ConfigDataBase.cs deleted file mode 100644 index 1e11fb1..0000000 --- a/Shared/Metrology/ConfigDataBase.cs +++ /dev/null @@ -1,321 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Shared.Metrology -{ - - public class ConfigDataBase - { - - public bool EafHosted { get; protected set; } - public string EquipmentElementName { get; protected set; } - public bool UseCyclicalForDescription { get; protected set; } - public Dictionary CellNames { get; protected set; } - public Dictionary MesEntities { get; protected set; } - public EquipmentConnection? EquipmentConnection { get; protected set; } - - protected readonly string _CellName; - protected readonly EventName? _EventName; - protected readonly Dictionary _Reactors; - protected IProcessDataDescription _ProcessDataDescription; - - public ConfigDataBase(string equipmentElementName, EquipmentConnection? equipmentConnection, string cellName, EventName? eventName, bool eafHosted) - { - _CellName = cellName; - EafHosted = eafHosted; - _EventName = eventName; - EquipmentConnection = equipmentConnection; - EquipmentElementName = equipmentElementName; - _Reactors = new Dictionary(); - CellNames = new Dictionary(); - MesEntities = new Dictionary(); - if (equipmentConnection is null && Enum.TryParse(equipmentElementName.Replace("-", string.Empty), out EquipmentConnection equipmentConnectionValue)) - EquipmentConnection = equipmentConnectionValue; - } - - public string GetEventName() - { - string result = string.Concat(_EventName); - return result; - } - - public EventName GetEventNameValue() - { - EventName result = _EventName.Value; - return result; - } - - public string GetEventDescription() - { - string result = _ProcessDataDescription.GetEventDescription(); - return result; - } - - public string GetCurrentReactor(ILogic logic) - { - string result = string.Empty; - foreach (KeyValuePair keyValuePair in _Reactors) - { - foreach (string filePrefix in keyValuePair.Value.Split('|')) - { - if (logic.Logistics.MID.StartsWith(filePrefix) || (_EventName != EventName.FileRead && MesEntities.ContainsKey(logic.Logistics.JobID) && keyValuePair.Value == MesEntities[logic.Logistics.JobID])) - { - result = keyValuePair.Key; - break; - } - } - } - if (string.IsNullOrEmpty(result) && _Reactors.Count == 1) - result = _Reactors.ElementAt(0).Key; - return result; - } - - public IProcessDataDescription GetDefault(ILogic logic) - { - IProcessDataDescription result = _ProcessDataDescription.GetDefault(logic, this); - return result; - } - - public IProcessDataDescription GetDisplayNames(ILogic logic) - { - IProcessDataDescription result = _ProcessDataDescription.GetDisplayNames(logic, this); - return result; - } - - protected JsonElement GetDefaultJsonElement(ILogic logic) - { - JsonElement result; - IProcessDataDescription processDataDescription = _ProcessDataDescription.GetDefault(logic, this); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - object @object = JsonSerializer.Deserialize(json); - result = (JsonElement)@object; - return result; - } - - public Dictionary>> GetParameterInfo(ILogic logic, bool allowNull) - { - Dictionary>> results = new Dictionary>>(); - string description; - Description.Param param; - Tuple tuple; - JsonElement defaultJsonElement = GetDefaultJsonElement(logic); - Dictionary keyValuePairs = GetDisplayNamesJsonElement(logic); - foreach (JsonProperty jsonProperty in defaultJsonElement.EnumerateObject()) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull) - throw new Exception(); - if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array) - { - description = string.Empty; - param = Description.Param.StructuredType; - //jValue = jObject.Value("Item1"); - throw new NotImplementedException("Item1"); - } - else - { - switch (jsonProperty.Value.ValueKind) - { - case JsonValueKind.String: param = Description.Param.String; break; - case JsonValueKind.Number: param = Description.Param.Double; break; - case JsonValueKind.True: - case JsonValueKind.False: param = Description.Param.Boolean; break; - case JsonValueKind.Null: param = Description.Param.String; break; - default: param = Description.Param.StructuredType; break; - } - } - if (!keyValuePairs.ContainsKey(jsonProperty.Name)) - description = string.Empty; - else - description = keyValuePairs[jsonProperty.Name]; - tuple = new Tuple(param, jsonProperty.Name, description, jsonProperty.Value.ToString()); - if (!results.ContainsKey(jsonProperty.Name)) - results.Add(jsonProperty.Name, new List>()); - results[jsonProperty.Name].Add(tuple); - } - return results; - } - - protected void WriteExportAliases(ILogic logic, string cellName) - { - int i = 0; - object value; - string description; - Description.Param param; - Description.Param[] @params; - StringBuilder stringBuilder = new StringBuilder(); - string shareRoot = @"\\messv02ecc1.ec.local\EC_EDA"; - string shareDirectory = string.Concat(shareRoot, @"\Staging\Pdsf\", cellName, @"\ExportAliases"); - Dictionary>> keyValuePairs = GetParameterInfo(logic, allowNull: false); - stringBuilder.AppendLine("\"AliasName\";\"Condition\";\"EventId\";\"ExceptionId\";\"Formula\";\"HardwareId\";\"OrderId\";\"ParameterName\";\"Remark\";\"ReportName\";\"SourceId\";\"Use\""); - if (!Directory.Exists(shareRoot)) - return; - if (!Directory.Exists(shareDirectory)) - Directory.CreateDirectory(shareDirectory); - string shareFile = string.Concat(shareDirectory, @"\", DateTime.Now.Ticks, ".csv"); - foreach (KeyValuePair>> keyValuePair in keyValuePairs) - { - i += 1; - @params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray(); - if (@params.Length != 1) - throw new Exception(); - if (keyValuePair.Value[0].Item2 != keyValuePair.Key) - throw new Exception(); - param = @params[0]; - if (param != Description.Param.String) - stringBuilder.AppendLine($"\"{keyValuePair.Key}\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{keyValuePair.Key}\";\"\";\"{cellName}/{EquipmentElementName}/{_EventName.Value}\";\"\";\"True\""); - else - { - description = keyValuePair.Value[0].Item3.Split('|')[0]; - if (string.IsNullOrEmpty(description)) - continue; - value = keyValuePair.Value[0].Item4; - stringBuilder.AppendLine($"\"'{description}'\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{value}\";\"\";\"{cellName}/{EquipmentElementName}/{_EventName.Value}\";\"\";\"True\""); - } - } - File.WriteAllText(shareFile, stringBuilder.ToString()); - } - - public Dictionary GetDisplayNamesJsonElement(ILogic logic) - { - Dictionary results = new Dictionary(); - IProcessDataDescription processDataDescription = _ProcessDataDescription.GetDisplayNames(logic, this); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - JsonElement jsonElement = JsonSerializer.Deserialize(json); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - { - if (!results.ContainsKey(jsonProperty.Name)) - results.Add(jsonProperty.Name, string.Empty); - if (jsonProperty.Value is JsonElement jsonPropertyValue) - results[jsonProperty.Name] = jsonPropertyValue.ToString(); - } - return results; - } - - public List GetDetailNames(ILogic logic) - { - List results = _ProcessDataDescription.GetDetailNames(logic, this); - return results; - } - - public List GetHeaderNames(ILogic logic) - { - List results = _ProcessDataDescription.GetHeaderNames(logic, this); - return results; - } - - public List GetIgnoreParameterNames(ILogic logic, Test test) - { - List results = _ProcessDataDescription.GetIgnoreParameterNames(logic, this, test); - string value; - List pairedParameterNames = _ProcessDataDescription.GetPairedParameterNames(logic, this); - IProcessDataDescription processDataDescription = _ProcessDataDescription.GetDisplayNames(logic, this); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - object @object = JsonSerializer.Deserialize(json); - if (!(@object is JsonElement jsonElement)) - throw new Exception(); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array) - throw new Exception(); - value = jsonProperty.Value.ToString(); - if (!results.Contains(jsonProperty.Name) && pairedParameterNames.Contains(jsonProperty.Name) && (string.IsNullOrEmpty(value) || value[0] == '|')) - results.Add(jsonProperty.Name); - } - return results; - } - - public List GetNames(ILogic logic) - { - List results = _ProcessDataDescription.GetNames(logic, this); - return results; - } - - public List GetPairedParameterNames(ILogic logic) - { - List results = _ProcessDataDescription.GetPairedParameterNames(logic, this); - return results; - } - - public List GetParameterNames(ILogic logic) - { - List results = _ProcessDataDescription.GetParameterNames(logic, this); - return results; - } - - public List GetProcessDataDescriptions(JsonElement jsonElement) - { - List results; - if (jsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString }; - results = JsonSerializer.Deserialize>(jsonElement.ToString(), jsonSerializerOptions); - return results; - } - - public Dictionary> GetKeyValuePairs(List processDataDescriptions) - { - Dictionary> results = new Dictionary>(); - Test testKey; - for (int i = 0; i < processDataDescriptions.Count; i++) - { - testKey = (Test)processDataDescriptions[i].Test; - if (!results.ContainsKey(testKey)) - results.Add(testKey, new List()); - results[testKey].Add(processDataDescriptions[i]); - } - return results; - } - - public Dictionary> GetKeyValuePairs(JsonElement jsonElement, List processDataDescriptions, Test test) - { - Dictionary> results = new Dictionary>(); - Test testKey; - if (jsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray(); - if (processDataDescriptions.Count != jsonElements.Length) - throw new Exception(); - for (int i = 0; i < processDataDescriptions.Count; i++) - { - testKey = (Test)processDataDescriptions[i].Test; - if (testKey != test) - continue; - foreach (JsonProperty jsonProperty in jsonElements[0].EnumerateObject()) - { - if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array) - throw new Exception(); - if (!results.ContainsKey(jsonProperty.Name)) - results.Add(jsonProperty.Name, new List()); - results[jsonProperty.Name].Add(jsonProperty.Value.ToString()); - } - } - return results; - } - - public List GetIProcessDataDescriptions(JsonElement jsonElement) - { - List results = new List(); - if (jsonElement.ValueKind != JsonValueKind.Array) - throw new Exception(); - object @object; - Type type = _ProcessDataDescription.GetType(); - JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray(); - JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString }; - for (int i = 0; i < jsonElements.Length; i++) - { - @object = JsonSerializer.Deserialize(jsonElements[i].ToString(), type, jsonSerializerOptions); - if (!(@object is IProcessDataDescription processDataDescription)) - continue; - results.Add(processDataDescription); - } - return results; - } - - } - -} diff --git a/Shared/Metrology/EventName.cs b/Shared/Metrology/EventName.cs deleted file mode 100644 index 06e848f..0000000 --- a/Shared/Metrology/EventName.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Shared.Metrology -{ - - public enum EventName - { - FileRead, - FileReadDaily, - FileReadMonthly, - FileReadVerification, - FileReadWeekly - } - -} diff --git a/Shared/Metrology/ILogic.cs b/Shared/Metrology/ILogic.cs deleted file mode 100644 index b70a425..0000000 --- a/Shared/Metrology/ILogic.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Ifx.Eaf.EquipmentConnector.File.Configuration; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.Json; - -namespace Shared.Metrology -{ - - public interface ILogic - { - - ILogic ShallowCopy(); - Logistics Logistics { get; } - - void ConfigurationRestore(); - void CreateSelfDescription(); - void CreateSelfDescription(Dictionary fileParameter, FileConnectorConfiguration configuration, ConfigDataBase configDataBase); - void CreateSelfDescription(string equipmentElementName, EquipmentConnection? equipmentConnection, string cellName, string debugConfig, FileConnectorConfiguration configuration); - bool Extract(string reportFullPath, string eventName); - string GetConfigurationErrorTargetFileLocation(); - string GetConfigurationSourceFileLocation(); - string GetConfigurationTarget2FileLocation(); - string GetConfigurationTargetFileLocation(); - string GetConfigurationTargetFileName(); - Tuple> GetExtractResult(string reportFullPath, string eventName); - object GetFilePathGeneratorInfo(string reportFullPath, bool isErrorFile); - string GetReportFullPath(Dictionary keyValuePairs); - string GetTarget2FileLocation(); - void Move(string reportFullPath, Tuple> extractResults, Exception exception = null); - string ReExtract(string searchDirectory, string sourceFileFilter); - void ReflectionCreateSelfDescription(string equipmentElementName, int? input, string cellName, string debugConfig, string[] strings, bool[] booleans, long[] numbers, string[] enums); - string ResolveErrorTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = ""); - string ResolveSourcePlaceHolders(string reportFullPath, bool createDirectory = true); - string ResolveTarget2PlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = ""); - string ResolveTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = ""); - void SetFileParameter(string key, string value); - void SetFileParameterLotID(string value, bool includeLogisticsSequence = false); - void SetFileParameterLotIDToLogisticsMID(bool includeLogisticsSequence = true); - void SetFileParameterSystemDateTimeToLogisticsSequence(); - void SetPlaceHolder(string reportFullPath, string key, string value); - void SetTarget2FileLocation(string value); - - } - -} \ No newline at end of file diff --git a/Shared/Metrology/MET08DDUPSFS6420.cs b/Shared/Metrology/MET08DDUPSFS6420.cs deleted file mode 100644 index 2a3f497..0000000 --- a/Shared/Metrology/MET08DDUPSFS6420.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Shared.Metrology -{ - - public class MET08DDUPSFS6420 - { - - public enum Test - { - Tencor = Metrology.Test.Tencor - } - - } - -} diff --git a/Shared/Metrology/MET08DDUPSP1TBI.cs b/Shared/Metrology/MET08DDUPSP1TBI.cs deleted file mode 100644 index 891986a..0000000 --- a/Shared/Metrology/MET08DDUPSP1TBI.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Shared.Metrology -{ - - public class MET08DDUPSP1TBI - { - - public enum Test - { - SP1 = Metrology.Test.SP1 - } - - } - -} diff --git a/Shared/Metrology/MET08RESIHGCV.cs b/Shared/Metrology/MET08RESIHGCV.cs deleted file mode 100644 index 243a55f..0000000 --- a/Shared/Metrology/MET08RESIHGCV.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Shared.Metrology -{ - - public class MET08RESIHGCV - { - - public enum Test - { - HgCV = Metrology.Test.HgCV - } - - } - -} diff --git a/Shared/Metrology/MET08RESIMAPCDE.cs b/Shared/Metrology/MET08RESIMAPCDE.cs deleted file mode 100644 index 8c45a89..0000000 --- a/Shared/Metrology/MET08RESIMAPCDE.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Shared.Metrology -{ - - public class MET08RESIMAPCDE - { - - public enum Test - { - CDE = Metrology.Test.CDE - } - - } - -} diff --git a/Shared/Metrology/MET08THFTIRQS408M.cs b/Shared/Metrology/MET08THFTIRQS408M.cs deleted file mode 100644 index 7e7edea..0000000 --- a/Shared/Metrology/MET08THFTIRQS408M.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Shared.Metrology -{ - - public class MET08THFTIRQS408M - { - - public enum Test - { - BioRadQS408M = Metrology.Test.BioRadQS408M - } - - } - -} diff --git a/Shared/Metrology/MET08THFTIRSTRATUS.cs b/Shared/Metrology/MET08THFTIRSTRATUS.cs deleted file mode 100644 index a0accd2..0000000 --- a/Shared/Metrology/MET08THFTIRSTRATUS.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Shared.Metrology -{ - - public class MET08THFTIRSTRATUS - { - - public enum Test - { - BioRadStratus = Metrology.Test.BioRadStratus - } - - } - -} diff --git a/Shared/Metrology/MET08XRDXPERTPROMRDXL.cs b/Shared/Metrology/MET08XRDXPERTPROMRDXL.cs deleted file mode 100644 index fea06b5..0000000 --- a/Shared/Metrology/MET08XRDXPERTPROMRDXL.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace Shared.Metrology -{ - - public class MET08XRDXPERTPROMRDXL - { - - public enum Test - { - XRDXY = Metrology.Test.XRDXY, - XRDWeightedAverage = Metrology.Test.XRDWeightedAverage, - MonthlyXRD = Metrology.Test.MonthlyXRD, - WeeklyXRD = Metrology.Test.WeeklyXRD, - WeeklyXRDAIcomp = Metrology.Test.WeeklyXRDAIcomp, - WeeklyXRDFWHM002 = Metrology.Test.WeeklyXRDFWHM002, - WeeklyXRDFWHM105 = Metrology.Test.WeeklyXRDFWHM105, - WeeklyXRDSLStks = Metrology.Test.WeeklyXRDSLStks, - WeeklyXRDXRR = Metrology.Test.WeeklyXRDXRR, - XRDXRAY = Metrology.Test.XRDXRAY - } - - } - -} diff --git a/Shared/Metrology/OISiViewer.cs b/Shared/Metrology/OISiViewer.cs deleted file mode 100644 index b03b5f8..0000000 --- a/Shared/Metrology/OISiViewer.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace Shared.Metrology -{ - - internal class OISiViewer - { - - private static System.Net.WebClient _WebClient; - - internal static string WebClientDownloadString(string baseAddress, ConfigDataBase configDataBase, string reportFullPath, bool isErrorFile, string target) - { - string result = string.Empty; - if (System.Diagnostics.Debugger.IsAttached) - result = DateTime.Now.ToString(); - else - { - if (string.IsNullOrEmpty(baseAddress) || !baseAddress.Contains(":") || !baseAddress.Contains(".")) - throw new Exception("Invalid URL"); - try - { - if (_WebClient is null) - _WebClient = new System.Net.WebClient(); - string address = string.Concat(baseAddress, "/Home/ExtractMove/?equipment_connection=", configDataBase.EquipmentConnection, "&is_error_file=", isErrorFile); - _WebClient.OpenRead(address); - result = _WebClient.ResponseHeaders["Date"]; - _WebClient.CancelAsync(); - } - catch (Exception) { } - } - return result; - } - - } - -} \ No newline at end of file diff --git a/Shared/Metrology/ProcessData.Duplicator.cs b/Shared/Metrology/ProcessData.Duplicator.cs deleted file mode 100644 index d4aed7b..0000000 --- a/Shared/Metrology/ProcessData.Duplicator.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.Json; - -namespace Shared.Metrology -{ - - public class Duplicator - { - - public class Description : IProcessDataDescription - { - - public int Test { get; set; } - public int Count { get; set; } - public int Index { get; set; } - // - public string EventName { get; set; } - public string NullData { get; set; } - public string JobID { get; set; } - public string Sequence { get; set; } - public string MesEntity { get; set; } - public string ReportFullPath { get; set; } - public string ProcessJobID { get; set; } - public string MID { get; set; } - public string Date { get; set; } //2021-02-22 - // - public object Data { get; set; } - public object Parameters { get; set; } - public string GetEventDescription() { return "File Has been read and parsed"; } - - public List GetHeaderNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetDetailNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetParameterNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - return results; - } - - public List GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test) - { - List results = new List(); - return results; - } - - public List GetNames(ILogic logic, ConfigDataBase configDataBase) - { - List results = new List(); - IProcessDataDescription processDataDescription = GetDefault(logic, configDataBase); - string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType()); - object @object = JsonSerializer.Deserialize(json); - if (!(@object is JsonElement jsonElement)) - throw new Exception(); - foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) - results.Add(jsonProperty.Name); - return results; - } - - public IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase) - { - Description result = new Description(); - return result; - } - - public IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase) - { - Description result = new Description - { - Test = -1, - Count = 0, - Index = -1, - // - EventName = configDataBase.GetEventName(), - NullData = string.Empty, - JobID = logic.Logistics.JobID, - Sequence = logic.Logistics.Sequence.ToString(), - MesEntity = logic.Logistics.MesEntity, - ReportFullPath = logic.Logistics.ReportFullPath, - ProcessJobID = logic.Logistics.ProcessJobID, - MID = logic.Logistics.MID, - Date = logic.Logistics.DateTimeFromSequence.ToUniversalTime().ToString("MM/dd/yyyy HH:mm:ss"), - // - Data = nameof(Data), - Parameters = nameof(Parameters) - }; - return result; - } - - public List GetDescription(ILogic logic, ConfigDataBase configDataBase, List tests, object payload) - { - List results = new List(); - return results; - } - - } - - } - -} \ No newline at end of file diff --git a/Shared/Metrology/ProcessDataStandardFormat.cs b/Shared/Metrology/ProcessDataStandardFormat.cs deleted file mode 100644 index d9f30ce..0000000 --- a/Shared/Metrology/ProcessDataStandardFormat.cs +++ /dev/null @@ -1,520 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json; - -namespace Shared.Metrology -{ - - public class ProcessDataStandardFormat - { - - public const string RecordStart = "RECORD_START"; - - public enum SearchFor - { - EquipmentIntegration = 1, - BusinessIntegration = 2, - SystemExport = 3, - Archive = 4 - } - - public static void MaybeWriteIncompletePDSF(ILogic logic, ConfigDataBase configDataBase, JsonElement jsonElement, string writePath, int count, bool isSource) - { - if (!string.IsNullOrEmpty(writePath) && count > 0 && jsonElement.ValueKind == JsonValueKind.Array) - { - string text; - string file; - int columns = 0; - string endOffset = "E#######T"; - string dataOffset = "D#######T"; - string headerOffset = "H#######T"; - string format = "MM/dd/yyyy HH:mm:ss"; - List lines = new List(); - StringBuilder stringBuilder = new StringBuilder(); - string directoryName = Path.GetFileNameWithoutExtension(writePath); - string directory = string.Concat(writePath, @"\", configDataBase.EquipmentConnection); - if (isSource) - directory = string.Concat(directory, @"\Source"); - else - directory = string.Concat(directory, @"\Target"); - if (!Directory.Exists(directory)) - Directory.CreateDirectory(directory); - stringBuilder.Clear(); - lines = new string[] { "HEADER_TAG\tHEADER_VALUE", "FORMAT\t2.00", "NUMBER_PASSES\t0001", string.Concat("HEADER_OFFSET\t", headerOffset), string.Concat("DATA_OFFSET\t", dataOffset), string.Concat("END_OFFSET\t", endOffset) }.ToList(); - stringBuilder.Append("\"Time\"").Append('\t'); - stringBuilder.Append("\"A_LOGISTICS\"").Append('\t'); - stringBuilder.Append("\"B_LOGISTICS\"").Append('\t'); - JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray(); - foreach (JsonProperty jsonProperty in jsonElements[0].EnumerateObject()) - { - columns += 1; - stringBuilder.Append("\"").Append(jsonProperty.Name).Append("\"").Append('\t'); - } - stringBuilder.Remove(stringBuilder.Length - 1, 1); - lines.Add(stringBuilder.ToString()); - for (int i = 0; i < jsonElements.Length; i++) - { - stringBuilder.Clear(); - stringBuilder.Append("0.1").Append('\t'); - stringBuilder.Append("1").Append('\t'); - stringBuilder.Append("2").Append('\t'); - foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject()) - stringBuilder.Append(jsonProperty.Value).Append('\t'); - stringBuilder.Remove(stringBuilder.Length - 1, 1); - lines.Add(stringBuilder.ToString()); - } - lines.Add(string.Concat("NUM_DATA_ROWS ", jsonElements.Length.ToString().PadLeft(9, '0'))); - lines.Add(string.Concat("NUM_DATA_COLUMNS ", (columns + 3).ToString().PadLeft(9, '0'))); - lines.Add("DELIMITER ;"); - lines.Add(string.Concat("START_TIME_FORMAT ", format)); - lines.Add(string.Concat("START_TIME ", logic.Logistics.DateTimeFromSequence.ToString(format))); //12/26/2019 15:22:44 - lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "A_LOGISTICS")); - lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "B_LOGISTICS")); - lines.Add(string.Concat("LOGISTICS_1", '\t', "A_CHAMBER=;A_INFO=", configDataBase.GetEventName(), ";A_INFO2=", configDataBase.EquipmentConnection, ";A_JOBID=", logic.Logistics.JobID, ";A_MES_ENTITY=", logic.Logistics.MesEntity, ";A_MID=", logic.Logistics.MID, ";A_NULL_DATA=", logic.Logistics.NullData, ";A_PPID=NO_PPID;A_PROCESS_JOBID=", logic.Logistics.ProcessJobID, ";A_PRODUCT=;A_SEQUENCE=", logic.Logistics.Sequence, ";A_WAFER_ID=;")); - lines.Add(string.Concat("LOGISTICS_2", '\t', "B_CHAMBER=;B_INFO=", configDataBase.GetEventName(), ";B_INFO2=", configDataBase.EquipmentConnection, ";B_JOBID=", logic.Logistics.JobID, ";B_MES_ENTITY=", logic.Logistics.MesEntity, ";B_MID=", logic.Logistics.MID, ";B_NULL_DATA=", logic.Logistics.NullData, ";B_PPID=NO_PPID;B_PROCESS_JOBID=", logic.Logistics.ProcessJobID, ";B_PRODUCT=;B_SEQUENCE=", logic.Logistics.Sequence, ";B_WAFER_ID=;")); - lines.Add("END_HEADER"); - file = string.Concat(directory, @"\", logic.Logistics.JobID, "_", logic.Logistics.Sequence, ".ipdsf"); - stringBuilder.Clear(); - foreach (string line in lines) - stringBuilder.AppendLine(line); - text = stringBuilder.ToString(); - text = text.Replace(headerOffset, text.IndexOf("NUM_DATA_ROWS").ToString().PadLeft(9, '0')). - Replace(dataOffset, text.IndexOf('"').ToString().PadLeft(9, '0')). - Replace(endOffset, text.Length.ToString().PadLeft(9, '0')); - File.WriteAllText(file, text); - if (logic.Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600) - { - try { File.SetLastWriteTime(file, logic.Logistics.DateTimeFromSequence); } catch (Exception) { } - } - } - } - - public static Tuple GetLogisticsColumnsAndBody(string reportFullPath, string[] lines = null) - { - string segment; - List body = new List(); - StringBuilder logistics = new StringBuilder(); - if (lines is null) - lines = File.ReadAllLines(reportFullPath); - string[] segments = lines[6].Trim().Split('\t'); - List columns = new List(); - for (int c = 0; c < segments.Length; c++) - { - segment = segments[c].Substring(1, segments[c].Length - 2); - if (!columns.Contains(segment)) - columns.Add(segment); - else - { - for (short i = 1; i < short.MaxValue; i++) - { - segment = string.Concat(segment, "_", i); - if (!columns.Contains(segment)) - { - columns.Add(segment); - break; - } - } - } - } - bool lookForLogistics = false; - for (int r = 7; r < lines.Count(); r++) - { - if (lines[r].StartsWith("NUM_DATA_ROWS")) - lookForLogistics = true; - if (!lookForLogistics) - { - body.Add(lines[r]); - continue; - } - if (lines[r].StartsWith("LOGISTICS_1")) - { - for (int i = r; i < lines.Count(); i++) - { - if (lines[r].StartsWith("END_HEADER")) - break; - logistics.AppendLine(lines[i]); - } - break; - } - } - return new Tuple(logistics.ToString(), columns.ToArray(), body.ToArray()); - } - - public static JsonElement GetArray(Tuple pdsf, bool lookForNumbers = false) - { - JsonElement result; - string value; - string[] segments; - string logistics = pdsf.Item1; - string[] columns = pdsf.Item2; - string[] bodyLines = pdsf.Item3; - StringBuilder stringBuilder = new StringBuilder(); - foreach (string bodyLine in bodyLines) - { - stringBuilder.Append('{'); - segments = bodyLine.Trim().Split('\t'); - if (!lookForNumbers) - { - for (int c = 1; c < segments.Length; c++) - { - value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); - stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\","); - } - } - else - { - for (int c = 1; c < segments.Length; c++) - { - value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); - if (string.IsNullOrEmpty(value)) - stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append("null,"); - else if (value.All(char.IsDigit)) - stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append(","); - else - stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\","); - } - } - stringBuilder.Remove(stringBuilder.Length - 1, 1); - stringBuilder.AppendLine("},"); - } - stringBuilder.Remove(stringBuilder.Length - 3, 3); - result = JsonSerializer.Deserialize(string.Concat("[", stringBuilder, "]")); - return result; - } - - public static Dictionary> GetDictionary(Tuple pdsf) - { - Dictionary> results = new Dictionary>(); - string[] segments; - string logistics = pdsf.Item1; - string[] columns = pdsf.Item2; - string[] bodyLines = pdsf.Item3; - foreach (string column in columns) - results.Add(column, new List()); - foreach (string bodyLine in bodyLines) - { - segments = bodyLine.Trim().Split('\t'); - for (int c = 1; c < segments.Length; c++) - results[columns[c]].Add(segments[c]); - } - return results; - } - - public static Tuple>>> GetTestDictionary(Tuple pdsf) - { - Dictionary>> results = new Dictionary>>(); - string testColumn = Description.RowColumn.Test.ToString(); - Dictionary> keyValuePairs = GetDictionary(pdsf); - if (!keyValuePairs.ContainsKey(testColumn)) - throw new Exception(); - int min; - int max; - Test testKey; - List vs; - string columnKey; - Dictionary> tests = new Dictionary>(); - for (int i = 0; i < keyValuePairs[testColumn].Count; i++) - { - if (Enum.TryParse(keyValuePairs[testColumn][i], out Test test)) - { - if (!results.ContainsKey(test)) - { - tests.Add(test, new List()); - results.Add(test, new Dictionary>()); - } - tests[test].Add(i); - } - } - foreach (var testKeyValuePair in tests) - { - testKey = testKeyValuePair.Key; - min = testKeyValuePair.Value.Min(); - max = testKeyValuePair.Value.Max() + 1; - foreach (KeyValuePair> keyValuePair in keyValuePairs) - results[testKey].Add(keyValuePair.Key, new List()); - foreach (KeyValuePair> keyValuePair in keyValuePairs) - { - vs = keyValuePair.Value; - columnKey = keyValuePair.Key; - for (int i = min; i < max; i++) - { - if (vs.Count > i) - results[testKey][columnKey].Add(vs[i]); - else - results[testKey][columnKey].Add(string.Empty); - } - } - } - return new Tuple>>>(pdsf.Item1, results); - } - - private static string GetString(SearchFor searchFor, bool addSpaces, char separator = ' ') - { - if (!addSpaces) - return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), searchFor); - else - return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), separator, searchFor.ToString().Replace("In", string.Concat(separator, "In")).Replace("Ex", string.Concat(separator, "Ex"))); - } - - public static string EquipmentIntegration(bool addSpaces = true, char separator = ' ') - { - return GetString(SearchFor.EquipmentIntegration, addSpaces, separator); - } - - public static string BusinessIntegration(bool addSpaces = true, char separator = ' ') - { - return GetString(SearchFor.BusinessIntegration, addSpaces, separator); - } - - public static string SystemExport(bool addSpaces = true, char separator = ' ') - { - return GetString(SearchFor.SystemExport, addSpaces, separator); - } - - public static string Archive(bool addSpaces = true, char separator = ' ') - { - return GetString(SearchFor.Archive, addSpaces, separator); - } - - public static string GetLines(Logistics logistics, ScopeInfo scopeInfo, Dictionary> keyValuePairs, Enum[] enumColumns, string dateFormat, string timeFormat, Column[] pairedColumns, bool useDateTimeFromSequence = true, string format = "", Dictionary alternateDisplayName = null, Enum[] ignoreColumns = null) - { - StringBuilder result = new StringBuilder(); - if (useDateTimeFromSequence && !string.IsNullOrEmpty(format)) - throw new Exception(); - else if (!useDateTimeFromSequence && string.IsNullOrEmpty(format)) - throw new Exception(); - int start; - string ckey; - string pKey; - int pairedColumnsCount; - string firstDuplicate = "_1"; - if (ignoreColumns is null) - ignoreColumns = new Enum[] { }; - if (alternateDisplayName is null) - alternateDisplayName = new Dictionary(); - string columnDate = Column.Date.ToString(); - string columnTime = Column.Time.ToString(); - List columnKeys = new List(); - foreach (Enum item in enumColumns) - { - if (ignoreColumns.Contains(item)) - continue; - columnKeys.Add(item.ToString()); - } - result.AppendLine(scopeInfo.Header); - StringBuilder line = new StringBuilder(); - int count = keyValuePairs[Description.RowColumn.Count.ToString()].Count(); - string nullData; - if (logistics.NullData is null) - nullData = string.Empty; - else - nullData = logistics.NullData.ToString(); - if (pairedColumns is null) - { - start = -1; - pairedColumnsCount = 0; - } - else - { - start = 0; - pairedColumnsCount = pairedColumns.Length; - } - for (int r = 0; r < count; r++) - { - for (int p = start; p < pairedColumnsCount; p++) - { - if (pairedColumnsCount == 0) - pKey = string.Empty; - else if (!(ignoreColumns is null) && ignoreColumns.Contains(pairedColumns[p])) - continue; - else - { - pKey = pairedColumns[p].ToString(); - if (!keyValuePairs.ContainsKey(pKey)) - continue; - else if (keyValuePairs[pKey][r] == nullData) - continue; - } - if (pairedColumnsCount == 0 || !string.IsNullOrEmpty(pKey)) - { - line.Clear(); - line.Append("!"); - for (int i = 0; i < columnKeys.Count; i++) - { - ckey = columnKeys[i]; - if (!keyValuePairs.ContainsKey(ckey)) - line.Append(string.Empty); - else - { - if (useDateTimeFromSequence && ckey == columnDate) - line.Append(logistics.DateTimeFromSequence.ToString(dateFormat)); - else if (useDateTimeFromSequence && ckey == columnTime) - line.Append(logistics.DateTimeFromSequence.ToString(timeFormat)); - else if (!useDateTimeFromSequence && ckey == columnDate && keyValuePairs[ckey][r].Length == format.Length) - line.Append(DateTime.ParseExact(keyValuePairs[ckey][r], format, CultureInfo.InvariantCulture).ToString(dateFormat)); - else if (!useDateTimeFromSequence && ckey == columnTime && keyValuePairs.ContainsKey(string.Concat(ckey, firstDuplicate)) && keyValuePairs[string.Concat(ckey, firstDuplicate)][r].Length == format.Length) - line.Append(DateTime.ParseExact(keyValuePairs[string.Concat(ckey, firstDuplicate)][r], format, CultureInfo.InvariantCulture).ToString(timeFormat)); - else - line.Append(keyValuePairs[ckey][r]); - } - line.Append(';'); - } - if (pairedColumnsCount > 0) - { - if (!alternateDisplayName.ContainsKey(pairedColumns[p])) - line.Append(pairedColumns[p].GetDiplayName()); - else - line.Append(alternateDisplayName[pairedColumns[p]]); - line.Append(';'); - line.Append(keyValuePairs[pKey][r]); - line.Append(';'); - } - line.Remove(line.Length - 1, 1); - result.AppendLine(line.ToString()); - } - } - } - return result.ToString(); - } - - public static string GetLines(Logistics logistics, IScopeInfo scopeInfo, List names, Dictionary> keyValuePairs, string dateFormat, string timeFormat, List pairedParameterNames, bool useDateTimeFromSequence = true, string format = "", List ignoreParameterNames = null) - { - StringBuilder result = new StringBuilder(); - if (ignoreParameterNames is null) - ignoreParameterNames = new List(); - if (useDateTimeFromSequence && !string.IsNullOrEmpty(format)) - throw new Exception(); - else if (!useDateTimeFromSequence && string.IsNullOrEmpty(format)) - throw new Exception(); - string nullData; - const string columnDate = "Date"; - const string columnTime = "Time"; - const string firstDuplicate = "_1"; - result.AppendLine(scopeInfo.Header); - StringBuilder line = new StringBuilder(); - if (logistics.NullData is null) - nullData = string.Empty; - else - nullData = logistics.NullData.ToString(); - int count = (from l in keyValuePairs select l.Value.Count).Min(); - for (int r = 0; r < count; r++) - { - line.Clear(); - line.Append("!"); - foreach (KeyValuePair> keyValuePair in keyValuePairs) - { - if (!names.Contains(keyValuePair.Key)) - continue; - if (ignoreParameterNames.Contains(keyValuePair.Key)) - continue; - if (pairedParameterNames.Contains(keyValuePair.Key)) - { - if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData) - continue; - else - result.Append(line).Append(keyValuePair.Key).Append(';').AppendLine(keyValuePair.Value[r]); - } - else - { - if (useDateTimeFromSequence && keyValuePair.Key == columnDate) - line.Append(logistics.DateTimeFromSequence.ToString(dateFormat)); - else if (useDateTimeFromSequence && keyValuePair.Key == columnTime) - line.Append(logistics.DateTimeFromSequence.ToString(timeFormat)); - else if (!useDateTimeFromSequence && keyValuePair.Key == columnDate && keyValuePair.Value[r].Length == format.Length) - line.Append(DateTime.ParseExact(keyValuePair.Value[r], format, CultureInfo.InvariantCulture).ToString(dateFormat)); - else if (!useDateTimeFromSequence && keyValuePair.Key == columnTime && keyValuePairs.ContainsKey(string.Concat(keyValuePair.Key, firstDuplicate)) && keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r].Length == format.Length) - line.Append(DateTime.ParseExact(keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r], format, CultureInfo.InvariantCulture).ToString(timeFormat)); - else if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData) - line.Append(nullData); - else - line.Append(keyValuePair.Value[r]); - line.Append(';'); - } - } - if (!pairedParameterNames.Any()) - { - line.Remove(line.Length - 1, 1); - result.AppendLine(line.ToString()); - } - } - return result.ToString(); - } - - public static List PDSFToFixedWidth(string reportFullPath) - { - List results = new List(); - if (!File.Exists(reportFullPath)) - throw new Exception(); - int[] group; - string line; - int startsAt = 0; - string[] segments; - int? currentGroup = null; - char inputSeperator = '\t'; - char outputSeperator = '\t'; - List vs = new List(); - List groups = new List(); - string[] lines = File.ReadAllLines(reportFullPath); - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < lines.Length; i++) - { - if (string.IsNullOrEmpty(lines[i])) - continue; - segments = lines[i].Split(inputSeperator); - if (currentGroup is null) - currentGroup = segments.Length; - if (segments.Length != currentGroup) - { - currentGroup = segments.Length; - groups.Add(new int[] { startsAt, i - 1 }); - startsAt = i; - } - } - if (startsAt == lines.Length - 1 && lines[0].Split(inputSeperator).Length != currentGroup) - groups.Add(new int[] { lines.Length - 1, lines.Length - 1 }); - for (int g = 0; g < groups.Count; g++) - { - vs.Clear(); - group = groups[g]; - line = lines[group[0]]; - segments = line.Split(inputSeperator); - for (int s = 0; s < segments.Length; s++) - vs.Add(segments[s].Length); - for (int i = group[0]; i <= group[1]; i++) - { - line = lines[i]; - segments = line.Split(inputSeperator); - for (int s = 0; s < segments.Length; s++) - { - if (vs[s] < segments[s].Length) - vs[s] = segments[s].Length; - } - } - line = lines[group[0]]; - stringBuilder.Clear(); - for (int s = 0; s < segments.Length; s++) - stringBuilder.Append((s + 1).ToString().PadLeft(vs[s], ' ')).Append(outputSeperator); - stringBuilder.Remove(stringBuilder.Length - 1, 1); - results.Add(stringBuilder.ToString()); - for (int i = group[0]; i <= group[1]; i++) - { - line = lines[i]; - stringBuilder.Clear(); - segments = line.Split(inputSeperator); - for (int s = 0; s < segments.Length; s++) - stringBuilder.Append(segments[s].PadLeft(vs[s], ' ')).Append(outputSeperator); - stringBuilder.Remove(stringBuilder.Length - 1, 1); - results.Add(stringBuilder.ToString()); - } - results.Add(string.Empty); - } - return results; - } - - } - -} diff --git a/Shared/Metrology/ScopeInfo.cs b/Shared/Metrology/ScopeInfo.cs deleted file mode 100644 index 43cc1d3..0000000 --- a/Shared/Metrology/ScopeInfo.cs +++ /dev/null @@ -1,405 +0,0 @@ -using System; -using System.IO; - -namespace Shared.Metrology -{ - - public class ScopeInfo : IScopeInfo - { - - public Test Test { get; private set; } - public Enum Enum { get; private set; } - public string HTML { get; private set; } - public string Title { get; private set; } - public string FileName { get; private set; } - public int TestValue { get; private set; } - public string Header { get; private set; } - public string QueryFilter { get; private set; } - public string FileNameWithoutExtension { get; private set; } - public string EquipmentElementName { get; private set; } - public EquipmentConnection EquipmentConnection { get; private set; } - - public ScopeInfo(ILogic logic, ConfigDataBase configDataBase, Test test) - { - EquipmentElementName = configDataBase.EquipmentElementName; - EquipmentConnection = configDataBase.EquipmentConnection.Value; - Enum = test; - Test = test; - TestValue = (int)test; - string eventName = GetEventNameAndSetRemaining(); - if (eventName != configDataBase.GetEventName()) - { - File.Move(logic.Logistics.ReportFullPath, Path.ChangeExtension(logic.Logistics.ReportFullPath, eventName)); - throw new Exception(); - } - else if (configDataBase.EquipmentConnection.HasValue && configDataBase.EquipmentConnection.Value != EquipmentConnection) - { - File.Move(logic.Logistics.ReportFullPath, Path.ChangeExtension(logic.Logistics.ReportFullPath, EquipmentConnection.ToString())); - throw new Exception(); - } - } - - public ScopeInfo(ILogic logic, ConfigDataBase configDataBase, Test test, string fileName, string queryFilter, string title = "", string html = "") - { - EquipmentElementName = configDataBase.EquipmentElementName; - EquipmentConnection = configDataBase.EquipmentConnection.Value; - Enum = test; - Test = test; - TestValue = (int)test; - FileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); - Header = string.Empty; - QueryFilter = queryFilter; - Title = title; - HTML = html; - FileName = fileName; - } - - public ScopeInfo ShallowCopy() - { - return (ScopeInfo)MemberwiseClone(); - } - - private string GetEventNameAndSetRemaining() - { - EventName eventName; - switch (Test) - { - case Test.AFMRoughness: - EquipmentConnection = EquipmentConnection.MET08AFMD3100; - eventName = EventName.FileRead; - FileNameWithoutExtension = "afm_iqs_01"; - Header = string.Empty; - QueryFilter = "AFM Roughness"; - Title = "AFM"; - HTML = @"GaN Epi Data\10 - afm.html"; - break; - case Test.BreakdownVoltageCenter: - EquipmentConnection = EquipmentConnection.MET08BVHGPROBE; - eventName = EventName.FileRead; - FileNameWithoutExtension = "bv_iqs_01"; - Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; - QueryFilter = "Breakdown Voltage"; - Title = "Breakdown Voltage-Center"; - HTML = @"GaN Epi Data\03 - bv-production.html"; - break; - case Test.BreakdownVoltageEdge: - EquipmentConnection = EquipmentConnection.MET08BVHGPROBE; - eventName = EventName.FileRead; - FileNameWithoutExtension = "bv_iqs_01_Edge"; - Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; - QueryFilter = "Breakdown Voltage - Edge"; - Title = "Breakdown Voltage-Edge"; - HTML = @"GaN Epi Data\03 - bv-production.html"; - break; - case Test.BreakdownVoltageMiddle8in: - EquipmentConnection = EquipmentConnection.MET08BVHGPROBE; - eventName = EventName.FileRead; - FileNameWithoutExtension = "bv_iqs_01_Middle"; - Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool"; - QueryFilter = "Breakdown Voltage - Middle"; - Title = "Breakdown Voltage-Middle (8 in)"; - HTML = @"GaN Epi Data\03 - bv-production.html"; - break; - case Test.CV: - EquipmentConnection = EquipmentConnection.MET08CVHGPROBE802B150; - eventName = EventName.FileRead; - FileNameWithoutExtension = "cv_iqs_01"; - Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; - QueryFilter = "CV_Ns"; - Title = "CV"; - HTML = @"GaN Epi Data\05 - cv.html"; - break; - case Test.MonthlyCV: - EquipmentConnection = EquipmentConnection.MET08CVHGPROBE802B150_Monthly; - eventName = EventName.FileReadMonthly; - FileNameWithoutExtension = "cv_iqs_01"; - Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; - QueryFilter = "CV_Ns"; - Title = "CV Monthly Verification"; - HTML = @"Metrology\07 - cv_verif_monthly.html"; - break; - case Test.WeeklyCV: - EquipmentConnection = EquipmentConnection.MET08CVHGPROBE802B150_Weekly; - eventName = EventName.FileReadWeekly; - FileNameWithoutExtension = "cv_iqs_01"; - Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap"; - QueryFilter = "CV_Ns"; - Title = "CV Weekly Verification"; - HTML = @"Metrology\16 - cv_verif_weekly.html"; - break; - case Test.CandelaKlarfDC: - EquipmentConnection = EquipmentConnection.MET08DDINCAN8620; - eventName = EventName.FileRead; - FileNameWithoutExtension = "candela_iqs_01"; - Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count"; - QueryFilter = "Candela Cracking"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.CandelaLaser: - EquipmentConnection = EquipmentConnection.MET08DDINCAN8620; - eventName = EventName.FileRead; - FileNameWithoutExtension = "candela_iqs_01"; - Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;Pits;Tool ID;Defect Count"; - QueryFilter = "Candela Cracking"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.CandelaVerify: - EquipmentConnection = EquipmentConnection.MET08DDINCAN8620; - eventName = EventName.FileRead; - FileNameWithoutExtension = "candela_iqs_01"; - Header = string.Concat("LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;RunID;Reactor;", "Slip Lines;Cracks;Epi Def;Haze Spot;Small LPD;Medium LPD;Large LPD;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count"); - QueryFilter = "Candela Cracking"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.CandelaPSL: - EquipmentConnection = EquipmentConnection.MET08DDINCAN8620_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "candela_iqs_01"; - Header = string.Empty; - QueryFilter = "102-83nm"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.CandelaProdU: - EquipmentConnection = EquipmentConnection.MET08DDINCAN8620_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "candela_iqs_01"; - Header = string.Empty; - QueryFilter = "SPE verification"; - Title = "Candela"; - HTML = @"GaN Epi Data\12 - candela.html"; - break; - case Test.Denton: - EquipmentConnection = EquipmentConnection.MET08EBEAMINTEGRITY26; - eventName = EventName.FileRead; - FileNameWithoutExtension = "denton_iqs_01"; - Header = "Tool;fDate;Run;Recipe;Operator;Name;Value"; - QueryFilter = "Denton_Voltage_AVG"; - Title = "Denton Data"; - HTML = @"Support Process\03 - ebeam02_denton_v1.html"; - break; - case Test.Hall: - EquipmentConnection = EquipmentConnection.MET08HALLHL5580; - eventName = EventName.FileRead; - FileNameWithoutExtension = "hall_iqs_01"; - Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; - QueryFilter = "Hall Rs"; - Title = "Hall Data"; - HTML = @"GaN Epi Data\04 - hall.html"; - break; - case Test.MonthlyHall: - EquipmentConnection = EquipmentConnection.MET08HALLHL5580_Monthly; - eventName = EventName.FileReadMonthly; - FileNameWithoutExtension = "hall_iqs_01"; - Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; - QueryFilter = "Hall Rs"; - Title = "Hall Monthly Verification"; - HTML = @"Metrology\06 - hall_verif_monthly.html"; - break; - case Test.WeeklyHall: - EquipmentConnection = EquipmentConnection.MET08HALLHL5580_Weekly; - eventName = EventName.FileReadWeekly; - FileNameWithoutExtension = "hall_iqs_01"; - Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value"; - QueryFilter = "Hall Rs"; - Title = "Hall Weekly Verification"; - HTML = @"Metrology\15 - hall_verif_weekly.html"; - break; - case Test.Lehighton: - EquipmentConnection = EquipmentConnection.MET08NDFRESIMAP151C; - eventName = EventName.FileRead; - FileNameWithoutExtension = "lei_iqs_01"; - Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value"; - QueryFilter = "LEI RS Average value"; - Title = "Lehighton"; - HTML = @"GaN Epi Data\13 - lehighton.html"; - break; - case Test.VerificationLehighton: - EquipmentConnection = EquipmentConnection.MET08NDFRESIMAP151C_Verification; - eventName = EventName.FileRead; - FileNameWithoutExtension = "___"; - Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value"; - QueryFilter = "___"; - Title = "LEI Weekly Verification 2 Ohm cm"; - HTML = @"Metrology\14 - lei_verif_weekly.html.html"; - break; - case Test.Microscope: - EquipmentConnection = EquipmentConnection.MET08MESMICROSCOPE; - eventName = EventName.FileRead; - FileNameWithoutExtension = string.Empty; - Header = string.Empty; - QueryFilter = "Microscope Center 5x"; - Title = "Total Microscope Defects"; - HTML = string.Empty; - break; - case Test.RPMXY: - EquipmentConnection = EquipmentConnection.MET08PLMAPRPM; - eventName = EventName.FileRead; - FileNameWithoutExtension = "RPM_Data"; - Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value"; - QueryFilter = "Barrier_Composition_RPM_XY"; - Title = "RPM XY Data ***&*** View Data"; - HTML = @"GaN Epi Data\09 - rpm --- 08 - photoluminescence.html"; - break; - case Test.RPMAverage: - EquipmentConnection = EquipmentConnection.MET08PLMAPRPM; - eventName = EventName.FileRead; - FileNameWithoutExtension = "RPMdata-short"; - Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File"; - QueryFilter = "Epi Thickness Mean"; - Title = "RPM Average Data"; - HTML = @"GaN Epi Data\09 - rpm.html"; - break; - case Test.RPMPLRatio: - EquipmentConnection = EquipmentConnection.MET08PLMAPRPM; - eventName = EventName.FileRead; - FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short"; - Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID"; - QueryFilter = "PL Ratio"; - Title = "Photoluminescence: PL Ratio"; - HTML = @"GaN Epi Data\08 - photoluminescence.html"; - break; - case Test.DailyRPMXY: - EquipmentConnection = EquipmentConnection.MET08PLMAPRPM_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "RPM_Data"; - Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value"; - QueryFilter = "Barrier_Composition_RPM_XY"; - Title = ""; - HTML = @"Metrology\?"; - break; - case Test.DailyRPMAverage: - EquipmentConnection = EquipmentConnection.MET08PLMAPRPM_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "RPMdata-short"; - Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File"; - QueryFilter = "Epi Thickness Mean"; - Title = ""; - HTML = @"Metrology\?"; - break; - case Test.DailyRPMPLRatio: - EquipmentConnection = EquipmentConnection.MET08PLMAPRPM_Daily; - eventName = EventName.FileReadDaily; - FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short"; - Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID"; - QueryFilter = "PL Ratio"; - Title = "RPM Daily Verification"; - HTML = @"Metrology\17 - rpm_verif_daily.html"; - break; - case Test.VerificationRPM: - EquipmentConnection = EquipmentConnection.MET08PLMAPRPM_Verification; - eventName = EventName.FileReadVerification; - FileNameWithoutExtension = "PhotoLuminescence_Ver"; - Header = "Part;Process;Date;Test;Value"; - QueryFilter = "PL Edge Wavelength"; - Title = "PL Daily Verification - [PL Edge Wavelength]"; - HTML = @"Metrology\18 - photoluminescence_verif_daily.html"; - break; - case Test.Photoreflectance: - EquipmentConnection = EquipmentConnection.MET08PRFUSB4000; - eventName = EventName.FileRead; - FileNameWithoutExtension = "photoreflect_iqs_01"; - Header = "Lot;Date;Part;Reactor;Scribe;Pocket;Tool;Point;WaferPosition_PR;PR_Peak"; - QueryFilter = "PR Barrier Composition"; - Title = "Photoreflectance 6 in, Photoreflectance 8 in"; - HTML = @"GaN Epi Data\07 - photoreflectance.html"; - break; - case Test.UV: - EquipmentConnection = EquipmentConnection.MET08UVH44GS100M; - eventName = EventName.FileRead; - FileNameWithoutExtension = "uv_iqs_01"; - Header = string.Empty; - QueryFilter = "UV Broken"; - Title = "UV"; - HTML = @"GaN Epi Data\15 - uv 2.1.html"; - break; - case Test.VpdIcpmsAnalyte: - EquipmentConnection = EquipmentConnection.MET08VPDSUBCON; - eventName = EventName.FileRead; - FileNameWithoutExtension = "VPD_iqs_01"; - Header = "Reactor;RunID;RunDate;PartNumber;PocketNumber;WaferScribe;Analyte;Value"; - QueryFilter = "Mg"; - Title = "VpdIcpmsAnalyteData"; - HTML = @""; - break; - case Test.WarpAndBow: - EquipmentConnection = EquipmentConnection.MET08WGEOMX203641Q; - eventName = EventName.FileRead; - FileNameWithoutExtension = "warp_iqs_01"; - Header = "fDate;fRecipeName;fProductId;g4Scribe;warp;bow;tool;Reactor;Pocket ID;bow_range;BowX;BowY;CenterBow"; - QueryFilter = "BowCenter"; - Title = "Warp and Bow"; - HTML = @"GaN Epi Data\14 - warp.html"; - break; - case Test.VerificationWarpAndBow: - EquipmentConnection = EquipmentConnection.MET08WGEOMX203641Q_Verification; - eventName = EventName.FileReadVerification; - FileNameWithoutExtension = "warp_ver_iqs_01"; - Header = "Part;Process;Date;WaferScribe;totWarp;bow"; - QueryFilter = "Bow Calibration"; - Title = "6 Inch Warp/Bow Daily Verification, 8 Inch Warp/Bow Daily Verification"; - HTML = @"Metrology\19 - warp_cal_daily.html"; - break; - case Test.XRDXY: - EquipmentConnection = EquipmentConnection.MET08XRDXPERTPROMRDXL; - eventName = EventName.FileRead; - FileNameWithoutExtension = "xrd_iqs_NEW_01"; - Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group"; - QueryFilter = "SL Period"; - Title = "XRD XY Raw Data Viewer"; - HTML = @"GaN Epi Data\11 - xrd.html"; - break; - case Test.XRDWeightedAverage: - EquipmentConnection = EquipmentConnection.MET08XRDXPERTPROMRDXL; - eventName = EventName.FileRead; - FileNameWithoutExtension = "xrd_iqs_NEW_01_WtAVG"; - Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;Name;Value;Group"; - QueryFilter = "Al% Barrier WTAVG"; - Title = "XRD Weighted Average Data"; - HTML = @"GaN Epi Data\11 - xrd.html"; - break; - case Test.MonthlyXRD: - EquipmentConnection = EquipmentConnection.MET08XRDXPERTPROMRDXL_Monthly; - eventName = EventName.FileReadMonthly; - FileNameWithoutExtension = "xrd_monthly_ver_iqs_01"; - Header = "Part;Process;Date;TestName;Value"; - QueryFilter = "XRD 2-Theta Position"; - Title = "XRD Monthly Verification"; - HTML = @"Metrology\03 - xrd_verif_monthly.html"; - break; - case Test.WeeklyXRD: - EquipmentConnection = EquipmentConnection.MET08XRDXPERTPROMRDXL_Weekly; - eventName = EventName.FileReadWeekly; - FileNameWithoutExtension = "xrd_weekly_ver_iqs_01"; - Header = "Part;Process;Lot;Date;TestName;Value"; - QueryFilter = "XRD Weekly AL% Center"; - Title = "XRD Weekly Verification"; - HTML = @"Metrology\12 - xrd_verif_weekly.html"; - break; - case Test.XRDXRAY: - EquipmentConnection = EquipmentConnection.METBRXRAYJV7300L; - eventName = EventName.FileRead; - FileNameWithoutExtension = "xrd_iqs_NEW_01"; - Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group"; - QueryFilter = "SL Period"; - Title = "XRD XY Raw Data Viewer"; - HTML = @"GaN Epi Data\11 - xrd.html"; - break; - default: - throw new Exception(); - } - FileName = string.Concat(FileNameWithoutExtension, ".txt"); - return eventName.ToString(); - } - - public override string ToString() - { - return string.Concat(EquipmentConnection, " - (", Enum, ""); - } - - } - -} \ No newline at end of file diff --git a/Shared/Metrology/Test.cs b/Shared/Metrology/Test.cs deleted file mode 100644 index f0e52d4..0000000 --- a/Shared/Metrology/Test.cs +++ /dev/null @@ -1,56 +0,0 @@ -namespace Shared.Metrology -{ - - public enum Test - { - AFMRoughness = 34, - BioRadQS408M = 25, - BioRadStratus = 26, - BreakdownVoltageCenter = 0, - BreakdownVoltageEdge = 1, - BreakdownVoltageMiddle8in = 2, - CandelaKlarfDC = 6, - CandelaLaser = 36, - CandelaProdU = 39, - CandelaPSL = 38, - CandelaVerify = 37, - CDE = 24, - CV = 3, - DailyRPMAverage = 19, - DailyRPMPLRatio = 20, - DailyRPMXY = 18, - Denton = 9, - DiffusionLength = 45, - Hall = 10, - HgCV = 23, - Lehighton = 13, - Microscope = 46, - MonthlyCV = 4, - MonthlyHall = 11, - MonthlyXRD = 32, - Photoreflectance = 22, - RPMAverage = 16, - RPMPLRatio = 17, - RPMXY = 15, - SP1 = 8, - Tencor = 7, - UV = 35, - VerificationLehighton = 14, - VerificationRPM = 21, - VerificationWarpAndBow = 29, - VpdIcpmsAnalyte = 27, - WarpAndBow = 28, - WeeklyCV = 5, - WeeklyHall = 12, - WeeklyXRD = 33, - WeeklyXRDAIcomp = 40, - WeeklyXRDFWHM002 = 41, - WeeklyXRDFWHM105 = 42, - WeeklyXRDSLStks = 43, - WeeklyXRDXRR = 44, - XRDWeightedAverage = 31, - XRDXRAY = 47, //Largest - XRDXY = 30 - } - -} diff --git a/Shared/Metrology/WS.Attachment.cs b/Shared/Metrology/WS.Attachment.cs deleted file mode 100644 index 2618e7e..0000000 --- a/Shared/Metrology/WS.Attachment.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Shared.Metrology -{ - - public partial class WS - { - public class Attachment - { - - public string UniqueId { get; set; } - public string DestinationFileName { get; set; } - public string SourceFileName { get; set; } - - public Attachment(string uniqueId, string destinationFileName, string sourceFileName) - { - UniqueId = uniqueId; - DestinationFileName = destinationFileName; - SourceFileName = sourceFileName; - } - - } - - } - -} diff --git a/Shared/Metrology/WS.Results.cs b/Shared/Metrology/WS.Results.cs deleted file mode 100644 index 17a0883..0000000 --- a/Shared/Metrology/WS.Results.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json; - -namespace Shared.Metrology -{ - - public partial class WS - { - // this class represents the response from the Inbound API endpoint - public class Results - { - // true or false if data was written to the database - public bool Success { get; set; } - - // if true, contains ID of the Header record in the database - public long HeaderID { get; set; } - - // if false, this collection will contain a list of errors - public List Errors { get; set; } - - // this collection will contain a list of warnings, they will not prevent data from being saved - public List Warnings { get; set; } - - // this is just a helper function to make displaying the results easier - public override string ToString() - { - return JsonSerializer.Serialize(this, GetType()); - } - } - - } - -} diff --git a/Shared/Metrology/WS.cs b/Shared/Metrology/WS.cs deleted file mode 100644 index 1b5250a..0000000 --- a/Shared/Metrology/WS.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Text; -using System.Text.Json; - -namespace Shared.Metrology -{ - - public partial class WS - { - - public static Tuple SendData(string url, object payload, int timeoutSeconds = 120) - { - Results results = new Results(); - string resultsJson = string.Empty; - try - { - string json = JsonSerializer.Serialize(payload, payload.GetType()); - if (string.IsNullOrEmpty(url) || !url.Contains(":") || !url.Contains(".")) - throw new Exception("Invalid URL"); - using (HttpClient httpClient = new HttpClient()) - { - httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0); - HttpRequestMessage httpRequestMessage = new HttpRequestMessage - { - RequestUri = new Uri(url), - Method = HttpMethod.Post, - Content = new StringContent(json, Encoding.UTF8, "application/json") - }; - System.Threading.CancellationToken cancellationToken; - HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead, cancellationToken).Result; - resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result; - results = JsonSerializer.Deserialize(resultsJson); - } - if (!results.Success) - results.Errors.Add(results.ToString()); - } - catch (Exception e) - { - Exception exception = e; - StringBuilder stringBuilder = new StringBuilder(); - while (!(exception is null)) - { - stringBuilder.AppendLine(exception.Message); - exception = exception.InnerException; - } - if (results.Errors is null) - results.Errors = new List(); - results.Errors.Add(stringBuilder.ToString()); - } - return new Tuple(resultsJson, results); - } - - // this method is a wrapper for attaching a file to either a header or data record - // URL is the same URL used for SendData, ex: http://localhost/api/inbound/CDE - // attachToHeaderId is the ID returned by SendData - // attachToDataUniqueId is the string unique ID for the data record, aka the Title of the Sharepoint list entry - // fileContents is a byte array with the contents of the file - // fileName is which attachment this is, image.pdf, data.pdf, data.txt, header.pdf, etc - // timeoutSeconds is configured as the request timeout - // this method will either succeed or throw an exception - // also, this has been made synchronous - public static void AttachFile(string url, long attachToHeaderId, string attachToDataUniqueId, byte[] fileContents, string fileName, int timeoutSeconds = 60) - { - using (HttpClient httpClient = new HttpClient()) - { - string requestUrl = url + "/attachment?headerid=" + attachToHeaderId.ToString(); - if (!string.IsNullOrWhiteSpace(attachToDataUniqueId)) - { - requestUrl += "&datauniqueid="; - requestUrl += System.Net.WebUtility.UrlEncode(attachToDataUniqueId); - } - requestUrl += "&filename="; // this is just so the web server log shows the filename - requestUrl += System.Net.WebUtility.UrlEncode(fileName); - - httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0); - - MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent(); - ByteArrayContent byteArrayContent = new ByteArrayContent(fileContents); - byteArrayContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); - - multipartFormDataContent.Add(byteArrayContent, "attachment", fileName); - - HttpResponseMessage httpResponseMessage = httpClient.PostAsync(requestUrl, multipartFormDataContent).Result; - - if (httpResponseMessage.IsSuccessStatusCode) - return; - - string resultBody = httpResponseMessage.Content.ReadAsStringAsync().Result; - - throw new Exception("Attachment failed: " + resultBody); - } - } - - public static void AttachFiles(string url, long headerID, List headerAttachments = null, List dataAttachments = null) - { - try - { - if (!(headerAttachments is null)) - { - foreach (Attachment attachment in headerAttachments) - AttachFile(url, headerID, "", System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); - } - if (!(dataAttachments is null)) - { - foreach (Attachment attachment in dataAttachments) - AttachFile(url, headerID, attachment.UniqueId, System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); - } - //MessageBox.Show(r.ToString()); - } - catch (Exception e) - { - Exception exception = e; - StringBuilder stringBuilder = new StringBuilder(); - while (!(exception is null)) - { - stringBuilder.AppendLine(exception.Message); - exception = exception.InnerException; - } - //MessageBox.Show(msgs.ToString(), "Exception", //MessageBoxButtons.OK, //MessageBoxIcon.Error); - throw new Exception(stringBuilder.ToString()); - } - } - - } - -}