Files
DP44/Common/DTS.Common.Import/XML/XMLParseGroups.cs
2026-04-17 14:55:32 -04:00

129 lines
5.1 KiB
C#

using DTS.Common.Enums.DBExport;
using DTS.Common.Interface.Groups.GroupList;
using DTS.Common.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
namespace DTS.Common.Import.XML
{
public class XMLParseGroups : XMLParseBase
{
public XMLParseGroups(XmlElement root, double importedVersion, Func<bool> isCancelled = null) : base(root, importedVersion, isCancelled)
{
_groupIdMapping.Clear();
}
public IImportNotification ImportNotification { get; set; }
public override void Parse(ref ImportObject importObject)
{
ImportNotification?.SetStatus(new ImportStatus { PossibleStatus = Enums.PossibleStatus.Reading, ExtraStatus = Enums.ImportExtraStatus.ReadingGroups });
var staticGroups = ParseGroups(_root, ref importObject);
if (!staticGroups.Any())
{
return;
}
var newRoot = ConvertGroups(staticGroups);
if (newRoot == null)
{
return;
}
staticGroups = ParseGroups(newRoot, ref importObject);
importObject.AddStaticGroups(staticGroups);
}
private XmlElement ConvertGroups(List<IGroup> staticGroups)
{
_writer.WriteStartElement(TopLevelFields.Groups.ToString());
var count = -2; //Start the normalization at -2, to be consistent with channel mapping(?)
foreach (var g in staticGroups)
{
if (_importedVersion >= FileUtils.DataPRO21XmlVersion)
{
_groupIdMapping[g.Id.ToString()] = count;
}
else
{
//Must be an export from 2.0 or earlier
_groupIdMapping[g.Name] = count;
}
g.Id = count;
count--;
foreach (var channel in g.GroupChannelList)
{
if (_dasIdMapping.ContainsKey(channel.DASId))
{
channel.DASId = _dasIdMapping[channel.DASId];
}
if (_sensorIdMapping.ContainsKey(channel.SensorId))
{
channel.SensorId = _sensorIdMapping[channel.SensorId];
}
else
{
//FB 14308 - Don't fail Group import if it was
//exported with a deleted sensor.
channel.SensorId = 0;
}
}
_writer.Flush();
g.WriteXML(ref _writer);
_writer.Flush();
}
_writer.WriteEndElement();
return GetXmlElement();
}
public List<IGroup> ParseGroups(XmlElement root, ref ImportObject importObject)
{
List<IGroup> staticGroups = new List<IGroup>();
var importedHardware = new Dictionary<string, DataPROWin7.DataModel.DASHardware>();
foreach (var h in importObject.Hardware())
{
importedHardware[h.GetHardware().GetId()] = h;
}
foreach (var node in root.ChildNodes)
{
if (IsCancelled()) { return staticGroups; }
if (!(node is XmlElement)) continue;
IGroup groupInstance = GroupHelper.CreateEmptyGroup();
if (groupInstance != null)
{
var channelLookup = new Dictionary<long, Interface.Channels.IGroupChannel>();
var iSensors = new List<Interface.Sensors.ISensorData>();
foreach (var sensor in importObject.Sensors())
{
iSensors.Add(sensor);
}
var g = groupInstance.ReadXML(node as XmlElement, channelLookup, iSensors);
if (!string.IsNullOrWhiteSpace(g.Name))
{
var groupCopy = GroupHelper.CreateEmptyGroup();
groupCopy.Name = g.Name;
//FB 44143 assign description
groupCopy.Description = g.Description;
groupCopy.DisplayName = g.Name;
groupCopy.LastModified = g.LastModified;
groupCopy.Embedded = g.Embedded;
groupCopy.IncludedHardwareStringList = g.IncludedHardwareStringList;
groupCopy.Id = g.Id;
groupCopy.Tags = g.Tags;
staticGroups.Add(groupCopy);
foreach (var channel in channelLookup.Select(p => p.Value))
{
channel.Group = groupCopy;
groupCopy.GroupChannelList.Add(channel);
}
}
}
}
return staticGroups;
}
}
}