public bool ExportInternal(CESMII.ProfileDesigner.DAL.Models.ProfileModel profileModel, ProfileTypeDefinitionModel profileItem, Stream xmlNodeSet, UserToken userToken, UserToken authorId) { if (profileItem?.ProfileId != null) { profileModel = _nsDal.GetById(profileItem.ProfileId.Value, userToken); //if (!(profileModel.AuthorId == null || profileModel.AuthorId == userId)) //{ // throw new Exception($"User does not have access to profile on profileItem {profileItem}"); //} } //var uriToExport = nodeSetModel?.Namespace ?? profileItem.Namespace; var dalContext = new DALContext(this, userToken, authorId, false); _lastDalContext = dalContext; if (!NodesetModels.ContainsKey(strOpcNamespaceUri)) { try { // TODO find the right OPC version references in the nodeSet? var opcNodeSetModel = _nsDal.Where(ns => ns.Namespace == strOpcNamespaceUri /*&& (ns.AuthorId == null || ns.AuthorId == userId)*/, userToken, null, null, false, true).Data.OrderByDescending(m => m.PublishDate).FirstOrDefault(); // workaround for bug https://github.com/dotnet/runtime/issues/67622 var fileCachePatched = opcNodeSetModel.NodeSetFiles[0].FileCache.Replace("<Value/>", "<Value xsi:nil='true' />"); using (MemoryStream nodeSetStream = new MemoryStream(Encoding.UTF8.GetBytes(fileCachePatched))) //var nodeSetFilePath = Path.Combine(Path.GetDirectoryName(this.GetType().Assembly.Location), "Nodesets", "Opc.Ua.NodeSet2.xml"); //using (Stream nodeSetStream = new FileStream(nodeSetFilePath, FileMode.Open)) { UANodeSet nodeSet = UANodeSet.Read(nodeSetStream); _importedNodesByNodeId = null; // Get aliases from base UA model // TODO remove unused aliases later //foreach (var alias in nodeSet.Aliases) //{ // this.Aliases[alias.Value] = alias.Alias; //} // TODO find a more elegant way to load OPC base data types (needed by DataTypeModel.GetBuiltinDataType) var opcModel = nodeSet.Models[0]; var opcProfile = _nsDal.Where(ns => ns.Namespace == opcModel.ModelUri /*&& ns.PublicationDate == opcModel.PublicationDate*/ /*&& (ns.AuthorId == null || ns.AuthorId == userId)*/, userToken, null, null).Data?.FirstOrDefault(); //TBD - this next line is time consuming. this.LoadNodeSetAsync(nodeSet, opcProfile // new OPCUANodeSetHelpers.ModelNameAndVersion //{ // ModelUri = opcModel.ModelUri, // ModelVersion = opcModel.Version, // PublicationDate = opcModel.PublicationDate, // CacheId = opcNodeSetModel.ID, //} , true).Wait(); } } catch { } } if (profileItem == null) { var profileItemsResult = _dal.Where(pi => pi.ProfileId == profileModel.ID /*&& (pi.AuthorId == null || pi.AuthorId == userId)*/, userToken, null, null, false, true); if (profileItemsResult.Data != null) { foreach (var profile in profileItemsResult.Data) { var nodeModel = NodeModelFromProfileFactory.Create(profile, this, dalContext); } } } else { var nodeModel = NodeModelFromProfileFactory.Create(profileItem, this, dalContext); } // Export the nodesets var exportedNodeSet = new UANodeSet(); foreach (var model in this.NodesetModels.Values.Where(model => ((ProfileModel)model.CustomState).Namespace == profileModel.Namespace && ((ProfileModel)model.CustomState).PublishDate == profileModel.PublishDate)) { model.UpdateIndices(); ExportNodeSet(exportedNodeSet, model, this.NodesetModels, this.Aliases); } // .Net6 changed the default to no-identation: https://github.com/dotnet/runtime/issues/64885 using (StreamWriter writer = new StreamWriter(xmlNodeSet, Encoding.UTF8)) { try { var xmlWriter = XmlWriter.Create(writer, new XmlWriterSettings { Indent = true, }); XmlSerializer serializer = new XmlSerializer(typeof(UANodeSet)); serializer.Serialize(xmlWriter, exportedNodeSet); } finally { writer.Flush(); } } //exportedNodeSet.Write(xmlNodeSet); return(true); }
public bool ExportNodeSet(CESMII.ProfileDesigner.DAL.Models.ProfileModel nodeSetModel, Stream xmlNodeSet, UserToken userToken, UserToken authorId) { return(ExportInternal(nodeSetModel, null, xmlNodeSet, userToken, authorId)); }