package jetbrains.mps.ide.java.newparser; /*Generated by MPS */ import org.jetbrains.mps.openapi.module.ModelAccess; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.messages.IMessageHandler; import java.util.List; import jetbrains.mps.smodel.loading.UpdateModeSupport; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.IVisitor; import jetbrains.mps.extapi.model.SModelData; import jetbrains.mps.extapi.model.SModelBase; import jetbrains.mps.messages.Message; import jetbrains.mps.messages.MessageKind; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; /*package*/ abstract class IncrementalModelAccessBase implements IncrementalModelAccess { protected final ModelAccess myModelAccess; private Iterable<SModel> myModels; private IMessageHandler myMessageHandler; public IncrementalModelAccessBase(ModelAccess modelAccess, Iterable<SModel> models, IMessageHandler messageHandler) { myModelAccess = modelAccess; myModels = models; myMessageHandler = messageHandler; } @Override public void accessModel(Runnable runnable) { myModelAccess.runReadAction(runnable); } @Override public void replaceReferences(Runnable runnable) { executeInUpdateMode(runnable); } protected void executeInUpdateMode(final Runnable runnable) { myModelAccess.runWriteAction(new Runnable() { public void run() { final List<UpdateModeSupport> modelsInUpdateMode = ListSequence.fromList(new ArrayList<UpdateModeSupport>()); try { // here we assume that runnable changes a lot of models, so we enter update mode for all of them Sequence.fromIterable(myModels).visitAll(new IVisitor<SModel>() { public void visit(SModel model) { SModelData modelData = ((SModelBase) model).getModelData(); if (modelData instanceof UpdateModeSupport) { ((UpdateModeSupport) modelData).enterUpdateMode(); ListSequence.fromList(modelsInUpdateMode).addElement((UpdateModeSupport) modelData); } else { // ignoring the model myMessageHandler.handle(new Message(MessageKind.ERROR, String.format("model %s doesn't support update mode which java import relies on", SModelOperations.getModelName(model)))); } } }); runnable.run(); } finally { ListSequence.fromList(modelsInUpdateMode).visitAll(new IVisitor<UpdateModeSupport>() { public void visit(UpdateModeSupport it) { it.leaveUpdateMode(); } }); } } }); } }