public void ExportNode(ILocalNode node, NodeSet nodeSet, bool instance)
{
try
{
m_lock.Enter();
// 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);
}
}
}
}
finally
{
m_lock.Exit();
}
}