private void DeleteNode(ILocalNode node, bool deleteChildren, bool instance, Dictionary<NodeId,IList<IReference>> referencesToDelete)
{
if (node == null) throw new ArgumentNullException("node");
List<ILocalNode> nodesToDelete = new List<ILocalNode>();
List<IReference> referencesForNode = new List<IReference>();
try
{
m_lock.Enter();
// remove the node.
m_nodes.Remove(node.NodeId);
// check need to connect subtypes to the supertype if they are being deleted.
ExpandedNodeId supertypeId = m_server.TypeTree.FindSuperType(node.NodeId);
if (!NodeId.IsNull(supertypeId))
{
m_server.TypeTree.Remove(node.NodeId);
}
// delete sources.
#if LEGACY_NODEMANAGER
DeleteRegisteredSources(node);
#endif
// remove any references to the node.
foreach (IReference reference in node.References)
{
// ignore remote references.
if (reference.TargetId.IsAbsolute)
{
continue;
}
// find the target.
ILocalNode target = GetManagerHandle(reference.TargetId) as ILocalNode;
if (target == null)
{
referencesForNode.Add(reference);
continue;
}
// delete the backward reference.
target.References.Remove(reference.ReferenceTypeId, !reference.IsInverse, node.NodeId);
// check for children that need to be deleted.
if (deleteChildren)
{
if (m_server.TypeTree.IsTypeOf(reference.ReferenceTypeId, ReferenceTypeIds.Aggregates) && !reference.IsInverse)
{
nodesToDelete.Add(target);
}
}
}
if (referencesForNode.Count > 0)
{
referencesToDelete[node.NodeId] = referencesForNode;
}
}
finally
{
m_lock.Exit();
}
// delete the child nodes.
foreach (ILocalNode nodeToDelete in nodesToDelete)
{
DeleteNode(nodeToDelete, deleteChildren, instance, referencesToDelete);
}
}