show shortened classpath preview (IDEA-165946)

This commit is contained in:
Anna.Kozlova
2017-10-05 17:58:08 +02:00
parent 632fd799c7
commit 33ac210e7b
4 changed files with 56 additions and 9 deletions
@@ -19,6 +19,7 @@ import com.intellij.ExtensionPoints;
import com.intellij.debugger.impl.GenericDebuggerRunnerSettings;
import com.intellij.diagnostic.logging.OutputFileUtil;
import com.intellij.execution.configurations.*;
import com.intellij.execution.filters.ArgumentFileFilter;
import com.intellij.execution.impl.ConsoleBuffer;
import com.intellij.execution.process.OSProcessHandler;
import com.intellij.execution.process.ProcessAdapter;
@@ -66,10 +67,7 @@ import org.jetbrains.jps.model.serialization.PathMacroUtil;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.*;
public abstract class JavaTestFrameworkRunnableState<T extends
ModuleBasedConfiguration<JavaRunConfigurationModule>
@@ -82,6 +80,7 @@ public abstract class JavaTestFrameworkRunnableState<T extends
protected File myWorkingDirsFile = null;
private RemoteConnectionCreator remoteConnectionCreator;
private final List<ArgumentFileFilter> myArgumentFileFilters = new ArrayList<>();
public void setRemoteConnectionCreator(RemoteConnectionCreator remoteConnectionCreator) {
this.remoteConnectionCreator = remoteConnectionCreator;
@@ -128,6 +127,16 @@ public abstract class JavaTestFrameworkRunnableState<T extends
return false;
}
@Override
protected GeneralCommandLine createCommandLine() throws ExecutionException {
GeneralCommandLine commandLine = super.createCommandLine();
Map<String, String> content = commandLine.getUserData(JdkUtil.COMMAND_LINE_CONTENT);
if (content != null) {
content.forEach((key, value) -> myArgumentFileFilters.add(new ArgumentFileFilter(key, value)));
}
return commandLine;
}
@NotNull
@Override
public ExecutionResult execute(@NotNull Executor executor, @NotNull ProgramRunner runner) throws ExecutionException {
@@ -143,6 +152,10 @@ public abstract class JavaTestFrameworkRunnableState<T extends
final OSProcessHandler handler = createHandler(executor);
for (ArgumentFileFilter filter : myArgumentFileFilters) {
consoleView.addMessageFilter(filter);
}
consoleView.attachToProcess(handler);
final AbstractTestProxy root = viewer.getRoot();
if (root instanceof TestProxyRoot) {
@@ -21,6 +21,7 @@ import com.intellij.diagnostic.logging.LogConfigurationPanel;
import com.intellij.execution.*;
import com.intellij.execution.configuration.EnvironmentVariablesComponent;
import com.intellij.execution.configurations.*;
import com.intellij.execution.filters.ArgumentFileFilter;
import com.intellij.execution.filters.TextConsoleBuilderFactory;
import com.intellij.execution.junit.RefactoringListeners;
import com.intellij.execution.process.KillableProcessHandler;
@@ -34,6 +35,7 @@ import com.intellij.openapi.options.SettingsEditorGroup;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.JdkUtil;
import com.intellij.openapi.projectRoots.ex.JavaSdkUtil;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.psi.PsiClass;
@@ -307,6 +309,16 @@ public class ApplicationConfiguration extends ModuleBasedConfiguration<JavaRunCo
return params;
}
@Override
protected GeneralCommandLine createCommandLine() throws ExecutionException {
GeneralCommandLine line = super.createCommandLine();
Map<String, String> content = line.getUserData(JdkUtil.COMMAND_LINE_CONTENT);
if (content != null) {
content.forEach((key, value) -> addConsoleFilters(new ArgumentFileFilter(key, value)));
}
return line;
}
@NotNull
@Override
protected OSProcessHandler startProcess() throws ExecutionException {
@@ -25,6 +25,7 @@ import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.util.io.JarUtil;
@@ -34,6 +35,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.util.PathUtil;
import com.intellij.util.PathsList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.execution.ParametersListUtil;
import com.intellij.util.lang.UrlClassLoader;
import gnu.trove.THashMap;
@@ -53,6 +55,8 @@ import java.util.jar.Manifest;
* @author max
*/
public class JdkUtil {
public static Key<Map<String, String>> COMMAND_LINE_CONTENT = Key.create("command.line.content");
/**
* The VM property is needed to workaround incorrect escaped URLs handling in WebSphere,
* see <a href="https://youtrack.jetbrains.com/issue/IDEA-126859#comment=27-778948">IDEA-126859</a> for additional details
@@ -250,6 +254,8 @@ public class JdkUtil {
}
}
commandLine.putUserData(COMMAND_LINE_CONTENT, ContainerUtil.stringMap(argFile.getAbsolutePath(), FileUtil.loadFile(argFile)));
appendEncoding(javaParameters, commandLine, vmParameters);
commandLine.addParameter("@" + argFile.getAbsolutePath());
@@ -325,12 +331,16 @@ public class JdkUtil {
}
File classpathFile = FileUtil.createTempFile("idea_classpath", null);
PathsList classPath = javaParameters.getClassPath();
try (PrintWriter writer = new PrintWriter(classpathFile)) {
for (String path : javaParameters.getClassPath().getPathList()) {
for (String path : classPath.getPathList()) {
writer.println(path);
}
}
Map<String, String> map = ContainerUtil.stringMap(classpathFile.getAbsolutePath(), classPath.getPathsString());
commandLine.putUserData(COMMAND_LINE_CONTENT, map);
Set<String> classpath = new LinkedHashSet<>();
classpath.add(PathUtil.getJarPathForClass(commandLineWrapper));
if (UrlClassLoader.class.getName().equals(vmParameters.getPropertyValue("java.system.class.loader"))) {
@@ -348,12 +358,14 @@ public class JdkUtil {
if (vmParamsFile != null) {
commandLine.addParameter("@vm_params");
commandLine.addParameter(vmParamsFile.getAbsolutePath());
map.put(vmParamsFile.getAbsolutePath(), FileUtil.loadFile(vmParamsFile));
OSProcessHandler.deleteFileOnTermination(commandLine, vmParamsFile);
}
if (appParamsFile != null) {
commandLine.addParameter("@app_params");
commandLine.addParameter(appParamsFile.getAbsolutePath());
map.put(appParamsFile.getAbsolutePath(), FileUtil.loadFile(appParamsFile));
OSProcessHandler.deleteFileOnTermination(commandLine, appParamsFile);
}
}
@@ -372,6 +384,7 @@ public class JdkUtil {
Manifest manifest = new Manifest();
manifest.getMainAttributes().putValue("Created-By", ApplicationNamesInfo.getInstance().getFullProductName());
String manifestText = "Manifest.MF";
if (dynamicVMOptions) {
List<String> properties = new ArrayList<>();
for (String param : vmParameters.getList()) {
@@ -383,6 +396,7 @@ public class JdkUtil {
}
}
manifest.getMainAttributes().putValue("VM-Options", ParametersListUtil.join(properties));
manifestText += "VM-Options: " + ParametersListUtil.join(properties) + "\n";
}
else {
commandLine.addParameters(vmParameters.getList());
@@ -392,12 +406,12 @@ public class JdkUtil {
if (dynamicParameters) {
manifest.getMainAttributes().putValue("Program-Parameters", ParametersListUtil.join(javaParameters.getProgramParametersList().getList()));
manifestText += "Program-Parameters: " + ParametersListUtil.join(javaParameters.getProgramParametersList().getList()) + "\n";
}
boolean notEscape = vmParameters.hasParameter(PROPERTY_DO_NOT_ESCAPE_CLASSPATH_URL);
List<String> classPathList = javaParameters.getClassPath().getPathList();
File classpathJarFile = CommandLineWrapperUtil.createClasspathJarFile(manifest, classPathList, notEscape);
PathsList path = javaParameters.getClassPath();
File classpathJarFile = CommandLineWrapperUtil.createClasspathJarFile(manifest, path.getPathList(), notEscape);
String jarFilePath = classpathJarFile.getAbsolutePath();
commandLine.addParameter("-classpath");
@@ -407,6 +421,8 @@ public class JdkUtil {
}
commandLine.addParameter(jarFilePath);
commandLine.putUserData(COMMAND_LINE_CONTENT, ContainerUtil.stringMap(jarFilePath, manifestText + "Class-Path: " + path.getPathsString()));
OSProcessHandler.deleteFileOnTermination(commandLine, classpathJarFile);
}
catch (IOException e) {
@@ -6,11 +6,17 @@ import java.io.File
/**
* A console filter which looks for a given path in an output and creates a link for viewing a content of that file.
*/
class ArgumentFileFilter : Filter {
class ArgumentFileFilter() : Filter {
@Volatile private var filePath: String? = null
@Volatile private var fileText: String? = null
private var triggered = false
constructor(filePath: String?, fileText: String?) : this() {
this.filePath = filePath
this.fileText = fileText
}
fun setPath(path: String) {
filePath = path
fileText = File(path).readText()