44import java .io .InputStream ;
55import java .net .URL ;
66import java .nio .file .Path ;
7+ import java .util .ArrayList ;
8+ import java .util .Arrays ;
79import java .util .Base64 ;
10+ import java .util .Collections ;
11+ import java .util .Comparator ;
12+ import java .util .List ;
13+ import java .util .Set ;
14+ import java .util .TreeSet ;
15+ import java .util .stream .Collectors ;
816
917import org .eclipse .core .resources .IProject ;
1018import org .eclipse .core .resources .IResource ;
1422
1523public class ResourceUtils {
1624
25+ private static final Comparator <IProject > projectByPathComparator = new Comparator <IProject >() {
26+ @ Override
27+ public int compare (IProject o1 , IProject o2 ) {
28+ Path fullPath = ResourceUtils .getFullPath (o1 );
29+ Path fullPath2 = ResourceUtils .getFullPath (o2 );
30+ return fullPath .compareTo (fullPath2 );
31+ }
32+ };
33+
1734 public ResourceUtils () {
1835 }
1936
@@ -45,18 +62,48 @@ private static byte[] getImageDataFromUrl(URL imageUrl) {
4562 }
4663 }
4764
48- public static Path getFullPath (IResource resource ) {
65+ public static Path getFullPath (IResource resource ) {
4966 return resource .getLocation ().toPath ().toAbsolutePath ();
5067 }
5168
5269 public static IProject getProjectByPath (Path path ) {
53- var projects = ResourcesPlugin .getWorkspace ().getRoot ().getProjects ();
70+ var projects = getAccessibleTopLevelProjects ();
71+
5472 for (IProject iProject : projects ) {
5573 Path projectPath = ResourceUtils .getFullPath (iProject );
56- if (iProject . isAccessible () && path .normalize ().startsWith (projectPath )) {
74+ if (path .normalize ().startsWith (projectPath )) {
5775 return iProject ;
5876 }
5977 }
6078 return null ;
6179 }
80+
81+ public static List <IProject > getAccessibleTopLevelProjects () {
82+ var projects = Arrays .stream (ResourcesPlugin .getWorkspace ().getRoot ().getProjects ())
83+ .filter ((project ) -> {
84+ return project .isAccessible ()
85+ && !project .isDerived ()
86+ && !project .isHidden ();
87+ })
88+ .sorted (projectByPathComparator )
89+ .collect (Collectors .toList ());
90+
91+ Set <IProject > topLevel = new TreeSet <>(projectByPathComparator );
92+ boolean add = true ;
93+ for (IProject iProject : projects ) {
94+ var projectPath = ResourceUtils .getFullPath (iProject );
95+ for (IProject tp : topLevel ) {
96+ var topLevelPath = ResourceUtils .getFullPath (tp );
97+ if (projectPath .startsWith (topLevelPath )) {
98+ add = false ;
99+ break ;
100+ }
101+ }
102+ if (add ) {
103+ topLevel .add (iProject );
104+ }
105+ }
106+
107+ return new ArrayList <>(topLevel );
108+ }
62109}
0 commit comments