All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.andrena.tools.nopackagecycles.PackageCycleCollector Maven / Gradle / Ivy

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