/*
* Copyright (c) 2013-2016 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.process.javap;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.adoptopenjdk.jitwatch.process.AbstractProcess;
public class JavapProcess extends AbstractProcess
{
private Path executablePath;
private final String EXECUTABLE_NAME = "javap" + getExecutableSuffix();
public JavapProcess(Path executablePath)
{
this.executablePath = executablePath;
}
public JavapProcess() throws FileNotFoundException
{
super();
Path javaHome = Paths.get(System.getProperty("java.home"));
executablePath = Paths.get(javaHome.toString(), "..", "bin", EXECUTABLE_NAME);
if (!executablePath.toFile().exists())
{
executablePath = Paths.get(javaHome.toString(), "bin", EXECUTABLE_NAME);
if (!executablePath.toFile().exists())
{
throw new FileNotFoundException("Could not find " + EXECUTABLE_NAME);
}
}
executablePath = executablePath.normalize();
}
private List<String> getJavapCommands(Collection<String> classLocations, String fqClassName)
{
String[] args;
if (classLocations == null || classLocations.isEmpty())
{
args = new String[] { "-c", "-p", "-v", fqClassName };
}
else
{
StringBuilder classPathBuilder = new StringBuilder();
for (String cp : classLocations)
{
classPathBuilder.append(cp).append(File.pathSeparatorChar);
}
classPathBuilder.deleteCharAt(classPathBuilder.length() - 1);
args = new String[] { "-c", "-p", "-v", "-classpath", classPathBuilder.toString(), fqClassName };
}
List<String> commands = new ArrayList<>();
commands.add(executablePath.toString());
commands.addAll(Arrays.asList(args));
return commands;
}
public boolean execute(Collection<String> classLocations, String fqClassName)
throws IOException
{
List<String> commands = getJavapCommands(classLocations, fqClassName);
return runCommands(commands, null);
}
}