package jetbrains.mps.migration.component.plugin;
/*Generated by MPS */
import jetbrains.mps.workbench.action.BaseAction;
import jetbrains.mps.lang.migration.runtime.base.MigrationScript;
import jetbrains.mps.project.MPSProject;
import com.intellij.openapi.actionSystem.AnActionEvent;
import java.util.Map;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.migration.component.util.MigrationsUtil;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.progress.ProgressIndicator;
import jetbrains.mps.progress.ProgressMonitorAdapter;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import com.intellij.util.WaitForProgressToShow;
public class RunMigration extends BaseAction {
private MigrationScript myScript;
private MPSProject myProject;
public RunMigration(MigrationScript script) {
this.myScript = script;
this.setExecuteOutsideCommand(true);
getTemplatePresentation().setText(myScript.getCaption());
}
@Override
protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) {
if (!((super.collectActionData(event, _params)))) {
return false;
}
myProject = event.getData(MPSCommonDataKeys.MPS_PROJECT);
return myProject != null;
}
@Override
public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) {
final List<SModule>[] modules = new List[1];
myProject.getRepository().getModelAccess().runReadAction(new Runnable() {
public void run() {
modules[0] = Sequence.fromIterable(MigrationsUtil.getMigrateableModulesFromProject(myProject)).toListSequence();
}
});
ProgressManager.getInstance().run(new Task.Modal(myProject.getProject(), "Run Migration", true) {
public void run(@NotNull ProgressIndicator progressIndicator) {
ProgressMonitorAdapter progressMonitor = new ProgressMonitorAdapter(progressIndicator);
int steps = modules[0].size();
progressMonitor.start(myScript.getCaption(), steps);
for (final SModule module : ListSequence.fromList(modules[0])) {
progressMonitor.step(module.getModuleName());
WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(new Runnable() {
public void run() {
RunMigration.this.myProject.getRepository().getModelAccess().executeCommand(new Runnable() {
public void run() {
myScript.execute(module);
}
});
}
});
progressMonitor.advance(1);
if (progressMonitor.isCanceled()) {
break;
}
}
}
});
}
}