package jetbrains.mps.ide.actions; /*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 java.util.List; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.MapSequence; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.extapi.persistence.FileDataSource; import org.jetbrains.annotations.NotNull; import jetbrains.mps.project.MPSProject; import org.jetbrains.mps.openapi.module.SRepository; import org.jetbrains.mps.openapi.persistence.ModelFactory; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import jetbrains.mps.project.MPSExtentions; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.vfs.IFile; import jetbrains.mps.persistence.PersistenceUtil; import org.apache.log4j.Level; import jetbrains.mps.util.FileUtil; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.extapi.module.SModuleBase; import jetbrains.mps.extapi.model.SModelBase; import jetbrains.mps.project.AbstractModule; import java.io.IOException; import org.jetbrains.mps.openapi.persistence.ModelSaveException; public class ConvertToBinaryPersistence_Action extends BaseAction { private static final Logger LOG = LogManager.getLogger(ConvertToBinaryPersistence_Action.class); private static final Icon ICON = null; public ConvertToBinaryPersistence_Action() { super("Convert to binary format", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(true); } @Override public boolean isDumbAware() { return true; } @Override public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) { List<SModel> m = ((List<SModel>) MapSequence.fromMap(_params).get("models")); return ListSequence.fromList(m).any(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return !(it.isReadOnly()) && it.getSource() instanceof FileDataSource; } }); } @Override public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) { this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params)); } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { List<SModel> p = event.getData(MPSCommonDataKeys.MODELS); MapSequence.fromMap(_params).put("models", p); if (p == null) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); MapSequence.fromMap(_params).put("project", p); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { List<SModel> m = ((List<SModel>) MapSequence.fromMap(_params).get("models")); final Iterable<SModel> seq = ListSequence.fromList(m).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return !(it.isReadOnly()) && it.getSource() instanceof FileDataSource; } }); final SRepository repo = ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository(); final ModelFactory binaryFactory = PersistenceFacade.getInstance().getModelFactory(MPSExtentions.MODEL_BINARY); repo.getModelAccess().runWriteAction(new Runnable() { public void run() { // see MPS-18743 repo.saveAll(); for (SModel smodel : Sequence.fromIterable(seq)) { IFile oldFile = ((FileDataSource) smodel.getSource()).getFile(); SModel newModel = PersistenceUtil.loadModel(oldFile); if (newModel == null) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("cannot read " + smodel); } continue; } Iterable<SModel.Problem> problems = Sequence.fromIterable(((Iterable<SModel.Problem>) newModel.getProblems())).where(new IWhereFilter<SModel.Problem>() { public boolean accept(SModel.Problem it) { return it.isError(); } }); if (Sequence.fromIterable(problems).isNotEmpty()) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("cannot read " + smodel + ": " + Sequence.fromIterable(problems).first().getText()); } continue; } IFile newFile = oldFile.getParent().getDescendant(FileUtil.getNameWithoutExtension(oldFile.getName()) + "." + MPSExtentions.MODEL_BINARY); SModule module = smodel.getModule(); try { binaryFactory.save(newModel, new FileDataSource(newFile)); if (module != null) { ((SModuleBase) module).unregisterModel((SModelBase) smodel); } oldFile.delete(); ((AbstractModule) module).updateModelsSet(); } catch (IOException ex) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("cannot write " + smodel, ex); } } catch (ModelSaveException ex) { // shouldn't happen if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("cannot write " + smodel, ex); } } } } }); } }