package com.github.masahirosuzuka.PhoneGapIntelliJPlugin.runner;
import com.github.masahirosuzuka.PhoneGapIntelliJPlugin.PhoneGapBundle;
import com.github.masahirosuzuka.PhoneGapIntelliJPlugin.commandLine.PhoneGapCommandLine;
import com.intellij.execution.BeforeRunTask;
import com.intellij.execution.BeforeRunTaskProvider;
import com.intellij.execution.ExecutionHelper;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.process.ProcessOutput;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.util.concurrency.Semaphore;
import com.intellij.util.containers.ContainerUtil;
import icons.PhoneGapIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class PhoneGapAddPlatformBeforeRun extends BeforeRunTaskProvider<PhoneGapAddPlatformBeforeRun.PhoneGapAddPlatformTask> {
public static final Key<PhoneGapAddPlatformTask> ID = Key.create("PhonegapTask");
@Override
public Key<PhoneGapAddPlatformTask> getId() {
return ID;
}
@Override
public String getName() {
return PhoneGapBundle.message("phonegap.before.task.init.title");
}
@Override
public String getDescription(PhoneGapAddPlatformTask task) {
return PhoneGapBundle.message("phonegap.before.task.init.title");
}
@Override
public boolean isConfigurable() {
return false;
}
@Override
public Icon getIcon() {
return PhoneGapIcons.PhonegapIntegration;
}
@Nullable
@Override
public PhoneGapAddPlatformTask createTask(@NotNull RunConfiguration runConfiguration) {
return runConfiguration instanceof PhoneGapRunConfiguration ? new PhoneGapAddPlatformTask(ID) : null;
}
@Override
public boolean configureTask(RunConfiguration runConfiguration, PhoneGapAddPlatformTask task) {
return false;
}
@Override
public boolean canExecuteTask(RunConfiguration configuration, PhoneGapAddPlatformTask task) {
return configuration instanceof PhoneGapRunConfiguration;
}
@Override
public boolean executeTask(DataContext context,
final RunConfiguration configuration,
ExecutionEnvironment env,
PhoneGapAddPlatformTask task) {
final PhoneGapRunConfiguration phoneGapRunConfiguration = (PhoneGapRunConfiguration)configuration;
final PhoneGapCommandLine line = phoneGapRunConfiguration.getCommandLine();
if (!line.needAddPlatform()) {
return true;
}
final Project project = configuration.getProject();
final Semaphore targetDone = new Semaphore();
final Ref<Boolean> result = new Ref<>(true);
final List<Exception> exceptions = new ArrayList<>();
ApplicationManager.getApplication().invokeAndWait(() -> {
//Save all opened documents
FileDocumentManager.getInstance().saveAllDocuments();
targetDone.down();
new Task.Backgroundable(project, PhoneGapBundle.message("phonegap.before.task.init.title"), true) {
public boolean shouldStartInBackground() {
return true;
}
public void run(@NotNull final ProgressIndicator indicator) {
try {
String platform = phoneGapRunConfiguration.getPlatform();
assert platform != null;
ProcessOutput output = line.platformAdd(platform);
if (output.getExitCode() != 0) {
ExecutionHelper.showOutput(project, output, PhoneGapBundle.message("phonegap.before.task.init.title"), null, true);
result.set(false);
}
}
catch (final Exception e) {
exceptions.add(e);
result.set(false);
}
finally {
targetDone.up();
}
}
}.queue();
}, ModalityState.NON_MODAL);
if (!targetDone.waitFor(TimeUnit.MINUTES.toMillis(2))) {
ExecutionHelper
.showErrors(project, ContainerUtil.createMaybeSingletonList(new RuntimeException("Timeout")),
PhoneGapBundle.message("phonegap.before.task.init.error"), null);
}
else if (!exceptions.isEmpty()) {
ExecutionHelper.showErrors(project, exceptions, PhoneGapBundle.message("phonegap.before.task.init.error"), null);
}
return result.get();
}
public static class PhoneGapAddPlatformTask extends BeforeRunTask<PhoneGapAddPlatformTask> {
protected PhoneGapAddPlatformTask(@NotNull Key<PhoneGapAddPlatformTask> providerId) {
super(providerId);
setEnabled(true);
}
}
}