package com.github.masahirosuzuka.PhoneGapIntelliJPlugin.commandLine; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.configurations.PathEnvironmentVariableUtil; import com.intellij.execution.process.ProcessOutput; import com.intellij.execution.util.ExecUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.List; import static com.github.masahirosuzuka.PhoneGapIntelliJPlugin.commandLine.PhoneGapCommandLine.COMMAND_EMULATE; import static com.github.masahirosuzuka.PhoneGapIntelliJPlugin.commandLine.PhoneGapCommandLine.COMMAND_RUN; import static com.github.masahirosuzuka.PhoneGapIntelliJPlugin.runner.ui.PhoneGapRunConfigurationEditor.PLATFORM_ANDROID; import static com.github.masahirosuzuka.PhoneGapIntelliJPlugin.runner.ui.PhoneGapRunConfigurationEditor.PLATFORM_IOS; public abstract class PhoneGapTargets { private static Logger LOGGER = Logger.getInstance(PhoneGapTargets.class); @Nullable public static PhoneGapTargets createTargetsList(@NotNull Project project, @Nullable String platform) { if (PLATFORM_ANDROID.equals(platform)) { return new PhoneGapAndroidTargets(project); } if (PLATFORM_IOS.equals(platform)) { return new PhoneGapIosTargets(project); } return null; } @NotNull public static List<String> listTargets(@Nullable PhoneGapTargets phoneGapTargets, @Nullable String command) { if (phoneGapTargets == null) return ContainerUtil.emptyList(); if (COMMAND_EMULATE.equals(command)) { return phoneGapTargets.listVirtualDevices(); } if (COMMAND_RUN.equals(command)) { return phoneGapTargets.listDevices(); } return ContainerUtil.emptyList(); } @NotNull protected final Project myProject; private final NotNullLazyValue<List<String>> myVirtualDevices = new NotNullLazyValue<List<String>>() { @NotNull @Override protected List<String> compute() { return listVirtualDevicesNonCached(); } }; private final NotNullLazyValue<List<String>> myDevices = new NotNullLazyValue<List<String>>() { @NotNull @Override protected List<String> compute() { return listDevicesNonCached(); } }; public PhoneGapTargets(@NotNull Project project) { myProject = project; } @NotNull public List<String> listDevices() { return myDevices.getValue(); } @NotNull public List<String> listVirtualDevices() { return myVirtualDevices.getValue(); } @NotNull protected abstract List<String> listDevicesNonCached(); @NotNull protected abstract List<String> listVirtualDevicesNonCached(); protected List<String> list(String executableName, Function<String, String> parser, boolean errorOut, String... params) { List<String> result = ContainerUtil.newArrayList(); File deployExecutable = PathEnvironmentVariableUtil.findInPath(executableName); if (deployExecutable == null) return result; try { GeneralCommandLine line = new GeneralCommandLine(deployExecutable.getAbsolutePath()); line.addParameters(params); ProcessOutput output = ExecUtil.execAndGetOutput(line); List<String> lines = null; if (errorOut) { if (!StringUtil.isEmpty(output.getStderr())) { lines = output.getStderrLines(); } } if (lines == null) { lines = output.getStdoutLines(); } if (output.getExitCode() != 0) return result; for (String value : lines) { ContainerUtil.addIfNotNull(result, parser.fun(value)); } } catch (ExecutionException e) { LOGGER.debug(e.getMessage(), e); } return result; } @NotNull public abstract String platform(); }