/* * 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.make; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import jetbrains.mps.InternalFlag; import jetbrains.mps.compiler.JavaCompilerOptions; import jetbrains.mps.compiler.JavaCompilerOptionsComponent; import jetbrains.mps.ide.MPSCoreComponents; import jetbrains.mps.ide.platform.watching.ReloadManagerComponent; import jetbrains.mps.make.ModuleMaker; import jetbrains.mps.progress.ProgressMonitorAdapter; import jetbrains.mps.project.MPSProject; import jetbrains.mps.project.ProjectLibraryManager; import jetbrains.mps.project.StandaloneMPSProject; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.IterableUtil; import jetbrains.mps.util.PathManager; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.module.SModule; import org.jetbrains.mps.openapi.util.ProgressMonitor; import java.util.Collection; /** * Compiles all project modules at startup */ public final class StartupModuleMakerImpl extends StartupModuleMaker { private static final Logger LOG = LogManager.getLogger(StartupModuleMakerImpl.class); private final MPSProject myMPSProject; private final ReloadManagerComponent myReloadManager; @SuppressWarnings({"UnusedDeclaration"}) public StartupModuleMakerImpl(Project project, StandaloneMPSProject mpsProject, ProjectLibraryManager plm, ReloadManagerComponent reloadManager, MPSCoreComponents components) { super(project); myMPSProject = mpsProject; myReloadManager = reloadManager; } @Override public void initComponent() { if (ProgressManager.getInstance().getProgressIndicator() != null) { executeUnderOldIndicator(); } else { executeUnderNewIndicator(); } } private void executeUnderNewIndicator() { ProgressManager.getInstance().run(new Task.Modal(myProject, "Building", false) { @Override public void run(@NotNull ProgressIndicator indicator) { doBuild(new ProgressMonitorAdapter(indicator)); } }); } private void executeUnderOldIndicator() { ProgressIndicator currentIndicator = ProgressManager.getInstance().getProgressIndicator(); currentIndicator.pushState(); try { doBuild(new ProgressMonitorAdapter(currentIndicator)); } catch (VirtualMachineError e) { throw e; } catch (Throwable e) { LOG.error("Exception while making project", e); throw e; } currentIndicator.popState(); } private void doBuild(ProgressMonitor monitor) { LOG.info("Building modules on startup"); final Collection<SModule> modules = new ModelAccessHelper(myMPSProject.getRepository()).runReadAction(this::getModules); myMPSProject.getModelAccess().runWriteAction(() -> { final ModuleMaker maker = new ModuleMaker(); myReloadManager.computeNoReload(() -> { JavaCompilerOptions compilerOptions = JavaCompilerOptionsComponent.getInstance().getJavaCompilerOptions(myMPSProject); return maker.makeAndDeploy(modules, monitor, compilerOptions); }); }); LOG.info("Building on startup is finished"); } private Collection<SModule> getModules() { if (PathManager.isFromSources()) { return IterableUtil.asCollection(myMPSProject.getRepository().getModules()); } return myMPSProject.getProjectModulesWithGenerators(); } }