package org.projectusus.ui.dependencygraph.sourcefolder; import static org.eclipse.jdt.core.IPackageFragmentRoot.K_SOURCE; import java.util.Comparator; import java.util.Set; import java.util.TreeSet; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaModelException; public class SourceFolderScanner { public Set<IPath> scan( IJavaProject... projects ) throws JavaModelException { Set<IPath> paths = newSet(); for( IJavaProject project : projects ) { paths.addAll( scanProject( project ) ); } return paths; } private Set<IPath> scanProject( IJavaProject project ) throws JavaModelException { Set<IPath> paths = newSet(); for( IPackageFragmentRoot packageFragmentRoot : project.getPackageFragmentRoots() ) { if( isSourceFolder( packageFragmentRoot ) ) { IPath sourceFolderPath = makeRelativeToBasePath( packageFragmentRoot.getPath(), project.getPath() ); paths.add( sourceFolderPath ); } } return paths; } private boolean isSourceFolder( IPackageFragmentRoot packageFragmentRoot ) throws JavaModelException { return packageFragmentRoot.getKind() == K_SOURCE; } private IPath makeRelativeToBasePath( IPath deepPath, IPath basePath ) { return deepPath.makeRelativeTo( basePath ); } private final static Comparator<IPath> PATH_COMPARATOR = new Comparator<IPath>() { public int compare( IPath path1, IPath path2 ) { return path1.toPortableString().compareTo( path2.toPortableString() ); } }; private <T extends IPath> Set<T> newSet() { return new TreeSet<T>( PATH_COMPARATOR ); } }