package com.atsebak.embeddedlinuxjvm.commandline; import com.atsebak.embeddedlinuxjvm.runner.conf.EmbeddedLinuxJVMRunConfiguration; import com.intellij.execution.configurations.JavaParameters; import lombok.Builder; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.Map; @Builder public class CommandLineTarget { private final JavaParameters parameters; private final EmbeddedLinuxJVMRunConfiguration embeddedLinuxJVMRunConfiguration; private final boolean isDebugging; /** * Builds the command line command to invoke the java from the target machine * * @return */ @Override public String toString() { StringBuilder cmdBuf = new StringBuilder(); addRunAsRootOption(cmdBuf); addEnvironmentVariables(cmdBuf); cmdBuf.append(" java "); addVMArguments(cmdBuf); addClasspath(cmdBuf); addMainType(cmdBuf); addArguments(cmdBuf); return cmdBuf.toString().replaceAll("\\s{2,}", " ").trim(); } /** * Adds Main class * * @param cmdBuf */ private void addMainType(@NotNull StringBuilder cmdBuf) { cmdBuf.append(" ").append(parameters.getMainClass()).append(" "); } /** * Adds the classpath to java app * * @param cmdBuf */ private void addClasspath(@NotNull StringBuilder cmdBuf) { cmdBuf.append(" -cp classes:lib/'*' "); } /** * Adds Virtual Machine Arguments * @param cmdBuf */ private void addVMArguments(@NotNull StringBuilder cmdBuf) { if (isDebugging) { //debugging with the port this is added on the remote device command line cmdBuf.append("-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=" + embeddedLinuxJVMRunConfiguration.getRunnerParameters().getPort()); } for (String arg : parameters.getVMParametersList().getParameters()) { //todo see if devs need the java agent support because for now this is a quick fix that might not be the proper way if (!arg.contains("transport=dt_socket") && !arg.contains("javaagent") && StringUtils.isNotBlank(arg) && !parameters.getProgramParametersList().getParameters().equals(parameters.getVMParametersList().getParameters())) { cmdBuf.append(' ').append(arg.trim()); } } } /** * Adds debug options * @param cmdBuf */ private void addArguments(@NotNull StringBuilder cmdBuf) { if (!parameters.getProgramParametersList().getParameters().isEmpty()) { for (String arg : parameters.getProgramParametersList().getParameters()) { cmdBuf.append(' ').append(arg.trim()); } } } /** * Adds Environment Variables * * @param cmdBuf */ private void addEnvironmentVariables(@NotNull StringBuilder cmdBuf) { cmdBuf.append(" "); for (Map.Entry<String, String> entry : parameters.getEnv().entrySet()) { String value = entry.getValue().replaceAll("\"", "\\\""); cmdBuf.append(entry.getKey()).append("=\"").append(value).append("\" "); } cmdBuf.append(" "); } /** * Adds the sudo user to command * @param cmdBuf */ private void addRunAsRootOption(@NotNull StringBuilder cmdBuf) { if (embeddedLinuxJVMRunConfiguration.getRunnerParameters().isRunAsRoot()) { cmdBuf.append(" sudo "); } } }