/* * Copyright 2003-2015 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.ide.findusages.model.scopes; import jetbrains.mps.ide.findusages.CantLoadSomethingException; import jetbrains.mps.ide.findusages.CantSaveSomethingException; import jetbrains.mps.project.Project; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.module.SModule; import org.jetbrains.mps.openapi.module.SRepository; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import java.util.ArrayList; import java.util.Arrays; import java.util.List; // FIXME likely we don't need distinct ModulesScope and ModelsScope, everything shall be part of FindUsagesScope public class ModelsScope extends FindUsagesScope { private static final String MODEL_ID = "ref"; private static final String MODEL_TAG = "model"; public ModelsScope(@NotNull Iterable<? extends SModel> models) { for (SModel model : models) { if (model != null) { addModel(model); } } } public ModelsScope(SModel... models) { this(Arrays.asList(models)); } public ModelsScope(Element element, Project project) throws CantLoadSomethingException { this(resolveModels(element, project.getRepository())); } @NotNull @Override public Iterable<SModule> getModules() { // FIXME shall return modules of the models it was initialized with // we've already collected required modules in the superclass, and it's safe to return scope here as nobody has been using this method anyway throw new UnsupportedOperationException(); } private static List<SModel> resolveModels(Element element, SRepository repo) throws CantLoadSomethingException { List<SModel> result = new ArrayList<SModel>(); final Logger log = LogManager.getLogger(ModelsScope.class); for (Element modelXml : element.getChildren(MODEL_TAG)) { try { final String modelRef = modelXml.getAttributeValue(MODEL_ID); if (modelRef == null) { continue; } SModelReference mr = PersistenceFacade.getInstance().createModelReference(modelRef); final SModel model = mr.resolve(repo); if (model != null) { result.add(model); } else { log.warn("model not found " + modelRef); } } catch (IllegalArgumentException e) { throw new CantLoadSomethingException(e); } } return result; } @Override public void write(Element element, Project project) throws CantSaveSomethingException { for (SModel model : myModels) { Element modelXml = new Element(MODEL_TAG); modelXml.setAttribute(MODEL_ID, PersistenceFacade.getInstance().asString(model.getReference())); element.addContent(modelXml); } } public String toString() { return "model scope"; } }