Python remote interpreters refactored. Common code moved to remote-sdk-api and remote-sdk-impl modules.

This commit is contained in:
Dmitry Trofimov
2012-09-26 18:01:14 +04:00
parent 3c9215806a
commit b38409f29e
15 changed files with 63 additions and 60 deletions
@@ -1,7 +1,7 @@
package com.jetbrains.python.run;
import com.intellij.openapi.module.Module;
import com.jetbrains.python.debugger.remote.PyPathMappingSettings;
import com.intellij.util.PathMappingSettings;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
@@ -41,7 +41,7 @@ public interface AbstractPythonRunConfigurationParams {
void setEnvs(final Map<String, String> envs);
@Nullable
PyPathMappingSettings getMappingSettings();
PathMappingSettings getMappingSettings();
void setMappingSettings(@Nullable PyPathMappingSettings mappingSettings);
void setMappingSettings(@Nullable PathMappingSettings mappingSettings);
}
@@ -10,7 +10,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.ui.CollectionComboBoxModel;
import com.intellij.ui.RawCommandLineEditor;
import com.intellij.ui.components.JBLabel;
import com.jetbrains.python.debugger.remote.PyPathMappingSettings;
import com.intellij.util.PathMappingSettings;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.Nullable;
@@ -158,12 +158,12 @@ public class PyPluginCommonOptionsForm implements AbstractPyCommonOptionsForm {
}
@Override
public PyPathMappingSettings getMappingSettings() {
public PathMappingSettings getMappingSettings() {
return null; //TODO: implement for plugin
}
@Override
public void setMappingSettings(@Nullable PyPathMappingSettings mappingSettings) {
public void setMappingSettings(@Nullable PathMappingSettings mappingSettings) {
}
@Override
+1
View File
@@ -22,6 +22,7 @@
<orderEntry type="module" module-name="xml" />
<orderEntry type="module" module-name="relaxng" scope="RUNTIME" />
<orderEntry type="library" name="XmlRPC" level="project" />
<orderEntry type="module" module-name="remote-sdk-api" />
</component>
</module>
+1
View File
@@ -23,6 +23,7 @@
<orderEntry type="module" module-name="relaxng" scope="RUNTIME" />
<orderEntry type="library" name="Velocity" level="project" />
<orderEntry type="module" module-name="python-helpers" scope="RUNTIME" />
<orderEntry type="module" module-name="remote-sdk-api" scope="TEST" />
</component>
</module>
+1
View File
@@ -37,6 +37,7 @@
<orderEntry type="module" module-name="ChromeConnector" />
<orderEntry type="module" module-name="FirefoxConnector" />
<orderEntry type="module" module-name="python-openapi" exported="" />
<orderEntry type="module" module-name="remote-sdk-api" />
</component>
<component name="copyright">
<Base>
@@ -42,15 +42,15 @@ import com.intellij.util.ArrayUtil;
import com.intellij.util.IJSwingUtilities;
import com.intellij.util.net.NetUtils;
import com.jetbrains.django.run.Runner;
import com.jetbrains.plugins.remotesdk.RemoteInterpreterException;
import com.jetbrains.plugins.remotesdk.RemoteSdkData;
import com.jetbrains.plugins.remotesdk.RemoteSshProcess;
import com.jetbrains.python.PythonHelpersLocator;
import com.jetbrains.python.console.completion.PydevConsoleElement;
import com.jetbrains.python.console.parsing.PythonConsoleData;
import com.jetbrains.python.console.pydev.ConsoleCommunication;
import com.jetbrains.python.debugger.PySourcePosition;
import com.jetbrains.python.remote.PyRemoteInterpreterException;
import com.jetbrains.python.remote.PyRemoteSshProcess;
import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
import com.jetbrains.python.remote.PythonRemoteSdkAdditionalData;
import com.jetbrains.python.run.PythonCommandLineState;
import com.jetbrains.python.run.PythonTracebackFilter;
import com.jetbrains.python.sdk.PySdkUtil;
@@ -215,7 +215,7 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
return createRemoteConsoleProcess(manager, myCommandLineArgumentsProvider.getArguments(),
myCommandLineArgumentsProvider.getAdditionalEnvs());
}
catch (final PyRemoteInterpreterException e) {
catch (final RemoteInterpreterException e) {
throw new ExecutionException(e.getMessage(), e);
}
}
@@ -236,13 +236,13 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
}
private Process createRemoteConsoleProcess(PythonRemoteInterpreterManager manager, String[] command, Map<String, String> envs)
throws PyRemoteInterpreterException, ExecutionException {
PythonRemoteSdkAdditionalData data = (PythonRemoteSdkAdditionalData)mySdk.getSdkAdditionalData();
throws RemoteInterpreterException, ExecutionException {
RemoteSdkData data = (RemoteSdkData)mySdk.getSdkAdditionalData();
GeneralCommandLine commandLine = new GeneralCommandLine(command);
commandLine.setEnvParams(envs);
commandLine.getParametersList().set(1, PythonRemoteInterpreterManager.toSystemDependent(new File(data.getPyCharmHelpersPath(),
commandLine.getParametersList().set(1, PythonRemoteInterpreterManager.toSystemDependent(new File(data.getHelpersPath(),
PYDEV_PYDEVCONSOLE_PY)
.getPath(),
PySourcePosition.isWindowsPath(
@@ -253,7 +253,7 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
myCommandLine = commandLine.getCommandLineString();
PyRemoteSshProcess remoteProcess =
RemoteSshProcess remoteProcess =
manager.createRemoteProcess(getProject(), data, commandLine, false);
@@ -18,7 +18,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.xdebugger.*;
import com.intellij.xdebugger.breakpoints.XBreakpoint;
import com.intellij.xdebugger.breakpoints.XBreakpointHandler;
@@ -27,11 +26,11 @@ import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider;
import com.intellij.xdebugger.frame.XValueChildrenList;
import com.intellij.xdebugger.stepping.XSmartStepIntoHandler;
import com.jetbrains.django.util.DjangoUtil;
import com.jetbrains.plugins.remotesdk.RemoteProcessHandlerBase;
import com.jetbrains.python.console.pydev.PydevCompletionVariant;
import com.jetbrains.python.debugger.django.DjangoExceptionBreakpointHandler;
import com.jetbrains.python.debugger.pydev.*;
import com.jetbrains.python.debugger.remote.vfs.PyRemotePositionConverter;
import com.jetbrains.python.remote.PyRemoteProcessHandlerBase;
import com.jetbrains.python.run.PythonProcessHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -90,8 +89,8 @@ public class PyDebugProcess extends XDebugProcess implements IPyDebugProcess, Pr
if (myProcessHandler != null) {
myProcessHandler.addProcessListener(this);
}
if (processHandler instanceof PyRemoteProcessHandlerBase) {
myPositionConverter = new PyRemotePositionConverter(this, ((PyRemoteProcessHandlerBase)processHandler).getMappingSettings());
if (processHandler instanceof RemoteProcessHandlerBase) {
myPositionConverter = new PyRemotePositionConverter(this, ((RemoteProcessHandlerBase)processHandler).getMappingSettings());
}
else {
myPositionConverter = new PyLocalPositionConverter();
@@ -233,8 +232,8 @@ public class PyDebugProcess extends XDebugProcess implements IPyDebugProcess, Pr
@Override
public int handleDebugPort(int localPort) throws IOException {
if (myProcessHandler instanceof PyRemoteProcessHandlerBase) {
PyRemoteProcessHandlerBase remoteProcessHandler = (PyRemoteProcessHandlerBase)myProcessHandler;
if (myProcessHandler instanceof RemoteProcessHandlerBase) {
RemoteProcessHandlerBase remoteProcessHandler = (RemoteProcessHandlerBase)myProcessHandler;
try {
Pair<String, Integer> remoteSocket = remoteProcessHandler.obtainRemoteSocket();
remoteProcessHandler.addRemoteForwarding(remoteSocket.getSecond(), localPort);
@@ -34,15 +34,15 @@ import com.intellij.util.Function;
import com.intellij.util.SystemProperties;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.net.HttpConfigurable;
import com.jetbrains.plugins.remotesdk.RemoteFile;
import com.jetbrains.plugins.remotesdk.RemoteInterpreterException;
import com.jetbrains.plugins.remotesdk.RemoteSdkData;
import com.jetbrains.python.PythonHelpersLocator;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyListLiteralExpression;
import com.jetbrains.python.psi.PyStringLiteralExpression;
import com.jetbrains.python.remote.PyRemoteInterpreterException;
import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
import com.jetbrains.python.remote.PythonRemoteSdkAdditionalData;
import com.jetbrains.python.remote.RemoteFile;
import com.jetbrains.python.remote.*;
import com.jetbrains.python.sdk.PySdkUtil;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
@@ -609,9 +609,9 @@ public class PyPackageManagerImpl extends PyPackageManager {
private String getHelperPath(String helper) {
String helperPath;
final SdkAdditionalData sdkData = mySdk.getSdkAdditionalData();
if (sdkData instanceof PythonRemoteSdkAdditionalData) {
final PythonRemoteSdkAdditionalData remoteSdkData = (PythonRemoteSdkAdditionalData)sdkData;
helperPath = new RemoteFile(remoteSdkData.getPyCharmHelpersPath(),
if (sdkData instanceof RemoteSdkData) {
final RemoteSdkData remoteSdkData = (RemoteSdkData)sdkData;
helperPath = new RemoteFile(remoteSdkData.getHelpersPath(),
helper).getPath();
}
else {
@@ -626,8 +626,8 @@ public class PyPackageManagerImpl extends PyPackageManager {
@Nullable String parentDir)
throws PyExternalProcessException {
final SdkAdditionalData sdkData = mySdk.getSdkAdditionalData();
if (sdkData instanceof PythonRemoteSdkAdditionalData) {
final PythonRemoteSdkAdditionalData remoteSdkData = (PythonRemoteSdkAdditionalData)sdkData;
if (sdkData instanceof RemoteSdkData) {
final RemoteSdkData remoteSdkData = (RemoteSdkData)sdkData;
final PythonRemoteInterpreterManager manager = PythonRemoteInterpreterManager.getInstance();
if (manager != null) {
final List<String> cmdline = new ArrayList<String>();
@@ -649,7 +649,7 @@ public class PyPackageManagerImpl extends PyPackageManager {
while (true);
return processOutput;
}
catch (PyRemoteInterpreterException e) {
catch (RemoteInterpreterException e) {
throw new PyExternalProcessException(ERROR_INVALID_SDK, helperPath, args, "Error running SDK: " + e.getMessage(), e);
}
}
@@ -21,7 +21,7 @@ import com.intellij.util.PlatformUtils;
import com.intellij.util.xmlb.XmlSerializer;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PythonModuleTypeBase;
import com.jetbrains.python.debugger.remote.PyPathMappingSettings;
import com.intellij.util.PathMappingSettings;
import com.jetbrains.python.sdk.PythonEnvUtil;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jdom.Element;
@@ -40,7 +40,7 @@ public abstract class AbstractPythonRunConfiguration<T extends AbstractRunConfig
private String myWorkingDirectory = "";
private String mySdkHome = "";
private boolean myUseModuleSdk;
protected PyPathMappingSettings myMappingSettings;
protected PathMappingSettings myMappingSettings;
public AbstractPythonRunConfiguration(final String name, final RunConfigurationModule module, final ConfigurationFactory factory) {
super(name, module, factory);
@@ -51,11 +51,11 @@ public abstract class AbstractPythonRunConfiguration<T extends AbstractRunConfig
return getValidModules(getProject());
}
public PyPathMappingSettings getMappingSettings() {
public PathMappingSettings getMappingSettings() {
return myMappingSettings;
}
public void setMappingSettings(PyPathMappingSettings mappingSettings) {
public void setMappingSettings(PathMappingSettings mappingSettings) {
myMappingSettings = mappingSettings;
}
@@ -193,10 +193,10 @@ public abstract class AbstractPythonRunConfiguration<T extends AbstractRunConfig
myUseModuleSdk = Boolean.parseBoolean(JDOMExternalizerUtil.readField(element, "IS_MODULE_SDK"));
getConfigurationModule().readExternal(element);
Element settingsElement = element.getChild(PyPathMappingSettings.class.getSimpleName());
Element settingsElement = element.getChild(PathMappingSettings.class.getSimpleName());
if (settingsElement != null) {
setMappingSettings(
XmlSerializer.deserialize(settingsElement, PyPathMappingSettings.class));
XmlSerializer.deserialize(settingsElement, PathMappingSettings.class));
}
// extension settings:
@@ -29,14 +29,14 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.HashMap;
import com.jetbrains.plugins.remotesdk.RemoteInterpreterException;
import com.jetbrains.python.console.PyDebugConsoleBuilder;
import com.jetbrains.python.debugger.PyDebugRunner;
import com.jetbrains.python.debugger.PyDebuggerSettings;
import com.jetbrains.python.facet.LibraryContributingFacet;
import com.jetbrains.python.facet.PythonPathContributingFacet;
import com.jetbrains.python.remote.PyRemoteInterpreterException;
import com.jetbrains.python.remote.PyRemoteSdkAdditionalData;
import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
import com.jetbrains.python.remote.PythonRemoteSdkAdditionalData;
import com.jetbrains.python.sdk.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -178,7 +178,7 @@ public abstract class PythonCommandLineState extends CommandLineState {
processHandler = doStartRemoteProcess(sdk, commandLine, manager);
break;
}
catch (PyRemoteInterpreterException e) {
catch (RemoteInterpreterException e) {
if (Messages.showYesNoDialog(e.getMessage() + "\nTry again?", "Can't Run Remote Interpreter", Messages.getErrorIcon()) ==
Messages.NO) {
throw new ExecutionException("Can't run remote python interpreter: " + e.getMessage());
@@ -194,9 +194,9 @@ public abstract class PythonCommandLineState extends CommandLineState {
}
protected ProcessHandler doStartRemoteProcess(Sdk sdk, GeneralCommandLine commandLine, PythonRemoteInterpreterManager manager)
throws PyRemoteInterpreterException {
throws RemoteInterpreterException {
return manager.startRemoteProcess(myConfig.getProject(), (PythonRemoteSdkAdditionalData)sdk.getSdkAdditionalData(), commandLine,
return manager.startRemoteProcess(myConfig.getProject(), (PyRemoteSdkAdditionalData)sdk.getSdkAdditionalData(), commandLine,
myConfig.getMappingSettings());
}
@@ -12,8 +12,8 @@ import com.intellij.ui.CollectionComboBoxModel;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.util.PathUtil;
import com.jetbrains.plugins.remotesdk.RemoteSdkDataHolder;
import com.jetbrains.python.packaging.PyPackageService;
import com.jetbrains.python.remote.PythonRemoteSdkAdditionalData;
import com.jetbrains.python.ui.IdeaDialog;
import javax.swing.*;
@@ -160,7 +160,8 @@ public class CreateVirtualEnvDialog extends IdeaDialog {
mySdkCombo.setRenderer(new PySdkListCellRenderer(null));
List<Sdk> baseSdks = new ArrayList<Sdk>();
for (Sdk s : allSdks) {
if (!PythonSdkType.isInvalid(s) && !PythonSdkType.isVirtualEnv(s) && !PythonRemoteSdkAdditionalData.isRemoteSdk(s.getHomePath())) {
if (!PythonSdkType.isInvalid(s) && !PythonSdkType.isVirtualEnv(s) && !RemoteSdkDataHolder
.isRemoteSdk(s.getHomePath())) {
baseSdks.add(s);
}
else if (s.equals(sdk)){
@@ -2,7 +2,7 @@ package com.jetbrains.python.sdk;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.text.StringUtil;
import com.jetbrains.python.remote.RemoteFile;
import com.jetbrains.plugins.remotesdk.RemoteFile;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
@@ -8,7 +8,7 @@ import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.HashMap;
import com.jetbrains.python.remote.PythonRemoteSdkAdditionalData;
import com.jetbrains.plugins.remotesdk.RemoteSdkData;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -196,6 +196,6 @@ public class PySdkUtil {
}
public static boolean isRemote(@Nullable Sdk sdk) {
return sdk != null && sdk.getSdkAdditionalData() instanceof PythonRemoteSdkAdditionalData;
return sdk != null && sdk.getSdkAdditionalData() instanceof RemoteSdkData;
}
}
@@ -123,13 +123,14 @@ public class PythonSdkAdditionalData implements SdkAdditionalData {
}
protected static void load(@Nullable Element element, @NotNull PythonSdkAdditionalData data) {
data.setAddedPaths(loadStringList(element, PATHS_ADDED_BY_USER_ROOT, PATH_ADDED_BY_USER));
data.setExcludedPaths(loadStringList(element, PATHS_REMOVED_BY_USER_ROOT, PATH_REMOVED_BY_USER));
data.setAssociatedProjectPath(element.getAttributeValue(ASSOCIATED_PROJECT_PATH));
data.setAddedPaths(collectPaths(loadStringsList(element, PATHS_ADDED_BY_USER_ROOT, PATH_ADDED_BY_USER)));
data.setExcludedPaths(collectPaths(loadStringsList(element, PATHS_REMOVED_BY_USER_ROOT, PATH_REMOVED_BY_USER)));
if (element != null) {
data.setAssociatedProjectPath(element.getAttributeValue(ASSOCIATED_PROJECT_PATH));
}
}
protected static Set<VirtualFile> loadStringList(@Nullable Element element, @NotNull String rootName, @NotNull String attrName) {
final List<String> paths = loadPaths(element, rootName, attrName);
protected static Set<VirtualFile> collectPaths(@NotNull List<String> paths) {
final Set<VirtualFile> files = Sets.newHashSet();
for (String path : paths) {
VirtualFile vf = VirtualFileUtil.findFile(path);
@@ -140,14 +141,12 @@ public class PythonSdkAdditionalData implements SdkAdditionalData {
return files;
}
protected static List<String> loadPaths(Element element, String rootName, String attrName) {
protected static List<String> loadStringsList(Element element, String rootName, String attrName) {
final List<String> paths = new LinkedList<String>();
if (element != null) {
final List list = element.getChildren(rootName);
if (list != null) {
for (Object o : list) {
paths.add(((Element)o).getAttribute(attrName).getValue());
}
@NotNull final List list = element.getChildren(rootName);
for (Object o : list) {
paths.add(((Element)o).getAttribute(attrName).getValue());
}
}
return paths;
@@ -36,6 +36,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.*;
import com.intellij.util.ArrayUtil;
import com.intellij.util.SmartList;
import com.jetbrains.plugins.remotesdk.RemoteSdkDataHolder;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PythonFileType;
@@ -44,7 +45,7 @@ import com.jetbrains.python.facet.PythonFacetSettings;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.search.PyProjectScopeBuilder;
import com.jetbrains.python.remote.PythonRemoteSdkAdditionalData;
import com.jetbrains.python.remote.PyRemoteSdkAdditionalData;
import icons.PythonIcons;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
@@ -359,8 +360,8 @@ public class PythonSdkType extends SdkType {
@Override
public SdkAdditionalData loadAdditionalData(final Sdk currentSdk, final Element additional) {
if (PythonRemoteSdkAdditionalData.isRemoteSdk(currentSdk.getHomePath())) {
return PythonRemoteSdkAdditionalData.loadRemote(currentSdk, additional);
if (RemoteSdkDataHolder.isRemoteSdk(currentSdk.getHomePath())) {
return PyRemoteSdkAdditionalData.loadRemote(currentSdk, additional);
}
else {
return PythonSdkAdditionalData.load(currentSdk, additional);