find and use matching jdk if remote jre version do not match project sdk

This commit is contained in:
Egor.Ushakov
2016-08-24 19:32:09 +03:00
parent 933a49f8d5
commit d291c8bfcc
3 changed files with 38 additions and 4 deletions
@@ -53,6 +53,10 @@ import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
@@ -86,7 +90,6 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.*;
@@ -605,11 +608,34 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb
private void checkVirtualMachineVersion(VirtualMachine vm) {
final String version = vm.version();
if ("1.4.0".equals(version)) {
SwingUtilities.invokeLater(() -> Messages.showMessageDialog(
getProject(),
DebuggerInvocationUtil.swingInvokeLater(myProject, () -> Messages.showMessageDialog(
myProject,
DebuggerBundle.message("warning.jdk140.unstable"), DebuggerBundle.message("title.jdk140.unstable"), Messages.getWarningIcon()
));
}
Sdk projectSdk = ProjectRootManager.getInstance(myProject).getProjectSdk();
if (getSession().getAlternativeJre() == null && !versionMatch(projectSdk, version)) {
for (Sdk sdk : ProjectJdkTable.getInstance().getAllJdks()) {
if (versionMatch(sdk, version)) {
XDebugSessionImpl.NOTIFICATION_GROUP.createNotification(
DebuggerBundle.message("message.remote.jre.version.mismatch",
version,
projectSdk != null ? projectSdk.getVersionString() : "unknown",
sdk.getName())
, MessageType.INFO).notify(myProject);
getSession().setAlternativeJre(sdk);
break;
}
}
}
}
private static boolean versionMatch(@Nullable Sdk sdk, String version) {
if (sdk != null) {
String versionString = sdk.getVersionString();
return versionString != null && versionString.contains(version);
}
return false;
}
/*Event dispatching*/
@@ -41,6 +41,7 @@ import com.intellij.notification.NotificationType;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.ui.Messages;
@@ -50,6 +51,7 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.PsiCompiledElement;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElementFinder;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.unscramble.ThreadState;
@@ -92,7 +94,7 @@ public class DebuggerSession implements AbstractDebuggerSession {
private final String mySessionName;
private final DebugProcessImpl myDebugProcess;
private final GlobalSearchScope mySearchScope;
private final Sdk myAlternativeJre;
private Sdk myAlternativeJre;
private final DebuggerContextImpl SESSION_EMPTY_CONTEXT;
//Thread, user is currently stepping through
@@ -123,6 +125,11 @@ public class DebuggerSession implements AbstractDebuggerSession {
return myAlternativeJre;
}
public void setAlternativeJre(Sdk sdk) {
myAlternativeJre = sdk;
Extensions.findExtension(PsiElementFinder.EP_NAME, getProject(), AlternativeJreClassFinder.class).clearCache();
}
public boolean isModifiedClassesScanRequired() {
return myModifiedClassesScanRequired;
}
@@ -76,6 +76,7 @@ error.no.shmem.address=Shared memory address unspecified
debugger.jdi.bootstrap.error={0}. Check your JDK installation.
warning.jdk140.unstable=The debuggee VM version is "1.4.0".\nJ2SDK 1.4.0 documented bugs may cause unstable debugger behavior.\nWe recommend using J2SDK 1.4.0_01 or higher.
title.jdk140.unstable=VM Version Warning
message.remote.jre.version.mismatch=Remote jre version ({0})\ndo not match project jdk version ({1}), \nwill use sources from sdk: {2}
error.invalid.argument={0,choice, 1#Invalid argument|2#Invalid arguments}
error.vm.disconnected=VM disconnected. Target virtual machine closed connection
error.unknown.host=Cannot connect to remote process, host is unknown