package jetbrains.mps.tool.environment;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import jetbrains.mps.core.platform.Platform;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.core.platform.PlatformFactory;
import jetbrains.mps.core.platform.PlatformOptionsBuilder;
import jetbrains.mps.generator.GenerationSettingsProvider;
import jetbrains.mps.generator.DefaultModifiableGenerationSettings;
import jetbrains.mps.library.LibraryInitializer;
import org.jetbrains.mps.openapi.module.FacetsFacade;
import jetbrains.mps.classloading.DumbIdeaPluginFacet;
import org.jetbrains.mps.openapi.module.SModuleFacet;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.project.Project;
import java.io.File;
import jetbrains.mps.core.tool.environment.util.FileMPSProject;
import jetbrains.mps.util.FileUtil;
public class MpsEnvironment extends EnvironmentBase {
private static final Logger LOG = LogManager.getLogger(MpsEnvironment.class);
private Platform myPlatform;
static {
EnvironmentBase.initializeLog4j();
}
protected MpsEnvironment(@NotNull EnvironmentConfig config) {
super(config);
}
/**
* creates a new MpsEnvironment or returns the cached one
*/
@NotNull
public static Environment getOrCreate(@NotNull EnvironmentConfig config) {
Environment currentEnv = EnvironmentContainer.get();
if (currentEnv != null) {
currentEnv.retain();
return currentEnv;
} else {
MpsEnvironment mpsEnv = new MpsEnvironment(config);
mpsEnv.init();
assert EnvironmentContainer.get() == mpsEnv;
return mpsEnv;
}
}
@Override
public void init() {
if (LOG.isInfoEnabled()) {
LOG.info("Creating MPS environment");
}
myPlatform = PlatformFactory.initPlatform(PlatformOptionsBuilder.ALL);
GenerationSettingsProvider.getInstance().setGenerationSettings(new DefaultModifiableGenerationSettings());
registerFacetFactory();
super.init(myPlatform.findComponent(LibraryInitializer.class));
}
private void registerFacetFactory() {
FacetsFacade.FacetFactory dumbFactory = FacetsFacade.getInstance().getFacetFactory(DumbIdeaPluginFacet.FACET_TYPE);
assert dumbFactory != null;
FacetsFacade.getInstance().removeFactory(dumbFactory);
FacetsFacade.getInstance().addFactory(DumbIdeaPluginFacet.FACET_TYPE, new FacetsFacade.FacetFactory() {
@Override
public SModuleFacet create() {
return new DumbIdeaPluginFacet() {
@Override
@Nullable
public ClassLoader getClassLoader() {
return rootClassLoader();
}
};
}
});
}
@Override
@NotNull
public Project doOpenProject(@NotNull File projectFile) {
FileMPSProject project = new FileMPSProject(projectFile);
return project;
}
@NotNull
@Override
public Project createEmptyProject() {
checkInitialized();
if (LOG.isInfoEnabled()) {
LOG.info("Creating an empty project");
}
File projectFile = FileUtil.createTmpDir();
projectFile.deleteOnExit();
Project project = openProject(projectFile);
return project;
}
@Override
public void doDispose() {
myPlatform.dispose();
myPlatform = null;
}
@Override
public void flushAllEvents() {
// do nothing
checkInitialized();
}
@Override
public Platform getPlatform() {
return myPlatform;
}
@Nullable
protected ClassLoader rootClassLoader() {
return MpsEnvironment.class.getClassLoader();
}
}