
de.andrena.tools.nopackagecycles.PackageCycleCollector Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of no-package-cycles-enforcer-rule Show documentation
Show all versions of no-package-cycles-enforcer-rule Show documentation
A rule for the maven-enforcer-plugin that detects and prevents package cycles.
The newest version!
package de.andrena.tools.nopackagecycles;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import jdepend.framework.JavaPackage;
import org.jgrapht.DirectedGraph;
import org.jgrapht.alg.StrongConnectivityInspector;
import org.jgrapht.graph.DefaultDirectedGraph;
import org.jgrapht.graph.DefaultEdge;
public class PackageCycleCollector {
public List> collectCycles(List packages) {
DirectedGraph graph = new DefaultDirectedGraph(
DefaultEdge.class);
addVerticesToGraph(packages, graph);
addEdgesToGraph(packages, graph);
return collectCycles(graph);
}
private List> collectCycles(DirectedGraph graph) {
List> stronglyConnectedSets = new StrongConnectivityInspector(graph)
.stronglyConnectedSets();
removeSingletonSets(stronglyConnectedSets);
return stronglyConnectedSets;
}
private void removeSingletonSets(List> stronglyConnectedSets) {
Iterator> iterator = stronglyConnectedSets.iterator();
while (iterator.hasNext()) {
Set stronglyConnectedSet = iterator.next();
if (stronglyConnectedSet.size() == 1) {
iterator.remove();
}
}
}
@SuppressWarnings("unchecked")
private void addEdgesToGraph(List packages, DirectedGraph graph) {
for (JavaPackage javaPackage : packages) {
for (JavaPackage efferent : (Collection) javaPackage.getEfferents()) {
graph.addEdge(javaPackage, efferent);
}
}
}
private void addVerticesToGraph(List packages, DirectedGraph graph) {
for (JavaPackage javaPackage : packages) {
graph.addVertex(javaPackage);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy