in maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictResolver.java [641:700]
boolean push(DependencyNode node, Object conflictId) throws RepositoryException {
if (conflictId == null) {
if (node.getDependency() != null) {
if (node.getData().get(NODE_DATA_WINNER) != null) {
return false;
}
throw new RepositoryException("missing conflict id for node " + node);
}
} else if (!potentialAncestorIds.contains(conflictId)) {
return false;
}
List<DependencyNode> graphNode = node.getChildren();
if (stack.put(graphNode, Boolean.TRUE) != null) {
return false;
}
int depth = depth();
String scope = deriveScope(node, conflictId);
boolean optional = deriveOptional(node, conflictId);
NodeInfo info = infos.get(graphNode);
if (info == null) {
info = new NodeInfo(depth, scope, optional);
infos.put(graphNode, info);
parentInfos.add(info);
parentNodes.add(node);
parentScopes.add(scope);
parentOptionals.add(optional);
} else {
int changes = info.update(depth, scope, optional);
if (changes == 0) {
stack.remove(graphNode);
return false;
}
parentInfos.add(null); // disable creating new conflict items, we update the existing ones below
parentNodes.add(node);
parentScopes.add(scope);
parentOptionals.add(optional);
if (info.children != null) {
if ((changes & NodeInfo.CHANGE_SCOPE) != 0) {
ListIterator<ConflictItem> itemIterator = info.children.listIterator(info.children.size());
while (itemIterator.hasPrevious()) {
ConflictItem item = itemIterator.previous();
String childScope = deriveScope(item.node, null);
item.addScope(childScope);
}
}
if ((changes & NodeInfo.CHANGE_OPTIONAL) != 0) {
ListIterator<ConflictItem> itemIterator = info.children.listIterator(info.children.size());
while (itemIterator.hasPrevious()) {
ConflictItem item = itemIterator.previous();
boolean childOptional = deriveOptional(item.node, null);
item.addOptional(childOptional);
}
}
}
}
return true;
}