public void removeLeafBlock(T networkNode) { validateNotMutating(); mutating = true; try { if (!leafNodes.remove(networkNode.location, networkNode)) { throw new IllegalArgumentException("Leaf node not found in the BlockNetwork"); } final Iterator<SimpleNetwork<T>> networkIterator = networks.iterator(); while (networkIterator.hasNext()) { final SimpleNetwork<T> network = networkIterator.next(); if (network.hasLeafNode(networkNode)) { boolean degenerate = network.removeLeafNode(networkNode); if (!degenerate) { notifyLeafNodesRemoved(network, Collections.singleton(networkNode)); } else { T onlyLeafNode = network.getLeafNodes().iterator().next(); notifyLeafNodesRemoved(network, Sets.newHashSet(networkNode, onlyLeafNode)); networkIterator.remove(); notifyNetworkRemoved(network); } } } } finally { mutating = false; } }