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 jetbrains.mps.project.MPSProject;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.module.SModule;
import java.util.List;
import org.jetbrains.mps.openapi.model.EditableSModel;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.smodel.SModelStereotype;
import jetbrains.mps.project.AbstractModule;
import jetbrains.mps.smodel.Generator;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import org.apache.log4j.Level;
public class ForcedSaveAll_Action extends BaseAction {
private static final Logger LOG = LogManager.getLogger(ForcedSaveAll_Action.class);
private static final Icon ICON = null;
public ForcedSaveAll_Action() {
super("Re-save all models from project", "Re-save all models even if model was not changed", ICON);
this.setIsAlwaysVisible(false);
this.setExecuteOutsideCommand(false);
}
@Override
public boolean isDumbAware() {
return true;
}
@Override
protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) {
if (!(super.collectActionData(event, _params))) {
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) {
Iterable<SModule> modules = (Iterable<SModule>) ((MPSProject) MapSequence.fromMap(_params).get("project")).getProjectModulesWithGenerators();
List<EditableSModel> allModels = Sequence.fromIterable(modules).translate(new ITranslator2<SModule, SModel>() {
public Iterable<SModel> translate(SModule it) {
return it.getModels();
}
}).ofType(EditableSModel.class).where(new IWhereFilter<EditableSModel>() {
public boolean accept(EditableSModel it) {
return SModelStereotype.isUserModel(it);
}
}).toListSequence();
for (AbstractModule module : Sequence.fromIterable(modules).ofType(AbstractModule.class)) {
module.updateExternalReferences();
if (!(module instanceof Generator)) {
// generators are saved as part of owning Language's save, no need to do it twice
module.save();
}
}
for (EditableSModel model : ListSequence.fromList(allModels)) {
if (model.isReadOnly()) {
continue;
}
try {
// ensure model is loaded
model.load();
// and force to save model
model.setChanged(true);
if (model.isChanged()) {
model.save();
}
} catch (Exception ex) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Error re-saving model " + model.getName(), ex);
}
}
}
}
}