package org.projectusus.core.filerelations.model; import java.util.List; import java.util.Map; import java.util.Set; import org.jgrapht.DirectedGraph; import org.jgrapht.alg.ConnectivityInspector; import org.jgrapht.graph.DefaultDirectedGraph; import ch.akuhn.foreach.ForEach; import ch.akuhn.foreach.GroupBy; public class IntraPackageComponents { public List<Set<ClassDescriptor>> getComponents() { DirectedGraph<ClassDescriptor, Relation<ClassDescriptor>> graph = calcGraph(); ConnectivityInspector<ClassDescriptor, Relation<ClassDescriptor>> inspector = new ConnectivityInspector<ClassDescriptor, Relation<ClassDescriptor>>( graph ); return inspector.connectedSets(); } public Map<Packagename, List<Set<ClassDescriptor>>> getSetsPerPackage() { return setsPerPackage( getComponents() ); } static Map<Packagename, List<Set<ClassDescriptor>>> setsPerPackage( List<Set<ClassDescriptor>> sets ) { for( GroupBy<Set<ClassDescriptor>> set : ForEach.groupBy( sets ) ) { set.yield = set.value.iterator().next().getPackagename(); } return ForEach.result(); } private DirectedGraph<ClassDescriptor, Relation<ClassDescriptor>> calcGraph() { DirectedGraph<ClassDescriptor, Relation<ClassDescriptor>> graph = new DefaultDirectedGraph<ClassDescriptor, Relation<ClassDescriptor>>( new RelationFactory() ); for( ClassDescriptor descriptor : ClassDescriptor.getAll() ) { graph.addVertex( descriptor ); } for( ClassDescriptor descriptor : ClassDescriptor.getAll() ) { for( ClassDescriptor child : descriptor.getChildrenInSamePackage() ) { graph.addEdge( descriptor, child ); } } return graph; } }