using System;
using System.Collections.Generic;
using System.Linq;
using DataPROWin7.DataModel;
using DTS.Common.Classes;
using DTS.Common.Enums.DASFactory;
using DTS.Common.Import.Enums;
using DTS.Common.Import.Factories;
using DTS.Common.Import.ImportOptions;
using DTS.Common.Import.Parsers;
using DTS.Common.Interface.Groups.GroupList;
using DTS.Common.SharedResource.Strings;
using DTS.Common.Storage;
using DTS.SensorDB;
namespace DTS.Common.Import
{
public class DTSCSVTestSetupParser : ParseVariantBase
{
private readonly IImportNotification _importNotification;
private readonly CsvImportOptions _csvImportOptions;
private readonly TestSetupImportData _defaultsTestSetupImportData;
private readonly IGroupImport _groupImport;
//FB 36905
private readonly bool _createDynamicGroups;
public DTSCSVTestSetupParser(IImportNotification importNotification, CsvImportOptions csvImportOptions, TestSetupImportData testSetupImportData, IGroupImport groupImport, bool createDynamicGroups)
{
_csvImportOptions = csvImportOptions;
_defaultsTestSetupImportData = testSetupImportData;
_importNotification = importNotification;
_groupImport = groupImport;
_createDynamicGroups = createDynamicGroups;
}
public static TestTemplate CreateTestSetup(TestSetupImportData tsid, DASHardware[] allDAS)
{
var t = new TestTemplate
{
Name = tsid.Name,
Description = tsid.Description,
SamplesPerSecondAggregate = tsid.SamplesPerSecond,
PostTriggerSeconds = tsid.PosttriggerSeconds,
PreTriggerSeconds = tsid.PretriggerSeconds,
RecordingMode = tsid.RecordingMode,
CalibrationBehavior = tsid.CalibrationBehavior
};
AddHardwareToTestSetup(t, tsid, allDAS);
SetClockSyncs(t, tsid);
if (RecordingModeExtensions.IsAStreamMode(tsid.RecordingMode))
{
t.DoStreaming = true;
}
return t;
}
private static void SetClockSyncs(TestTemplate t, TestSetupImportData tsid)
{
if (tsid.ManageClocksOutsideOfDataPROMaster)
{
t.ClockSyncProfileMaster = ClockSyncProfile.Manual;
}
if (tsid.ManageClocksOutsideOfDataPROSlave)
{
t.ClockSyncProfileSlave = ClockSyncProfile.Manual;
}
}
private static void AddHardwareToTestSetup(TestTemplate t, TestSetupImportData tsid, DASHardware[] allDAS)
{
if (null != tsid.SampleRateForDAS && 0 != tsid.SampleRateForDAS.Count)
{
using (var e = tsid.SampleRateForDAS.GetEnumerator())
{
while (e.MoveNext())
{
var das = Array.Find(allDAS, d => d.SerialNumber.Equals(e.Current.Key));
if (null == das) { continue; }
t.AddHardware(das.DASId);
if (tsid.IsClockMaster.ContainsKey(das.SerialNumber))
{
t.DASClockMasterList[das.SerialNumber] = tsid.IsClockMaster[das.SerialNumber];
}
if (tsid.DomainIdForDAS.ContainsKey(das.SerialNumber))
{
t.DASPTPDomainIDList[das.SerialNumber] = Convert.ToByte(t.DASPTPDomainIDList[das.SerialNumber]);
}
}
}
}
}
public static void UpdateDASSampleRate(TestTemplate t, TestSetupImportData tsid, DASHardware[] allDAS)
{
if (null != tsid.SampleRateForDAS && 0 != tsid.SampleRateForDAS.Count)
{
using (var e = tsid.SampleRateForDAS.GetEnumerator())
{
while (e.MoveNext())
{
var das = Array.Find(allDAS, d => d.SerialNumber.Equals(e.Current.Key));
if (null == das) { continue; }
//why are there two places for this information?
t.SetSampleRateForHardware(das, Convert.ToDouble(e.Current.Value));
t.DASSampleRateList[das.SerialNumber] = Convert.ToDouble(e.Current.Value);
}
}
if (tsid.SampleRateForDAS.Distinct().Count() > 1)
{
t.CommonStatusLine = false;
}
}
}
public override void Parse(ref ImportObject importObject)
{
if (string.IsNullOrEmpty(FileName))
{
return;
}
if (importObject == null)
{
throw new ArgumentNullException("importObject", "importObject can't be null or empty");
}
//FB 40598 Check if the file is supported for test setup import
if (!CSVFile.IsCSVFileForTestSetupImport(FileName, _csvImportOptions))
{
importObject.AddError(new ImportError { Message = StringResources.Import_CSVFileNotForTestSetup, ContinueImportOnError = false, Severity = ImportSeverityError.Critical });
return;
}
var tsid = ParseTestSetup(FileName);
if (tsid == null)
{
return;
}
if (importObject.TestSetups().Any(p => p.Name == tsid.Name))
{
return;
}
var allDAS = DataPROWin7.DataModel.Classes.Hardware.DASHardwareList.GetAllHardware();
var t = CreateTestSetup(tsid, allDAS);
//FB 36879 Add the hardware list for the test setup
//FB 43815 if only the version is 6 which means we have hardware in the file otherwise it would nter a test setup with 0 hardware which would cause problems in
//import summary and run test setup button in that wizard
if (t != null && CSVFile.GetCsvVersion(FileName) >= 6)
{
importObject.AddHardwareList(t.GetHardware());
}
if (tsid.Tags != null)
{
t?.SetTags(tsid.Tags.ToArray(), DbOperations.GetSQLCommand, DbOperations.TagsGet,
DbOperations.TagsGetId, DbOperations.TagsInsert);
}
//FB Assign the parse parameters
_groupImport.ParseParameters = importObject.ParseParameters();
AssignCalibrations(ref importObject);
var res = AssignGroupsToTestSetup(t, importObject.SensorGroupNamesLookup(), null, importObject.StaticGroups().ToList(),
importObject.Sensors().ToList(), _groupImport, _importNotification, tsid.Version);
var staticGroups = res?.Item2;
var sensors = res?.Item3;
var testSetup = res?.Item1;
if (staticGroups != null)
{
importObject.AddStaticGroups(staticGroups);
}
var cleanedSensors = GroupHelper.CleanUneededSensorDataPlaceHolder(importObject.CalibrationsLookup(), sensors);
if (cleanedSensors != null)
{
importObject.ClearSensors();
importObject.AddSensors(cleanedSensors);
}
UpdateDASSampleRate(t, tsid, allDAS);
if (testSetup != null)
{
importObject.AddTestSetup(testSetup);
//FB 38039, 40758 Identify type of import by number of test setups
importObject.TestSetupImportFileFormat = importObject.GetImportFileFormat();
}
importObject.SourceFormat = ImportFormats.DTS_CSV;
}
///
/// set the calibration for the sensor based on the most recent in the import
/// this is necessary as it was coming in with the latest calibration from the database (which
/// will be empty in a brand new import)
/// http://manuscript.dts.local/f/cases/43722/When-Importing-Csv-test-setup-software-zero-method-in-test-setup-parameters-does-not-match-import
///
private void AssignCalibrations(ref ImportObject importObject)
{
if (null == importObject) { return; }
if (null == importObject.Sensors() || !importObject.Sensors().Any()) { return; }
if (null == importObject.Calibrations() || !importObject.Calibrations().Any()) { return; }
foreach( var sensor in importObject.Sensors())
{
var cals = importObject.CalibrationLookup(sensor.SerialNumber);
if (null == cals || 0 == cals.Count) { return; }
cals.Sort();
sensor.Calibration = cals[cals.Count - 1];
}
}
//FB 36879 Single Responsibility principle , moved the method to this class
private Tuple, List> AssignGroupsToTestSetup(TestTemplate testTemplate, Dictionary sensorGroupNameLookup, Dictionary> groupNameSensorListLookup,
List existingStaticGroups, List sensors, IGroupImport groupImport, IImportNotification importNotification, int csvVersion)
{
try
{
_ = GroupHelper.ReverseChannelOrder(testTemplate, sensorGroupNameLookup, sensors);
var groupSensorLookup = groupImport.GetGroupSensorLookup(sensors, sensorGroupNameLookup, groupNameSensorListLookup);
sensors = GroupHelper.NormalizeSensorIds(sensors);
//FB 36905
var testAndGroups = groupImport.CreateGroups(sensors, groupSensorLookup, testTemplate, _createDynamicGroups, existingStaticGroups, importNotification.SetProgress);
if (testAndGroups == null)
{
TestTemplate noTestSetup = null;
List noGroup = null;
return Tuple.Create(noTestSetup, noGroup, sensors);
}
return Tuple.Create(testAndGroups.Item1, testAndGroups.Item2, sensors);
}
catch (Exception ex)
{
importNotification.ReportErrors(new List { ex.Message });
return null;
}
}
private TestSetupImportData ParseTestSetup(string filename)
{
var tsid = new TestSetupImportData()
{
SamplesPerSecond = _defaultsTestSetupImportData.SamplesPerSecond,
Tags = new List(),
Version = 0,
RecordingMode = _defaultsTestSetupImportData.RecordingMode,
PretriggerSeconds = _defaultsTestSetupImportData.PretriggerSeconds,
PosttriggerSeconds = _defaultsTestSetupImportData.PosttriggerSeconds,
CalibrationBehavior = _defaultsTestSetupImportData.CalibrationBehavior
};
using (var parser = CsvUtil.CreateCsvReader(filename))
{
var parsers = CSVTestParserFactory.CreateCSVParsers();
parsers[0].ParseVersion(parser, tsid);
if (tsid.Version == 6)
{
for (var i = 1; i < parsers.Length; i++)
{
parsers[i].ParseVersion(parser, tsid);
}
}
}
return tsid;
}
}
}