Java tutorial
/* * Copyright 2015 Jose Carrizo * Licensed under the Apache License, Version 2.0 * See accompanying file LICENSE or get a copy at http://www.apache.org/licenses/LICENSE-2.0 */ package org.automagic.deps.doctor; import java.util.ArrayList; import java.util.List; import org.automagic.deps.doctor.filter.DependenciesFilter; import org.automagic.deps.doctor.spy.PomSpy; import com.google.common.base.Optional; public class DependenciesDoctor { private final PomSpy pomSpy; private final boolean honorTopDependencies; private final DependenciesFilter filter; public DependenciesDoctor(PomSpy pomSpy, boolean honorTopDependencies, DependenciesFilter filter) { this.pomSpy = pomSpy; this.honorTopDependencies = honorTopDependencies; this.filter = filter; } @SuppressWarnings("unchecked") public Optional<List<TransitiveDependency>> getAntidote() { List<TransitiveDepsGroup> transitiveDepsGroups = pomSpy.getTransitiveDepsGroups(); List<TransitiveDepsGroup> conflictingDepsGroups = getConflictingDepsGroups(transitiveDepsGroups); if (conflictingDepsGroups.isEmpty()) { return Optional.absent(); } List<TransitiveDependency> list = new ArrayList<>(); Optional<List<TransitiveDependency>> antidote = Optional.of(list); for (TransitiveDepsGroup group : conflictingDepsGroups) { // search the dependency with the highest version in the group TransitiveDependency antidoteDep = group.getDependencies().get(0); for (TransitiveDependency dependency : group.getDependencies()) { if (dependency.getVersion().compareTo(antidoteDep.getVersion()) > 0) { antidoteDep = dependency; } } list.add(antidoteDep); } return antidote; } private List<TransitiveDepsGroup> getConflictingDepsGroups(List<TransitiveDepsGroup> transitiveDepsGroups) { List<TransitiveDepsGroup> conflicting = new ArrayList<>(); for (TransitiveDepsGroup group : transitiveDepsGroups) { Optional<TransitiveDependency> topDependency = group.getTopLevelDependency(); if (honorTopDependencies && topDependency.isPresent() && !topDependency.get().wasAddedByPlugin()) { continue; } if (filter.isExcluded(group.getGroupId(), group.getArtifactId())) { continue; } if (containsConflicts(group)) { conflicting.add(group); } } return conflicting; } @SuppressWarnings("unchecked") private boolean containsConflicts(TransitiveDepsGroup group) { // search the dependency nearest to the root of the dependency tree TransitiveDependency nearestToRoot = group.getDependencies().get(0); for (TransitiveDependency dependency : group.getDependencies()) { if (dependency.getHopCount() < nearestToRoot.getHopCount()) { nearestToRoot = dependency; } } for (TransitiveDependency dependency : group.getDependencies()) { if (nearestToRoot.getManagedVersion().compareTo(dependency.getVersion()) < 0) { return true; } } return false; } }