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);
}
}
}
}
});
}
}