/* * Copyright 2003-2017 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.core.platform; import jetbrains.mps.cache.CachesManager; import jetbrains.mps.classloading.ClassLoaderManager; import jetbrains.mps.cleanup.CleanupManager; import jetbrains.mps.components.ComponentPlugin; import jetbrains.mps.extapi.module.FacetsRegistry; import jetbrains.mps.extapi.module.SRepositoryRegistry; import jetbrains.mps.extapi.persistence.ModelFactoryRegistry; import jetbrains.mps.extapi.persistence.ModelFactoryService; import jetbrains.mps.languageScope.LanguageScopeFactory; import jetbrains.mps.library.LibraryInitializer; import jetbrains.mps.persistence.PersistenceRegistry; import jetbrains.mps.project.GlobalScope; import jetbrains.mps.project.PathMacros; import jetbrains.mps.project.structure.DescriptorModelComponent; import jetbrains.mps.project.structure.GeneratorDescriptorModelProvider; import jetbrains.mps.project.structure.LanguageDescriptorModelProvider; import jetbrains.mps.project.structure.ProjectStructureModule; import jetbrains.mps.resolve.ResolverComponent; import jetbrains.mps.smodel.ConceptDescendantsCache; import jetbrains.mps.smodel.DebugRegistry; import jetbrains.mps.smodel.GlobalSModelEventsManager; import jetbrains.mps.smodel.MPSModuleRepository; import jetbrains.mps.smodel.ModuleFileTracker; import jetbrains.mps.smodel.ModuleRepositoryFacade; import jetbrains.mps.smodel.PropertySupport.PropertySupportCache; import jetbrains.mps.smodel.SModelFileTracker; import jetbrains.mps.smodel.SModelRepository; import jetbrains.mps.smodel.SNodeAccessUtilImpl; import jetbrains.mps.smodel.language.ConceptRegistry; import jetbrains.mps.smodel.language.ExtensionRegistry; import jetbrains.mps.smodel.language.LanguageRegistry; import jetbrains.mps.smodel.references.ImmatureReferences; import jetbrains.mps.util.QueryMethodGenerated; import jetbrains.mps.validation.ValidationSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.model.SNodeAccessUtil; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; /** * Core MPS functionality layer. Non-instantiable now, the only way to create MPS is via {@code jetbrains.mps.core.platform.PlatformFactory}. */ public final class MPSCore extends ComponentPlugin { private volatile boolean myInitialized = false; private ClassLoaderManager myClassLoaderManager; private LibraryInitializer myLibraryInitializer; private PersistenceRegistry myPersistenceFacade; private MPSModuleRepository myModuleRepository; private LanguageRegistry myLanguageRegistry; /** * made package-private * Please consider using {@code jetbrains.mps.core.platform.Platform} instead */ MPSCore() { } @Override public void init() { super.init(); doInit(); myInitialized = true; } private void doInit() { SNodeAccessUtil.setInstance(new SNodeAccessUtilImpl()); myPersistenceFacade = init(new PersistenceRegistry()); init(new FacetsRegistry()); SRepositoryRegistry repositoryRegistry = init(new SRepositoryRegistry()); myModuleRepository = init(new MPSModuleRepository()); init(new SModelRepository(myModuleRepository)); init(new GlobalSModelEventsManager(myModuleRepository)); myClassLoaderManager = init(new ClassLoaderManager(myModuleRepository)); init(new DebugRegistry()); init(new SModelFileTracker.Plug(repositoryRegistry)); init(new ModuleRepositoryFacade(myModuleRepository)); init(new ModuleFileTracker(myModuleRepository)); init(new CleanupManager(myClassLoaderManager)); init(new PathMacros()); myLibraryInitializer = init(new LibraryInitializer(myModuleRepository)); init(new GlobalScope(myModuleRepository)); init(new ImmatureReferences(myModuleRepository, myPersistenceFacade)); init(new QueryMethodGenerated(myClassLoaderManager)); myLanguageRegistry = init(new LanguageRegistry(myModuleRepository, myClassLoaderManager)); init(new LanguageScopeFactory(myClassLoaderManager)); init(new ConceptRegistry(myLanguageRegistry)); init(new ExtensionRegistry(myClassLoaderManager, myModuleRepository)); init(new ConceptDescendantsCache(myModuleRepository, myLanguageRegistry)); init(new CachesManager(myClassLoaderManager, myModuleRepository)); init(new DescriptorModelComponent(myModuleRepository, new LanguageDescriptorModelProvider(myClassLoaderManager), new GeneratorDescriptorModelProvider())); init(new ProjectStructureModule(myModuleRepository, myPersistenceFacade)); init(new ResolverComponent()); init(new ValidationSettings()); init(new PropertySupportCache(myClassLoaderManager)); } private void checkInitialized() { if (!myInitialized) { throw new ComponentNotInitializedException(); } } @NotNull public ClassLoaderManager getClassLoaderManager() { checkInitialized(); return myClassLoaderManager; } @NotNull public LibraryInitializer getLibraryInitializer() { checkInitialized(); return myLibraryInitializer; } @NotNull public PersistenceFacade getPersistenceFacade() { checkInitialized(); return myPersistenceFacade; } @NotNull public LanguageRegistry getLanguageRegistry() { checkInitialized(); return myLanguageRegistry; } @NotNull public MPSModuleRepository getModuleRepository() { checkInitialized(); return myModuleRepository; } @NotNull public ModelFactoryRegistry getModelFactoryRegistry() { return ModelFactoryService.getInstance(); } private static class ComponentNotInitializedException extends IllegalStateException { } }