public synchronized boolean removeNodeByPath(@Nonnull PathNode<?> path) {
		// Call from root node only.
		WorkspaceTreeNode root = this;
		while (root.getParent() instanceof WorkspaceTreeNode parentNode)
			root = parentNode;

		// Get node by path.
		WorkspaceTreeNode nodeByPath = root.getNodeByPath(path);

		// Get that node's parent, remove the child.
		if (nodeByPath != null && nodeByPath.getParent() instanceof WorkspaceTreeNode parentNode) {
			boolean removed = parentNode.removeSourceChild(nodeByPath);
			while (parentNode.isLeaf() && parentNode.getParentNode() != null) {
				WorkspaceTreeNode parentOfParent = parentNode.getParentNode();
				parentOfParent.removeSourceChild(parentNode);
				parentNode = parentOfParent;
			}
			return removed;
		}

		// No known node by path.
		return false;
	}
@Test
	void removeNodeByPath() {
		WorkspaceTreeNode root = new WorkspaceTreeNode(p5);
		root.getOrCreateNodeByPath(p1a);

		// Remove the info
		assertNotNull(root.getNodeByPath(p1a), "Could not get info");
		assertTrue(root.removeNodeByPath(p1a));
		assertNull(root.getNodeByPath(p1a), "Info not removed");

		// The package should be removed since the tree was linear
		assertNull(root.getNodeByPath(p2), "Could not get package of info");
		assertFalse(root.removeNodeByPath(p2));
		assertNull(root.getNodeByPath(p2), "Package of info not removed");
		assertNull(root.getNodeByPath(p2b), "Parent of that package should not have been removed");

		// There is no more content in the bundle, so it should be gone too
		assertNull(root.getNodeByPath(p3c), "Could not get jvm class bundle");
		assertFalse(root.removeNodeByPath(p3c));
		assertNull(root.getNodeByPath(p3c), "Jvm class bundle not removed");
		assertNull(root.getNodeByPath(p2b), "Child of jvm class bundle still accessible after bundle removal");
	}