/// <summary> /// Exports a node to a nodeset. /// </summary> public void ExportNode(ILocalNode node, NodeSet nodeSet, bool instance) { lock (m_lock) { // check if the node has already been added. NodeId exportedId = nodeSet.Export(node.NodeId, m_nodes.NamespaceUris); if (nodeSet.Contains(exportedId)) { return; } // add to nodeset. Node nodeToExport = nodeSet.Add(node, m_nodes.NamespaceUris, m_nodes.ServerUris); // follow children. foreach (ReferenceNode reference in node.References) { // export all references. bool export = true; // unless it is a subtype reference. if (m_server.TypeTree.IsTypeOf(reference.ReferenceTypeId, ReferenceTypeIds.HasSubtype)) { export = false; } if (export) { nodeSet.AddReference(nodeToExport, reference, m_nodes.NamespaceUris, m_nodes.ServerUris); } if (reference.IsInverse || m_server.TypeTree.IsTypeOf(reference.ReferenceTypeId, ReferenceTypeIds.HasSubtype)) { nodeSet.AddReference(nodeToExport, reference, m_nodes.NamespaceUris, m_nodes.ServerUris); } if (m_server.TypeTree.IsTypeOf(reference.ReferenceTypeId, ReferenceTypeIds.Aggregates)) { if (reference.IsInverse) { continue; } ILocalNode child = GetLocalNode(reference.TargetId) as ILocalNode; if (child != null) { if (instance) { NodeId modellingRule = child.ModellingRule; if (modellingRule != Objects.ModellingRule_Mandatory) { continue; } } ExportNode(child, nodeSet, instance); } } } } }