package jetbrains.mps.vcs.plugin;
/*Generated by MPS */
import jetbrains.mps.workbench.action.BaseAction;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import javax.swing.Icon;
import com.intellij.openapi.actionSystem.AnActionEvent;
import java.util.Map;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileChooser.FileChooser;
import jetbrains.mps.vcs.platform.util.MergeBackupUtil;
import java.io.File;
import jetbrains.mps.vcs.util.MergeVersion;
import jetbrains.mps.project.MPSExtentions;
import jetbrains.mps.ide.vfs.VirtualFileUtils;
import java.util.List;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import com.intellij.diff.merge.MergeRequest;
import com.intellij.diff.DiffRequestFactory;
import jetbrains.mps.fileTypes.MPSFileTypeFactory;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.diff.DiffManager;
import com.intellij.diff.InvalidDiffRequestException;
import org.apache.log4j.Level;
public class TestMergeAction_Action extends BaseAction {
private static final Logger LOG = LogManager.getLogger(TestMergeAction_Action.class);
private static final Icon ICON = null;
public TestMergeAction_Action() {
super("Merge test data from ZIP", "", ICON);
this.setIsAlwaysVisible(false);
this.setExecuteOutsideCommand(true);
}
@Override
public boolean isDumbAware() {
return true;
}
@Override
protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) {
if (!(super.collectActionData(event, _params))) {
return false;
}
{
Project p = event.getData(CommonDataKeys.PROJECT);
MapSequence.fromMap(_params).put("project", p);
if (p == null) {
return false;
}
}
{
MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT);
MapSequence.fromMap(_params).put("mpsProject", p);
if (p == null) {
return false;
}
}
return true;
}
@Override
public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) {
final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, true, true, false, false) {
@Override
public boolean isFileSelectable(VirtualFile file) {
return !((file.isDirectory())) && file.getName().toLowerCase().endsWith(".zip");
}
};
descriptor.setTitle("select archive with merge files");
descriptor.setDescription("Zip files (*.zip) ");
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
VirtualFile vFile = FileChooser.chooseFile(descriptor, ((Project) MapSequence.fromMap(_params).get("project")), null);
final String resFilePath;
String[] zipped;
try {
zipped = MergeBackupUtil.loadZippedModelsAsText(new File(vFile.getCanonicalPath()), new MergeVersion[]{MergeVersion.BASE, MergeVersion.MINE, MergeVersion.REPOSITORY});
resFilePath = File.createTempFile("mpstmp", MPSExtentions.DOT_MODEL).getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
return;
}
VirtualFile resFile = VirtualFileUtils.getVirtualFile(resFilePath);
List<String> contents = ListSequence.fromListAndArray(new ArrayList<String>(), zipped);
List<String> titles = ListSequence.fromListAndArray(new ArrayList<String>(), "Local Version", "Merge Result", "Remote Version");
try {
MergeRequest request = DiffRequestFactory.getInstance().createMergeRequest(((Project) MapSequence.fromMap(_params).get("project")), MPSFileTypeFactory.MPS_FILE_TYPE, FileDocumentManager.getInstance().getDocument(resFile), contents, "Merge files from " + vFile + " and save result to " + resFilePath, titles, null);
DiffManager.getInstance().showMerge(((Project) MapSequence.fromMap(_params).get("project")), request);
} catch (InvalidDiffRequestException e) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("", e);
}
}
}
});
}
}