/* * Copyright 2003-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.smodel; /** * This class represents a ModelAccess for cases when there is no available project in scope. * Therefore it lacks of some functionality: it does not support command execution. * * To run project-aware command use {@link jetbrains.mps.project.ProjectModelAccess} which is available * through {@link jetbrains.mps.project.Project#getModelAccess()}. * * @see jetbrains.mps.project.ProjectModelAccess * @see jetbrains.mps.smodel.MPSModuleRepository * Created by Alex Pyshkin on 9/1/14. */ public class GlobalModelAccess extends ModelAccessBase { @Override public void executeCommand(Runnable r) { throwCommandIsNotSupported(); } @Override public void executeCommandInEDT(Runnable r) { throwCommandIsNotSupported(); } @Override public void executeUndoTransparentCommand(Runnable r) { throwCommandIsNotSupported(); } @Override public boolean isCommandAction() { /** AP: * FIXME: * must return false, because this implementation of ModelAccess does not support commands. * The problem is that user can run commands through the class {@link jetbrains.mps.smodel.ModelAccess}, so * we have to delegate here. * * Only when the {@link jetbrains.mps.smodel.ModelAccess} is gone we can change it to * {@code return false;}. */ return ModelAccess.instance().isInsideCommand(); } private void throwCommandIsNotSupported() throws UnsupportedOperationException{ /** AT: * FIXME: CommandProcessor tolerates null project, why don't we support commands from this ModelAccessor? * e.g. there are actions that run without a project (like New Project action), and they could benefit from * same command execution approach. OTOH, this might be defect in the actions, as most actions that run without * project have executeOutsideCommand = true. This is not true for some vcs commands, though, the question is whether * it's legitimate to execute commands when there's no project (even though CommandProcessor allows that). */ throw new UnsupportedOperationException("GlobalModelAccess does not support actions which require a command to run." + " One needs a project to run such actions (@see ProjectModelAccess)."); } }