cleanup
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / impl / AlternativeJreClassFinder.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.debugger.impl;
3
4 import com.intellij.debugger.DebuggerManagerEx;
5 import com.intellij.execution.configurations.ConfigurationWithAlternativeJre;
6 import com.intellij.execution.configurations.RunProfile;
7 import com.intellij.openapi.project.Project;
8 import com.intellij.openapi.projectRoots.ProjectJdkTable;
9 import com.intellij.openapi.projectRoots.Sdk;
10 import com.intellij.openapi.roots.OrderRootType;
11 import com.intellij.openapi.vfs.VirtualFile;
12 import com.intellij.psi.NonClasspathClassFinder;
13 import com.intellij.psi.search.GlobalSearchScope;
14 import com.intellij.psi.search.NonClasspathDirectoriesScope;
15 import com.intellij.util.SmartList;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
18
19 import java.util.Arrays;
20 import java.util.Collection;
21 import java.util.Collections;
22 import java.util.List;
23
24 public final class AlternativeJreClassFinder extends NonClasspathClassFinder {
25   public AlternativeJreClassFinder(Project project) {
26     super(project);
27
28     project.getMessageBus().connect().subscribe(DebuggerManagerListener.TOPIC, new DebuggerManagerListener() {
29       @Override
30       public void sessionCreated(DebuggerSession session) {
31         clearCache();
32       }
33
34       @Override
35       public void sessionRemoved(DebuggerSession session) {
36         clearCache();
37       }
38     });
39   }
40
41   @Override
42   protected List<VirtualFile> calcClassRoots() {
43     Collection<DebuggerSession> sessions = DebuggerManagerEx.getInstanceEx(myProject).getSessions();
44     if (sessions.isEmpty()) {
45       return Collections.emptyList();
46     }
47     List<VirtualFile> res = new SmartList<>();
48     for (DebuggerSession session : sessions) {
49       Sdk jre = session.getAlternativeJre();
50       if (jre != null) {
51         res.addAll(getClassRoots(jre));
52       }
53     }
54     return res;
55   }
56
57   @Nullable
58   public static Sdk getAlternativeJre(RunProfile profile) {
59     if (profile instanceof ConfigurationWithAlternativeJre) {
60       ConfigurationWithAlternativeJre appConfig = (ConfigurationWithAlternativeJre)profile;
61       if (appConfig.isAlternativeJrePathEnabled()) {
62         String path = appConfig.getAlternativeJrePath();
63         return path == null ? null : ProjectJdkTable.getInstance().findJdk(path);
64       }
65     }
66     return null;
67   }
68
69   @NotNull
70   private static Collection<VirtualFile> getClassRoots(@NotNull Sdk jre) {
71     return Arrays.asList(jre.getRootProvider().getFiles(OrderRootType.CLASSES));
72   }
73
74   @NotNull
75   public static Collection<VirtualFile> getSourceRoots(@NotNull Sdk jre) {
76     return Arrays.asList(jre.getRootProvider().getFiles(OrderRootType.SOURCES));
77   }
78
79   @NotNull
80   public static GlobalSearchScope getSearchScope(@NotNull Sdk jre) {
81     return new NonClasspathDirectoriesScope(getClassRoots(jre));
82   }
83 }