private void addNetworkingBlockInternal(T networkNode) { SimpleNetwork<T> addToNetwork = null; Set<T> networkingNodesToAdd = Sets.newHashSet(); networkingNodesToAdd.add(networkNode); Set<T> newLeafNodes = Sets.newHashSet(); // Try adding to existing networks final Iterator<SimpleNetwork<T>> networkIterator = networks.iterator(); while (networkIterator.hasNext()) { final SimpleNetwork<T> network = networkIterator.next(); if (network.canAddNetworkingNode(networkNode)) { if (addToNetwork == null) { addToNetwork = network; } else { Set<T> networkingNodesToNotify = Sets.newHashSet(network.getNetworkingNodes()); Set<T> leafNodesToNotify = Sets.newHashSet(network.getLeafNodes()); networkingNodesToAdd.addAll(networkingNodesToNotify); newLeafNodes.addAll(leafNodesToNotify); network.removeAllLeafNodes(); notifyLeafNodesRemoved(network, leafNodesToNotify); network.removeAllNetworkingNodes(); notifyNetworkingNodesRemoved(network, networkingNodesToNotify); networkIterator.remove(); notifyNetworkRemoved(network); } } } // If it's not in any networks, create a new one if (addToNetwork == null) { SimpleNetwork<T> newNetwork = new SimpleNetwork<>(); networks.add(newNetwork); notifyNetworkAdded(newNetwork); addToNetwork = newNetwork; } for (T networkingNode : networkingNodesToAdd) { addToNetwork.addNetworkingNode(networkingNode); } notifyNetworkingNodesAdded(addToNetwork, networkingNodesToAdd); for (T leafNode : newLeafNodes) { addToNetwork.addLeafNode(leafNode); } // Find all leaf nodes that it joins to its network for (T leafNode : leafNodes.values()) { if (addToNetwork.canAddLeafNode(leafNode)) { addToNetwork.addLeafNode(leafNode); newLeafNodes.add(leafNode); } } if (newLeafNodes.size() > 0) { notifyLeafNodesAdded(addToNetwork, newLeafNodes); } }