From 660b89c129d74aa3e4b3e46d6c8f14ca38e5fcc1 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Tue, 24 Jan 2023 08:45:13 -0700 Subject: [PATCH] 2023-01-24 --- .gitignore | 340 ++ .vscode/settings.json | 12 + Adaptation/.editorconfig | 245 ++ Adaptation/.vscode/format-report.json | 200 ++ Adaptation/.vscode/launch.json | 10 + Adaptation/.vscode/settings.json | 46 + Adaptation/.vscode/tasks.json | 42 + .../Core/AutoGenerated/BackboneComponent.cs | 5 + .../Core/AutoGenerated/BackboneStatusCache.cs | 5 + .../AutoGenerated/ILoggingSetupManager.cs | 5 + .../Eaf/Core/AutoGenerated/StatusItem.cs | 5 + Adaptation/Eaf/Core/Backbone.cs | 53 + Adaptation/Eaf/Core/Smtp/EmailMessage.cs | 25 + Adaptation/Eaf/Core/Smtp/ISmtp.cs | 6 + Adaptation/Eaf/Core/Smtp/MailPriority.cs | 8 + .../ChangeDataCollectionHandler.cs | 5 + .../AutoGenerated/DataCollectionRequest.cs | 5 + .../Control/AutoGenerated/EquipmentEvent.cs | 5 + .../AutoGenerated/EquipmentException.cs | 5 + .../AutoGenerated/EquipmentSelfDescription.cs | 5 + .../GetParameterValuesHandler.cs | 5 + .../AutoGenerated/IConnectionControl.cs | 5 + .../AutoGenerated/IDataTracingHandler.cs | 5 + .../AutoGenerated/IEquipmentCommandService.cs | 5 + .../AutoGenerated/IEquipmentControl.cs | 15 + .../IEquipmentSelfDescriptionBuilder.cs | 5 + .../Control/AutoGenerated/IPackage.cs | 5 + .../AutoGenerated/ISelfDescriptionLookup.cs | 5 + .../IVirtualParameterValuesHandler.cs | 5 + .../SetParameterValuesHandler.cs | 5 + .../Control/AutoGenerated/TraceRequest.cs | 5 + .../Control/IEquipmentDataCollection.cs | 38 + .../EquipmentCore/Control/IPackageSource.cs | 5 + .../Reporting/ParameterValue.cs | 25 + .../ElementDescription/EquipmentParameter.cs | 27 + .../SelfDescription/ParameterTypes/Field.cs | 16 + .../ParameterTypes/ParameterTypeDefinition.cs | 16 + .../ParameterTypes/StructuredType.cs | 16 + .../CellAutomation/IConfigurationObject.cs | 5 + .../ModelObjectParameterDefinition.cs | 30 + .../ModelObjectParameterType.cs | 16 + .../SecsConnectionConfiguration.cs | 43 + Adaptation/FileHandlers/APC/FileRead.cs | 135 + Adaptation/FileHandlers/Archive/FileRead.cs | 154 + .../CellInstanceConnectionName.cs | 33 + .../ConvertExcelToJson/FIBacklogMesa.cs | 129 + .../ConvertExcelToJson/FileRead.cs | 127 + .../ConvertExcelToJson/ProcessData.cs | 141 + Adaptation/FileHandlers/Dummy/FileRead.cs | 286 ++ Adaptation/FileHandlers/IQSSi/FileRead.cs | 136 + .../MoveMatchingFiles/FileRead.cs | 209 ++ .../FileHandlers/OpenInsight/FileRead.cs | 133 + .../OpenInsightMetrologyViewer/FileRead.cs | 143 + .../FileRead.cs | 150 + Adaptation/FileHandlers/Processed/FileRead.cs | 167 + Adaptation/FileHandlers/SPaCe/FileRead.cs | 134 + Adaptation/FileHandlers/json/FileRead.cs | 147 + Adaptation/FileHandlers/json/ProcessData.cs | 120 + .../FileHandlers/json/ViewModels/WorkItem.cs | 79 + Adaptation/FileHandlers/json/WIQL/Column.cs | 22 + Adaptation/FileHandlers/json/WIQL/Field.cs | 22 + Adaptation/FileHandlers/json/WIQL/Root.cs | 32 + .../FileHandlers/json/WIQL/SortColumn.cs | 19 + Adaptation/FileHandlers/json/WIQL/WorkItem.cs | 19 + .../FileHandlers/json/WorkItems/Avatar.cs | 13 + .../FileHandlers/json/WorkItems/Fields.cs | 175 + .../FileHandlers/json/WorkItems/Html.cs | 13 + .../FileHandlers/json/WorkItems/Links.cs | 37 + .../FileHandlers/json/WorkItems/Root.cs | 30 + .../FileHandlers/json/WorkItems/Self.cs | 13 + .../FileHandlers/json/WorkItems/User.cs | 34 + .../json/WorkItems/WorkItemComments.cs | 13 + .../json/WorkItems/WorkItemRevisions.cs | 13 + .../json/WorkItems/WorkItemType.cs | 13 + .../json/WorkItems/WorkItemUpdates.cs | 13 + .../Common/Configuration/ConnectionSetting.cs | 17 + .../EquipmentConnector/File/Component/File.cs | 23 + .../File/Component/FilePathGenerator.cs | 40 + .../FileConnectorConfiguration.cs | 134 + ...onnectorParameterTypeDefinitionProvider.cs | 18 + .../Infineon/Monitoring/MonA/ExtWebClient.cs | 20 + Adaptation/Infineon/Monitoring/MonA/IMonIn.cs | 167 + Adaptation/Infineon/Monitoring/MonA/MonIn.cs | 292 ++ Adaptation/Infineon/Monitoring/MonA/State.cs | 11 + Adaptation/MESAFIBACKLOG.Tests.csproj | 97 + .../GCL/Annotations/NotNullAttribute.cs | 9 + .../GCL/SecsDriver/HsmsConnectionMode.cs | 7 + .../GCL/SecsDriver/HsmsSessionMode.cs | 7 + .../GCL/SecsDriver/SecsTransportType.cs | 7 + .../GCL/SecsDriver/SerialBaudRate.cs | 15 + Adaptation/Shared/Duplicator/Description.cs | 145 + Adaptation/Shared/FileRead.cs | 676 ++++ Adaptation/Shared/Logistics.cs | 201 ++ Adaptation/Shared/Logistics2.cs | 78 + Adaptation/Shared/Methods/IDescription.cs | 22 + Adaptation/Shared/Methods/IFileRead.cs | 22 + 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/ScopeInfo.cs | 300 ++ Adaptation/Shared/Metrology/WS.Attachment.cs | 21 + Adaptation/Shared/Metrology/WS.Results.cs | 27 + Adaptation/Shared/Metrology/WS.cs | 123 + Adaptation/Shared/ParameterType.cs | 10 + .../Shared/ProcessDataStandardFormat.cs | 409 +++ Adaptation/Shared/Properties/IDescription.cs | 11 + Adaptation/Shared/Properties/IFileRead.cs | 18 + Adaptation/Shared/Properties/ILogistics.cs | 23 + 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.43.0/BACKLOG-EQPT.cs | 66 + .../Staging/v2.43.0/BACKLOG.cs | 66 + .../Extract/Staging/v2.43.0/BACKLOG-EQPT.cs | 54 + .../_Tests/Extract/Staging/v2.43.0/BACKLOG.cs | 54 + Adaptation/_Tests/Shared/AdaptationTesting.cs | 1280 +++++++ .../_Tests/Shared/EAFLoggingUnitTesting.cs | 28 + Adaptation/_Tests/Shared/IsEnvironment.cs | 168 + Adaptation/_Tests/Shared/Log/ConsoleLogger.cs | 36 + .../_Tests/Shared/Log/ConsoleProvider.cs | 27 + Adaptation/_Tests/Shared/Log/DebugLogger.cs | 36 + Adaptation/_Tests/Shared/Log/DebugProvider.cs | 27 + .../_Tests/Shared/Log/FeedbackLogger.cs | 49 + .../_Tests/Shared/Log/FeedbackProvider.cs | 29 + Adaptation/_Tests/Shared/Log/IFeedback.cs | 11 + Adaptation/_Tests/Shared/Log/Log.cs | 139 + .../_Tests/Shared/LoggingUnitTesting.cs | 112 + Adaptation/_Tests/Shared/MethodBaseName.cs | 45 + .../EAF XML API/CellInstance.cs | 3058 +++++++++++++++++ .../EAF XML API/ConfigurationData.cs | 23 + .../EAF XML API/EquipmentDictionary.cs | 1302 +++++++ .../EAF XML API/EquipmentType.cs | 964 ++++++ Adaptation/_Tests/Shared/UnitTesting.cs | 99 + Adaptation/_Tests/Static/BACKLOG.cs | 73 + Adaptation/appsettings.Development.json | 139 + Adaptation/appsettings.json | 139 + Adaptation/package.json | 22 + FileHandlers/FileRead.cs | 355 ++ MESAFIBACKLOG.csproj | 189 + Properties/AssemblyInfo.cs | 36 + README.md | 20 + Shared/FilePathGenerator.cs | 20 + Shared/FilePathGeneratorInfo.cs | 63 + Shared/Mapper.cs | 74 + 146 files changed, 16122 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 Adaptation/.editorconfig create mode 100644 Adaptation/.vscode/format-report.json create mode 100644 Adaptation/.vscode/launch.json create mode 100644 Adaptation/.vscode/settings.json create mode 100644 Adaptation/.vscode/tasks.json create mode 100644 Adaptation/Eaf/Core/AutoGenerated/BackboneComponent.cs create mode 100644 Adaptation/Eaf/Core/AutoGenerated/BackboneStatusCache.cs create mode 100644 Adaptation/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs create mode 100644 Adaptation/Eaf/Core/AutoGenerated/StatusItem.cs create mode 100644 Adaptation/Eaf/Core/Backbone.cs create mode 100644 Adaptation/Eaf/Core/Smtp/EmailMessage.cs create mode 100644 Adaptation/Eaf/Core/Smtp/ISmtp.cs create mode 100644 Adaptation/Eaf/Core/Smtp/MailPriority.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs create mode 100644 Adaptation/Eaf/EquipmentCore/Control/IPackageSource.cs create mode 100644 Adaptation/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs create mode 100644 Adaptation/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs create mode 100644 Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs create mode 100644 Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs create mode 100644 Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs create mode 100644 Adaptation/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs create mode 100644 Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs create mode 100644 Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs create mode 100644 Adaptation/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs create mode 100644 Adaptation/FileHandlers/APC/FileRead.cs create mode 100644 Adaptation/FileHandlers/Archive/FileRead.cs create mode 100644 Adaptation/FileHandlers/CellInstanceConnectionName.cs create mode 100644 Adaptation/FileHandlers/ConvertExcelToJson/FIBacklogMesa.cs create mode 100644 Adaptation/FileHandlers/ConvertExcelToJson/FileRead.cs create mode 100644 Adaptation/FileHandlers/ConvertExcelToJson/ProcessData.cs create mode 100644 Adaptation/FileHandlers/Dummy/FileRead.cs create mode 100644 Adaptation/FileHandlers/IQSSi/FileRead.cs create mode 100644 Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs create mode 100644 Adaptation/FileHandlers/OpenInsight/FileRead.cs create mode 100644 Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs create mode 100644 Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs create mode 100644 Adaptation/FileHandlers/Processed/FileRead.cs create mode 100644 Adaptation/FileHandlers/SPaCe/FileRead.cs create mode 100644 Adaptation/FileHandlers/json/FileRead.cs create mode 100644 Adaptation/FileHandlers/json/ProcessData.cs create mode 100644 Adaptation/FileHandlers/json/ViewModels/WorkItem.cs create mode 100644 Adaptation/FileHandlers/json/WIQL/Column.cs create mode 100644 Adaptation/FileHandlers/json/WIQL/Field.cs create mode 100644 Adaptation/FileHandlers/json/WIQL/Root.cs create mode 100644 Adaptation/FileHandlers/json/WIQL/SortColumn.cs create mode 100644 Adaptation/FileHandlers/json/WIQL/WorkItem.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/Avatar.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/Fields.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/Html.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/Links.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/Root.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/Self.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/User.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/WorkItemComments.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/WorkItemRevisions.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/WorkItemType.cs create mode 100644 Adaptation/FileHandlers/json/WorkItems/WorkItemUpdates.cs create mode 100644 Adaptation/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs create mode 100644 Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/File.cs create mode 100644 Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs create mode 100644 Adaptation/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs create mode 100644 Adaptation/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs create mode 100644 Adaptation/Infineon/Monitoring/MonA/ExtWebClient.cs create mode 100644 Adaptation/Infineon/Monitoring/MonA/IMonIn.cs create mode 100644 Adaptation/Infineon/Monitoring/MonA/MonIn.cs create mode 100644 Adaptation/Infineon/Monitoring/MonA/State.cs create mode 100644 Adaptation/MESAFIBACKLOG.Tests.csproj create mode 100644 Adaptation/PeerGroup/GCL/Annotations/NotNullAttribute.cs create mode 100644 Adaptation/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs create mode 100644 Adaptation/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs create mode 100644 Adaptation/PeerGroup/GCL/SecsDriver/SecsTransportType.cs create mode 100644 Adaptation/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs create mode 100644 Adaptation/Shared/Duplicator/Description.cs create mode 100644 Adaptation/Shared/FileRead.cs create mode 100644 Adaptation/Shared/Logistics.cs create mode 100644 Adaptation/Shared/Logistics2.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 create mode 100644 Adaptation/Shared/Metrology/ScopeInfo.cs create mode 100644 Adaptation/Shared/Metrology/WS.Attachment.cs create mode 100644 Adaptation/Shared/Metrology/WS.Results.cs create mode 100644 Adaptation/Shared/Metrology/WS.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.43.0/BACKLOG-EQPT.cs create mode 100644 Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.0/BACKLOG.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.43.0/BACKLOG-EQPT.cs create mode 100644 Adaptation/_Tests/Extract/Staging/v2.43.0/BACKLOG.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/Log/ConsoleLogger.cs create mode 100644 Adaptation/_Tests/Shared/Log/ConsoleProvider.cs create mode 100644 Adaptation/_Tests/Shared/Log/DebugLogger.cs create mode 100644 Adaptation/_Tests/Shared/Log/DebugProvider.cs create mode 100644 Adaptation/_Tests/Shared/Log/FeedbackLogger.cs create mode 100644 Adaptation/_Tests/Shared/Log/FeedbackProvider.cs create mode 100644 Adaptation/_Tests/Shared/Log/IFeedback.cs create mode 100644 Adaptation/_Tests/Shared/Log/Log.cs create mode 100644 Adaptation/_Tests/Shared/LoggingUnitTesting.cs create mode 100644 Adaptation/_Tests/Shared/MethodBaseName.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/_Tests/Static/BACKLOG.cs create mode 100644 Adaptation/appsettings.Development.json create mode 100644 Adaptation/appsettings.json create mode 100644 Adaptation/package.json create mode 100644 FileHandlers/FileRead.cs create mode 100644 MESAFIBACKLOG.csproj create mode 100644 Properties/AssemblyInfo.cs create mode 100644 README.md create mode 100644 Shared/FilePathGenerator.cs create mode 100644 Shared/FilePathGeneratorInfo.cs create mode 100644 Shared/Mapper.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eab1f67 --- /dev/null +++ b/.gitignore @@ -0,0 +1,340 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +*.lnk diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1708c7e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "cSpell.words": [ + "Epuipment", + "Idrv", + "Irng", + "Rcpe", + "RESIMAPCDE", + "Rsens", + "Smpl", + "Vrng" + ] +} \ No newline at end of file diff --git a/Adaptation/.editorconfig b/Adaptation/.editorconfig new file mode 100644 index 0000000..b84fca4 --- /dev/null +++ b/Adaptation/.editorconfig @@ -0,0 +1,245 @@ +[*.cs] +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true +csharp_prefer_braces = false +csharp_prefer_simple_default_expression = true:warning +csharp_prefer_simple_using_statement = true:warning +csharp_prefer_static_local_function = true:warning +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true +csharp_style_allow_embedded_statements_on_same_line_experimental = true +csharp_style_conditional_delegate_call = true +csharp_style_deconstructed_variable_declaration = false +csharp_style_expression_bodied_accessors = when_on_single_line:warning +csharp_style_expression_bodied_constructors = when_on_single_line:warning +csharp_style_expression_bodied_indexers = when_on_single_line:warning +csharp_style_expression_bodied_lambdas = when_on_single_line:warning +csharp_style_expression_bodied_local_functions = when_on_single_line:warning +csharp_style_expression_bodied_methods = when_on_single_line:warning +csharp_style_expression_bodied_operators = when_on_single_line:warning +csharp_style_expression_bodied_properties = when_on_single_line:warning +csharp_style_implicit_object_creation_when_type_is_apparent = true:warning +csharp_style_inlined_variable_declaration = false +csharp_style_namespace_declarations = file_scoped:warning +csharp_style_pattern_local_over_anonymous_function = true:warning +csharp_style_pattern_matching_over_as_with_null_check = true:warning +csharp_style_pattern_matching_over_is_with_cast_check = true:warning +csharp_style_prefer_index_operator = false:warning +csharp_style_prefer_not_pattern = true:warning +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_pattern_matching = true:warning +csharp_style_prefer_range_operator = false:warning +csharp_style_prefer_switch_expression = true:warning +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable:warning +csharp_style_unused_value_expression_statement_preference = discard_variable:warning +csharp_style_var_elsewhere = false:warning +csharp_style_var_for_built_in_types = false:warning +csharp_style_var_when_type_is_apparent = false:warning +csharp_using_directive_placement = outside_namespace +dotnet_code_quality_unused_parameters = all +dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter +dotnet_code_quality.CAXXXX.api_surface = private, internal +dotnet_diagnostic.CA1825.severity = warning # CA1823: Avoid zero-length array allocations +dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available +dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable +dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name +dotnet_diagnostic.IDE0004.severity = warning # IDE0004: Cast is redundant. +dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) - System.Version.Equals("1", "2"); Version.Equals("1", "2"); +dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary +dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed +dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049) +dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter +dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning +dotnet_naming_rule.abstract_method_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method +dotnet_naming_rule.class_should_be_pascal_case.severity = warning +dotnet_naming_rule.class_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.class_should_be_pascal_case.symbols = class +dotnet_naming_rule.delegate_should_be_pascal_case.severity = warning +dotnet_naming_rule.delegate_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.delegate_should_be_pascal_case.symbols = delegate +dotnet_naming_rule.enum_should_be_pascal_case.severity = warning +dotnet_naming_rule.enum_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.enum_should_be_pascal_case.symbols = enum +dotnet_naming_rule.event_should_be_pascal_case.severity = warning +dotnet_naming_rule.event_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.event_should_be_pascal_case.symbols = event +dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.method_should_be_pascal_case.severity = warning +dotnet_naming_rule.method_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.method_should_be_pascal_case.symbols = method +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.private_method_should_be_pascal_case.severity = warning +dotnet_naming_rule.private_method_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.private_method_should_be_pascal_case.symbols = private_method +dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.severity = warning +dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.style = private_of_internal_field +dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.symbols = private_or_internal_field +dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.severity = warning +dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.style = private_of_internal_field +dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.symbols = private_or_internal_static_field +dotnet_naming_rule.property_should_be_pascal_case.severity = warning +dotnet_naming_rule.property_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.property_should_be_pascal_case.symbols = property +dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.severity = warning +dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.style = private_of_internal_field +dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.symbols = public_or_protected_field +dotnet_naming_rule.static_field_should_be_pascal_case.severity = warning +dotnet_naming_rule.static_field_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.static_field_should_be_pascal_case.symbols = static_field +dotnet_naming_rule.static_method_should_be_pascal_case.severity = warning +dotnet_naming_rule.static_method_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.static_method_should_be_pascal_case.symbols = static_method +dotnet_naming_rule.struct_should_be_pascal_case.severity = warning +dotnet_naming_rule.struct_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.struct_should_be_pascal_case.symbols = struct +dotnet_naming_rule.types_should_be_pascal_case.severity = warning +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_style.begins_with_i.capitalization = pascal_case +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.private_of_internal_field.capitalization = pascal_case +dotnet_naming_style.private_of_internal_field.required_prefix = _ +dotnet_naming_style.private_of_internal_field.required_suffix = +dotnet_naming_style.private_of_internal_field.word_separator = +dotnet_naming_symbols.abstract_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.abstract_method.applicable_kinds = method +dotnet_naming_symbols.abstract_method.required_modifiers = abstract +dotnet_naming_symbols.class.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.class.applicable_kinds = class +dotnet_naming_symbols.class.required_modifiers = +dotnet_naming_symbols.delegate.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.delegate.applicable_kinds = delegate +dotnet_naming_symbols.delegate.required_modifiers = +dotnet_naming_symbols.enum.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.enum.applicable_kinds = enum +dotnet_naming_symbols.enum.required_modifiers = +dotnet_naming_symbols.event.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.event.applicable_kinds = event +dotnet_naming_symbols.event.required_modifiers = +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.required_modifiers = +dotnet_naming_symbols.method.applicable_accessibilities = public +dotnet_naming_symbols.method.applicable_kinds = method +dotnet_naming_symbols.method.required_modifiers = +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.required_modifiers = +dotnet_naming_symbols.private_method.applicable_accessibilities = private +dotnet_naming_symbols.private_method.applicable_kinds = method +dotnet_naming_symbols.private_method.required_modifiers = +dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected +dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_field.required_modifiers = +dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected +dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static +dotnet_naming_symbols.property.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.property.applicable_kinds = property +dotnet_naming_symbols.property.required_modifiers = +dotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected +dotnet_naming_symbols.public_or_protected_field.applicable_kinds = field +dotnet_naming_symbols.public_or_protected_field.required_modifiers = +dotnet_naming_symbols.static_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.static_field.applicable_kinds = field +dotnet_naming_symbols.static_field.required_modifiers = static +dotnet_naming_symbols.static_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.static_method.applicable_kinds = method +dotnet_naming_symbols.static_method.required_modifiers = static +dotnet_naming_symbols.struct.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.struct.applicable_kinds = struct +dotnet_naming_symbols.struct.required_modifiers = +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.required_modifiers = +dotnet_remove_unnecessary_suppression_exclusions = 0 +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +dotnet_style_allow_multiple_blank_lines_experimental = false:warning +dotnet_style_allow_statement_immediately_after_block_experimental = true +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true:warning +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true:warning +dotnet_style_object_initializer = true:warning +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true:warning +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_compound_assignment = true:warning +dotnet_style_prefer_conditional_expression_over_assignment = false +dotnet_style_prefer_conditional_expression_over_return = false +dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning +dotnet_style_prefer_inferred_tuple_names = true:warning +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning +dotnet_style_prefer_simplified_boolean_expressions = true:warning +dotnet_style_prefer_simplified_interpolation = true +dotnet_style_qualification_for_event = false:error +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false:error +dotnet_style_qualification_for_property = false:error +dotnet_style_readonly_field = true:warning +dotnet_style_require_accessibility_modifiers = for_non_interface_members +end_of_line = crlf +file_header_template = unset +indent_size = 4 +indent_style = space +insert_final_newline = false +root = true +tab_width = 4 +# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1822 +# https://github.com/dotnet/aspnetcore/blob/main/.editorconfig +# https://github.com/dotnet/project-system/blob/main/.editorconfig \ No newline at end of file diff --git a/Adaptation/.vscode/format-report.json b/Adaptation/.vscode/format-report.json new file mode 100644 index 0000000..fcec3ef --- /dev/null +++ b/Adaptation/.vscode/format-report.json @@ -0,0 +1,200 @@ +[ + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "9e6e3881-2c77-41ba-83c3-c15a21699111" + }, + "FileName": "ProcessData.cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\ProcessData.cs", + "FileChanges": [ + { + "LineNumber": 1, + "CharNumber": 1, + "DiagnosticId": "WHITESPACE", + "FormatDescription": "Fix whitespace formatting." + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "a32feb09-3c35-4534-8f83-436319852545" + }, + "FileName": "FileRead.cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\OpenInsightMetrologyViewerAttachments\\FileRead.cs", + "FileChanges": [ + { + "LineNumber": 111, + "CharNumber": 120, + "DiagnosticId": "IDE0060", + "FormatDescription": "warning IDE0060: Remove unused parameter \u0027descriptions\u0027" + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "d629cdaf-aa21-4193-ae17-aecafca36ca6" + }, + "FileName": "FileRead.cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\FileRead.cs", + "FileChanges": [ + { + "LineNumber": 13, + "CharNumber": 1, + "DiagnosticId": "IDE0005", + "FormatDescription": "warning IDE0005: Using directive is unnecessary." + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "d629cdaf-aa21-4193-ae17-aecafca36ca6" + }, + "FileName": "FileRead.cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\FileRead.cs", + "FileChanges": [ + { + "LineNumber": 53, + "CharNumber": 24, + "DiagnosticId": "IDE0002", + "FormatDescription": "warning IDE0002: Name can be simplified." + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "0d78829b-6f7b-4313-95dd-ca86ae3e359f" + }, + "FileName": ".cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\.cs", + "FileChanges": [ + { + "LineNumber": 16, + "CharNumber": 33, + "DiagnosticId": "IDE1006", + "FormatDescription": "warning IDE1006: Naming rule violation: Missing prefix: \u0027_\u0027" + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "0d78829b-6f7b-4313-95dd-ca86ae3e359f" + }, + "FileName": ".cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\.cs", + "FileChanges": [ + { + "LineNumber": 15, + "CharNumber": 36, + "DiagnosticId": "IDE1006", + "FormatDescription": "warning IDE1006: Naming rule violation: Missing prefix: \u0027_\u0027" + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "0d78829b-6f7b-4313-95dd-ca86ae3e359f" + }, + "FileName": ".cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\.cs", + "FileChanges": [ + { + "LineNumber": 17, + "CharNumber": 36, + "DiagnosticId": "IDE1006", + "FormatDescription": "warning IDE1006: Naming rule violation: Missing prefix: \u0027_\u0027" + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "0d78829b-6f7b-4313-95dd-ca86ae3e359f" + }, + "FileName": ".cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\.cs", + "FileChanges": [ + { + "LineNumber": 19, + "CharNumber": 36, + "DiagnosticId": "IDE1006", + "FormatDescription": "warning IDE1006: Naming rule violation: Missing prefix: \u0027_\u0027" + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "0d78829b-6f7b-4313-95dd-ca86ae3e359f" + }, + "FileName": ".cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\.cs", + "FileChanges": [ + { + "LineNumber": 18, + "CharNumber": 36, + "DiagnosticId": "IDE1006", + "FormatDescription": "warning IDE1006: Naming rule violation: Missing prefix: \u0027_\u0027" + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "0d78829b-6f7b-4313-95dd-ca86ae3e359f" + }, + "FileName": ".cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\.cs", + "FileChanges": [ + { + "LineNumber": 21, + "CharNumber": 24, + "DiagnosticId": "IDE1006", + "FormatDescription": "warning IDE1006: Naming rule violation: These words must begin with upper case characters: dd" + } + ] + }, + { + "DocumentId": { + "ProjectId": { + "Id": "7e6bb579-a63b-4b11-9de5-f86fc2f09c8d" + }, + "Id": "d629cdaf-aa21-4193-ae17-aecafca36ca6" + }, + "FileName": "FileRead.cs", + "FilePath": "T:\\MESAFIBACKLOG\\06_SourceCode\\MESAFIBACKLOG\\Adaptation\\FileHandlers\\json\\FileRead.cs", + "FileChanges": [ + { + "LineNumber": 1, + "CharNumber": 1, + "DiagnosticId": "IDE0005", + "FormatDescription": "Remove unnecessary import." + } + ] + } +] \ No newline at end of file diff --git a/Adaptation/.vscode/launch.json b/Adaptation/.vscode/launch.json new file mode 100644 index 0000000..ca80d86 --- /dev/null +++ b/Adaptation/.vscode/launch.json @@ -0,0 +1,10 @@ +{ + "configurations": [ + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": 23668 + } + ] +} diff --git a/Adaptation/.vscode/settings.json b/Adaptation/.vscode/settings.json new file mode 100644 index 0000000..cf354c7 --- /dev/null +++ b/Adaptation/.vscode/settings.json @@ -0,0 +1,46 @@ +{ + "cSpell.words": [ + "datauniqueid", + "Epuipment", + "EQPT", + "headerid", + "Idrv", + "ipdsf", + "Irng", + "ISMTP", + "JOBID", + "messa", + "messv", + "pdsf", + "pdsfc", + "PPID", + "Rcpe", + "RESIMAPCDE", + "Rsens", + "Smpl", + "Villach", + "Vrng" + ], + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#9885b1", + "activityBar.activeBorder": "#dacec5", + "activityBar.background": "#9885b1", + "activityBar.foreground": "#15202b", + "activityBar.inactiveForeground": "#15202b99", + "activityBarBadge.background": "#dacec5", + "activityBarBadge.foreground": "#15202b", + "sash.hoverBorder": "#9885b1", + "statusBar.background": "#7e669d", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#9885b1", + "statusBarItem.remoteBackground": "#7e669d", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#7e669d", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#7e669d99", + "titleBar.inactiveForeground": "#e7e7e799", + "commandCenter.border": "#e7e7e799" + }, + "peacock.color": "#7e669d", + "cSpell.enabled": false +} \ No newline at end of file diff --git a/Adaptation/.vscode/tasks.json b/Adaptation/.vscode/tasks.json new file mode 100644 index 0000000..6219ffa --- /dev/null +++ b/Adaptation/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/MESAFIBACKLOG.Tests.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/MESAFIBACKLOG.Tests.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "${workspaceFolder}/MESAFIBACKLOG.Tests.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Adaptation/Eaf/Core/AutoGenerated/BackboneComponent.cs b/Adaptation/Eaf/Core/AutoGenerated/BackboneComponent.cs new file mode 100644 index 0000000..06ec233 --- /dev/null +++ b/Adaptation/Eaf/Core/AutoGenerated/BackboneComponent.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.Core; + +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 new file mode 100644 index 0000000..69d3b7a --- /dev/null +++ b/Adaptation/Eaf/Core/AutoGenerated/BackboneStatusCache.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.Core; + +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 new file mode 100644 index 0000000..62e12d8 --- /dev/null +++ b/Adaptation/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.Core; + +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 new file mode 100644 index 0000000..f981297 --- /dev/null +++ b/Adaptation/Eaf/Core/AutoGenerated/StatusItem.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.Core; + +public class StatusItem +{ +} \ No newline at end of file diff --git a/Adaptation/Eaf/Core/Backbone.cs b/Adaptation/Eaf/Core/Backbone.cs new file mode 100644 index 0000000..f39f081 --- /dev/null +++ b/Adaptation/Eaf/Core/Backbone.cs @@ -0,0 +1,53 @@ +using Adaptation.PeerGroup.GCL.Annotations; +using System; +using System.Collections.Generic; + +namespace Adaptation.Eaf.Core; + +public class Backbone +{ + +#pragma warning disable CA1822 +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + 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) { } + +} \ No newline at end of file diff --git a/Adaptation/Eaf/Core/Smtp/EmailMessage.cs b/Adaptation/Eaf/Core/Smtp/EmailMessage.cs new file mode 100644 index 0000000..e16b8aa --- /dev/null +++ b/Adaptation/Eaf/Core/Smtp/EmailMessage.cs @@ -0,0 +1,25 @@ +using System; + +namespace Adaptation.Eaf.Core.Smtp; + +public class EmailMessage +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public EmailMessage() { } + public EmailMessage(string subject, string body, MailPriority priority = MailPriority.Normal) { } + + 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 new file mode 100644 index 0000000..0446065 --- /dev/null +++ b/Adaptation/Eaf/Core/Smtp/ISmtp.cs @@ -0,0 +1,6 @@ +namespace Adaptation.Eaf.Core.Smtp; + +public interface ISmtp +{ + 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 new file mode 100644 index 0000000..b59d146 --- /dev/null +++ b/Adaptation/Eaf/Core/Smtp/MailPriority.cs @@ -0,0 +1,8 @@ +namespace Adaptation.Eaf.Core.Smtp; + +public enum MailPriority +{ + 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 new file mode 100644 index 0000000..80e911e --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..d49c557 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..9d45cb1 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..c0cf1c3 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..92d7722 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..dca26fc --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..7481501 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..cf0602a --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..9f6000e --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..8b4f8d1 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs @@ -0,0 +1,15 @@ +using Adaptation.PeerGroup.GCL.Annotations; + +namespace Adaptation.Eaf.EquipmentCore.Control; + +public interface IEquipmentControl : IPackageSource +{ + [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 new file mode 100644 index 0000000..f34413f --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..eef26c3 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..be924e9 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..e7a76fc --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..2615f40 --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..8d26e7b --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..d0980ee --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs @@ -0,0 +1,38 @@ +using Adaptation.Eaf.EquipmentCore.DataCollection.Reporting; +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; } + + 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 new file mode 100644 index 0000000..86760aa --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/Control/IPackageSource.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.EquipmentCore.Control; + +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 new file mode 100644 index 0000000..468230d --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs @@ -0,0 +1,25 @@ +using Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription; +using Adaptation.PeerGroup.GCL.Annotations; +using System; + +namespace Adaptation.Eaf.EquipmentCore.DataCollection.Reporting; + +public class ParameterValue +{ + +#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(); + +} \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs b/Adaptation/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs new file mode 100644 index 0000000..f9c126d --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs @@ -0,0 +1,27 @@ +using Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; + +namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription; + +public class EquipmentParameter +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + 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 new file mode 100644 index 0000000..726b51a --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs @@ -0,0 +1,16 @@ +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; } + +} \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs new file mode 100644 index 0000000..00fc42a --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs @@ -0,0 +1,16 @@ +namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; + +public abstract class ParameterTypeDefinition +{ + +#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(); + +} \ No newline at end of file diff --git a/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs new file mode 100644 index 0000000..fe5fbce --- /dev/null +++ b/Adaptation/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; + +public class StructuredType : ParameterTypeDefinition +{ + +#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; } + +} \ No newline at end of file diff --git a/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs new file mode 100644 index 0000000..70ef834 --- /dev/null +++ b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs @@ -0,0 +1,5 @@ +namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; + +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 new file mode 100644 index 0000000..bdc8731 --- /dev/null +++ b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs @@ -0,0 +1,30 @@ +using System; + +namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; + +[System.Runtime.Serialization.DataContract(IsReference = true)] +public class ModelObjectParameterDefinition : IConfigurationObject +{ + +#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.DataMember] + public virtual long Id { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual string Name { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual string Value { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual ModelObjectParameterType ValueType { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual string EnumType { get; set; } + + public virtual ModelObjectParameterDefinition Clone() => null; + public virtual bool IsValidValue(string value) => 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 new file mode 100644 index 0000000..c5a85c2 --- /dev/null +++ b/Adaptation/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs @@ -0,0 +1,16 @@ +namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; + +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 +} \ 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 new file mode 100644 index 0000000..b8c1bd3 --- /dev/null +++ b/Adaptation/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs @@ -0,0 +1,43 @@ +using Adaptation.PeerGroup.GCL.SecsDriver; +using System; + +namespace Adaptation.Eaf.Management.ConfigurationData.Semiconductor.CellInstances; + +[System.Runtime.Serialization.DataContract] +public class SecsConnectionConfiguration +{ + public SecsConnectionConfiguration() { } + + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan T6HsmsControlMessage { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan T5ConnectionSeperation { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan T4InterBlock { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan T3MessageReply { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan T2Protocol { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan T1InterCharacter { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual SerialBaudRate? BaudRate { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual SecsTransportType? PortType { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual long? Port { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan LinkTestTimer { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual string Host { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual long? DeviceId { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual HsmsSessionMode? SessionMode { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual HsmsConnectionMode? ConnectionMode { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan T7ConnectionIdle { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual TimeSpan T8NetworkIntercharacter { get; set; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/APC/FileRead.cs b/Adaptation/FileHandlers/APC/FileRead.cs new file mode 100644 index 0000000..516a83f --- /dev/null +++ b/Adaptation/FileHandlers/APC/FileRead.cs @@ -0,0 +1,135 @@ +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.APC; + +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, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(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); + } + + 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; + } + + private void FileCopy(string reportFullPath, DateTime dateTime, List descriptions) where T : Shared.Properties.IDescription + { + bool isDummyRun = false; + List<(Shared.Properties.IScopeInfo, string)> collection = new(); + string successDirectory = _FileConnectorConfiguration.AlternateTargetFolder; + string fileNameAfterUnderscoreSplit = GetFileNameAfterUnderscoreSplit(reportFullPath); + string duplicateDirectory = Path.Combine(_FileConnectorConfiguration.TargetFileLocation, fileNameAfterUnderscoreSplit); + if (!Directory.Exists(duplicateDirectory)) + _ = Directory.CreateDirectory(duplicateDirectory); + string duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); + File.Copy(reportFullPath, duplicateFile, overwrite: true); + WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile); + } + + 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); + Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); + if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + FileCopy(reportFullPath, dateTime, descriptions); + results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + return results; + } + +} \ 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..6584c7f --- /dev/null +++ b/Adaptation/FileHandlers/Archive/FileRead.cs @@ -0,0 +1,154 @@ +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 +{ + + private readonly string _JobIdParentDirectory; + private readonly string _JobIdArchiveParentDirectory; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + _JobIdParentDirectory = GetJobIdParentDirectory(_FileConnectorConfiguration.SourceFileLocation); + _JobIdArchiveParentDirectory = GetJobIdParentDirectory(_FileConnectorConfiguration.TargetFileLocation); + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) => Move(extractResults); + + 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; + } + + private 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; + } + } + } + + 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 = $"{_Logistics.DateTimeFromSequence:yyyy}_Week_{weekOfYear}{@"\"}{_Logistics.DateTimeFromSequence:yyyy-MM-dd}"; + string destinationArchiveDirectory = Path.Combine(_JobIdArchiveParentDirectory, _Logistics.JobID, weekDirectory); + if (!Directory.Exists(destinationArchiveDirectory)) + _ = Directory.CreateDirectory(destinationArchiveDirectory); + string jobIdDirectory = Path.Combine(_JobIdParentDirectory, _Logistics.JobID); + if (!Directory.Exists(jobIdDirectory)) + _ = Directory.CreateDirectory(jobIdDirectory); + 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 = Path.Combine(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); + Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); + if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + MoveArchive(dateTime); + results = new Tuple>(pdsf.Item1, tests, 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..48527ab --- /dev/null +++ b/Adaptation/FileHandlers/CellInstanceConnectionName.cs @@ -0,0 +1,33 @@ +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, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) + { + IFileRead result = cellInstanceConnectionName switch + { + nameof(APC) => new APC.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(Archive) => new Archive.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(ConvertExcelToJson) => new ConvertExcelToJson.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(Dummy) => new Dummy.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(IQSSi) => new IQSSi.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(MoveMatchingFiles) => new MoveMatchingFiles.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(OpenInsight) => new OpenInsight.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(OpenInsightMetrologyViewer) => new OpenInsightMetrologyViewer.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(OpenInsightMetrologyViewerAttachments) => new OpenInsightMetrologyViewerAttachments.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(Processed) => new Processed.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(json) => new json.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + nameof(SPaCe) => new SPaCe.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted), + _ => throw new Exception($"\"{cellInstanceConnectionName}\" not mapped") + }; + return result; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/ConvertExcelToJson/FIBacklogMesa.cs b/Adaptation/FileHandlers/ConvertExcelToJson/FIBacklogMesa.cs new file mode 100644 index 0000000..c0f465d --- /dev/null +++ b/Adaptation/FileHandlers/ConvertExcelToJson/FIBacklogMesa.cs @@ -0,0 +1,129 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.ConvertExcelToJson; + +public class FIBacklogMesa +{ + [JsonConstructor] + public FIBacklogMesa(string req, + string submitted, + string requestor, + string assignedTo, + string secondResource, + string title, + string epiLine, + string area, + string systemS, + string priSort, + string priority, + string status, + string definition, + string updates, + string estEffortDays, + string commitDate, + string reCommitDate, + string uATAsOf, + string cMPDate, + string f20, + string f21, + string f22, + string f23, + string f24, + string f25, + string f26, + string f27, + string f28, + string f29, + string f30, + string f31, + string f32, + string f33) + { + Req = req; + Submitted = submitted; + Requestor = requestor; + AssignedTo = assignedTo; + SecondResource = secondResource; + Title = title; + EpiLine = epiLine; + Area = area; + SystemS = systemS; + PriSort = priSort; + Priority = priority; + Status = status; + Definition = definition; + Updates = updates; + EstEffortDays = estEffortDays; + CommitDate = commitDate; + ReCommitDate = reCommitDate; + UATAsOf = uATAsOf; + CMPDate = cMPDate; + F20 = f20; + F21 = f21; + F22 = f22; + F23 = f23; + F24 = f24; + F25 = f25; + F26 = f26; + F27 = f27; + F28 = f28; + F29 = f29; + F30 = f30; + F31 = f31; + F32 = f32; + F33 = f33; + } + + [JsonPropertyName("Req ")] + public string Req { get; set; } // { init; get; } + public string Submitted { get; set; } // { init; get; } + public string Requestor { get; set; } // { init; get; } + + [JsonPropertyName("Assigned To ")] + public string AssignedTo { get; set; } // { init; get; } + + [JsonPropertyName("Second Resource")] + public string SecondResource { get; set; } // { init; get; } + public string Title { get; set; } // { init; get; } + + [JsonPropertyName("Epi Line")] + public string EpiLine { get; set; } // { init; get; } + public string Area { get; set; } // { init; get; } + + [JsonPropertyName("System(s)")] + public string SystemS { get; set; } // { init; get; } + + [JsonPropertyName("Pri Sort")] + public string PriSort { get; set; } // { init; get; } + public string Priority { get; set; } // { init; get; } + public string Status { get; set; } // { init; get; } + public string Definition { get; set; } // { init; get; } + public string Updates { get; set; } // { init; get; } + + [JsonPropertyName("Est Effort _(days)")] + public string EstEffortDays { get; set; } // { init; get; } + + [JsonPropertyName("Commit Date ")] + public string CommitDate { get; set; } // { init; get; } + + [JsonPropertyName("Re-Commit Date ")] + public string ReCommitDate { get; set; } // { init; get; } + + [JsonPropertyName("UAT as of ")] + public string UATAsOf { get; set; } // { init; get; } + public string CMPDate { get; set; } // { init; get; } + public string F20 { get; set; } // { init; get; } + public string F21 { get; set; } // { init; get; } + public string F22 { get; set; } // { init; get; } + public string F23 { get; set; } // { init; get; } + public string F24 { get; set; } // { init; get; } + public string F25 { get; set; } // { init; get; } + public string F26 { get; set; } // { init; get; } + public string F27 { get; set; } // { init; get; } + public string F28 { get; set; } // { init; get; } + public string F29 { get; set; } // { init; get; } + public string F30 { get; set; } // { init; get; } + public string F31 { get; set; } // { init; get; } + public string F32 { get; set; } // { init; get; } + public string F33 { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/ConvertExcelToJson/FileRead.cs b/Adaptation/FileHandlers/ConvertExcelToJson/FileRead.cs new file mode 100644 index 0000000..985445b --- /dev/null +++ b/Adaptation/FileHandlers/ConvertExcelToJson/FileRead.cs @@ -0,0 +1,127 @@ +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; +using System.Threading; + +namespace Adaptation.FileHandlers.ConvertExcelToJson; + +public class FileRead : Shared.FileRead, IFileRead +{ + + private long? _TickOffset; + private readonly string _SheetName; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), true, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + _SheetName = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, string.Concat("CellInstance.", cellInstanceName, ".Excel.SheetName")); + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) => Move(extractResults); + + 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; + } + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + Tuple> results = new(string.Empty, null, null, new List()); + _TickOffset ??= new FileInfo(reportFullPath).LastWriteTime.Ticks - dateTime.Ticks; + _Logistics = new Logistics(this, _TickOffset.Value, reportFullPath, useSplitForMID: true); + SetFileParameterLotIDToLogisticsMID(); + if (_Logistics.FileInfo.Length < _MinFileLength) + results.Item4.Add(_Logistics.FileInfo); + else + { + IProcessData iProcessData = new ProcessData(this, _Logistics, results.Item4, _SheetName); + if (!iProcessData.Details.Any()) + throw new Exception(string.Concat("B) No Data - ", dateTime.Ticks)); + string json = iProcessData.Details[0].ToString(); + string fileName = Path.Combine(_FileConnectorConfiguration.TargetFileLocation, $"{_SheetName}.json"); + if (File.Exists(fileName)) + { + File.Delete(fileName); + Thread.Sleep(500); + } + File.WriteAllText(fileName, json); + results = iProcessData.GetResults(this, _Logistics, results.Item4); + } + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/ConvertExcelToJson/ProcessData.cs b/Adaptation/FileHandlers/ConvertExcelToJson/ProcessData.cs new file mode 100644 index 0000000..acced3d --- /dev/null +++ b/Adaptation/FileHandlers/ConvertExcelToJson/ProcessData.cs @@ -0,0 +1,141 @@ +using Adaptation.Shared; +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.OleDb; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; + +namespace Adaptation.FileHandlers.ConvertExcelToJson; + +public class ProcessData : IProcessData +{ + + private readonly List _Details; + + List Shared.Properties.IProcessData.Details => _Details; + + public ProcessData(IFileRead fileRead, Logistics logistics, List fileInfoCollection, string sheetName) + { + fileInfoCollection.Clear(); + _Details = new List(); + Parse(fileRead, logistics, fileInfoCollection, sheetName); + } + + 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) + => new(logistics.Logistics1[0], Array.Empty(), Array.Empty(), fileInfoCollection); + +#nullable enable + + /// + /// https://social.msdn.microsoft.com/Forums/en-US/2e030743-5d66-4e53-bbff-bb2eee0cbc9b/readingwriting-excel-without-excel?forum=Vsexpressvcs + /// + private static DataTable GetSheet(string file, string selectSql) + { + DataTable results = new(); +#if Linux + ()("Built on Linux!"); +#elif OSX + ()("Built on macOS!"); +#elif Windows || !NETCORE +#pragma warning disable CA1416 + for (int i = 0; i < int.MaxValue; i++) + { + try + { + OleDbConnectionStringBuilder connectionStringBuilder = new() + { + Provider = "Microsoft.ACE.OLEDB.12.0", + DataSource = file + }; + connectionStringBuilder.Add("Extended Properties", "Excel 12.0 Xml;HDR=YES;IMEX=1;ReadOnly=1;"); + using OleDbConnection connection = new(connectionStringBuilder.ConnectionString); + connection.Open(); + using (OleDbDataAdapter adapter = new(selectSql, connection)) + adapter.Fill(results); + connection.Close(); + break; + } + catch (Exception) + { + if (i > 3) //2019-12-28 - 001 + throw; + System.Threading.Thread.Sleep(1000); + } +#pragma warning restore CA1416 + } +#else + ()("Built in unknown!"); +#endif + return results; + } + + public static string DataTableToJSON(DataTable table) + { + string name; + string value; + object @object; + StringBuilder jsonString = new(); + if (table.Rows.Count > 0) + { + _ = jsonString.Append('['); + for (int i = 0; i < table.Rows.Count; i++) + { + _ = jsonString.Append('{'); + for (int j = 0; j < table.Columns.Count; j++) + { + @object = table.Rows[i][j]; + if (@object is null) + value = string.Empty; + else + value = string.Concat(@object); + if (value.Contains("\"")) + value = value.Replace("\"", "\\\""); + if (value.Contains("\n")) + value = value.Replace("\n", "
"); + name = table.Columns[j].ColumnName.ToString(); + if (name == ",") + name = "Title"; + if (name.Contains("\"")) + name = name.Replace("\"", "\\\""); + if (name.Contains("\n")) + name = name.Replace("\n", "
"); + _ = jsonString.Append('"').Append(name).Append("\":").Append('"').Append(value).Append('"'); + if (j < table.Columns.Count - 1) + _ = jsonString.Append(','); + } + if (i == table.Rows.Count - 1) + _ = jsonString.Append('}'); + else + _ = jsonString.Append("},"); + } + _ = jsonString.Append(']'); + } + return jsonString.ToString(); + } + + private void Parse(IFileRead fileRead, Logistics logistics, List fileInfoCollection, string sheet) + { + if (fileRead is null) + throw new NullReferenceException(); + if (fileInfoCollection is null) + throw new NullReferenceException(); + string selectSql = string.Concat("SELECT * FROM [", sheet, "$]"); + DataTable dataTable = GetSheet(logistics.ReportFullPath, selectSql); + if (dataTable.Rows.Count == 0) + throw new Exception("No rows"); + string json = DataTableToJSON(dataTable); + FIBacklogMesa[]? fIBacklogMesaCollection = JsonSerializer.Deserialize(json, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }); + if (fIBacklogMesaCollection is null || !fIBacklogMesaCollection.Any()) + throw new NullReferenceException(); + json = JsonSerializer.Serialize(fIBacklogMesaCollection, new JsonSerializerOptions() { WriteIndented = true }); + _Details.Add(json); + } + +} \ 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..7692d3d --- /dev/null +++ b/Adaptation/FileHandlers/Dummy/FileRead.cs @@ -0,0 +1,286 @@ +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, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(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); + + 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))); + + 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 sourceParentDirectory; + string targetParentDirectory; + DateTime dateTime = DateTime.Now; + if (!string.IsNullOrEmpty(Path.GetFileName(_FileConnectorConfiguration.SourceFileLocation))) + sourceParentDirectory = Path.GetDirectoryName(_FileConnectorConfiguration.SourceFileLocation); + else + sourceParentDirectory = GetParentParent(_FileConnectorConfiguration.SourceFileLocation); + if (!string.IsNullOrEmpty(Path.GetFileName(_FileConnectorConfiguration.TargetFileLocation))) + targetParentDirectory = Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation); + else + targetParentDirectory = GetParentParent(_FileConnectorConfiguration.TargetFileLocation); + if (sourceParentDirectory != targetParentDirectory) + throw new Exception("Target and source must have the same parent for Si Dummy FileConnectorConfiguration!"); + bool check = dateTime.Hour > 7 && dateTime.Hour < 18 && dateTime.DayOfWeek != DayOfWeek.Sunday && dateTime.DayOfWeek != DayOfWeek.Saturday; + if (!_IsEAFHosted || check) + { + string monARessource; + string sourceFileFilter; + string sourceArchiveFile; + 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); + for (int i = 0; i < _FileConnectorConfiguration.SourceFileFilters.Count; i++) + { + _LastDummyRunIndex += 1; + if (_LastDummyRunIndex >= _FileConnectorConfiguration.SourceFileFilters.Count) + _LastDummyRunIndex = 0; + sourceFileFilter = _FileConnectorConfiguration.SourceFileFilters[_LastDummyRunIndex]; + sourceArchiveFile = Path.Combine(_FileConnectorConfiguration.SourceFileLocation, sourceFileFilter); + if (File.Exists(sourceArchiveFile)) + { + if (!long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) + throw new Exception("Invalid file name for source archive file!"); + monARessource = GetCellName(sourceArchiveFile); + if (string.IsNullOrEmpty(monARessource)) + throw new Exception("Could not determine which cell archive file is associated with!"); + if (_IsEAFHosted) + CallbackFileExists(sourceArchiveFile, traceDummyFile, _FileConnectorConfiguration.TargetFileLocation, 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/IQSSi/FileRead.cs b/Adaptation/FileHandlers/IQSSi/FileRead.cs new file mode 100644 index 0000000..a0563cf --- /dev/null +++ b/Adaptation/FileHandlers/IQSSi/FileRead.cs @@ -0,0 +1,136 @@ +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.IQSSi; + +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, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(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); + } + + 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; + } + + private void FileCopy(string reportFullPath, DateTime dateTime, List descriptions) where T : Shared.Properties.IDescription + { + bool isDummyRun = false; + string successDirectory = string.Empty; + List<(Shared.Properties.IScopeInfo, string)> collection = new(); + string duplicateDirectory = Path.Combine(_FileConnectorConfiguration.SourceFileLocation, _CellInstanceName); + if (!Directory.Exists(duplicateDirectory)) + _ = Directory.CreateDirectory(duplicateDirectory); + string duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); + File.Copy(reportFullPath, duplicateFile, overwrite: true); + WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile); + } + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + if (dateTime == DateTime.MinValue) + { } + Tuple> results; + Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); + _Logistics = new Logistics(reportFullPath, pdsf.Item1); + SetFileParameterLotIDToLogisticsMID(); + JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); + List descriptions = GetDuplicatorDescriptions(jsonElements); + Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); + if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + FileCopy(reportFullPath, dateTime, descriptions); + results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs new file mode 100644 index 0000000..ad68b87 --- /dev/null +++ b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs @@ -0,0 +1,209 @@ +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; +using System.Threading; + +namespace Adaptation.FileHandlers.MoveMatchingFiles; + +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, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(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); + } + + 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; + } + + private static List GetSearchDirectories(int numberLength, string parentDirectory) + { + List results = new(); + string[] directories = Directory.GetDirectories(parentDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string directory in directories) + { + if (Path.GetFileName(directory).Length != numberLength) + continue; + results.Add(directory); + } + results.Sort(); + return results; + } + + private List GetMatchingFiles(long ticks, string reportFullPath, List searchDirectories) + { + List results = new(); + string[] found; + string fileName = Path.GetFileName(reportFullPath); + foreach (string searchDirectory in searchDirectories) + { + for (int i = 0; i < int.MaxValue; i++) + { + found = Directory.GetFiles(searchDirectory, fileName, SearchOption.AllDirectories); + if (found.Any()) + { + results.AddRange(found); + break; + } + if (new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds > _BreakAfterSeconds) + break; + } + } + return results; + } + + private static List<(string matchingFile, string checkFile)> GetCollection(int numberLength, string parentDirectory, List matchingFiles) + { + List<(string matchingFile, string checkFile)> results = new(); + string checkFile; + int parentDirectoryLength = parentDirectory.Length; + foreach (string matchingFile in matchingFiles) + { + checkFile = $"{matchingFile[0]}{matchingFile.Substring(parentDirectoryLength + numberLength + 1)}"; + results.Add(new(matchingFile, checkFile)); + } + return results; + } + + private void MoveCollection(DateTime dateTime, List<(string matchingFile, string checkFile)> collection) + { + long preWait; + string errFile; + string checkDirectory; + foreach ((string matchingFile, string checkFile) in collection) + { + errFile = string.Concat(checkFile, ".err"); + checkDirectory = Path.GetDirectoryName(checkFile); + if (!Directory.Exists(checkDirectory)) + _ = Directory.CreateDirectory(checkDirectory); + File.Move(matchingFile, checkFile); + if (_FileConnectorConfiguration?.FileHandleWaitTime is null) + preWait = DateTime.Now.AddMilliseconds(1234).Ticks; + else + preWait = DateTime.Now.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks; + for (short i = 0; i < short.MaxValue; i++) + { + if (DateTime.Now.Ticks > preWait) + break; + Thread.Sleep(500); + } + for (int i = 0; i < int.MaxValue; i++) + { + if (File.Exists(errFile)) + throw new Exception(File.ReadAllText(errFile)); + if (!File.Exists(checkFile)) + break; + if (new TimeSpan(DateTime.Now.Ticks - dateTime.Ticks).TotalSeconds > _BreakAfterSeconds) + throw new Exception($"Not all files were consumned after {_BreakAfterSeconds} second(s)!"); + Thread.Sleep(500); + } + } + } + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + Tuple> results = new(string.Empty, null, null, new List()); + Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); + _Logistics = new Logistics(reportFullPath, pdsf.Item1); + SetFileParameterLotIDToLogisticsMID(); + int numberLength = 2; + long ticks = dateTime.Ticks; + string parentParentDirectory = GetParentParent(reportFullPath); + List searchDirectories = GetSearchDirectories(numberLength, parentParentDirectory); + List matchingFiles = GetMatchingFiles(ticks, reportFullPath, searchDirectories); + if (matchingFiles.Count != searchDirectories.Count) + throw new Exception($"Didn't find all files after {_BreakAfterSeconds} second(s)!"); + List<(string matchingFile, string checkFile)> collection = GetCollection(numberLength, parentParentDirectory, matchingFiles); + MoveCollection(dateTime, collection); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/OpenInsight/FileRead.cs b/Adaptation/FileHandlers/OpenInsight/FileRead.cs new file mode 100644 index 0000000..88a1c04 --- /dev/null +++ b/Adaptation/FileHandlers/OpenInsight/FileRead.cs @@ -0,0 +1,133 @@ +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.OpenInsight; + +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, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(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); + } + + 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; + } + + private static void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, List descriptions, Test[] tests) + { + if (reportFullPath is null) + { } + if (dateTime == DateTime.MinValue) + { } + if (descriptions is null) + { } + if (tests is null) + { } + } + + 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 = json.ProcessData.GetDescriptions(jsonElements); + Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); + if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + SaveOpenInsightFile(reportFullPath, dateTime, descriptions, tests); + results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs new file mode 100644 index 0000000..700246a --- /dev/null +++ b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs @@ -0,0 +1,143 @@ +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.OpenInsightMetrologyViewer; + +public class FileRead : Shared.FileRead, IFileRead +{ + + private readonly string _OpenInsightMetrologyViewerAPI; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + _OpenInsightMetrologyViewerAPI = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.MetrologyViewerAPI"); + } + + 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); + } + + 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; + } + + private void SendData(DateTime dateTime, List descriptions) + { + if (dateTime == DateTime.MinValue) + { } + if (descriptions is null) + { } + // WSRequest wsRequest = new(this, _Logistics, descriptions); + // (string json, WS.Results wsResults) = WS.SendData(_OpenInsightMetrologyViewerAPI, wsRequest); + // if (!wsResults.Success) + // throw new Exception(wsResults.ToString()); + // _Log.Debug(wsResults.HeaderID); + // lock (_StaticRuns) + // { + // if (!_StaticRuns.ContainsKey(_Logistics.Sequence)) + // _StaticRuns.Add(_Logistics.Sequence, new()); + // _StaticRuns[_Logistics.Sequence].Add(json); + // } + } + + 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 = json.ProcessData.GetDescriptions(jsonElements); + Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); + if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + SendData(dateTime, descriptions); + results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs b/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs new file mode 100644 index 0000000..6350021 --- /dev/null +++ b/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs @@ -0,0 +1,150 @@ +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.OpenInsightMetrologyViewerAttachments; + +public class FileRead : Shared.FileRead, IFileRead +{ + + private readonly string _JobIdParentDirectory; + private readonly string _OpenInsightMetrologyViewerAPI; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + _JobIdParentDirectory = GetJobIdParentDirectory(_FileConnectorConfiguration.SourceFileLocation); + _OpenInsightMetrologyViewerAPI = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.MetrologyViewerAPI"); + } + + 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); + } + + 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; + } + + private void PostOpenInsightMetrologyViewerAttachments(string reportFullPath, DateTime dateTime, List descriptions) + { + if (string.IsNullOrEmpty(reportFullPath)) + { } + if (dateTime == DateTime.MinValue) + { } + string jobIdDirectory = Path.Combine(_JobIdParentDirectory, _Logistics.JobID); + if (!Directory.Exists(jobIdDirectory)) + _ = Directory.CreateDirectory(jobIdDirectory); + + _ = GetInProcessDirectory(jobIdDirectory); + if (!_StaticRuns.ContainsKey(_Logistics.Sequence)) + _ = string.Empty; + else + { + if (_StaticRuns[_Logistics.Sequence].Count != 1) + throw new Exception($"{nameof(_StaticRuns)} has too many values for {_Logistics.Sequence}!"); + _ = _StaticRuns[_Logistics.Sequence][0]; + lock (_StaticRuns) + _ = _StaticRuns.Remove(_Logistics.Sequence); + } + // OpenInsightMetrologyViewer.WSRequest.PostOpenInsightMetrologyViewerAttachments(this, _Logistics, _OpenInsightMetrologyViewerAPI, dateTime, json, descriptions, matchDirectories[0]); + } + + 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 = json.ProcessData.GetDescriptions(jsonElements); + Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); + if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + PostOpenInsightMetrologyViewerAttachments(reportFullPath, dateTime, descriptions); + results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/Processed/FileRead.cs b/Adaptation/FileHandlers/Processed/FileRead.cs new file mode 100644 index 0000000..1b5d2bc --- /dev/null +++ b/Adaptation/FileHandlers/Processed/FileRead.cs @@ -0,0 +1,167 @@ +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.Processed; + +public class FileRead : Shared.FileRead, IFileRead +{ + + private readonly string _JobIdParentDirectory; + private readonly string _JobIdProcessParentDirectory; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (!_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + _JobIdParentDirectory = GetJobIdParentDirectory(_FileConnectorConfiguration.SourceFileLocation); + _JobIdProcessParentDirectory = GetJobIdParentDirectory(_FileConnectorConfiguration.TargetFileLocation); + } + + 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); + } + + 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; + } + + private void DirectoryMove(string reportFullPath, DateTime dateTime, List descriptions) + { + if (dateTime == DateTime.MinValue) + { } + if (descriptions is null) + { } + FileInfo fileInfo = new(reportFullPath); + + _ = _Logistics.Sequence.ToString(); + string jobIdDirectory = Path.Combine(_JobIdParentDirectory, _Logistics.JobID); + if (!Directory.Exists(jobIdDirectory)) + _ = Directory.CreateDirectory(jobIdDirectory); + string[] matchDirectories = GetInProcessDirectory(jobIdDirectory); + if ((matchDirectories is null) || matchDirectories.Length != 1) + throw new Exception("Didn't find directory by logistics sequence"); + if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) + File.SetLastWriteTime(reportFullPath, fileInfo.CreationTime); + // OpenInsightMetrologyViewer.WSRequest wsRequest = new(this, _Logistics, descriptions); + // JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true }; + // string json = JsonSerializer.Serialize(wsRequest, wsRequest.GetType(), jsonSerializerOptions); + // string directoryName = $"{Path.GetFileName(matchDirectories[0]).Split(new string[] { logisticsSequence }, StringSplitOptions.None)[0]}{_Logistics.DateTimeFromSequence:yyyy-MM-dd_hh;mm_tt_}{DateTime.Now.Ticks - _Logistics.Sequence}"; + // string destinationJobIdDirectory = Path.Combine(_JobIdProcessParentDirectory, _Logistics.JobID, directoryName); + // string sequenceDirectory = Path.Combine(destinationJobIdDirectory, logisticsSequence); + // string jsonFileName = Path.Combine(sequenceDirectory, $"{Path.GetFileNameWithoutExtension(reportFullPath)}.json"); + // Directory.Move(matchDirectories[0], destinationJobIdDirectory); + // if (!Directory.Exists(sequenceDirectory)) + // _ = Directory.CreateDirectory(sequenceDirectory); + // File.Copy(reportFullPath, Path.Combine(sequenceDirectory, Path.GetFileName(reportFullPath)), overwrite: true); + // File.WriteAllText(jsonFileName, json); + } + + 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 = json.ProcessData.GetDescriptions(jsonElements); + Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); + results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + DirectoryMove(reportFullPath, dateTime, descriptions); + else if (!_IsEAFHosted) + { + // OpenInsightMetrologyViewer.WSRequest wsRequest = new(this, _Logistics, descriptions); + // JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true }; + // string json = JsonSerializer.Serialize(wsRequest, wsRequest.GetType(), jsonSerializerOptions); + // string jsonFileName = Path.ChangeExtension(reportFullPath, ".json"); + // string historicalText = File.ReadAllText(jsonFileName); + // if (json != historicalText) + // throw new Exception("File doesn't match historical!"); + } + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/SPaCe/FileRead.cs b/Adaptation/FileHandlers/SPaCe/FileRead.cs new file mode 100644 index 0000000..a6c47a1 --- /dev/null +++ b/Adaptation/FileHandlers/SPaCe/FileRead.cs @@ -0,0 +1,134 @@ +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.SPaCe; + +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, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(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); + } + + 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; + } + + private void FileCopy(string reportFullPath, DateTime dateTime, List descriptions) where T : Shared.Properties.IDescription + { + bool isDummyRun = false; + string successDirectory = string.Empty; + List<(Shared.Properties.IScopeInfo, string)> collection = new(); + string duplicateDirectory = _FileConnectorConfiguration.TargetFileLocation; + string duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); + File.Copy(reportFullPath, duplicateFile, overwrite: true); + WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile); + } + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + if (dateTime == DateTime.MinValue) + { } + Tuple> results; + Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); + _Logistics = new Logistics(reportFullPath, pdsf.Item1); + SetFileParameterLotIDToLogisticsMID(); + JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); + List descriptions = GetDuplicatorDescriptions(jsonElements); + Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); + if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) + FileCopy(reportFullPath, dateTime, descriptions); + results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/FileRead.cs b/Adaptation/FileHandlers/json/FileRead.cs new file mode 100644 index 0000000..853cf96 --- /dev/null +++ b/Adaptation/FileHandlers/json/FileRead.cs @@ -0,0 +1,147 @@ +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 Microsoft.TeamFoundation.WorkItemTracking.WebApi; +using Microsoft.VisualStudio.Services.Common; +using Microsoft.VisualStudio.Services.WebApi; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; + +namespace Adaptation.FileHandlers.json; + +public class FileRead : Shared.FileRead, IFileRead +{ + + private long? _TickOffset; + private readonly string _API; + private readonly string _Query; + private readonly string _Project; + private readonly string _BasePage; + private readonly HttpClient _HttpClient; + private readonly WorkItemTrackingHttpClient _WorkItemTrackingHttpClient; + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) + { + _MinFileLength = 10; + _NullData = string.Empty; + _Logistics = new(this); + if (_FileParameter is null) + throw new Exception(cellInstanceConnectionName); + if (_ModelObjectParameterDefinitions is null) + throw new Exception(cellInstanceConnectionName); + if (_IsDuplicator) + throw new Exception(cellInstanceConnectionName); + string cellInstanceNamed = string.Concat("CellInstance.", cellInstanceName); + MediaTypeWithQualityHeaderValue mediaTypeWithQualityHeaderValue = new("application/json"); + _API = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, $"{cellInstanceNamed}.HttpClient.API"); + _Query = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, $"{cellInstanceNamed}.HttpClient.Query"); + string pat = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, $"{cellInstanceNamed}.HttpClient.PAT"); + _Project = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, $"{cellInstanceNamed}.HttpClient.Project"); + string basePage = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, $"{cellInstanceNamed}.HttpClient.BasePage"); + string baseAddress = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, $"{cellInstanceNamed}.HttpClient.BaseAddress"); + byte[] bytes = Encoding.ASCII.GetBytes($":{pat}"); + string base64 = Convert.ToBase64String(bytes); + _HttpClient = new() { BaseAddress = new(baseAddress) }; + _HttpClient.DefaultRequestHeaders.Authorization = new("Basic", base64); + _HttpClient.DefaultRequestHeaders.Accept.Add(mediaTypeWithQualityHeaderValue); + VssBasicCredential credential = new("", pat); + VssConnection connection = new(new(string.Concat(baseAddress, basePage)), credential); + _WorkItemTrackingHttpClient = connection.GetClient(); + _BasePage = basePage; + } + + void IFileRead.Move(Tuple> extractResults, Exception exception) => Move(extractResults); + + 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; + } + + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) + { + Tuple> results = new(string.Empty, null, null, new List()); + _TickOffset ??= new FileInfo(reportFullPath).LastWriteTime.Ticks - dateTime.Ticks; + _Logistics = new Logistics(this, _TickOffset.Value, reportFullPath, useSplitForMID: true); + SetFileParameterLotIDToLogisticsMID(); + if (_Logistics.FileInfo.Length < _MinFileLength) + results.Item4.Add(_Logistics.FileInfo); + else + { + IProcessData iProcessData = new ProcessData(this, _Logistics, results.Item4, _HttpClient, _BasePage, _API, _Query, _WorkItemTrackingHttpClient, _Project); + if (iProcessData is not ProcessData _) + throw new Exception(string.Concat("A) No Data - ", dateTime.Ticks)); + if (!iProcessData.Details.Any()) + throw new Exception(string.Concat("B) No Data - ", dateTime.Ticks)); + results = iProcessData.GetResults(this, _Logistics, results.Item4); + } + return results; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/ProcessData.cs b/Adaptation/FileHandlers/json/ProcessData.cs new file mode 100644 index 0000000..072930c --- /dev/null +++ b/Adaptation/FileHandlers/json/ProcessData.cs @@ -0,0 +1,120 @@ +using Adaptation.FileHandlers.ConvertExcelToJson; +using Adaptation.FileHandlers.json.WorkItems; +using Adaptation.Shared; +using Adaptation.Shared.Duplicator; +using Adaptation.Shared.Methods; +using Microsoft.TeamFoundation.WorkItemTracking.WebApi; +using Microsoft.VisualStudio.Services.WebApi.Patch; +using Microsoft.VisualStudio.Services.WebApi.Patch.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text.Json; +using System.Threading.Tasks; + +namespace Adaptation.FileHandlers.json; + +public class ProcessData : IProcessData +{ + + private readonly List _Details; + + List Shared.Properties.IProcessData.Details => _Details; + + public ProcessData(IFileRead fileRead, Logistics logistics, List fileInfoCollection, HttpClient httpClient, string basePage, string api, string query, WorkItemTrackingHttpClient workItemTrackingHttpClient, string project) + { + fileInfoCollection.Clear(); + _Details = new List(); + Parse(fileRead, logistics, fileInfoCollection, httpClient, basePage, api, query, workItemTrackingHttpClient, project); + } + + 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) + => new(logistics.Logistics1[0], Array.Empty(), Array.Empty(), fileInfoCollection); + + internal static List GetDescriptions(JsonElement[] jsonElements) => throw new NotImplementedException(); + +#nullable enable + + private static Root GetRoot(HttpClient httpClient, string basePage, string api, int id) + { + Root result; + Task httpResponseMessageTask = httpClient.GetAsync(string.Concat(basePage, api, "/workItems/", id)); + httpResponseMessageTask.Wait(); + if (!httpResponseMessageTask.Result.IsSuccessStatusCode) + throw new Exception(httpResponseMessageTask.Result.StatusCode.ToString()); + Task streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync(); + streamTask.Wait(); + if (!streamTask.Result.CanRead) + { + JsonElement? jsonElement = JsonSerializer.Deserialize(streamTask.Result); + if (jsonElement is null) + throw new NullReferenceException(nameof(jsonElement)); + } + Root? root = JsonSerializer.Deserialize(streamTask.Result, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }); + streamTask.Result.Dispose(); + if (root is null || root.Fields is null) + throw new NullReferenceException(nameof(root)); + result = root; + return result; + } + + private static void AddPatch(JsonPatchDocument document, string path, object value) => document.Add(new JsonPatchOperation { From = null, Operation = Operation.Add, Path = path, Value = value }); + + private void Parse(IFileRead fileRead, Logistics logistics, List fileInfoCollection, HttpClient httpClient, string basePage, string api, string query, WorkItemTrackingHttpClient workItemTrackingHttpClient, string project) + { + if (fileRead is null) + throw new NullReferenceException(); + if (logistics is null) + throw new NullReferenceException(); + if (fileInfoCollection is null) + throw new NullReferenceException(); + Root raw; + ViewModels.WorkItem view; + string json = File.ReadAllText(logistics.ReportFullPath); + FIBacklogMesa[]? fIBacklogMesaCollection = JsonSerializer.Deserialize(json, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }); + if (fIBacklogMesaCollection is null || !fIBacklogMesaCollection.Any()) + throw new NullReferenceException(); + Task httpResponseMessageTask = httpClient.GetAsync(string.Concat(basePage, api, query)); + httpResponseMessageTask.Wait(); + if (!httpResponseMessageTask.Result.IsSuccessStatusCode) + throw new Exception(httpResponseMessageTask.Result.StatusCode.ToString()); + Task streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync(); + streamTask.Wait(); + if (!streamTask.Result.CanRead) + { + JsonElement? jsonElement = JsonSerializer.Deserialize(streamTask.Result); + if (jsonElement is null) + throw new NullReferenceException(nameof(jsonElement)); + } + WIQL.Root? root = JsonSerializer.Deserialize(streamTask.Result, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }); + streamTask.Result.Dispose(); + if (root is null || root.WorkItems is null) + throw new NullReferenceException(nameof(root)); + foreach (WIQL.WorkItem workItem in root.WorkItems) + { + raw = GetRoot(httpClient, basePage, api, workItem.Id); + view = new(raw); + _Details.Add(view); + if (workItem.Id == 308759) + break; + } + JsonPatchDocument document = new(); + AddPatch(document, "/fields/System.Title", "Title"); + AddPatch(document, "/fields/System.Description", "Description"); + AddPatch(document, "/fields/System.AssignedTo", "Mike.Phares@infineon.com"); + AddPatch(document, "/fields/System.AreaPath", string.Concat(project, @"\OI")); + AddPatch(document, "/fields/System.IterationPath", string.Concat(project, @"\CMP")); + Task workItemTask; + workItemTask = workItemTrackingHttpClient.CreateWorkItemAsync(document, project, "Bug"); + workItemTask.Wait(); + if (workItemTask.Result is null) + { } + // workItemTask = workItemTrackingHttpClient.UpdateWorkItemAsync(document, project, "Bug"); + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/ViewModels/WorkItem.cs b/Adaptation/FileHandlers/json/ViewModels/WorkItem.cs new file mode 100644 index 0000000..f997c46 --- /dev/null +++ b/Adaptation/FileHandlers/json/ViewModels/WorkItem.cs @@ -0,0 +1,79 @@ +using Adaptation.FileHandlers.json.WorkItems; +using System; + +namespace Adaptation.FileHandlers.json.ViewModels; + +public class WorkItem +{ + + public string AreaPath { get; set; } // { init; get; } + public string AssignedToDisplayName { get; set; } // { init; get; } + public int CommentCount { get; set; } // { init; get; } + public string CreatedDate { get; set; } // { init; get; } + public string ClosedDate { get; set; } // { init; get; } + public string Description { get; set; } // { init; get; } + public string Discussion { get; set; } // { init; get; } + public string Effort { get; set; } // { init; get; } + public string HypertextReference { get; set; } // { init; get; } + public int Id { get; set; } // { init; get; } + public string IterationPath { get; set; } // { init; get; } + public string Req { get; set; } // { init; get; } + public string ResolvedDate { get; set; } // { init; get; } + public string Priority { get; set; } // { init; get; } + public string State { get; set; } // { init; get; } + public string Tags { get; set; } // { init; get; } + public string TargetDate { get; set; } // { init; get; } + public string Title { get; set; } // { init; get; } + public string WorkItemType { get; set; } // { init; get; } + + public WorkItem(Root raw) + { + string req; + string[] words; + if (string.IsNullOrEmpty(raw.Fields.SystemHistory)) + words = Array.Empty(); + else + words = raw.Fields.SystemHistory.Split(' '); + if (words.Length < 3 || words[0] != "Req" || words[1] != ":") + req = raw.Id.ToString(); + else + req = words[2].Split('<')[0]; + string systemAreaPath = raw.Fields.SystemAreaPath.Replace(@"Mesa_FI\", string.Empty); + string iterationPath = raw.Fields.SystemIterationPath.Replace(@"Mesa_FI\", string.Empty); + string hypertextReference = string.IsNullOrEmpty(raw.Links?.Html?.Href) ? string.Empty : raw.Links.Html.Href; + string systemAssignedToDisplayName = raw.Fields.SystemAssignedTo is null ? string.Empty : raw.Fields.SystemAssignedTo.DisplayName; + string effort = raw.Fields.MicrosoftVSTSSchedulingEffort < 0.1 ? "" : Math.Floor(raw.Fields.MicrosoftVSTSSchedulingEffort).ToString("0"); + string createdDate = raw.Fields.SystemCreatedDate == DateTime.MinValue ? string.Empty : raw.Fields.SystemCreatedDate.ToString("dd-MMM-yy"); + string closedDate = raw.Fields.MicrosoftVSTSCommonClosedDate == DateTime.MinValue ? string.Empty : raw.Fields.MicrosoftVSTSCommonClosedDate.ToString("dd-MMM-yy"); + string resolvedDate = raw.Fields.MicrosoftVSTSCommonResolvedDate == DateTime.MinValue ? string.Empty : raw.Fields.MicrosoftVSTSCommonResolvedDate.ToString("dd-MMM-yy"); + string targetDate = raw.Fields.MicrosoftVSTSSchedulingTargetDate == DateTime.MinValue ? string.Empty : raw.Fields.MicrosoftVSTSSchedulingTargetDate.ToString("dd-MMM-yy"); + string priority = raw.Fields.SystemWorkItemType == "Bug" ? "BugFix" : raw.Fields.MicrosoftVSTSCommonPriority switch + { + 1 => "High", + 2 => "Med", + 3 => "Low", + 4 => "TBD", + _ => throw new NotImplementedException(), + }; + AreaPath = systemAreaPath; + AssignedToDisplayName = systemAssignedToDisplayName; + CommentCount = raw.Fields.SystemCommentCount; + CreatedDate = createdDate; + ClosedDate = closedDate; + Description = raw.Fields.SystemDescription; + Discussion = raw.Fields.SystemHistory; + Effort = effort; + HypertextReference = hypertextReference; + Id = raw.Id; + IterationPath = iterationPath; + Priority = priority; + Req = req; + ResolvedDate = resolvedDate; + State = raw.Fields.SystemState; + Tags = raw.Fields.SystemTags; + TargetDate = targetDate; + Title = raw.Fields.SystemTitle; + WorkItemType = raw.Fields.SystemWorkItemType; + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WIQL/Column.cs b/Adaptation/FileHandlers/json/WIQL/Column.cs new file mode 100644 index 0000000..988b091 --- /dev/null +++ b/Adaptation/FileHandlers/json/WIQL/Column.cs @@ -0,0 +1,22 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WIQL; + +public class Column +{ + [JsonConstructor] + public Column( + string referenceName, + string name, + string url + ) + { + ReferenceName = referenceName; + Name = name; + Url = url; + } + + public string ReferenceName { get; set; } // { init; get; } + public string Name { get; set; } // { init; get; } + public string Url { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WIQL/Field.cs b/Adaptation/FileHandlers/json/WIQL/Field.cs new file mode 100644 index 0000000..0b30309 --- /dev/null +++ b/Adaptation/FileHandlers/json/WIQL/Field.cs @@ -0,0 +1,22 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WIQL; + +public class Field +{ + [JsonConstructor] + public Field( + string referenceName, + string name, + string url + ) + { + ReferenceName = referenceName; + Name = name; + Url = url; + } + + public string ReferenceName { get; set; } // { init; get; } + public string Name { get; set; } // { init; get; } + public string Url { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WIQL/Root.cs b/Adaptation/FileHandlers/json/WIQL/Root.cs new file mode 100644 index 0000000..99537c2 --- /dev/null +++ b/Adaptation/FileHandlers/json/WIQL/Root.cs @@ -0,0 +1,32 @@ +using System; +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WIQL; + +public class Root +{ + [JsonConstructor] + public Root( + string queryType, + string queryResultType, + DateTime asOf, + Column[] columns, + SortColumn[] sortColumns, + WorkItem[] workItems + ) + { + QueryType = queryType; + QueryResultType = queryResultType; + AsOf = asOf; + Columns = columns; + SortColumns = sortColumns; + WorkItems = workItems; + } + + public string QueryType { get; set; } // { init; get; } + public string QueryResultType { get; set; } // { init; get; } + public DateTime AsOf { get; set; } // { init; get; } + public Column[] Columns { get; set; } // { init; get; } + public SortColumn[] SortColumns { get; set; } // { init; get; } + public WorkItem[] WorkItems { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WIQL/SortColumn.cs b/Adaptation/FileHandlers/json/WIQL/SortColumn.cs new file mode 100644 index 0000000..2aa76a8 --- /dev/null +++ b/Adaptation/FileHandlers/json/WIQL/SortColumn.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WIQL; + +public class SortColumn +{ + [JsonConstructor] + public SortColumn( + Field field, + bool descending + ) + { + Field = field; + Descending = descending; + } + + public Field Field { get; set; } // { init; get; } + public bool Descending { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WIQL/WorkItem.cs b/Adaptation/FileHandlers/json/WIQL/WorkItem.cs new file mode 100644 index 0000000..7504f99 --- /dev/null +++ b/Adaptation/FileHandlers/json/WIQL/WorkItem.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WIQL; + +public class WorkItem +{ + [JsonConstructor] + public WorkItem( + int id, + string url + ) + { + Id = id; + Url = url; + } + + public int Id { get; set; } // { init; get; } + public string Url { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/Avatar.cs b/Adaptation/FileHandlers/json/WorkItems/Avatar.cs new file mode 100644 index 0000000..e2dd6c4 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/Avatar.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class Avatar +{ + [JsonConstructor] + public Avatar( + string href + ) => Href = href; + + public string Href { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/Fields.cs b/Adaptation/FileHandlers/json/WorkItems/Fields.cs new file mode 100644 index 0000000..a83c125 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/Fields.cs @@ -0,0 +1,175 @@ +using System; +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class Fields +{ + [JsonConstructor] + public Fields(string systemAreaPath, + string systemTeamProject, + string systemIterationPath, + string systemWorkItemType, + string systemState, + string systemReason, + User systemAssignedTo, + DateTime systemCreatedDate, + User systemCreatedBy, + DateTime systemChangedDate, + User systemChangedBy, + int systemCommentCount, + string systemTitle, + string systemBoardColumn, + bool systemBoardColumnDone, + DateTime microsoftVSTSCommonStateChangeDate, + DateTime microsoftVSTSCommonActivatedDate, + User microsoftVSTSCommonActivatedBy, + DateTime microsoftVSTSCommonResolvedDate, + User microsoftVSTSCommonResolvedBy, + DateTime microsoftVSTSCommonClosedDate, + User microsoftVSTSCommonClosedBy, + int microsoftVSTSCommonPriority, + double microsoftVSTSSchedulingEffort, + DateTime microsoftVSTSSchedulingTargetDate, + double microsoftVSTSCommonStackRank, + string microsoftVSTSCommonValueArea, + string wEF81590F0A22C04FEF834957660F5F0C58KanbanColumn, + bool wEF81590F0A22C04FEF834957660F5F0C58KanbanColumnDone, + string systemDescription, + string systemHistory, + string systemTags, + string href) + { + SystemAreaPath = systemAreaPath; + SystemTeamProject = systemTeamProject; + SystemIterationPath = systemIterationPath; + SystemWorkItemType = systemWorkItemType; + SystemState = systemState; + SystemReason = systemReason; + SystemAssignedTo = systemAssignedTo; + SystemCreatedDate = systemCreatedDate; + SystemCreatedBy = systemCreatedBy; + SystemChangedDate = systemChangedDate; + SystemChangedBy = systemChangedBy; + SystemCommentCount = systemCommentCount; + SystemTitle = systemTitle; + SystemBoardColumn = systemBoardColumn; + SystemBoardColumnDone = systemBoardColumnDone; + MicrosoftVSTSCommonStateChangeDate = microsoftVSTSCommonStateChangeDate; + MicrosoftVSTSCommonActivatedDate = microsoftVSTSCommonActivatedDate; + MicrosoftVSTSCommonActivatedBy = microsoftVSTSCommonActivatedBy; + MicrosoftVSTSCommonResolvedDate = microsoftVSTSCommonResolvedDate; + MicrosoftVSTSCommonResolvedBy = microsoftVSTSCommonResolvedBy; + MicrosoftVSTSCommonClosedDate = microsoftVSTSCommonClosedDate; + MicrosoftVSTSCommonClosedBy = microsoftVSTSCommonClosedBy; + MicrosoftVSTSCommonPriority = microsoftVSTSCommonPriority; + MicrosoftVSTSSchedulingEffort = microsoftVSTSSchedulingEffort; + MicrosoftVSTSSchedulingTargetDate = microsoftVSTSSchedulingTargetDate; + MicrosoftVSTSCommonStackRank = microsoftVSTSCommonStackRank; + MicrosoftVSTSCommonValueArea = microsoftVSTSCommonValueArea; + WEF81590F0A22C04FEF834957660F5F0C58KanbanColumn = wEF81590F0A22C04FEF834957660F5F0C58KanbanColumn; + WEF81590F0A22C04FEF834957660F5F0C58KanbanColumnDone = wEF81590F0A22C04FEF834957660F5F0C58KanbanColumnDone; + SystemDescription = systemDescription; + SystemHistory = systemHistory; + SystemTags = systemTags; + Href = href; + } + + [JsonPropertyName("System.AreaPath")] + public string SystemAreaPath { get; set; } // { init; get; } + + [JsonPropertyName("System.TeamProject")] + public string SystemTeamProject { get; set; } // { init; get; } + + [JsonPropertyName("System.IterationPath")] + public string SystemIterationPath { get; set; } // { init; get; } + + [JsonPropertyName("System.WorkItemType")] + public string SystemWorkItemType { get; set; } // { init; get; } + + [JsonPropertyName("System.State")] + public string SystemState { get; set; } // { init; get; } + + [JsonPropertyName("System.Reason")] + public string SystemReason { get; set; } // { init; get; } + + [JsonPropertyName("System.AssignedTo")] + public User SystemAssignedTo { get; set; } // { init; get; } + + [JsonPropertyName("System.CreatedDate")] + public DateTime SystemCreatedDate { get; set; } // { init; get; } + + [JsonPropertyName("System.CreatedBy")] + public User SystemCreatedBy { get; set; } // { init; get; } + + [JsonPropertyName("System.ChangedDate")] + public DateTime SystemChangedDate { get; set; } // { init; get; } + + [JsonPropertyName("System.ChangedBy")] + public User SystemChangedBy { get; set; } // { init; get; } + + [JsonPropertyName("System.CommentCount")] + public int SystemCommentCount { get; set; } // { init; get; } + + [JsonPropertyName("System.Title")] + public string SystemTitle { get; set; } // { init; get; } + + [JsonPropertyName("System.BoardColumn")] + public string SystemBoardColumn { get; set; } // { init; get; } + + [JsonPropertyName("System.BoardColumnDone")] + public bool SystemBoardColumnDone { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Common.StateChangeDate")] + public DateTime MicrosoftVSTSCommonStateChangeDate { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Common.ActivatedDate")] + public DateTime MicrosoftVSTSCommonActivatedDate { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Common.ActivatedBy")] + public User MicrosoftVSTSCommonActivatedBy { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Common.ResolvedDate")] + public DateTime MicrosoftVSTSCommonResolvedDate { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Common.ResolvedBy")] + public User MicrosoftVSTSCommonResolvedBy { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Common.ClosedDate")] + public DateTime MicrosoftVSTSCommonClosedDate { get; } + + [JsonPropertyName("Microsoft.VSTS.Common.ClosedBy")] + public User MicrosoftVSTSCommonClosedBy { get; } + + [JsonPropertyName("Microsoft.VSTS.Common.Priority")] + public int MicrosoftVSTSCommonPriority { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Scheduling.Effort")] + public double MicrosoftVSTSSchedulingEffort { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Scheduling.TargetDate")] + public DateTime MicrosoftVSTSSchedulingTargetDate { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Common.StackRank")] + public double MicrosoftVSTSCommonStackRank { get; set; } // { init; get; } + + [JsonPropertyName("Microsoft.VSTS.Common.ValueArea")] + public string MicrosoftVSTSCommonValueArea { get; set; } // { init; get; } + + [JsonPropertyName("WEF_81590F0A22C04FEF834957660F5F0C58_Kanban.Column")] + public string WEF81590F0A22C04FEF834957660F5F0C58KanbanColumn { get; set; } // { init; get; } + + [JsonPropertyName("WEF_81590F0A22C04FEF834957660F5F0C58_Kanban.Column.Done")] + public bool WEF81590F0A22C04FEF834957660F5F0C58KanbanColumnDone { get; set; } // { init; get; } + + [JsonPropertyName("System.Description")] + public string SystemDescription { get; set; } // { init; get; } + + [JsonPropertyName("System.History")] + public string SystemHistory { get; set; } // { init; get; } + + [JsonPropertyName("System.Tags")] + public string SystemTags { get; set; } // { init; get; } + + public string Href { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/Html.cs b/Adaptation/FileHandlers/json/WorkItems/Html.cs new file mode 100644 index 0000000..f6642ce --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/Html.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class Html +{ + [JsonConstructor] + public Html( + string href + ) => Href = href; + + public string Href { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/Links.cs b/Adaptation/FileHandlers/json/WorkItems/Links.cs new file mode 100644 index 0000000..564e35c --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/Links.cs @@ -0,0 +1,37 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class Links +{ + [JsonConstructor] + public Links( + Avatar avatar, + Self self, + WorkItemUpdates workItemUpdates, + WorkItemRevisions workItemRevisions, + WorkItemComments workItemComments, + Html html, + WorkItemType workItemType, + Fields fields + ) + { + Avatar = avatar; + Self = self; + WorkItemUpdates = workItemUpdates; + WorkItemRevisions = workItemRevisions; + WorkItemComments = workItemComments; + Html = html; + WorkItemType = workItemType; + Fields = fields; + } + + public Avatar Avatar { get; set; } // { init; get; } + public Self Self { get; set; } // { init; get; } + public WorkItemUpdates WorkItemUpdates { get; set; } // { init; get; } + public WorkItemRevisions WorkItemRevisions { get; set; } // { init; get; } + public WorkItemComments WorkItemComments { get; set; } // { init; get; } + public Html Html { get; set; } // { init; get; } + public WorkItemType WorkItemType { get; set; } // { init; get; } + public Fields Fields { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/Root.cs b/Adaptation/FileHandlers/json/WorkItems/Root.cs new file mode 100644 index 0000000..bf60e30 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/Root.cs @@ -0,0 +1,30 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class Root +{ + [JsonConstructor] + public Root( + int id, + int rev, + Fields fields, + Links links, + string url + ) + { + Id = id; + Rev = rev; + Fields = fields; + Links = links; + Url = url; + } + + public int Id { get; set; } // { init; get; } + public int Rev { get; set; } // { init; get; } + public Fields Fields { get; set; } // { init; get; } + + [JsonPropertyName("_links")] + public Links Links { get; set; } // { init; get; } + public string Url { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/Self.cs b/Adaptation/FileHandlers/json/WorkItems/Self.cs new file mode 100644 index 0000000..bb364b1 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/Self.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class Self +{ + [JsonConstructor] + public Self( + string href + ) => Href = href; + + public string Href { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/User.cs b/Adaptation/FileHandlers/json/WorkItems/User.cs new file mode 100644 index 0000000..75ad040 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/User.cs @@ -0,0 +1,34 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class User +{ + [JsonConstructor] + public User( + string displayName, + string url, + Links links, + string id, + string uniqueName, + string imageUrl, + string descriptor + ) + { + DisplayName = displayName; + Url = url; + Links = links; + Id = id; + UniqueName = uniqueName; + ImageUrl = imageUrl; + Descriptor = descriptor; + } + + public string DisplayName { get; set; } // { init; get; } + public string Url { get; set; } // { init; get; } + public Links Links { get; set; } // { init; get; } + public string Id { get; set; } // { init; get; } + public string UniqueName { get; set; } // { init; get; } + public string ImageUrl { get; set; } // { init; get; } + public string Descriptor { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/WorkItemComments.cs b/Adaptation/FileHandlers/json/WorkItems/WorkItemComments.cs new file mode 100644 index 0000000..b7d1ef4 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/WorkItemComments.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class WorkItemComments +{ + [JsonConstructor] + public WorkItemComments( + string href + ) => Href = href; + + public string Href { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/WorkItemRevisions.cs b/Adaptation/FileHandlers/json/WorkItems/WorkItemRevisions.cs new file mode 100644 index 0000000..a2102a1 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/WorkItemRevisions.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class WorkItemRevisions +{ + [JsonConstructor] + public WorkItemRevisions( + string href + ) => Href = href; + + public string Href { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/WorkItemType.cs b/Adaptation/FileHandlers/json/WorkItems/WorkItemType.cs new file mode 100644 index 0000000..cd6ef91 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/WorkItemType.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class WorkItemType +{ + [JsonConstructor] + public WorkItemType( + string href + ) => Href = href; + + public string Href { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/WorkItems/WorkItemUpdates.cs b/Adaptation/FileHandlers/json/WorkItems/WorkItemUpdates.cs new file mode 100644 index 0000000..c5025d3 --- /dev/null +++ b/Adaptation/FileHandlers/json/WorkItems/WorkItemUpdates.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Adaptation.FileHandlers.json.WorkItems; + +public class WorkItemUpdates +{ + [JsonConstructor] + public WorkItemUpdates( + string href + ) => Href = href; + + public string Href { get; set; } // { init; get; } +} \ No newline at end of file diff --git a/Adaptation/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs b/Adaptation/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs new file mode 100644 index 0000000..5a62594 --- /dev/null +++ b/Adaptation/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs @@ -0,0 +1,17 @@ +namespace Adaptation.Ifx.Eaf.Common.Configuration; + +[System.Runtime.Serialization.DataContract] +public class ConnectionSetting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + public ConnectionSetting(string name, string value) { } + + [System.Runtime.Serialization.DataMember] + public string Name { get; set; } + [System.Runtime.Serialization.DataMember] + 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 new file mode 100644 index 0000000..1e5d6eb --- /dev/null +++ b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/File.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component; + +public class File +{ + +#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(); + +} \ 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 new file mode 100644 index 0000000..5ab689e --- /dev/null +++ b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs @@ -0,0 +1,40 @@ +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +using System; +using System.Collections.Generic; + +namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component; + +public class FilePathGenerator +{ + +#pragma warning disable CA1822 +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + 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(); + +} \ 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 new file mode 100644 index 0000000..05fe1cc --- /dev/null +++ b/Adaptation/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs @@ -0,0 +1,134 @@ +using Adaptation.Ifx.Eaf.Common.Configuration; +using System; +using System.Collections.Generic; + +namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; + +[System.Runtime.Serialization.DataContract] +public class FileConnectorConfiguration +{ + public const ulong IDLE_EVENT_WAIT_TIME_DEFAULT = 360; + public const ulong FILE_HANDLE_TIMEOUT_DEFAULT = 15; + + [System.Runtime.Serialization.DataMember] + public virtual bool? TriggerOnChanged { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual long? PostProcessingRetries { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual bool? CopySourceFolderStructure { get; set; } + [System.Runtime.Serialization.DataMember] + public IfPostProcessingFailsEnum? IfPostProcessingFailsAction { get; set; } + [System.Runtime.Serialization.DataMember] + public string AlternateTargetFolder { get; set; } + [System.Runtime.Serialization.DataMember] + public long? FileHandleTimeout { get; set; } + [System.Runtime.Serialization.DataMember] + public bool? DeleteEmptySourceSubFolders { get; set; } + [System.Runtime.Serialization.DataMember] + public long? IdleEventWaitTimeInSeconds { get; set; } + [System.Runtime.Serialization.DataMember] + public string FileAgeThreshold { get; set; } + public bool? FolderAgeCheckIndividualSubFolders { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual ZipModeEnum? ZipMode { get; set; } + [System.Runtime.Serialization.DataMember] + public FileAgeFilterEnum? FileAgeFilterMode { get; set; } + [System.Runtime.Serialization.DataMember] + public string ZipTargetFileName { get; set; } + [System.Runtime.Serialization.DataMember] + public string ZipErrorTargetFileName { get; set; } + [System.Runtime.Serialization.DataMember] + public long? ZipFileSubFolderLevel { get; set; } + [System.Runtime.Serialization.DataMember] + public string DefaultPlaceHolderValue { get; set; } + [System.Runtime.Serialization.DataMember] + public bool? UseZip64Mode { get; set; } + [System.Runtime.Serialization.DataMember] + public List ConnectionSettings { get; set; } + public string SourceDirectoryCloaking { get; set; } + public string FolderAgeThreshold { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual long? FileScanningIntervalInSeconds { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual bool? TriggerOnCreated { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual long? ZipFileTime { get; set; } + [System.Runtime.Serialization.DataMember] + public string SourceFileLocation { get; set; } + [System.Runtime.Serialization.DataMember] + public string SourceFileFilter { get; set; } + public List SourceFileFilters { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual bool? IncludeSubDirectories { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual FileScanningOptionEnum? FileScanningOption { get; set; } + [System.Runtime.Serialization.DataMember] + public string TargetFileLocation { get; set; } + [System.Runtime.Serialization.DataMember] + public string ErrorTargetFileLocation { get; set; } + [System.Runtime.Serialization.DataMember] + public string TargetFileName { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual long? FileHandleWaitTime { get; set; } + [System.Runtime.Serialization.DataMember] + public IfFileExistEnum? IfFileExistAction { get; set; } + [System.Runtime.Serialization.DataMember] + public long? ConnectionRetryInterval { get; set; } + [System.Runtime.Serialization.DataMember] + public PreProcessingModeEnum? PreProcessingMode { get; set; } + [System.Runtime.Serialization.DataMember] + public PostProcessingModeEnum? PostProcessingMode { get; set; } + [System.Runtime.Serialization.DataMember] + public PostProcessingModeEnum? ErrorPostProcessingMode { get; set; } + [System.Runtime.Serialization.DataMember] + public virtual long? ZipFileAmount { get; set; } + [System.Runtime.Serialization.DataMember] + 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 + } +} \ 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 new file mode 100644 index 0000000..57475d5 --- /dev/null +++ b/Adaptation/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs @@ -0,0 +1,18 @@ +using Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; +using System.Collections.Generic; + +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; + +} \ No newline at end of file diff --git a/Adaptation/Infineon/Monitoring/MonA/ExtWebClient.cs b/Adaptation/Infineon/Monitoring/MonA/ExtWebClient.cs new file mode 100644 index 0000000..7e1ffe0 --- /dev/null +++ b/Adaptation/Infineon/Monitoring/MonA/ExtWebClient.cs @@ -0,0 +1,20 @@ +using System; +using System.Net; + +namespace Infineon.Monitoring.MonA; + +#nullable disable +#pragma warning disable SYSLIB0014 + +public class ExtWebClient : WebClient +{ + protected override WebRequest GetWebRequest(Uri address) + { + WebRequest webRequest = base.GetWebRequest(address); + if (webRequest != null) + webRequest.PreAuthenticate = PreAuthenticate; + return webRequest; + } + + public bool PreAuthenticate { get; set; } +} \ No newline at end of file diff --git a/Adaptation/Infineon/Monitoring/MonA/IMonIn.cs b/Adaptation/Infineon/Monitoring/MonA/IMonIn.cs new file mode 100644 index 0000000..6552d47 --- /dev/null +++ b/Adaptation/Infineon/Monitoring/MonA/IMonIn.cs @@ -0,0 +1,167 @@ +using System; + +namespace Infineon.Monitoring.MonA; + +public interface IMonIn +{ + string SendStatus(string site, string resource, string stateName, State state); + + string SendStatus( + string site, + DateTime timeStamp, + string resource, + string stateName, + State state); + + string SendStatus( + string site, + string resource, + string stateName, + State state, + string description); + + string SendStatus( + string site, + DateTime timeStamp, + string resource, + string stateName, + State state, + string description); + + string SendStatus( + string site, + string resource, + string subresource, + string stateName, + State state); + + string SendStatus( + string site, + DateTime timeStamp, + string resource, + string subresource, + string stateName, + State state); + + string SendStatus( + string site, + string resource, + string subresource, + string stateName, + State state, + string description); + + string SendStatus( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string stateName, + State state, + string description); + + string SendPerformanceMessage( + string site, + string resource, + string performanceName, + double value); + + string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string performanceName, + double value); + + string SendPerformanceMessage( + string site, + string resource, + string performanceName, + double value, + string description); + + string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string performanceName, + double value, + string description); + + string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string performanceName, + double value, + int? interval); + + string SendPerformanceMessage( + string site, + string resource, + DateTime? timeStamp, + string performanceName, + double value, + string unit); + + string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string performanceName, + double value, + string unit, + int? interval); + + string SendPerformanceMessage( + string site, + string resource, + string subresource, + string performanceName, + double value); + + string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value); + + string SendPerformanceMessage( + string site, + string resource, + string subresource, + string performanceName, + double value, + string description); + + string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value, + int? interval); + + string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value, + string unit); + + string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value, + string description, + string unit, + int? interval); +} \ No newline at end of file diff --git a/Adaptation/Infineon/Monitoring/MonA/MonIn.cs b/Adaptation/Infineon/Monitoring/MonA/MonIn.cs new file mode 100644 index 0000000..e9ffce8 --- /dev/null +++ b/Adaptation/Infineon/Monitoring/MonA/MonIn.cs @@ -0,0 +1,292 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Net; +using System.Text; + +namespace Infineon.Monitoring.MonA; + +public class MonIn : IMonIn, IDisposable +{ + private static readonly DateTime _Utc1970DateTime = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + public const string MonInUrl = "http://moninhttp.{0}.infineon.com/input/text"; + private static readonly Dictionary _Instances = new(); + private readonly ExtWebClient _WebClient; + private readonly string _MonInUrl; + private static CultureInfo _CultureInfo; + + public static MonIn GetInstance(string url = "http://moninhttp.{0}.infineon.com/input/text") + { + MonIn instance; + if (_Instances.ContainsKey(url)) + { + instance = _Instances[url]; + } + else + { + lock (_Instances) + { + if (!_Instances.ContainsKey(url)) + { + instance = new MonIn(url); + _Instances.Add(url, instance); + } + else + instance = _Instances[url]; + } + } + return instance; + } + + private MonIn(string url) + { + _WebClient = new ExtWebClient(); + _WebClient.Headers[HttpRequestHeader.ContentType] = "application/text"; + _WebClient.Encoding = Encoding.UTF8; + _CultureInfo = new CultureInfo("en-US"); + _MonInUrl = url; + } + + public void SetBasicAuthentication(string username, string password) + { + _WebClient.PreAuthenticate = true; + _WebClient.Headers[HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)); + } + + public string SendStatus(string site, string resource, string stateName, State state) => SendStatus(site, new DateTime?(), resource, string.Empty, stateName, state, string.Empty); + + public string SendStatus( + string site, + DateTime timeStamp, + string resource, + string stateName, + State state) => SendStatus(site, new DateTime?(timeStamp), resource, string.Empty, stateName, state, string.Empty); + + public string SendStatus( + string site, + string resource, + string stateName, + State state, + string description) => SendStatus(site, new DateTime?(), resource, string.Empty, stateName, state, description); + + public string SendStatus( + string site, + DateTime timeStamp, + string resource, + string stateName, + State state, + string description) => SendStatus(site, new DateTime?(timeStamp), resource, string.Empty, stateName, state, description); + + public string SendStatus( + string site, + string resource, + string subresource, + string stateName, + State state) => SendStatus(site, new DateTime?(), resource, subresource, stateName, state, string.Empty); + + public string SendStatus( + string site, + DateTime timeStamp, + string resource, + string subresource, + string stateName, + State state) => SendStatus(site, new DateTime?(timeStamp), resource, subresource, stateName, state, string.Empty); + + public string SendStatus( + string site, + string resource, + string subresource, + string stateName, + State state, + string description) => SendStatus(site, new DateTime?(), resource, subresource, stateName, state, description); + + public string SendStatus( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string stateName, + State state, + string description) + { + string statusMessage = CreateStatusMessage(site, timeStamp, resource, subresource, stateName, state.ToString(), description); + lock (_WebClient) + return _WebClient.UploadString(string.Format(_MonInUrl, site), statusMessage); + } + + public string SendPerformanceMessage( + string site, + string resource, + string performanceName, + double value) => SendPerformanceMessage(site, new DateTime?(), resource, string.Empty, performanceName, value, string.Empty, string.Empty, new int?()); + + public string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string performanceName, + double value) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, string.Empty, string.Empty, new int?()); + + public string SendPerformanceMessage( + string site, + string resource, + string performanceName, + double value, + string description) => SendPerformanceMessage(site, new DateTime?(), resource, string.Empty, performanceName, value, description, string.Empty, new int?()); + + public string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string performanceName, + double value, + string description) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, description, string.Empty, new int?()); + + public string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string performanceName, + double value, + int? interval) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, string.Empty, string.Empty, interval); + + public string SendPerformanceMessage( + string site, + string resource, + DateTime? timeStamp, + string performanceName, + double value, + string unit) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, string.Empty, unit, new int?()); + + public string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string performanceName, + double value, + string unit, + int? interval) => SendPerformanceMessage(site, timeStamp, resource, string.Empty, performanceName, value, string.Empty, unit, interval); + + public string SendPerformanceMessage( + string site, + string resource, + string subresource, + string performanceName, + double value) => SendPerformanceMessage(site, new DateTime?(), resource, subresource, performanceName, value, string.Empty, string.Empty, new int?()); + + public string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value) => SendPerformanceMessage(site, timeStamp, resource, subresource, performanceName, value, string.Empty, string.Empty, new int?()); + + public string SendPerformanceMessage( + string site, + string resource, + string subresource, + string performanceName, + double value, + string description) => SendPerformanceMessage(site, new DateTime?(), resource, subresource, performanceName, value, description, string.Empty, new int?()); + + public string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value, + int? interval) => SendPerformanceMessage(site, timeStamp, resource, subresource, performanceName, value, string.Empty, string.Empty, interval); + + public string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value, + string unit) => SendPerformanceMessage(site, timeStamp, resource, subresource, performanceName, value, string.Empty, unit, new int?()); + + public string SendPerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value, + string description, + string unit, + int? interval) + { + string performanceMessage = CreatePerformanceMessage(site, timeStamp, resource, subresource, performanceName, value, description, unit, interval); + lock (_WebClient) + return _WebClient.UploadString(string.Format(_MonInUrl, site), performanceMessage); + } + + private static string CreateStatusMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string stateName, + string state, + string description) + { + StringBuilder stringBuilder = new(); + if (string.IsNullOrEmpty(subresource)) + _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" {4} \n{5}", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), stateName.Trim(), state.Trim(), description.Trim()); + else + _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" \"{4}\" {5} \n{6}", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), subresource.Trim(), stateName.Trim(), state.Trim(), description.Trim()); + return stringBuilder.ToString(); + } + + private static string CreatePerformanceMessage( + string site, + DateTime? timeStamp, + string resource, + string subresource, + string performanceName, + double value, + string description, + string unit, + int? interval) + { + StringBuilder stringBuilder = new(); + if (string.IsNullOrEmpty(subresource)) + { + if (unit.Equals(string.Empty) && !interval.HasValue) + _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" {4} \n{5}", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), performanceName.Trim(), value, description.Trim()); + else + _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" {4} {5} {{interval={6}, unit={7}}}\n", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), performanceName.Trim(), value, description.Trim(), interval.HasValue ? interval.Value.ToString() : (object)string.Empty, unit.Trim()); + } + else if (unit.Equals(string.Empty) && !interval.HasValue) + _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" \"{4}\" {5} \n{6}", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), subresource.Trim(), performanceName.Trim(), value, description.Trim()); + else + _ = stringBuilder.AppendFormat(_CultureInfo, "> {0} {1} \"{2}\" \"{3}\" \"{4}\" {5} {6} {{interval={7}, unit={8}}}\n", site.Trim(), timeStamp.HasValue ? GetDateTimeNowAsPosix(timeStamp.Value) : (object)"now", resource.Trim(), subresource.Trim(), performanceName.Trim(), value, description.Trim(), interval.HasValue ? interval.Value.ToString() : (object)string.Empty, unit.Trim()); + return stringBuilder.ToString(); + } + + private static string GetDateTimeNowAsPosix(DateTime timeStamp) + { + if (timeStamp > DateTime.Now) + timeStamp = DateTime.Now; + return ((int)timeStamp.ToUniversalTime().Subtract(_Utc1970DateTime).TotalSeconds).ToString(CultureInfo.InvariantCulture); + } + + public void Dispose() + { + KeyValuePair keyValuePair = new(); + foreach (KeyValuePair instance in _Instances) + { + if (instance.Value == this) + { + keyValuePair = instance; + break; + } + } + _ = _Instances.Remove(keyValuePair.Key); + _WebClient?.Dispose(); + } + +} \ No newline at end of file diff --git a/Adaptation/Infineon/Monitoring/MonA/State.cs b/Adaptation/Infineon/Monitoring/MonA/State.cs new file mode 100644 index 0000000..d6bface --- /dev/null +++ b/Adaptation/Infineon/Monitoring/MonA/State.cs @@ -0,0 +1,11 @@ +namespace Infineon.Monitoring.MonA; + +public enum State +{ + Up, + Ok, + Warning, + Critical, + Down, + Unknown, +} \ No newline at end of file diff --git a/Adaptation/MESAFIBACKLOG.Tests.csproj b/Adaptation/MESAFIBACKLOG.Tests.csproj new file mode 100644 index 0000000..9b11117 --- /dev/null +++ b/Adaptation/MESAFIBACKLOG.Tests.csproj @@ -0,0 +1,97 @@ + + + SAK + SAK + SAK + SAK + + + disable + false + 10.0 + disable + win-x64 + net6.0 + + + trx + XPlat Code Coverage + ../../../../MESAFIBACKLOG/05_TestResults/TestResults + + + true + true + true + + + Windows + + + OSX + + + Linux + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + NU1701 + NU1701 + NU1701 + + + NU1701 + NU1701 + NU1701 + NU1701 + NU1701 + NU1701 + NU1701 + NU1701 + + + + Always + + + Always + + + \ No newline at end of file diff --git a/Adaptation/PeerGroup/GCL/Annotations/NotNullAttribute.cs b/Adaptation/PeerGroup/GCL/Annotations/NotNullAttribute.cs new file mode 100644 index 0000000..e32df4c --- /dev/null +++ b/Adaptation/PeerGroup/GCL/Annotations/NotNullAttribute.cs @@ -0,0 +1,9 @@ +using System; + +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 +{ + public NotNullAttribute() { } +} \ No newline at end of file diff --git a/Adaptation/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs b/Adaptation/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs new file mode 100644 index 0000000..af1ea65 --- /dev/null +++ b/Adaptation/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs @@ -0,0 +1,7 @@ +namespace Adaptation.PeerGroup.GCL.SecsDriver; + +public enum HsmsConnectionMode +{ + 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 new file mode 100644 index 0000000..eecd8b7 --- /dev/null +++ b/Adaptation/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs @@ -0,0 +1,7 @@ +namespace Adaptation.PeerGroup.GCL.SecsDriver; + +public enum HsmsSessionMode +{ + 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 new file mode 100644 index 0000000..5e68d64 --- /dev/null +++ b/Adaptation/PeerGroup/GCL/SecsDriver/SecsTransportType.cs @@ -0,0 +1,7 @@ +namespace Adaptation.PeerGroup.GCL.SecsDriver; + +public enum SecsTransportType +{ + 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 new file mode 100644 index 0000000..a5bd2c3 --- /dev/null +++ b/Adaptation/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs @@ -0,0 +1,15 @@ +namespace Adaptation.PeerGroup.GCL.SecsDriver; + +public enum SerialBaudRate +{ + 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/Duplicator/Description.cs b/Adaptation/Shared/Duplicator/Description.cs new file mode 100644 index 0000000..ee456bf --- /dev/null +++ b/Adaptation/Shared/Duplicator/Description.cs @@ -0,0 +1,145 @@ +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 RDS { 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; + } + + internal static string GetDateFormat() => "MM/dd/yyyy hh:mm:ss tt"; + +} \ No newline at end of file diff --git a/Adaptation/Shared/FileRead.cs b/Adaptation/Shared/FileRead.cs new file mode 100644 index 0000000..48122f8 --- /dev/null +++ b/Adaptation/Shared/FileRead.cs @@ -0,0 +1,676 @@ +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 _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 Dictionary> _StaticRuns; + 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; + bool Properties.IFileRead.IsDuplicator => _IsDuplicator; + 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, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) + { + _SMTP = smtp; + _IsEvent = isEvent; + _DummyRuns = dummyRuns; + _LastTicksDuration = 0; + _StaticRuns = staticRuns; + _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; + _TracePath = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "Path.Trace"); + _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); + } + if (isDuplicator) + _MesEntity = string.Empty; + else + _MesEntity = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, string.Concat("CellInstance.", cellInstanceName, ".Alias")); + _EventName = eventName; + _EventNameFileRead = eventNameFileRead; + _EquipmentType = parameterizedModelObjectDefinitionTypeAppended; + long breakAfterSeconds; + if (_FileConnectorConfiguration is null) + breakAfterSeconds = 360; + else + { + if (_FileConnectorConfiguration.FileScanningOption == FileConnectorConfiguration.FileScanningOptionEnum.TimeBased) + breakAfterSeconds = Math.Abs(_FileConnectorConfiguration.FileHandleTimeout.Value); + else if (_FileConnectorConfiguration.FileScanningOption == FileConnectorConfiguration.FileScanningOptionEnum.FileWatcher) + breakAfterSeconds = Math.Abs(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value); + else + throw new Exception(); + } + _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); + _Log.Info($"{new TimeSpan(ticksDuration).TotalMilliseconds} TotalMillisecond(s) to process{Environment.NewLine}{_CellInstanceConnectionName}{Environment.NewLine}<{_ReportFullPath}>"); + } + + 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; + } + } + } + } + + private void WriteAllLines(string to, string[] exceptionLines) + { + string fileName = string.Concat(to, @"\readme.txt"); + try + { + if (!Directory.Exists(to)) + _ = Directory.CreateDirectory(to); + File.WriteAllLines(fileName, exceptionLines); + } + catch (Exception ex) { _Log.Error(ex.Message); } + } + + protected string[] Move(Tuple> extractResults, string to, string from, string resolvedFileLocation, Exception exception) + { + string[] results; + bool isErrorFile = exception is not null; + if (!to.EndsWith(@"\")) + _ = string.Concat(to, @"\"); + if (!isErrorFile) + results = Array.Empty(); + else + { + results = new string[] { _Logistics.Sequence.ToString(), _Logistics.ReportFullPath, from, resolvedFileLocation, to, string.Empty, string.Empty, exception.Message, string.Empty, string.Empty, exception.StackTrace }; + if (!_IsDuplicator) + WriteAllLines(to, results); + } + if (extractResults is not null && extractResults.Item4 is not null && extractResults.Item4.Any()) + { + string itemFile; + List directories = new(); + foreach (FileInfo sourceFile in extractResults.Item4) + { + if (sourceFile.FullName != _Logistics.ReportFullPath) + { + itemFile = sourceFile.FullName.Replace(from, to); + Shared1880(itemFile, directories, sourceFile, isErrorFile); + } + else if (!isErrorFile && _Logistics is not null) + Shared1811(to, sourceFile); + } + Shared0231(directories); + } + return results; + } + + protected static string GetTupleFile(Logistics logistics, List descriptions, Properties.IScopeInfo scopeInfo, string duplicateDirectory) where T : Properties.IDescription + { + string result; + string rds; + string dateValue; + string rdsPlaceholder = "%RDS%"; + if (!descriptions.Any() || string.IsNullOrEmpty(descriptions[0].RDS)) + rds = logistics.MID; + else + rds = descriptions[0].RDS; + string[] segments = scopeInfo.FileName.Split(new string[] { "DateTime:" }, StringSplitOptions.RemoveEmptyEntries); + if (segments.Length == 0) + result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileNameWithoutExtension.Replace(rdsPlaceholder, rds)); + else + { + segments = segments[1].Split('%'); + string datePlaceholder = "%DateTime%"; + dateValue = logistics.DateTimeFromSequence.ToString(segments[0]); + foreach (string segment in scopeInfo.FileName.Split('%')) + { + if (!segment.Contains(segments[0])) + continue; + datePlaceholder = string.Concat('%', segment, '%'); + } + result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileName.Replace(rdsPlaceholder, rds).Replace(datePlaceholder, dateValue)); + } + if (result.Contains('%')) + throw new Exception("Placeholder exists!"); + return result; + } + + protected void WaitForFileConsumption(string sourceDirectoryCloaking, Logistics logistics, DateTime dateTime, List descriptions, string successDirectory, string duplicateDirectory, string duplicateFile, List<(Properties.IScopeInfo, string)> collection) where T : Properties.IDescription + { + bool check; + long preWait; + string tupleFile; + string tupleFileName = string.Empty; + List duplicateFiles = new(); + StringBuilder stringBuilder = new(); + List consumedFileIndices = new(); + bool moreThanAnHour = _BreakAfterSeconds > 3600; + long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks; + if (_FileConnectorConfiguration?.FileHandleWaitTime is null) + preWait = dateTime.AddMilliseconds(1234).Ticks; + else + preWait = dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks; + if (!collection.Any()) + duplicateFiles.Add(duplicateFile); + string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath); + string successFile = string.Concat(successDirectory, @"\", Path.GetFileName(logistics.ReportFullPath)); + foreach ((Properties.IScopeInfo scopeInfo, string text) in collection) + { + if (scopeInfo.FileName.StartsWith(@"\")) + tupleFile = scopeInfo.FileName; + else if (!scopeInfo.FileName.Contains('%')) + tupleFile = string.Concat(duplicateDirectory, @"\", fileName, "_", scopeInfo.FileNameWithoutExtension, ".pdsfc"); + else + tupleFile = GetTupleFile(logistics, descriptions, scopeInfo, duplicateDirectory); + tupleFileName = Path.GetFileNameWithoutExtension(tupleFile).Split('.')[0]; + duplicateFiles.Add(tupleFile); + if (_IsEAFHosted) + File.WriteAllText(tupleFile, text); + } + for (short i = 0; i < short.MaxValue; i++) + { + if (DateTime.Now.Ticks > preWait) + break; + Thread.Sleep(100); + } + if (!moreThanAnHour) + { + for (short z = 0; z < short.MaxValue; z++) + { + try + { + check = string.IsNullOrEmpty(successDirectory) || File.Exists(successFile); + if (check) + { + consumedFileIndices.Clear(); + for (int i = 0; i < duplicateFiles.Count; i++) + { + if (!File.Exists(duplicateFiles[i])) + { + if (string.IsNullOrEmpty(tupleFileName)) + consumedFileIndices.Add(i); + else if (duplicateFiles.All(l => Path.GetFileNameWithoutExtension(l).Split('.')[0] == tupleFileName)) + { + for (int j = 0; j < duplicateFiles.Count; j++) + consumedFileIndices.Add(j); + } + else + consumedFileIndices.Add(i); + } + } + if (consumedFileIndices.Count == duplicateFiles.Count) + break; + } + } + catch (Exception) { } + if (DateTime.Now.Ticks > breakAfter) + { + for (int i = 0; i < duplicateFiles.Count; i++) + { + if (File.Exists(duplicateFiles[i])) + { + try + { File.Delete(duplicateFiles[i]); } + catch (Exception) { } + _ = stringBuilder.Append('<').Append(duplicateFiles[i]).Append("> "); + } + } + throw new Exception(string.Concat("After {", _BreakAfterSeconds, "} seconds, right side of {", sourceDirectoryCloaking, "} didn't consume file(s) ", stringBuilder)); + } + Thread.Sleep(250); + } + } + } + + protected void SetFileParameter(string key, string value) + { + if (_FileConnectorConfiguration is null || _FileConnectorConfiguration.TargetFileLocation.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.ErrorTargetFileLocation.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.TargetFileName.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.ErrorTargetFileName.Contains(string.Concat("%", key, "%"))) + { + if (_FileParameter.ContainsKey(key)) + _FileParameter[key] = value; + else + _FileParameter.Add(key, value); + } + } + + protected void SetFileParameterLotIDToLogisticsMID(bool includeLogisticsSequence = true) + { + string key; + if (!includeLogisticsSequence) + key = "LotID"; + else + key = "LotIDWithLogisticsSequence"; + string value = string.Concat(_Logistics.MID, "_", _Logistics.Sequence, "_", DateTime.Now.Ticks - _Logistics.Sequence); + SetFileParameter(key, value); + } + + protected void SetFileParameterLotID(string value, bool includeLogisticsSequence = true) + { + string key; + if (!includeLogisticsSequence) + key = "LotID"; + else + { + key = "LotIDWithLogisticsSequence"; + value = string.Concat(value, "_", _Logistics.Sequence, "_", DateTime.Now.Ticks - _Logistics.Sequence); + } + SetFileParameter(key, value); + } + + protected void WritePDSF(IFileRead fileRead, JsonElement[] jsonElements) + { + string directory; + if (!_CellInstanceConnectionName.StartsWith(_CellInstanceName) && _CellInstanceConnectionNameBase == _EquipmentType) + directory = Path.Combine(_TracePath, _EquipmentType, "Target", _CellInstanceName, _CellInstanceConnectionName); + else + directory = Path.Combine(_TracePath, _EquipmentType, "Source", _CellInstanceName, _CellInstanceConnectionName); + if (!Directory.Exists(directory)) + _ = Directory.CreateDirectory(directory); + string file = Path.Combine(directory, string.Concat(_Logistics.MesEntity, "_", _Logistics.Sequence, ".ipdsf")); + string lines = ProcessDataStandardFormat.GetPDSFText(fileRead, _Logistics, jsonElements, logisticsText: string.Empty); + File.WriteAllText(file, lines); + if (_Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600) + { + try + { File.SetLastWriteTime(file, _Logistics.DateTimeFromSequence); } + catch (Exception) { } + } + } + + protected void Move(Tuple> extractResults) + { + if (!_IsEAFHosted) + { + 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 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; + } + + private 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(); + } + } + } + + private 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 = $"{_Logistics.DateTimeFromSequence:yyyy}_Week_{weekOfYear}{@"\"}{_Logistics.DateTimeFromSequence: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 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 WaitForFileConsumption(DateTime dateTime, List descriptions, bool isDummyRun, string successDirectory, string duplicateDirectory, List<(Properties.IScopeInfo, string)> collection, string duplicateFile) where T : Properties.IDescription + { + if (!isDummyRun && _IsEAFHosted) + WaitForFileConsumption(_FileConnectorConfiguration.SourceDirectoryCloaking, _Logistics, dateTime, descriptions, successDirectory, duplicateDirectory, duplicateFile, collection); + else + { + long breakAfter = DateTime.Now.AddSeconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks; + for (short i = 0; i < short.MaxValue; i++) + { + if (!_IsEAFHosted || DateTime.Now.Ticks > breakAfter) + break; + Thread.Sleep(500); + } + } + } + + internal static string GetJobIdParentDirectory(string directory) + { + string result; + if (!string.IsNullOrEmpty(Path.GetFileName(directory))) + result = Path.GetFullPath(GetParentParent(directory)); + else + result = Path.GetFullPath(GetParentParent(Path.GetDirectoryName(directory))); + if (!Directory.Exists(result)) + _ = Directory.CreateDirectory(result); + return result; + } + + internal string[] GetInProcessDirectory(string jobIdDirectory) + { + string[] results; + if (!_IsEAFHosted) + results = new string[] { jobIdDirectory }; + else + { + string logisticsSequence = _Logistics.Sequence.ToString(); + results = Directory.GetDirectories(jobIdDirectory, string.Concat(_Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly); + } + if ((results is null) || results.Length != 1) + throw new Exception("Didn't find directory by logistics sequence"); + return results; + } + + internal static string GetFileNameAfterUnderscoreSplit(string reportFullPath) + { + string result; + string[] segments = Path.GetFileNameWithoutExtension(reportFullPath).Split('_'); + if (segments.Length <= 2) + result = segments[0]; + else + result = string.Concat(segments[0], segments[2]); + return result; + } + + internal static string GetParentParent(string value) + { + string result = Path.GetDirectoryName(Path.GetDirectoryName(value)); + return result; + } + +} + +// 2022-06-08 -> Shared - FileRead \ No newline at end of file diff --git a/Adaptation/Shared/Logistics.cs b/Adaptation/Shared/Logistics.cs new file mode 100644 index 0000000..43d66b4 --- /dev/null +++ b/Adaptation/Shared/Logistics.cs @@ -0,0 +1,201 @@ +using Adaptation.Shared.Methods; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Adaptation.Shared; + +public class Logistics : ILogistics +{ + + protected readonly DateTime _DateTimeFromSequence; + protected readonly FileInfo _FileInfo; + protected readonly string _JobID; + protected readonly List _Logistics1; + protected readonly List _Logistics2; + protected string _MID; + protected readonly string _MesEntity; + protected readonly object _NullData; + protected string _ProcessJobID; + protected readonly string _ReportFullPath; + protected readonly long _Sequence; + protected readonly double _TotalSecondsSinceLastWriteTimeFromSequence; + + public DateTime DateTimeFromSequence => _DateTimeFromSequence; + public FileInfo FileInfo => _FileInfo; + public string JobID => _JobID; + public List Logistics1 => _Logistics1; + public List Logistics2 => _Logistics2; + public string MID => _MID; + public string MesEntity => _MesEntity; + public object NullData => _NullData; + public string ProcessJobID => _ProcessJobID; + public string ReportFullPath => _ReportFullPath; + public long Sequence => _Sequence; + public double TotalSecondsSinceLastWriteTimeFromSequence => _TotalSecondsSinceLastWriteTimeFromSequence; + + 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); + _Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); + _Logistics2 = new List(); + } + + public Logistics(IFileRead fileRead, long tickOffset, 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 = new(reportFullPath); + DateTime dateTime = new (_FileInfo.LastWriteTime.Ticks + tickOffset); + 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()); + _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; + _FileInfo = new(reportFullPath); + _Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); + if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1")) + { + _NullData = null; + _JobID = "null"; + dateTime = _FileInfo.LastWriteTime; + _Sequence = dateTime.Ticks; + _DateTimeFromSequence = dateTime; + _TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + _MesEntity = DefaultMesEntity(dateTime); + _ReportFullPath = reportFullPath; + _ProcessJobID = "R##"; + _MID = "null"; + _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 = _FileInfo.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 = _FileInfo.LastWriteTime; + else + dateTime = new DateTime(sequence); + } + _Sequence = dateTime.Ticks; + _DateTimeFromSequence = dateTime; + _TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; + DateTime lastWriteTime = _FileInfo.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]; + } + } + Logistics2 logistics2; + _Logistics2 = new List(); + for (int i = 1; i < Logistics1.Count; i++) + { + if (Logistics1[i].StartsWith("LOGISTICS_2")) + { + logistics2 = new Logistics2(Logistics1[i]); + Logistics2.Add(logistics2); + } + } + for (int i = Logistics1.Count - 1; i > -1; i--) + { + if (Logistics1[i].StartsWith("LOGISTICS_2")) + Logistics1.RemoveAt(i); + } + } + + private static string DefaultMesEntity(DateTime dateTime) => string.Concat(dateTime.Ticks, "_MES_ENTITY"); + + internal void Update(string mid, string processJobID) + { + _MID = mid; + _ProcessJobID = processJobID; + } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Logistics2.cs b/Adaptation/Shared/Logistics2.cs new file mode 100644 index 0000000..a067258 --- /dev/null +++ b/Adaptation/Shared/Logistics2.cs @@ -0,0 +1,78 @@ +using System; + +namespace Adaptation.Shared; + +public class Logistics2 : Methods.ILogistics2 +{ + + 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 + { + 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..3d690c1 --- /dev/null +++ b/Adaptation/Shared/Methods/IFileRead.cs @@ -0,0 +1,22 @@ +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(); + string GetEventDescription(); + List GetHeaderNames(); + 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/ScopeInfo.cs b/Adaptation/Shared/Metrology/ScopeInfo.cs new file mode 100644 index 0000000..539bd09 --- /dev/null +++ b/Adaptation/Shared/Metrology/ScopeInfo.cs @@ -0,0 +1,300 @@ +using System; +using System.IO; + +namespace Adaptation.Shared.Metrology; + +public class ScopeInfo : Properties.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 = "", string extraExtension = "") + { + 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/WS.Attachment.cs b/Adaptation/Shared/Metrology/WS.Attachment.cs new file mode 100644 index 0000000..ea105ed --- /dev/null +++ b/Adaptation/Shared/Metrology/WS.Attachment.cs @@ -0,0 +1,21 @@ +namespace Adaptation.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; + } + + } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/WS.Results.cs b/Adaptation/Shared/Metrology/WS.Results.cs new file mode 100644 index 0000000..2d1c603 --- /dev/null +++ b/Adaptation/Shared/Metrology/WS.Results.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Text.Json; + +namespace Adaptation.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() => JsonSerializer.Serialize(this, GetType()); + } + +} \ No newline at end of file diff --git a/Adaptation/Shared/Metrology/WS.cs b/Adaptation/Shared/Metrology/WS.cs new file mode 100644 index 0000000..b892219 --- /dev/null +++ b/Adaptation/Shared/Metrology/WS.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Text; +using System.Text.Json; + +namespace Adaptation.Shared.Metrology; + +public partial class WS +{ + + public static (string, Results) SendData(string url, object payload, int timeoutSeconds = 120) + { + Results results = new(); + 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.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0); + 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()); + } + catch (Exception e) + { + Exception exception = e; + StringBuilder stringBuilder = new(); + while (exception is not null) + { + _ = stringBuilder.AppendLine(exception.Message); + exception = exception.InnerException; + } + if (results.Errors is null) + results.Errors = new List(); + results.Errors.Add(stringBuilder.ToString()); + } + return new(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(); + 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, "", File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); + } + if (dataAttachments is not null) + { + foreach (Attachment attachment in dataAttachments) + AttachFile(url, headerID, attachment.UniqueId, 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..9dcdb0a --- /dev/null +++ b/Adaptation/Shared/ProcessDataStandardFormat.cs @@ -0,0 +1,409 @@ +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 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 inputSeparator = '\t'; + char outputSeparator = '\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(inputSeparator); + 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(inputSeparator).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(inputSeparator); + 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(inputSeparator); + 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(outputSeparator); + _ = 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(inputSeparator); + for (int s = 0; s < segments.Length; s++) + _ = stringBuilder.Append(segments[s].PadLeft(vs[s], ' ')).Append(outputSeparator); + _ = 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..1166e17 --- /dev/null +++ b/Adaptation/Shared/Properties/IDescription.cs @@ -0,0 +1,11 @@ +namespace Adaptation.Shared.Properties; + +public interface IDescription +{ + + int Test { get; } + int Count { get; } + int Index { get; } + string RDS { 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..5cf9a69 --- /dev/null +++ b/Adaptation/Shared/Properties/IFileRead.cs @@ -0,0 +1,18 @@ +namespace Adaptation.Shared.Properties; + +public interface IFileRead +{ + bool IsEvent { get; } + string NullData { get; } + string MesEntity { get; } + bool IsEAFHosted { get; } + string EventName { get; } + bool IsDuplicator { 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..398bed9 --- /dev/null +++ b/Adaptation/Shared/Properties/ILogistics.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace Adaptation.Shared.Properties; + +public interface ILogistics +{ + + public DateTime DateTimeFromSequence { get; } + public FileInfo FileInfo { get; } + public string JobID { get; } + public List Logistics1 { get; } + public List Logistics2 { get; } + public string MID { get; } + public string MesEntity { get; } + public object NullData { get; } + public string ProcessJobID { get; } + public string ReportFullPath { get; } + public long Sequence { get; } + public double TotalSecondsSinceLastWriteTimeFromSequence { get; } + +} \ 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.43.0/BACKLOG-EQPT.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.0/BACKLOG-EQPT.cs new file mode 100644 index 0000000..646c2db --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.0/BACKLOG-EQPT.cs @@ -0,0 +1,66 @@ +using Adaptation._Tests.Shared; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Adaptation._Tests.CreateSelfDescription.Staging.v2_43_0; + +[TestClass] +public class BACKLOG_EQPT : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static string DummyRoot { get; private set; } + internal static BACKLOG_EQPT EAFLoggingUnitTesting { get; private set; } + + static BACKLOG_EQPT() => DummyRoot = @"\\messv02ecc1.ec.local\EC_Characterization_Si\Dummy"; + + public BACKLOG_EQPT() : base(DummyRoot, testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public BACKLOG_EQPT(TestContext testContext) : base(DummyRoot, testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new BACKLOG_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(); + } + +#if true + [Ignore] +#endif + [TestMethod] + public void Staging__v2_43_0__BACKLOG_EQPT__ConvertExcelToJson() + { + string check = "*.xlsx"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + _ = AdaptationTesting.GetWriteConfigurationGetFileRead(methodBase, check, EAFLoggingUnitTesting.AdaptationTesting); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.0/BACKLOG.cs b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.0/BACKLOG.cs new file mode 100644 index 0000000..9d30f66 --- /dev/null +++ b/Adaptation/_Tests/CreateSelfDescription/Staging/v2.43.0/BACKLOG.cs @@ -0,0 +1,66 @@ +using Adaptation._Tests.Shared; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Adaptation._Tests.CreateSelfDescription.Staging.v2_43_0; + +[TestClass] +public class BACKLOG : EAFLoggingUnitTesting +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static string DummyRoot { get; private set; } + internal static BACKLOG EAFLoggingUnitTesting { get; private set; } + + static BACKLOG() => DummyRoot = @"\\messv02ecc1.ec.local\EC_Characterization_Si\Dummy"; + + public BACKLOG() : base(DummyRoot, testContext: null, declaringType: null, skipEquipmentDictionary: false) + { + if (EAFLoggingUnitTesting is null) + throw new Exception(); + } + + public BACKLOG(TestContext testContext) : base(DummyRoot, testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + if (EAFLoggingUnitTesting is null) + EAFLoggingUnitTesting = new BACKLOG(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(); + } + +#if true + [Ignore] +#endif + [TestMethod] + public void Staging__v2_43_0__BACKLOG__json() + { + string check = "*.json"; + MethodBase methodBase = new StackFrame().GetMethod(); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + _ = AdaptationTesting.GetWriteConfigurationGetFileRead(methodBase, check, EAFLoggingUnitTesting.AdaptationTesting); + EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Extract/Staging/v2.43.0/BACKLOG-EQPT.cs b/Adaptation/_Tests/Extract/Staging/v2.43.0/BACKLOG-EQPT.cs new file mode 100644 index 0000000..dcc37a7 --- /dev/null +++ b/Adaptation/_Tests/Extract/Staging/v2.43.0/BACKLOG-EQPT.cs @@ -0,0 +1,54 @@ +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 Adaptation._Tests.Extract.Staging.v2_43_0; + +[TestClass] +public class BACKLOG_EQPT +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + private static CreateSelfDescription.Staging.v2_43_0.BACKLOG_EQPT _BACKLOG_EQPT; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + CreateSelfDescription.Staging.v2_43_0.BACKLOG_EQPT.ClassInitialize(testContext); + _BACKLOG_EQPT = CreateSelfDescription.Staging.v2_43_0.BACKLOG_EQPT.EAFLoggingUnitTesting; + } + +#if true + [Ignore] +#endif + [TestMethod] + public void Staging__v2_43_0__BACKLOG_EQPT__ConvertExcelToJson() => _BACKLOG_EQPT.Staging__v2_43_0__BACKLOG_EQPT__ConvertExcelToJson(); + +#if true + [Ignore] +#endif + [TestMethod] + public void Staging__v2_43_0__BACKLOG_EQPT__ConvertExcelToJson637961178824025822__Normal() + { + string check = "*.xlsx"; + bool validatePDSF = false; + MethodBase methodBase = new StackFrame().GetMethod(); + _BACKLOG_EQPT.Staging__v2_43_0__BACKLOG_EQPT__ConvertExcelToJson(); + Assert.IsFalse(string.IsNullOrEmpty(_BACKLOG_EQPT.AdaptationTesting.TestContext.FullyQualifiedTestClassName)); + string[] variables = _BACKLOG_EQPT.AdaptationTesting.GetVariables(methodBase, check, validatePDSF); + IFileRead fileRead = _BACKLOG_EQPT.AdaptationTesting.Get(methodBase, sourceFileLocation: variables[2], sourceFileFilter: variables[3], useCyclicalForDescription: false); + Tuple> extractResult = fileRead.ReExtract(); + Assert.IsFalse(string.IsNullOrEmpty(extractResult?.Item1)); + Assert.IsNotNull(extractResult.Item3); + Assert.IsNotNull(extractResult.Item4); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Extract/Staging/v2.43.0/BACKLOG.cs b/Adaptation/_Tests/Extract/Staging/v2.43.0/BACKLOG.cs new file mode 100644 index 0000000..013f1fa --- /dev/null +++ b/Adaptation/_Tests/Extract/Staging/v2.43.0/BACKLOG.cs @@ -0,0 +1,54 @@ +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 Adaptation._Tests.Extract.Staging.v2_43_0; + +[TestClass] +public class BACKLOG +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + private static CreateSelfDescription.Staging.v2_43_0.BACKLOG _BACKLOG; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + CreateSelfDescription.Staging.v2_43_0.BACKLOG.ClassInitialize(testContext); + _BACKLOG = CreateSelfDescription.Staging.v2_43_0.BACKLOG.EAFLoggingUnitTesting; + } + +#if true + [Ignore] +#endif + [TestMethod] + public void Staging__v2_43_0__BACKLOG__json() => _BACKLOG.Staging__v2_43_0__BACKLOG__json(); + +#if true + [Ignore] +#endif + [TestMethod] + public void Staging__v2_43_0__BACKLOG__json637961251829737445__Normal() + { + string check = "*.json"; + bool validatePDSF = false; + _BACKLOG.Staging__v2_43_0__BACKLOG__json(); + MethodBase methodBase = new StackFrame().GetMethod(); + Assert.IsFalse(string.IsNullOrEmpty(_BACKLOG.AdaptationTesting.TestContext.FullyQualifiedTestClassName)); + string[] variables = _BACKLOG.AdaptationTesting.GetVariables(methodBase, check, validatePDSF); + IFileRead fileRead = _BACKLOG.AdaptationTesting.Get(methodBase, sourceFileLocation: variables[2], sourceFileFilter: variables[3], useCyclicalForDescription: false); + Tuple> extractResult = fileRead.ReExtract(); + Assert.IsFalse(string.IsNullOrEmpty(extractResult?.Item1)); + Assert.IsNotNull(extractResult.Item3); + Assert.IsNotNull(extractResult.Item4); + } + +} \ 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..d4028ef --- /dev/null +++ b/Adaptation/_Tests/Shared/AdaptationTesting.cs @@ -0,0 +1,1280 @@ +using Adaptation._Tests.Shared.PasteSpecialXml.EAF.XML.API.CellInstance; +using Adaptation._Tests.Shared.PasteSpecialXml.EAF.XML.API.ConfigurationData; +using Adaptation._Tests.Shared.PasteSpecialXml.EAF.XML.API.EquipmentDictionary; +using Adaptation._Tests.Shared.PasteSpecialXml.EAF.XML.API.EquipmentType; +using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; +using Adaptation.Ifx.Eaf.Common.Configuration; +using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; +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; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Xml; +using System.Xml.Linq; +using System.Xml.Serialization; + +namespace Adaptation._Tests.Shared; + +public class AdaptationTesting : ISMTP +{ + + protected readonly string _DummyRoot; + protected readonly string _Environment; + protected readonly string _HostNameAndPort; + protected readonly bool _HasWaitForProperty; + protected readonly TestContext _TestContext; + protected readonly bool _SkipEquipmentDictionary; + protected readonly string _TestContextPropertiesAsJson; + 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 DummyRoot => _DummyRoot; + public string Environment => _Environment; + public TestContext TestContext => _TestContext; + public string HostNameAndPort => _HostNameAndPort; + public bool HasWaitForProperty => _HasWaitForProperty; + public bool SkipEquipmentDictionary => _SkipEquipmentDictionary; + public string TestContextPropertiesAsJson => _TestContextPropertiesAsJson; + 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(string dummyRoot, TestContext testContext, bool skipEquipmentDictionary, string testContextPropertiesAsJson, bool hasWaitForProperty) + { + + string environment = GetEnvironment(testContext); + string hostNameAndPort = GetHostNameAndPort(environment); + _DummyRoot = dummyRoot; + _TestContext = testContext; + _Environment = environment; + _HostNameAndPort = hostNameAndPort; + _HasWaitForProperty = hasWaitForProperty; + _SkipEquipmentDictionary = skipEquipmentDictionary; + _TestContextPropertiesAsJson = testContextPropertiesAsJson; + _CellInstanceVersions = new Dictionary(); + _EquipmentTypeVersions = new Dictionary(); + _EquipmentTypeVersions = new Dictionary(); + _ParameterizedModelObjectDefinitionTypes = 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; + } + + public static string GetTestResultsDirectory(string testContextTestResultsDirectory, bool hasWaitForProperty) + { + string result = string.Empty; + string testResults = "05_TestResults"; + string checkDirectory = testContextTestResultsDirectory; + if (hasWaitForProperty && (string.IsNullOrEmpty(checkDirectory) || !checkDirectory.Contains(testResults))) + throw new Exception($"A:{checkDirectory}; B:{testResults};"); + else if (!hasWaitForProperty && (string.IsNullOrEmpty(checkDirectory) || !checkDirectory.Contains(testResults))) + result = testContextTestResultsDirectory; + else + { + 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; + } + + private string GetTestResultsDirectory(bool hasWaitForProperty) + { + string result = GetTestResultsDirectory(_TestContext.TestResultsDirectory, hasWaitForProperty); + 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; + } + + public static MethodBaseName GetMethodBaseName(string dummyRoot, string environment, bool hasWaitForProperty, string methodBaseName, string testResultsDirectory) + { + MethodBaseName result; + string comment; + string fileFullName; + string dummyDirectory; + string withActualCICN; + string separator = "__"; + string textFileDirectory; + string connectionNameAndTicks; + string cellInstanceConnectionName; + string ticks = DateTime.Now.Ticks.ToString(); + string cellInstanceConnectionNameFromMethodBaseName; + string[] segments = methodBaseName.Split(new string[] { separator }, 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, separator, rawVersionName, separator, cellInstanceName, separator); + 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); + withActualCICN = GetMethodBaseNameWithActualCICN(methodBaseName, rawCellInstanceName, cellInstanceConnectionNameFromMethodBaseName, cellInstanceConnectionName, ticks); + if (hasWaitForProperty) + dummyDirectory = string.Empty; + else if (string.IsNullOrEmpty(ticks)) + dummyDirectory = string.Empty; + else + { + if (string.IsNullOrEmpty(dummyRoot)) + throw new Exception($"{nameof(dummyRoot)} is empty!"); + if (!withActualCICN.Contains(ticks)) + throw new Exception($"{withActualCICN} doesn't contain {ticks}!"); + segments = withActualCICN.Split(new string[] { ticks }, StringSplitOptions.None); + dummyDirectory = Path.Combine(dummyRoot, cellInstanceName, ticks, string.Join(null, segments)); + if (!Directory.Exists(dummyDirectory)) + _ = Directory.CreateDirectory(dummyDirectory); + } + if (string.IsNullOrEmpty(ticks)) + { + textFileDirectory = string.Empty; + fileFullName = Path.Combine(versionDirectory, withActualCICN, $"{cellInstanceConnectionNameFromMethodBaseName}.json"); + } + else + { + segments = withActualCICN.Split(new string[] { ticks }, StringSplitOptions.None); + textFileDirectory = Path.Combine(versionDirectory, segments[0], string.Concat(ticks, segments[1])); + fileFullName = Path.Combine(versionDirectory, segments[0], $"{cellInstanceConnectionNameFromMethodBaseName}.json"); + } + result = new(after, before, cellInstanceConnectionName, cellInstanceConnectionNameFromMethodBaseName, cellInstanceName, cellInstanceVersionName, comment, dummyDirectory, fileFullName, rawCellInstanceName, rawVersionName, separator, testResultsDirectory, textFileDirectory, ticks, versionDirectory, withActualCICN); + return result; + } + + private MethodBaseName GetMethodBaseName(MethodBase methodBase) + { + MethodBaseName result; + string testResultsDirectory = GetTestResultsDirectory(_HasWaitForProperty); + result = GetMethodBaseName(_DummyRoot, _Environment, _HasWaitForProperty, methodBase.Name, testResultsDirectory); + return result; + } + + private string[] GetTextFiles(MethodBaseName mbn) + { + string[] results; + if (string.IsNullOrEmpty(mbn.TextFileDirectory)) + results = Array.Empty(); + else if (!Directory.Exists(mbn.TextFileDirectory)) + { + results = Array.Empty(); + if (!_HasWaitForProperty) + _ = Directory.CreateDirectory(mbn.TextFileDirectory); + else + { + string renameDirectory = Path.Combine(Path.GetDirectoryName(mbn.TextFileDirectory), $"_Rename - {Path.GetFileName(mbn.TextFileDirectory)}"); + _ = 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 + { + results = Directory.GetFiles(mbn.TextFileDirectory, "*.txt", SearchOption.TopDirectoryOnly); + if (!string.IsNullOrEmpty(mbn.Ticks) && _HasWaitForProperty && !results.Any()) + { + _ = Process.Start("explorer.exe", mbn.TextFileDirectory); + File.WriteAllText(Path.Combine(mbn.TextFileDirectory, "_ Why.why"), string.Empty); + } + } + return results; + } + + 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; + } + + public static CellInstanceVersion GetCellInstanceVersion(string url) + { + CellInstanceVersion result; + byte[] byteArray; + ConfigurationData configurationData; + string decodedCellInstanceConfigurationData; + string xml; + try + { + xml = XDocument.Load(url).ToString(); + } + catch (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(); + _ = stringBuilder. + AppendLine("using Adaptation.Shared.Methods;"). + AppendLine("using Microsoft.Extensions.Logging;"). + AppendLine("using Microsoft.VisualStudio.TestTools.UnitTesting;"). + AppendLine("using Adaptation._Tests.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;"); + _ = stringBuilder.AppendLine(). + Append("namespace Adaptation._Tests.").Append(loopName).Append('.').Append(_Environment).Append('.').Append(cellInstanceVersionNameAsCode).AppendLine(";"). + AppendLine(). + AppendLine("[TestClass]"); + if (i == 2) + _ = stringBuilder. + Append("public class ").AppendLine(cellInstanceNameWithoutHyphen). + AppendLine("{"). + AppendLine(). + AppendLine("#pragma warning disable CA2254"). + AppendLine("#pragma warning disable IDE0060"). + 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(). + AppendLine("#pragma warning disable CA2254"). + AppendLine("#pragma warning disable IDE0060"). + AppendLine(). + AppendLine("internal static string DummyRoot { get; private set; }"). + Append("internal static ").Append(cellInstanceNameWithoutHyphen).AppendLine(" EAFLoggingUnitTesting { get; private set; }"); + else + throw new Exception(); + if (i == 2) + _ = stringBuilder.AppendLine(); + else if (i == 1) + _ = stringBuilder. + AppendLine(). + Append("static ").Append(cellInstanceNameWithoutHyphen).AppendLine("() => DummyRoot = @\"\\\\messv02ecc1.ec.local\\EC_Characterization_Si\\Dummy\";"). + AppendLine(). + Append("public ").Append(cellInstanceNameWithoutHyphen).AppendLine("() : base(DummyRoot, 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(DummyRoot, 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 not null)"). + AppendLine("EAFLoggingUnitTesting.Logger.LogInformation(\"Cleanup\");"). + AppendLine("if (EAFLoggingUnitTesting is not 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; + if (i == 2) + { + _ = stringBuilder. + AppendLine("#if true"). + AppendLine("[Ignore]"). + AppendLine("#endif"). + AppendLine("[TestMethod]"). + Append("public void ").Append(methodName).Append("() => ").Append('_').Append(cellInstanceNameWithoutHyphen).Append('.').Append(methodName).AppendLine("();").AppendLine(); + } + else if (i == 1) + { + if (componentsCellComponentCellComponent.Equipment.EquipmentType.Version != cellInstanceVersionName) + throw new Exception("Versions should match!"); + equipmentTypeName = componentsCellComponentCellComponent.Equipment.EquipmentType.Name; + _ = stringBuilder. + AppendLine("#if true"). + AppendLine("[Ignore]"). + AppendLine("#endif"). + AppendLine("[TestMethod]"). + Append("public void ").Append(methodName).AppendLine("()"). + AppendLine("{"). + 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("_ = AdaptationTesting.GetWriteConfigurationGetFileRead(methodBase, check, EAFLoggingUnitTesting.AdaptationTesting);"). + AppendLine("EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, \" - Exit\"));"). + AppendLine("}"). + AppendLine(); + } + else + throw new Exception(); + } + _ = stringBuilder. + AppendLine("}"). + AppendLine(); + 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 (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 (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, int edaConnectionPortNumber) + { + Dictionary results = new() + { + { nameof(System.Environment), _Environment }, + { nameof(HostNameAndPort), _HostNameAndPort }, + { nameof(cellInstanceName), cellInstanceName }, + { nameof(equipmentTypeName), equipmentTypeName }, + { nameof(cellInstanceVersionName), cellInstanceVersionName }, + { nameof(edaConnectionPortNumber), edaConnectionPortNumber }, + { 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 testResultsDirectory = GetTestResultsDirectory(_HasWaitForProperty); + MethodBaseName mbn = GetMethodBaseName(_DummyRoot, _Environment, _HasWaitForProperty, testName, testResultsDirectory); + FileInfo fileInfo = new(mbn.FileFullName); + if (!string.IsNullOrEmpty(mbn.CellInstanceConnectionName) && !Directory.Exists(fileInfo.DirectoryName)) + _ = Directory.CreateDirectory(fileInfo.Directory.FullName); + Tuple cellInstanceVersionTuple = GetCellInstanceVersionTuple(mbn.CellInstanceName, mbn.CellInstanceVersionName); + results = GetCSharpTextB(fileInfo, mbn.CellInstanceName, mbn.CellInstanceVersionName, cellInstanceVersionTuple.Item2); + return results; + } + + public string[] GetConfiguration(MethodBase methodBase) + { + string[] results; + MethodBaseName mbn = GetMethodBaseName(methodBase); + FileInfo fileInfo = new(mbn.FileFullName); + if (!string.IsNullOrEmpty(mbn.CellInstanceConnectionName) && !Directory.Exists(fileInfo.DirectoryName)) + _ = Directory.CreateDirectory(fileInfo.Directory.FullName); + Tuple cellInstanceVersionTuple = GetCellInstanceVersionTuple(mbn.CellInstanceName, mbn.CellInstanceVersionName); + Tuple fileConnectorConfigurationTuple = GetFileConnectorConfigurationTuple(cellInstanceVersionTuple, mbn.CellInstanceConnectionName); + if (string.IsNullOrEmpty(mbn.Ticks) && fileConnectorConfigurationTuple.Item2?.FileScanningIntervalInSeconds is not null) + { + string fileScanningIntervalInSecondsLine; + string versionDirectory = Path.GetDirectoryName(fileInfo.DirectoryName); + if (fileConnectorConfigurationTuple.Item2.FileScanningIntervalInSeconds.Value < 0) + fileScanningIntervalInSecondsLine = $"-\t{fileConnectorConfigurationTuple.Item2.FileScanningIntervalInSeconds.Value:0000}\t{Path.GetFileName(fileInfo.DirectoryName)}"; + else + fileScanningIntervalInSecondsLine = $"+\t{fileConnectorConfigurationTuple.Item2.FileScanningIntervalInSeconds.Value:+0000}\t{Path.GetFileName(fileInfo.DirectoryName)}"; + File.AppendAllLines(Path.Combine(versionDirectory, "FileScanningIntervalInSeconds.txt"), new string[] { fileScanningIntervalInSecondsLine }); + } + Tuple equipmentTypeVersionTuple = GetEquipmentTypeVersionTuple(cellInstanceVersionTuple.Item2, mbn.CellInstanceConnectionName); + Tuple parameterizedModelObjectDefinitionTypeTuple = GetParameterizedModelObjectDefinitionTypeTuple(equipmentTypeVersionTuple); + Tuple> modelObjectParametersTuple = GetModelObjectParameters(equipmentTypeVersionTuple); + Tuple equipmentDictionaryVersionTuple = GetEquipmentDictionaryVersionTuple(cellInstanceVersionTuple.Item2, mbn.CellInstanceConnectionName, equipmentTypeVersionTuple.Item4); + Tuple>> equipmentDictionaryIsAlwaysEnabledEventsTuple = GetEquipmentDictionaryIsAlwaysEnabledEventsTuple(equipmentDictionaryVersionTuple); + Dictionary objects = GetKeyValuePairs(mbn.CellInstanceName, mbn.CellInstanceVersionName, mbn.CellInstanceConnectionName, fileConnectorConfigurationTuple.Item2, equipmentTypeVersionTuple.Item2, parameterizedModelObjectDefinitionTypeTuple.Item2, modelObjectParametersTuple.Item2, equipmentDictionaryVersionTuple.Item2, equipmentDictionaryIsAlwaysEnabledEventsTuple.Item2, cellInstanceVersionTuple.Item2.EdaConnection.PortNumber); + 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; + MethodBaseName mbn = GetMethodBaseName(methodBase); + FileInfo fileInfo = new(mbn.FileFullName); + Dictionary fileParameter = new(); + if (!string.IsNullOrEmpty(mbn.CellInstanceConnectionName) && !Directory.Exists(fileInfo.DirectoryName)) + _ = Directory.CreateDirectory(fileInfo.Directory.FullName); + Dictionary> dummyRuns = new(); + Dictionary> staticRuns = new(); + Tuple cellInstanceVersionTuple = GetCellInstanceVersionTuple(mbn.CellInstanceName, mbn.CellInstanceVersionName); + Tuple fileConnectorConfigurationTuple = GetFileConnectorConfigurationTuple(cellInstanceVersionTuple, mbn.CellInstanceConnectionName); + Tuple equipmentTypeVersionTuple = GetEquipmentTypeVersionTuple(cellInstanceVersionTuple.Item2, mbn.CellInstanceConnectionName); + Tuple parameterizedModelObjectDefinitionTypeTuple = GetParameterizedModelObjectDefinitionTypeTuple(equipmentTypeVersionTuple); + Tuple> modelObjectParametersTuple = GetModelObjectParameters(equipmentTypeVersionTuple); + Tuple equipmentDictionaryVersionTuple = GetEquipmentDictionaryVersionTuple(cellInstanceVersionTuple.Item2, mbn.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(); + } + if (_TestContext.FullyQualifiedTestClassName.Contains(nameof(Extract))) + { + if (!string.IsNullOrEmpty(fileConnectorConfigurationTuple.Item2.ErrorTargetFileLocation)) + { + if (!Directory.Exists(fileConnectorConfigurationTuple.Item2.ErrorTargetFileLocation)) + _ = Directory.CreateDirectory(fileConnectorConfigurationTuple.Item2.ErrorTargetFileLocation); + } + if (!string.IsNullOrEmpty(fileConnectorConfigurationTuple.Item2.SourceFileLocation)) + { + if (!Directory.Exists(fileConnectorConfigurationTuple.Item2.SourceFileLocation)) + _ = Directory.CreateDirectory(fileConnectorConfigurationTuple.Item2.SourceFileLocation); + } + if (!string.IsNullOrEmpty(fileConnectorConfigurationTuple.Item2.TargetFileLocation)) + { + if (!Directory.Exists(fileConnectorConfigurationTuple.Item2.TargetFileLocation)) + _ = Directory.CreateDirectory(fileConnectorConfigurationTuple.Item2.TargetFileLocation); + } + if (!string.IsNullOrEmpty(fileConnectorConfigurationTuple.Item2.AlternateTargetFolder)) + { + if (!Directory.Exists(fileConnectorConfigurationTuple.Item2.AlternateTargetFolder)) + _ = Directory.CreateDirectory(fileConnectorConfigurationTuple.Item2.AlternateTargetFolder); + } + } + result = FileHandlers.CellInstanceConnectionName.Get(this, fileParameter, mbn.CellInstanceName, mbn.CellInstanceConnectionName, fileConnectorConfigurationTuple.Item2, equipmentTypeVersionTuple.Item2, parameterizedModelObjectDefinitionTypeTuple.Item2, modelObjectParametersTuple.Item2, equipmentDictionaryVersionTuple.Item2, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: false); + return result; + } + + public string[] GetVariables(MethodBase methodBase, string check, bool validatePDSF = true) + { + string[] results; + string[] lines; + string ipdsfFile; + string[] segments; + string fileNameWithoutExtension; + string searchPattern = "*.ipdsf"; + string methodBaseNameWithActualCICN; + string sourceFileFilter = string.Empty; + string sourceFileLocation = string.Empty; + MethodBaseName mbn = GetMethodBaseName(methodBase); + string[] textFiles = GetTextFiles(mbn); + if (!textFiles.Any()) + { + if (_HasWaitForProperty) + throw new Exception("Set text file!"); + sourceFileLocation = mbn.DummyDirectory; + } + 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)) + { + methodBaseNameWithActualCICN = GetMethodBaseNameWithActualCICN(methodBase.Name, mbn.RawCellInstanceName, mbn.CellInstanceConnectionNameFromMethodBaseName, mbn.CellInstanceConnectionName, mbn.Ticks); + segments = lines[0].Split(new string[] { mbn.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].Contains(mbn.Ticks)) + throw new Exception("From source file location path should not contain ticks!"); + if (!segments[1].EndsWith(methodBaseNameWithActualCICN.Replace(mbn.Ticks, string.Empty))) + throw new Exception("Method name missing from source file location!"); + sourceFileLocation = lines[0]; + } + } + FileInfo fileInfo = new(mbn.FileFullName); + 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 (!validatePDSF) + ipdsfFile = string.Empty; + else + { + 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, mbn.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 (validatePDSF && string.IsNullOrEmpty(results[4])) + throw new Exception(); + if (string.IsNullOrEmpty(results[5])) + throw new Exception(); + return results; + } + + 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[] { System.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(System.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(System.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 (Exception) { } + string ticksDirectory = Path.GetDirectoryName(searchDirectory); + try + { Directory.SetLastWriteTime(ticksDirectory, dateTime); } + catch (Exception) { } + string[] directories = Directory.GetDirectories(searchDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string directory in directories) + { + try + { Directory.SetLastWriteTime(directory, dateTime); } + catch (Exception) { } + } + } + + internal static string GetFileName(MethodBase methodBase) + { + string result; + string connectionName; + string separator = "__"; + string connectionNameAndTicks; + string[] segments = methodBase.Name.Split(new string[] { separator }, 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, separator, rawVersionName, separator, equipmentTypeDirectory, separator); + 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); + } + } + + internal static IFileRead GetWriteConfigurationGetFileRead(MethodBase methodBase, string check, AdaptationTesting adaptationTesting) + { + IFileRead result; + string[] fileNameAndJson = adaptationTesting.GetConfiguration(methodBase); + Assert.IsTrue(fileNameAndJson[1].Contains(check)); + File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); + result = adaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); + Assert.IsFalse(string.IsNullOrEmpty(result.CellInstanceConnectionName)); + return result; + } + + internal static string ReExtractCompareUpdatePassDirectory(string[] variables, IFileRead fileRead, Logistics logistics, bool validatePDSF = true) + { + string result; + Tuple> extractResult = fileRead.ReExtract(); + if (!fileRead.IsDuplicator) + { + Assert.IsFalse(string.IsNullOrEmpty(extractResult?.Item1)); + Assert.IsNotNull(extractResult.Item3); + Assert.IsNotNull(extractResult.Item4); + if (!validatePDSF) + _ = GetLogisticsColumnsAndBody(fileRead, logistics, extractResult, new(string.Empty, Array.Empty(), Array.Empty())); + else + { + Assert.IsTrue(extractResult.Item3.Length > 0, "extractResult Array Length check!"); + Tuple pdsf = GetLogisticsColumnsAndBody(variables[2], variables[4]); + Tuple pdsfNew = GetLogisticsColumnsAndBody(fileRead, logistics, extractResult, pdsf); + CompareSave(variables[5], pdsf, pdsfNew); + Assert.IsTrue(pdsf.Item1 == pdsfNew.Item1, "Item1 check!"); + string[] json = GetItem2(pdsf, pdsfNew); + CompareSaveJSON(variables[5], json); + Assert.IsTrue(json[0] == json[1], "Item2 check!"); + string[] join = GetItem3(pdsf, pdsfNew); + CompareSaveTSV(variables[5], join); + Assert.IsTrue(join[0] == join[1], "Item3 (Join) check!"); + } + UpdatePassDirectory(variables[2]); + } + result = extractResult.Item1; + return result; + } + +} +// namespace Adaptation._Tests.Helpers { public class AdaptationTesting { } } +// 2022-08-05 -> 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..bc6f20e --- /dev/null +++ b/Adaptation/_Tests/Shared/EAFLoggingUnitTesting.cs @@ -0,0 +1,28 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; + +namespace Adaptation._Tests.Shared; + +public class EAFLoggingUnitTesting : LoggingUnitTesting, IDisposable +{ + + protected readonly AdaptationTesting _AdaptationTesting; + + public AdaptationTesting AdaptationTesting => _AdaptationTesting; + + public EAFLoggingUnitTesting(string dummyRoot, TestContext testContext, Type declaringType, bool skipEquipmentDictionary) : + base(testContext, declaringType) + { + if (testContext is null || declaringType is null) + _AdaptationTesting = null; + else + _AdaptationTesting = new AdaptationTesting(dummyRoot, testContext, skipEquipmentDictionary, _TestContextPropertiesAsJson, _HasWaitForProperty); + } + + 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..fee5113 --- /dev/null +++ b/Adaptation/_Tests/Shared/IsEnvironment.cs @@ -0,0 +1,168 @@ +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace Adaptation._Tests.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(Windows); + else if (isEnvironment.Linux) + result = nameof(Linux); + else if (isEnvironment.OSX) + result = nameof(OSX); + else + throw new Exception(); + return result; + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/Log/ConsoleLogger.cs b/Adaptation/_Tests/Shared/Log/ConsoleLogger.cs new file mode 100644 index 0000000..8ea4d19 --- /dev/null +++ b/Adaptation/_Tests/Shared/Log/ConsoleLogger.cs @@ -0,0 +1,36 @@ +using Microsoft.Extensions.Logging; +using System; + +namespace Adaptation._Tests.Shared.Log; + +public class ConsoleLogger : ILogger +{ + + public int EventId { get; set; } + + private readonly string _Name; + private readonly LogLevel _LogLevel; + + public ConsoleLogger(LogLevel logLevel, string name) + { + _Name = name; + EventId = 0; + _LogLevel = logLevel; + if (string.IsNullOrEmpty(_Name)) + { } + } + + public IDisposable BeginScope(TState state) => null; + + public bool IsEnabled(LogLevel logLevel) => logLevel >= _LogLevel; + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + if (IsEnabled(logLevel) && (EventId == 0 || EventId == eventId.Id)) + { + string message = formatter(state, null); + Console.WriteLine(message); + } + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/Log/ConsoleProvider.cs b/Adaptation/_Tests/Shared/Log/ConsoleProvider.cs new file mode 100644 index 0000000..94cad4d --- /dev/null +++ b/Adaptation/_Tests/Shared/Log/ConsoleProvider.cs @@ -0,0 +1,27 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Concurrent; + +namespace Adaptation._Tests.Shared.Log; + +public class ConsoleProvider : ILoggerProvider +{ + + private readonly LogLevel _LogLevel; + private readonly ConcurrentDictionary _Loggers; + + public ConsoleProvider(LogLevel logLevel) + { + _LogLevel = logLevel; + _Loggers = new ConcurrentDictionary(); + } + + public ILogger CreateLogger(string categoryName) => _Loggers.GetOrAdd(categoryName, name => new ConsoleLogger(_LogLevel, name)); + + public void Dispose() + { + _Loggers.Clear(); + GC.SuppressFinalize(this); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/Log/DebugLogger.cs b/Adaptation/_Tests/Shared/Log/DebugLogger.cs new file mode 100644 index 0000000..87e312d --- /dev/null +++ b/Adaptation/_Tests/Shared/Log/DebugLogger.cs @@ -0,0 +1,36 @@ +using Microsoft.Extensions.Logging; +using System; + +namespace Adaptation._Tests.Shared.Log; + +public class DebugLogger : ILogger +{ + + public int EventId { get; set; } + + private readonly string _Name; + private readonly LogLevel _LogLevel; + + public DebugLogger(LogLevel logLevel, string name) + { + _Name = name; + EventId = 0; + _LogLevel = logLevel; + if (string.IsNullOrEmpty(_Name)) + { } + } + + public IDisposable BeginScope(TState state) => null; + + public bool IsEnabled(LogLevel logLevel) => logLevel >= _LogLevel; + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + if (IsEnabled(logLevel) && (EventId == 0 || EventId == eventId.Id)) + { + string message = formatter(state, null); + System.Diagnostics.Debug.Print(message); + } + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/Log/DebugProvider.cs b/Adaptation/_Tests/Shared/Log/DebugProvider.cs new file mode 100644 index 0000000..0511f67 --- /dev/null +++ b/Adaptation/_Tests/Shared/Log/DebugProvider.cs @@ -0,0 +1,27 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Concurrent; + +namespace Adaptation._Tests.Shared.Log; + +public class DebugProvider : ILoggerProvider +{ + + private readonly LogLevel _LogLevel; + private readonly ConcurrentDictionary _Loggers; + + public DebugProvider(LogLevel logLevel) + { + _LogLevel = logLevel; + _Loggers = new ConcurrentDictionary(); + } + + public ILogger CreateLogger(string categoryName) => _Loggers.GetOrAdd(categoryName, name => new DebugLogger(_LogLevel, name)); + + public void Dispose() + { + _Loggers.Clear(); + GC.SuppressFinalize(this); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/Log/FeedbackLogger.cs b/Adaptation/_Tests/Shared/Log/FeedbackLogger.cs new file mode 100644 index 0000000..5a6cabf --- /dev/null +++ b/Adaptation/_Tests/Shared/Log/FeedbackLogger.cs @@ -0,0 +1,49 @@ +using Microsoft.Extensions.Logging; +using System; + +namespace Adaptation._Tests.Shared.Log; + +public class FeedbackLogger : ILogger +{ + + public int EventId { get; set; } + + private readonly string _Name; + private readonly LogLevel _LogLevel; + private readonly IFeedback _Feedback; + + public FeedbackLogger(LogLevel logLevel, IFeedback feedback, string name) + { + _Feedback = feedback; + _Name = name; + EventId = 0; + _LogLevel = logLevel; + if (string.IsNullOrEmpty(_Name)) + { } + } + + public IDisposable BeginScope(TState state) => null; + + public bool IsEnabled(LogLevel logLevel) => logLevel >= _LogLevel; + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + if (IsEnabled(logLevel) && (EventId == 0 || EventId == eventId.Id)) + { + string message = formatter(state, null); + int color = logLevel switch + { + LogLevel.Trace => -1, + LogLevel.Debug => -1, + LogLevel.Information => -16776961, + LogLevel.Warning => -65281, + LogLevel.Error => -65536, + LogLevel.Critical => -65536, + LogLevel.None => -1, + _ => throw new Exception(), + }; + _Feedback.Print(message, color); + } + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/Log/FeedbackProvider.cs b/Adaptation/_Tests/Shared/Log/FeedbackProvider.cs new file mode 100644 index 0000000..f207b9b --- /dev/null +++ b/Adaptation/_Tests/Shared/Log/FeedbackProvider.cs @@ -0,0 +1,29 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Concurrent; + +namespace Adaptation._Tests.Shared.Log; + +public class FeedbackProvider : ILoggerProvider +{ + + private readonly LogLevel _LogLevel; + private readonly IFeedback _Feedback; + private readonly ConcurrentDictionary _Loggers; + + public FeedbackProvider(LogLevel logLevel, IFeedback feedback) + { + _LogLevel = logLevel; + _Feedback = feedback; + _Loggers = new ConcurrentDictionary(); + } + + public ILogger CreateLogger(string categoryName) => _Loggers.GetOrAdd(categoryName, name => new FeedbackLogger(_LogLevel, _Feedback, name)); + + public void Dispose() + { + _Loggers.Clear(); + GC.SuppressFinalize(this); + } + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/Log/IFeedback.cs b/Adaptation/_Tests/Shared/Log/IFeedback.cs new file mode 100644 index 0000000..9cd7e79 --- /dev/null +++ b/Adaptation/_Tests/Shared/Log/IFeedback.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace Adaptation._Tests.Shared.Log; + +public interface IFeedback +{ + + List Messages { get; } + void Print(string message, int color); + +} \ No newline at end of file diff --git a/Adaptation/_Tests/Shared/Log/Log.cs b/Adaptation/_Tests/Shared/Log/Log.cs new file mode 100644 index 0000000..8a57ac6 --- /dev/null +++ b/Adaptation/_Tests/Shared/Log/Log.cs @@ -0,0 +1,139 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.IO; + +namespace Adaptation._Tests.Shared.Log; + +public class Log +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + private readonly ILogger _Logger; + + public Log(ILogger logger) => _Logger = logger; + + public void Black(object message) => _Logger.LogInformation(message.ToString()); + public void Blue(object message) => _Logger.LogInformation(message.ToString()); + public void Gray(object message) => _Logger.LogInformation(message.ToString()); + public void Green(object message) => _Logger.LogInformation(message.ToString()); + public void Magenta(string message, Exception exception) => _Logger.LogWarning(message, exception); + public void Red(string message, Exception exception) => _Logger.LogError(message, exception); + public void White(object message) => _Logger.LogInformation(message.ToString()); + public void Yellow(string message, Exception exception) => _Logger.LogWarning(message, exception); + + // + + public void DoLog(LogLevel logLevel, EventId eventId, Exception exception, string message, params object[] args) => _Logger.Log(logLevel, eventId, exception, message, args); + public void DoLog(LogLevel logLevel, EventId eventId, string message, params object[] args) => _Logger.Log(logLevel, eventId, message, args); + public void DoLog(LogLevel logLevel, Exception exception, string message, params object[] args) => _Logger.Log(logLevel, exception, message, args); + public void DoLog(LogLevel logLevel, string message, params object[] args) => _Logger.Log(logLevel, message, args); + public void LogCritical(EventId eventId, Exception exception, string message, params object[] args) => _Logger.LogCritical(eventId, exception, message, args); + public void LogCritical(EventId eventId, string message, params object[] args) => _Logger.LogCritical(eventId, message, args); + public void LogCritical(Exception exception, string message, params object[] args) => _Logger.LogCritical(exception, message, args); + public void LogCritical(string message, params object[] args) => _Logger.LogCritical(message, args); + public void LogDebug(EventId eventId, Exception exception, string message, params object[] args) => _Logger.LogDebug(eventId, exception, message, args); + public void LogDebug(EventId eventId, string message, params object[] args) => _Logger.LogDebug(eventId, message, args); + public void LogDebug(Exception exception, string message, params object[] args) => _Logger.LogDebug(exception, message, args); + public void LogDebug(string message, params object[] args) => _Logger.LogDebug(message, args); + public void LogError(EventId eventId, Exception exception, string message, params object[] args) => _Logger.LogError(eventId, exception, message, args); + public void LogError(EventId eventId, string message, params object[] args) => _Logger.LogError(eventId, message, args); + public void LogError(Exception exception, string message, params object[] args) => _Logger.LogError(message, args); + public void LogError(string message, params object[] args) => _Logger.LogError(message, args); + public void LogInformation(EventId eventId, Exception exception, string message, params object[] args) => _Logger.LogInformation(eventId, exception, message, args); + public void LogInformation(EventId eventId, string message, params object[] args) => _Logger.LogInformation(eventId, message, args); + public void LogInformation(Exception exception, string message, params object[] args) => _Logger.LogInformation(exception, message, args); + public void LogInformation(string message, params object[] args) => _Logger.LogInformation(message, args); + public void LogTrace(EventId eventId, Exception exception, string message, params object[] args) => _Logger.LogTrace(eventId, exception, message, args); + public void LogTrace(EventId eventId, string message, params object[] args) => _Logger.LogTrace(eventId, message, args); + public void LogTrace(Exception exception, string message, params object[] args) => _Logger.LogTrace(exception, message, args); + public void LogTrace(string message, params object[] args) => _Logger.LogTrace(message, args); + public void LogWarning(EventId eventId, Exception exception, string message, params object[] args) => _Logger.LogWarning(eventId, exception, message, args); + public void LogWarning(EventId eventId, string message, params object[] args) => _Logger.LogWarning(eventId, message, args); + public void LogWarning(Exception exception, string message, params object[] args) => _Logger.LogWarning(exception, message, args); + public void LogWarning(string message, params object[] args) => _Logger.LogWarning(message, args); + + // + + public void Debug() => _Logger.LogDebug(string.Empty); + public void Debug(object message) => _Logger.LogDebug(message.ToString()); + public void Debug(string message, Exception exception) => _Logger.LogDebug(exception, message); + public void DebugFormat(IFormatProvider provider, string format, params object[] args) => _Logger.LogDebug(string.Format(provider, format, args)); + public void DebugFormat(string format, object arg0, object arg1, object arg2) => _Logger.LogDebug(string.Format(format, arg0, arg1, arg2)); + public void DebugFormat(string format, object arg0, object arg1) => _Logger.LogDebug(string.Format(format, arg0, arg1)); + public void DebugFormat(string format, object arg0) => _Logger.LogDebug(string.Format(format, arg0)); + public void DebugFormat(string format, params object[] args) => _Logger.LogDebug(string.Format(format, args)); + public void Error(object message) => _Logger.LogError(message.ToString()); + public void Error(string message, Exception exception) => _Logger.LogError(exception, message.ToString()); + public void ErrorFormat(IFormatProvider provider, string format, params object[] args) => _Logger.LogError(string.Format(provider, format, args)); + public void ErrorFormat(string format, object arg0, object arg1, object arg2) => _Logger.LogError(string.Format(format, arg0, arg1, arg2)); + public void ErrorFormat(string format, object arg0, object arg1) => _Logger.LogError(string.Format(format, arg0, arg1)); + public void ErrorFormat(string format, object arg0) => _Logger.LogError(string.Format(format, arg0)); + public void ErrorFormat(string format, params object[] args) => _Logger.LogError(string.Format(format, args)); + public void Fatal(object message) => _Logger.LogCritical(message.ToString()); + public void Fatal(string message, Exception exception) => _Logger.LogCritical(exception, message.ToString()); + public void FatalFormat(IFormatProvider provider, string format, params object[] args) => _Logger.LogCritical(string.Format(provider, format, args)); + public void FatalFormat(string format, object arg0, object arg1, object arg2) => _Logger.LogCritical(string.Format(format, arg0, arg1, arg2)); + public void FatalFormat(string format, object arg0, object arg1) => _Logger.LogCritical(string.Format(format, arg0, arg1)); + public void FatalFormat(string format, object arg0) => _Logger.LogCritical(string.Format(format, arg0)); + public void FatalFormat(string format, params object[] args) => _Logger.LogCritical(string.Format(format, args)); + public void Info(object message) => _Logger.LogInformation(message.ToString()); + public void Info(string message, Exception exception) => _Logger.LogInformation(exception, message.ToString()); + public void InfoFormat(IFormatProvider provider, string format, params object[] args) => _Logger.LogInformation(string.Format(provider, format, args)); + public void InfoFormat(string format, object arg0, object arg1, object arg2) => _Logger.LogInformation(string.Format(format, arg0, arg1, arg2)); + public void InfoFormat(string format, object arg0, object arg1) => _Logger.LogInformation(string.Format(format, arg0, arg1)); + public void InfoFormat(string format, object arg0) => _Logger.LogInformation(string.Format(format, arg0)); + public void InfoFormat(string format, params object[] args) => _Logger.LogInformation(string.Format(format, args)); + public void Warn(object message) => _Logger.LogWarning(message.ToString()); + public void Warn(string message, Exception exception) => _Logger.LogWarning(exception, message.ToString()); + public void WarnFormat(IFormatProvider provider, string format, params object[] args) => _Logger.LogWarning(string.Format(provider, format, args)); + public void WarnFormat(string format, object arg0, object arg1, object arg2) => _Logger.LogWarning(string.Format(format, arg0, arg1, arg2)); + public void WarnFormat(string format, object arg0, object arg1) => _Logger.LogWarning(string.Format(format, arg0, arg1)); + public void WarnFormat(string format, object arg0) => _Logger.LogWarning(string.Format(format, arg0)); + public void WarnFormat(string format, params object[] args) => _Logger.LogWarning(string.Format(format, args)); + + public static string GetWorkingDirectory(string executingAssemblyName, string subDirectoryName) + { + 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(Path.Combine(Environment.GetFolderPath(specialFolder), subDirectoryName, executingAssemblyName)); + foreach (string directory in directories) + { + for (int i = 1; i < 3; i++) + { + if (i == 1) + result = directory; + else + result = string.Concat("D", directory[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; + } + if (string.IsNullOrEmpty(result)) + throw new Exception("Unable to set working directory!"); + 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..f5c6a40 --- /dev/null +++ b/Adaptation/_Tests/Shared/LoggingUnitTesting.cs @@ -0,0 +1,112 @@ +using Adaptation._Tests.Shared.Log; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.IO; + +namespace Adaptation._Tests.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/MethodBaseName.cs b/Adaptation/_Tests/Shared/MethodBaseName.cs new file mode 100644 index 0000000..b14c1f5 --- /dev/null +++ b/Adaptation/_Tests/Shared/MethodBaseName.cs @@ -0,0 +1,45 @@ +namespace Adaptation._Tests.Shared; + +public class MethodBaseName +{ + + public string After { get; private set; } + public string Before { get; private set; } + public string CellInstanceConnectionName { get; private set; } + public string CellInstanceConnectionNameFromMethodBaseName { get; private set; } + public string CellInstanceName { get; private set; } + public string CellInstanceVersionName { get; private set; } + public string Comment { get; private set; } + public string DummyDirectory { get; private set; } + public string FileFullName { get; private set; } + public string RawCellInstanceName { get; private set; } + public string RawVersionName { get; private set; } + public string Separator { get; private set; } + public string TestResultsDirectory { get; private set; } + public string TextFileDirectory { get; private set; } + public string Ticks { get; private set; } + public string VersionDirectory { get; private set; } + public string WithActualCICN { get; private set; } + + public MethodBaseName(string after, string before, string cellInstanceConnectionName, string cellInstanceConnectionNameFromMethodBaseName, string cellInstanceName, string cellInstanceVersionName, string comment, string dummyDirectory, string fileFullName, string rawCellInstanceName, string rawVersionName, string separator, string testResultsDirectory, string textFileDirectory, string ticks, string versionDirectory, string withActualCICN) + { + After = after; + Before = before; + CellInstanceConnectionName = cellInstanceConnectionName; + CellInstanceConnectionNameFromMethodBaseName = cellInstanceConnectionNameFromMethodBaseName; + CellInstanceName = cellInstanceName; + CellInstanceVersionName = cellInstanceVersionName; + Comment = comment; + DummyDirectory = dummyDirectory; + FileFullName = fileFullName; + RawCellInstanceName = rawCellInstanceName; + RawVersionName = rawVersionName; + Separator = separator; + TestResultsDirectory = testResultsDirectory; + TextFileDirectory = textFileDirectory; + Ticks = ticks; + VersionDirectory = versionDirectory; + WithActualCICN = withActualCICN; + } + +} \ 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..77ac5ab --- /dev/null +++ b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/CellInstance.cs @@ -0,0 +1,3058 @@ +using System; + +namespace Adaptation._Tests.Shared.PasteSpecialXml.EAF.XML.API.CellInstance; + +// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +[System.Xml.Serialization.XmlRoot(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 DateTime creationDateField; + + private object descriptionField; + + private ExtensionsVersionExtension[] extensionsField; + + private DateTime freezeDateField; + + private string frozenByField; + + private long idField; + + private bool isFrozenField; + + private bool isRetiredField; + + private 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.XmlElement(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public DateTime CreationDate + { + get => this.creationDateField; + set => this.creationDateField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlArray(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + [System.Xml.Serialization.XmlArrayItem("VersionExtension", IsNullable = false)] + public ExtensionsVersionExtension[] Extensions + { + get => this.extensionsField; + set => this.extensionsField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public DateTime FreezeDate + { + get => this.freezeDateField; + set => this.freezeDateField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public DateTime RetireDate + { + get => this.retireDateField; + set => this.retireDateField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlArrayItem("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.XmlArrayItem("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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Deployme" + + "nt")] +[System.Xml.Serialization.XmlRoot(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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +[System.Xml.Serialization.XmlRoot(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlAttribute("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.XmlAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +[System.Xml.Serialization.XmlRoot(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Version + { + get => this.versionField; + set => this.versionField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlArray(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] + [System.Xml.Serialization.XmlArrayItem("CellComponent", IsNullable = false)] + public ComponentsCellComponent[] Components + { + get => this.componentsField; + set => this.componentsField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlArrayItem("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.XmlArrayItem("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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlArrayItem("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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlIgnore()] + public bool DeviceIdSpecified + { + get => this.deviceIdFieldSpecified; + set => this.deviceIdFieldSpecified = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlElement(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.XmlElement(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.XmlIgnore()] + public bool PortSpecified + { + get => this.portFieldSpecified; + set => this.portFieldSpecified = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlAttribute("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.XmlAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public CellEquipmentDictionaryReference CellEquipmentDictionaryReference + { + get => this.cellEquipmentDictionaryReferenceField; + set => this.cellEquipmentDictionaryReferenceField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +[System.Xml.Serialization.XmlRoot(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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Version + { + get => this.versionField; + set => this.versionField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlAttribute(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.XmlAttribute("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.XmlAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Version + { + get => this.versionField; + set => this.versionField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public int CheckInterval + { + get => this.checkIntervalField; + set => this.checkIntervalField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public int ConnectionTimeout + { + get => this.connectionTimeoutField; + set => this.connectionTimeoutField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public long MaxLostPings + { + get => this.maxLostPingsField; + set => this.maxLostPingsField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public string PortName + { + get => this.portNameField; + set => this.portNameField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public int PortNumber + { + get => this.portNumberField; + set => this.portNumberField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public string SSLEnabled + { + get => this.sSLEnabledField; + set => this.sSLEnabledField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(IsNullable = true)] + public object TargetHost + { + get => this.targetHostField; + set => this.targetHostField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public long MaxParameterCollectionTimeDelta + { + get => this.maxParameterCollectionTimeDeltaField; + set => this.maxParameterCollectionTimeDeltaField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public object MergeStrategyParameters + { + get => this.mergeStrategyParametersField; + set => this.mergeStrategyParametersField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + public long TraceCleanupDaemonInterval + { + get => this.traceCleanupDaemonIntervalField; + set => this.traceCleanupDaemonIntervalField = value; + } + + /// + [System.Xml.Serialization.XmlArray(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] + [System.Xml.Serialization.XmlArrayItem("Connection", IsNullable = false)] + public TraceSourcePrimaryPrioritiesConnection[] TraceSourcePrimaryPriorities + { + get => this.traceSourcePrimaryPrioritiesField; + set => this.traceSourcePrimaryPrioritiesField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlAttribute("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.XmlAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +[System.Xml.Serialization.XmlRoot(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public long Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] + public string Version + { + get => this.versionField; + set => this.versionField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities", IsNullable = false)] +public partial class Extensions +{ + + private ExtensionsVersionExtension[] versionExtensionField; + + /// + [System.Xml.Serialization.XmlElement("VersionExtension")] + public ExtensionsVersionExtension[] VersionExtension + { + get => this.versionExtensionField; + set => this.versionExtensionField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities.CellInstances")] +[System.Xml.Serialization.XmlRoot(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.XmlElement("CellComponent")] + public ComponentsCellComponent[] CellComponent + { + get => this.cellComponentField; + set => this.cellComponentField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.EDA", IsNullable = false)] +public partial class TraceSourcePrimaryPriorities +{ + + private TraceSourcePrimaryPrioritiesConnection[] connectionField; + + /// + [System.Xml.Serialization.XmlElement("Connection")] + public TraceSourcePrimaryPrioritiesConnection[] Connection + { + get => this.connectionField; + set => this.connectionField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.CellInstances")] +[System.Xml.Serialization.XmlRoot(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.XmlElement("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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Ifx.ManagementInterfaceIfx.Common.Connect" + + "ionSettings")] +[System.Xml.Serialization.XmlRoot(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..6fe43f6 --- /dev/null +++ b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/ConfigurationData.cs @@ -0,0 +1,23 @@ +using System.Xml.Serialization; + +namespace Adaptation._Tests.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..040401c --- /dev/null +++ b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentDictionary.cs @@ -0,0 +1,1302 @@ +using System; + +namespace Adaptation._Tests.Shared.PasteSpecialXml.EAF.XML.API.EquipmentDictionary; + +// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +[System.Xml.Serialization.XmlRoot(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 DateTime creationDateField; + + private EquipmentDictionaryVersionDataItems dataItemsField; + + private string descriptionField; + + private string dictionaryNameField; + + private EquipmentDictionaryVersionEquipmentSettings equipmentSettingsField; + + private EquipmentDictionaryVersionEvents eventsField; + + private DateTime freezeDateField; + + private object frozenByField; + + private bool isFrozenField; + + private bool isRetiredField; + + private string nameField; + + private EquipmentDictionaryVersionObjectTypes objectTypesField; + + private EquipmentDictionaryVersionReports reportsField; + + private 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 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 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 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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Alarm")] + public EquipmentDictionaryVersionAlarmsAlarm[] Alarm + { + get => this.alarmField; + set => this.alarmField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlIgnore()] + 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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Item")] + public EquipmentDictionaryVersionDataItemsItem[] Item + { + get => this.itemField; + set => this.itemField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Setting")] + public EquipmentDictionaryVersionEquipmentSettingsSetting[] Setting + { + get => this.settingField; + set => this.settingField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Event")] + public EquipmentDictionaryVersionEventsEvent[] Event + { + get => this.eventField; + set => this.eventField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionEventsEventValidDataItems +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Type")] + public EquipmentDictionaryVersionObjectTypesType[] Type + { + get => this.typeField; + set => this.typeField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeAlarms +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Item")] + public EquipmentDictionaryVersionObjectTypesTypeDataItemsItem[] Item + { + get => this.itemField; + set => this.itemField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Item")] + public EquipmentDictionaryVersionObjectTypesTypeDataItemsItemEquipmentDataItemsItem[] Item + { + get => this.itemField; + set => this.itemField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeDataItemsItemEquipmentDataItemsItem +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Event")] + public EquipmentDictionaryVersionObjectTypesTypeEventsEvent[] Event + { + get => this.eventField; + set => this.eventField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeEventsEventEquipmentEventsEvent +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionObjectTypesTypeSettings +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Report")] + public EquipmentDictionaryVersionReportsReport[] Report + { + get => this.reportField; + set => this.reportField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Item")] + public EquipmentDictionaryVersionReportsReportDataItemsItem[] Item + { + get => this.itemField; + set => this.itemField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReportDataItemsItem +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement("Event")] + public EquipmentDictionaryVersionReportsReportLinkEventsEvent[] Event + { + get => this.eventField; + set => this.eventField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReportLinkEventsEvent +{ + + private string refField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Ref + { + get => this.refField; + set => this.refField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Equipmen" + + "tCharacterization")] +public partial class EquipmentDictionaryVersionReportsReportPreLinkedEvents +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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..ae223c9 --- /dev/null +++ b/Adaptation/_Tests/Shared/PasteSpecialXml/EAF XML API/EquipmentType.cs @@ -0,0 +1,964 @@ +using System; + +namespace Adaptation._Tests.Shared.PasteSpecialXml.EAF.XML.API.EquipmentType; + +// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.FactoryEntities")] +[System.Xml.Serialization.XmlRoot(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 DateTime creationDateField; + + private object descriptionField; + + private ExtensionsVersionExtension[] extensionsField; + + private DateTime freezeDateField; + + private string frozenByField; + + private byte idField; + + private bool isFrozenField; + + private bool isRetiredField; + + private 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.XmlElement(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public DateTime CreationDate + { + get => this.creationDateField; + set => this.creationDateField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlArray(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + [System.Xml.Serialization.XmlArrayItem("VersionExtension", IsNullable = false)] + public ExtensionsVersionExtension[] Extensions + { + get => this.extensionsField; + set => this.extensionsField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public DateTime FreezeDate + { + get => this.freezeDateField; + set => this.freezeDateField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] + public DateTime RetireDate + { + get => this.retireDateField; + set => this.retireDateField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlArrayItem("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.XmlArray(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + [System.Xml.Serialization.XmlArrayItem("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.XmlArray(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + [System.Xml.Serialization.XmlArrayItem("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.XmlElement(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.XmlElement(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.XmlElement(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.XmlArray(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] + [System.Xml.Serialization.XmlArrayItem("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.XmlAttribute("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.XmlAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.Deployme" + + "nt")] +[System.Xml.Serialization.XmlRoot(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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlElement(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.XmlElement(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.XmlAttribute("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.XmlAttribute()] + public string i___type + { + get => this.i___typeField; + set => this.i___typeField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] +[System.Xml.Serialization.XmlRoot(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.XmlArrayItem("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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] +[System.Xml.Serialization.XmlRoot(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.XmlArrayItem("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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public class FileConfiguration +{ + + private string idField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")] + public string Id + { + get => this.idField; + set => this.idField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public class FileHandlerObjectTypes +{ + + private ParameterizedModelObjectDefinition parameterizedModelObjectDefinitionField; + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public ParameterizedModelObjectDefinition ParameterizedModelObjectDefinition + { + get => this.parameterizedModelObjectDefinitionField; + set => this.parameterizedModelObjectDefinitionField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.FactoryE" + + "ntities", IsNullable = false)] +public partial class Extensions +{ + + private ExtensionsVersionExtension[] versionExtensionField; + + /// + [System.Xml.Serialization.XmlElement("VersionExtension")] + public ExtensionsVersionExtension[] VersionExtension + { + get => this.versionExtensionField; + set => this.versionExtensionField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public partial class EquipmentComponents +{ + + private ParameterizedModelObjectDefinition[] parameterizedModelObjectDefinitionField; + + /// + [System.Xml.Serialization.XmlElement("ParameterizedModelObjectDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public ParameterizedModelObjectDefinition[] ParameterizedModelObjectDefinition + { + get => this.parameterizedModelObjectDefinitionField; + set => this.parameterizedModelObjectDefinitionField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public partial class EventActionSequences +{ + + private EventActionSequenceDefinition[] eventActionSequenceDefinitionField; + + /// + [System.Xml.Serialization.XmlElement("EventActionSequenceDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public EventActionSequenceDefinition[] EventActionSequenceDefinition + { + get => this.eventActionSequenceDefinitionField; + set => this.eventActionSequenceDefinitionField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/EafRuntimeIfx.ManagementInterfaceIfx.File" + + "Connector.EquipmentTypes", IsNullable = false)] +public partial class TransientEquipmentObjectTypes +{ + + private ParameterizedModelObjectDefinition[] parameterizedModelObjectDefinitionField; + + /// + [System.Xml.Serialization.XmlElement("ParameterizedModelObjectDefinition", Namespace = "http://schemas.datacontract.org/2004/07/Eaf.Management.ConfigurationData.CellAuto" + + "mation")] + public ParameterizedModelObjectDefinition[] ParameterizedModelObjectDefinition + { + get => this.parameterizedModelObjectDefinitionField; + set => this.parameterizedModelObjectDefinitionField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(IsNullable = true)] + public object Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItem("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.XmlAttribute("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; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(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.XmlElement(IsNullable = true)] + public object Category + { + get => this.categoryField; + set => this.categoryField = value; + } + + /// + [System.Xml.Serialization.XmlElement(IsNullable = true)] + public object Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + [System.Xml.Serialization.XmlElement(IsNullable = true)] + public object DisplayName + { + get => this.displayNameField; + set => this.displayNameField = value; + } + + /// + [System.Xml.Serialization.XmlElement(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.XmlAttribute("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..28df790 --- /dev/null +++ b/Adaptation/_Tests/Shared/UnitTesting.cs @@ -0,0 +1,99 @@ +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 Adaptation._Tests.Shared; + +public class UnitTesting +{ + + protected readonly bool _HasWaitForProperty; + protected readonly IsEnvironment _IsEnvironment; + protected readonly string _TestContextPropertiesAsJson; + + public IsEnvironment IsEnvironment => _IsEnvironment; + public bool HasWaitForProperty => _HasWaitForProperty; + public string TestContextPropertiesAsJson => _TestContextPropertiesAsJson; + + public UnitTesting(TestContext testContext, Type declaringType) + { + if (testContext is null || declaringType is null) + _IsEnvironment = null; + else + { + string waitFor = "\"WaitFor\":"; + string projectDirectory = GetProjectDirectory(testContext); + _TestContextPropertiesAsJson = JsonSerializer.Serialize(testContext.Properties, new JsonSerializerOptions { WriteIndented = true }); + _HasWaitForProperty = _TestContextPropertiesAsJson.Contains(waitFor); + string vsCodeDirectory = Path.Combine(projectDirectory, ".vscode"); + if (!Directory.Exists(vsCodeDirectory)) + _ = Directory.CreateDirectory(vsCodeDirectory); + string launchText = GetLaunchText(); + File.WriteAllText(Path.Combine(vsCodeDirectory, "launch.json"), launchText); + if (_HasWaitForProperty) + { + for (int i = 0; i < int.MaxValue; i++) + { + if (!_TestContextPropertiesAsJson.Contains($"{waitFor} \"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/_Tests/Static/BACKLOG.cs b/Adaptation/_Tests/Static/BACKLOG.cs new file mode 100644 index 0000000..35fa84e --- /dev/null +++ b/Adaptation/_Tests/Static/BACKLOG.cs @@ -0,0 +1,73 @@ +using Adaptation._Tests.Shared; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Text; + +namespace Adaptation._Tests.Static; + +[TestClass] +public class BACKLOG : LoggingUnitTesting, IDisposable +{ + +#pragma warning disable CA2254 +#pragma warning disable IDE0060 + + internal static BACKLOG LoggingUnitTesting { get; private set; } + + public BACKLOG() : base(testContext: null, declaringType: null) + { + if (LoggingUnitTesting is null) + throw new Exception(); + } + + public BACKLOG(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType) + { + } + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) => LoggingUnitTesting ??= new BACKLOG(testContext); + + [ClassCleanup()] + public static void ClassCleanup() + { + LoggingUnitTesting.Logger?.LogInformation("Cleanup"); + LoggingUnitTesting?.Dispose(); + } + + [TestMethod] + public void TestDateTime() + { + DateTime dateTime = DateTime.Now; + Assert.IsTrue(dateTime.ToString("M/d/yyyy h:mm:ss tt") == dateTime.ToString()); + } + +#if true + [Ignore] +#endif + [TestMethod] + public void Staging() + { + MethodBase methodBase = new StackFrame().GetMethod(); + StringBuilder results = new(); + (string cellInstanceName, string cellInstanceVersionName)[] collection = new (string, string)[] + { + new("BACKLOG", "v2.43.0"), + new("BACKLOG-EQPT", "v2.43.0"), + }; + string staging = "http://mestsa07ec.ec.local:9003/CellInstanceServiceV2"; + Shared.PasteSpecialXml.EAF.XML.API.CellInstance.CellInstanceVersion cellInstanceVersion; + LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); + foreach ((string cellInstanceName, string cellInstanceVersionName) in collection) + { + cellInstanceVersion = AdaptationTesting.GetCellInstanceVersion($"{staging}/{cellInstanceName}/{cellInstanceVersionName}/configuration"); + _ = results.AppendLine($"{cellInstanceName}\t{cellInstanceVersionName}\t{cellInstanceVersion.EdaConnection.PortNumber}"); + } + File.WriteAllText($"D:/Tmp/{methodBase.Module.Name}-{methodBase.ReflectedType.Name}-{methodBase.Name}.tsv", results.ToString()); + LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); + } + +} \ No newline at end of file diff --git a/Adaptation/appsettings.Development.json b/Adaptation/appsettings.Development.json new file mode 100644 index 0000000..f7e0b36 --- /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": false, + "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": false, + "Letter": "n", + "Share": "\\\\10.95.154.22\\C", + "User": "10.95.154.22\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": false, + "Letter": "o", + "Share": "\\\\10.95.154.16\\Aixtron", + "User": "10.95.154.16\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": false, + "Letter": "p", + "Share": "\\\\10.95.154.15\\Aixtron", + "User": "10.95.154.15\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": false, + "Letter": "q", + "Share": "\\\\10.95.154.21\\Data", + "User": "10.95.154.21\\XRD04Admin", + "Password": "v1NOsEOCvbnhzKabspPcCQ==" + }, + { + "Use": false, + "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..d15d437 --- /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": false, + "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": false, + "Letter": "n", + "Share": "\\\\10.95.154.22\\C", + "User": "10.95.154.22\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": false, + "Letter": "o", + "Share": "\\\\10.95.154.16\\Aixtron", + "User": "10.95.154.16\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": false, + "Letter": "p", + "Share": "\\\\10.95.154.15\\Aixtron", + "User": "10.95.154.15\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": false, + "Letter": "q", + "Share": "\\\\10.95.154.21\\Data", + "User": "10.95.154.21\\XRD04Admin", + "Password": "v1NOsEOCvbnhzKabspPcCQ==" + }, + { + "Use": false, + "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 new file mode 100644 index 0000000..e49a3f9 --- /dev/null +++ b/Adaptation/package.json @@ -0,0 +1,22 @@ +{ + "scripts": { + "AA-CreateSelfDescription.Staging.v2_43_0-BACKLOG_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_43_0 & ClassName~BACKLOG_EQPT\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", + "BA-CreateSelfDescription.Staging.v2_43_0-BACKLOG": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_43_0 & ClassName~BACKLOG\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", + "CA-CreateSelfDescription.Staging.v2_43_0-MESAFIBACKLOG": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_43_0 & ClassName~MESAFIBACKLOG\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", + "DA-CreateSelfDescription.Staging.v2_43_0": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_43_0\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", + "EA-Extract.Staging.v2_43_0-BACKLOG_EQPT-Staging__v2_43_0__BACKLOG_EQPT__ConvertExcelToJson637961178824025822__Normal": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_0 & ClassName~BACKLOG_EQPT & Name~Staging__v2_43_0__BACKLOG_EQPT__ConvertExcelToJson637961178824025822__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", + "FA-Extract.Staging.v2_43_0-BACKLOG-Staging__v2_43_0__BACKLOG__json637961251829737445__Normal": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_0 & ClassName~BACKLOG & Name~Staging__v2_43_0__BACKLOG__json637961251829737445__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", + "GA-Extract.Staging.v2_43_0-MESAFIBACKLOG-Staging__v2_43_0__MESAFIBACKLOG__MoveMatchingFiles637953064190000000__Normal": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_0 & ClassName~MESAFIBACKLOG & Name~Staging__v2_43_0__MESAFIBACKLOG__MoveMatchingFiles637953064190000000__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", + "HA-Extract.Staging.v2_43_0-BACKLOG-Staging__v2_43_0__BACKLOG__pcl637812984345592512__MinFileLength": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_43_0 & ClassName~BACKLOG & Name~Staging__v2_43_0__BACKLOG__pcl637812984345592512__MinFileLength\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", + "Alpha": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "nuget-clear": "dotnet nuget locals all --clear", + "build": "dotnet build --runtime win-x64 --self-contained", + "build-Package-Management": "dotnet build --runtime win-x64 --self-contained --source https://packagemanagement.eu.infineon.com:4430/api/v2/", + "build-nuget-And-Package-Management": "dotnet build --runtime win-x64 --self-contained --source https://api.nuget.org/v3/index.json --source https://packagemanagement.eu.infineon.com:4430/api/v2/", + "build-All-Sources": "dotnet build --runtime win-x64 --self-contained --source https://api.nuget.org/v3/index.json --source https://packagemanagement.eu.infineon.com:4430/api/v2/ --source https://tfs.intra.infineon.com/tfs/ManufacturingIT/_packaging/eaf/nuget/v3/index.json --source http://192.168.0.73:5002/v3/index.json", + "dotnet-format": "dotnet format --report .vscode --verbosity detailed --severity warn", + "MSBuild": "\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe\" /target:Build /restore:True /p:RestoreSources=https://api.nuget.org/v3/index.json%3Bhttps://packagemanagement.eu.infineon.com:4430/api/v2/%3Bhttps://tfs.intra.infineon.com/tfs/ManufacturingIT/_packaging/eaf/nuget/v3/index.json /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=Debug;TargetFrameworkVersion=v4.8 ../MESAFIBACKLOG.csproj", + "pull": "git pull", + "garbage-collect": "git gc" + } +} \ No newline at end of file diff --git a/FileHandlers/FileRead.cs b/FileHandlers/FileRead.cs new file mode 100644 index 0000000..4a205c1 --- /dev/null +++ b/FileHandlers/FileRead.cs @@ -0,0 +1,355 @@ +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.Text.Json.Serialization; +using System.Threading; + +namespace MESAFIBACKLOG.FileHandlers; + +public partial class FileRead : FileReaderHandler, ISMTP +{ + + 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; + private static readonly Dictionary> _StaticRuns; + + static FileRead() + { + _DummyRuns = new(); + _StaticRuns = new(); + } + + public FileRead() + { + if (FileParameter is null) + FileParameter = new Dictionary(); + _FileRead = null; + _UseCyclicalForDescription = false; + _Log = LogManager.GetLogger(typeof(FileRead)); + _EquipmentParameters = new List(); + } + + public override void CreateSelfDescription() + { + MethodBase methodBase = new StackFrame().GetMethod(); + _Log.Debug(string.Concat(methodBase.Name, " - Entry")); + try + { + if (Equipment is null) + throw new Exception(); + CreateSelfDescription(methodBase); + _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 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) + { + 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; + } + } + foreach (JsonProperty jsonProperty in jsonProperties) + { + if (jsonProperty.Value.ValueKind == JsonValueKind.Object && !parameterTypeDefinitions.ContainsKey(JsonValueKind.Object)) + { + StructuredType structuredType = new(nameof(StructuredType), string.Empty, new List()); + parameterTypeDefinitions.Add(JsonValueKind.Object, structuredType); + Equipment.SelfDescriptionBuilder.AddParameterTypeDefinition(structuredType); + } + if (!parameterTypeDefinitions.ContainsKey(jsonProperty.Value.ValueKind)) + throw new Exception(string.Concat('{', jsonProperty.Value.ValueKind, "} is not mapped!")); + } + foreach (JsonProperty jsonProperty in jsonProperties) + { + 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, _StaticRuns, _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 + { + 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 + { + 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, _StaticRuns, _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/MESAFIBACKLOG.csproj b/MESAFIBACKLOG.csproj new file mode 100644 index 0000000..11b0fab --- /dev/null +++ b/MESAFIBACKLOG.csproj @@ -0,0 +1,189 @@ + + + + + Debug + AnyCPU + {54729740-EA41-4EDC-9730-3C2690A289D2} + 10.0 + Library + Properties + MESAFIBACKLOG + MESAFIBACKLOG + v4.8 + win-x86 + 512 + + + SAK + SAK + SAK + SAK + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + x86 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\None\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Component + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.47.0 + + + 6.0.3 + + + + + + + \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6a17abd --- /dev/null +++ b/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MESAFIBACKLOG")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MESAFIBACKLOG")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("54729740-ea41-4edc-9730-3c2690a289d2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// 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.47.0.0")] +[assembly: AssemblyFileVersion("2.47.0.0")] diff --git a/README.md b/README.md new file mode 100644 index 0000000..db33066 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Introduction +MESAFIBACKLOG EAF adaptation + +# Getting Started +1. Framework - MESAFIBACKLOG.csproj +2. dotnet core - Adaptation\MESAFIBACKLOG.Tests.csproj +3. https://tfs.intra.infineon.com/tfs/ManufacturingIT/_packaging/eaf/nuget/v3/index.json +4. https://packagemanagement.eu.infineon.com:4430/packages + +# Build and Test +See Adaptation\_Tests for dotnet core tests + +# TFS +$/MIT_EAF_Adaptations/Trunk/MESAFIBACKLOG/06_SourceCode + +# Last TFS Changeset +303348 Phares Mike (IFAM IT FI MES) 2/1/2022 6:02:05 PM MESAFIBACKLOG - Move solution for Azure DevOps git + +# Git +git@tfs.intra.infineon.com:22/tfs/ManufacturingIT/Mesa_FI/_git/MESAFIBACKLOG diff --git a/Shared/FilePathGenerator.cs b/Shared/FilePathGenerator.cs new file mode 100644 index 0000000..da97777 --- /dev/null +++ b/Shared/FilePathGenerator.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using Ifx.Eaf.EquipmentConnector.File.Component; +using Ifx.Eaf.EquipmentConnector.File.Configuration; + +namespace Shared; + +public class FilePathGenerator : Ifx.Eaf.EquipmentConnector.File.Component.FilePathGenerator +{ + + public FileConnectorConfiguration FileConnectorConfiguration { get; private set; } + + 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, string sourceFilePath, bool isErrorFile = false, Dictionary customPattern = null) : base(config, sourceFilePath, isErrorFile, customPattern) => FileConnectorConfiguration = config; + + public string GetSubFolderPath() => SubFolderPath; + +} diff --git a/Shared/FilePathGeneratorInfo.cs b/Shared/FilePathGeneratorInfo.cs new file mode 100644 index 0000000..8d5e287 --- /dev/null +++ b/Shared/FilePathGeneratorInfo.cs @@ -0,0 +1,63 @@ +using System.IO; + +namespace Shared; + +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) + { + ReportFullPath = reportFullPath; + IsErrorFile = isErrorFile; + if (originalFilePathGenerator is null || originalFilePathGenerator is not FilePathGenerator original) + { + 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; + } + +}