Exemple #1
0
        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);
        }
Exemple #2
0
 public bool ExportNodeSet(CESMII.ProfileDesigner.DAL.Models.ProfileModel nodeSetModel, Stream xmlNodeSet, UserToken userToken, UserToken authorId)
 {
     return(ExportInternal(nodeSetModel, null, xmlNodeSet, userToken, authorId));
 }