private boolean removeNode(TransactionWorkspace workspace, WorkspaceNode workspaceNode, boolean notify, InvocationContext ctx) throws CacheException
{
if (workspaceNode == null) return false;
Fqn parentFqn = workspaceNode.getFqn().getParent();
WorkspaceNode parentNode = fetchWorkspaceNode(ctx, parentFqn, workspace, false, true);
if (parentNode == null) throw new NodeNotExistsException("Unable to find parent node with fqn " + parentFqn);
if (notify) notifier.notifyNodeRemoved(workspaceNode.getFqn(), true, workspaceNode.getData(), ctx);
Fqn nodeFqn = workspaceNode.getFqn();
parentNode.removeChild(nodeFqn.getLastElement());
SortedMap<Fqn, WorkspaceNode> tailMap = workspace.getNodesAfter(workspaceNode.getFqn());
for (WorkspaceNode toDelete : tailMap.values())
{
if (toDelete.getFqn().isChildOrEquals(nodeFqn))
{
if (trace) log.trace("marking node " + toDelete.getFqn() + " as deleted");
toDelete.setRemoved(true);
}
else
{
break;
}
}
if (notify) notifier.notifyNodeRemoved(workspaceNode.getFqn(), false, null, ctx);
return workspaceNode.getNode().isValid();
}