/* * Copyright 2003-2011 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.idea.core.facet; import com.intellij.facet.Facet; import com.intellij.facet.FacetType; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManager; import com.intellij.internal.statistic.UsageTrigger; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.startup.StartupManager; import jetbrains.mps.extapi.module.SRepositoryExt; import jetbrains.mps.ide.messages.MessagesViewTool; import jetbrains.mps.ide.project.ProjectHelper; import jetbrains.mps.idea.core.MPSBundle; import jetbrains.mps.idea.core.project.SolutionIdea; import jetbrains.mps.messages.MessageKind; import jetbrains.mps.project.Project; import jetbrains.mps.project.Solution; import jetbrains.mps.project.structure.modules.SolutionDescriptor; import jetbrains.mps.smodel.ModuleRepositoryFacade; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.module.SRepository; /** * evgeny, 10/26/11 */ public class MPSFacet extends Facet<MPSFacetConfiguration> { private static final Logger LOG = Logger.getInstance(MPSFacet.class); private Solution mySolution; private Project myMpsProject; public MPSFacet(@NotNull FacetType facetType, @NotNull Module module, @NotNull String name, @NotNull MPSFacetConfiguration configuration, Facet underlyingFacet) { super(facetType, module, name, configuration, underlyingFacet); configuration.setFacet(this); } @Override public void initFacet() { StartupManager.getInstance(getModule().getProject()).runWhenProjectIsInitialized(() -> { myMpsProject = ProjectHelper.fromIdeaProject(getModule().getProject()); myMpsProject.getModelAccess().runWriteAction(() -> { SolutionDescriptor solutionDescriptor = getConfiguration().getBean().getSolutionDescriptor(); Solution solution = new SolutionIdea(getModule(), solutionDescriptor); com.intellij.openapi.project.Project project = getModule().getProject(); SRepository repository = myMpsProject.getRepository(); if (new ModuleRepositoryFacade(repository).getModule(solutionDescriptor.getModuleReference()) != null) { MessagesViewTool.log(project, MessageKind.ERROR, MPSBundle.message("facet.cannot.load.second.module", solutionDescriptor.getNamespace())); return; } ((SRepositoryExt) repository).registerModule(mySolution = solution, myMpsProject); myMpsProject.addModule(mySolution); LOG.info(MPSBundle.message("facet.module.loaded", MPSFacet.this.mySolution.getModuleName())); IdeaPluginDescriptor descriptor = PluginManager.getPlugin(PluginManager.getPluginByClassName(MPSFacet.class.getName())); String version = descriptor == null ? null : descriptor.getVersion(); UsageTrigger.trigger("MPS.initFacet." + version); }); }); } @Override public void disposeFacet() { if (!wasInitialized()) { return; } SRepository repository = myMpsProject.getRepository(); repository.getModelAccess().runWriteAction(() -> { LOG.info(MPSBundle.message("facet.module.unloaded", mySolution.getModuleName())); if (!myMpsProject.isDisposed() && myMpsProject.getProjectModules().contains(mySolution)) { ((SRepositoryExt) repository).unregisterModule(mySolution, myMpsProject); } mySolution = null; }); } public boolean wasInitialized() { return mySolution != null; } // private List<ModelRoot> myContributedModelRoots = new ArrayList<ModelRoot>(); // public void contributeModelRoot(ModelRoot modelRoot) { // myContributedModelRoots.add(modelRoot); // } public void updateModels() { if (mySolution == null) return; mySolution.updateModelsSet(); } public void setConfiguration(final MPSConfigurationBean configurationBean) { if (!wasInitialized()) { return; } myMpsProject.getModelAccess().runWriteAction(() -> mySolution.setModuleDescriptor(configurationBean.getSolutionDescriptor())); } public Solution getSolution() { return mySolution; } }