Ready to test v2.39.0
This commit is contained in:
		
							
								
								
									
										13
									
								
								Adaptation/.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Adaptation/.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| { | ||||
|     "cSpell.words": [ | ||||
|         "BIORAD", | ||||
|         "CICN", | ||||
|         "EQPT", | ||||
|         "Hmmssffff", | ||||
|         "ipdsf", | ||||
|         "ISMTP", | ||||
|         "messa", | ||||
|         "PDSF", | ||||
|         "THFTIRQS" | ||||
|     ] | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.Core | ||||
| namespace Adaptation.Eaf.Core; | ||||
|  | ||||
| public class BackboneComponent | ||||
| { | ||||
|     public class BackboneComponent | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.Core | ||||
| namespace Adaptation.Eaf.Core; | ||||
|  | ||||
| public class BackboneStatusCache | ||||
| { | ||||
|     public class BackboneStatusCache | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.Core | ||||
| namespace Adaptation.Eaf.Core; | ||||
|  | ||||
| public interface ILoggingSetupManager | ||||
| { | ||||
|     public interface ILoggingSetupManager | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.Core | ||||
| namespace Adaptation.Eaf.Core; | ||||
|  | ||||
| public class StatusItem | ||||
| { | ||||
|     public class StatusItem | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -2,47 +2,46 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Eaf.Core | ||||
| namespace Adaptation.Eaf.Core; | ||||
|  | ||||
| public class Backbone | ||||
| { | ||||
|     public class Backbone | ||||
|     { | ||||
|         public const string STATE_ERROR = "Error"; | ||||
|         public const string STATE_OFFLINE = "Offline"; | ||||
|         public const string STATE_RUNNING = "Running"; | ||||
|         public const string STATE_SHUTDOWN = "Shutting Down"; | ||||
|         public const string STATE_STARTING = "Starting"; | ||||
|     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() { } | ||||
|     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<string, BackboneComponent> BackboneComponents { get; } | ||||
|     [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<string, BackboneComponent> 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<StatusItem> GetAllStatuses() { throw new NotImplementedException(); } | ||||
|         public BackboneComponent GetBackboneComponentById(string id) { throw new NotImplementedException(); } | ||||
|         public List<T> GetBackboneComponentsOfType<T>() { throw new NotImplementedException(); } | ||||
|         public List<BackboneComponent> 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<BackboneComponent> components) { } | ||||
|         protected virtual void StopAllComponents() { } | ||||
|         protected void StopComponents(List<BackboneComponent> components) { } | ||||
|     } | ||||
|     public void AddBackboneComponent(BackboneComponent backboneComponent) { } | ||||
|     public bool ContainsBackboneComponent(string id) => throw new NotImplementedException(); | ||||
|     [Obsolete("Use the capabilities exposed via the Status property -> GetAll. Will be removed with next major release.")] | ||||
|     public List<StatusItem> GetAllStatuses() => throw new NotImplementedException(); | ||||
|     public BackboneComponent GetBackboneComponentById(string id) => throw new NotImplementedException(); | ||||
|     public List<T> GetBackboneComponentsOfType<T>() => throw new NotImplementedException(); | ||||
|     public List<BackboneComponent> 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<BackboneComponent> components) { } | ||||
|     protected virtual void StopAllComponents() { } | ||||
|     protected void StopComponents(List<BackboneComponent> components) { } | ||||
| } | ||||
| @ -1,24 +1,21 @@ | ||||
| using System; | ||||
|  | ||||
| namespace Adaptation.Eaf.Core.Smtp | ||||
| namespace Adaptation.Eaf.Core.Smtp; | ||||
|  | ||||
| public class EmailMessage | ||||
| { | ||||
|     public EmailMessage() { } | ||||
|     public EmailMessage(string subject, string body, MailPriority priority = MailPriority.Normal) { } | ||||
|  | ||||
|     public class EmailMessage | ||||
|     { | ||||
|         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 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(); } | ||||
|  | ||||
|     } | ||||
|     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(); | ||||
|  | ||||
| } | ||||
| @ -1,9 +1,6 @@ | ||||
| namespace Adaptation.Eaf.Core.Smtp | ||||
| namespace Adaptation.Eaf.Core.Smtp; | ||||
|  | ||||
| public interface ISmtp | ||||
| { | ||||
|  | ||||
|     public interface ISmtp | ||||
|     { | ||||
|         void Send(EmailMessage message); | ||||
|     } | ||||
|  | ||||
|     void Send(EmailMessage message); | ||||
| } | ||||
| @ -1,11 +1,8 @@ | ||||
| namespace Adaptation.Eaf.Core.Smtp | ||||
| namespace Adaptation.Eaf.Core.Smtp; | ||||
|  | ||||
| public enum MailPriority | ||||
| { | ||||
|  | ||||
|     public enum MailPriority | ||||
|     { | ||||
|         Low = 0, | ||||
|         Normal = 1, | ||||
|         High = 2 | ||||
|     } | ||||
|  | ||||
|     Low = 0, | ||||
|     Normal = 1, | ||||
|     High = 2 | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public class ChangeDataCollectionHandler | ||||
| { | ||||
|     public class ChangeDataCollectionHandler | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public class DataCollectionRequest | ||||
| { | ||||
|     public class DataCollectionRequest | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public class EquipmentEvent | ||||
| { | ||||
|     public class EquipmentEvent | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public class EquipmentException | ||||
| { | ||||
|     public class EquipmentException | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public class EquipmentSelfDescription | ||||
| { | ||||
|     public class EquipmentSelfDescription | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public class GetParameterValuesHandler | ||||
| { | ||||
|     public class GetParameterValuesHandler | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface IConnectionControl | ||||
| { | ||||
|     public interface IConnectionControl | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface IDataTracingHandler | ||||
| { | ||||
|     public interface IDataTracingHandler | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface IEquipmentCommandService | ||||
| { | ||||
|     public interface IEquipmentCommandService | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,16 +1,15 @@ | ||||
| using Adaptation.PeerGroup.GCL.Annotations; | ||||
|  | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface IEquipmentControl : IPackageSource | ||||
| { | ||||
|     public interface IEquipmentControl : IPackageSource | ||||
|     { | ||||
|         [NotNull] | ||||
|         IEquipmentSelfDescriptionBuilder SelfDescriptionBuilder { get; } | ||||
|         [NotNull] | ||||
|         IEquipmentDataCollection DataCollection { get; } | ||||
|         [NotNull] | ||||
|         IEquipmentCommandService Commands { get; } | ||||
|         [NotNull] | ||||
|         IConnectionControl Connection { get; } | ||||
|     } | ||||
|     [NotNull] | ||||
|     IEquipmentSelfDescriptionBuilder SelfDescriptionBuilder { get; } | ||||
|     [NotNull] | ||||
|     IEquipmentDataCollection DataCollection { get; } | ||||
|     [NotNull] | ||||
|     IEquipmentCommandService Commands { get; } | ||||
|     [NotNull] | ||||
|     IConnectionControl Connection { get; } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface IEquipmentSelfDescriptionBuilder | ||||
| { | ||||
|     public interface IEquipmentSelfDescriptionBuilder | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface IPackage | ||||
| { | ||||
|     public interface IPackage | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface ISelfDescriptionLookup | ||||
| { | ||||
|     public interface ISelfDescriptionLookup | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface IVirtualParameterValuesHandler | ||||
| { | ||||
|     public interface IVirtualParameterValuesHandler | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public class SetParameterValuesHandler | ||||
| { | ||||
|     public class SetParameterValuesHandler | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public class TraceRequest | ||||
| { | ||||
|     public class TraceRequest | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -3,37 +3,36 @@ using Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| { | ||||
|     public interface IEquipmentDataCollection | ||||
|     { | ||||
|         IVirtualParameterValuesHandler VirtualParameterValuesHandler { get; } | ||||
|         ISelfDescriptionLookup SelfDescriptionLookup { get; } | ||||
|         EquipmentSelfDescription SelfDescription { get; } | ||||
|         IEnumerable<DataCollectionRequest> ActiveRequests { get; } | ||||
|         IDataTracingHandler DataTracingHandler { get; } | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
|         ParameterValue CreateParameterValue(EquipmentParameter parameter, object value); | ||||
|         void NotifyDataTracingAvailable(bool isAvailable); | ||||
|         void RegisterChangeDataCollectionHandler(ChangeDataCollectionHandler handler); | ||||
|         void RegisterDataTracingHandler(IDataTracingHandler handler); | ||||
|         void RegisterGetParameterValuesHandler(GetParameterValuesHandler handler); | ||||
|         void RegisterSetParameterValuesHandler(SetParameterValuesHandler handler); | ||||
|         void TriggerDeactivate(DataCollectionRequest deactivateRequest); | ||||
|         void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable<ParameterValue> parameters); | ||||
|         void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable<ParameterValue> parameters, IPackage sourcePackage); | ||||
|         void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters); | ||||
|         void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, IPackage sourcePackage); | ||||
|         void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, string severityOverride, string descriptionOverride); | ||||
|         void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); | ||||
|         void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); | ||||
|         void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, string severityOverride, string descriptionOverride); | ||||
|         void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, IPackage sourcePackage); | ||||
|         void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters); | ||||
|         void TriggerPerformanceRestored(); | ||||
|         void TriggerPerformanceWarning(); | ||||
|         void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable<ParameterValue> parameters); | ||||
|         void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable<ParameterValue> parameters, IPackage sourcePackage); | ||||
|         void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable<ParameterValue> parameters, DateTime equipmentTimeStamp); | ||||
|     } | ||||
| public interface IEquipmentDataCollection | ||||
| { | ||||
|     IVirtualParameterValuesHandler VirtualParameterValuesHandler { get; } | ||||
|     ISelfDescriptionLookup SelfDescriptionLookup { get; } | ||||
|     EquipmentSelfDescription SelfDescription { get; } | ||||
|     IEnumerable<DataCollectionRequest> 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<ParameterValue> parameters); | ||||
|     void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable<ParameterValue> parameters, IPackage sourcePackage); | ||||
|     void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters); | ||||
|     void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, IPackage sourcePackage); | ||||
|     void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, string severityOverride, string descriptionOverride); | ||||
|     void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); | ||||
|     void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); | ||||
|     void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, string severityOverride, string descriptionOverride); | ||||
|     void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters, IPackage sourcePackage); | ||||
|     void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable<ParameterValue> parameters); | ||||
|     void TriggerPerformanceRestored(); | ||||
|     void TriggerPerformanceWarning(); | ||||
|     void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable<ParameterValue> parameters); | ||||
|     void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable<ParameterValue> parameters, IPackage sourcePackage); | ||||
|     void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable<ParameterValue> parameters, DateTime equipmentTimeStamp); | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control | ||||
| namespace Adaptation.Eaf.EquipmentCore.Control; | ||||
|  | ||||
| public interface IPackageSource | ||||
| { | ||||
|     public interface IPackageSource | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -2,19 +2,18 @@ | ||||
| using Adaptation.PeerGroup.GCL.Annotations; | ||||
| using System; | ||||
|  | ||||
| namespace Adaptation.Eaf.EquipmentCore.DataCollection.Reporting | ||||
| namespace Adaptation.Eaf.EquipmentCore.DataCollection.Reporting; | ||||
|  | ||||
| public class ParameterValue | ||||
| { | ||||
|     public class ParameterValue | ||||
|     { | ||||
|         public ParameterValue(EquipmentParameter definition, object value) { } | ||||
|         public ParameterValue(EquipmentParameter definition, object value, DateTime timestamp) { } | ||||
|     public 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 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() { return base.ToString(); } | ||||
|     } | ||||
|     public virtual ParameterValue Clone(EquipmentParameter newDefinition) => throw new NotImplementedException(); | ||||
|     public override string ToString() => base.ToString(); | ||||
| } | ||||
| @ -1,24 +1,22 @@ | ||||
| using Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; | ||||
|  | ||||
| namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription | ||||
| namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription; | ||||
|  | ||||
| public class EquipmentParameter | ||||
| { | ||||
|     public class EquipmentParameter | ||||
|     { | ||||
|         public EquipmentParameter(EquipmentParameter source, ParameterTypeDefinition typeDefinition) { } | ||||
|         public EquipmentParameter(string name, ParameterTypeDefinition typeDefinition, string description, bool isTransient = false, bool isReadOnly = true) { } | ||||
|         public EquipmentParameter(string id, string name, ParameterTypeDefinition typeDefinition, string description, bool isTransient = false, bool isReadOnly = true) { } | ||||
|     public 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() { return base.ToString(); } | ||||
|         public string ToStringWithDetails() { return base.ToString(); } | ||||
|     } | ||||
|     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(); | ||||
| } | ||||
| @ -1,12 +1,11 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes | ||||
| { | ||||
|     public class Field | ||||
|     { | ||||
|         public Field(string name, string description, bool canBeNull, ParameterTypeDefinition typeDefinition) { } | ||||
| namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; | ||||
|  | ||||
|         public string Name { get; } | ||||
|         public string Description { get; } | ||||
|         public ParameterTypeDefinition TypeDefinition { get; } | ||||
|         public bool CanBeNull { get; } | ||||
|     } | ||||
| public class Field | ||||
| { | ||||
|     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; } | ||||
| } | ||||
| @ -1,12 +1,11 @@ | ||||
| namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes | ||||
| namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; | ||||
|  | ||||
| public abstract class ParameterTypeDefinition | ||||
| { | ||||
|     public abstract class ParameterTypeDefinition | ||||
|     { | ||||
|         public ParameterTypeDefinition(string name, string description) { } | ||||
|     public ParameterTypeDefinition(string name, string description) { } | ||||
|  | ||||
|         public string Name { get; } | ||||
|         public string Description { get; } | ||||
|     public string Name { get; } | ||||
|     public string Description { get; } | ||||
|  | ||||
|         public override string ToString() { return base.ToString(); } | ||||
|     } | ||||
|     public override string ToString() => base.ToString(); | ||||
| } | ||||
| @ -1,12 +1,11 @@ | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes | ||||
| namespace Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes; | ||||
|  | ||||
| public class StructuredType : ParameterTypeDefinition | ||||
| { | ||||
|     public class StructuredType : ParameterTypeDefinition | ||||
|     { | ||||
|  | ||||
|         public StructuredType(string name, string description, IList<Field> fields) : base(name, description) { } | ||||
|     public StructuredType(string name, string description, IList<Field> fields) : base(name, description) { } | ||||
|  | ||||
|         public IList<Field> Fields { get; } | ||||
|     } | ||||
|     public IList<Field> Fields { get; } | ||||
| } | ||||
| @ -1,6 +1,5 @@ | ||||
| namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation | ||||
| namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; | ||||
|  | ||||
| public interface IConfigurationObject | ||||
| { | ||||
|     public interface IConfigurationObject | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -1,26 +1,25 @@ | ||||
| using System; | ||||
|  | ||||
| namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation | ||||
| namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; | ||||
|  | ||||
| [System.Runtime.Serialization.DataContractAttribute(IsReference = true)] | ||||
| public class ModelObjectParameterDefinition : IConfigurationObject | ||||
| { | ||||
|     [System.Runtime.Serialization.DataContractAttribute(IsReference = true)] | ||||
|     public class ModelObjectParameterDefinition : IConfigurationObject | ||||
|     { | ||||
|         public ModelObjectParameterDefinition() { } | ||||
|         public ModelObjectParameterDefinition(string name, ModelObjectParameterType valueType, object defaultValue) { } | ||||
|         public ModelObjectParameterDefinition(string name, Type enumType, object defaultValue) { } | ||||
|     public ModelObjectParameterDefinition() { } | ||||
|     public ModelObjectParameterDefinition(string name, ModelObjectParameterType valueType, object defaultValue) { } | ||||
|     public ModelObjectParameterDefinition(string name, Type enumType, object defaultValue) { } | ||||
|  | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual long Id { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual string Name { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual string Value { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual ModelObjectParameterType ValueType { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual string EnumType { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual long Id { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual string Name { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual string Value { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual ModelObjectParameterType ValueType { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual string EnumType { get; set; } | ||||
|  | ||||
|         public virtual ModelObjectParameterDefinition Clone() { return null; } | ||||
|         public virtual bool IsValidValue(string value) { return false; } | ||||
|     } | ||||
|     public virtual ModelObjectParameterDefinition Clone() => null; | ||||
|     public virtual bool IsValidValue(string value) => false; | ||||
| } | ||||
| @ -1,17 +1,16 @@ | ||||
| namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation | ||||
| namespace Adaptation.Eaf.Management.ConfigurationData.CellAutomation; | ||||
|  | ||||
| public enum ModelObjectParameterType | ||||
| { | ||||
|     public enum ModelObjectParameterType | ||||
|     { | ||||
|         String = 0, | ||||
|         Bool = 1, | ||||
|         Byte = 2, | ||||
|         SignedByte = 3, | ||||
|         Integer = 4, | ||||
|         UnsignedInteger = 5, | ||||
|         LongInteger = 6, | ||||
|         UnsignedLongInteger = 7, | ||||
|         Double = 8, | ||||
|         Float = 9, | ||||
|         Enum = 10 | ||||
|     } | ||||
|     String = 0, | ||||
|     Bool = 1, | ||||
|     Byte = 2, | ||||
|     SignedByte = 3, | ||||
|     Integer = 4, | ||||
|     UnsignedInteger = 5, | ||||
|     LongInteger = 6, | ||||
|     UnsignedLongInteger = 7, | ||||
|     Double = 8, | ||||
|     Float = 9, | ||||
|     Enum = 10 | ||||
| } | ||||
| @ -1,44 +1,43 @@ | ||||
| using Adaptation.PeerGroup.GCL.SecsDriver; | ||||
| using System; | ||||
|  | ||||
| namespace Adaptation.Eaf.Management.ConfigurationData.Semiconductor.CellInstances | ||||
| { | ||||
|     [System.Runtime.Serialization.DataContractAttribute] | ||||
|     public class SecsConnectionConfiguration | ||||
|     { | ||||
|         public SecsConnectionConfiguration() { } | ||||
| namespace Adaptation.Eaf.Management.ConfigurationData.Semiconductor.CellInstances; | ||||
|  | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan T6HsmsControlMessage { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan T5ConnectionSeperation { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan T4InterBlock { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan T3MessageReply { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan T2Protocol { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan T1InterCharacter { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual SerialBaudRate? BaudRate { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual SecsTransportType? PortType { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual long? Port { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan LinkTestTimer { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual string Host { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual long? DeviceId { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual HsmsSessionMode? SessionMode { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual HsmsConnectionMode? ConnectionMode { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan T7ConnectionIdle { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual TimeSpan T8NetworkIntercharacter { get; set; } | ||||
|     } | ||||
| [System.Runtime.Serialization.DataContractAttribute] | ||||
| public class SecsConnectionConfiguration | ||||
| { | ||||
|     public SecsConnectionConfiguration() { } | ||||
|  | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan T6HsmsControlMessage { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan T5ConnectionSeperation { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan T4InterBlock { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan T3MessageReply { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan T2Protocol { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan T1InterCharacter { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual SerialBaudRate? BaudRate { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual SecsTransportType? PortType { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual long? Port { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan LinkTestTimer { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual string Host { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual long? DeviceId { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual HsmsSessionMode? SessionMode { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual HsmsConnectionMode? ConnectionMode { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan T7ConnectionIdle { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual TimeSpan T8NetworkIntercharacter { get; set; } | ||||
| } | ||||
							
								
								
									
										141
									
								
								Adaptation/FileHandlers/Archive/FileRead.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								Adaptation/FileHandlers/Archive/FileRead.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,141 @@ | ||||
| using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; | ||||
| using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; | ||||
| using Adaptation.Shared; | ||||
| using Adaptation.Shared.Duplicator; | ||||
| using Adaptation.Shared.Methods; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.Archive; | ||||
|  | ||||
| public class FileRead : Shared.FileRead, IFileRead | ||||
| { | ||||
|  | ||||
|     public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : | ||||
|         base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) | ||||
|     { | ||||
|         _MinFileLength = 10; | ||||
|         _NullData = string.Empty; | ||||
|         _Logistics = new Logistics(this); | ||||
|         if (_FileParameter is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (_ModelObjectParameterDefinitions is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (!_IsDuplicator) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) => Move(extractResults, exception); | ||||
|  | ||||
|     void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); | ||||
|  | ||||
|     string IFileRead.GetEventDescription() | ||||
|     { | ||||
|         string result = _Description.GetEventDescription(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     List<string> IFileRead.GetHeaderNames() | ||||
|     { | ||||
|         List<string> results = _Description.GetHeaderNames(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     string[] IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, string> IFileRead.GetDisplayNamesJsonElement() | ||||
|     { | ||||
|         Dictionary<string, string> results = _Description.GetDisplayNamesJsonElement(this); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<IDescription> IFileRead.GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData) | ||||
|     { | ||||
|         List<IDescription> results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.GetExtractResult(string reportFullPath, string eventName) | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, Test[], JsonElement[], List<FileInfo>>(results.Item1, Array.Empty<Test>(), JsonSerializer.Deserialize<JsonElement[]>("[]"), results.Item4); | ||||
|         if (results.Item3.Length > 0 && _IsEAFHosted) | ||||
|             WritePDSF(this, results.Item3); | ||||
|         UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.ReExtract() | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|         List<string> headerNames = _Description.GetHeaderNames(); | ||||
|         Dictionary<string, string> keyValuePairs = _Description.GetDisplayNamesJsonElement(this); | ||||
|         results = ReExtract(this, headerNames, keyValuePairs); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     void IFileRead.CheckTests(Test[] tests, bool extra) | ||||
|     { | ||||
|         if (_Description is not Description) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Callback(object state) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); | ||||
|  | ||||
|     private void MoveArchive(DateTime dateTime) | ||||
|     { | ||||
|         if (dateTime == DateTime.MinValue) | ||||
|         { } | ||||
|         string logisticsSequence = _Logistics.Sequence.ToString(); | ||||
|         string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|         string weekDirectory = string.Concat(_Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); | ||||
|         string jobIdDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\", _Logistics.JobID); | ||||
|         if (!Directory.Exists(jobIdDirectory)) | ||||
|             _ = Directory.CreateDirectory(jobIdDirectory); | ||||
|         //string destinationArchiveDirectory = string.Concat(jobIdDirectory, @"\!Archive\", weekDirectory); | ||||
|         string destinationArchiveDirectory = string.Concat(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation), @"\Archive\", _Logistics.JobID, @"\", weekDirectory); | ||||
|         if (!Directory.Exists(destinationArchiveDirectory)) | ||||
|             _ = Directory.CreateDirectory(destinationArchiveDirectory); | ||||
|         string[] matchDirectories = new string[] { GetDirectoriesRecursively(jobIdDirectory, logisticsSequence).FirstOrDefault() }; | ||||
|         if ((matchDirectories is null) || matchDirectories.Length != 1) | ||||
|             throw new Exception("Didn't find directory by logistics sequence"); | ||||
|         string sourceDirectory = Path.GetDirectoryName(matchDirectories[0]); | ||||
|         destinationArchiveDirectory = string.Concat(destinationArchiveDirectory, @"\", Path.GetFileName(sourceDirectory)); | ||||
|         Directory.Move(sourceDirectory, destinationArchiveDirectory); | ||||
|     } | ||||
|  | ||||
|     private Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, DateTime dateTime) | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|         Tuple<string, string[], string[]> pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); | ||||
|         _Logistics = new Logistics(reportFullPath, pdsf.Item1); | ||||
|         SetFileParameterLotIDToLogisticsMID(); | ||||
|         JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); | ||||
|         List<Shared.Properties.IDescription> descriptions = GetDuplicatorDescriptions(jsonElements); | ||||
|         Tuple<Test[], Dictionary<Test, List<Shared.Properties.IDescription>>> tuple = GetTuple(this, descriptions, extra: false); | ||||
|         MoveArchive(dateTime); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(pdsf.Item1, tuple.Item1, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -4,31 +4,36 @@ using Adaptation.Shared.Methods; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.FileHandlers | ||||
| namespace Adaptation.FileHandlers; | ||||
|  | ||||
| public class CellInstanceConnectionName | ||||
| { | ||||
|  | ||||
|     public class CellInstanceConnectionName | ||||
|     internal static IFileRead Get(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) | ||||
|     { | ||||
|  | ||||
|         internal static IFileRead Get(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) | ||||
|         IFileRead result; | ||||
|         bool isDuplicator = cellInstanceConnectionName.StartsWith(cellInstanceName); | ||||
|         if (isDuplicator) | ||||
|         { | ||||
|             IFileRead result; | ||||
|             int levelIsArchive = 7; | ||||
|             int levelIsXToArchive = 6; | ||||
|             bool isDuplicator = cellInstanceConnectionName.StartsWith(cellInstanceName); | ||||
|             if (isDuplicator) | ||||
|                 result = new MET08THFTIRQS408M.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted, levelIsXToArchive, levelIsArchive); | ||||
|             else | ||||
|             string cellInstanceConnectionNameBase = cellInstanceConnectionName.Replace("-", string.Empty); | ||||
|             int hyphens = cellInstanceConnectionName.Length - cellInstanceConnectionNameBase.Length; | ||||
|             result = hyphens switch | ||||
|             { | ||||
|                 result = cellInstanceConnectionName switch | ||||
|                 { | ||||
|                     nameof(QS408M) => new QS408M.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted, levelIsXToArchive, levelIsArchive), | ||||
|                     _ => throw new Exception(), | ||||
|                 }; | ||||
|             } | ||||
|             return result; | ||||
|                 (int)MET08THFTIRQS408M.Hyphen.IsArchive => new Archive.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted), | ||||
|                 (int)MET08THFTIRQS408M.Hyphen.IsDummy => new Dummy.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted), | ||||
|                 (int)MET08THFTIRQS408M.Hyphen.IsXToArchive => new ToArchive.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted), | ||||
|                 _ => new MET08THFTIRQS408M.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         else | ||||
|         { | ||||
|             result = cellInstanceConnectionName switch | ||||
|             { | ||||
|                 nameof(QS408M) => new QS408M.FileRead(smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted), | ||||
|                 _ => throw new Exception(), | ||||
|             }; | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										308
									
								
								Adaptation/FileHandlers/Dummy/FileRead.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								Adaptation/FileHandlers/Dummy/FileRead.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,308 @@ | ||||
| using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; | ||||
| using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; | ||||
| using Adaptation.Shared; | ||||
| using Adaptation.Shared.Duplicator; | ||||
| using Adaptation.Shared.Methods; | ||||
| using Infineon.Monitoring.MonA; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Diagnostics; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.IO.Compression; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
| using System.Threading; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.Dummy; | ||||
|  | ||||
| public class FileRead : Shared.FileRead, IFileRead | ||||
| { | ||||
|  | ||||
|     private readonly Timer _Timer; | ||||
|     private int _LastDummyRunIndex; | ||||
|     private readonly string[] _CellNames; | ||||
|  | ||||
|     public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : | ||||
|         base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) | ||||
|     { | ||||
|         _MinFileLength = 10; | ||||
|         _NullData = string.Empty; | ||||
|         _Logistics = new Logistics(this); | ||||
|         if (_FileParameter is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (_ModelObjectParameterDefinitions is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (!_IsDuplicator) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         _LastDummyRunIndex = -1; | ||||
|         List<string> 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<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) => Move(extractResults, exception); | ||||
|  | ||||
|     void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); | ||||
|  | ||||
|     string IFileRead.GetEventDescription() | ||||
|     { | ||||
|         string result = _Description.GetEventDescription(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     List<string> IFileRead.GetHeaderNames() | ||||
|     { | ||||
|         List<string> results = _Description.GetHeaderNames(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     string[] IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, string> IFileRead.GetDisplayNamesJsonElement() | ||||
|     { | ||||
|         Dictionary<string, string> results = _Description.GetDisplayNamesJsonElement(this); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<IDescription> IFileRead.GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData) | ||||
|     { | ||||
|         List<IDescription> results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.GetExtractResult(string reportFullPath, string eventName) => throw new Exception(string.Concat("See ", nameof(CallbackFileExists))); | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.ReExtract() => throw new Exception(string.Concat("See ", nameof(CallbackFileExists))); | ||||
|  | ||||
|     void IFileRead.CheckTests(Test[] tests, bool extra) | ||||
|     { | ||||
|         if (_Description is not Description) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Callback(object state) => Callback(state); | ||||
|  | ||||
|     private void CallbackInProcessCleared(string sourceArchiveFile, string traceDummyFile, string targetFileLocation, string monARessource, string inProcessDirectory, long sequence, bool warning) | ||||
|     { | ||||
|         const string site = "sjc"; | ||||
|         string stateName = string.Concat("Dummy_", _EventName); | ||||
|         const string monInURL = "http://moninhttp.sjc.infineon.com/input/text"; | ||||
|         MonIn monIn = MonIn.GetInstance(monInURL); | ||||
|         try | ||||
|         { | ||||
|             if (warning) | ||||
|             { | ||||
|                 File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Warning.ToString() }); | ||||
|                 _ = monIn.SendStatus(site, monARessource, stateName, State.Warning); | ||||
|                 for (int i = 1; i < 12; i++) | ||||
|                     Thread.Sleep(500); | ||||
|             } | ||||
|             ZipFile.ExtractToDirectory(sourceArchiveFile, inProcessDirectory); | ||||
|             string[] files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.TopDirectoryOnly); | ||||
|             if (files.Length > 250) | ||||
|                 throw new Exception("Safety net!"); | ||||
|             foreach (string file in files) | ||||
|                 File.SetLastWriteTime(file, new DateTime(sequence)); | ||||
|             if (!_FileConnectorConfiguration.IncludeSubDirectories.Value) | ||||
|             { | ||||
|                 foreach (string file in files) | ||||
|                     File.Move(file, Path.Combine(targetFileLocation, Path.GetFileName(file))); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 string[] directories = Directory.GetDirectories(inProcessDirectory, "*", SearchOption.AllDirectories); | ||||
|                 foreach (string directory in directories) | ||||
|                     _ = Directory.CreateDirectory(string.Concat(targetFileLocation, directory.Substring(inProcessDirectory.Length))); | ||||
|                 foreach (string file in files) | ||||
|                     File.Move(file, string.Concat(targetFileLocation, file.Substring(inProcessDirectory.Length))); | ||||
|             } | ||||
|             File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Ok.ToString() }); | ||||
|             _ = monIn.SendStatus(site, monARessource, stateName, State.Ok); | ||||
|         } | ||||
|         catch (Exception exception) | ||||
|         { | ||||
|             string subject = string.Concat("Exception:", _CellInstanceConnectionName); | ||||
|             string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); | ||||
|             try | ||||
|             { _SMTP.SendHighPriorityEmailMessage(subject, body); } | ||||
|             catch (Exception) { } | ||||
|             File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Critical.ToString(), exception.Message, exception.StackTrace }); | ||||
|             _ = monIn.SendStatus(site, monARessource, stateName, State.Critical); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void CallbackFileExists(string sourceArchiveFile, string traceDummyFile, string targetFileLocation, string monARessource, long sequence) | ||||
|     { | ||||
|         string[] files; | ||||
|         bool warning = false; | ||||
|         if (!_DummyRuns.ContainsKey(monARessource)) | ||||
|             _DummyRuns.Add(monARessource, new List<long>()); | ||||
|         if (!_DummyRuns[monARessource].Contains(sequence)) | ||||
|             _DummyRuns[monARessource].Add(sequence); | ||||
|         File.AppendAllLines(traceDummyFile, new string[] { sourceArchiveFile }); | ||||
|         string inProcessDirectory = Path.Combine(_ProgressPath, "Dummy In-Process", sequence.ToString()); | ||||
|         if (!Directory.Exists(inProcessDirectory)) | ||||
|             _ = Directory.CreateDirectory(inProcessDirectory); | ||||
|         files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.AllDirectories); | ||||
|         if (files.Any()) | ||||
|         { | ||||
|             if (files.Length > 250) | ||||
|                 throw new Exception("Safety net!"); | ||||
|             try | ||||
|             { | ||||
|                 foreach (string file in files) | ||||
|                     File.Delete(file); | ||||
|             } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
|         if (_FileConnectorConfiguration.IncludeSubDirectories.Value) | ||||
|             files = Directory.GetFiles(targetFileLocation, "*", SearchOption.AllDirectories); | ||||
|         else | ||||
|             files = Directory.GetFiles(targetFileLocation, "*", SearchOption.TopDirectoryOnly); | ||||
|         foreach (string file in files) | ||||
|         { | ||||
|             if (new FileInfo(file).LastWriteTime.Ticks == sequence) | ||||
|             { | ||||
|                 warning = true; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         CallbackInProcessCleared(sourceArchiveFile, traceDummyFile, targetFileLocation, monARessource, inProcessDirectory, sequence, warning); | ||||
|     } | ||||
|  | ||||
|     private string GetCellName(string pathSegment) | ||||
|     { | ||||
|         string result = string.Empty; | ||||
|         foreach (string cellName in _CellNames) | ||||
|         { | ||||
|             if (pathSegment.ToLower().Contains(cellName.ToLower())) | ||||
|             { | ||||
|                 result = cellName; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         if (string.IsNullOrEmpty(result)) | ||||
|         { | ||||
|             int count; | ||||
|             List<(string CellName, int Count)> cellNames = new(); | ||||
|             foreach (string cellName in _CellNames) | ||||
|             { | ||||
|                 count = 0; | ||||
|                 foreach (char @char in cellName.ToLower()) | ||||
|                     count += pathSegment.Length - pathSegment.ToLower().Replace(@char.ToString(), string.Empty).Length; | ||||
|                 cellNames.Add(new(cellName, count)); | ||||
|             } | ||||
|             result = (from l in cellNames orderby l.CellName.Length, l.Count descending select l.CellName).First(); | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private void Callback(object state) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             string pathSegment; | ||||
|             string monARessource; | ||||
|             DateTime dateTime = DateTime.Now; | ||||
|             if (!_FileConnectorConfiguration.TargetFileLocation.Contains(_FileConnectorConfiguration.SourceFileLocation)) | ||||
|                 throw new Exception("Target must start with source"); | ||||
|             bool check = (dateTime.Hour > 7 && dateTime.Hour < 18 && dateTime.DayOfWeek != DayOfWeek.Sunday && dateTime.DayOfWeek != DayOfWeek.Saturday); | ||||
|             if (!_IsEAFHosted || check) | ||||
|             { | ||||
|                 string checkSegment; | ||||
|                 string checkDirectory; | ||||
|                 string sourceFileFilter; | ||||
|                 string sourceArchiveFile; | ||||
|                 string sourceFileLocation; | ||||
|                 string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|                 string traceDummyDirectory = Path.Combine(Path.GetPathRoot(_TracePath), "TracesDummy", _CellInstanceName, "Source", $"{dateTime:yyyy}___Week_{weekOfYear}"); | ||||
|                 if (!Directory.Exists(traceDummyDirectory)) | ||||
|                     _ = Directory.CreateDirectory(traceDummyDirectory); | ||||
|                 string traceDummyFile = Path.Combine(traceDummyDirectory, $"{dateTime.Ticks} - {_CellInstanceName}.txt"); | ||||
|                 File.AppendAllText(traceDummyFile, string.Empty); | ||||
|                 if (_FileConnectorConfiguration.SourceFileLocation.EndsWith("\\")) | ||||
|                     sourceFileLocation = _FileConnectorConfiguration.SourceFileLocation; | ||||
|                 else | ||||
|                     sourceFileLocation = string.Concat(_FileConnectorConfiguration.SourceFileLocation, '\\'); | ||||
|                 for (int i = 0; i < _FileConnectorConfiguration.SourceFileFilters.Count; i++) | ||||
|                 { | ||||
|                     _LastDummyRunIndex += 1; | ||||
|                     if (_LastDummyRunIndex >= _FileConnectorConfiguration.SourceFileFilters.Count) | ||||
|                         _LastDummyRunIndex = 0; | ||||
|                     sourceFileFilter = _FileConnectorConfiguration.SourceFileFilters[_LastDummyRunIndex]; | ||||
|                     sourceArchiveFile = Path.GetFullPath(string.Concat(sourceFileLocation, sourceFileFilter)); | ||||
|                     if (File.Exists(sourceArchiveFile)) | ||||
|                     { | ||||
|                         checkSegment = _FileConnectorConfiguration.TargetFileLocation.Substring(sourceFileLocation.Length); | ||||
|                         checkDirectory = Path.GetDirectoryName(sourceArchiveFile); | ||||
|                         for (int z = 0; z < int.MaxValue; z++) | ||||
|                         { | ||||
|                             if (checkDirectory.Length < sourceFileLocation.Length || !checkDirectory.StartsWith(sourceFileLocation)) | ||||
|                                 break; | ||||
|                             checkDirectory = Path.GetDirectoryName(checkDirectory); | ||||
|                             if (Directory.Exists(Path.Combine(checkDirectory, checkSegment))) | ||||
|                             { | ||||
|                                 checkDirectory = Path.Combine(checkDirectory, checkSegment); | ||||
|                                 break; | ||||
|                             } | ||||
|                         } | ||||
|                         if (!checkDirectory.EndsWith(checkSegment)) | ||||
|                             throw new Exception("Could not determine dummy target directory for extract!"); | ||||
|                         if (!long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) | ||||
|                             throw new Exception("Invalid file name for source archive file!"); | ||||
|                         pathSegment = checkDirectory.Substring(sourceFileLocation.Length); | ||||
|                         monARessource = GetCellName(pathSegment); | ||||
|                         if (string.IsNullOrEmpty(monARessource)) | ||||
|                             throw new Exception("Could not determine which cell archive file is associated with!"); | ||||
|                         if (_IsEAFHosted) | ||||
|                             CallbackFileExists(sourceArchiveFile, traceDummyFile, checkDirectory, monARessource, sequence); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         catch (Exception exception) | ||||
|         { | ||||
|             string subject = string.Concat("Exception:", _CellInstanceConnectionName); | ||||
|             string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); | ||||
|             try | ||||
|             { _SMTP.SendHighPriorityEmailMessage(subject, body); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
|         try | ||||
|         { | ||||
|             TimeSpan timeSpan = new(DateTime.Now.AddSeconds(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value).Ticks - DateTime.Now.Ticks); | ||||
|             _ = _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); | ||||
|         } | ||||
|         catch (Exception exception) | ||||
|         { | ||||
|             string subject = string.Concat("Exception:", _CellInstanceConnectionName); | ||||
|             string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); | ||||
|             try | ||||
|             { _SMTP.SendHighPriorityEmailMessage(subject, body); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -16,526 +16,373 @@ using System.Text.Json; | ||||
| using System.Text.Json.Serialization; | ||||
| using System.Threading; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.MET08THFTIRQS408M | ||||
| namespace Adaptation.FileHandlers.MET08THFTIRQS408M; | ||||
|  | ||||
| public class FileRead : Shared.FileRead, IFileRead | ||||
| { | ||||
|  | ||||
|     public class FileRead : Shared.FileRead, IFileRead | ||||
|     private readonly Timer _Timer; | ||||
|     private int _LastDummyRunIndex; | ||||
|     private readonly string _IqsFile; | ||||
|     private readonly int _HyphenIsDummy; | ||||
|     private readonly int _HyphenIsNaEDA; | ||||
|     private readonly string _MemoryPath; | ||||
|     private readonly int _HyphenIsXToAPC; | ||||
|     private readonly int _HyphenIsXToIQSSi; | ||||
|     private readonly int _HyphenIsXToSPaCe; | ||||
|     private readonly int _HyphenIsXToOpenInsight; | ||||
|     private readonly string _EventNameFileReadDaily; | ||||
|     private readonly string _OpenInsightFilePattern; | ||||
|     private readonly string _OpenInsightMetrologyViewerAPI; | ||||
|     private readonly Dictionary<string, string> _CellNames; | ||||
|     private readonly int _HyphenIsXToOpenInsightMetrologyViewer; | ||||
|     private readonly int _HyphenIsXToOpenInsightMetrologyViewerAttachments; | ||||
|  | ||||
|     public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : | ||||
|         base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) | ||||
|     { | ||||
|  | ||||
|         private readonly Timer _Timer; | ||||
|         private int _LastDummyRunIndex; | ||||
|         private readonly string _IqsFile; | ||||
|         private readonly int _HyphenIsDummy; | ||||
|         private readonly int _HyphenIsNaEDA; | ||||
|         private readonly string _MemoryPath; | ||||
|         private readonly int _HyphenIsXToAPC; | ||||
|         private readonly int _HyphenIsXToIQSSi; | ||||
|         private readonly int _HyphenIsXToSPaCe; | ||||
|         private readonly int _HyphenIsXToOpenInsight; | ||||
|         private readonly string _EventNameFileReadDaily; | ||||
|         private readonly string _OpenInsightFilePattern; | ||||
|         private readonly string _OpenInsightMetrologyViewerAPI; | ||||
|         private readonly Dictionary<string, string> _CellNames; | ||||
|         private readonly int _HyphenIsXToOpenInsightMetrologyViewer; | ||||
|         private readonly int _HyphenIsXToOpenInsightMetrologyViewerAttachments; | ||||
|  | ||||
|         public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted, int hyphenXToArchive, int hyphenIsArchive) : | ||||
|             base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted, hyphenXToArchive, hyphenIsArchive) | ||||
|         _MinFileLength = 10; | ||||
|         _NullData = string.Empty; | ||||
|         _Logistics = new Logistics(this); | ||||
|         if (_FileParameter is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (_ModelObjectParameterDefinitions is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (!_IsDuplicator) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         _LastDummyRunIndex = -1; | ||||
|         if (_HyphenIsNaEDA == 0) | ||||
|         { } | ||||
|         if (_HyphenIsXToSPaCe == 0) | ||||
|         { } | ||||
|         if (_HyphenIsXToIQSSi == 0) | ||||
|         { } | ||||
|         _CellNames = new Dictionary<string, string>(); | ||||
|         _HyphenIsNaEDA = (int)Hyphen.IsNaEDA; | ||||
|         _HyphenIsDummy = (int)Hyphen.IsDummy; | ||||
|         _HyphenIsXToAPC = (int)Hyphen.IsXToAPC; | ||||
|         _HyphenIsXToIQSSi = (int)Hyphen.IsXToIQSSi; | ||||
|         _HyphenIsXToSPaCe = (int)Hyphen.IsXToSPaCe; | ||||
|         _HyphenIsXToOpenInsight = (int)Hyphen.IsXToOpenInsight; | ||||
|         _EventNameFileReadDaily = string.Concat(_EventNameFileRead, "Daily"); | ||||
|         _IqsFile = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "IQS.File"); | ||||
|         _MemoryPath = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "Path.Memory"); | ||||
|         _HyphenIsXToOpenInsightMetrologyViewer = (int)Hyphen.IsXToOpenInsightMetrologyViewer; | ||||
|         _HyphenIsXToOpenInsightMetrologyViewerAttachments = (int)Hyphen.IsXToOpenInsightMetrologyViewerAttachments; | ||||
|         _OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern"); | ||||
|         _OpenInsightMetrologyViewerAPI = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.MetrologyViewerAPI"); | ||||
|         ModelObjectParameterDefinition[] cellInstanceCollection = GetProperties(cellInstanceConnectionName, modelObjectParameters, "CellInstance.", ".Path"); | ||||
|         foreach (ModelObjectParameterDefinition modelObjectParameterDefinition in cellInstanceCollection) | ||||
|             _CellNames.Add(modelObjectParameterDefinition.Name.Split('.')[1], modelObjectParameterDefinition.Value); | ||||
|         if (_Hyphens == _HyphenIsDummy) | ||||
|         { | ||||
|             _MinFileLength = 10; | ||||
|             _NullData = string.Empty; | ||||
|             _Logistics = new Logistics(this); | ||||
|             if (_FileParameter is null) | ||||
|                 throw new Exception(cellInstanceConnectionName); | ||||
|             if (_ModelObjectParameterDefinitions is null) | ||||
|                 throw new Exception(cellInstanceConnectionName); | ||||
|             if (!_IsDuplicator) | ||||
|                 throw new Exception(cellInstanceConnectionName); | ||||
|             if (hyphenIsArchive != (int)Hyphen.IsArchive) | ||||
|                 throw new Exception(cellInstanceConnectionName); | ||||
|             if (hyphenXToArchive != (int)Hyphen.IsXToArchive) | ||||
|                 throw new Exception(cellInstanceConnectionName); | ||||
|             _LastDummyRunIndex = -1; | ||||
|             if (_HyphenIsNaEDA == 0) | ||||
|             { } | ||||
|             if (_HyphenIsXToSPaCe == 0) | ||||
|             { } | ||||
|             if (_HyphenIsXToIQSSi == 0) | ||||
|             { } | ||||
|             _CellNames = new Dictionary<string, string>(); | ||||
|             _HyphenIsNaEDA = (int)Hyphen.IsNaEDA; | ||||
|             _HyphenIsDummy = (int)Hyphen.IsDummy; | ||||
|             _HyphenIsXToAPC = (int)Hyphen.IsXToAPC; | ||||
|             _HyphenIsXToIQSSi = (int)Hyphen.IsXToIQSSi; | ||||
|             _HyphenIsXToSPaCe = (int)Hyphen.IsXToSPaCe; | ||||
|             _HyphenIsXToOpenInsight = (int)Hyphen.IsXToOpenInsight; | ||||
|             _EventNameFileReadDaily = string.Concat(_EventNameFileRead, "Daily"); | ||||
|             _IqsFile = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "IQS.File"); | ||||
|             _MemoryPath = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "Path.Memory"); | ||||
|             _HyphenIsXToOpenInsightMetrologyViewer = (int)Hyphen.IsXToOpenInsightMetrologyViewer; | ||||
|             _HyphenIsXToOpenInsightMetrologyViewerAttachments = (int)Hyphen.IsXToOpenInsightMetrologyViewerAttachments; | ||||
|             _OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern"); | ||||
|             _OpenInsightMetrologyViewerAPI = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.MetrologyViewerAPI"); | ||||
|             ModelObjectParameterDefinition[] cellInstanceCollection = GetProperties(cellInstanceConnectionName, modelObjectParameters, "CellInstance.", ".Path"); | ||||
|             foreach (ModelObjectParameterDefinition modelObjectParameterDefinition in cellInstanceCollection) | ||||
|                 _CellNames.Add(modelObjectParameterDefinition.Name.Split('.')[1], modelObjectParameterDefinition.Value); | ||||
|             if (_Hyphens == _HyphenIsDummy) | ||||
|             if (Debugger.IsAttached || fileConnectorConfiguration.PreProcessingMode == FileConnectorConfiguration.PreProcessingModeEnum.Process) | ||||
|             { | ||||
|                 if (Debugger.IsAttached || fileConnectorConfiguration.PreProcessingMode == FileConnectorConfiguration.PreProcessingModeEnum.Process) | ||||
|                 { | ||||
|                     _Timer = new Timer(Callback, null, Timeout.Infinite, Timeout.Infinite); | ||||
|                     Callback(null); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     int milliSeconds; | ||||
|                     milliSeconds = (int)((fileConnectorConfiguration.FileScanningIntervalInSeconds * 1000) / 2); | ||||
|                     _Timer = new Timer(Callback, null, milliSeconds, Timeout.Infinite); | ||||
|                     milliSeconds += 2000; | ||||
|                 } | ||||
|                 _Timer = new Timer(Callback, null, Timeout.Infinite, Timeout.Infinite); | ||||
|                 Callback(null); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 int milliSeconds; | ||||
|                 milliSeconds = (int)((fileConnectorConfiguration.FileScanningIntervalInSeconds * 1000) / 2); | ||||
|                 _Timer = new Timer(Callback, null, milliSeconds, Timeout.Infinite); | ||||
|                 milliSeconds += 2000; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|         void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) | ||||
|         { | ||||
|             Move(this, extractResults, exception); | ||||
|         } | ||||
|     void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) => Move(extractResults, exception); | ||||
|  | ||||
|         void IFileRead.WaitForThread() | ||||
|         { | ||||
|             WaitForThread(thread: null, threadExceptions: null); | ||||
|         } | ||||
|     void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); | ||||
|  | ||||
|         string IFileRead.GetEventDescription() | ||||
|         { | ||||
|             string result = _Description.GetEventDescription(); | ||||
|             return result; | ||||
|         } | ||||
|     string IFileRead.GetEventDescription() | ||||
|     { | ||||
|         string result = _Description.GetEventDescription(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|         List<string> IFileRead.GetHeaderNames() | ||||
|         { | ||||
|             List<string> results = _Description.GetHeaderNames(); | ||||
|             return results; | ||||
|         } | ||||
|     List<string> IFileRead.GetHeaderNames() | ||||
|     { | ||||
|         List<string> results = _Description.GetHeaderNames(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         string[] IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, string to, string from, string resolvedFileLocation, Exception exception) | ||||
|         { | ||||
|             string[] results = Move(extractResults, to, from, resolvedFileLocation, exception); | ||||
|             return results; | ||||
|         } | ||||
|     string[] IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> 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; | ||||
|         } | ||||
|     JsonProperty[] IFileRead.GetDefault() | ||||
|     { | ||||
|         JsonProperty[] results = _Description.GetDefault(this, _Logistics); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         Dictionary<string, string> IFileRead.GetDisplayNamesJsonElement() | ||||
|         { | ||||
|             Dictionary<string, string> results = _Description.GetDisplayNamesJsonElement(this); | ||||
|             return results; | ||||
|         } | ||||
|     Dictionary<string, string> IFileRead.GetDisplayNamesJsonElement() | ||||
|     { | ||||
|         Dictionary<string, string> results = _Description.GetDisplayNamesJsonElement(this); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         List<IDescription> IFileRead.GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData) | ||||
|         { | ||||
|             List<IDescription> results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); | ||||
|             return results; | ||||
|         } | ||||
|     List<IDescription> IFileRead.GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData) | ||||
|     { | ||||
|         List<IDescription> results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.GetExtractResult(string reportFullPath, string eventName) | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.GetExtractResult(string reportFullPath, string eventName) | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, Test[], JsonElement[], List<FileInfo>>(results.Item1, Array.Empty<Test>(), JsonSerializer.Deserialize<JsonElement[]>("[]"), results.Item4); | ||||
|         if (results.Item3.Length > 0 && _IsEAFHosted) | ||||
|             WritePDSF(this, results.Item3); | ||||
|         UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.ReExtract() | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|         List<string> headerNames = _Description.GetHeaderNames(); | ||||
|         Dictionary<string, string> keyValuePairs = _Description.GetDisplayNamesJsonElement(this); | ||||
|         results = ReExtract(this, headerNames, keyValuePairs); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     void IFileRead.CheckTests(Test[] tests, bool extra) | ||||
|     { | ||||
|         if (_Description is not Description) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Callback(object state) => Callback(state); | ||||
|  | ||||
|     protected List<QS408M.Description> GetDescriptions(JsonElement[] jsonElements) | ||||
|     { | ||||
|         List<QS408M.Description> results = new(); | ||||
|         QS408M.Description description; | ||||
|         JsonSerializerOptions jsonSerializerOptions = new() { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString }; | ||||
|         foreach (JsonElement jsonElement in jsonElements) | ||||
|         { | ||||
|             Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|             if (string.IsNullOrEmpty(eventName)) | ||||
|             if (jsonElement.ValueKind != JsonValueKind.Object) | ||||
|                 throw new Exception(); | ||||
|             _ReportFullPath = reportFullPath; | ||||
|             DateTime dateTime = DateTime.Now; | ||||
|             results = GetExtractResult(reportFullPath, dateTime); | ||||
|             if (results.Item3 is null) | ||||
|                 results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(results.Item1, new Test[] { }, JsonSerializer.Deserialize<JsonElement[]>("[]"), results.Item4); | ||||
|             if (results.Item3.Length > 0 && _IsEAFHosted) | ||||
|                 WritePDSF(this, results.Item3); | ||||
|             UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); | ||||
|             return results; | ||||
|             description = JsonSerializer.Deserialize<QS408M.Description>(jsonElement.ToString(), jsonSerializerOptions); | ||||
|             results.Add(description); | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.ReExtract() | ||||
|     private Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, DateTime dateTime) | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|         string duplicateDirectory; | ||||
|         Tuple<string, string[], string[]> pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); | ||||
|         _Logistics = new Logistics(reportFullPath, pdsf.Item1); | ||||
|         SetFileParameterLotIDToLogisticsMID(); | ||||
|         JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); | ||||
|         List<QS408M.Description> descriptions = GetDescriptions(jsonElements); | ||||
|         Tuple<Test[], Dictionary<Test, List<Shared.Properties.IDescription>>> tuple = GetTuple(this, from l in descriptions select (Shared.Properties.IDescription)l, extra: false); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(pdsf.Item1, tuple.Item1, jsonElements, new List<FileInfo>()); | ||||
|         bool isNotUsedInsightMetrologyViewerAttachments = (!(_FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) && _Hyphens == _HyphenIsXToOpenInsightMetrologyViewerAttachments); | ||||
|         bool isDummyRun = (_DummyRuns.Any() && _DummyRuns.ContainsKey(_Logistics.JobID) && _DummyRuns[_Logistics.JobID].Any() && (from l in _DummyRuns[_Logistics.JobID] where l == _Logistics.Sequence select 1).Any()); | ||||
|         if (isDummyRun) | ||||
|         { | ||||
|             Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|             List<string> headerNames = _Description.GetHeaderNames(); | ||||
|             Dictionary<string, string> keyValuePairs = _Description.GetDisplayNamesJsonElement(this); | ||||
|             results = ReExtract(this, headerNames, keyValuePairs); | ||||
|             return results; | ||||
|             try | ||||
|             { File.SetLastWriteTime(reportFullPath, dateTime); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
|  | ||||
|         void IFileRead.CheckTests(Test[] tests, bool extra) | ||||
|         string[] segments = Path.GetFileNameWithoutExtension(reportFullPath).Split('_'); | ||||
|         if (_Hyphens != _HyphenIsXToOpenInsight) | ||||
|             duplicateDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\", segments[0]); | ||||
|         else | ||||
|             duplicateDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation)), @"\Data"); | ||||
|         if (segments.Length > 2) | ||||
|             duplicateDirectory = string.Concat(duplicateDirectory, @"-", segments[2]); | ||||
|         if (!Directory.Exists(duplicateDirectory)) | ||||
|             _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|         if ((isDummyRun || isNotUsedInsightMetrologyViewerAttachments || _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)) | ||||
|         { | ||||
|             if (!(_Description is Description)) | ||||
|                 throw new Exception(); | ||||
|         } | ||||
|  | ||||
|         void IFileRead.Callback(object state) | ||||
|         { | ||||
|             Callback(state); | ||||
|         } | ||||
|  | ||||
|         void IFileRead.MoveArchive() | ||||
|         { | ||||
|             string logisticsSequence = _Logistics.Sequence.ToString(); | ||||
|             if (!Directory.Exists(duplicateDirectory)) | ||||
|                 _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|             string successDirectory; | ||||
|             if (_Hyphens != _HyphenIsXToAPC) | ||||
|                 successDirectory = string.Empty; | ||||
|             else | ||||
|             { | ||||
|                 successDirectory = string.Concat(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation), @"\ViewerPath"); | ||||
|                 if (!Directory.Exists(successDirectory)) | ||||
|                     _ = Directory.CreateDirectory(successDirectory); | ||||
|             } | ||||
|             List<Tuple<Shared.Properties.IScopeInfo, string>> tuples = new(); | ||||
|             string duplicateFile = string.Concat(duplicateDirectory, @"\", Path.GetFileName(reportFullPath)); | ||||
|             string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|             string weekDirectory = string.Concat(_Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); | ||||
|             string jobIdDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\", _Logistics.JobID); | ||||
|             if (!Directory.Exists(jobIdDirectory)) | ||||
|                 Directory.CreateDirectory(jobIdDirectory); | ||||
|             //string destinationArchiveDirectory = string.Concat(jobIdDirectory, @"\!Archive\", weekDirectory); | ||||
|             string destinationArchiveDirectory = string.Concat(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation), @"\Archive\", _Logistics.JobID, @"\", weekDirectory); | ||||
|             if (!Directory.Exists(destinationArchiveDirectory)) | ||||
|                 Directory.CreateDirectory(destinationArchiveDirectory); | ||||
|             string[] matchDirectories = new string[] { GetDirectoriesRecursively(jobIdDirectory, logisticsSequence).FirstOrDefault() }; | ||||
|             if ((matchDirectories is null) || matchDirectories.Length != 1) | ||||
|                 throw new Exception("Didn't find directory by logistics sequence"); | ||||
|             string sourceDirectory = Path.GetDirectoryName(matchDirectories[0]); | ||||
|             destinationArchiveDirectory = string.Concat(destinationArchiveDirectory, @"\", Path.GetFileName(sourceDirectory)); | ||||
|             Directory.Move(sourceDirectory, destinationArchiveDirectory); | ||||
|         } | ||||
|  | ||||
|         protected List<QS408M.Description> GetDescriptions(JsonElement[] jsonElements) | ||||
|         { | ||||
|             List<QS408M.Description> results = new(); | ||||
|             QS408M.Description description; | ||||
|             JsonSerializerOptions jsonSerializerOptions = new() { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString }; | ||||
|             foreach (JsonElement jsonElement in jsonElements) | ||||
|             string logisticsSequenceMemoryDirectory = string.Concat(_MemoryPath, @"\", _EquipmentType, @"\Source\", weekDirectory, @"\", _Logistics.Sequence); | ||||
|             if (!Directory.Exists(logisticsSequenceMemoryDirectory)) | ||||
|                 _ = Directory.CreateDirectory(logisticsSequenceMemoryDirectory); | ||||
|             if (_Hyphens == _HyphenIsXToAPC) | ||||
|             { | ||||
|                 if (jsonElement.ValueKind != JsonValueKind.Object) | ||||
|                     throw new Exception(); | ||||
|                 description = JsonSerializer.Deserialize<QS408M.Description>(jsonElement.ToString(), jsonSerializerOptions); | ||||
|                 results.Add(description); | ||||
|                 if (!isDummyRun && _IsEAFHosted) | ||||
|                     File.Copy(reportFullPath, duplicateFile, overwrite: true); | ||||
|             } | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         private Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, DateTime dateTime) | ||||
|         { | ||||
|             Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|             string duplicateDirectory; | ||||
|             Tuple<string, string[], string[]> pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); | ||||
|             _Logistics = new Logistics(reportFullPath, pdsf.Item1); | ||||
|             SetFileParameterLotIDToLogisticsMID(); | ||||
|             JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); | ||||
|             List<QS408M.Description> descriptions = GetDescriptions(jsonElements); | ||||
|             Tuple<Test[], Dictionary<Test, List<Shared.Properties.IDescription>>> tuple = GetTuple(this, from l in descriptions select (Shared.Properties.IDescription)l, extra: false); | ||||
|             results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(pdsf.Item1, tuple.Item1, jsonElements, new List<FileInfo>()); | ||||
|             bool isNotUsedInsightMetrologyViewerAttachments = (!(_FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) && _Hyphens == _HyphenIsXToOpenInsightMetrologyViewerAttachments); | ||||
|             bool isDummyRun = (_DummyRuns.Any() && _DummyRuns.ContainsKey(_Logistics.JobID) && _DummyRuns[_Logistics.JobID].Any() && (from l in _DummyRuns[_Logistics.JobID] where l == _Logistics.Sequence select 1).Any()); | ||||
|             if (isDummyRun) | ||||
|             { | ||||
|                 try | ||||
|                 { File.SetLastWriteTime(reportFullPath, dateTime); } | ||||
|                 catch (Exception) { } | ||||
|             } | ||||
|             string[] segments = Path.GetFileNameWithoutExtension(reportFullPath).Split('_'); | ||||
|             if (_Hyphens != _HyphenIsXToOpenInsight) | ||||
|                 duplicateDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\", segments[0]); | ||||
|             else | ||||
|                 duplicateDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation)), @"\Data"); | ||||
|             if (segments.Length > 2) | ||||
|                 duplicateDirectory = string.Concat(duplicateDirectory, @"-", segments[2]); | ||||
|             if (!Directory.Exists(duplicateDirectory)) | ||||
|                 Directory.CreateDirectory(duplicateDirectory); | ||||
|             if ((isDummyRun || isNotUsedInsightMetrologyViewerAttachments || _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) && _Hyphens != _HyphenIsXToArchive && _Hyphens != _HyphenIsArchive) | ||||
|             { | ||||
|                 if (!Directory.Exists(duplicateDirectory)) | ||||
|                     Directory.CreateDirectory(duplicateDirectory); | ||||
|                 string successDirectory; | ||||
|                 if (_Hyphens != _HyphenIsXToAPC) | ||||
|                     successDirectory = string.Empty; | ||||
|                 else | ||||
|                 { | ||||
|                     successDirectory = string.Concat(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation), @"\ViewerPath"); | ||||
|                     if (!Directory.Exists(successDirectory)) | ||||
|                         Directory.CreateDirectory(successDirectory); | ||||
|                 } | ||||
|                 List<Tuple<Shared.Properties.IScopeInfo, string>> tuples = new(); | ||||
|                 string duplicateFile = string.Concat(duplicateDirectory, @"\", Path.GetFileName(reportFullPath)); | ||||
|                 string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|                 string weekDirectory = string.Concat(_Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd")); | ||||
|                 string logisticsSequenceMemoryDirectory = string.Concat(_MemoryPath, @"\", _EquipmentType, @"\Source\", weekDirectory, @"\", _Logistics.Sequence); | ||||
|                 if (!Directory.Exists(logisticsSequenceMemoryDirectory)) | ||||
|                     Directory.CreateDirectory(logisticsSequenceMemoryDirectory); | ||||
|                 if (_Hyphens == _HyphenIsXToAPC) | ||||
|                 { | ||||
|                     if (!isDummyRun && _IsEAFHosted) | ||||
|                         File.Copy(reportFullPath, duplicateFile, overwrite: true); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     if (_Hyphens == _HyphenIsXToOpenInsightMetrologyViewer) | ||||
|                     { | ||||
|                         WSRequest wsRequest = new(this, _Logistics, descriptions); | ||||
|                         if (!isDummyRun && _IsEAFHosted) | ||||
|                         { | ||||
|                             Tuple<string, WS.Results> wsResults = WS.SendData(_OpenInsightMetrologyViewerAPI, wsRequest); | ||||
|                             if (!wsResults.Item2.Success) | ||||
|                                 throw new Exception(wsResults.ToString()); | ||||
|                             _Log.Debug(wsResults.Item2.HeaderID); | ||||
|                             File.WriteAllText(string.Concat(logisticsSequenceMemoryDirectory, @"\", nameof(WS.Results), ".json"), wsResults.Item1); | ||||
|                         } | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         Test test; | ||||
|                         string lines; | ||||
|                         Shared.Properties.IScopeInfo scopeInfo; | ||||
|                         foreach (KeyValuePair<Test, List<Shared.Properties.IDescription>> keyValuePair in tuple.Item2) | ||||
|                         { | ||||
|                             test = keyValuePair.Key; | ||||
|                             //scopeInfo = new ScopeInfo(test); | ||||
|                             if (_Hyphens != _HyphenIsXToOpenInsight) | ||||
|                                 scopeInfo = new ScopeInfo(test, _IqsFile); | ||||
|                             else | ||||
|                                 scopeInfo = new ScopeInfo(test, _OpenInsightFilePattern); | ||||
|                             //lines = ProcessDataStandardFormat.GetLines(this, scopeInfo, names, values, dateFormat: "M/d/yyyy hh:mm:ss tt", timeFormat: string.Empty, pairedColumns: ExtractResultPairedColumns); | ||||
|                             lines = ProcessData.GetLines(this, _Logistics, descriptions); | ||||
|                             tuples.Add(new Tuple<Shared.Properties.IScopeInfo, string>(scopeInfo, lines)); | ||||
|                         } | ||||
|                     } | ||||
|                     if (_Hyphens == _HyphenIsXToOpenInsightMetrologyViewerAttachments) | ||||
|                     { | ||||
|                         string[] matchDirectories = Shared1567(reportFullPath, tuples); | ||||
|                         if (!isDummyRun && _IsEAFHosted && !isNotUsedInsightMetrologyViewerAttachments) | ||||
|                             ProcessData.PostOpenInsightMetrologyViewerAttachments(this, _Logistics, _OpenInsightMetrologyViewerAPI, dateTime, logisticsSequenceMemoryDirectory, descriptions, matchDirectories[0]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (_Hyphens != _HyphenIsXToOpenInsightMetrologyViewer && _Hyphens != _HyphenIsXToOpenInsightMetrologyViewerAttachments) | ||||
|                     Shared0413(dateTime, isDummyRun, successDirectory, duplicateDirectory, tuples, duplicateFile); | ||||
|             } | ||||
|             if (_Hyphens == _HyphenIsXToOpenInsightMetrologyViewerAttachments) | ||||
|             { | ||||
|                 string destinationDirectory; | ||||
|                 //string destinationDirectory = WriteScopeInfo(_ProgressPath, _Logistics, dateTime, duplicateDirectory, tuples); | ||||
|                 FileInfo fileInfo = new(reportFullPath); | ||||
|                 string logisticsSequence = _Logistics.Sequence.ToString(); | ||||
|                 if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) | ||||
|                     File.SetLastWriteTime(reportFullPath, fileInfo.CreationTime); | ||||
|                 string jobIdDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation)), @"\", _Logistics.JobID); | ||||
|                 if (!Directory.Exists(jobIdDirectory)) | ||||
|                     Directory.CreateDirectory(jobIdDirectory); | ||||
|                 string[] matchDirectories; | ||||
|                 if (!_IsEAFHosted) | ||||
|                     matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(reportFullPath)) }; | ||||
|                 else | ||||
|                     matchDirectories = Directory.GetDirectories(jobIdDirectory, string.Concat(_Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly); | ||||
|                 if ((matchDirectories is null) || matchDirectories.Length != 1) | ||||
|                     throw new Exception("Didn't find directory by logistics sequence"); | ||||
|                 destinationDirectory = matchDirectories[0]; | ||||
|                 if (isDummyRun) | ||||
|                     Shared0607(reportFullPath, duplicateDirectory, logisticsSequence, destinationDirectory); | ||||
|                 else | ||||
|                 if (_Hyphens == _HyphenIsXToOpenInsightMetrologyViewer) | ||||
|                 { | ||||
|                     WSRequest wsRequest = new(this, _Logistics, descriptions); | ||||
|                     JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true }; | ||||
|                     string json = JsonSerializer.Serialize(wsRequest, wsRequest.GetType(), jsonSerializerOptions); | ||||
|                     if (_IsEAFHosted) | ||||
|                         Shared1277(reportFullPath, destinationDirectory, logisticsSequence, jobIdDirectory, json); | ||||
|                     else | ||||
|                     if (!isDummyRun && _IsEAFHosted) | ||||
|                     { | ||||
|                         string jsonFileName = Path.ChangeExtension(reportFullPath, ".json"); | ||||
|                         string historicalText = File.ReadAllText(jsonFileName); | ||||
|                         if (json != historicalText) | ||||
|                             throw new Exception("File doesn't match historical!"); | ||||
|                         Tuple<string, WS.Results> wsResults = WS.SendData(_OpenInsightMetrologyViewerAPI, wsRequest); | ||||
|                         if (!wsResults.Item2.Success) | ||||
|                             throw new Exception(wsResults.ToString()); | ||||
|                         _Log.Debug(wsResults.Item2.HeaderID); | ||||
|                         File.WriteAllText(string.Concat(logisticsSequenceMemoryDirectory, @"\", nameof(WS.Results), ".json"), wsResults.Item1); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         private void CallbackIsDummy(string traceDummyFile, List<Tuple<string, string, string, string, int>> tuples, bool fileConnectorConfigurationIncludeSubDirectories, bool includeSubDirectoriesExtra) | ||||
|         { | ||||
|             int fileCount; | ||||
|             string[] files; | ||||
|             string monARessource; | ||||
|             string checkDirectory; | ||||
|             string sourceArchiveFile; | ||||
|             string inProcessDirectory; | ||||
|             const string site = "sjc"; | ||||
|             string stateName = string.Concat("Dummy_", _EventName); | ||||
|             const string monInURL = "http://moninhttp.sjc.infineon.com/input/text"; | ||||
|             MonIn monIn = MonIn.GetInstance(monInURL); | ||||
|             foreach (Tuple<string, string, string, string, int> item in tuples) | ||||
|             { | ||||
|                 monARessource = item.Item1; | ||||
|                 sourceArchiveFile = item.Item2; | ||||
|                 inProcessDirectory = item.Item3; | ||||
|                 checkDirectory = item.Item4; | ||||
|                 fileCount = item.Item5; | ||||
|                 try | ||||
|                 else | ||||
|                 { | ||||
|                     if (fileCount > 0 || string.IsNullOrEmpty(checkDirectory)) | ||||
|                     Test test; | ||||
|                     string lines; | ||||
|                     Shared.Properties.IScopeInfo scopeInfo; | ||||
|                     foreach (KeyValuePair<Test, List<Shared.Properties.IDescription>> keyValuePair in tuple.Item2) | ||||
|                     { | ||||
|                         File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Warning.ToString() }); | ||||
|                         monIn.SendStatus(site, monARessource, stateName, State.Warning); | ||||
|                         for (int i = 1; i < 12; i++) | ||||
|                             Thread.Sleep(500); | ||||
|                     } | ||||
|                     else if (inProcessDirectory == checkDirectory) | ||||
|                         continue; | ||||
|                     if (!_IsEAFHosted) | ||||
|                         continue; | ||||
|                     if (!File.Exists(sourceArchiveFile)) | ||||
|                         continue; | ||||
|                     if (!long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) | ||||
|                         continue; | ||||
|                     ZipFile.ExtractToDirectory(sourceArchiveFile, inProcessDirectory); | ||||
|                     if (fileConnectorConfigurationIncludeSubDirectories && includeSubDirectoriesExtra) | ||||
|                     { | ||||
|                         if (_EventName == _EventNameFileRead) | ||||
|                             checkDirectory = string.Concat(checkDirectory, @"\", sequence); | ||||
|                         else if (_EventName == _EventNameFileReadDaily) | ||||
|                             checkDirectory = string.Concat(checkDirectory, @"\Source\", sequence); | ||||
|                         test = keyValuePair.Key; | ||||
|                         //scopeInfo = new ScopeInfo(test); | ||||
|                         if (_Hyphens != _HyphenIsXToOpenInsight) | ||||
|                             scopeInfo = new ScopeInfo(test, _IqsFile); | ||||
|                         else | ||||
|                             throw new Exception(); | ||||
|                             scopeInfo = new ScopeInfo(test, _OpenInsightFilePattern); | ||||
|                         //lines = ProcessDataStandardFormat.GetLines(this, scopeInfo, names, values, dateFormat: "M/d/yyyy hh:mm:ss tt", timeFormat: string.Empty, pairedColumns: ExtractResultPairedColumns); | ||||
|                         lines = ProcessData.GetLines(this, _Logistics, descriptions); | ||||
|                         tuples.Add(new Tuple<Shared.Properties.IScopeInfo, string>(scopeInfo, lines)); | ||||
|                     } | ||||
|                     if (fileConnectorConfigurationIncludeSubDirectories) | ||||
|                         files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.AllDirectories); | ||||
|                     else | ||||
|                         files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.TopDirectoryOnly); | ||||
|                     if (files.Length > 250) | ||||
|                         throw new Exception("Safety net!"); | ||||
|                     foreach (string file in files) | ||||
|                         File.SetLastWriteTime(file, new DateTime(sequence)); | ||||
|                     if (!fileConnectorConfigurationIncludeSubDirectories) | ||||
|                     { | ||||
|                         foreach (string file in files) | ||||
|                             File.Move(file, string.Concat(checkDirectory, @"\", Path.GetFileName(file))); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         string[] directories = Directory.GetDirectories(inProcessDirectory, "*", SearchOption.AllDirectories); | ||||
|                         foreach (string directory in directories) | ||||
|                             Directory.CreateDirectory(string.Concat(checkDirectory, directory.Substring(inProcessDirectory.Length))); | ||||
|                         foreach (string file in files) | ||||
|                             File.Move(file, string.Concat(checkDirectory, file.Substring(inProcessDirectory.Length))); | ||||
|                     } | ||||
|                     File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Ok.ToString() }); | ||||
|                     monIn.SendStatus(site, monARessource, stateName, State.Ok); | ||||
|                 } | ||||
|                 catch (Exception exception) | ||||
|                 if (_Hyphens == _HyphenIsXToOpenInsightMetrologyViewerAttachments) | ||||
|                 { | ||||
|                     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); | ||||
|                     string[] matchDirectories = Shared1567(reportFullPath, tuples); | ||||
|                     if (!isDummyRun && _IsEAFHosted && !isNotUsedInsightMetrologyViewerAttachments) | ||||
|                         ProcessData.PostOpenInsightMetrologyViewerAttachments(this, _Logistics, _OpenInsightMetrologyViewerAPI, dateTime, logisticsSequenceMemoryDirectory, descriptions, matchDirectories[0]); | ||||
|                 } | ||||
|             } | ||||
|             if (_Hyphens != _HyphenIsXToOpenInsightMetrologyViewer && _Hyphens != _HyphenIsXToOpenInsightMetrologyViewerAttachments) | ||||
|                 Shared0413(dateTime, isDummyRun, successDirectory, duplicateDirectory, tuples, duplicateFile); | ||||
|         } | ||||
|  | ||||
|         private void Callback(object state) | ||||
|         if (_Hyphens == _HyphenIsXToOpenInsightMetrologyViewerAttachments) | ||||
|         { | ||||
|             if (_Hyphens != _HyphenIsDummy) | ||||
|                 throw new Exception(); | ||||
|             try | ||||
|             string destinationDirectory; | ||||
|             //string destinationDirectory = WriteScopeInfo(_ProgressPath, _Logistics, dateTime, duplicateDirectory, tuples); | ||||
|             FileInfo fileInfo = new(reportFullPath); | ||||
|             string logisticsSequence = _Logistics.Sequence.ToString(); | ||||
|             if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) | ||||
|                 File.SetLastWriteTime(reportFullPath, fileInfo.CreationTime); | ||||
|             string jobIdDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation)), @"\", _Logistics.JobID); | ||||
|             if (!Directory.Exists(jobIdDirectory)) | ||||
|                 _ = Directory.CreateDirectory(jobIdDirectory); | ||||
|             string[] matchDirectories; | ||||
|             if (!_IsEAFHosted) | ||||
|                 matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(reportFullPath)) }; | ||||
|             else | ||||
|                 matchDirectories = Directory.GetDirectories(jobIdDirectory, string.Concat(_Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly); | ||||
|             if ((matchDirectories is null) || matchDirectories.Length != 1) | ||||
|                 throw new Exception("Didn't find directory by logistics sequence"); | ||||
|             destinationDirectory = matchDirectories[0]; | ||||
|             if (isDummyRun) | ||||
|                 Shared0607(reportFullPath, duplicateDirectory, logisticsSequence, destinationDirectory); | ||||
|             else | ||||
|             { | ||||
|                 DateTime dateTime = DateTime.Now; | ||||
|                 bool check = (dateTime.Hour > 7 && dateTime.Hour < 18 && dateTime.DayOfWeek != DayOfWeek.Sunday && dateTime.DayOfWeek != DayOfWeek.Saturday); | ||||
|                 if (check) | ||||
|                 WSRequest wsRequest = new(this, _Logistics, descriptions); | ||||
|                 JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true }; | ||||
|                 string json = JsonSerializer.Serialize(wsRequest, wsRequest.GetType(), jsonSerializerOptions); | ||||
|                 if (_IsEAFHosted) | ||||
|                     Shared1277(reportFullPath, destinationDirectory, logisticsSequence, jobIdDirectory, json); | ||||
|                 else | ||||
|                 { | ||||
|                     int fileCount; | ||||
|                     string[] files; | ||||
|                     string monARessource; | ||||
|                     string checkDirectory; | ||||
|                     string sourceArchiveFile; | ||||
|                     string sourceFileLocation; | ||||
|                     string inProcessDirectory; | ||||
|                     string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|                     string traceDummyDirectory = string.Concat(Path.GetPathRoot(_TracePath), @"\TracesDummy\", _CellInstanceName, @"\Source\", dateTime.ToString("yyyy"), "___Week_", weekOfYear); | ||||
|                     if (!Directory.Exists(traceDummyDirectory)) | ||||
|                         Directory.CreateDirectory(traceDummyDirectory); | ||||
|                     string traceDummyFile = string.Concat(traceDummyDirectory, @"\", dateTime.Ticks, " - ", _CellInstanceName, ".txt"); | ||||
|                     File.AppendAllText(traceDummyFile, string.Empty); | ||||
|                     List<Tuple<string, string, string, string, int>> tuples = new(); | ||||
|                     string progressDirectory = Path.GetFullPath(string.Concat(_FileConnectorConfiguration.SourceFileLocation, @"\_ Progress")); | ||||
|                     if (progressDirectory != _ProgressPath || !Directory.Exists(progressDirectory)) | ||||
|                         throw new Exception("Invalid progress path"); | ||||
|                     foreach (KeyValuePair<string, string> keyValuePair in _CellNames) | ||||
|                     { | ||||
|                         monARessource = keyValuePair.Key; | ||||
|                         if (!keyValuePair.Value.Contains(@"\")) | ||||
|                             continue; | ||||
|                         foreach (string sourceFileFilter in _FileConnectorConfiguration.SourceFileFilter.Split('|')) | ||||
|                         { | ||||
|                             if (sourceFileFilter.ToLower().StartsWith(keyValuePair.Value.Replace(@"\", string.Empty))) | ||||
|                                 sourceFileLocation = Path.GetFullPath(_FileConnectorConfiguration.SourceFileLocation); | ||||
|                             else if (_FileConnectorConfiguration.SourceFileLocation.ToLower().EndsWith(keyValuePair.Value)) | ||||
|                                 sourceFileLocation = Path.GetFullPath(_FileConnectorConfiguration.SourceFileLocation); | ||||
|                             else | ||||
|                                 sourceFileLocation = Path.GetFullPath(string.Concat(_FileConnectorConfiguration.SourceFileLocation, @"\", keyValuePair.Value)); | ||||
|                             sourceArchiveFile = Path.GetFullPath(string.Concat(sourceFileLocation, @"\", sourceFileFilter)); | ||||
|                             if (!File.Exists(sourceArchiveFile)) | ||||
|                                 continue; | ||||
|                             if (!_DummyRuns.ContainsKey(monARessource)) | ||||
|                                 _DummyRuns.Add(monARessource, new List<long>()); | ||||
|                             tuples.Add(new Tuple<string, string, string, string, int>(monARessource, sourceFileFilter, sourceFileLocation, sourceArchiveFile, 0)); | ||||
|                         } | ||||
|                     } | ||||
|                     File.AppendAllLines(traceDummyFile, from l in tuples select l.Item4); | ||||
|                     if (tuples.Any()) | ||||
|                     { | ||||
|                         _LastDummyRunIndex += 1; | ||||
|                         if (_LastDummyRunIndex >= tuples.Count) | ||||
|                             _LastDummyRunIndex = 0; | ||||
|                         monARessource = tuples[_LastDummyRunIndex].Item1; | ||||
|                         string sourceFileFilter = tuples[_LastDummyRunIndex].Item2; | ||||
|                         sourceFileLocation = tuples[_LastDummyRunIndex].Item3; | ||||
|                         sourceArchiveFile = tuples[_LastDummyRunIndex].Item4; | ||||
|                         //fileCount = tuples[_LastDummyRunIndex].Item5; | ||||
|                         tuples.Clear(); | ||||
|                         if (long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) | ||||
|                         { | ||||
|                             if (!_DummyRuns[monARessource].Contains(sequence)) | ||||
|                                 _DummyRuns[monARessource].Add(sequence); | ||||
|                             inProcessDirectory = string.Concat(progressDirectory, @"\Dummy_in process\", sequence); | ||||
|                             checkDirectory = inProcessDirectory; | ||||
|                             if (!Directory.Exists(checkDirectory)) | ||||
|                                 Directory.CreateDirectory(checkDirectory); | ||||
|                             files = Directory.GetFiles(checkDirectory, "*", SearchOption.AllDirectories); | ||||
|                             fileCount = files.Length; | ||||
|                             if (files.Any()) | ||||
|                             { | ||||
|                                 if (files.Length > 250) | ||||
|                                     throw new Exception("Safety net!"); | ||||
|                                 try | ||||
|                                 { | ||||
|                                     foreach (string file in files) | ||||
|                                         File.Delete(file); | ||||
|                                 } | ||||
|                                 catch (Exception) { } | ||||
|                             } | ||||
|                             tuples.Add(new Tuple<string, string, string, string, int>(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); | ||||
|                             checkDirectory = sourceFileLocation; | ||||
|                             files = Directory.GetFiles(checkDirectory, string.Concat("*", sequence, "*"), SearchOption.TopDirectoryOnly); | ||||
|                             fileCount = files.Length; | ||||
|                             tuples.Add(new Tuple<string, string, string, string, int>(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); | ||||
|                         } | ||||
|                     } | ||||
|                     if (tuples.Any()) | ||||
|                         //CallbackIsDummy(traceDummyFile, tuples, FileConnectorConfiguration.IncludeSubDirectories.Value, includeSubDirectoriesExtra: false); | ||||
|                         CallbackIsDummy(traceDummyFile, tuples, fileConnectorConfigurationIncludeSubDirectories: true, includeSubDirectoriesExtra: true); | ||||
|                     string jsonFileName = Path.ChangeExtension(reportFullPath, ".json"); | ||||
|                     string historicalText = File.ReadAllText(jsonFileName); | ||||
|                     if (json != historicalText) | ||||
|                         throw new Exception("File doesn't match historical!"); | ||||
|                 } | ||||
|             } | ||||
|             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) { } | ||||
|             } | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private void CallbackIsDummy(string traceDummyFile, List<Tuple<string, string, string, string, int>> tuples, bool fileConnectorConfigurationIncludeSubDirectories, bool includeSubDirectoriesExtra) | ||||
|     { | ||||
|         int fileCount; | ||||
|         string[] files; | ||||
|         string monARessource; | ||||
|         string checkDirectory; | ||||
|         string sourceArchiveFile; | ||||
|         string inProcessDirectory; | ||||
|         const string site = "sjc"; | ||||
|         string stateName = string.Concat("Dummy_", _EventName); | ||||
|         const string monInURL = "http://moninhttp.sjc.infineon.com/input/text"; | ||||
|         MonIn monIn = MonIn.GetInstance(monInURL); | ||||
|         foreach (Tuple<string, string, string, string, int> item in tuples) | ||||
|         { | ||||
|             monARessource = item.Item1; | ||||
|             sourceArchiveFile = item.Item2; | ||||
|             inProcessDirectory = item.Item3; | ||||
|             checkDirectory = item.Item4; | ||||
|             fileCount = item.Item5; | ||||
|             try | ||||
|             { | ||||
|                 TimeSpan timeSpan = new(DateTime.Now.AddSeconds(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value).Ticks - DateTime.Now.Ticks); | ||||
|                 _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); | ||||
|                 if (fileCount > 0 || string.IsNullOrEmpty(checkDirectory)) | ||||
|                 { | ||||
|                     File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Warning.ToString() }); | ||||
|                     _ = monIn.SendStatus(site, monARessource, stateName, State.Warning); | ||||
|                     for (int i = 1; i < 12; i++) | ||||
|                         Thread.Sleep(500); | ||||
|                 } | ||||
|                 else if (inProcessDirectory == checkDirectory) | ||||
|                     continue; | ||||
|                 if (!_IsEAFHosted) | ||||
|                     continue; | ||||
|                 if (!File.Exists(sourceArchiveFile)) | ||||
|                     continue; | ||||
|                 if (!long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) | ||||
|                     continue; | ||||
|                 ZipFile.ExtractToDirectory(sourceArchiveFile, inProcessDirectory); | ||||
|                 if (fileConnectorConfigurationIncludeSubDirectories && includeSubDirectoriesExtra) | ||||
|                 { | ||||
|                     if (_EventName == _EventNameFileRead) | ||||
|                         checkDirectory = string.Concat(checkDirectory, @"\", sequence); | ||||
|                     else if (_EventName == _EventNameFileReadDaily) | ||||
|                         checkDirectory = string.Concat(checkDirectory, @"\Source\", sequence); | ||||
|                     else | ||||
|                         throw new Exception(); | ||||
|                 } | ||||
|                 if (fileConnectorConfigurationIncludeSubDirectories) | ||||
|                     files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.AllDirectories); | ||||
|                 else | ||||
|                     files = Directory.GetFiles(inProcessDirectory, "*", SearchOption.TopDirectoryOnly); | ||||
|                 if (files.Length > 250) | ||||
|                     throw new Exception("Safety net!"); | ||||
|                 foreach (string file in files) | ||||
|                     File.SetLastWriteTime(file, new DateTime(sequence)); | ||||
|                 if (!fileConnectorConfigurationIncludeSubDirectories) | ||||
|                 { | ||||
|                     foreach (string file in files) | ||||
|                         File.Move(file, string.Concat(checkDirectory, @"\", Path.GetFileName(file))); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     string[] directories = Directory.GetDirectories(inProcessDirectory, "*", SearchOption.AllDirectories); | ||||
|                     foreach (string directory in directories) | ||||
|                         _ = Directory.CreateDirectory(string.Concat(checkDirectory, directory.Substring(inProcessDirectory.Length))); | ||||
|                     foreach (string file in files) | ||||
|                         File.Move(file, string.Concat(checkDirectory, file.Substring(inProcessDirectory.Length))); | ||||
|                 } | ||||
|                 File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Ok.ToString() }); | ||||
|                 _ = monIn.SendStatus(site, monARessource, stateName, State.Ok); | ||||
|             } | ||||
|             catch (Exception exception) | ||||
|             { | ||||
| @ -544,9 +391,126 @@ namespace Adaptation.FileHandlers.MET08THFTIRQS408M | ||||
|                 try | ||||
|                 { _SMTP.SendHighPriorityEmailMessage(subject, body); } | ||||
|                 catch (Exception) { } | ||||
|                 File.AppendAllLines(traceDummyFile, new string[] { site, monARessource, stateName, State.Critical.ToString(), exception.Message, exception.StackTrace }); | ||||
|                 _ = monIn.SendStatus(site, monARessource, stateName, State.Critical); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void Callback(object state) | ||||
|     { | ||||
|         if (_Hyphens != _HyphenIsDummy) | ||||
|             throw new Exception(); | ||||
|         try | ||||
|         { | ||||
|             DateTime dateTime = DateTime.Now; | ||||
|             bool check = (dateTime.Hour > 7 && dateTime.Hour < 18 && dateTime.DayOfWeek != DayOfWeek.Sunday && dateTime.DayOfWeek != DayOfWeek.Saturday); | ||||
|             if (check) | ||||
|             { | ||||
|                 int fileCount; | ||||
|                 string[] files; | ||||
|                 string monARessource; | ||||
|                 string checkDirectory; | ||||
|                 string sourceArchiveFile; | ||||
|                 string sourceFileLocation; | ||||
|                 string inProcessDirectory; | ||||
|                 string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|                 string traceDummyDirectory = string.Concat(Path.GetPathRoot(_TracePath), @"\TracesDummy\", _CellInstanceName, @"\Source\", dateTime.ToString("yyyy"), "___Week_", weekOfYear); | ||||
|                 if (!Directory.Exists(traceDummyDirectory)) | ||||
|                     _ = Directory.CreateDirectory(traceDummyDirectory); | ||||
|                 string traceDummyFile = string.Concat(traceDummyDirectory, @"\", dateTime.Ticks, " - ", _CellInstanceName, ".txt"); | ||||
|                 File.AppendAllText(traceDummyFile, string.Empty); | ||||
|                 List<Tuple<string, string, string, string, int>> tuples = new(); | ||||
|                 string progressDirectory = Path.GetFullPath(string.Concat(_FileConnectorConfiguration.SourceFileLocation, @"\_ Progress")); | ||||
|                 if (progressDirectory != _ProgressPath || !Directory.Exists(progressDirectory)) | ||||
|                     throw new Exception("Invalid progress path"); | ||||
|                 foreach (KeyValuePair<string, string> keyValuePair in _CellNames) | ||||
|                 { | ||||
|                     monARessource = keyValuePair.Key; | ||||
|                     if (!keyValuePair.Value.Contains(@"\")) | ||||
|                         continue; | ||||
|                     foreach (string sourceFileFilter in _FileConnectorConfiguration.SourceFileFilter.Split('|')) | ||||
|                     { | ||||
|                         if (sourceFileFilter.ToLower().StartsWith(keyValuePair.Value.Replace(@"\", string.Empty))) | ||||
|                             sourceFileLocation = Path.GetFullPath(_FileConnectorConfiguration.SourceFileLocation); | ||||
|                         else if (_FileConnectorConfiguration.SourceFileLocation.ToLower().EndsWith(keyValuePair.Value)) | ||||
|                             sourceFileLocation = Path.GetFullPath(_FileConnectorConfiguration.SourceFileLocation); | ||||
|                         else | ||||
|                             sourceFileLocation = Path.GetFullPath(string.Concat(_FileConnectorConfiguration.SourceFileLocation, @"\", keyValuePair.Value)); | ||||
|                         sourceArchiveFile = Path.GetFullPath(string.Concat(sourceFileLocation, @"\", sourceFileFilter)); | ||||
|                         if (!File.Exists(sourceArchiveFile)) | ||||
|                             continue; | ||||
|                         if (!_DummyRuns.ContainsKey(monARessource)) | ||||
|                             _DummyRuns.Add(monARessource, new List<long>()); | ||||
|                         tuples.Add(new Tuple<string, string, string, string, int>(monARessource, sourceFileFilter, sourceFileLocation, sourceArchiveFile, 0)); | ||||
|                     } | ||||
|                 } | ||||
|                 File.AppendAllLines(traceDummyFile, from l in tuples select l.Item4); | ||||
|                 if (tuples.Any()) | ||||
|                 { | ||||
|                     _LastDummyRunIndex += 1; | ||||
|                     if (_LastDummyRunIndex >= tuples.Count) | ||||
|                         _LastDummyRunIndex = 0; | ||||
|                     monARessource = tuples[_LastDummyRunIndex].Item1; | ||||
|                     string sourceFileFilter = tuples[_LastDummyRunIndex].Item2; | ||||
|                     sourceFileLocation = tuples[_LastDummyRunIndex].Item3; | ||||
|                     sourceArchiveFile = tuples[_LastDummyRunIndex].Item4; | ||||
|                     //fileCount = tuples[_LastDummyRunIndex].Item5; | ||||
|                     tuples.Clear(); | ||||
|                     if (long.TryParse(Path.GetFileNameWithoutExtension(sourceArchiveFile).Replace("x", string.Empty), out long sequence)) | ||||
|                     { | ||||
|                         if (!_DummyRuns[monARessource].Contains(sequence)) | ||||
|                             _DummyRuns[monARessource].Add(sequence); | ||||
|                         inProcessDirectory = string.Concat(progressDirectory, @"\Dummy_in process\", sequence); | ||||
|                         checkDirectory = inProcessDirectory; | ||||
|                         if (!Directory.Exists(checkDirectory)) | ||||
|                             _ = Directory.CreateDirectory(checkDirectory); | ||||
|                         files = Directory.GetFiles(checkDirectory, "*", SearchOption.AllDirectories); | ||||
|                         fileCount = files.Length; | ||||
|                         if (files.Any()) | ||||
|                         { | ||||
|                             if (files.Length > 250) | ||||
|                                 throw new Exception("Safety net!"); | ||||
|                             try | ||||
|                             { | ||||
|                                 foreach (string file in files) | ||||
|                                     File.Delete(file); | ||||
|                             } | ||||
|                             catch (Exception) { } | ||||
|                         } | ||||
|                         tuples.Add(new Tuple<string, string, string, string, int>(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); | ||||
|                         checkDirectory = sourceFileLocation; | ||||
|                         files = Directory.GetFiles(checkDirectory, string.Concat("*", sequence, "*"), SearchOption.TopDirectoryOnly); | ||||
|                         fileCount = files.Length; | ||||
|                         tuples.Add(new Tuple<string, string, string, string, int>(monARessource, sourceArchiveFile, inProcessDirectory, checkDirectory, fileCount)); | ||||
|                     } | ||||
|                 } | ||||
|                 if (tuples.Any()) | ||||
|                     //CallbackIsDummy(traceDummyFile, tuples, FileConnectorConfiguration.IncludeSubDirectories.Value, includeSubDirectoriesExtra: false); | ||||
|                     CallbackIsDummy(traceDummyFile, tuples, fileConnectorConfigurationIncludeSubDirectories: true, includeSubDirectoriesExtra: true); | ||||
|             } | ||||
|         } | ||||
|         catch (Exception exception) | ||||
|         { | ||||
|             string subject = string.Concat("Exception:", _CellInstanceConnectionName); | ||||
|             string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); | ||||
|             try | ||||
|             { _SMTP.SendHighPriorityEmailMessage(subject, body); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
|         try | ||||
|         { | ||||
|             TimeSpan timeSpan = new(DateTime.Now.AddSeconds(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value).Ticks - DateTime.Now.Ticks); | ||||
|             _ = _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); | ||||
|         } | ||||
|         catch (Exception exception) | ||||
|         { | ||||
|             string subject = string.Concat("Exception:", _CellInstanceConnectionName); | ||||
|             string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); | ||||
|             try | ||||
|             { _SMTP.SendHighPriorityEmailMessage(subject, body); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,18 +1,15 @@ | ||||
| namespace Adaptation.FileHandlers.MET08THFTIRQS408M | ||||
| namespace Adaptation.FileHandlers.MET08THFTIRQS408M; | ||||
|  | ||||
| public enum Hyphen | ||||
| { | ||||
|  | ||||
|     public enum Hyphen | ||||
|     { | ||||
|         IsXToOpenInsightMetrologyViewer, //MetrologyWS.SendData(file, string.Concat("http://", serverName, "/api/inbound/BioRad")); | ||||
|         IsXToIQSSi, //NA <d7p1:FileScanningIntervalInSeconds>-361</d7p1:FileScanningIntervalInSeconds> | ||||
|         IsXToOpenInsight, //bool WriteFileOpenInsight(BioRadFile | ||||
|         IsXToOpenInsightMetrologyViewerAttachments, //Site-None <d7p1:FileScanningIntervalInSeconds>-362</d7p1:FileScanningIntervalInSeconds> | ||||
|         IsXToAPC, | ||||
|         IsXToSPaCe, | ||||
|         IsXToArchive, | ||||
|         IsArchive, | ||||
|         IsDummy, | ||||
|         IsNaEDA | ||||
|     } | ||||
|  | ||||
|     IsXToOpenInsightMetrologyViewer, //MetrologyWS.SendData(file, string.Concat("http://", serverName, "/api/inbound/BioRad")); | ||||
|     IsXToIQSSi, //NA <d7p1:FileScanningIntervalInSeconds>-361</d7p1:FileScanningIntervalInSeconds> | ||||
|     IsXToOpenInsight, //bool WriteFileOpenInsight(BioRadFile | ||||
|     IsXToOpenInsightMetrologyViewerAttachments, //Site-None <d7p1:FileScanningIntervalInSeconds>-362</d7p1:FileScanningIntervalInSeconds> | ||||
|     IsXToAPC, | ||||
|     IsXToSPaCe, | ||||
|     IsXToArchive, | ||||
|     IsArchive, | ||||
|     IsDummy, | ||||
|     IsNaEDA | ||||
| } | ||||
| @ -4,69 +4,66 @@ using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.MET08THFTIRQS408M | ||||
| namespace Adaptation.FileHandlers.MET08THFTIRQS408M; | ||||
|  | ||||
| public class ProcessData | ||||
| { | ||||
|  | ||||
|     public class ProcessData | ||||
|     internal static List<Tuple<int, Enum, string>> HyphenTuples => new() | ||||
|     { | ||||
|         new Tuple<int, Enum, string>(0, Hyphen.IsNaEDA, @"\EC_EDA\Staging\Traces\~\Source"), | ||||
|         new Tuple<int, Enum, string>(15, Hyphen.IsXToOpenInsightMetrologyViewer, @"\EC_EAFLog\TracesMES\~\Source"), | ||||
|         new Tuple<int, Enum, string>(-36, Hyphen.IsXToIQSSi, @"\EC_SPC_Si\Traces\~\PollPath"), | ||||
|         new Tuple<int, Enum, string>(36, Hyphen.IsXToOpenInsight, @"\\messa01ec.ec.local\APPS\Metrology\~\Source"), | ||||
|         new Tuple<int, Enum, string>(-36, Hyphen.IsXToOpenInsightMetrologyViewerAttachments, @"\EC_Characterization_Si\In Process\~\Source"), | ||||
|         new Tuple<int, Enum, string>(360, Hyphen.IsXToAPC, @"\EC_APC\Staging\Traces\~\PollPath"), | ||||
|         new Tuple<int, Enum, string>(-36, Hyphen.IsXToSPaCe, @"\EC_SPC_Si\Traces\~\Source"), | ||||
|         new Tuple<int, Enum, string>(180, Hyphen.IsXToArchive, @"\EC_EAFLog\TracesArchive\~\Source"), | ||||
|         new Tuple<int, Enum, string>(36, Hyphen.IsArchive, @"\EC_Characterization_Si\Processed") | ||||
|         //new Tuple<int, Enum, string>("IsDummy" | ||||
|     }; | ||||
|  | ||||
|         internal static List<Tuple<int, Enum, string>> HyphenTuples => new() | ||||
|         { | ||||
|             new Tuple<int, Enum, string>(0, Hyphen.IsNaEDA, @"\EC_EDA\Staging\Traces\~\Source"), | ||||
|             new Tuple<int, Enum, string>(15, Hyphen.IsXToOpenInsightMetrologyViewer, @"\EC_EAFLog\TracesMES\~\Source"), | ||||
|             new Tuple<int, Enum, string>(-36, Hyphen.IsXToIQSSi, @"\EC_SPC_Si\Traces\~\PollPath"), | ||||
|             new Tuple<int, Enum, string>(36, Hyphen.IsXToOpenInsight, @"\\messa01ec.ec.local\APPS\Metrology\~\Source"), | ||||
|             new Tuple<int, Enum, string>(-36, Hyphen.IsXToOpenInsightMetrologyViewerAttachments, @"\EC_Characterization_Si\In Process\~\Source"), | ||||
|             new Tuple<int, Enum, string>(360, Hyphen.IsXToAPC, @"\EC_APC\Staging\Traces\~\PollPath"), | ||||
|             new Tuple<int, Enum, string>(-36, Hyphen.IsXToSPaCe, @"\EC_SPC_Si\Traces\~\Source"), | ||||
|             new Tuple<int, Enum, string>(180, Hyphen.IsXToArchive, @"\EC_EAFLog\TracesArchive\~\Source"), | ||||
|             new Tuple<int, Enum, string>(36, Hyphen.IsArchive, @"\EC_Characterization_Si\Processed") | ||||
|             //new Tuple<int, Enum, string>("IsDummy" | ||||
|         }; | ||||
|  | ||||
|         internal static string GetLines(IFileRead fileRead, Logistics logistics, List<QS408M.Description> descriptions) | ||||
|         { | ||||
|             StringBuilder results = new(); | ||||
|             char del = '\t'; | ||||
|             if (fileRead is null) | ||||
|             { } | ||||
|             if (logistics is null) | ||||
|             { } | ||||
|             QS408M.Description x = descriptions[0]; | ||||
|             results.Append(x.UniqueId).Append(del). | ||||
|                 Append(x.Date).Append(del). | ||||
|                 Append(x.Employee).Append(del). | ||||
|                 Append(x.Recipe).Append(del). | ||||
|                 Append(x.Reactor).Append(del). | ||||
|                 Append(x.RDS).Append(del). | ||||
|                 Append(x.PSN).Append(del). | ||||
|                 Append(x.Layer).Append(del). | ||||
|                 Append(x.Zone).Append(del). | ||||
|                 Append(x.Cassette).Append(del). | ||||
|                 Append(x.Wafer).Append(del). | ||||
|                 Append(x.RVThickness); | ||||
|             return results.ToString(); | ||||
|         } | ||||
|  | ||||
|         internal static void PostOpenInsightMetrologyViewerAttachments(IFileRead fileRead, Logistics logistics, string openInsightMetrologyViewerAPI, DateTime dateTime, string logisticsSequenceMemoryDirectory, List<QS408M.Description> descriptions, string matchDirectory) | ||||
|         { | ||||
|             if (fileRead is null) | ||||
|             { } | ||||
|             if (logistics is null) | ||||
|             { } | ||||
|             if (openInsightMetrologyViewerAPI is null) | ||||
|             { } | ||||
|             if (dateTime == DateTime.MinValue) | ||||
|             { } | ||||
|             if (logisticsSequenceMemoryDirectory is null) | ||||
|             { } | ||||
|             if (descriptions is null) | ||||
|             { } | ||||
|             if (matchDirectory is null) | ||||
|             { } | ||||
|             //Not used | ||||
|         } | ||||
|     internal static string GetLines(IFileRead fileRead, Logistics logistics, List<QS408M.Description> descriptions) | ||||
|     { | ||||
|         StringBuilder results = new(); | ||||
|         char del = '\t'; | ||||
|         if (fileRead is null) | ||||
|         { } | ||||
|         if (logistics is null) | ||||
|         { } | ||||
|         QS408M.Description x = descriptions[0]; | ||||
|         _ = results.Append(x.UniqueId).Append(del). | ||||
|             Append(x.Date).Append(del). | ||||
|             Append(x.Employee).Append(del). | ||||
|             Append(x.Recipe).Append(del). | ||||
|             Append(x.Reactor).Append(del). | ||||
|             Append(x.RDS).Append(del). | ||||
|             Append(x.PSN).Append(del). | ||||
|             Append(x.Layer).Append(del). | ||||
|             Append(x.Zone).Append(del). | ||||
|             Append(x.Cassette).Append(del). | ||||
|             Append(x.Wafer).Append(del). | ||||
|             Append(x.RVThickness); | ||||
|         return results.ToString(); | ||||
|     } | ||||
|  | ||||
|     internal static void PostOpenInsightMetrologyViewerAttachments(IFileRead fileRead, Logistics logistics, string openInsightMetrologyViewerAPI, DateTime dateTime, string logisticsSequenceMemoryDirectory, List<QS408M.Description> descriptions, string matchDirectory) | ||||
|     { | ||||
|         if (fileRead is null) | ||||
|         { } | ||||
|         if (logistics is null) | ||||
|         { } | ||||
|         if (openInsightMetrologyViewerAPI is null) | ||||
|         { } | ||||
|         if (dateTime == DateTime.MinValue) | ||||
|         { } | ||||
|         if (logisticsSequenceMemoryDirectory is null) | ||||
|         { } | ||||
|         if (descriptions is null) | ||||
|         { } | ||||
|         if (matchDirectory is null) | ||||
|         { } | ||||
|         //Not used | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -4,86 +4,83 @@ using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.MET08THFTIRQS408M | ||||
| namespace Adaptation.FileHandlers.MET08THFTIRQS408M; | ||||
|  | ||||
| public class WSRequest | ||||
| { | ||||
|     public bool SentToMetrology { get; set; } | ||||
|     public bool SentToSPC { get; set; } | ||||
|     // | ||||
|     public long Id { get; set; } | ||||
|     public string Batch { get; set; } | ||||
|     public string Cassette { get; set; } | ||||
|     public string CellName { get; set; } | ||||
|     public string Date { get; set; } | ||||
|     public string FilePath { get; set; } | ||||
|     public string Layer { get; set; } | ||||
|     public string MeanThickness { get; set; } | ||||
|     public string Op { get; set; } | ||||
|     public string PSN { get; set; } | ||||
|     public string PassFail { get; set; } | ||||
|     public string RDS { get; set; } | ||||
|     public string RVThickness { get; set; } | ||||
|     public string Reactor { get; set; } | ||||
|     public string Recipe { get; set; } | ||||
|     public string StdDev { get; set; } | ||||
|     public string Title { get; set; } | ||||
|     public string UniqueId { get; set; } | ||||
|     public string Wafer { get; set; } | ||||
|     public string Zone { get; set; } | ||||
|     public List<QS408M.Detail> Details { get; protected set; } | ||||
|  | ||||
|     public class WSRequest | ||||
|     [Obsolete("For json")] public WSRequest() { } | ||||
|  | ||||
|     internal WSRequest(IFileRead fileRead, Logistics logistics, List<QS408M.Description> descriptions) | ||||
|     { | ||||
|         public bool SentToMetrology { get; set; } | ||||
|         public bool SentToSPC { get; set; } | ||||
|         // | ||||
|         public long Id { get; set; } | ||||
|         public string Batch { get; set; } | ||||
|         public string Cassette { get; set; } | ||||
|         public string CellName { get; set; } | ||||
|         public string Date { get; set; } | ||||
|         public string FilePath { get; set; } | ||||
|         public string Layer { get; set; } | ||||
|         public string MeanThickness { get; set; } | ||||
|         public string Op { get; set; } | ||||
|         public string PSN { get; set; } | ||||
|         public string PassFail { get; set; } | ||||
|         public string RDS { get; set; } | ||||
|         public string RVThickness { get; set; } | ||||
|         public string Reactor { get; set; } | ||||
|         public string Recipe { get; set; } | ||||
|         public string StdDev { get; set; } | ||||
|         public string Title { get; set; } | ||||
|         public string UniqueId { get; set; } | ||||
|         public string Wafer { get; set; } | ||||
|         public string Zone { get; set; } | ||||
|         public List<QS408M.Detail> Details { get; protected set; } | ||||
|  | ||||
|         [Obsolete("For json")] public WSRequest() { } | ||||
|  | ||||
|         internal WSRequest(IFileRead fileRead, Logistics logistics, List<QS408M.Description> descriptions) | ||||
|         Id = 0; | ||||
|         FilePath = string.Empty; | ||||
|         if (fileRead is null) | ||||
|         { } | ||||
|         CellName = logistics.MesEntity; | ||||
|         if (descriptions[0] is not QS408M.Description x) | ||||
|             throw new Exception(); | ||||
|         Details = new List<QS408M.Detail>(); | ||||
|         //Header | ||||
|         { | ||||
|             Id = 0; | ||||
|             FilePath = string.Empty; | ||||
|             if (fileRead is null) | ||||
|             { } | ||||
|             CellName = logistics.MesEntity; | ||||
|             if (descriptions[0] is not QS408M.Description x) | ||||
|                 throw new Exception(); | ||||
|             Details = new List<QS408M.Detail>(); | ||||
|             //Header | ||||
|             { | ||||
|                 Batch = x.Lot; | ||||
|                 Cassette = x.Cassette; | ||||
|                 Date = x.Date; | ||||
|                 Op = x.Employee; | ||||
|                 Layer = x.Layer; | ||||
|                 MeanThickness = x.MeanThickness; | ||||
|                 PSN = x.PSN; | ||||
|                 PassFail = x.PassFail; | ||||
|                 RDS = x.RDS; | ||||
|                 RVThickness = x.RVThickness; | ||||
|                 Reactor = x.Reactor; | ||||
|                 Recipe = x.Recipe; | ||||
|                 StdDev = x.StdDev; | ||||
|                 Title = x.Title; | ||||
|                 UniqueId = x.UniqueId; | ||||
|                 Wafer = x.Wafer; | ||||
|                 Zone = x.Zone; | ||||
|             } | ||||
|             QS408M.Detail detail; | ||||
|             foreach (QS408M.Description description in descriptions) | ||||
|             { | ||||
|                 detail = new QS408M.Detail | ||||
|                 { | ||||
|                     HeaderUniqueId = description.HeaderUniqueId, | ||||
|                     Position = description.Position, | ||||
|                     Thickness = description.Thickness, | ||||
|                     UniqueId = description.UniqueId | ||||
|                 }; | ||||
|                 Details.Add(detail); | ||||
|             } | ||||
|             if (Date is null) | ||||
|                 Date = logistics.DateTimeFromSequence.ToString(); | ||||
|             if (UniqueId is null && Details.Any()) | ||||
|                 UniqueId = Details[0].HeaderUniqueId; | ||||
|             Batch = x.Lot; | ||||
|             Cassette = x.Cassette; | ||||
|             Date = x.Date; | ||||
|             Op = x.Employee; | ||||
|             Layer = x.Layer; | ||||
|             MeanThickness = x.MeanThickness; | ||||
|             PSN = x.PSN; | ||||
|             PassFail = x.PassFail; | ||||
|             RDS = x.RDS; | ||||
|             RVThickness = x.RVThickness; | ||||
|             Reactor = x.Reactor; | ||||
|             Recipe = x.Recipe; | ||||
|             StdDev = x.StdDev; | ||||
|             Title = x.Title; | ||||
|             UniqueId = x.UniqueId; | ||||
|             Wafer = x.Wafer; | ||||
|             Zone = x.Zone; | ||||
|         } | ||||
|  | ||||
|         QS408M.Detail detail; | ||||
|         foreach (QS408M.Description description in descriptions) | ||||
|         { | ||||
|             detail = new QS408M.Detail | ||||
|             { | ||||
|                 HeaderUniqueId = description.HeaderUniqueId, | ||||
|                 Position = description.Position, | ||||
|                 Thickness = description.Thickness, | ||||
|                 UniqueId = description.UniqueId | ||||
|             }; | ||||
|             Details.Add(detail); | ||||
|         } | ||||
|         if (Date is null) | ||||
|             Date = logistics.DateTimeFromSequence.ToString(); | ||||
|         if (UniqueId is null && Details.Any()) | ||||
|             UniqueId = Details[0].HeaderUniqueId; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -5,272 +5,265 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.QS408M | ||||
| namespace Adaptation.FileHandlers.QS408M; | ||||
|  | ||||
| public class Description : IDescription, Shared.Properties.IDescription | ||||
| { | ||||
|  | ||||
|     public class Description : IDescription, Shared.Properties.IDescription | ||||
|     public int Test { get; set; } | ||||
|     public int Count { get; set; } | ||||
|     public int Index { get; set; } | ||||
|     // | ||||
|     public string EventName { get; set; } | ||||
|     public string NullData { get; set; } | ||||
|     public string JobID { get; set; } | ||||
|     public string Sequence { get; set; } | ||||
|     public string MesEntity { get; set; } | ||||
|     public string ReportFullPath { get; set; } | ||||
|     public string ProcessJobID { get; set; } | ||||
|     public string MID { get; set; } | ||||
|     // | ||||
|     public string Date { get; set; } | ||||
|     public string Employee { get; set; } | ||||
|     public string Lot { get; set; } | ||||
|     public string PSN { get; set; } | ||||
|     public string Reactor { get; set; } | ||||
|     public string Recipe { get; set; } | ||||
|     // | ||||
|     public string Cassette { get; set; } | ||||
|     public string HeaderUniqueId { get; set; } | ||||
|     public string Layer { get; set; } | ||||
|     public string PassFail { get; set; } | ||||
|     public string Position { get; set; } | ||||
|     public string RDS { get; set; } | ||||
|     public string Title { get; set; } | ||||
|     public string UniqueId { get; set; } | ||||
|     public string Wafer { get; set; } | ||||
|     public string Zone { get; set; } | ||||
|     // | ||||
|     public string MeanThickness { get; set; } | ||||
|     public string RVThickness { get; set; } | ||||
|     public string StdDev { get; set; } | ||||
|     public string Thickness { get; set; } | ||||
|  | ||||
|     string IDescription.GetEventDescription() => "File Has been read and parsed"; | ||||
|  | ||||
|     List<string> IDescription.GetNames(IFileRead fileRead, Logistics logistics) | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         IDescription description = GetDefault(fileRead, logistics); | ||||
|         string json = JsonSerializer.Serialize(description, description.GetType()); | ||||
|         object @object = JsonSerializer.Deserialize<object>(json); | ||||
|         if (@object is not JsonElement jsonElement) | ||||
|             throw new Exception(); | ||||
|         foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) | ||||
|             results.Add(jsonProperty.Name); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
|         public int Test { get; set; } | ||||
|         public int Count { get; set; } | ||||
|         public int Index { get; set; } | ||||
|         // | ||||
|         public string EventName { get; set; } | ||||
|         public string NullData { get; set; } | ||||
|         public string JobID { get; set; } | ||||
|         public string Sequence { get; set; } | ||||
|         public string MesEntity { get; set; } | ||||
|         public string ReportFullPath { get; set; } | ||||
|         public string ProcessJobID { get; set; } | ||||
|         public string MID { get; set; } | ||||
|         // | ||||
|         public string Date { get; set; } | ||||
|         public string Employee { get; set; } | ||||
|         public string Lot { get; set; } | ||||
|         public string PSN { get; set; } | ||||
|         public string Reactor { get; set; } | ||||
|         public string Recipe { get; set; } | ||||
|         // | ||||
|         public string Cassette { get; set; } | ||||
|         public string HeaderUniqueId { get; set; } | ||||
|         public string Layer { get; set; } | ||||
|         public string PassFail { get; set; } | ||||
|         public string Position { get; set; } | ||||
|         public string RDS { get; set; } | ||||
|         public string Title { get; set; } | ||||
|         public string UniqueId { get; set; } | ||||
|         public string Wafer { get; set; } | ||||
|         public string Zone { get; set; } | ||||
|         // | ||||
|         public string MeanThickness { get; set; } | ||||
|         public string RVThickness { get; set; } | ||||
|         public string StdDev { get; set; } | ||||
|         public string Thickness { get; set; } | ||||
|  | ||||
|         string IDescription.GetEventDescription() | ||||
|     List<string> IDescription.GetDetailNames() | ||||
|     { | ||||
|         List<string> results = new() | ||||
|         { | ||||
|             return "File Has been read and parsed"; | ||||
|             nameof(Cassette), | ||||
|             nameof(HeaderUniqueId), | ||||
|             nameof(Layer), | ||||
|             nameof(PassFail), | ||||
|             nameof(Position), | ||||
|             nameof(RDS), | ||||
|             nameof(Title), | ||||
|             nameof(UniqueId), | ||||
|             nameof(Wafer), | ||||
|             nameof(Zone) | ||||
|         }; | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<string> IDescription.GetHeaderNames() | ||||
|     { | ||||
|         List<string> results = new() | ||||
|         { | ||||
|             nameof(Date), | ||||
|             nameof(Employee), | ||||
|             nameof(Lot), | ||||
|             nameof(PSN), | ||||
|             nameof(Reactor), | ||||
|             nameof(Recipe) | ||||
|         }; | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     IDescription IDescription.GetDisplayNames() | ||||
|     { | ||||
|         Description result = GetDisplayNames(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     List<string> IDescription.GetParameterNames() | ||||
|     { | ||||
|         List<string> results = new() | ||||
|         { | ||||
|             nameof(MeanThickness), | ||||
|             nameof(RVThickness), | ||||
|             nameof(StdDev), | ||||
|             nameof(Thickness) | ||||
|         }; | ||||
|         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<object>(json); | ||||
|         results = ((JsonElement)@object).EnumerateObject().ToArray(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<string> IDescription.GetPairedParameterNames() | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<string> IDescription.GetIgnoreParameterNames(Test test) | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     IDescription IDescription.GetDefaultDescription(IFileRead fileRead, Logistics logistics) | ||||
|     { | ||||
|         Description result = GetDefault(fileRead, logistics); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     Dictionary<string, string> IDescription.GetDisplayNamesJsonElement(IFileRead fileRead) | ||||
|     { | ||||
|         Dictionary<string, string> results = new(); | ||||
|         IDescription description = GetDisplayNames(); | ||||
|         string json = JsonSerializer.Serialize(description, description.GetType()); | ||||
|         JsonElement jsonElement = JsonSerializer.Deserialize<JsonElement>(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<string> IDescription.GetNames(IFileRead fileRead, Logistics logistics) | ||||
|     List<IDescription> IDescription.GetDescriptions(IFileRead fileRead, Logistics logistics, List<Test> tests, IProcessData iProcessData) | ||||
|     { | ||||
|         List<IDescription> results = new(); | ||||
|         if (iProcessData is null || !iProcessData.Details.Any() || iProcessData is not ProcessData processData) | ||||
|             results.Add(GetDefault(fileRead, logistics)); | ||||
|         else | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             IDescription description = GetDefault(fileRead, logistics); | ||||
|             string json = JsonSerializer.Serialize(description, description.GetType()); | ||||
|             object @object = JsonSerializer.Deserialize<object>(json); | ||||
|             if (@object is not JsonElement jsonElement) | ||||
|                 throw new Exception(); | ||||
|             foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) | ||||
|                 results.Add(jsonProperty.Name); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetDetailNames() | ||||
|         { | ||||
|             List<string> results = new() | ||||
|             { | ||||
|                 nameof(Cassette), | ||||
|                 nameof(HeaderUniqueId), | ||||
|                 nameof(Layer), | ||||
|                 nameof(PassFail), | ||||
|                 nameof(Position), | ||||
|                 nameof(RDS), | ||||
|                 nameof(Title), | ||||
|                 nameof(UniqueId), | ||||
|                 nameof(Wafer), | ||||
|                 nameof(Zone) | ||||
|             }; | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetHeaderNames() | ||||
|         { | ||||
|             List<string> results = new() | ||||
|             { | ||||
|                 nameof(Date), | ||||
|                 nameof(Employee), | ||||
|                 nameof(Lot), | ||||
|                 nameof(PSN), | ||||
|                 nameof(Reactor), | ||||
|                 nameof(Recipe) | ||||
|             }; | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         IDescription IDescription.GetDisplayNames() | ||||
|         { | ||||
|             Description result = GetDisplayNames(); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetParameterNames() | ||||
|         { | ||||
|             List<string> results = new() | ||||
|             { | ||||
|                 nameof(MeanThickness), | ||||
|                 nameof(RVThickness), | ||||
|                 nameof(StdDev), | ||||
|                 nameof(Thickness) | ||||
|             }; | ||||
|             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<object>(json); | ||||
|             results = ((JsonElement)@object).EnumerateObject().ToArray(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetPairedParameterNames() | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetIgnoreParameterNames(Test test) | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         IDescription IDescription.GetDefaultDescription(IFileRead fileRead, Logistics logistics) | ||||
|         { | ||||
|             Description result = GetDefault(fileRead, logistics); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         Dictionary<string, string> IDescription.GetDisplayNamesJsonElement(IFileRead fileRead) | ||||
|         { | ||||
|             Dictionary<string, string> results = new(); | ||||
|             IDescription description = GetDisplayNames(); | ||||
|             string json = JsonSerializer.Serialize(description, description.GetType()); | ||||
|             JsonElement jsonElement = JsonSerializer.Deserialize<JsonElement>(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> IDescription.GetDescriptions(IFileRead fileRead, Logistics logistics, List<Test> tests, IProcessData iProcessData) | ||||
|         { | ||||
|             List<IDescription> results = new(); | ||||
|             if (iProcessData is null || !iProcessData.Details.Any() || iProcessData is not ProcessData processData) | ||||
|                 results.Add(GetDefault(fileRead, logistics)); | ||||
|             string nullData; | ||||
|             Description description; | ||||
|             object configDataNullData = fileRead.NullData; | ||||
|             if (configDataNullData is null) | ||||
|                 nullData = string.Empty; | ||||
|             else | ||||
|                 nullData = configDataNullData.ToString(); | ||||
|             for (int i = 0; i < iProcessData.Details.Count; i++) | ||||
|             { | ||||
|                 string nullData; | ||||
|                 Description description; | ||||
|                 object configDataNullData = fileRead.NullData; | ||||
|                 if (configDataNullData is null) | ||||
|                     nullData = string.Empty; | ||||
|                 else | ||||
|                     nullData = configDataNullData.ToString(); | ||||
|                 for (int i = 0; i < iProcessData.Details.Count; i++) | ||||
|                 if (iProcessData.Details[i] is not Detail detail) | ||||
|                     continue; | ||||
|                 description = new Description | ||||
|                 { | ||||
|                     if (iProcessData.Details[i] is not Detail detail) | ||||
|                         continue; | ||||
|                     description = new Description | ||||
|                     { | ||||
|                         Test = (int)tests[i], | ||||
|                         Count = tests.Count, | ||||
|                         Index = i, | ||||
|                         // | ||||
|                         EventName = fileRead.EventName, | ||||
|                         NullData = nullData, | ||||
|                         JobID = fileRead.CellInstanceName, | ||||
|                         Sequence = logistics.Sequence.ToString(), | ||||
|                         MesEntity = logistics.MesEntity, | ||||
|                         ReportFullPath = logistics.ReportFullPath, | ||||
|                         ProcessJobID = logistics.ProcessJobID, | ||||
|                         MID = logistics.MID, | ||||
|                         // | ||||
|                         Date = processData.Date, | ||||
|                         Employee = processData.Employee, | ||||
|                         Lot = processData.Batch, | ||||
|                         PSN = processData.PSN, | ||||
|                         Reactor = processData.Reactor, | ||||
|                         Recipe = processData.Recipe, | ||||
|                         // | ||||
|                         Cassette = processData.Cassette, | ||||
|                         HeaderUniqueId = detail.HeaderUniqueId, | ||||
|                         Layer = processData.Layer, | ||||
|                         PassFail = processData.PassFail, | ||||
|                         Position = detail.Position, | ||||
|                         RDS = processData.RDS, | ||||
|                         Title = processData.Title, | ||||
|                         UniqueId = detail.UniqueId, | ||||
|                         Wafer = processData.Wafer, | ||||
|                         Zone = processData.Zone, | ||||
|                         // | ||||
|                         MeanThickness = processData.MeanThickness, | ||||
|                         RVThickness = processData.RVThickness, | ||||
|                         StdDev = processData.StdDev, | ||||
|                         Thickness = detail.Thickness | ||||
|                     }; | ||||
|                     results.Add(description); | ||||
|                 } | ||||
|                     Test = (int)tests[i], | ||||
|                     Count = tests.Count, | ||||
|                     Index = i, | ||||
|                     // | ||||
|                     EventName = fileRead.EventName, | ||||
|                     NullData = nullData, | ||||
|                     JobID = fileRead.CellInstanceName, | ||||
|                     Sequence = logistics.Sequence.ToString(), | ||||
|                     MesEntity = logistics.MesEntity, | ||||
|                     ReportFullPath = logistics.ReportFullPath, | ||||
|                     ProcessJobID = logistics.ProcessJobID, | ||||
|                     MID = logistics.MID, | ||||
|                     // | ||||
|                     Date = processData.Date, | ||||
|                     Employee = processData.Employee, | ||||
|                     Lot = processData.Batch, | ||||
|                     PSN = processData.PSN, | ||||
|                     Reactor = processData.Reactor, | ||||
|                     Recipe = processData.Recipe, | ||||
|                     // | ||||
|                     Cassette = processData.Cassette, | ||||
|                     HeaderUniqueId = detail.HeaderUniqueId, | ||||
|                     Layer = processData.Layer, | ||||
|                     PassFail = processData.PassFail, | ||||
|                     Position = detail.Position, | ||||
|                     RDS = processData.RDS, | ||||
|                     Title = processData.Title, | ||||
|                     UniqueId = detail.UniqueId, | ||||
|                     Wafer = processData.Wafer, | ||||
|                     Zone = processData.Zone, | ||||
|                     // | ||||
|                     MeanThickness = processData.MeanThickness, | ||||
|                     RVThickness = processData.RVThickness, | ||||
|                     StdDev = processData.StdDev, | ||||
|                     Thickness = detail.Thickness | ||||
|                 }; | ||||
|                 results.Add(description); | ||||
|             } | ||||
|             return results; | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         private Description GetDisplayNames() | ||||
|     private Description GetDisplayNames() | ||||
|     { | ||||
|         Description result = new(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private Description GetDefault(IFileRead fileRead, Logistics logistics) | ||||
|     { | ||||
|         Description result = new() | ||||
|         { | ||||
|             Description result = new(); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         private Description GetDefault(IFileRead fileRead, Logistics logistics) | ||||
|         { | ||||
|             Description result = new() | ||||
|             { | ||||
|                 Test = -1, | ||||
|                 Count = 0, | ||||
|                 Index = -1, | ||||
|                 // | ||||
|                 EventName = fileRead.EventName, | ||||
|                 NullData = fileRead.NullData, | ||||
|                 JobID = fileRead.CellInstanceName, | ||||
|                 Sequence = logistics.Sequence.ToString(), | ||||
|                 MesEntity = fileRead.MesEntity, | ||||
|                 ReportFullPath = logistics.ReportFullPath, | ||||
|                 ProcessJobID = logistics.ProcessJobID, | ||||
|                 MID = logistics.MID, | ||||
|                 // | ||||
|                 Date = nameof(Date), | ||||
|                 Employee = nameof(Employee), | ||||
|                 Lot = nameof(Lot), | ||||
|                 PSN = nameof(PSN), | ||||
|                 Reactor = nameof(Reactor), | ||||
|                 Recipe = nameof(Recipe), | ||||
|                 // | ||||
|                 Cassette = nameof(Cassette), | ||||
|                 HeaderUniqueId = nameof(HeaderUniqueId), | ||||
|                 Layer = nameof(Layer), | ||||
|                 PassFail = nameof(PassFail), | ||||
|                 Position = nameof(Position), | ||||
|                 RDS = nameof(RDS), | ||||
|                 Title = nameof(Title), | ||||
|                 UniqueId = nameof(UniqueId), | ||||
|                 Wafer = nameof(Wafer), | ||||
|                 Zone = nameof(Zone), | ||||
|                 // | ||||
|                 MeanThickness = nameof(MeanThickness), | ||||
|                 RVThickness = nameof(RVThickness), | ||||
|                 StdDev = nameof(StdDev), | ||||
|                 Thickness = nameof(Thickness) | ||||
|             }; | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|             Test = -1, | ||||
|             Count = 0, | ||||
|             Index = -1, | ||||
|             // | ||||
|             EventName = fileRead.EventName, | ||||
|             NullData = fileRead.NullData, | ||||
|             JobID = fileRead.CellInstanceName, | ||||
|             Sequence = logistics.Sequence.ToString(), | ||||
|             MesEntity = fileRead.MesEntity, | ||||
|             ReportFullPath = logistics.ReportFullPath, | ||||
|             ProcessJobID = logistics.ProcessJobID, | ||||
|             MID = logistics.MID, | ||||
|             // | ||||
|             Date = nameof(Date), | ||||
|             Employee = nameof(Employee), | ||||
|             Lot = nameof(Lot), | ||||
|             PSN = nameof(PSN), | ||||
|             Reactor = nameof(Reactor), | ||||
|             Recipe = nameof(Recipe), | ||||
|             // | ||||
|             Cassette = nameof(Cassette), | ||||
|             HeaderUniqueId = nameof(HeaderUniqueId), | ||||
|             Layer = nameof(Layer), | ||||
|             PassFail = nameof(PassFail), | ||||
|             Position = nameof(Position), | ||||
|             RDS = nameof(RDS), | ||||
|             Title = nameof(Title), | ||||
|             UniqueId = nameof(UniqueId), | ||||
|             Wafer = nameof(Wafer), | ||||
|             Zone = nameof(Zone), | ||||
|             // | ||||
|             MeanThickness = nameof(MeanThickness), | ||||
|             RVThickness = nameof(RVThickness), | ||||
|             StdDev = nameof(StdDev), | ||||
|             Thickness = nameof(Thickness) | ||||
|         }; | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,19 +1,13 @@ | ||||
| namespace Adaptation.FileHandlers.QS408M | ||||
| namespace Adaptation.FileHandlers.QS408M; | ||||
|  | ||||
| public class Detail | ||||
| { | ||||
|  | ||||
|     public class Detail | ||||
|     { | ||||
|     public string HeaderUniqueId { get; set; } | ||||
|     public string Position { get; set; } | ||||
|     public string Thickness { get; set; } | ||||
|     public string UniqueId { get; set; } | ||||
|  | ||||
|         public string HeaderUniqueId { get; set; } | ||||
|         public string Position { get; set; } | ||||
|         public string Thickness { get; set; } | ||||
|         public string UniqueId { get; set; } | ||||
|  | ||||
|         public override string ToString() | ||||
|         { | ||||
|             return string.Concat(Position, ";", Thickness, ";"); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|     public override string ToString() => string.Concat(Position, ";", Thickness, ";"); | ||||
|  | ||||
| } | ||||
| @ -9,142 +9,122 @@ using System.Linq; | ||||
| using System.Text.Json; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.QS408M | ||||
| namespace Adaptation.FileHandlers.QS408M; | ||||
|  | ||||
| public class FileRead : Shared.FileRead, IFileRead | ||||
| { | ||||
|  | ||||
|     public class FileRead : Shared.FileRead, IFileRead | ||||
|     private readonly string _OriginalDataBioRad; | ||||
|     private readonly ProcessData _LastProcessData; | ||||
|  | ||||
|     public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : | ||||
|         base(new Description(), true, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) | ||||
|     { | ||||
|         _MinFileLength = 10; | ||||
|         _NullData = string.Empty; | ||||
|         _Logistics = new Logistics(this); | ||||
|         if (_FileParameter is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (_ModelObjectParameterDefinitions is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (_IsDuplicator) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         _OriginalDataBioRad = "OriginalDataBioRad_"; | ||||
|         _LastProcessData = new(); | ||||
|     } | ||||
|  | ||||
|         private readonly string _OriginalDataBioRad; | ||||
|         private readonly ProcessData _LastProcessData; | ||||
|     void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) => Move(extractResults, exception); | ||||
|  | ||||
|         public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted, int hyphenXToArchive, int hyphenIsArchive) : | ||||
|             base(new Description(), true, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted, hyphenXToArchive, hyphenIsArchive) | ||||
|     void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); | ||||
|  | ||||
|     string IFileRead.GetEventDescription() | ||||
|     { | ||||
|         string result = _Description.GetEventDescription(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     List<string> IFileRead.GetHeaderNames() | ||||
|     { | ||||
|         List<string> results = _Description.GetHeaderNames(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     string[] IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, string> IFileRead.GetDisplayNamesJsonElement() | ||||
|     { | ||||
|         Dictionary<string, string> results = _Description.GetDisplayNamesJsonElement(this); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<IDescription> IFileRead.GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData) | ||||
|     { | ||||
|         List<IDescription> results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.GetExtractResult(string reportFullPath, string eventName) | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, Test[], JsonElement[], List<FileInfo>>(results.Item1, Array.Empty<Test>(), JsonSerializer.Deserialize<JsonElement[]>("[]"), results.Item4); | ||||
|         if (results.Item3.Length > 0 && _IsEAFHosted) | ||||
|             WritePDSF(this, results.Item3); | ||||
|         UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.ReExtract() | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|         List<string> headerNames = _Description.GetHeaderNames(); | ||||
|         Dictionary<string, string> keyValuePairs = _Description.GetDisplayNamesJsonElement(this); | ||||
|         results = ReExtract(this, headerNames, keyValuePairs); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     void IFileRead.CheckTests(Test[] tests, bool extra) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); | ||||
|  | ||||
|     void IFileRead.Callback(object state) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); | ||||
|  | ||||
|     private Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, DateTime dateTime) | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results = new(string.Empty, null, null, new List<FileInfo>()); | ||||
|         _Logistics = new Logistics(this, reportFullPath, useSplitForMID: true); | ||||
|         SetFileParameterLotIDToLogisticsMID(); | ||||
|         if (reportFullPath.Length < _MinFileLength) | ||||
|             results.Item4.Add(new FileInfo(reportFullPath)); | ||||
|         else | ||||
|         { | ||||
|             _MinFileLength = 10; | ||||
|             _NullData = string.Empty; | ||||
|             _Logistics = new Logistics(this); | ||||
|             if (_FileParameter is null) | ||||
|                 throw new Exception(cellInstanceConnectionName); | ||||
|             if (_ModelObjectParameterDefinitions is null) | ||||
|                 throw new Exception(cellInstanceConnectionName); | ||||
|             if (_IsDuplicator) | ||||
|                 throw new Exception(cellInstanceConnectionName); | ||||
|             _OriginalDataBioRad = "OriginalDataBioRad_"; | ||||
|             _LastProcessData = new(); | ||||
|         } | ||||
|  | ||||
|         void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) | ||||
|         { | ||||
|             Move(this, extractResults, exception); | ||||
|         } | ||||
|  | ||||
|         void IFileRead.WaitForThread() | ||||
|         { | ||||
|             WaitForThread(thread: null, threadExceptions: null); | ||||
|         } | ||||
|  | ||||
|         string IFileRead.GetEventDescription() | ||||
|         { | ||||
|             string result = _Description.GetEventDescription(); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         List<string> IFileRead.GetHeaderNames() | ||||
|         { | ||||
|             List<string> results = _Description.GetHeaderNames(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         string[] IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, string> IFileRead.GetDisplayNamesJsonElement() | ||||
|         { | ||||
|             Dictionary<string, string> results = _Description.GetDisplayNamesJsonElement(this); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<IDescription> IFileRead.GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData) | ||||
|         { | ||||
|             List<IDescription> results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.GetExtractResult(string reportFullPath, string eventName) | ||||
|         { | ||||
|             Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, Test[], JsonElement[], List<FileInfo>>(results.Item1, new Test[] { }, JsonSerializer.Deserialize<JsonElement[]>("[]"), results.Item4); | ||||
|             if (results.Item3.Length > 0 && _IsEAFHosted) | ||||
|                 WritePDSF(this, results.Item3); | ||||
|             UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.ReExtract() | ||||
|         { | ||||
|             Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|             List<string> headerNames = _Description.GetHeaderNames(); | ||||
|             Dictionary<string, string> keyValuePairs = _Description.GetDisplayNamesJsonElement(this); | ||||
|             results = ReExtract(this, headerNames, keyValuePairs); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         void IFileRead.CheckTests(Test[] tests, bool extra) | ||||
|         { | ||||
|             throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); | ||||
|         } | ||||
|  | ||||
|         void IFileRead.MoveArchive() | ||||
|         { | ||||
|             throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); | ||||
|         } | ||||
|  | ||||
|         void IFileRead.Callback(object state) | ||||
|         { | ||||
|             throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); | ||||
|         } | ||||
|  | ||||
|         private Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, DateTime dateTime) | ||||
|         { | ||||
|             Tuple<string, Test[], JsonElement[], List<FileInfo>> results = new(string.Empty, null, null, new List<FileInfo>()); | ||||
|             _Logistics = new Logistics(this, reportFullPath, useSplitForMID: true); | ||||
|             SetFileParameterLotIDToLogisticsMID(); | ||||
|             if (reportFullPath.Length < _MinFileLength) | ||||
|                 results.Item4.Add(new FileInfo(reportFullPath)); | ||||
|             else | ||||
|             IProcessData iProcessData = new ProcessData(this, _Logistics, results.Item4, _OriginalDataBioRad, lastProcessData: _LastProcessData); | ||||
|             if (iProcessData is ProcessData processData) | ||||
|             { | ||||
|                 IProcessData iProcessData = new ProcessData(this, _Logistics, results.Item4, _OriginalDataBioRad, lastProcessData: _LastProcessData); | ||||
|                 if (iProcessData is ProcessData processData) | ||||
|                 { | ||||
|                     string mid = string.Concat(processData.Reactor, "-", processData.RDS, "-", processData.PSN); | ||||
|                     mid = Regex.Replace(mid, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; | ||||
|                     _Logistics.MID = mid; | ||||
|                     SetFileParameterLotID(mid); | ||||
|                     _Logistics.ProcessJobID = processData.Reactor; | ||||
|                 } | ||||
|                 if (!iProcessData.Details.Any()) | ||||
|                     throw new Exception(string.Concat("No Data - ", dateTime.Ticks)); | ||||
|                 results = iProcessData.GetResults(this, _Logistics, results.Item4); | ||||
|                 string mid = string.Concat(processData.Reactor, "-", processData.RDS, "-", processData.PSN); | ||||
|                 mid = Regex.Replace(mid, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; | ||||
|                 _Logistics.MID = mid; | ||||
|                 SetFileParameterLotID(mid); | ||||
|                 _Logistics.ProcessJobID = processData.Reactor; | ||||
|             } | ||||
|             return results; | ||||
|             if (!iProcessData.Details.Any()) | ||||
|                 throw new Exception(string.Concat("No Data - ", dateTime.Ticks)); | ||||
|             results = iProcessData.GetResults(this, _Logistics, results.Item4); | ||||
|         } | ||||
|  | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -11,425 +11,419 @@ using System.Text; | ||||
| using System.Text.Json; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.QS408M | ||||
| namespace Adaptation.FileHandlers.QS408M; | ||||
|  | ||||
| public partial class ProcessData : IProcessData | ||||
| { | ||||
|  | ||||
|     public partial class ProcessData : IProcessData | ||||
|     private readonly List<object> _Details; | ||||
|  | ||||
|     public string JobID { get; set; } | ||||
|     public string MesEntity { get; set; } | ||||
|     public string Batch { get; set; } | ||||
|     public string Cassette { get; set; } | ||||
|     public string Date { get; set; } | ||||
|     public string Employee { get; set; } | ||||
|     public string Layer { get; set; } | ||||
|     public string MeanThickness { get; set; } | ||||
|     public string PSN { get; set; } | ||||
|     public string PassFail { get; set; } | ||||
|     public string RDS { get; set; } | ||||
|     public string RVThickness { get; set; } | ||||
|     public string Reactor { get; set; } | ||||
|     public string Recipe { get; set; } | ||||
|     public string StdDev { get; set; } | ||||
|     public string Title { get; set; } | ||||
|     public string UniqueId { get; set; } | ||||
|     public string Wafer { get; set; } | ||||
|     public string Zone { get; set; } | ||||
|  | ||||
|     List<object> Shared.Properties.IProcessData.Details => _Details; | ||||
|  | ||||
|     private int _I; | ||||
|     private string _Data; | ||||
|     private readonly ILog _Log; | ||||
|  | ||||
|     public ProcessData() | ||||
|     { | ||||
|     } | ||||
|  | ||||
|         private readonly List<object> _Details; | ||||
|     public ProcessData(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection, string originalDataBioRad, ProcessData lastProcessData) | ||||
|     { | ||||
|         JobID = logistics.JobID; | ||||
|         fileInfoCollection.Clear(); | ||||
|         _Details = new List<object>(); | ||||
|         MesEntity = logistics.MesEntity; | ||||
|         _Log = LogManager.GetLogger(typeof(ProcessData)); | ||||
|         Parse(fileRead, logistics, fileInfoCollection, originalDataBioRad, lastProcessData); | ||||
|     } | ||||
|  | ||||
|         public string JobID { get; set; } | ||||
|         public string MesEntity { get; set; } | ||||
|         public string Batch { get; set; } | ||||
|         public string Cassette { get; set; } | ||||
|         public string Date { get; set; } | ||||
|         public string Employee { get; set; } | ||||
|         public string Layer { get; set; } | ||||
|         public string MeanThickness { get; set; } | ||||
|         public string PSN { get; set; } | ||||
|         public string PassFail { get; set; } | ||||
|         public string RDS { get; set; } | ||||
|         public string RVThickness { get; set; } | ||||
|         public string Reactor { get; set; } | ||||
|         public string Recipe { get; set; } | ||||
|         public string StdDev { get; set; } | ||||
|         public string Title { get; set; } | ||||
|         public string UniqueId { get; set; } | ||||
|         public string Wafer { get; set; } | ||||
|         public string Zone { get; set; } | ||||
|     string IProcessData.GetCurrentReactor(IFileRead fileRead, Logistics logistics, Dictionary<string, string> reactors) => throw new Exception(string.Concat("See ", nameof(Parse))); | ||||
|  | ||||
|         List<object> Shared.Properties.IProcessData.Details => _Details; | ||||
|  | ||||
|         private int _I; | ||||
|         private string _Data; | ||||
|         private readonly ILog _Log; | ||||
|  | ||||
|         public ProcessData() | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IProcessData.GetResults(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection) | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|         List<Test> tests = new(); | ||||
|         foreach (object item in _Details) | ||||
|             tests.Add(Test.BioRadQS408M); | ||||
|         List<IDescription> descriptions = fileRead.GetDescriptions(fileRead, tests, this); | ||||
|         if (tests.Count != descriptions.Count) | ||||
|             throw new Exception(); | ||||
|         for (int i = 0; i < tests.Count; i++) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         public ProcessData(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection, string originalDataBioRad, ProcessData lastProcessData) | ||||
|         { | ||||
|             JobID = logistics.JobID; | ||||
|             fileInfoCollection.Clear(); | ||||
|             _Details = new List<object>(); | ||||
|             MesEntity = logistics.MesEntity; | ||||
|             _Log = LogManager.GetLogger(typeof(ProcessData)); | ||||
|             Parse(fileRead, logistics, fileInfoCollection, originalDataBioRad, lastProcessData); | ||||
|         } | ||||
|  | ||||
|         string IProcessData.GetCurrentReactor(IFileRead fileRead, Logistics logistics, Dictionary<string, string> reactors) | ||||
|         { | ||||
|             throw new Exception(string.Concat("See ", nameof(Parse))); | ||||
|         } | ||||
|  | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> IProcessData.GetResults(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection) | ||||
|         { | ||||
|             Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|             List<Test> tests = new(); | ||||
|             foreach (object item in _Details) | ||||
|                 tests.Add(Test.BioRadQS408M); | ||||
|             List<IDescription> descriptions = fileRead.GetDescriptions(fileRead, tests, this); | ||||
|             if (tests.Count != descriptions.Count) | ||||
|             if (descriptions[i] is not Description description) | ||||
|                 throw new Exception(); | ||||
|             if (description.Test != (int)tests[i]) | ||||
|                 throw new Exception(); | ||||
|             for (int i = 0; i < tests.Count; i++) | ||||
|             { | ||||
|                 if (descriptions[i] is not Description description) | ||||
|                     throw new Exception(); | ||||
|                 if (description.Test != (int)tests[i]) | ||||
|                     throw new Exception(); | ||||
|             } | ||||
|             List<Description> fileReadDescriptions = (from l in descriptions select (Description)l).ToList(); | ||||
|             string json = JsonSerializer.Serialize(fileReadDescriptions, fileReadDescriptions.GetType()); | ||||
|             JsonElement[] jsonElements = JsonSerializer.Deserialize<JsonElement[]>(json); | ||||
|             results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(logistics.Logistics1[0], tests.ToArray(), jsonElements, fileInfoCollection); | ||||
|             return results; | ||||
|         } | ||||
|         List<Description> fileReadDescriptions = (from l in descriptions select (Description)l).ToList(); | ||||
|         string json = JsonSerializer.Serialize(fileReadDescriptions, fileReadDescriptions.GetType()); | ||||
|         JsonElement[] jsonElements = JsonSerializer.Deserialize<JsonElement[]>(json); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(logistics.Logistics1[0], tests.ToArray(), jsonElements, fileInfoCollection); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         private string GetBefore(string text) | ||||
|     private string GetBefore(string text) | ||||
|     { | ||||
|         string str; | ||||
|         string str1; | ||||
|         int num = _Data.IndexOf(text, _I); | ||||
|         if (num <= -1) | ||||
|         { | ||||
|             str = _Data.Substring(_I); | ||||
|             _I = _Data.Length; | ||||
|             str1 = str.Trim(); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             str = _Data.Substring(_I, num - _I); | ||||
|             _I = num + text.Length; | ||||
|             str1 = str.Trim(); | ||||
|         } | ||||
|         return str1; | ||||
|     } | ||||
|  | ||||
|     private string GetBefore(string text, bool trim) | ||||
|     { | ||||
|         string str; | ||||
|         string before; | ||||
|         if (!trim) | ||||
|         { | ||||
|             string str; | ||||
|             string str1; | ||||
|             int num = _Data.IndexOf(text, _I); | ||||
|             if (num <= -1) | ||||
|             { | ||||
|                 str = _Data.Substring(_I); | ||||
|                 _I = _Data.Length; | ||||
|                 str1 = str.Trim(); | ||||
|                 before = str; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 str = _Data.Substring(_I, num - _I); | ||||
|                 _I = num + text.Length; | ||||
|                 str1 = str.Trim(); | ||||
|                 before = str; | ||||
|             } | ||||
|             return str1; | ||||
|         } | ||||
|  | ||||
|         private string GetBefore(string text, bool trim) | ||||
|         else | ||||
|         { | ||||
|             string str; | ||||
|             string before; | ||||
|             if (!trim) | ||||
|             before = GetBefore(text); | ||||
|         } | ||||
|         return before; | ||||
|     } | ||||
|  | ||||
|     private string GetToEOL() | ||||
|     { | ||||
|         string result; | ||||
|         if (_Data.IndexOf("\n", _I) > -1) | ||||
|             result = GetBefore("\n"); | ||||
|         else | ||||
|             result = GetBefore(Environment.NewLine); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private string GetToEOL(bool trim) | ||||
|     { | ||||
|         string str; | ||||
|         if (_Data.IndexOf("\n", _I) > -1) | ||||
|             str = (!trim ? GetBefore("\n", false) : GetToEOL()); | ||||
|         else | ||||
|             str = (!trim ? GetBefore(Environment.NewLine, false) : GetToEOL()); | ||||
|         return str; | ||||
|     } | ||||
|  | ||||
|     private string GetToken() | ||||
|     { | ||||
|         while (true) | ||||
|         { | ||||
|             if (_I >= _Data.Length || !IsNullOrWhiteSpace(_Data.Substring(_I, 1))) | ||||
|             { | ||||
|                 int num = _Data.IndexOf(text, _I); | ||||
|                 if (num <= -1) | ||||
|                 { | ||||
|                     str = _Data.Substring(_I); | ||||
|                     _I = _Data.Length; | ||||
|                     before = str; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     str = _Data.Substring(_I, num - _I); | ||||
|                     _I = num + text.Length; | ||||
|                     before = str; | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|             else | ||||
|             _I++; | ||||
|         } | ||||
|         int num = _I; | ||||
|         while (true) | ||||
|         { | ||||
|             if (num >= _Data.Length || IsNullOrWhiteSpace(_Data.Substring(num, 1))) | ||||
|             { | ||||
|                 before = GetBefore(text); | ||||
|                 break; | ||||
|             } | ||||
|             return before; | ||||
|             num++; | ||||
|         } | ||||
|         string str = _Data.Substring(_I, num - _I); | ||||
|         _I = num; | ||||
|         return str.Trim(); | ||||
|     } | ||||
|  | ||||
|         private string GetToEOL() | ||||
|         { | ||||
|             string result; | ||||
|             if (_Data.IndexOf("\n", _I) > -1) | ||||
|                 result = GetBefore("\n"); | ||||
|             else | ||||
|                 result = GetBefore(Environment.NewLine); | ||||
|             return result; | ||||
|         } | ||||
|     private string GetToText(string text) | ||||
|     { | ||||
|         string str = _Data.Substring(_I, _Data.IndexOf(text, _I) - _I).Trim(); | ||||
|         return str; | ||||
|     } | ||||
|  | ||||
|         private string GetToEOL(bool trim) | ||||
|         { | ||||
|             string str; | ||||
|             if (_Data.IndexOf("\n", _I) > -1) | ||||
|                 str = (!trim ? GetBefore("\n", false) : GetToEOL()); | ||||
|             else | ||||
|                 str = (!trim ? GetBefore(Environment.NewLine, false) : GetToEOL()); | ||||
|             return str; | ||||
|         } | ||||
|     private bool IsBlankLine() | ||||
|     { | ||||
|         int num = _Data.IndexOf("\n", _I); | ||||
|         return IsNullOrWhiteSpace((num > -1 ? _Data.Substring(_I, num - _I) : _Data.Substring(_I))); | ||||
|     } | ||||
|  | ||||
|         private string GetToken() | ||||
|     private bool IsNullOrWhiteSpace(string text) | ||||
|     { | ||||
|         bool flag; | ||||
|         int num = 0; | ||||
|         while (true) | ||||
|         { | ||||
|             while (true) | ||||
|             if (num >= text.Length) | ||||
|             { | ||||
|                 if (_I >= _Data.Length || !IsNullOrWhiteSpace(_Data.Substring(_I, 1))) | ||||
|                 { | ||||
|                     break; | ||||
|                 } | ||||
|                 _I++; | ||||
|                 flag = true; | ||||
|                 break; | ||||
|             } | ||||
|             int num = _I; | ||||
|             while (true) | ||||
|             else if (char.IsWhiteSpace(text[num])) | ||||
|             { | ||||
|                 if (num >= _Data.Length || IsNullOrWhiteSpace(_Data.Substring(num, 1))) | ||||
|                 { | ||||
|                     break; | ||||
|                 } | ||||
|                 num++; | ||||
|             } | ||||
|             string str = _Data.Substring(_I, num - _I); | ||||
|             _I = num; | ||||
|             return str.Trim(); | ||||
|         } | ||||
|  | ||||
|         private string GetToText(string text) | ||||
|         { | ||||
|             string str = _Data.Substring(_I, _Data.IndexOf(text, _I) - _I).Trim(); | ||||
|             return str; | ||||
|         } | ||||
|  | ||||
|         private bool IsBlankLine() | ||||
|         { | ||||
|             int num = _Data.IndexOf("\n", _I); | ||||
|             return IsNullOrWhiteSpace((num > -1 ? _Data.Substring(_I, num - _I) : _Data.Substring(_I))); | ||||
|         } | ||||
|  | ||||
|         private bool IsNullOrWhiteSpace(string text) | ||||
|         { | ||||
|             bool flag; | ||||
|             int num = 0; | ||||
|             while (true) | ||||
|             { | ||||
|                 if (num >= text.Length) | ||||
|                 { | ||||
|                     flag = true; | ||||
|                     break; | ||||
|                 } | ||||
|                 else if (char.IsWhiteSpace(text[num])) | ||||
|                 { | ||||
|                     num++; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     flag = false; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             return flag; | ||||
|         } | ||||
|  | ||||
|         private string PeekNextLine() | ||||
|         { | ||||
|             int num = _I; | ||||
|             string toEOL = GetToEOL(); | ||||
|             _I = num; | ||||
|             return toEOL; | ||||
|         } | ||||
|  | ||||
|         private void ScanPast(string text) | ||||
|         { | ||||
|             int num = _Data.IndexOf(text, _I); | ||||
|             if (num <= -1) | ||||
|             { | ||||
|                 _I = _Data.Length; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 _I = num + text.Length; | ||||
|                 flag = false; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         return flag; | ||||
|     } | ||||
|  | ||||
|         internal static DateTime GetDateTime(Logistics logistics, string dateTimeText) | ||||
|     private string PeekNextLine() | ||||
|     { | ||||
|         int num = _I; | ||||
|         string toEOL = GetToEOL(); | ||||
|         _I = num; | ||||
|         return toEOL; | ||||
|     } | ||||
|  | ||||
|     private void ScanPast(string text) | ||||
|     { | ||||
|         int num = _Data.IndexOf(text, _I); | ||||
|         if (num <= -1) | ||||
|         { | ||||
|             DateTime result; | ||||
|             string inputDateFormat = "ddd mmm dd HH:mm:ss yyyy"; | ||||
|             if (dateTimeText.Length != inputDateFormat.Length) | ||||
|             _I = _Data.Length; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             _I = num + text.Length; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     internal static DateTime GetDateTime(Logistics logistics, string dateTimeText) | ||||
|     { | ||||
|         DateTime result; | ||||
|         string inputDateFormat = "ddd mmm dd HH:mm:ss yyyy"; | ||||
|         if (dateTimeText.Length != inputDateFormat.Length) | ||||
|             result = logistics.DateTimeFromSequence; | ||||
|         else | ||||
|         { | ||||
|             if (!DateTime.TryParseExact(dateTimeText, inputDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTimeParsed)) | ||||
|                 result = logistics.DateTimeFromSequence; | ||||
|             else | ||||
|             { | ||||
|                 if (!DateTime.TryParseExact(dateTimeText, inputDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTimeParsed)) | ||||
|                     result = logistics.DateTimeFromSequence; | ||||
|                 if (dateTimeParsed < logistics.DateTimeFromSequence.AddDays(1) && dateTimeParsed > logistics.DateTimeFromSequence.AddDays(-1)) | ||||
|                     result = dateTimeParsed; | ||||
|                 else | ||||
|                 { | ||||
|                     if (dateTimeParsed < logistics.DateTimeFromSequence.AddDays(1) && dateTimeParsed > logistics.DateTimeFromSequence.AddDays(-1)) | ||||
|                         result = dateTimeParsed; | ||||
|                     else | ||||
|                         result = logistics.DateTimeFromSequence; | ||||
|                 } | ||||
|                     result = logistics.DateTimeFromSequence; | ||||
|             } | ||||
|             return result; | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|         private void Parse(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection, string originalDataBioRad, ProcessData lastProcessData) | ||||
|     private void Parse(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection, string originalDataBioRad, ProcessData lastProcessData) | ||||
|     { | ||||
|         if (fileRead is null) | ||||
|         { } | ||||
|         _I = 0; | ||||
|         _Data = string.Empty; | ||||
|         List<Detail> details = new(); | ||||
|         string receivedData = File.ReadAllText(logistics.ReportFullPath); | ||||
|         _Log.Debug($"****ParseData - Source file contents:"); | ||||
|         _Log.Debug(receivedData); | ||||
|         string[] files = Directory.GetFiles(Path.GetDirectoryName(logistics.ReportFullPath), string.Concat(originalDataBioRad, logistics.Sequence, "*"), SearchOption.TopDirectoryOnly); | ||||
|         foreach (string file in files) | ||||
|             fileInfoCollection.Add(new FileInfo(file)); | ||||
|         // occasionally there are multiple blocks of results, get the last one as earlier ones may be aborted runs. | ||||
|         int index = receivedData.LastIndexOf("Bio-Rad"); | ||||
|         if (index > -1) | ||||
|             receivedData = receivedData.Substring(index); | ||||
|         _Log.Debug($"****ParseData - Source file contents to be parsed:"); | ||||
|         _Log.Debug(receivedData); | ||||
|         if (!string.IsNullOrEmpty(receivedData)) | ||||
|         { | ||||
|             if (fileRead is null) | ||||
|             { } | ||||
|             _I = 0; | ||||
|             _Data = string.Empty; | ||||
|             List<Detail> details = new(); | ||||
|             string receivedData = File.ReadAllText(logistics.ReportFullPath); | ||||
|             _Log.Debug($"****ParseData - Source file contents:"); | ||||
|             _Log.Debug(receivedData); | ||||
|             string[] files = Directory.GetFiles(Path.GetDirectoryName(logistics.ReportFullPath), string.Concat(originalDataBioRad, logistics.Sequence, "*"), SearchOption.TopDirectoryOnly); | ||||
|             foreach (string file in files) | ||||
|                 fileInfoCollection.Add(new FileInfo(file)); | ||||
|             // occasionally there are multiple blocks of results, get the last one as earlier ones may be aborted runs. | ||||
|             int index = receivedData.LastIndexOf("Bio-Rad"); | ||||
|             if (index > -1) | ||||
|                 receivedData = receivedData.Substring(index); | ||||
|             _Log.Debug($"****ParseData - Source file contents to be parsed:"); | ||||
|             _Log.Debug(receivedData); | ||||
|             if (!string.IsNullOrEmpty(receivedData)) | ||||
|             _Data = receivedData; | ||||
|             Title = GetBefore("Recipe:"); | ||||
|             Recipe = GetToken(); | ||||
|             string dateTimeText = GetToEOL(); | ||||
|             if (dateTimeText.EndsWith(".")) | ||||
|                 dateTimeText = dateTimeText.Remove(dateTimeText.Length - 1, 1); | ||||
|             DateTime dateTime = GetDateTime(logistics, dateTimeText); | ||||
|             Date = dateTime.ToString(); | ||||
|             ScanPast("operator:"); | ||||
|             Employee = GetBefore("batch:"); | ||||
|             Batch = GetToEOL(); | ||||
|             // Remove illegal characters \/:*?"<>| found in the Batch | ||||
|             Batch = Regex.Replace(Batch, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; | ||||
|             ScanPast("cassette:"); | ||||
|             Cassette = GetBefore("wafer:"); | ||||
|             if (string.IsNullOrEmpty(Batch)) | ||||
|             { | ||||
|                 _I = 0; | ||||
|                 _Data = receivedData; | ||||
|                 Title = GetBefore("Recipe:"); | ||||
|                 Recipe = GetToken(); | ||||
|                 string dateTimeText = GetToEOL(); | ||||
|                 if (dateTimeText.EndsWith(".")) | ||||
|                     dateTimeText = dateTimeText.Remove(dateTimeText.Length - 1, 1); | ||||
|                 DateTime dateTime = GetDateTime(logistics, dateTimeText); | ||||
|                 Date = dateTime.ToString(); | ||||
|                 ScanPast("operator:"); | ||||
|                 Employee = GetBefore("batch:"); | ||||
|                 Batch = GetToEOL(); | ||||
|                 // Remove illegal characters \/:*?"<>| found in the Batch | ||||
|                 Batch = Regex.Replace(Batch, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_").Split('\r')[0].Split('\n')[0]; | ||||
|                 ScanPast("cassette:"); | ||||
|                 Cassette = GetBefore("wafer:"); | ||||
|                 if (string.IsNullOrEmpty(Batch)) | ||||
|                 ScanPast("wafer:"); | ||||
|             } | ||||
|             Wafer = GetToEOL(); | ||||
|             _ = GetToEOL(); | ||||
|             _ = GetToEOL(); | ||||
|             string token = GetToken(); | ||||
|             int counter = 1; | ||||
|             while (true) | ||||
|             { | ||||
|                 if ((string.IsNullOrEmpty(token) || !char.IsDigit(token[0]))) | ||||
|                     break; | ||||
|                 Detail detail = new() | ||||
|                 { | ||||
|                     _I = 0; | ||||
|                     _Data = receivedData; | ||||
|                     ScanPast("wafer:"); | ||||
|                 } | ||||
|                 Wafer = GetToEOL(); | ||||
|                 GetToEOL(); | ||||
|                 GetToEOL(); | ||||
|                 string token = GetToken(); | ||||
|                 int counter = 1; | ||||
|                 while (true) | ||||
|                 { | ||||
|                     if ((string.IsNullOrEmpty(token) || !char.IsDigit(token[0]))) | ||||
|                         break; | ||||
|                     Detail detail = new() | ||||
|                     { | ||||
|                         Position = token, | ||||
|                         Thickness = GetToken(), | ||||
|                         UniqueId = string.Concat("_Point-", counter) | ||||
|                     }; | ||||
|                     details.Add(detail); | ||||
|                     token = GetToken(); | ||||
|                     counter++; | ||||
|                 } | ||||
|                 ScanPast("mean thickness ="); | ||||
|                 MeanThickness = GetBefore(", std. dev ="); | ||||
|                 StdDev = GetToken(); | ||||
|                 PassFail = GetToEOL(); | ||||
|                 ScanPast("thickness"); | ||||
|                 RVThickness = GetToEOL(); | ||||
|                     Position = token, | ||||
|                     Thickness = GetToken(), | ||||
|                     UniqueId = string.Concat("_Point-", counter) | ||||
|                 }; | ||||
|                 details.Add(detail); | ||||
|                 token = GetToken(); | ||||
|                 counter++; | ||||
|             } | ||||
|  | ||||
|             if (string.IsNullOrEmpty(Wafer)) | ||||
|                 throw new Exception("Wafer field is missing."); | ||||
|  | ||||
|             //parse out batch and validate | ||||
|             string[] parsedBatch = Wafer.Split('-'); | ||||
|             if (parsedBatch.Length >= 1) | ||||
|                 Reactor = parsedBatch[0]; | ||||
|             if (parsedBatch.Length >= 2) | ||||
|                 RDS = parsedBatch[1]; | ||||
|             if (parsedBatch.Length >= 3) | ||||
|             { | ||||
|                 string[] parsedPSN = parsedBatch[2].Split('.'); | ||||
|                 if (parsedPSN.Length >= 1) | ||||
|                     PSN = parsedPSN[0]; | ||||
|                 if (parsedPSN.Length >= 2) | ||||
|                     Layer = parsedPSN[1]; | ||||
|             } | ||||
|             if (parsedBatch.Length >= 4) | ||||
|                 Zone = parsedBatch[3]; | ||||
|  | ||||
|             JobID = logistics.JobID; | ||||
|  | ||||
|             if (logistics.DateTimeFromSequence > DateTime.Now.AddHours(-24)) | ||||
|             { | ||||
|                 if (string.IsNullOrEmpty(lastProcessData.Wafer)) | ||||
|                 { | ||||
|                     lastProcessData.Batch = JobID; | ||||
|                     lastProcessData.Cassette = JobID; | ||||
|                     lastProcessData.Employee = JobID; | ||||
|                     lastProcessData.Recipe = JobID; | ||||
|                     lastProcessData.Title = JobID; | ||||
|                 } | ||||
|                 lastProcessData.Wafer = Wafer; | ||||
|                 lastProcessData.Reactor = Reactor; | ||||
|                 lastProcessData.RDS = RDS; | ||||
|  | ||||
|                 string check = "--------"; | ||||
|                 if (string.IsNullOrEmpty(Batch) || Batch.Contains(check)) | ||||
|                     Batch = lastProcessData.Batch; | ||||
|                 else | ||||
|                     lastProcessData.Batch = Batch; | ||||
|                 if (string.IsNullOrEmpty(Cassette) || Cassette.Contains(check)) | ||||
|                     Cassette = lastProcessData.Cassette; | ||||
|                 else | ||||
|                     lastProcessData.Cassette = Cassette; | ||||
|                 if (string.IsNullOrEmpty(Employee) || Employee.Contains(check)) | ||||
|                     Employee = lastProcessData.Employee; | ||||
|                 else | ||||
|                     lastProcessData.Employee = Employee; | ||||
|                 if (string.IsNullOrEmpty(Recipe) || Recipe.Contains(check)) | ||||
|                     Recipe = lastProcessData.Recipe; | ||||
|                 else | ||||
|                     lastProcessData.Recipe = Recipe; | ||||
|                 if (string.IsNullOrEmpty(Title) || Title.Contains(check)) | ||||
|                     Title = lastProcessData.Title; | ||||
|                 else | ||||
|                     lastProcessData.Title = Title; | ||||
|             } | ||||
|  | ||||
|             //fix title | ||||
|             StringBuilder titleFixed = new(); | ||||
|             foreach (char c in Title) | ||||
|             { | ||||
|                 if (char.IsLetterOrDigit(c) || c == '-' || c == '.') | ||||
|                     titleFixed.Append(c); | ||||
|             } | ||||
|             Title = titleFixed.ToString(); | ||||
|  | ||||
|             //fix wafer | ||||
|             StringBuilder waferFixed = new(); | ||||
|             foreach (char c in Wafer) | ||||
|             { | ||||
|                 if (char.IsLetterOrDigit(c) || c == '-' || c == '.') | ||||
|                     waferFixed.Append(c); | ||||
|             } | ||||
|             Wafer = waferFixed.ToString(); | ||||
|  | ||||
|             //create filename / unique id | ||||
|             UniqueId = string.Concat(Title, "_", Wafer, "_", logistics.DateTimeFromSequence.ToString("yyyyMMddHHmmssffff")); | ||||
|             foreach (Detail detail in details) | ||||
|             { | ||||
|                 detail.HeaderUniqueId = UniqueId; | ||||
|                 detail.UniqueId = string.Concat(UniqueId, detail.UniqueId); | ||||
|             } | ||||
|  | ||||
|             //trace datatype | ||||
|             _Log.Debug("BioRad parsed infomation:"); | ||||
|             _Log.Debug(string.Format("Batch: {0}", Batch)); | ||||
|             _Log.Debug(string.Format("Cassette: {0}", Cassette)); | ||||
|             _Log.Debug(string.Format("Date: {0}", Date)); | ||||
|             foreach (Detail bioRadDetail in details) | ||||
|                 _Log.Debug(string.Format("Details: {0} - {1}", bioRadDetail.Position, bioRadDetail.Thickness)); | ||||
|             _Log.Debug(string.Format("Mean Thickness: {0}", MeanThickness)); | ||||
|             _Log.Debug(string.Format("Operator: {0}", Employee)); | ||||
|             _Log.Debug(string.Format("Pass/Fail: {0}", PassFail)); | ||||
|             _Log.Debug(string.Format("Recipe: {0}", Recipe)); | ||||
|             _Log.Debug(string.Format("RV Thickness: {0}", RVThickness)); | ||||
|             _Log.Debug(string.Format("Std Dev: {0}", StdDev)); | ||||
|             _Log.Debug(string.Format("Title: {0}", Title)); | ||||
|             _Log.Debug(string.Format("Wafer: {0}", Wafer)); | ||||
|             fileInfoCollection.Add(new FileInfo(logistics.ReportFullPath)); | ||||
|             _Details.AddRange(details); | ||||
|             ScanPast("mean thickness ="); | ||||
|             MeanThickness = GetBefore(", std. dev ="); | ||||
|             StdDev = GetToken(); | ||||
|             PassFail = GetToEOL(); | ||||
|             ScanPast("thickness"); | ||||
|             RVThickness = GetToEOL(); | ||||
|         } | ||||
|  | ||||
|         if (string.IsNullOrEmpty(Wafer)) | ||||
|             throw new Exception("Wafer field is missing."); | ||||
|  | ||||
|         //parse out batch and validate | ||||
|         string[] parsedBatch = Wafer.Split('-'); | ||||
|         if (parsedBatch.Length >= 1) | ||||
|             Reactor = parsedBatch[0]; | ||||
|         if (parsedBatch.Length >= 2) | ||||
|             RDS = parsedBatch[1]; | ||||
|         if (parsedBatch.Length >= 3) | ||||
|         { | ||||
|             string[] parsedPSN = parsedBatch[2].Split('.'); | ||||
|             if (parsedPSN.Length >= 1) | ||||
|                 PSN = parsedPSN[0]; | ||||
|             if (parsedPSN.Length >= 2) | ||||
|                 Layer = parsedPSN[1]; | ||||
|         } | ||||
|         if (parsedBatch.Length >= 4) | ||||
|             Zone = parsedBatch[3]; | ||||
|  | ||||
|         JobID = logistics.JobID; | ||||
|  | ||||
|         if (logistics.DateTimeFromSequence > DateTime.Now.AddHours(-24)) | ||||
|         { | ||||
|             if (string.IsNullOrEmpty(lastProcessData.Wafer)) | ||||
|             { | ||||
|                 lastProcessData.Batch = JobID; | ||||
|                 lastProcessData.Cassette = JobID; | ||||
|                 lastProcessData.Employee = JobID; | ||||
|                 lastProcessData.Recipe = JobID; | ||||
|                 lastProcessData.Title = JobID; | ||||
|             } | ||||
|             lastProcessData.Wafer = Wafer; | ||||
|             lastProcessData.Reactor = Reactor; | ||||
|             lastProcessData.RDS = RDS; | ||||
|  | ||||
|             string check = "--------"; | ||||
|             if (string.IsNullOrEmpty(Batch) || Batch.Contains(check)) | ||||
|                 Batch = lastProcessData.Batch; | ||||
|             else | ||||
|                 lastProcessData.Batch = Batch; | ||||
|             if (string.IsNullOrEmpty(Cassette) || Cassette.Contains(check)) | ||||
|                 Cassette = lastProcessData.Cassette; | ||||
|             else | ||||
|                 lastProcessData.Cassette = Cassette; | ||||
|             if (string.IsNullOrEmpty(Employee) || Employee.Contains(check)) | ||||
|                 Employee = lastProcessData.Employee; | ||||
|             else | ||||
|                 lastProcessData.Employee = Employee; | ||||
|             if (string.IsNullOrEmpty(Recipe) || Recipe.Contains(check)) | ||||
|                 Recipe = lastProcessData.Recipe; | ||||
|             else | ||||
|                 lastProcessData.Recipe = Recipe; | ||||
|             if (string.IsNullOrEmpty(Title) || Title.Contains(check)) | ||||
|                 Title = lastProcessData.Title; | ||||
|             else | ||||
|                 lastProcessData.Title = Title; | ||||
|         } | ||||
|  | ||||
|         //fix title | ||||
|         StringBuilder titleFixed = new(); | ||||
|         foreach (char c in Title) | ||||
|         { | ||||
|             if (char.IsLetterOrDigit(c) || c == '-' || c == '.') | ||||
|                 _ = titleFixed.Append(c); | ||||
|         } | ||||
|         Title = titleFixed.ToString(); | ||||
|  | ||||
|         //fix wafer | ||||
|         StringBuilder waferFixed = new(); | ||||
|         foreach (char c in Wafer) | ||||
|         { | ||||
|             if (char.IsLetterOrDigit(c) || c == '-' || c == '.') | ||||
|                 _ = waferFixed.Append(c); | ||||
|         } | ||||
|         Wafer = waferFixed.ToString(); | ||||
|  | ||||
|         //create filename / unique id | ||||
|         UniqueId = string.Concat(Title, "_", Wafer, "_", logistics.DateTimeFromSequence.ToString("yyyyMMddHHmmssffff")); | ||||
|         foreach (Detail detail in details) | ||||
|         { | ||||
|             detail.HeaderUniqueId = UniqueId; | ||||
|             detail.UniqueId = string.Concat(UniqueId, detail.UniqueId); | ||||
|         } | ||||
|  | ||||
|         //trace datatype | ||||
|         _Log.Debug("BioRad parsed infomation:"); | ||||
|         _Log.Debug(string.Format("Batch: {0}", Batch)); | ||||
|         _Log.Debug(string.Format("Cassette: {0}", Cassette)); | ||||
|         _Log.Debug(string.Format("Date: {0}", Date)); | ||||
|         foreach (Detail bioRadDetail in details) | ||||
|             _Log.Debug(string.Format("Details: {0} - {1}", bioRadDetail.Position, bioRadDetail.Thickness)); | ||||
|         _Log.Debug(string.Format("Mean Thickness: {0}", MeanThickness)); | ||||
|         _Log.Debug(string.Format("Operator: {0}", Employee)); | ||||
|         _Log.Debug(string.Format("Pass/Fail: {0}", PassFail)); | ||||
|         _Log.Debug(string.Format("Recipe: {0}", Recipe)); | ||||
|         _Log.Debug(string.Format("RV Thickness: {0}", RVThickness)); | ||||
|         _Log.Debug(string.Format("Std Dev: {0}", StdDev)); | ||||
|         _Log.Debug(string.Format("Title: {0}", Title)); | ||||
|         _Log.Debug(string.Format("Wafer: {0}", Wafer)); | ||||
|         fileInfoCollection.Add(new FileInfo(logistics.ReportFullPath)); | ||||
|         _Details.AddRange(details); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										140
									
								
								Adaptation/FileHandlers/ToArchive/FileRead.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								Adaptation/FileHandlers/ToArchive/FileRead.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,140 @@ | ||||
| using Adaptation.Eaf.Management.ConfigurationData.CellAutomation; | ||||
| using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; | ||||
| using Adaptation.Shared; | ||||
| using Adaptation.Shared.Duplicator; | ||||
| using Adaptation.Shared.Methods; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.ToArchive; | ||||
|  | ||||
| public class FileRead : Shared.FileRead, IFileRead | ||||
| { | ||||
|  | ||||
|     public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted) : | ||||
|         base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, useCyclicalForDescription, isEAFHosted) | ||||
|     { | ||||
|         _MinFileLength = 10; | ||||
|         _NullData = string.Empty; | ||||
|         _Logistics = new Logistics(this); | ||||
|         if (_FileParameter is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (_ModelObjectParameterDefinitions is null) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (!_IsDuplicator) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) | ||||
|     { | ||||
|         bool isErrorFile = exception is not null; | ||||
|         if (!isErrorFile && !string.IsNullOrEmpty(_Logistics.ReportFullPath)) | ||||
|         { | ||||
|             FileInfo fileInfo = new(_Logistics.ReportFullPath); | ||||
|             if (fileInfo.Exists && fileInfo.LastWriteTime < fileInfo.CreationTime) | ||||
|                 File.SetLastWriteTime(_Logistics.ReportFullPath, fileInfo.CreationTime); | ||||
|         } | ||||
|         Move(extractResults, exception); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); | ||||
|  | ||||
|     string IFileRead.GetEventDescription() | ||||
|     { | ||||
|         string result = _Description.GetEventDescription(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     List<string> IFileRead.GetHeaderNames() | ||||
|     { | ||||
|         List<string> results = _Description.GetHeaderNames(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     string[] IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, string> IFileRead.GetDisplayNamesJsonElement() | ||||
|     { | ||||
|         Dictionary<string, string> results = _Description.GetDisplayNamesJsonElement(this); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<IDescription> IFileRead.GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData) | ||||
|     { | ||||
|         List<IDescription> results = _Description.GetDescriptions(fileRead, _Logistics, tests, processData); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.GetExtractResult(string reportFullPath, string eventName) | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> 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<string, Test[], JsonElement[], List<FileInfo>>(results.Item1, Array.Empty<Test>(), JsonSerializer.Deserialize<JsonElement[]>("[]"), results.Item4); | ||||
|         if (results.Item3.Length > 0 && _IsEAFHosted) | ||||
|             WritePDSF(this, results.Item3); | ||||
|         UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> IFileRead.ReExtract() | ||||
|     { | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results; | ||||
|         List<string> headerNames = _Description.GetHeaderNames(); | ||||
|         Dictionary<string, string> keyValuePairs = _Description.GetDisplayNamesJsonElement(this); | ||||
|         results = ReExtract(this, headerNames, keyValuePairs); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     void IFileRead.CheckTests(Test[] tests, bool extra) | ||||
|     { | ||||
|         if (_Description is not Description) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Callback(object state) => throw new Exception(string.Concat("Not ", nameof(_IsDuplicator))); | ||||
|  | ||||
|     private Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, DateTime dateTime) | ||||
|     { | ||||
|         if (dateTime == DateTime.MinValue) | ||||
|         { } | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> results = new(string.Empty, null, null, new List<FileInfo>()); | ||||
|         _Logistics = new Logistics(this, reportFullPath, useSplitForMID: true); | ||||
|         SetFileParameterLotIDToLogisticsMID(); | ||||
|  | ||||
|         string[] segments = Path.GetFileNameWithoutExtension(reportFullPath).Split('_'); | ||||
|         string duplicateDirectory = string.Concat(_FileConnectorConfiguration.TargetFileLocation, @"\", segments[0]); | ||||
|         if (segments.Length > 2) | ||||
|             duplicateDirectory = string.Concat(duplicateDirectory, @"-", segments[2]); | ||||
|         if (!Directory.Exists(duplicateDirectory)) | ||||
|             _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|  | ||||
|         string logisticsSequence = _Logistics.Sequence.ToString(); | ||||
|         bool isDummyRun = _DummyRuns.Any() && _DummyRuns.ContainsKey(_Logistics.JobID) && _DummyRuns[_Logistics.JobID].Any() && (from l in _DummyRuns[_Logistics.JobID] where l == _Logistics.Sequence select 1).Any(); | ||||
|  | ||||
|         List<Tuple<Shared.Properties.IScopeInfo, string>> tuples = new(); | ||||
|  | ||||
|         string destinationDirectory = WriteScopeInfo(_ProgressPath, _Logistics, dateTime, duplicateDirectory, tuples); | ||||
|         if (isDummyRun) | ||||
|             Shared0607(reportFullPath, duplicateDirectory, logisticsSequence, destinationDirectory); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,13 +1,12 @@ | ||||
| namespace Adaptation.Ifx.Eaf.Common.Configuration | ||||
| { | ||||
|     [System.Runtime.Serialization.DataContractAttribute] | ||||
|     public class ConnectionSetting | ||||
|     { | ||||
|         public ConnectionSetting(string name, string value) { } | ||||
| namespace Adaptation.Ifx.Eaf.Common.Configuration; | ||||
|  | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string Name { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string Value { get; set; } | ||||
|     } | ||||
| [System.Runtime.Serialization.DataContractAttribute] | ||||
| public class ConnectionSetting | ||||
| { | ||||
|     public ConnectionSetting(string name, string value) { } | ||||
|  | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string Name { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string Value { get; set; } | ||||
| } | ||||
| @ -1,19 +1,18 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component | ||||
| namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component; | ||||
|  | ||||
| public class File | ||||
| { | ||||
|     public class File | ||||
|     { | ||||
|         public File(string filePath) { throw new NotImplementedException(); } | ||||
|         public File(string filePath, DateTime timeFileFound) { throw new NotImplementedException(); } | ||||
|     public 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<string, string> ContentParameters { get; } | ||||
|     public string Path { get; } | ||||
|     public DateTime TimeFound { get; } | ||||
|     public bool IsErrorFile { get; } | ||||
|     public Dictionary<string, string> ContentParameters { get; } | ||||
|  | ||||
|         public File UpdateContentParameters(Dictionary<string, string> contentParameters) { throw new NotImplementedException(); } | ||||
|         public File UpdateParsingStatus(bool isErrorFile) { throw new NotImplementedException(); } | ||||
|     } | ||||
|     public File UpdateContentParameters(Dictionary<string, string> contentParameters) => throw new NotImplementedException(); | ||||
|     public File UpdateParsingStatus(bool isErrorFile) => throw new NotImplementedException(); | ||||
| } | ||||
| @ -2,34 +2,33 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component | ||||
| namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Component; | ||||
|  | ||||
| public class FilePathGenerator | ||||
| { | ||||
|     public class FilePathGenerator | ||||
|     { | ||||
|         public const char PLACEHOLDER_IDENTIFIER = '%'; | ||||
|         public const char PLACEHOLDER_SEPARATOR = ':'; | ||||
|         public const string PLACEHOLDER_NOT_AVAILABLE = "NA"; | ||||
|         public const string PLACEHOLDER_ORIGINAL_FILE_NAME = "OriginalFileName"; | ||||
|         public const string PLACEHOLDER_ORIGINAL_FILE_EXTENSION = "OriginalFileExtension"; | ||||
|         public const string PLACEHOLDER_DATE_TIME = "DateTime"; | ||||
|         public const string PLACEHOLDER_SUB_FOLDER = "SubFolder"; | ||||
|         public const string PLACEHOLDER_CELL_NAME = "CellName"; | ||||
|     public 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<string, string> customPattern = null) { throw new NotImplementedException(); } | ||||
|         public FilePathGenerator(FileConnectorConfiguration config, File file, bool isErrorFile = false, Dictionary<string, string> customPattern = null) { throw new NotImplementedException(); } | ||||
|         public FilePathGenerator(FileConnectorConfiguration config, string sourceFilePath, bool isErrorFile = false, Dictionary<string, string> customPattern = null) { throw new NotImplementedException(); } | ||||
|     public FilePathGenerator(FileConnectorConfiguration config, Dictionary<string, string> customPattern = null) => throw new NotImplementedException(); | ||||
|     public FilePathGenerator(FileConnectorConfiguration config, File file, bool isErrorFile = false, Dictionary<string, string> customPattern = null) => throw new NotImplementedException(); | ||||
|     public FilePathGenerator(FileConnectorConfiguration config, string sourceFilePath, bool isErrorFile = false, Dictionary<string, string> 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; } | ||||
|     protected string SubFolderPath { get; } | ||||
|     protected FileConnectorConfiguration Configuration { get; } | ||||
|     protected File File { get; } | ||||
|     protected bool IsErrorFile { get; } | ||||
|     protected string DefaultPlaceHolderValue { get; } | ||||
|  | ||||
|         public string GetFullTargetPath() { throw new NotImplementedException(); } | ||||
|         public virtual string GetTargetFileName() { throw new NotImplementedException(); } | ||||
|         public string GetTargetFolder(bool throwExceptionIfNotExist = true) { throw new NotImplementedException(); } | ||||
|         protected virtual string GetSubFolder(string folderPattern, string subFolderPath) { throw new NotImplementedException(); } | ||||
|         protected virtual string PrepareFolderPath(string targetFolderPath, string subFolderPath) { throw new NotImplementedException(); } | ||||
|         protected string ReplacePlaceholder(string inputPath) { throw new NotImplementedException(); } | ||||
|     } | ||||
|     public string GetFullTargetPath() => throw new NotImplementedException(); | ||||
|     public virtual string GetTargetFileName() => throw new NotImplementedException(); | ||||
|     public string GetTargetFolder(bool throwExceptionIfNotExist = true) => throw new NotImplementedException(); | ||||
|     protected virtual string GetSubFolder(string folderPattern, string subFolderPath) => throw new NotImplementedException(); | ||||
|     protected virtual string PrepareFolderPath(string targetFolderPath, string subFolderPath) => throw new NotImplementedException(); | ||||
|     protected string ReplacePlaceholder(string inputPath) => throw new NotImplementedException(); | ||||
| } | ||||
| @ -2,134 +2,133 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration | ||||
| namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration; | ||||
|  | ||||
| [System.Runtime.Serialization.DataContractAttribute] | ||||
| public class FileConnectorConfiguration | ||||
| { | ||||
|     [System.Runtime.Serialization.DataContractAttribute] | ||||
|     public class FileConnectorConfiguration | ||||
|     public const ulong IDLE_EVENT_WAIT_TIME_DEFAULT = 360; | ||||
|     public const ulong FILE_HANDLE_TIMEOUT_DEFAULT = 15; | ||||
|  | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual bool? TriggerOnChanged { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual long? PostProcessingRetries { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual bool? CopySourceFolderStructure { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public IfPostProcessingFailsEnum? IfPostProcessingFailsAction { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string AlternateTargetFolder { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public long? FileHandleTimeout { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public bool? DeleteEmptySourceSubFolders { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public long? IdleEventWaitTimeInSeconds { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string FileAgeThreshold { get; set; } | ||||
|     public bool? FolderAgeCheckIndividualSubFolders { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual ZipModeEnum? ZipMode { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public FileAgeFilterEnum? FileAgeFilterMode { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string ZipTargetFileName { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string ZipErrorTargetFileName { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public long? ZipFileSubFolderLevel { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string DefaultPlaceHolderValue { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public bool? UseZip64Mode { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public List<ConnectionSetting> ConnectionSettings { get; set; } | ||||
|     public string SourceDirectoryCloaking { get; set; } | ||||
|     public string FolderAgeThreshold { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual long? FileScanningIntervalInSeconds { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual bool? TriggerOnCreated { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual long? ZipFileTime { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string SourceFileLocation { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string SourceFileFilter { get; set; } | ||||
|     public List<string> SourceFileFilters { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual bool? IncludeSubDirectories { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual FileScanningOptionEnum? FileScanningOption { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string TargetFileLocation { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string ErrorTargetFileLocation { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string TargetFileName { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual long? FileHandleWaitTime { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public IfFileExistEnum? IfFileExistAction { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public long? ConnectionRetryInterval { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public PreProcessingModeEnum? PreProcessingMode { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public PostProcessingModeEnum? PostProcessingMode { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public PostProcessingModeEnum? ErrorPostProcessingMode { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public virtual long? ZipFileAmount { get; set; } | ||||
|     [System.Runtime.Serialization.DataMemberAttribute] | ||||
|     public string ErrorTargetFileName { get; set; } | ||||
|  | ||||
|     public void Initialize() => throw new NotImplementedException(); | ||||
|  | ||||
|     public enum PostProcessingModeEnum | ||||
|     { | ||||
|         public const ulong IDLE_EVENT_WAIT_TIME_DEFAULT = 360; | ||||
|         public const ulong FILE_HANDLE_TIMEOUT_DEFAULT = 15; | ||||
|  | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual bool? TriggerOnChanged { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual long? PostProcessingRetries { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual bool? CopySourceFolderStructure { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public IfPostProcessingFailsEnum? IfPostProcessingFailsAction { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string AlternateTargetFolder { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public long? FileHandleTimeout { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public bool? DeleteEmptySourceSubFolders { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public long? IdleEventWaitTimeInSeconds { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string FileAgeThreshold { get; set; } | ||||
|         public bool? FolderAgeCheckIndividualSubFolders { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual ZipModeEnum? ZipMode { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public FileAgeFilterEnum? FileAgeFilterMode { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string ZipTargetFileName { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string ZipErrorTargetFileName { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public long? ZipFileSubFolderLevel { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string DefaultPlaceHolderValue { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public bool? UseZip64Mode { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public List<ConnectionSetting> ConnectionSettings { get; set; } | ||||
|         public string SourceDirectoryCloaking { get; set; } | ||||
|         public string FolderAgeThreshold { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual long? FileScanningIntervalInSeconds { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual bool? TriggerOnCreated { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual long? ZipFileTime { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string SourceFileLocation { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string SourceFileFilter { get; set; } | ||||
|         public List<string> SourceFileFilters { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual bool? IncludeSubDirectories { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual FileScanningOptionEnum? FileScanningOption { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string TargetFileLocation { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string ErrorTargetFileLocation { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string TargetFileName { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual long? FileHandleWaitTime { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public IfFileExistEnum? IfFileExistAction { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public long? ConnectionRetryInterval { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public PreProcessingModeEnum? PreProcessingMode { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public PostProcessingModeEnum? PostProcessingMode { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public PostProcessingModeEnum? ErrorPostProcessingMode { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public virtual long? ZipFileAmount { get; set; } | ||||
|         [System.Runtime.Serialization.DataMemberAttribute] | ||||
|         public string ErrorTargetFileName { get; set; } | ||||
|  | ||||
|         public void Initialize() { throw new NotImplementedException(); } | ||||
|  | ||||
|         public enum PostProcessingModeEnum | ||||
|         { | ||||
|             None = 0, | ||||
|             Move = 1, | ||||
|             Copy = 2, | ||||
|             Rename = 3, | ||||
|             Zip = 4, | ||||
|             Delete = 5, | ||||
|             MoveFolder = 6, | ||||
|             CopyFolder = 7, | ||||
|             DeleteFolder = 8 | ||||
|         } | ||||
|         public enum PreProcessingModeEnum | ||||
|         { | ||||
|             None = 0, | ||||
|             Process = 1 | ||||
|         } | ||||
|         public enum IfFileExistEnum | ||||
|         { | ||||
|             Overwrite = 0, | ||||
|             LeaveFiles = 1, | ||||
|             Delete = 2 | ||||
|         } | ||||
|         public enum IfPostProcessingFailsEnum | ||||
|         { | ||||
|             LeaveFiles = 0, | ||||
|             Delete = 1 | ||||
|         } | ||||
|         public enum FileScanningOptionEnum | ||||
|         { | ||||
|             FileWatcher = 0, | ||||
|             TimeBased = 1 | ||||
|         } | ||||
|         public enum ZipModeEnum | ||||
|         { | ||||
|             ZipByAmountOrTime = 0, | ||||
|             ZipByFileName = 1, | ||||
|             ZipBySubFolderName = 2 | ||||
|         } | ||||
|         public enum FileAgeFilterEnum | ||||
|         { | ||||
|             IgnoreNewer = 0, | ||||
|             IgnoreOlder = 1 | ||||
|         } | ||||
|         None = 0, | ||||
|         Move = 1, | ||||
|         Copy = 2, | ||||
|         Rename = 3, | ||||
|         Zip = 4, | ||||
|         Delete = 5, | ||||
|         MoveFolder = 6, | ||||
|         CopyFolder = 7, | ||||
|         DeleteFolder = 8 | ||||
|     } | ||||
|     public enum PreProcessingModeEnum | ||||
|     { | ||||
|         None = 0, | ||||
|         Process = 1 | ||||
|     } | ||||
|     public enum IfFileExistEnum | ||||
|     { | ||||
|         Overwrite = 0, | ||||
|         LeaveFiles = 1, | ||||
|         Delete = 2 | ||||
|     } | ||||
|     public enum IfPostProcessingFailsEnum | ||||
|     { | ||||
|         LeaveFiles = 0, | ||||
|         Delete = 1 | ||||
|     } | ||||
|     public enum FileScanningOptionEnum | ||||
|     { | ||||
|         FileWatcher = 0, | ||||
|         TimeBased = 1 | ||||
|     } | ||||
|     public enum ZipModeEnum | ||||
|     { | ||||
|         ZipByAmountOrTime = 0, | ||||
|         ZipByFileName = 1, | ||||
|         ZipBySubFolderName = 2 | ||||
|     } | ||||
|     public enum FileAgeFilterEnum | ||||
|     { | ||||
|         IgnoreNewer = 0, | ||||
|         IgnoreOlder = 1 | ||||
|     } | ||||
| } | ||||
| @ -2,13 +2,12 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.SelfDescription | ||||
| { | ||||
|     public class FileConnectorParameterTypeDefinitionProvider | ||||
|     { | ||||
|         public FileConnectorParameterTypeDefinitionProvider() { } | ||||
| namespace Adaptation.Ifx.Eaf.EquipmentConnector.File.SelfDescription; | ||||
|  | ||||
|         public IEnumerable<ParameterTypeDefinition> GetAllParameterTypeDefinition() { return null; } | ||||
|         public ParameterTypeDefinition GetParameterTypeDefinition(string name) { return null; } | ||||
|     } | ||||
| public class FileConnectorParameterTypeDefinitionProvider | ||||
| { | ||||
|     public FileConnectorParameterTypeDefinitionProvider() { } | ||||
|  | ||||
|     public IEnumerable<ParameterTypeDefinition> GetAllParameterTypeDefinition() => null; | ||||
|     public ParameterTypeDefinition GetParameterTypeDefinition(string name) => null; | ||||
| } | ||||
| @ -1,10 +1,9 @@ | ||||
| using System; | ||||
|  | ||||
| namespace Adaptation.PeerGroup.GCL.Annotations | ||||
| namespace Adaptation.PeerGroup.GCL.Annotations; | ||||
|  | ||||
| [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.Delegate, AllowMultiple = false, Inherited = true)] | ||||
| public sealed class NotNullAttribute : Attribute | ||||
| { | ||||
|     [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.Delegate, AllowMultiple = false, Inherited = true)] | ||||
|     public sealed class NotNullAttribute : Attribute | ||||
|     { | ||||
|         public NotNullAttribute() { } | ||||
|     } | ||||
|     public NotNullAttribute() { } | ||||
| } | ||||
| @ -1,8 +1,7 @@ | ||||
| namespace Adaptation.PeerGroup.GCL.SecsDriver | ||||
| namespace Adaptation.PeerGroup.GCL.SecsDriver; | ||||
|  | ||||
| public enum HsmsConnectionMode | ||||
| { | ||||
|     public enum HsmsConnectionMode | ||||
|     { | ||||
|         Active = 0, | ||||
|         Passive = 1 | ||||
|     } | ||||
|     Active = 0, | ||||
|     Passive = 1 | ||||
| } | ||||
| @ -1,8 +1,7 @@ | ||||
| namespace Adaptation.PeerGroup.GCL.SecsDriver | ||||
| namespace Adaptation.PeerGroup.GCL.SecsDriver; | ||||
|  | ||||
| public enum HsmsSessionMode | ||||
| { | ||||
|     public enum HsmsSessionMode | ||||
|     { | ||||
|         MultiSession = 0, | ||||
|         SingleSession = 1 | ||||
|     } | ||||
|     MultiSession = 0, | ||||
|     SingleSession = 1 | ||||
| } | ||||
| @ -1,8 +1,7 @@ | ||||
| namespace Adaptation.PeerGroup.GCL.SecsDriver | ||||
| namespace Adaptation.PeerGroup.GCL.SecsDriver; | ||||
|  | ||||
| public enum SecsTransportType | ||||
| { | ||||
|     public enum SecsTransportType | ||||
|     { | ||||
|         HSMS = 0, | ||||
|         Serial = 1 | ||||
|     } | ||||
|     HSMS = 0, | ||||
|     Serial = 1 | ||||
| } | ||||
| @ -1,16 +1,15 @@ | ||||
| namespace Adaptation.PeerGroup.GCL.SecsDriver | ||||
| namespace Adaptation.PeerGroup.GCL.SecsDriver; | ||||
|  | ||||
| public enum SerialBaudRate | ||||
| { | ||||
|     public enum SerialBaudRate | ||||
|     { | ||||
|         Baud9600 = 0, | ||||
|         Baud19200 = 1, | ||||
|         Baud4800 = 2, | ||||
|         Baud2400 = 3, | ||||
|         Baud1200 = 4, | ||||
|         Baud300 = 5, | ||||
|         Baud150 = 6, | ||||
|         Baud38400 = 7, | ||||
|         Baud57600 = 8, | ||||
|         Baud115200 = 9 | ||||
|     } | ||||
|     Baud9600 = 0, | ||||
|     Baud19200 = 1, | ||||
|     Baud4800 = 2, | ||||
|     Baud2400 = 3, | ||||
|     Baud1200 = 4, | ||||
|     Baud300 = 5, | ||||
|     Baud150 = 6, | ||||
|     Baud38400 = 7, | ||||
|     Baud57600 = 8, | ||||
|     Baud115200 = 9 | ||||
| } | ||||
| @ -4,145 +4,139 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.Shared.Duplicator | ||||
| namespace Adaptation.Shared.Duplicator; | ||||
|  | ||||
| public class Description : IDescription, Properties.IDescription | ||||
| { | ||||
|  | ||||
|     public class Description : IDescription, Properties.IDescription | ||||
|     public int Test { get; set; } | ||||
|     public int Count { get; set; } | ||||
|     public int Index { get; set; } | ||||
|     // | ||||
|     public string EventName { get; set; } | ||||
|     public string NullData { get; set; } | ||||
|     public string JobID { get; set; } | ||||
|     public string Sequence { get; set; } | ||||
|     public string MesEntity { get; set; } | ||||
|     public string ReportFullPath { get; set; } | ||||
|     public string ProcessJobID { get; set; } | ||||
|     public string MID { get; set; } | ||||
|     public string Date { get; set; } //2021-10-23 | ||||
|  | ||||
|     string IDescription.GetEventDescription() => "File Has been read and parsed"; | ||||
|  | ||||
|     List<string> IDescription.GetNames(IFileRead fileRead, Logistics logistics) | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         IDescription description = GetDefault(fileRead, logistics); | ||||
|         string json = JsonSerializer.Serialize(description, description.GetType()); | ||||
|         object @object = JsonSerializer.Deserialize<object>(json); | ||||
|         if (@object is not JsonElement jsonElement) | ||||
|             throw new Exception(); | ||||
|         foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) | ||||
|             results.Add(jsonProperty.Name); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         public int Test { get; set; } | ||||
|         public int Count { get; set; } | ||||
|         public int Index { get; set; } | ||||
|         // | ||||
|         public string EventName { get; set; } | ||||
|         public string NullData { get; set; } | ||||
|         public string JobID { get; set; } | ||||
|         public string Sequence { get; set; } | ||||
|         public string MesEntity { get; set; } | ||||
|         public string ReportFullPath { get; set; } | ||||
|         public string ProcessJobID { get; set; } | ||||
|         public string MID { get; set; } | ||||
|         public string Date { get; set; } //2021-10-23 | ||||
|     List<string> IDescription.GetDetailNames() | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         string IDescription.GetEventDescription() | ||||
|     List<string> IDescription.GetHeaderNames() | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     IDescription IDescription.GetDisplayNames() | ||||
|     { | ||||
|         Description result = GetDisplayNames(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     List<string> IDescription.GetParameterNames() | ||||
|     { | ||||
|         List<string> 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<object>(json); | ||||
|         results = ((JsonElement)@object).EnumerateObject().ToArray(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<string> IDescription.GetPairedParameterNames() | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<string> IDescription.GetIgnoreParameterNames(Test test) | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     IDescription IDescription.GetDefaultDescription(IFileRead fileRead, Logistics logistics) | ||||
|     { | ||||
|         Description result = GetDefault(fileRead, logistics); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     Dictionary<string, string> IDescription.GetDisplayNamesJsonElement(IFileRead fileRead) | ||||
|     { | ||||
|         Dictionary<string, string> results = new(); | ||||
|         IDescription description = GetDisplayNames(); | ||||
|         string json = JsonSerializer.Serialize(description, description.GetType()); | ||||
|         JsonElement jsonElement = JsonSerializer.Deserialize<JsonElement>(json); | ||||
|         foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) | ||||
|         { | ||||
|             return "File Has been read and parsed"; | ||||
|             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<string> IDescription.GetNames(IFileRead fileRead, Logistics logistics) | ||||
|     List<IDescription> IDescription.GetDescriptions(IFileRead fileRead, Logistics logistics, List<Test> tests, IProcessData iProcessData) | ||||
|     { | ||||
|         List<IDescription> results = new(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private Description GetDisplayNames() | ||||
|     { | ||||
|         Description result = new(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private Description GetDefault(IFileRead fileRead, Logistics logistics) | ||||
|     { | ||||
|         Description result = new() | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             IDescription description = GetDefault(fileRead, logistics); | ||||
|             string json = JsonSerializer.Serialize(description, description.GetType()); | ||||
|             object @object = JsonSerializer.Deserialize<object>(json); | ||||
|             if (@object is not JsonElement jsonElement) | ||||
|                 throw new Exception(); | ||||
|             foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject()) | ||||
|                 results.Add(jsonProperty.Name); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetDetailNames() | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetHeaderNames() | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         IDescription IDescription.GetDisplayNames() | ||||
|         { | ||||
|             Description result = GetDisplayNames(); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetParameterNames() | ||||
|         { | ||||
|             List<string> 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<object>(json); | ||||
|             results = ((JsonElement)@object).EnumerateObject().ToArray(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetPairedParameterNames() | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         List<string> IDescription.GetIgnoreParameterNames(Test test) | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         IDescription IDescription.GetDefaultDescription(IFileRead fileRead, Logistics logistics) | ||||
|         { | ||||
|             Description result = GetDefault(fileRead, logistics); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         Dictionary<string, string> IDescription.GetDisplayNamesJsonElement(IFileRead fileRead) | ||||
|         { | ||||
|             Dictionary<string, string> results = new(); | ||||
|             IDescription description = GetDisplayNames(); | ||||
|             string json = JsonSerializer.Serialize(description, description.GetType()); | ||||
|             JsonElement jsonElement = JsonSerializer.Deserialize<JsonElement>(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> IDescription.GetDescriptions(IFileRead fileRead, Logistics logistics, List<Test> tests, IProcessData iProcessData) | ||||
|         { | ||||
|             List<IDescription> results = new(); | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         private Description GetDisplayNames() | ||||
|         { | ||||
|             Description result = new(); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         private Description GetDefault(IFileRead fileRead, Logistics logistics) | ||||
|         { | ||||
|             Description result = new() | ||||
|             { | ||||
|                 Test = -1, | ||||
|                 Count = 0, | ||||
|                 Index = -1, | ||||
|                 // | ||||
|                 EventName = fileRead.EventName, | ||||
|                 NullData = fileRead.NullData, | ||||
|                 JobID = fileRead.CellInstanceName, | ||||
|                 Sequence = logistics.Sequence.ToString(), | ||||
|                 MesEntity = fileRead.MesEntity, | ||||
|                 ReportFullPath = logistics.ReportFullPath, | ||||
|                 ProcessJobID = logistics.ProcessJobID, | ||||
|                 MID = logistics.MID, | ||||
|                 Date = logistics.DateTimeFromSequence.ToUniversalTime().ToString("MM/dd/yyyy HH:mm:ss") | ||||
|             }; | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|             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; | ||||
|     } | ||||
|  | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,223 +1,208 @@ | ||||
| using Adaptation.Shared.Methods; | ||||
| using Adaptation.Shared.Methods; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace Adaptation.Shared | ||||
| namespace Adaptation.Shared; | ||||
|  | ||||
| public class Logistics : ILogistics | ||||
| { | ||||
|  | ||||
|     public class Logistics : ILogistics | ||||
|     public object NullData { get; private set; } | ||||
|     public string JobID { get; private set; } //CellName | ||||
|     public long Sequence { get; private set; } //Ticks | ||||
|     public DateTime DateTimeFromSequence { get; private set; } | ||||
|     public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; } | ||||
|     public string MesEntity { get; private set; } //SPC | ||||
|     public string ReportFullPath { get; private set; } //Extract file | ||||
|     public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics) | ||||
|     public string MID { get; set; } //Lot & Pocket || Lot | ||||
|     public List<string> Tags { get; set; } | ||||
|     public List<string> Logistics1 { get; set; } | ||||
|     public List<Logistics2> Logistics2 { get; set; } | ||||
|  | ||||
|     public Logistics(IFileRead fileRead) | ||||
|     { | ||||
|         DateTime dateTime = DateTime.Now; | ||||
|         NullData = null; | ||||
|         Sequence = dateTime.Ticks; | ||||
|         DateTimeFromSequence = dateTime; | ||||
|         JobID = fileRead.CellInstanceName; | ||||
|         TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; | ||||
|         MesEntity = DefaultMesEntity(dateTime); | ||||
|         ReportFullPath = string.Empty; | ||||
|         ProcessJobID = nameof(ProcessJobID); | ||||
|         MID = nameof(MID); | ||||
|         Tags = new List<string>(); | ||||
|         Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); | ||||
|         Logistics2 = new List<Logistics2>(); | ||||
|     } | ||||
|  | ||||
|         public object NullData { get; private set; } | ||||
|         public string JobID { get; private set; } //CellName | ||||
|         public long Sequence { get; private set; } //Ticks | ||||
|         public DateTime DateTimeFromSequence { get; private set; } | ||||
|         public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; } | ||||
|         public string MesEntity { get; private set; } //SPC | ||||
|         public string ReportFullPath { get; private set; } //Extract file | ||||
|         public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics) | ||||
|         public string MID { get; set; } //Lot & Pocket || Lot | ||||
|         public List<string> Tags { get; set; } | ||||
|         public List<string> Logistics1 { get; set; } | ||||
|         public List<Logistics2> Logistics2 { get; set; } | ||||
|  | ||||
|         public Logistics(IFileRead fileRead) | ||||
|     public Logistics(IFileRead fileRead, string reportFullPath, bool useSplitForMID, int? fileInfoLength = null) | ||||
|     { | ||||
|         if (string.IsNullOrEmpty(fileRead.CellInstanceName)) | ||||
|             throw new Exception(); | ||||
|         if (string.IsNullOrEmpty(fileRead.MesEntity)) | ||||
|             throw new Exception(); | ||||
|         NullData = fileRead.NullData; | ||||
|         FileInfo fileInfo = new(reportFullPath); | ||||
|         DateTime dateTime = fileInfo.LastWriteTime; | ||||
|         if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value) | ||||
|             dateTime = dateTime.AddTicks(-1); | ||||
|         JobID = fileRead.CellInstanceName; | ||||
|         Sequence = dateTime.Ticks; | ||||
|         DateTimeFromSequence = dateTime; | ||||
|         TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; | ||||
|         MesEntity = fileRead.MesEntity; | ||||
|         ReportFullPath = fileInfo.FullName; | ||||
|         ProcessJobID = nameof(ProcessJobID); | ||||
|         string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); | ||||
|         if (useSplitForMID) | ||||
|         { | ||||
|             if (fileNameWithoutExtension.IndexOf(".") > -1) | ||||
|                 fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim(); | ||||
|             if (fileNameWithoutExtension.IndexOf("_") > -1) | ||||
|                 fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim(); | ||||
|             if (fileNameWithoutExtension.IndexOf("-") > -1) | ||||
|                 fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim(); | ||||
|         } | ||||
|         MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower()); | ||||
|         Tags = new List<string>(); | ||||
|         Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); | ||||
|         Logistics2 = new List<Logistics2>(); | ||||
|     } | ||||
|  | ||||
|     public Logistics(string reportFullPath, string logistics) | ||||
|     { | ||||
|         string key; | ||||
|         DateTime dateTime; | ||||
|         string[] segments; | ||||
|         Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); | ||||
|         if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1")) | ||||
|         { | ||||
|             DateTime dateTime = DateTime.Now; | ||||
|             NullData = null; | ||||
|             JobID = "null"; | ||||
|             dateTime = new FileInfo(reportFullPath).LastWriteTime; | ||||
|             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); | ||||
|             ReportFullPath = reportFullPath; | ||||
|             ProcessJobID = "R##"; | ||||
|             MID = "null"; | ||||
|             Tags = new List<string>(); | ||||
|             Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); | ||||
|             Logistics2 = new List<Logistics2>(); | ||||
|         } | ||||
|  | ||||
|         public Logistics(IFileRead fileRead, string reportFullPath, bool useSplitForMID, int? fileInfoLength = null) | ||||
|         else | ||||
|         { | ||||
|             if (string.IsNullOrEmpty(fileRead.CellInstanceName)) | ||||
|                 throw new Exception(); | ||||
|             if (string.IsNullOrEmpty(fileRead.MesEntity)) | ||||
|                 throw new Exception(); | ||||
|             NullData = fileRead.NullData; | ||||
|             FileInfo fileInfo = new(reportFullPath); | ||||
|             DateTime dateTime = fileInfo.LastWriteTime; | ||||
|             if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value) | ||||
|                 dateTime = dateTime.AddTicks(-1); | ||||
|             JobID = fileRead.CellInstanceName; | ||||
|             string logistics1Line1 = Logistics1[0]; | ||||
|             key = "NULL_DATA="; | ||||
|             if (!logistics1Line1.Contains(key)) | ||||
|                 NullData = null; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 NullData = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             key = "JOBID="; | ||||
|             if (!logistics1Line1.Contains(key)) | ||||
|                 JobID = "null"; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 JobID = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             key = "SEQUENCE="; | ||||
|             if (!logistics1Line1.Contains(key)) | ||||
|                 dateTime = new FileInfo(reportFullPath).LastWriteTime; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks) | ||||
|                     dateTime = new FileInfo(reportFullPath).LastWriteTime; | ||||
|                 else | ||||
|                     dateTime = new DateTime(sequence); | ||||
|             } | ||||
|             Sequence = dateTime.Ticks; | ||||
|             DateTimeFromSequence = dateTime; | ||||
|             TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; | ||||
|             MesEntity = fileRead.MesEntity; | ||||
|             ReportFullPath = fileInfo.FullName; | ||||
|             ProcessJobID = nameof(ProcessJobID); | ||||
|             string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); | ||||
|             if (useSplitForMID) | ||||
|             DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime; | ||||
|             if (TotalSecondsSinceLastWriteTimeFromSequence > 600) | ||||
|             { | ||||
|                 if (fileNameWithoutExtension.IndexOf(".") > -1) | ||||
|                     fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim(); | ||||
|                 if (fileNameWithoutExtension.IndexOf("_") > -1) | ||||
|                     fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim(); | ||||
|                 if (fileNameWithoutExtension.IndexOf("-") > -1) | ||||
|                     fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim(); | ||||
|                 if (lastWriteTime != dateTime) | ||||
|                     try | ||||
|                     { File.SetLastWriteTime(reportFullPath, dateTime); } | ||||
|                     catch (Exception) { } | ||||
|             } | ||||
|             MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower()); | ||||
|             Tags = new List<string>(); | ||||
|             Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); | ||||
|             Logistics2 = new List<Logistics2>(); | ||||
|         } | ||||
|  | ||||
|         public Logistics(string reportFullPath, string logistics) | ||||
|         { | ||||
|             string key; | ||||
|             DateTime dateTime; | ||||
|             string[] segments; | ||||
|             Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); | ||||
|             if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1")) | ||||
|             { | ||||
|                 NullData = null; | ||||
|                 JobID = "null"; | ||||
|                 dateTime = new FileInfo(reportFullPath).LastWriteTime; | ||||
|                 Sequence = dateTime.Ticks; | ||||
|                 DateTimeFromSequence = dateTime; | ||||
|                 TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; | ||||
|             key = "MES_ENTITY="; | ||||
|             if (!logistics1Line1.Contains(key)) | ||||
|                 MesEntity = DefaultMesEntity(dateTime); | ||||
|                 ReportFullPath = reportFullPath; | ||||
|                 ProcessJobID = "R##"; | ||||
|                 MID = "null"; | ||||
|                 Tags = new List<string>(); | ||||
|                 Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); | ||||
|                 Logistics2 = new List<Logistics2>(); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 string logistics1Line1 = Logistics1[0]; | ||||
|                 key = "NULL_DATA="; | ||||
|                 if (!logistics1Line1.Contains(key)) | ||||
|                     NullData = null; | ||||
|                 else | ||||
|                 { | ||||
|                     segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                     NullData = segments[1].Split(';')[0]; | ||||
|                 } | ||||
|                 key = "JOBID="; | ||||
|                 if (!logistics1Line1.Contains(key)) | ||||
|                     JobID = "null"; | ||||
|                 else | ||||
|                 { | ||||
|                     segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                     JobID = segments[1].Split(';')[0]; | ||||
|                 } | ||||
|                 key = "SEQUENCE="; | ||||
|                 if (!logistics1Line1.Contains(key)) | ||||
|                     dateTime = new FileInfo(reportFullPath).LastWriteTime; | ||||
|                 else | ||||
|                 { | ||||
|                     segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                     if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks) | ||||
|                         dateTime = new FileInfo(reportFullPath).LastWriteTime; | ||||
|                     else | ||||
|                         dateTime = new DateTime(sequence); | ||||
|                 } | ||||
|                 Sequence = dateTime.Ticks; | ||||
|                 DateTimeFromSequence = dateTime; | ||||
|                 TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; | ||||
|                 DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime; | ||||
|                 if (TotalSecondsSinceLastWriteTimeFromSequence > 600) | ||||
|                 { | ||||
|                     if (lastWriteTime != dateTime) | ||||
|                         try | ||||
|                         { File.SetLastWriteTime(reportFullPath, dateTime); } | ||||
|                         catch (Exception) { } | ||||
|                 } | ||||
|                 key = "MES_ENTITY="; | ||||
|                 if (!logistics1Line1.Contains(key)) | ||||
|                     MesEntity = DefaultMesEntity(dateTime); | ||||
|                 else | ||||
|                 { | ||||
|                     segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                     MesEntity = segments[1].Split(';')[0]; | ||||
|                 } | ||||
|                 ReportFullPath = reportFullPath; | ||||
|                 key = "PROCESS_JOBID="; | ||||
|                 if (!logistics1Line1.Contains(key)) | ||||
|                     ProcessJobID = "R##"; | ||||
|                 else | ||||
|                 { | ||||
|                     segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                     ProcessJobID = segments[1].Split(';')[0]; | ||||
|                 } | ||||
|                 key = "MID="; | ||||
|                 if (!logistics1Line1.Contains(key)) | ||||
|                     MID = "null"; | ||||
|                 else | ||||
|                 { | ||||
|                     segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                     MID = segments[1].Split(';')[0]; | ||||
|                 } | ||||
|                 segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 MesEntity = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             Logistics2 logistics2; | ||||
|             Tags = new List<string>(); | ||||
|             Logistics2 = new List<Logistics2>(); | ||||
|             for (int i = 1; i < Logistics1.Count(); i++) | ||||
|             ReportFullPath = reportFullPath; | ||||
|             key = "PROCESS_JOBID="; | ||||
|             if (!logistics1Line1.Contains(key)) | ||||
|                 ProcessJobID = "R##"; | ||||
|             else | ||||
|             { | ||||
|                 if (Logistics1[i].StartsWith("LOGISTICS_2")) | ||||
|                 { | ||||
|                     logistics2 = new Logistics2(Logistics1[i]); | ||||
|                     Logistics2.Add(logistics2); | ||||
|                 } | ||||
|                 segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 ProcessJobID = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             for (int i = Logistics1.Count() - 1; i > -1; i--) | ||||
|             key = "MID="; | ||||
|             if (!logistics1Line1.Contains(key)) | ||||
|                 MID = "null"; | ||||
|             else | ||||
|             { | ||||
|                 if (Logistics1[i].StartsWith("LOGISTICS_2")) | ||||
|                     Logistics1.RemoveAt(i); | ||||
|                 segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 MID = segments[1].Split(';')[0]; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public Logistics ShallowCopy() | ||||
|         Logistics2 logistics2; | ||||
|         Tags = new List<string>(); | ||||
|         Logistics2 = new List<Logistics2>(); | ||||
|         for (int i = 1; i < Logistics1.Count; i++) | ||||
|         { | ||||
|             return (Logistics)MemberwiseClone(); | ||||
|             if (Logistics1[i].StartsWith("LOGISTICS_2")) | ||||
|             { | ||||
|                 logistics2 = new Logistics2(Logistics1[i]); | ||||
|                 Logistics2.Add(logistics2); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private string DefaultMesEntity(DateTime dateTime) | ||||
|         for (int i = Logistics1.Count - 1; i > -1; i--) | ||||
|         { | ||||
|             return string.Concat(dateTime.Ticks, "_MES_ENTITY"); | ||||
|         } | ||||
|  | ||||
|         internal string GetLotViaMostCommonMethod() | ||||
|         { | ||||
|             return MID.Substring(0, MID.Length - 2); | ||||
|         } | ||||
|  | ||||
|         internal string GetPocketNumberViaMostCommonMethod() | ||||
|         { | ||||
|             return MID.Substring(MID.Length - 2); | ||||
|         } | ||||
|  | ||||
|         internal void Update(string dateTime, string processJobID, string mid) | ||||
|         { | ||||
|             if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted)) | ||||
|                 dateTimeCasted = DateTime.Now; | ||||
|             NullData = null; | ||||
|             //JobID = Description.GetCellName(); | ||||
|             Sequence = dateTimeCasted.Ticks; | ||||
|             DateTimeFromSequence = dateTimeCasted; | ||||
|             TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds; | ||||
|             //MesEntity = DefaultMesEntity(dateTime); | ||||
|             //ReportFullPath = string.Empty; | ||||
|             ProcessJobID = processJobID; | ||||
|             MID = mid; | ||||
|             Tags = new List<string>(); | ||||
|             Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); | ||||
|             Logistics2 = new List<Logistics2>(); | ||||
|             if (Logistics1[i].StartsWith("LOGISTICS_2")) | ||||
|                 Logistics1.RemoveAt(i); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public Logistics ShallowCopy() => (Logistics)MemberwiseClone(); | ||||
|  | ||||
|     private static string DefaultMesEntity(DateTime dateTime) => string.Concat(dateTime.Ticks, "_MES_ENTITY"); | ||||
|  | ||||
|     internal string GetLotViaMostCommonMethod() => MID.Substring(0, MID.Length - 2); | ||||
|  | ||||
|     internal string GetPocketNumberViaMostCommonMethod() => MID.Substring(MID.Length - 2); | ||||
|  | ||||
|     internal void Update(string dateTime, string processJobID, string mid) | ||||
|     { | ||||
|         if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted)) | ||||
|             dateTimeCasted = DateTime.Now; | ||||
|         NullData = null; | ||||
|         //JobID = Description.GetCellName(); | ||||
|         Sequence = dateTimeCasted.Ticks; | ||||
|         DateTimeFromSequence = dateTimeCasted; | ||||
|         TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds; | ||||
|         //MesEntity = DefaultMesEntity(dateTime); | ||||
|         //ReportFullPath = string.Empty; | ||||
|         ProcessJobID = processJobID; | ||||
|         MID = mid; | ||||
|         Tags = new List<string>(); | ||||
|         Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); | ||||
|         Logistics2 = new List<Logistics2>(); | ||||
|     } | ||||
| } | ||||
| @ -1,81 +1,78 @@ | ||||
| using System; | ||||
| using System; | ||||
|  | ||||
| namespace Adaptation.Shared | ||||
| namespace Adaptation.Shared; | ||||
|  | ||||
| public class Logistics2 : Methods.ILogistics2 | ||||
| { | ||||
|  | ||||
|     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) | ||||
|     { | ||||
|  | ||||
|         public string MID { get; private set; } | ||||
|         public string RunNumber { get; private set; } | ||||
|         public string SatelliteGroup { get; private set; } | ||||
|         public string PartNumber { get; private set; } | ||||
|         public string PocketNumber { get; private set; } | ||||
|         public string WaferLot { get; private set; } | ||||
|         public string Recipe { get; private set; } | ||||
|  | ||||
|         public Logistics2(string logistics2) | ||||
|         string key; | ||||
|         string[] segments; | ||||
|         key = "JOBID="; | ||||
|         if (!logistics2.Contains(key)) | ||||
|             MID = "null"; | ||||
|         else | ||||
|         { | ||||
|             string key; | ||||
|             string[] segments; | ||||
|             key = "JOBID="; | ||||
|             if (!logistics2.Contains(key)) | ||||
|                 MID = "null"; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 MID = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             key = "MID="; | ||||
|             if (!logistics2.Contains(key)) | ||||
|                 RunNumber = "null"; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 RunNumber = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             key = "INFO="; | ||||
|             if (!logistics2.Contains(key)) | ||||
|                 SatelliteGroup = "null"; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 SatelliteGroup = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             key = "PRODUCT="; | ||||
|             if (!logistics2.Contains(key)) | ||||
|                 PartNumber = "null"; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 PartNumber = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             key = "CHAMBER="; | ||||
|             if (!logistics2.Contains(key)) | ||||
|                 PocketNumber = "null"; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 PocketNumber = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             key = "WAFER_ID="; | ||||
|             if (!logistics2.Contains(key)) | ||||
|                 WaferLot = "null"; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 WaferLot = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             key = "PPID="; | ||||
|             if (!logistics2.Contains(key)) | ||||
|                 Recipe = "null"; | ||||
|             else | ||||
|             { | ||||
|                 segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 Recipe = segments[1].Split(';')[0]; | ||||
|             } | ||||
|             segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|             MID = segments[1].Split(';')[0]; | ||||
|         } | ||||
|         key = "MID="; | ||||
|         if (!logistics2.Contains(key)) | ||||
|             RunNumber = "null"; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|             RunNumber = segments[1].Split(';')[0]; | ||||
|         } | ||||
|         key = "INFO="; | ||||
|         if (!logistics2.Contains(key)) | ||||
|             SatelliteGroup = "null"; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|             SatelliteGroup = segments[1].Split(';')[0]; | ||||
|         } | ||||
|         key = "PRODUCT="; | ||||
|         if (!logistics2.Contains(key)) | ||||
|             PartNumber = "null"; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|             PartNumber = segments[1].Split(';')[0]; | ||||
|         } | ||||
|         key = "CHAMBER="; | ||||
|         if (!logistics2.Contains(key)) | ||||
|             PocketNumber = "null"; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|             PocketNumber = segments[1].Split(';')[0]; | ||||
|         } | ||||
|         key = "WAFER_ID="; | ||||
|         if (!logistics2.Contains(key)) | ||||
|             WaferLot = "null"; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|             WaferLot = segments[1].Split(';')[0]; | ||||
|         } | ||||
|         key = "PPID="; | ||||
|         if (!logistics2.Contains(key)) | ||||
|             Recipe = "null"; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); | ||||
|             Recipe = segments[1].Split(';')[0]; | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,25 +1,22 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.Shared.Methods | ||||
| namespace Adaptation.Shared.Methods; | ||||
|  | ||||
| public interface IDescription | ||||
| { | ||||
|  | ||||
|     public interface IDescription | ||||
|     { | ||||
|  | ||||
|         string GetEventDescription(); | ||||
|         List<string> GetDetailNames(); | ||||
|         List<string> GetHeaderNames(); | ||||
|         IDescription GetDisplayNames(); | ||||
|         List<string> GetParameterNames(); | ||||
|         List<string> GetPairedParameterNames(); | ||||
|         List<string> GetIgnoreParameterNames(Test test); | ||||
|         List<string> GetNames(IFileRead fileRead, Logistics logistics); | ||||
|         JsonProperty[] GetDefault(IFileRead fileRead, Logistics logistics); | ||||
|         Dictionary<string, string> GetDisplayNamesJsonElement(IFileRead fileRead); | ||||
|         IDescription GetDefaultDescription(IFileRead fileRead, Logistics logistics); | ||||
|         List<IDescription> GetDescriptions(IFileRead fileRead, Logistics logistics, List<Test> tests, IProcessData iProcessData); | ||||
|  | ||||
|     } | ||||
|     string GetEventDescription(); | ||||
|     List<string> GetDetailNames(); | ||||
|     List<string> GetHeaderNames(); | ||||
|     IDescription GetDisplayNames(); | ||||
|     List<string> GetParameterNames(); | ||||
|     List<string> GetPairedParameterNames(); | ||||
|     List<string> GetIgnoreParameterNames(Test test); | ||||
|     List<string> GetNames(IFileRead fileRead, Logistics logistics); | ||||
|     JsonProperty[] GetDefault(IFileRead fileRead, Logistics logistics); | ||||
|     Dictionary<string, string> GetDisplayNamesJsonElement(IFileRead fileRead); | ||||
|     IDescription GetDefaultDescription(IFileRead fileRead, Logistics logistics); | ||||
|     List<IDescription> GetDescriptions(IFileRead fileRead, Logistics logistics, List<Test> tests, IProcessData iProcessData); | ||||
|  | ||||
| } | ||||
| @ -3,24 +3,22 @@ using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.Shared.Methods | ||||
| namespace Adaptation.Shared.Methods; | ||||
|  | ||||
| public interface IFileRead : Properties.IFileRead | ||||
| { | ||||
|  | ||||
|     public interface IFileRead : Properties.IFileRead | ||||
|     { | ||||
|         void MoveArchive(); | ||||
|         void WaitForThread(); | ||||
|         JsonProperty[] GetDefault(); | ||||
|         void Callback(object state); | ||||
|         string GetEventDescription(); | ||||
|         List<string> GetHeaderNames(); | ||||
|         void CheckTests(Test[] tests, bool extra); | ||||
|         Dictionary<string, string> GetDisplayNamesJsonElement(); | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> ReExtract(); | ||||
|         List<IDescription> GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData); | ||||
|         void Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception = null); | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, string eventName); | ||||
|         string[] Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, string to, string from, string resolvedFileLocation, Exception exception); | ||||
|     } | ||||
|     void WaitForThread(); | ||||
|     JsonProperty[] GetDefault(); | ||||
|     void Callback(object state); | ||||
|     string GetEventDescription(); | ||||
|     List<string> GetHeaderNames(); | ||||
|     void CheckTests(Test[] tests, bool extra); | ||||
|     Dictionary<string, string> GetDisplayNamesJsonElement(); | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> ReExtract(); | ||||
|     List<IDescription> GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData); | ||||
|     void Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception = null); | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, string eventName); | ||||
|     string[] Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, string to, string from, string resolvedFileLocation, Exception exception); | ||||
|  | ||||
| } | ||||
| @ -1,8 +1,5 @@ | ||||
| namespace Adaptation.Shared.Methods | ||||
| namespace Adaptation.Shared.Methods; | ||||
|  | ||||
| public interface ILogistics : Properties.ILogistics | ||||
| { | ||||
|  | ||||
|     public interface ILogistics : Properties.ILogistics | ||||
|     { | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,8 +1,5 @@ | ||||
| namespace Adaptation.Shared.Methods | ||||
| namespace Adaptation.Shared.Methods; | ||||
|  | ||||
| public interface ILogistics2 : Properties.ILogistics2 | ||||
| { | ||||
|  | ||||
|     public interface ILogistics2 : Properties.ILogistics2 | ||||
|     { | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -3,15 +3,12 @@ using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.Shared.Methods | ||||
| namespace Adaptation.Shared.Methods; | ||||
|  | ||||
| public interface IProcessData : Properties.IProcessData | ||||
| { | ||||
|  | ||||
|     public interface IProcessData : Properties.IProcessData | ||||
|     { | ||||
|  | ||||
|         string GetCurrentReactor(IFileRead fileRead, Logistics logistics, Dictionary<string, string> reactors); | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> GetResults(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection); | ||||
|  | ||||
|     } | ||||
|     string GetCurrentReactor(IFileRead fileRead, Logistics logistics, Dictionary<string, string> reactors); | ||||
|     Tuple<string, Test[], JsonElement[], List<FileInfo>> GetResults(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection); | ||||
|  | ||||
| } | ||||
| @ -1,9 +1,8 @@ | ||||
| namespace Adaptation.Shared.Methods | ||||
| namespace Adaptation.Shared.Methods; | ||||
|  | ||||
| public interface ISMTP | ||||
| { | ||||
|     public interface ISMTP | ||||
|     { | ||||
|         void SendLowPriorityEmailMessage(string subject, string body); | ||||
|         void SendHighPriorityEmailMessage(string subject, string body); | ||||
|         void SendNormalPriorityEmailMessage(string subject, string body); | ||||
|     } | ||||
|     void SendLowPriorityEmailMessage(string subject, string body); | ||||
|     void SendHighPriorityEmailMessage(string subject, string body); | ||||
|     void SendNormalPriorityEmailMessage(string subject, string body); | ||||
| } | ||||
| @ -1,306 +1,300 @@ | ||||
| using System; | ||||
| using System.IO; | ||||
|  | ||||
| namespace Adaptation.Shared.Metrology | ||||
| namespace Adaptation.Shared.Metrology; | ||||
|  | ||||
| public class ScopeInfo : Properties.IScopeInfo | ||||
| { | ||||
|  | ||||
|     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 = "") | ||||
|     { | ||||
|  | ||||
|         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 = "") | ||||
|         { | ||||
|             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() | ||||
|         { | ||||
|             return (ScopeInfo)MemberwiseClone(); | ||||
|         } | ||||
|  | ||||
|         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(); | ||||
|  | ||||
| } | ||||
| @ -1,22 +1,19 @@ | ||||
| namespace Adaptation.Shared.Metrology | ||||
| namespace Adaptation.Shared.Metrology; | ||||
|  | ||||
| public partial class WS | ||||
| { | ||||
|  | ||||
|     public partial class WS | ||||
|     public class Attachment | ||||
|     { | ||||
|         public class Attachment | ||||
|  | ||||
|         public string UniqueId { get; set; } | ||||
|         public string DestinationFileName { get; set; } | ||||
|         public string SourceFileName { get; set; } | ||||
|  | ||||
|         public Attachment(string uniqueId, string destinationFileName, string sourceFileName) | ||||
|         { | ||||
|  | ||||
|             public string UniqueId { get; set; } | ||||
|             public string DestinationFileName { get; set; } | ||||
|             public string SourceFileName { get; set; } | ||||
|  | ||||
|             public Attachment(string uniqueId, string destinationFileName, string sourceFileName) | ||||
|             { | ||||
|                 UniqueId = uniqueId; | ||||
|                 DestinationFileName = destinationFileName; | ||||
|                 SourceFileName = sourceFileName; | ||||
|             } | ||||
|  | ||||
|             UniqueId = uniqueId; | ||||
|             DestinationFileName = destinationFileName; | ||||
|             SourceFileName = sourceFileName; | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| @ -1,33 +1,27 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.Shared.Metrology | ||||
| namespace Adaptation.Shared.Metrology; | ||||
|  | ||||
| public partial class WS | ||||
| { | ||||
|  | ||||
|     public partial class WS | ||||
|     // this class represents the response from the Inbound API endpoint | ||||
|     public class Results | ||||
|     { | ||||
|         // this class represents the response from the Inbound API endpoint | ||||
|         public class Results | ||||
|         { | ||||
|             // true or false if data was written to the database | ||||
|             public bool Success { get; set; } | ||||
|         // true or false if data was written to the database | ||||
|         public bool Success { get; set; } | ||||
|  | ||||
|             // if true, contains ID of the Header record in the database | ||||
|             public long HeaderID { get; set; } | ||||
|         // if true, contains ID of the Header record in the database | ||||
|         public long HeaderID { get; set; } | ||||
|  | ||||
|             // if false, this collection will contain a list of errors | ||||
|             public List<string> Errors { get; set; } | ||||
|         // if false, this collection will contain a list of errors | ||||
|         public List<string> Errors { get; set; } | ||||
|  | ||||
|             // this collection will contain a list of warnings, they will not prevent data from being saved | ||||
|             public List<string> Warnings { get; set; } | ||||
|  | ||||
|             // this is just a helper function to make displaying the results easier | ||||
|             public override string ToString() | ||||
|             { | ||||
|                 return JsonSerializer.Serialize(this, GetType()); | ||||
|             } | ||||
|         } | ||||
|         // this collection will contain a list of warnings, they will not prevent data from being saved | ||||
|         public List<string> Warnings { get; set; } | ||||
|  | ||||
|         // this is just a helper function to make displaying the results easier | ||||
|         public override string ToString() => JsonSerializer.Serialize(this, GetType()); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -4,124 +4,119 @@ using System.Net.Http; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.Shared.Metrology | ||||
| namespace Adaptation.Shared.Metrology; | ||||
|  | ||||
| public partial class WS | ||||
| { | ||||
|  | ||||
|     public partial class WS | ||||
|     public static Tuple<string, Results> SendData(string url, object payload, int timeoutSeconds = 120) | ||||
|     { | ||||
|  | ||||
|         public static Tuple<string, Results> SendData(string url, object payload, int timeoutSeconds = 120) | ||||
|         Results results = new(); | ||||
|         string resultsJson = string.Empty; | ||||
|         try | ||||
|         { | ||||
|             Results results = new Results(); | ||||
|             string resultsJson = string.Empty; | ||||
|             try | ||||
|             string json = JsonSerializer.Serialize(payload, payload.GetType()); | ||||
|             if (string.IsNullOrEmpty(url) || !url.Contains(":") || !url.Contains(".")) | ||||
|                 throw new Exception("Invalid URL"); | ||||
|             using (HttpClient httpClient = new()) | ||||
|             { | ||||
|                 string json = JsonSerializer.Serialize(payload, payload.GetType()); | ||||
|                 if (string.IsNullOrEmpty(url) || !url.Contains(":") || !url.Contains(".")) | ||||
|                     throw new Exception("Invalid URL"); | ||||
|                 using (HttpClient httpClient = new HttpClient()) | ||||
|                 { | ||||
|                     httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0); | ||||
|                     HttpRequestMessage httpRequestMessage = new HttpRequestMessage | ||||
|                     { | ||||
|                         RequestUri = new Uri(url), | ||||
|                         Method = HttpMethod.Post, | ||||
|                         Content = new StringContent(json, Encoding.UTF8, "application/json") | ||||
|                     }; | ||||
|                     HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead).Result; | ||||
|                     resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result; | ||||
|                     results = JsonSerializer.Deserialize<Results>(resultsJson); | ||||
|                 } | ||||
|                 if (!results.Success) | ||||
|                     results.Errors.Add(results.ToString()); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 Exception exception = e; | ||||
|                 StringBuilder stringBuilder = new StringBuilder(); | ||||
|                 while (!(exception is null)) | ||||
|                 { | ||||
|                     stringBuilder.AppendLine(exception.Message); | ||||
|                     exception = exception.InnerException; | ||||
|                 } | ||||
|                 if (results.Errors is null) | ||||
|                     results.Errors = new List<string>(); | ||||
|                 results.Errors.Add(stringBuilder.ToString()); | ||||
|             } | ||||
|             return new Tuple<string, Results>(resultsJson, results); | ||||
|         } | ||||
|  | ||||
|         // this method is a wrapper for attaching a file to either a header or data record | ||||
|         //   URL is the same URL used for SendData, ex: http://localhost/api/inbound/CDE | ||||
|         //   attachToHeaderId is the ID returned by SendData  | ||||
|         //   attachToDataUniqueId is the string unique ID for the data record, aka the Title of the Sharepoint list entry | ||||
|         //   fileContents is a byte array with the contents of the file | ||||
|         //   fileName is which attachment this is, image.pdf, data.pdf, data.txt, header.pdf, etc | ||||
|         //   timeoutSeconds is configured as the request timeout | ||||
|         // this method will either succeed or throw an exception | ||||
|         // also, this has been made synchronous | ||||
|         public static void AttachFile(string url, long attachToHeaderId, string attachToDataUniqueId, byte[] fileContents, string fileName, int timeoutSeconds = 60) | ||||
|         { | ||||
|             using (HttpClient httpClient = new HttpClient()) | ||||
|             { | ||||
|                 string requestUrl = url + "/attachment?headerid=" + attachToHeaderId.ToString(); | ||||
|                 if (!string.IsNullOrWhiteSpace(attachToDataUniqueId)) | ||||
|                 { | ||||
|                     requestUrl += "&datauniqueid="; | ||||
|                     requestUrl += System.Net.WebUtility.UrlEncode(attachToDataUniqueId); | ||||
|                 } | ||||
|                 requestUrl += "&filename="; // this is just so the web server log shows the filename | ||||
|                 requestUrl += System.Net.WebUtility.UrlEncode(fileName); | ||||
|  | ||||
|                 httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0); | ||||
|  | ||||
|                 MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent(); | ||||
|                 ByteArrayContent byteArrayContent = new ByteArrayContent(fileContents); | ||||
|                 byteArrayContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); | ||||
|  | ||||
|                 multipartFormDataContent.Add(byteArrayContent, "attachment", fileName); | ||||
|  | ||||
|                 HttpResponseMessage httpResponseMessage = httpClient.PostAsync(requestUrl, multipartFormDataContent).Result; | ||||
|  | ||||
|                 if (httpResponseMessage.IsSuccessStatusCode) | ||||
|                     return; | ||||
|  | ||||
|                 string resultBody = httpResponseMessage.Content.ReadAsStringAsync().Result; | ||||
|  | ||||
|                 throw new Exception("Attachment failed: " + resultBody); | ||||
|                 HttpRequestMessage httpRequestMessage = new() | ||||
|                 { | ||||
|                     RequestUri = new Uri(url), | ||||
|                     Method = HttpMethod.Post, | ||||
|                     Content = new StringContent(json, Encoding.UTF8, "application/json") | ||||
|                 }; | ||||
|                 HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead).Result; | ||||
|                 resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result; | ||||
|                 results = JsonSerializer.Deserialize<Results>(resultsJson); | ||||
|             } | ||||
|             if (!results.Success) | ||||
|                 results.Errors.Add(results.ToString()); | ||||
|         } | ||||
|  | ||||
|         public static void AttachFiles(string url, long headerID, List<Attachment> headerAttachments = null, List<Attachment> dataAttachments = null) | ||||
|         catch (Exception e) | ||||
|         { | ||||
|             try | ||||
|             Exception exception = e; | ||||
|             StringBuilder stringBuilder = new(); | ||||
|             while (exception is not null) | ||||
|             { | ||||
|                 if (!(headerAttachments is null)) | ||||
|                 { | ||||
|                     foreach (Attachment attachment in headerAttachments) | ||||
|                         AttachFile(url, headerID, "", System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); | ||||
|                 } | ||||
|                 if (!(dataAttachments is null)) | ||||
|                 { | ||||
|                     foreach (Attachment attachment in dataAttachments) | ||||
|                         AttachFile(url, headerID, attachment.UniqueId, System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); | ||||
|                 } | ||||
|                 //MessageBox.Show(r.ToString()); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 Exception exception = e; | ||||
|                 StringBuilder stringBuilder = new StringBuilder(); | ||||
|                 while (!(exception is null)) | ||||
|                 { | ||||
|                     stringBuilder.AppendLine(exception.Message); | ||||
|                     exception = exception.InnerException; | ||||
|                 } | ||||
|                 //MessageBox.Show(msgs.ToString(), "Exception", //MessageBoxButtons.OK, //MessageBoxIcon.Error); | ||||
|                 throw new Exception(stringBuilder.ToString()); | ||||
|                 _ = stringBuilder.AppendLine(exception.Message); | ||||
|                 exception = exception.InnerException; | ||||
|             } | ||||
|             if (results.Errors is null) | ||||
|                 results.Errors = new List<string>(); | ||||
|             results.Errors.Add(stringBuilder.ToString()); | ||||
|         } | ||||
|         return new Tuple<string, Results>(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<Attachment> headerAttachments = null, List<Attachment> dataAttachments = null) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (headerAttachments is not null) | ||||
|             { | ||||
|                 foreach (Attachment attachment in headerAttachments) | ||||
|                     AttachFile(url, headerID, "", System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); | ||||
|             } | ||||
|             if (dataAttachments is not null) | ||||
|             { | ||||
|                 foreach (Attachment attachment in dataAttachments) | ||||
|                     AttachFile(url, headerID, attachment.UniqueId, System.IO.File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName); | ||||
|             } | ||||
|             //MessageBox.Show(r.ToString()); | ||||
|         } | ||||
|         catch (Exception e) | ||||
|         { | ||||
|             Exception exception = e; | ||||
|             StringBuilder stringBuilder = new(); | ||||
|             while (exception is not null) | ||||
|             { | ||||
|                 _ = stringBuilder.AppendLine(exception.Message); | ||||
|                 exception = exception.InnerException; | ||||
|             } | ||||
|             //MessageBox.Show(msgs.ToString(), "Exception", //MessageBoxButtons.OK, //MessageBoxIcon.Error); | ||||
|             throw new Exception(stringBuilder.ToString()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,13 +1,10 @@ | ||||
| namespace Adaptation.Shared | ||||
| namespace Adaptation.Shared; | ||||
|  | ||||
| public enum ParameterType | ||||
| { | ||||
|  | ||||
|     public enum ParameterType | ||||
|     { | ||||
|         String = 0, | ||||
|         Integer = 2, | ||||
|         Double = 3, | ||||
|         Boolean = 4, | ||||
|         StructuredType = 5 | ||||
|     } | ||||
|  | ||||
|     String = 0, | ||||
|     Integer = 2, | ||||
|     Double = 3, | ||||
|     Boolean = 4, | ||||
|     StructuredType = 5 | ||||
| } | ||||
| @ -7,420 +7,405 @@ using System.Linq; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.Shared | ||||
| namespace Adaptation.Shared; | ||||
|  | ||||
| public class ProcessDataStandardFormat | ||||
| { | ||||
|  | ||||
|     public class ProcessDataStandardFormat | ||||
|     public const string RecordStart = "RECORD_START"; | ||||
|  | ||||
|     public enum SearchFor | ||||
|     { | ||||
|         EquipmentIntegration = 1, | ||||
|         BusinessIntegration = 2, | ||||
|         SystemExport = 3, | ||||
|         Archive = 4 | ||||
|     } | ||||
|  | ||||
|         public const string RecordStart = "RECORD_START"; | ||||
|  | ||||
|         public enum SearchFor | ||||
|     public static string GetPDSFText(IFileRead fileRead, Logistics logistics, JsonElement[] jsonElements, string logisticsText) | ||||
|     { | ||||
|         string result; | ||||
|         if (!jsonElements.Any()) | ||||
|             result = string.Empty; | ||||
|         else | ||||
|         { | ||||
|             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<string> 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;) | ||||
|             { | ||||
|                 int columns = 0; | ||||
|                 List<string> 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()) | ||||
|                 { | ||||
|                     foreach (JsonProperty jsonProperty in jsonElements[0].EnumerateObject()) | ||||
|                     { | ||||
|                         columns += 1; | ||||
|                         stringBuilder.Append("\"").Append(jsonProperty.Name).Append("\"").Append('\t'); | ||||
|                     } | ||||
|                     break; | ||||
|                     columns += 1; | ||||
|                     _ = stringBuilder.Append('"').Append(jsonProperty.Name).Append('"').Append('\t'); | ||||
|                 } | ||||
|                 stringBuilder.Remove(stringBuilder.Length - 1, 1); | ||||
|                 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()); | ||||
|                 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<string, string[], string[]> GetLogisticsColumnsAndBody(string reportFullPath, string[] lines = null) | ||||
|         { | ||||
|             string segment; | ||||
|             List<string> body = new(); | ||||
|             StringBuilder logistics = new(); | ||||
|             if (lines is null) | ||||
|                 lines = File.ReadAllLines(reportFullPath); | ||||
|             string[] segments; | ||||
|             if (lines.Length < 7) | ||||
|                 segments = new string[] { }; | ||||
|             else | ||||
|                 segments = lines[6].Trim().Split('\t'); | ||||
|             List<string> 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.Count(); r++) | ||||
|             { | ||||
|                 if (lines[r].StartsWith("NUM_DATA_ROWS")) | ||||
|                     lookForLogistics = true; | ||||
|                 if (!lookForLogistics) | ||||
|                 { | ||||
|                     body.Add(lines[r]); | ||||
|                     continue; | ||||
|                 } | ||||
|                 if (lines[r].StartsWith("LOGISTICS_1")) | ||||
|                 { | ||||
|                     for (int i = r; i < lines.Count(); i++) | ||||
|                     { | ||||
|                         if (lines[r].StartsWith("END_HEADER")) | ||||
|                             break; | ||||
|                         logistics.AppendLine(lines[i]); | ||||
|                     } | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             return new Tuple<string, string[], string[]>(logistics.ToString(), columns.ToArray(), body.ToArray()); | ||||
|         } | ||||
|  | ||||
|         public static JsonElement[] GetArray(Tuple<string, string[], string[]> 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<JsonElement[]>("[]"); | ||||
|             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 | ||||
|             { | ||||
|                 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<JsonElement[]>(string.Concat("[", stringBuilder, "]")); | ||||
|                 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"); | ||||
|             } | ||||
|             return results; | ||||
|             _ = 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 Dictionary<string, List<string>> GetDictionary(Tuple<string, string[], string[]> pdsf) | ||||
|     public static Tuple<string, string[], string[]> GetLogisticsColumnsAndBody(string reportFullPath, string[] lines = null) | ||||
|     { | ||||
|         string segment; | ||||
|         List<string> body = new(); | ||||
|         StringBuilder logistics = new(); | ||||
|         if (lines is null) | ||||
|             lines = File.ReadAllLines(reportFullPath); | ||||
|         string[] segments; | ||||
|         if (lines.Length < 7) | ||||
|             segments = Array.Empty<string>(); | ||||
|         else | ||||
|             segments = lines[6].Trim().Split('\t'); | ||||
|         List<string> columns = new(); | ||||
|         for (int c = 0; c < segments.Length; c++) | ||||
|         { | ||||
|             Dictionary<string, List<string>> results = new(); | ||||
|             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<string, string[], string[]>(logistics.ToString(), columns.ToArray(), body.ToArray()); | ||||
|     } | ||||
|  | ||||
|     public static JsonElement[] GetArray(Tuple<string, string[], string[]> 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<JsonElement[]>("[]"); | ||||
|         else | ||||
|         { | ||||
|             string value; | ||||
|             string[] segments; | ||||
|             string[] columns = pdsf.Item2; | ||||
|             string[] bodyLines = pdsf.Item3; | ||||
|             foreach (string column in columns) | ||||
|                 results.Add(column, new List<string>()); | ||||
|             StringBuilder stringBuilder = new(); | ||||
|             foreach (string bodyLine in bodyLines) | ||||
|             { | ||||
|                 segments = bodyLine.Split('\t'); | ||||
|                 for (int c = 1; c < segments.Length; c++) | ||||
|                 _ = stringBuilder.Append('{'); | ||||
|                 segments = bodyLine.Trim().Split('\t'); | ||||
|                 if (!lookForNumbers) | ||||
|                 { | ||||
|                     if (c >= columns.Length) | ||||
|                         continue; | ||||
|                     results[columns[c]].Add(segments[c]); | ||||
|                 } | ||||
|             } | ||||
|             return results; | ||||
|         } | ||||
|  | ||||
|         public static Tuple<string, Dictionary<Test, Dictionary<string, List<string>>>> GetTestDictionary(Tuple<string, string[], string[]> pdsf) | ||||
|         { | ||||
|             Dictionary<Test, Dictionary<string, List<string>>> results = new(); | ||||
|             string testColumn = nameof(Test); | ||||
|             Dictionary<string, List<string>> keyValuePairs = GetDictionary(pdsf); | ||||
|             if (!keyValuePairs.ContainsKey(testColumn)) | ||||
|                 throw new Exception(); | ||||
|             int min; | ||||
|             int max; | ||||
|             Test testKey; | ||||
|             List<string> vs; | ||||
|             string columnKey; | ||||
|             Dictionary<Test, List<int>> tests = new(); | ||||
|             for (int i = 0; i < keyValuePairs[testColumn].Count; i++) | ||||
|             { | ||||
|                 if (Enum.TryParse(keyValuePairs[testColumn][i], out Test test)) | ||||
|                 { | ||||
|                     if (!results.ContainsKey(test)) | ||||
|                     for (int c = 1; c < segments.Length; c++) | ||||
|                     { | ||||
|                         tests.Add(test, new List<int>()); | ||||
|                         results.Add(test, new Dictionary<string, List<string>>()); | ||||
|                         value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                         _ = stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\","); | ||||
|                     } | ||||
|                     tests[test].Add(i); | ||||
|                 } | ||||
|             } | ||||
|             foreach (KeyValuePair<Test, List<int>> testKeyValuePair in tests) | ||||
|             { | ||||
|                 testKey = testKeyValuePair.Key; | ||||
|                 min = testKeyValuePair.Value.Min(); | ||||
|                 max = testKeyValuePair.Value.Max() + 1; | ||||
|                 foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs) | ||||
|                     results[testKey].Add(keyValuePair.Key, new List<string>()); | ||||
|                 foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs) | ||||
|                 else | ||||
|                 { | ||||
|                     vs = keyValuePair.Value; | ||||
|                     columnKey = keyValuePair.Key; | ||||
|                     for (int i = min; i < max; i++) | ||||
|                     for (int c = 1; c < segments.Length; c++) | ||||
|                     { | ||||
|                         if (vs.Count > i) | ||||
|                             results[testKey][columnKey].Add(vs[i]); | ||||
|                         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 | ||||
|                             results[testKey][columnKey].Add(string.Empty); | ||||
|                             _ = stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\","); | ||||
|                     } | ||||
|                 } | ||||
|                 _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); | ||||
|                 _ = stringBuilder.AppendLine("},"); | ||||
|             } | ||||
|             return new Tuple<string, Dictionary<Test, Dictionary<string, List<string>>>>(pdsf.Item1, results); | ||||
|             _ = stringBuilder.Remove(stringBuilder.Length - 3, 3); | ||||
|             results = JsonSerializer.Deserialize<JsonElement[]>(string.Concat("[", stringBuilder, "]")); | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         private static string GetString(SearchFor searchFor, bool addSpaces, char separator = ' ') | ||||
|     public static Dictionary<string, List<string>> GetDictionary(Tuple<string, string[], string[]> pdsf) | ||||
|     { | ||||
|         Dictionary<string, List<string>> results = new(); | ||||
|         string[] segments; | ||||
|         string[] columns = pdsf.Item2; | ||||
|         string[] bodyLines = pdsf.Item3; | ||||
|         foreach (string column in columns) | ||||
|             results.Add(column, new List<string>()); | ||||
|         foreach (string bodyLine in bodyLines) | ||||
|         { | ||||
|             if (!addSpaces) | ||||
|                 return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), searchFor); | ||||
|             else | ||||
|                 return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), separator, searchFor.ToString().Replace("In", string.Concat(separator, "In")).Replace("Ex", string.Concat(separator, "Ex"))); | ||||
|         } | ||||
|  | ||||
|         public static string EquipmentIntegration(bool addSpaces = true, char separator = ' ') | ||||
|         { | ||||
|             return GetString(SearchFor.EquipmentIntegration, addSpaces, separator); | ||||
|         } | ||||
|  | ||||
|         public static string BusinessIntegration(bool addSpaces = true, char separator = ' ') | ||||
|         { | ||||
|             return GetString(SearchFor.BusinessIntegration, addSpaces, separator); | ||||
|         } | ||||
|  | ||||
|         public static string SystemExport(bool addSpaces = true, char separator = ' ') | ||||
|         { | ||||
|             return GetString(SearchFor.SystemExport, addSpaces, separator); | ||||
|         } | ||||
|  | ||||
|         public static string Archive(bool addSpaces = true, char separator = ' ') | ||||
|         { | ||||
|             return GetString(SearchFor.Archive, addSpaces, separator); | ||||
|         } | ||||
|  | ||||
|         public static string GetLines(Logistics logistics, Properties.IScopeInfo scopeInfo, List<string> names, Dictionary<string, List<string>> keyValuePairs, string dateFormat, string timeFormat, List<string> pairedParameterNames, bool useDateTimeFromSequence = true, string format = "", List<string> ignoreParameterNames = null) | ||||
|         { | ||||
|             StringBuilder result = new(); | ||||
|             if (ignoreParameterNames is null) | ||||
|                 ignoreParameterNames = new List<string>(); | ||||
|             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++) | ||||
|             segments = bodyLine.Split('\t'); | ||||
|             for (int c = 1; c < segments.Length; c++) | ||||
|             { | ||||
|                 line.Clear(); | ||||
|                 line.Append("!"); | ||||
|                 foreach (KeyValuePair<string, List<string>> 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<string> PDSFToFixedWidth(string reportFullPath) | ||||
|         { | ||||
|             List<string> results = new(); | ||||
|             if (!File.Exists(reportFullPath)) | ||||
|                 throw new Exception(); | ||||
|             int[] group; | ||||
|             string line; | ||||
|             int startsAt = 0; | ||||
|             string[] segments; | ||||
|             int? currentGroup = null; | ||||
|             char inputSeperator = '\t'; | ||||
|             char outputSeperator = '\t'; | ||||
|             List<int> vs = new(); | ||||
|             List<int[]> groups = new(); | ||||
|             string[] lines = File.ReadAllLines(reportFullPath); | ||||
|             StringBuilder stringBuilder = new(); | ||||
|             for (int i = 0; i < lines.Length; i++) | ||||
|             { | ||||
|                 if (string.IsNullOrEmpty(lines[i])) | ||||
|                 if (c >= columns.Length) | ||||
|                     continue; | ||||
|                 segments = lines[i].Split(inputSeperator); | ||||
|                 if (currentGroup is null) | ||||
|                     currentGroup = segments.Length; | ||||
|                 if (segments.Length != currentGroup) | ||||
|                 results[columns[c]].Add(segments[c]); | ||||
|             } | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     public static Tuple<string, Dictionary<Test, Dictionary<string, List<string>>>> GetTestDictionary(Tuple<string, string[], string[]> pdsf) | ||||
|     { | ||||
|         Dictionary<Test, Dictionary<string, List<string>>> results = new(); | ||||
|         string testColumn = nameof(Test); | ||||
|         Dictionary<string, List<string>> keyValuePairs = GetDictionary(pdsf); | ||||
|         if (!keyValuePairs.ContainsKey(testColumn)) | ||||
|             throw new Exception(); | ||||
|         int min; | ||||
|         int max; | ||||
|         Test testKey; | ||||
|         List<string> vs; | ||||
|         string columnKey; | ||||
|         Dictionary<Test, List<int>> tests = new(); | ||||
|         for (int i = 0; i < keyValuePairs[testColumn].Count; i++) | ||||
|         { | ||||
|             if (Enum.TryParse(keyValuePairs[testColumn][i], out Test test)) | ||||
|             { | ||||
|                 if (!results.ContainsKey(test)) | ||||
|                 { | ||||
|                     currentGroup = segments.Length; | ||||
|                     groups.Add(new int[] { startsAt, i - 1 }); | ||||
|                     startsAt = i; | ||||
|                     tests.Add(test, new List<int>()); | ||||
|                     results.Add(test, new Dictionary<string, List<string>>()); | ||||
|                 } | ||||
|                 tests[test].Add(i); | ||||
|             } | ||||
|         } | ||||
|         foreach (KeyValuePair<Test, List<int>> testKeyValuePair in tests) | ||||
|         { | ||||
|             testKey = testKeyValuePair.Key; | ||||
|             min = testKeyValuePair.Value.Min(); | ||||
|             max = testKeyValuePair.Value.Max() + 1; | ||||
|             foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs) | ||||
|                 results[testKey].Add(keyValuePair.Key, new List<string>()); | ||||
|             foreach (KeyValuePair<string, List<string>> 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); | ||||
|                 } | ||||
|             } | ||||
|             if (startsAt == lines.Length - 1 && lines[0].Split(inputSeperator).Length != currentGroup) | ||||
|                 groups.Add(new int[] { lines.Length - 1, lines.Length - 1 }); | ||||
|             for (int g = 0; g < groups.Count; g++) | ||||
|         } | ||||
|         return new Tuple<string, Dictionary<Test, Dictionary<string, List<string>>>>(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<string> names, Dictionary<string, List<string>> keyValuePairs, string dateFormat, string timeFormat, List<string> pairedParameterNames, bool useDateTimeFromSequence = true, string format = "", List<string> ignoreParameterNames = null) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
|         if (ignoreParameterNames is null) | ||||
|             ignoreParameterNames = new List<string>(); | ||||
|         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<string, List<string>> keyValuePair in keyValuePairs) | ||||
|             { | ||||
|                 vs.Clear(); | ||||
|                 group = groups[g]; | ||||
|                 line = lines[group[0]]; | ||||
|                 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<string> PDSFToFixedWidth(string reportFullPath) | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         if (!File.Exists(reportFullPath)) | ||||
|             throw new Exception(); | ||||
|         int[] group; | ||||
|         string line; | ||||
|         int startsAt = 0; | ||||
|         string[] segments; | ||||
|         int? currentGroup = null; | ||||
|         char inputSeperator = '\t'; | ||||
|         char outputSeperator = '\t'; | ||||
|         List<int> vs = new(); | ||||
|         List<int[]> groups = new(); | ||||
|         string[] lines = File.ReadAllLines(reportFullPath); | ||||
|         StringBuilder stringBuilder = new(); | ||||
|         for (int i = 0; i < lines.Length; i++) | ||||
|         { | ||||
|             if (string.IsNullOrEmpty(lines[i])) | ||||
|                 continue; | ||||
|             segments = lines[i].Split(inputSeperator); | ||||
|             if (currentGroup is null) | ||||
|                 currentGroup = segments.Length; | ||||
|             if (segments.Length != currentGroup) | ||||
|             { | ||||
|                 currentGroup = segments.Length; | ||||
|                 groups.Add(new int[] { startsAt, i - 1 }); | ||||
|                 startsAt = i; | ||||
|             } | ||||
|         } | ||||
|         if (startsAt == lines.Length - 1 && lines[0].Split(inputSeperator).Length != currentGroup) | ||||
|             groups.Add(new int[] { lines.Length - 1, lines.Length - 1 }); | ||||
|         for (int g = 0; g < groups.Count; g++) | ||||
|         { | ||||
|             vs.Clear(); | ||||
|             group = groups[g]; | ||||
|             line = lines[group[0]]; | ||||
|             segments = line.Split(inputSeperator); | ||||
|             for (int s = 0; s < segments.Length; s++) | ||||
|                 vs.Add(segments[s].Length); | ||||
|             for (int i = group[0]; i <= group[1]; i++) | ||||
|             { | ||||
|                 line = lines[i]; | ||||
|                 segments = line.Split(inputSeperator); | ||||
|                 for (int s = 0; s < segments.Length; s++) | ||||
|                     vs.Add(segments[s].Length); | ||||
|                 for (int i = group[0]; i <= group[1]; i++) | ||||
|                 { | ||||
|                     line = lines[i]; | ||||
|                     segments = line.Split(inputSeperator); | ||||
|                     for (int s = 0; s < segments.Length; s++) | ||||
|                     { | ||||
|                         if (vs[s] < segments[s].Length) | ||||
|                             vs[s] = segments[s].Length; | ||||
|                     } | ||||
|                     if (vs[s] < segments[s].Length) | ||||
|                         vs[s] = segments[s].Length; | ||||
|                 } | ||||
|                 stringBuilder.Clear(); | ||||
|                 for (int s = 0; s < segments.Length; s++) | ||||
|                     stringBuilder.Append((s + 1).ToString().PadLeft(vs[s], ' ')).Append(outputSeperator); | ||||
|                 stringBuilder.Remove(stringBuilder.Length - 1, 1); | ||||
|                 results.Add(stringBuilder.ToString()); | ||||
|                 for (int i = group[0]; i <= group[1]; i++) | ||||
|                 { | ||||
|                     line = lines[i]; | ||||
|                     stringBuilder.Clear(); | ||||
|                     segments = line.Split(inputSeperator); | ||||
|                     for (int s = 0; s < segments.Length; s++) | ||||
|                         stringBuilder.Append(segments[s].PadLeft(vs[s], ' ')).Append(outputSeperator); | ||||
|                     stringBuilder.Remove(stringBuilder.Length - 1, 1); | ||||
|                     results.Add(stringBuilder.ToString()); | ||||
|                 } | ||||
|                 results.Add(string.Empty); | ||||
|             } | ||||
|             return results; | ||||
|             _ = stringBuilder.Clear(); | ||||
|             for (int s = 0; s < segments.Length; s++) | ||||
|                 _ = stringBuilder.Append((s + 1).ToString().PadLeft(vs[s], ' ')).Append(outputSeperator); | ||||
|             _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); | ||||
|             results.Add(stringBuilder.ToString()); | ||||
|             for (int i = group[0]; i <= group[1]; i++) | ||||
|             { | ||||
|                 line = lines[i]; | ||||
|                 _ = stringBuilder.Clear(); | ||||
|                 segments = line.Split(inputSeperator); | ||||
|                 for (int s = 0; s < segments.Length; s++) | ||||
|                     _ = stringBuilder.Append(segments[s].PadLeft(vs[s], ' ')).Append(outputSeperator); | ||||
|                 _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); | ||||
|                 results.Add(stringBuilder.ToString()); | ||||
|             } | ||||
|             results.Add(string.Empty); | ||||
|         } | ||||
|  | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,13 +1,10 @@ | ||||
| namespace Adaptation.Shared.Properties | ||||
| namespace Adaptation.Shared.Properties; | ||||
|  | ||||
| public interface IDescription | ||||
| { | ||||
|  | ||||
|     public interface IDescription | ||||
|     { | ||||
|  | ||||
|         int Test { get; } | ||||
|         int Count { get; } | ||||
|         int Index { get; } | ||||
|  | ||||
|     } | ||||
|     int Test { get; } | ||||
|     int Count { get; } | ||||
|     int Index { get; } | ||||
|  | ||||
| } | ||||
| @ -1,20 +1,17 @@ | ||||
| namespace Adaptation.Shared.Properties | ||||
| namespace Adaptation.Shared.Properties; | ||||
|  | ||||
| public interface IFileRead | ||||
| { | ||||
|  | ||||
|     public interface IFileRead | ||||
|     { | ||||
|         bool IsEvent { get; } | ||||
|         string NullData { get; } | ||||
|         string MesEntity { get; } | ||||
|         bool IsEAFHosted { get; } | ||||
|         string EventName { get; } | ||||
|         string EquipmentType { get; } | ||||
|         string ReportFullPath { get; } | ||||
|         string CellInstanceName { get; } | ||||
|         string ExceptionSubject { get; } | ||||
|         bool UseCyclicalForDescription { get; } | ||||
|         string CellInstanceConnectionName { get; } | ||||
|         string ParameterizedModelObjectDefinitionType { get; } | ||||
|     } | ||||
|  | ||||
|     bool IsEvent { get; } | ||||
|     string NullData { get; } | ||||
|     string MesEntity { get; } | ||||
|     bool IsEAFHosted { get; } | ||||
|     string EventName { get; } | ||||
|     string EquipmentType { get; } | ||||
|     string ReportFullPath { get; } | ||||
|     string CellInstanceName { get; } | ||||
|     string ExceptionSubject { get; } | ||||
|     bool UseCyclicalForDescription { get; } | ||||
|     string CellInstanceConnectionName { get; } | ||||
|     string ParameterizedModelObjectDefinitionType { get; } | ||||
| } | ||||
| @ -1,25 +1,22 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Shared.Properties | ||||
| namespace Adaptation.Shared.Properties; | ||||
|  | ||||
| public interface ILogistics | ||||
| { | ||||
|  | ||||
|     public interface ILogistics | ||||
|     { | ||||
|  | ||||
|         public object NullData { get; } | ||||
|         public string JobID { get; } //CellName | ||||
|         public long Sequence { get; } //Ticks | ||||
|         public DateTime DateTimeFromSequence { get; } | ||||
|         public double TotalSecondsSinceLastWriteTimeFromSequence { get; } | ||||
|         public string MesEntity { get; } //SPC | ||||
|         public string ReportFullPath { get; } //Extract file | ||||
|         public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics) | ||||
|         public string MID { get; set; } //Lot & Pocket || Lot | ||||
|         public List<string> Tags { get; set; } | ||||
|         public List<string> Logistics1 { get; set; } | ||||
|         public List<Logistics2> Logistics2 { get; set; } | ||||
|  | ||||
|     } | ||||
|     public object NullData { get; } | ||||
|     public string JobID { get; } //CellName | ||||
|     public long Sequence { get; } //Ticks | ||||
|     public DateTime DateTimeFromSequence { get; } | ||||
|     public double TotalSecondsSinceLastWriteTimeFromSequence { get; } | ||||
|     public string MesEntity { get; } //SPC | ||||
|     public string ReportFullPath { get; } //Extract file | ||||
|     public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics) | ||||
|     public string MID { get; set; } //Lot & Pocket || Lot | ||||
|     public List<string> Tags { get; set; } | ||||
|     public List<string> Logistics1 { get; set; } | ||||
|     public List<Logistics2> Logistics2 { get; set; } | ||||
|  | ||||
| } | ||||
| @ -1,17 +1,14 @@ | ||||
| namespace Adaptation.Shared.Properties | ||||
| namespace Adaptation.Shared.Properties; | ||||
|  | ||||
| public interface ILogistics2 | ||||
| { | ||||
|  | ||||
|     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; } | ||||
|  | ||||
|     } | ||||
|     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; } | ||||
|  | ||||
| } | ||||
| @ -1,13 +1,10 @@ | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Adaptation.Shared.Properties | ||||
| namespace Adaptation.Shared.Properties; | ||||
|  | ||||
| public interface IProcessData | ||||
| { | ||||
|  | ||||
|     public interface IProcessData | ||||
|     { | ||||
|  | ||||
|         List<object> Details { get; } | ||||
|  | ||||
|     } | ||||
|     List<object> Details { get; } | ||||
|  | ||||
| } | ||||
| @ -1,20 +1,17 @@ | ||||
| using System; | ||||
|  | ||||
| namespace Adaptation.Shared.Properties | ||||
| namespace Adaptation.Shared.Properties; | ||||
|  | ||||
| public interface IScopeInfo | ||||
| { | ||||
|  | ||||
|     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; } | ||||
|  | ||||
|     } | ||||
|     Enum Enum { get; } | ||||
|     string HTML { get; } | ||||
|     string Title { get; } | ||||
|     string FileName { get; } | ||||
|     int TestValue { get; } | ||||
|     string Header { get; } | ||||
|     string QueryFilter { get; } | ||||
|     string FileNameWithoutExtension { get; } | ||||
|  | ||||
| } | ||||
| @ -1,57 +1,58 @@ | ||||
| namespace Adaptation.Shared | ||||
| namespace Adaptation.Shared; | ||||
|  | ||||
| public enum Test | ||||
| { | ||||
|  | ||||
|     public enum Test | ||||
|     { | ||||
|         AFMRoughness = 34, | ||||
|         BioRadQS408M = 25, | ||||
|         BioRadStratus = 26, | ||||
|         BreakdownVoltageCenter = 0, | ||||
|         BreakdownVoltageEdge = 1, | ||||
|         BreakdownVoltageMiddle8in = 2, | ||||
|         CandelaKlarfDC = 6, | ||||
|         CandelaLaser = 36, | ||||
|         CandelaProdU = 39, | ||||
|         CandelaPSL = 38, | ||||
|         CandelaVerify = 37, | ||||
|         CDE = 24, | ||||
|         CV = 3, | ||||
|         DailyRPMAverage = 19, | ||||
|         DailyRPMPLRatio = 20, | ||||
|         DailyRPMXY = 18, | ||||
|         Denton = 9, | ||||
|         DiffusionLength = 45, | ||||
|         Hall = 10, | ||||
|         HgCV = 23, | ||||
|         Lehighton = 13, | ||||
|         Microscope = 46, | ||||
|         MonthlyCV = 4, | ||||
|         MonthlyHall = 11, | ||||
|         MonthlyXRD = 32, | ||||
|         Photoreflectance = 22, | ||||
|         PlatoA = 48, //Largest | ||||
|         RPMAverage = 16, | ||||
|         RPMPLRatio = 17, | ||||
|         RPMXY = 15, | ||||
|         SP1 = 8, | ||||
|         Tencor = 7, | ||||
|         UV = 35, | ||||
|         VerificationLehighton = 14, | ||||
|         VerificationRPM = 21, | ||||
|         VerificationWarpAndBow = 29, | ||||
|         VpdIcpmsAnalyte = 27, | ||||
|         WarpAndBow = 28, | ||||
|         WeeklyCV = 5, | ||||
|         WeeklyHall = 12, | ||||
|         WeeklyXRD = 33, | ||||
|         WeeklyXRDAIcomp = 40, | ||||
|         WeeklyXRDFWHM002 = 41, | ||||
|         WeeklyXRDFWHM105 = 42, | ||||
|         WeeklyXRDSLStks = 43, | ||||
|         WeeklyXRDXRR = 44, | ||||
|         XRDWeightedAverage = 31, | ||||
|         JVXRD = 47, | ||||
|         XRDXY = 30 | ||||
|     } | ||||
|  | ||||
|     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, | ||||
| } | ||||
| @ -7,60 +7,55 @@ using System.Diagnostics; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_36_3 | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_36_3; | ||||
|  | ||||
| [TestClass] | ||||
| public class BIORAD2 : EAFLoggingUnitTesting | ||||
| { | ||||
|     internal static BIORAD2 EAFLoggingUnitTesting { get; private set; } | ||||
|  | ||||
|     [TestClass] | ||||
|     public class BIORAD2 : EAFLoggingUnitTesting | ||||
|     public BIORAD2() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|         private static BIORAD2 _EAFLoggingUnitTesting; | ||||
|         internal static BIORAD2 EAFLoggingUnitTesting => _EAFLoggingUnitTesting; | ||||
|     public BIORAD2(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|         public BIORAD2() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|         { | ||||
|             if (_EAFLoggingUnitTesting is null) | ||||
|                 throw new Exception(); | ||||
|         } | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             EAFLoggingUnitTesting = new BIORAD2(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]); | ||||
|     } | ||||
|  | ||||
|         public BIORAD2(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         [ClassInitialize] | ||||
|         public static void ClassInitialize(TestContext testContext) | ||||
|         { | ||||
|             if (_EAFLoggingUnitTesting is null) | ||||
|                 _EAFLoggingUnitTesting = new BIORAD2(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 null)) | ||||
|                 _EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|             if (!(_EAFLoggingUnitTesting is null)) | ||||
|                 _EAFLoggingUnitTesting.Dispose(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__BIORAD2__QS408M() | ||||
|         { | ||||
|             string check = "*.txt"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|     [ClassCleanup()] | ||||
|     public static void ClassCleanup() | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting.Logger is not null) | ||||
|             EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|         if (EAFLoggingUnitTesting is not null) | ||||
|             EAFLoggingUnitTesting.Dispose(); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__BIORAD2__QS408M() | ||||
|     { | ||||
|         string check = "*.txt"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -7,60 +7,55 @@ using System.Diagnostics; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_36_3 | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_36_3; | ||||
|  | ||||
| [TestClass] | ||||
| public class BIORAD3 : EAFLoggingUnitTesting | ||||
| { | ||||
|     internal static BIORAD3 EAFLoggingUnitTesting { get; private set; } | ||||
|  | ||||
|     [TestClass] | ||||
|     public class BIORAD3 : EAFLoggingUnitTesting | ||||
|     public BIORAD3() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|         private static BIORAD3 _EAFLoggingUnitTesting; | ||||
|         internal static BIORAD3 EAFLoggingUnitTesting => _EAFLoggingUnitTesting; | ||||
|     public BIORAD3(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|         public BIORAD3() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|         { | ||||
|             if (_EAFLoggingUnitTesting is null) | ||||
|                 throw new Exception(); | ||||
|         } | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             EAFLoggingUnitTesting = new BIORAD3(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]); | ||||
|     } | ||||
|  | ||||
|         public BIORAD3(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         [ClassInitialize] | ||||
|         public static void ClassInitialize(TestContext testContext) | ||||
|         { | ||||
|             if (_EAFLoggingUnitTesting is null) | ||||
|                 _EAFLoggingUnitTesting = new BIORAD3(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 null)) | ||||
|                 _EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|             if (!(_EAFLoggingUnitTesting is null)) | ||||
|                 _EAFLoggingUnitTesting.Dispose(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__BIORAD3__QS408M() | ||||
|         { | ||||
|             string check = "*.txt"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|     [ClassCleanup()] | ||||
|     public static void ClassCleanup() | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting.Logger is not null) | ||||
|             EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|         if (EAFLoggingUnitTesting is not null) | ||||
|             EAFLoggingUnitTesting.Dispose(); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__BIORAD3__QS408M() | ||||
|     { | ||||
|         string check = "*.txt"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -7,172 +7,167 @@ using System.Diagnostics; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_36_3 | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_36_3; | ||||
|  | ||||
| [TestClass] | ||||
| public class MET08THFTIRQS408M : EAFLoggingUnitTesting | ||||
| { | ||||
|     internal static MET08THFTIRQS408M EAFLoggingUnitTesting { get; private set; } | ||||
|  | ||||
|     [TestClass] | ||||
|     public class MET08THFTIRQS408M : EAFLoggingUnitTesting | ||||
|     public MET08THFTIRQS408M() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|         private static MET08THFTIRQS408M _EAFLoggingUnitTesting; | ||||
|         internal static MET08THFTIRQS408M EAFLoggingUnitTesting => _EAFLoggingUnitTesting; | ||||
|     public MET08THFTIRQS408M(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|         public MET08THFTIRQS408M() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|         { | ||||
|             if (_EAFLoggingUnitTesting is null) | ||||
|                 throw new Exception(); | ||||
|         } | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             EAFLoggingUnitTesting = new MET08THFTIRQS408M(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]); | ||||
|     } | ||||
|  | ||||
|         public MET08THFTIRQS408M(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|         { | ||||
|         } | ||||
|     [ClassCleanup()] | ||||
|     public static void ClassCleanup() | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting.Logger is not null) | ||||
|             EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|         if (EAFLoggingUnitTesting is not null) | ||||
|             EAFLoggingUnitTesting.Dispose(); | ||||
|     } | ||||
|  | ||||
|         [ClassInitialize] | ||||
|         public static void ClassInitialize(TestContext testContext) | ||||
|         { | ||||
|             if (_EAFLoggingUnitTesting is null) | ||||
|                 _EAFLoggingUnitTesting = new MET08THFTIRQS408M(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]); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M() | ||||
|     { | ||||
|         string check = "~IsXToOpenInsightMetrologyViewer"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|         [ClassCleanup()] | ||||
|         public static void ClassCleanup() | ||||
|         { | ||||
|             if (!(_EAFLoggingUnitTesting.Logger is null)) | ||||
|                 _EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|             if (!(_EAFLoggingUnitTesting is null)) | ||||
|                 _EAFLoggingUnitTesting.Dispose(); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_() | ||||
|     { | ||||
|         string check = "~IsXToIQSSi"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M() | ||||
|         { | ||||
|             string check = "~IsXToOpenInsightMetrologyViewer"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M__() | ||||
|     { | ||||
|         string check = "~IsXToOpenInsight"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_() | ||||
|         { | ||||
|             string check = "~IsXToIQSSi"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M___() | ||||
|     { | ||||
|         string check = "~IsXToOpenInsightMetrologyViewerAttachments"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M__() | ||||
|         { | ||||
|             string check = "~IsXToOpenInsight"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M____() | ||||
|     { | ||||
|         string check = "~IsXToAPC"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M___() | ||||
|         { | ||||
|             string check = "~IsXToOpenInsightMetrologyViewerAttachments"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_____() | ||||
|     { | ||||
|         string check = "~IsXToSPaCe"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M____() | ||||
|         { | ||||
|             string check = "~IsXToAPC"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M______() | ||||
|     { | ||||
|         string check = "~IsXToArchive"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_____() | ||||
|         { | ||||
|             string check = "~IsXToSPaCe"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M______() | ||||
|         { | ||||
|             string check = "~IsXToArchive"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_______() | ||||
|         { | ||||
|             string check = "~IsArchive"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M________() | ||||
|         { | ||||
|             string check = "~IsDummy"; | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|             string[] fileNameAndJson = _EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|             Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|             File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|             IFileRead fileRead = _EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|             _EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_______() | ||||
|     { | ||||
|         string check = "~IsArchive"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M________() | ||||
|     { | ||||
|         string check = "~IsDummy"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -0,0 +1,61 @@ | ||||
| using Adaptation.Shared.Methods; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
| using Shared; | ||||
| using System; | ||||
| using System.Diagnostics; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_39_0; | ||||
|  | ||||
| [TestClass] | ||||
| public class BIORAD2 : EAFLoggingUnitTesting | ||||
| { | ||||
|     internal static BIORAD2 EAFLoggingUnitTesting { get; private set; } | ||||
|  | ||||
|     public BIORAD2() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|     public BIORAD2(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             EAFLoggingUnitTesting = new BIORAD2(testContext); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); | ||||
|         string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); | ||||
|         File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); | ||||
|         File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); | ||||
|     } | ||||
|  | ||||
|     [ClassCleanup()] | ||||
|     public static void ClassCleanup() | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting.Logger is not null) | ||||
|             EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|         if (EAFLoggingUnitTesting is not null) | ||||
|             EAFLoggingUnitTesting.Dispose(); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__BIORAD2__QS408M() | ||||
|     { | ||||
|         string check = "*.txt"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -0,0 +1,61 @@ | ||||
| using Adaptation.Shared.Methods; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
| using Shared; | ||||
| using System; | ||||
| using System.Diagnostics; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_39_0; | ||||
|  | ||||
| [TestClass] | ||||
| public class BIORAD3 : EAFLoggingUnitTesting | ||||
| { | ||||
|     internal static BIORAD3 EAFLoggingUnitTesting { get; private set; } | ||||
|  | ||||
|     public BIORAD3() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|     public BIORAD3(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             EAFLoggingUnitTesting = new BIORAD3(testContext); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); | ||||
|         string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); | ||||
|         File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); | ||||
|         File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); | ||||
|     } | ||||
|  | ||||
|     [ClassCleanup()] | ||||
|     public static void ClassCleanup() | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting.Logger is not null) | ||||
|             EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|         if (EAFLoggingUnitTesting is not null) | ||||
|             EAFLoggingUnitTesting.Dispose(); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__BIORAD3__QS408M() | ||||
|     { | ||||
|         string check = "*.txt"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -0,0 +1,173 @@ | ||||
| using Adaptation.Shared.Methods; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
| using Shared; | ||||
| using System; | ||||
| using System.Diagnostics; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace _Tests.CreateSelfDescription.Staging.v2_39_0; | ||||
|  | ||||
| [TestClass] | ||||
| public class MET08THFTIRQS408M : EAFLoggingUnitTesting | ||||
| { | ||||
|     internal static MET08THFTIRQS408M EAFLoggingUnitTesting { get; private set; } | ||||
|  | ||||
|     public MET08THFTIRQS408M() : base(testContext: null, declaringType: null, skipEquipmentDictionary: false) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|     public MET08THFTIRQS408M(TestContext testContext) : base(testContext, new StackFrame().GetMethod().DeclaringType, skipEquipmentDictionary: false) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting is null) | ||||
|             EAFLoggingUnitTesting = new MET08THFTIRQS408M(testContext); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(testContext.TestName, " - ClassInitialize")); | ||||
|         string[] fileNameAndText = EAFLoggingUnitTesting.AdaptationTesting.GetCSharpText(testContext.TestName); | ||||
|         File.WriteAllText(fileNameAndText[0], fileNameAndText[1]); | ||||
|         File.WriteAllText(fileNameAndText[2], fileNameAndText[3]); | ||||
|     } | ||||
|  | ||||
|     [ClassCleanup()] | ||||
|     public static void ClassCleanup() | ||||
|     { | ||||
|         if (EAFLoggingUnitTesting.Logger is not null) | ||||
|             EAFLoggingUnitTesting.Logger.LogInformation("Cleanup"); | ||||
|         if (EAFLoggingUnitTesting is not null) | ||||
|             EAFLoggingUnitTesting.Dispose(); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M() | ||||
|     { | ||||
|         string check = "~IsXToOpenInsightMetrologyViewer"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_() | ||||
|     { | ||||
|         string check = "~IsXToIQSSi"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M__() | ||||
|     { | ||||
|         string check = "~IsXToOpenInsight"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M___() | ||||
|     { | ||||
|         string check = "~IsXToOpenInsightMetrologyViewerAttachments"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M____() | ||||
|     { | ||||
|         string check = "~IsXToAPC"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_____() | ||||
|     { | ||||
|         string check = "~IsXToSPaCe"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M______() | ||||
|     { | ||||
|         string check = "~IsXToArchive"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_______() | ||||
|     { | ||||
|         string check = "~IsArchive"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M________() | ||||
|     { | ||||
|         string check = "~IsDummy"; | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         string[] fileNameAndJson = EAFLoggingUnitTesting.AdaptationTesting.GetConfiguration(methodBase); | ||||
|         Assert.IsTrue(fileNameAndJson[1].Contains(check)); | ||||
|         File.WriteAllText(fileNameAndJson[0], fileNameAndJson[1]); | ||||
|         IFileRead fileRead = EAFLoggingUnitTesting.AdaptationTesting.Get(methodBase, sourceFileLocation: string.Empty, sourceFileFilter: string.Empty, useCyclicalForDescription: false); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(fileRead.CellInstanceConnectionName)); | ||||
|         EAFLoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,29 +1,23 @@ | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
|  | ||||
| namespace _Tests.Extract.Staging.v2_36_3 | ||||
| namespace _Tests.Extract.Staging.v2_36_3; | ||||
|  | ||||
| [TestClass] | ||||
| public class BIORAD2 | ||||
| { | ||||
|  | ||||
|     [TestClass] | ||||
|     public class BIORAD2 | ||||
|     private static CreateSelfDescription.Staging.v2_36_3.BIORAD2 _BIORAD2; | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|  | ||||
|         private static CreateSelfDescription.Staging.v2_36_3.BIORAD2 _BIORAD2; | ||||
|  | ||||
|         [ClassInitialize] | ||||
|         public static void ClassInitialize(TestContext testContext) | ||||
|         { | ||||
|             CreateSelfDescription.Staging.v2_36_3.BIORAD2.ClassInitialize(testContext); | ||||
|             _BIORAD2 = CreateSelfDescription.Staging.v2_36_3.BIORAD2.EAFLoggingUnitTesting; | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__BIORAD2__QS408M() | ||||
|         { | ||||
|             _BIORAD2.Staging__v2_36_3__BIORAD2__QS408M(); | ||||
|         } | ||||
|  | ||||
|         CreateSelfDescription.Staging.v2_36_3.BIORAD2.ClassInitialize(testContext); | ||||
|         _BIORAD2 = CreateSelfDescription.Staging.v2_36_3.BIORAD2.EAFLoggingUnitTesting; | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__BIORAD2__QS408M() => _BIORAD2.Staging__v2_36_3__BIORAD2__QS408M(); | ||||
|  | ||||
| } | ||||
|  | ||||
| // dotnet build --runtime win-x64 | ||||
|  | ||||
| @ -8,58 +8,52 @@ using System.IO; | ||||
| using System.Reflection; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace _Tests.Extract.Staging.v2_36_3 | ||||
| namespace _Tests.Extract.Staging.v2_36_3; | ||||
|  | ||||
| [TestClass] | ||||
| public class BIORAD3 | ||||
| { | ||||
|  | ||||
|     [TestClass] | ||||
|     public class BIORAD3 | ||||
|     private static CreateSelfDescription.Staging.v2_36_3.BIORAD3 _BIORAD3; | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         CreateSelfDescription.Staging.v2_36_3.BIORAD3.ClassInitialize(testContext); | ||||
|         _BIORAD3 = CreateSelfDescription.Staging.v2_36_3.BIORAD3.EAFLoggingUnitTesting; | ||||
|     } | ||||
|  | ||||
|         private static CreateSelfDescription.Staging.v2_36_3.BIORAD3 _BIORAD3; | ||||
|  | ||||
|         [ClassInitialize] | ||||
|         public static void ClassInitialize(TestContext testContext) | ||||
|         { | ||||
|             CreateSelfDescription.Staging.v2_36_3.BIORAD3.ClassInitialize(testContext); | ||||
|             _BIORAD3 = CreateSelfDescription.Staging.v2_36_3.BIORAD3.EAFLoggingUnitTesting; | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__BIORAD3__QS408M() | ||||
|         { | ||||
|             _BIORAD3.Staging__v2_36_3__BIORAD3__QS408M(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__BIORAD3__QS408M637406016892454000__ReactorAndRDS() | ||||
|         { | ||||
|             DateTime dateTime; | ||||
|             string check = "*.txt"; | ||||
|             _BIORAD3.Staging__v2_36_3__BIORAD3__QS408M(); | ||||
|             MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|             string[] variables = _BIORAD3.AdaptationTesting.GetVariables(methodBase, check); | ||||
|             Tuple<string, string[], string[]> pdsf = Helpers.Metrology.GetLogisticsColumnsAndBody(variables[2], variables[4]); | ||||
|             IFileRead fileRead = _BIORAD3.AdaptationTesting.Get(methodBase, sourceFileLocation: variables[2], sourceFileFilter: variables[3], useCyclicalForDescription: false); | ||||
|             Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResult = fileRead.ReExtract(); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(extractResult?.Item1)); | ||||
|             Assert.IsTrue(extractResult.Item3.Length > 0, "extractResult Array Length check!"); | ||||
|             Assert.IsNotNull(extractResult.Item4); | ||||
|             Logistics logistics = new Logistics(fileRead); | ||||
|             dateTime = Adaptation.FileHandlers.QS408M.ProcessData.GetDateTime(logistics, string.Empty); | ||||
|             Assert.IsTrue(dateTime == logistics.DateTimeFromSequence); | ||||
|             dateTime = Adaptation.FileHandlers.QS408M.ProcessData.GetDateTime(logistics, "Tue Nov 10 12:03:56 1970"); | ||||
|             Assert.IsTrue(dateTime == logistics.DateTimeFromSequence); | ||||
|             Tuple<string, string[], string[]> pdsfNew = Helpers.Metrology.GetLogisticsColumnsAndBody(fileRead, logistics, extractResult, pdsf); | ||||
|             Helpers.Metrology.CompareSave(variables[5], pdsf, pdsfNew); | ||||
|             string[] json = Helpers.Metrology.GetItem2(pdsf, pdsfNew); | ||||
|             Helpers.Metrology.CompareSaveJSON(variables[5], json); | ||||
|             Assert.IsTrue(json[0] == json[1], "Item2 check!"); | ||||
|             string[] join = Helpers.Metrology.GetItem3(pdsf, pdsfNew); | ||||
|             Helpers.Metrology.CompareSaveTSV(variables[5], join); | ||||
|             Assert.IsTrue(join[0] == join[1], "Item3 (Join) check!"); | ||||
|             Helpers.Metrology.UpdatePassDirectory(variables[2]); | ||||
|         } | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__BIORAD3__QS408M() => _BIORAD3.Staging__v2_36_3__BIORAD3__QS408M(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__BIORAD3__QS408M637406016892454000__ReactorAndRDS() | ||||
|     { | ||||
|         DateTime dateTime; | ||||
|         string check = "*.txt"; | ||||
|         _BIORAD3.Staging__v2_36_3__BIORAD3__QS408M(); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         string[] variables = _BIORAD3.AdaptationTesting.GetVariables(methodBase, check); | ||||
|         Tuple<string, string[], string[]> pdsf = Helpers.Metrology.GetLogisticsColumnsAndBody(variables[2], variables[4]); | ||||
|         IFileRead fileRead = _BIORAD3.AdaptationTesting.Get(methodBase, sourceFileLocation: variables[2], sourceFileFilter: variables[3], useCyclicalForDescription: false); | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResult = fileRead.ReExtract(); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(extractResult?.Item1)); | ||||
|         Assert.IsTrue(extractResult.Item3.Length > 0, "extractResult Array Length check!"); | ||||
|         Assert.IsNotNull(extractResult.Item4); | ||||
|         Logistics logistics = new(fileRead); | ||||
|         dateTime = Adaptation.FileHandlers.QS408M.ProcessData.GetDateTime(logistics, string.Empty); | ||||
|         Assert.IsTrue(dateTime == logistics.DateTimeFromSequence); | ||||
|         dateTime = Adaptation.FileHandlers.QS408M.ProcessData.GetDateTime(logistics, "Tue Nov 10 12:03:56 1970"); | ||||
|         Assert.IsTrue(dateTime == logistics.DateTimeFromSequence); | ||||
|         Tuple<string, string[], string[]> pdsfNew = Helpers.Metrology.GetLogisticsColumnsAndBody(fileRead, logistics, extractResult, pdsf); | ||||
|         Helpers.Metrology.CompareSave(variables[5], pdsf, pdsfNew); | ||||
|         string[] json = Helpers.Metrology.GetItem2(pdsf, pdsfNew); | ||||
|         Helpers.Metrology.CompareSaveJSON(variables[5], json); | ||||
|         Assert.IsTrue(json[0] == json[1], "Item2 check!"); | ||||
|         string[] join = Helpers.Metrology.GetItem3(pdsf, pdsfNew); | ||||
|         Helpers.Metrology.CompareSaveTSV(variables[5], join); | ||||
|         Assert.IsTrue(join[0] == join[1], "Item3 (Join) check!"); | ||||
|         Helpers.Metrology.UpdatePassDirectory(variables[2]); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -1,77 +1,47 @@ | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
|  | ||||
| namespace _Tests.Extract.Staging.v2_36_3 | ||||
| namespace _Tests.Extract.Staging.v2_36_3; | ||||
|  | ||||
| [TestClass] | ||||
| public class MET08THFTIRQS408M | ||||
| { | ||||
|  | ||||
|     [TestClass] | ||||
|     public class MET08THFTIRQS408M | ||||
|     private static CreateSelfDescription.Staging.v2_36_3.MET08THFTIRQS408M _MET08THFTIRQS408M; | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|  | ||||
|         private static CreateSelfDescription.Staging.v2_36_3.MET08THFTIRQS408M _MET08THFTIRQS408M; | ||||
|  | ||||
|         [ClassInitialize] | ||||
|         public static void ClassInitialize(TestContext testContext) | ||||
|         { | ||||
|             CreateSelfDescription.Staging.v2_36_3.MET08THFTIRQS408M.ClassInitialize(testContext); | ||||
|             _MET08THFTIRQS408M = CreateSelfDescription.Staging.v2_36_3.MET08THFTIRQS408M.EAFLoggingUnitTesting; | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M__() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M__(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M___() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M___(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M____() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M____(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_____() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_____(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M______() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M______(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_______() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_______(); | ||||
|         } | ||||
|  | ||||
|         [TestMethod] | ||||
|         public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M________() | ||||
|         { | ||||
|             _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M________(); | ||||
|         } | ||||
|  | ||||
|         CreateSelfDescription.Staging.v2_36_3.MET08THFTIRQS408M.ClassInitialize(testContext); | ||||
|         _MET08THFTIRQS408M = CreateSelfDescription.Staging.v2_36_3.MET08THFTIRQS408M.EAFLoggingUnitTesting; | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M__() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M__(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M___() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M___(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M____() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M____(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_____() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_____(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M______() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M______(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_______() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M_______(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M________() => _MET08THFTIRQS408M.Staging__v2_36_3__MET08THFTIRQS408M__MET08THFTIRQS408M________(); | ||||
|  | ||||
| } | ||||
|  | ||||
| // dotnet build --runtime win-x64 | ||||
|  | ||||
							
								
								
									
										21
									
								
								Adaptation/_Tests/Extract/Staging/v2.39.0/BIORAD2.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Adaptation/_Tests/Extract/Staging/v2.39.0/BIORAD2.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
|  | ||||
| namespace _Tests.Extract.Staging.v2_39_0; | ||||
|  | ||||
| [TestClass] | ||||
| public class BIORAD2 | ||||
| { | ||||
|  | ||||
|     private static CreateSelfDescription.Staging.v2_39_0.BIORAD2 _BIORAD2; | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         CreateSelfDescription.Staging.v2_39_0.BIORAD2.ClassInitialize(testContext); | ||||
|         _BIORAD2 = CreateSelfDescription.Staging.v2_39_0.BIORAD2.EAFLoggingUnitTesting; | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__BIORAD2__QS408M() => _BIORAD2.Staging__v2_39_0__BIORAD2__QS408M(); | ||||
|  | ||||
| } | ||||
							
								
								
									
										59
									
								
								Adaptation/_Tests/Extract/Staging/v2.39.0/BIORAD3.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								Adaptation/_Tests/Extract/Staging/v2.39.0/BIORAD3.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | ||||
| using Adaptation.Shared; | ||||
| using Adaptation.Shared.Methods; | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Diagnostics; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace _Tests.Extract.Staging.v2_39_0; | ||||
|  | ||||
| [TestClass] | ||||
| public class BIORAD3 | ||||
| { | ||||
|  | ||||
|     private static CreateSelfDescription.Staging.v2_39_0.BIORAD3 _BIORAD3; | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         CreateSelfDescription.Staging.v2_39_0.BIORAD3.ClassInitialize(testContext); | ||||
|         _BIORAD3 = CreateSelfDescription.Staging.v2_39_0.BIORAD3.EAFLoggingUnitTesting; | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__BIORAD3__QS408M() => _BIORAD3.Staging__v2_39_0__BIORAD3__QS408M(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__BIORAD3__QS408M637406016892454000__ReactorAndRDS() | ||||
|     { | ||||
|         DateTime dateTime; | ||||
|         string check = "*.txt"; | ||||
|         _BIORAD3.Staging__v2_39_0__BIORAD3__QS408M(); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         string[] variables = _BIORAD3.AdaptationTesting.GetVariables(methodBase, check); | ||||
|         Tuple<string, string[], string[]> pdsf = Helpers.Metrology.GetLogisticsColumnsAndBody(variables[2], variables[4]); | ||||
|         IFileRead fileRead = _BIORAD3.AdaptationTesting.Get(methodBase, sourceFileLocation: variables[2], sourceFileFilter: variables[3], useCyclicalForDescription: false); | ||||
|         Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResult = fileRead.ReExtract(); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(extractResult?.Item1)); | ||||
|         Assert.IsTrue(extractResult.Item3.Length > 0, "extractResult Array Length check!"); | ||||
|         Assert.IsNotNull(extractResult.Item4); | ||||
|         Logistics logistics = new(fileRead); | ||||
|         dateTime = Adaptation.FileHandlers.QS408M.ProcessData.GetDateTime(logistics, string.Empty); | ||||
|         Assert.IsTrue(dateTime == logistics.DateTimeFromSequence); | ||||
|         dateTime = Adaptation.FileHandlers.QS408M.ProcessData.GetDateTime(logistics, "Tue Nov 10 12:03:56 1970"); | ||||
|         Assert.IsTrue(dateTime == logistics.DateTimeFromSequence); | ||||
|         Tuple<string, string[], string[]> pdsfNew = Helpers.Metrology.GetLogisticsColumnsAndBody(fileRead, logistics, extractResult, pdsf); | ||||
|         Helpers.Metrology.CompareSave(variables[5], pdsf, pdsfNew); | ||||
|         string[] json = Helpers.Metrology.GetItem2(pdsf, pdsfNew); | ||||
|         Helpers.Metrology.CompareSaveJSON(variables[5], json); | ||||
|         Assert.IsTrue(json[0] == json[1], "Item2 check!"); | ||||
|         string[] join = Helpers.Metrology.GetItem3(pdsf, pdsfNew); | ||||
|         Helpers.Metrology.CompareSaveTSV(variables[5], join); | ||||
|         Assert.IsTrue(join[0] == join[1], "Item3 (Join) check!"); | ||||
|         Helpers.Metrology.UpdatePassDirectory(variables[2]); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -0,0 +1,45 @@ | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
|  | ||||
| namespace _Tests.Extract.Staging.v2_39_0; | ||||
|  | ||||
| [TestClass] | ||||
| public class MET08THFTIRQS408M | ||||
| { | ||||
|  | ||||
|     private static CreateSelfDescription.Staging.v2_39_0.MET08THFTIRQS408M _MET08THFTIRQS408M; | ||||
|  | ||||
|     [ClassInitialize] | ||||
|     public static void ClassInitialize(TestContext testContext) | ||||
|     { | ||||
|         CreateSelfDescription.Staging.v2_39_0.MET08THFTIRQS408M.ClassInitialize(testContext); | ||||
|         _MET08THFTIRQS408M = CreateSelfDescription.Staging.v2_39_0.MET08THFTIRQS408M.EAFLoggingUnitTesting; | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M__() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M__(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M___() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M___(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M____() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M____(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_____() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_____(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M______() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M______(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_______() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M_______(); | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M________() => _MET08THFTIRQS408M.Staging__v2_39_0__MET08THFTIRQS408M__MET08THFTIRQS408M________(); | ||||
|  | ||||
| } | ||||
| @ -9,152 +9,148 @@ using System.Linq; | ||||
| using System.Reflection; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace _Tests.Helpers | ||||
| namespace _Tests.Helpers; | ||||
|  | ||||
| public class Metrology | ||||
| { | ||||
|  | ||||
|     public class Metrology | ||||
|     internal static Tuple<string, string[], string[]> GetLogisticsColumnsAndBody(string fileFullName) | ||||
|     { | ||||
|         Tuple<string, string[], string[]> 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<string, string[], string[]> GetLogisticsColumnsAndBody(string fileFullName) | ||||
|     internal static Tuple<string, string[], string[]> GetLogisticsColumnsAndBody(string searchDirectory, string searchPattern) | ||||
|     { | ||||
|         Tuple<string, string[], string[]> results; | ||||
|         if (searchPattern.Length > 3 && !searchPattern.Contains('*') && File.Exists(searchPattern)) | ||||
|             results = GetLogisticsColumnsAndBody(searchPattern); | ||||
|         else | ||||
|         { | ||||
|             Tuple<string, string[], string[]> 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; | ||||
|             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<string, string[], string[]> GetLogisticsColumnsAndBody(string searchDirectory, string searchPattern) | ||||
|         { | ||||
|             Tuple<string, string[], string[]> 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<string, string[], string[]> GetLogisticsColumnsAndBody(IFileRead fileRead, Logistics logistics, Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResult, Tuple<string, string[], string[]> pdsf) | ||||
|     { | ||||
|         Tuple<string, string[], string[]> results; | ||||
|         string text = ProcessDataStandardFormat.GetPDSFText(fileRead, logistics, extractResult.Item3, logisticsText: pdsf.Item1); | ||||
|         string[] lines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); | ||||
|         results = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(logistics.ReportFullPath, lines); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(results.Item1)); | ||||
|         Assert.IsTrue(results.Item2.Length > 0, "Column check"); | ||||
|         Assert.IsTrue(results.Item3.Length > 0, "Body check"); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|         internal static Tuple<string, string[], string[]> GetLogisticsColumnsAndBody(IFileRead fileRead, Logistics logistics, Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResult, Tuple<string, string[], string[]> pdsf) | ||||
|         { | ||||
|             Tuple<string, string[], string[]> results; | ||||
|             string text = ProcessDataStandardFormat.GetPDSFText(fileRead, logistics, extractResult.Item3, logisticsText: pdsf.Item1); | ||||
|             string[] lines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); | ||||
|             results = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(logistics.ReportFullPath, lines); | ||||
|             Assert.IsFalse(string.IsNullOrEmpty(results.Item1)); | ||||
|             Assert.IsTrue(results.Item2.Length > 0, "Column check"); | ||||
|             Assert.IsTrue(results.Item3.Length > 0, "Body check"); | ||||
|             return results; | ||||
|         } | ||||
|     internal static string[] GetItem2(Tuple<string, string[], string[]> pdsf, Tuple<string, string[], string[]> 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[] GetItem2(Tuple<string, string[], string[]> pdsf, Tuple<string, string[], string[]> pdsfNew) | ||||
|         { | ||||
|             JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions() { 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<string, string[], string[]> pdsf, Tuple<string, string[], string[]> pdsfNew) | ||||
|     { | ||||
|         string joinOld = string.Join(Environment.NewLine, from l in pdsf.Item3 select string.Join('\t', from t in l.Split('\t') where !t.Contains(@"\\") select t)); | ||||
|         string joinNew = string.Join(Environment.NewLine, from l in pdsfNew.Item3 select string.Join('\t', from t in l.Split('\t') where !t.Contains(@"\\") select t)); | ||||
|         return new string[] { joinOld, joinNew }; | ||||
|     } | ||||
|  | ||||
|         internal static string[] GetItem3(Tuple<string, string[], string[]> pdsf, Tuple<string, string[], string[]> pdsfNew) | ||||
|     internal static void UpdatePassDirectory(string searchDirectory) | ||||
|     { | ||||
|         DateTime dateTime = DateTime.Now; | ||||
|         try | ||||
|         { Directory.SetLastWriteTime(searchDirectory, dateTime); } | ||||
|         catch (System.Exception) { } | ||||
|         string ticksDirectory = Path.GetDirectoryName(searchDirectory); | ||||
|         try | ||||
|         { Directory.SetLastWriteTime(ticksDirectory, dateTime); } | ||||
|         catch (System.Exception) { } | ||||
|         string[] directories = Directory.GetDirectories(searchDirectory, "*", SearchOption.TopDirectoryOnly); | ||||
|         foreach (string directory in directories) | ||||
|         { | ||||
|             string joinOld = string.Join(Environment.NewLine, from l in pdsf.Item3 select string.Join('\t', from t in l.Split('\t') where !t.Contains(@"\\") select t)); | ||||
|             string joinNew = string.Join(Environment.NewLine, from l in pdsfNew.Item3 select string.Join('\t', from t in l.Split('\t') where !t.Contains(@"\\") select t)); | ||||
|             return new string[] { joinOld, joinNew }; | ||||
|         } | ||||
|  | ||||
|         internal static void UpdatePassDirectory(string searchDirectory) | ||||
|         { | ||||
|             DateTime dateTime = DateTime.Now; | ||||
|             try | ||||
|             { Directory.SetLastWriteTime(searchDirectory, dateTime); } | ||||
|             { Directory.SetLastWriteTime(directory, dateTime); } | ||||
|             catch (System.Exception) { } | ||||
|             string ticksDirectory = Path.GetDirectoryName(searchDirectory); | ||||
|             try | ||||
|             { Directory.SetLastWriteTime(ticksDirectory, dateTime); } | ||||
|             catch (System.Exception) { } | ||||
|             string[] directories = Directory.GetDirectories(searchDirectory, "*", SearchOption.TopDirectoryOnly); | ||||
|             foreach (string directory in directories) | ||||
|             { | ||||
|                 try | ||||
|                 { Directory.SetLastWriteTime(directory, dateTime); } | ||||
|                 catch (System.Exception) { } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|         internal static string GetFileName(MethodBase methodBase) | ||||
|     internal static string GetFileName(MethodBase methodBase) | ||||
|     { | ||||
|         string result; | ||||
|         string connectionName; | ||||
|         string seperator = "__"; | ||||
|         string connectionNameAndTicks; | ||||
|         string[] segments = methodBase.Name.Split(new string[] { seperator }, StringSplitOptions.None); | ||||
|         string environment = segments[0]; | ||||
|         string rawVersionName = segments[1]; | ||||
|         string equipmentTypeDirectory = segments[2]; | ||||
|         string ticks = DateTime.Now.Ticks.ToString(); | ||||
|         string comment = segments[segments.Length - 1]; | ||||
|         string versionName = segments[1].Replace('_', '.'); | ||||
|         string before = string.Concat(environment, seperator, rawVersionName, seperator, equipmentTypeDirectory, seperator); | ||||
|         string after = methodBase.Name.Substring(before.Length); | ||||
|         if (after.Length < ticks.Length) | ||||
|         { | ||||
|             string result; | ||||
|             string connectionName; | ||||
|             string seperator = "__"; | ||||
|             string connectionNameAndTicks; | ||||
|             string[] segments = methodBase.Name.Split(new string[] { seperator }, StringSplitOptions.None); | ||||
|             string environment = segments[0]; | ||||
|             string rawVersionName = segments[1]; | ||||
|             string equipmentTypeDirectory = segments[2]; | ||||
|             string ticks = DateTime.Now.Ticks.ToString(); | ||||
|             string comment = segments[segments.Length - 1]; | ||||
|             string versionName = segments[1].Replace('_', '.'); | ||||
|             string before = string.Concat(environment, seperator, rawVersionName, seperator, equipmentTypeDirectory, seperator); | ||||
|             string after = methodBase.Name.Substring(before.Length); | ||||
|             if (after.Length < ticks.Length) | ||||
|             { | ||||
|                 connectionName = after; | ||||
|                 connectionNameAndTicks = ticks; | ||||
|             } | ||||
|             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; | ||||
|             connectionName = after; | ||||
|         } | ||||
|  | ||||
|         internal static void CompareSaveTSV(string textFileDirectory, string[] join) | ||||
|         else | ||||
|         { | ||||
|             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]); | ||||
|             } | ||||
|             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 CompareSaveJSON(string textFileDirectory, string[] json) | ||||
|     internal static void CompareSaveTSV(string textFileDirectory, string[] join) | ||||
|     { | ||||
|         if (join[0] != join[1]) | ||||
|         { | ||||
|             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]); | ||||
|             } | ||||
|             _ = 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 CompareSave(string textFileDirectory, Tuple<string, string[], string[]> pdsf, Tuple<string, string[], string[]> pdsfNew) | ||||
|     internal static void CompareSaveJSON(string textFileDirectory, string[] json) | ||||
|     { | ||||
|         if (json[0] != json[1]) | ||||
|         { | ||||
|             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); | ||||
|             } | ||||
|             _ = 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<string, string[], string[]> pdsf, Tuple<string, string[], string[]> 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); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,30 +1,24 @@ | ||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
| using System; | ||||
|  | ||||
| namespace Shared | ||||
| namespace Shared; | ||||
|  | ||||
| public class EAFLoggingUnitTesting : LoggingUnitTesting, IDisposable | ||||
| { | ||||
|  | ||||
|     public class EAFLoggingUnitTesting : LoggingUnitTesting, IDisposable | ||||
|     protected readonly AdaptationTesting _AdaptationTesting; | ||||
|  | ||||
|     public AdaptationTesting AdaptationTesting => _AdaptationTesting; | ||||
|  | ||||
|     public EAFLoggingUnitTesting(TestContext testContext, Type declaringType, bool skipEquipmentDictionary) : | ||||
|         base(testContext, declaringType) | ||||
|     { | ||||
|  | ||||
|         protected readonly AdaptationTesting _AdaptationTesting; | ||||
|  | ||||
|         public AdaptationTesting AdaptationTesting => _AdaptationTesting; | ||||
|  | ||||
|         public EAFLoggingUnitTesting(TestContext testContext, Type declaringType, bool skipEquipmentDictionary) : | ||||
|             base(testContext, declaringType) | ||||
|         { | ||||
|             if (testContext is null || declaringType is null) | ||||
|                 _AdaptationTesting = null; | ||||
|             else | ||||
|                 _AdaptationTesting = new AdaptationTesting(testContext, skipEquipmentDictionary); | ||||
|         } | ||||
|  | ||||
|         public new void Dispose() | ||||
|         { | ||||
|             base.Dispose(); | ||||
|         } | ||||
|  | ||||
|         if (testContext is null || declaringType is null) | ||||
|             _AdaptationTesting = null; | ||||
|         else | ||||
|             _AdaptationTesting = new AdaptationTesting(testContext, skipEquipmentDictionary); | ||||
|     } | ||||
|  | ||||
|     public new void Dispose() => base.Dispose(); | ||||
|  | ||||
| } | ||||
| @ -2,170 +2,167 @@ using System; | ||||
| using System.Diagnostics; | ||||
| using System.Runtime.InteropServices; | ||||
|  | ||||
| namespace Shared | ||||
| namespace Shared; | ||||
|  | ||||
| public class IsEnvironment | ||||
| { | ||||
|  | ||||
|     public class IsEnvironment | ||||
|     public enum Name | ||||
|     { | ||||
|         LinuxDevelopment, | ||||
|         LinuxProduction, | ||||
|         LinuxStaging, | ||||
|         OSXDevelopment, | ||||
|         OSXProduction, | ||||
|         OSXStaging, | ||||
|         WindowsDevelopment, | ||||
|         WindowsProduction, | ||||
|         WindowsStaging | ||||
|     } | ||||
|  | ||||
|         public enum Name | ||||
|     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")) | ||||
|         { | ||||
|             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; | ||||
|             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"); | ||||
|             Profile = GetProfile(); | ||||
|             AppSettingsFileName = GetAppSettingsFileName(processesCount: null); | ||||
|         } | ||||
|  | ||||
|         public IsEnvironment(int? processesCount, bool nullASPNetCoreEnvironmentIsDevelopment, bool nullASPNetCoreEnvironmentIsProduction) | ||||
|         else | ||||
|         { | ||||
|             OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); | ||||
|             Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); | ||||
|             DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; | ||||
|             Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); | ||||
|             OSX = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(OSX)); | ||||
|             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); | ||||
|             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); | ||||
|     } | ||||
|  | ||||
|         private string GetProfile() | ||||
|     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 | ||||
|         { | ||||
|             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); | ||||
|             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(); | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         private string GetAppSettingsFileName(int? processesCount) | ||||
|         { | ||||
|             string result; | ||||
|             if (Production) | ||||
|             { | ||||
|                 if (processesCount is null) | ||||
|                     result = "appsettings.json"; | ||||
|                 else | ||||
|                     result = $"appsettings.{processesCount}.json"; | ||||
|             } | ||||
|             if (processesCount is null) | ||||
|                 result = $"appsettings.{environment}.json"; | ||||
|             else | ||||
|             { | ||||
|                 string environment; | ||||
|                 if (Staging) | ||||
|                     environment = nameof(Staging); | ||||
|                 else if (Development) | ||||
|                     environment = nameof(Development); | ||||
|                 else | ||||
|                     throw new Exception(); | ||||
|                 if (processesCount is null) | ||||
|                     result = $"appsettings.{environment}.json"; | ||||
|                 else | ||||
|                     result = $"appsettings.{environment}.{processesCount}.json"; | ||||
|             } | ||||
|             return result; | ||||
|         } | ||||
|  | ||||
|         public static string GetEnvironmentName(IsEnvironment isEnvironment) | ||||
|         { | ||||
|             string result; | ||||
|             if (isEnvironment.Windows) | ||||
|                 result = nameof(IsEnvironment.Windows); | ||||
|             else if (isEnvironment.Linux) | ||||
|                 result = nameof(IsEnvironment.Linux); | ||||
|             else if (isEnvironment.OSX) | ||||
|                 result = nameof(IsEnvironment.OSX); | ||||
|             else | ||||
|                 throw new Exception(); | ||||
|             return result; | ||||
|                 result = $"appsettings.{environment}.{processesCount}.json"; | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     public static string GetEnvironmentName(IsEnvironment isEnvironment) | ||||
|     { | ||||
|         string result; | ||||
|         if (isEnvironment.Windows) | ||||
|             result = nameof(IsEnvironment.Windows); | ||||
|         else if (isEnvironment.Linux) | ||||
|             result = nameof(IsEnvironment.Linux); | ||||
|         else if (isEnvironment.OSX) | ||||
|             result = nameof(IsEnvironment.OSX); | ||||
|         else | ||||
|             throw new Exception(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -5,109 +5,103 @@ using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
|  | ||||
| namespace Shared | ||||
| namespace Shared; | ||||
|  | ||||
| public class LoggingUnitTesting : UnitTesting, IDisposable | ||||
| { | ||||
|  | ||||
|     public class LoggingUnitTesting : UnitTesting, IDisposable | ||||
|     protected ILogger<object> _Logger; | ||||
|     protected ILoggerFactory _LoggerFactory; | ||||
|     protected readonly LogLevel? _DefaultLogLevel; | ||||
|     protected readonly LogLevel? _Log4netProviderLogLevel; | ||||
|     protected readonly IConfigurationRoot _ConfigurationRoot; | ||||
|     public ILogger<object> 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) | ||||
|     { | ||||
|  | ||||
|         protected ILogger<object> _Logger; | ||||
|         protected ILoggerFactory _LoggerFactory; | ||||
|         protected readonly LogLevel? _DefaultLogLevel; | ||||
|         protected readonly LogLevel? _Log4netProviderLogLevel; | ||||
|         protected readonly IConfigurationRoot _ConfigurationRoot; | ||||
|         public ILogger<object> 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) | ||||
|         { | ||||
|             _LoggerFactory = new LoggerFactory(); | ||||
|             if (testContext is null || declaringType is null) | ||||
|             { | ||||
|                 _ConfigurationRoot = null; | ||||
|                 _DefaultLogLevel = null; | ||||
|                 _Log4netProviderLogLevel = null; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LogLevel logLevel; | ||||
|                 IConfigurationSection configurationSection; | ||||
|                 List<LogLevel> logLevels = new List<LogLevel>(); | ||||
|                 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<LogLevel>(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<object>(); | ||||
|             _ConfigurationRoot = null; | ||||
|             _DefaultLogLevel = null; | ||||
|             _Log4netProviderLogLevel = null; | ||||
|         } | ||||
|  | ||||
|         public static string GetEnvironmentSpecialDirectory() | ||||
|         else | ||||
|         { | ||||
|             string result = string.Empty; | ||||
|             string traceFile; | ||||
|             List<string> directories = new List<string>(); | ||||
|             Environment.SpecialFolder[] specialFolders = new Environment.SpecialFolder[] | ||||
|             LogLevel logLevel; | ||||
|             IConfigurationSection configurationSection; | ||||
|             List<LogLevel> 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<LogLevel>(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<object>(); | ||||
|     } | ||||
|  | ||||
|     public static string GetEnvironmentSpecialDirectory() | ||||
|     { | ||||
|         string result = string.Empty; | ||||
|         string traceFile; | ||||
|         List<string> 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() | ||||
|         }; | ||||
|         foreach (Environment.SpecialFolder specialFolder in specialFolders) | ||||
|             directories.Add(Environment.GetFolderPath(specialFolder)); | ||||
|         foreach (string directory in directories) | ||||
|         { | ||||
|             _LoggerFactory.Dispose(); | ||||
|             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(); | ||||
|  | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,25 +1,23 @@ | ||||
| using System.Xml.Serialization; | ||||
|  | ||||
| namespace Shared.PasteSpecialXml.EAF.XML.API.ConfigurationData | ||||
| namespace Shared.PasteSpecialXml.EAF.XML.API.ConfigurationData; | ||||
|  | ||||
| [XmlRoot(ElementName = "ChildBackboneMembers", Namespace = "http://schemas.datacontract.org/2004/07/EafManagement.Configuration.Services")] | ||||
| public class ChildBackboneMembers | ||||
| { | ||||
|     [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; } | ||||
|     } | ||||
|     [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; } | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user