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 org.jetbrains.mps.openapi.persistence.ModelFactory; import jetbrains.mps.extapi.persistence.ModelFactoryService; import jetbrains.mps.persistence.PreinstalledModelFactoryTypes; 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 jetbrains.mps.extapi.persistence.FileBasedModelRoot; import org.jetbrains.annotations.NotNull; import jetbrains.mps.project.MPSProject; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.vfs.IFile; import org.jetbrains.mps.openapi.persistence.ModelRoot; import jetbrains.mps.persistence.PersistenceUtil; import org.apache.log4j.Level; import org.jetbrains.mps.openapi.persistence.DataSource; import jetbrains.mps.persistence.DataSourceFactoryBridge; import org.jetbrains.mps.openapi.module.SModule; import java.io.IOException; import jetbrains.mps.extapi.module.SModuleBase; import jetbrains.mps.extapi.model.SModelBase; import jetbrains.mps.project.AbstractModule; import jetbrains.mps.persistence.ModelCannotBeCreatedException; import org.jetbrains.mps.openapi.persistence.ModelSaveException; public class ConvertToFilePerRootPersistence_Action extends BaseAction { private static final Logger LOG = LogManager.getLogger(ConvertToFilePerRootPersistence_Action.class); private static final Icon ICON = null; public ConvertToFilePerRootPersistence_Action() { super("Convert to File-Per-Root 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) { ModelFactory filePerRootFactory = ModelFactoryService.getInstance().getFactoryByType(PreinstalledModelFactoryTypes.PER_ROOT_XML); if (filePerRootFactory == null) { return false; } List<SModel> m = ((List<SModel>) MapSequence.fromMap(_params).get("models")); return ListSequence.fromList(m).all(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return !(it.isReadOnly()) && it.getSource() instanceof FileDataSource && it.getModelRoot() instanceof FileBasedModelRoot; } }); } @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(); 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(); ModelRoot modelRoot = smodel.getModelRoot(); if (!(modelRoot instanceof FileBasedModelRoot)) { continue; } 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; } try { DataSource newDataSource = new DataSourceFactoryBridge((FileBasedModelRoot) modelRoot).createPerRootDataSource(newModel.getName(), null).getDataSource(); SModule module = smodel.getModule(); ModelFactory filePerRootFactory = ModelFactoryService.getInstance().getFactoryByType(PreinstalledModelFactoryTypes.PER_ROOT_XML); if (filePerRootFactory == null) { throw new IOException("Could not find any per-root persistence model factory"); } filePerRootFactory.save(newModel, newDataSource); 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 (ModelCannotBeCreatedException 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); } } } } }); } }