package com.intellij.lang.javascript.flex.debug;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.configurations.RuntimeConfigurationError;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.flex.model.bc.TargetPlatform;
import com.intellij.lang.javascript.flex.FlexBundle;
import com.intellij.lang.javascript.flex.actions.airpackage.AirPackageUtil;
import com.intellij.lang.javascript.flex.actions.airpackage.DeviceInfo;
import com.intellij.lang.javascript.flex.flexunit.FlexUnitRunConfiguration;
import com.intellij.lang.javascript.flex.flexunit.FlexUnitRunnerParameters;
import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfiguration;
import com.intellij.lang.javascript.flex.run.FlashRunConfiguration;
import com.intellij.lang.javascript.flex.run.FlashRunnerParameters;
import com.intellij.lang.javascript.flex.run.FlexBaseRunner;
import com.intellij.lang.javascript.flex.run.RemoteFlashRunConfiguration;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import static com.intellij.lang.javascript.flex.run.FlashRunnerParameters.AirMobileDebugTransport;
public class FlexDebugRunner extends FlexBaseRunner {
public boolean canRun(@NotNull final String executorId, @NotNull final RunProfile profile) {
return DefaultDebugExecutor.EXECUTOR_ID.equals(executorId) &&
(profile instanceof FlashRunConfiguration ||
profile instanceof FlexUnitRunConfiguration ||
profile instanceof RemoteFlashRunConfiguration);
}
@NotNull
public String getRunnerId() {
return "FlexDebugRunner";
}
protected RunContentDescriptor launchWebFlexUnit(final Project project,
final RunContentDescriptor contentToReuse,
final ExecutionEnvironment env,
final FlexUnitRunnerParameters params,
final String swfFilePath) throws ExecutionException {
try {
final Pair<Module, FlexBuildConfiguration> moduleAndBC = params.checkAndGetModuleAndBC(project);
return launchDebugProcess(moduleAndBC.first, moduleAndBC.second, params, env);
}
catch (RuntimeConfigurationError e) {
throw new ExecutionException(e.getMessage());
}
}
protected RunContentDescriptor launchAirFlexUnit(final Project project,
final RunProfileState state,
final RunContentDescriptor contentToReuse,
final ExecutionEnvironment env,
final FlexUnitRunnerParameters params) throws ExecutionException {
try {
final Pair<Module, FlexBuildConfiguration> moduleAndBC = params.checkAndGetModuleAndBC(project);
return launchDebugProcess(moduleAndBC.first, moduleAndBC.second, params, env);
}
catch (RuntimeConfigurationError e) {
throw new ExecutionException(e.getMessage());
}
}
protected RunContentDescriptor launchFlexConfig(final Module module,
final FlexBuildConfiguration bc,
final FlashRunnerParameters runnerParameters,
final RunProfileState state,
final RunContentDescriptor contentToReuse,
final ExecutionEnvironment env) throws ExecutionException {
final Project project = module.getProject();
if (bc.getTargetPlatform() == TargetPlatform.Mobile) {
final Sdk sdk = bc.getSdk();
switch (runnerParameters.getMobileRunTarget()) {
case Emulator:
break;
case AndroidDevice:
final String androidDescriptorPath = getAirDescriptorPath(bc, bc.getAndroidPackagingOptions());
final String androidAppId = getApplicationId(androidDescriptorPath);
if (androidAppId == null) {
Messages.showErrorDialog(project,
FlexBundle.message("failed.to.read.app.id", FileUtil.toSystemDependentName(androidDescriptorPath)),
FlexBundle.message("error.title"));
return null;
}
if (!packAndInstallToAndroidDevice(module, bc, runnerParameters, androidAppId, true)) {
return null;
}
if (runnerParameters.getDebugTransport() == AirMobileDebugTransport.USB) {
if (!AirPackageUtil.androidForwardTcpPort(project, sdk, runnerParameters.getDeviceInfo(), runnerParameters.getUsbDebugPort())) {
return null;
}
}
break;
case iOSSimulator:
final String adtVersionSimulator = AirPackageUtil.getAdtVersion(module.getProject(), bc.getSdk());
final String iosSimulatorDescriptorPath = getAirDescriptorPath(bc, bc.getIosPackagingOptions());
final String iosSimulatorAppId = getApplicationId(iosSimulatorDescriptorPath);
if (iosSimulatorAppId == null) {
Messages.showErrorDialog(project, FlexBundle.message("failed.to.read.app.id",
FileUtil.toSystemDependentName(iosSimulatorDescriptorPath)),
FlexBundle.message("error.title"));
return null;
}
if (!packAndInstallToIOSSimulator(module, bc, runnerParameters, adtVersionSimulator, iosSimulatorAppId, true)) {
return null;
}
break;
case iOSDevice:
final String adtVersion = AirPackageUtil.getAdtVersion(module.getProject(), bc.getSdk());
if (StringUtil.compareVersionNumbers(adtVersion, "3.4") >= 0) {
if (!packAndInstallToIOSDevice(module, bc, runnerParameters, adtVersion, true)) {
return null;
}
if (runnerParameters.getDebugTransport() == AirMobileDebugTransport.USB) {
final DeviceInfo device = runnerParameters.getDeviceInfo();
final int deviceHandle = device == null ? -1 : device.IOS_HANDLE;
if (deviceHandle < 0) {
return null;
}
if (!AirPackageUtil.iosForwardTcpPort(project, sdk, runnerParameters.getUsbDebugPort(), deviceHandle)) {
return null;
}
}
}
else {
if (!AirPackageUtil.packageIpaForDevice(module, bc, runnerParameters, adtVersion, true)) {
return null;
}
}
break;
}
}
return launchDebugProcess(module, bc, runnerParameters, env);
}
}