package com.jetbrains.lang.dart.projectWizard; import com.intellij.execution.RunManager; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.ide.browsers.WebBrowser; import com.intellij.ide.browsers.impl.WebBrowserServiceImpl; import com.intellij.javascript.debugger.execution.JavaScriptDebugConfiguration; import com.intellij.javascript.debugger.execution.JavascriptDebugConfigurationType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiManager; import com.intellij.util.Consumer; import com.intellij.util.Url; import com.jetbrains.lang.dart.ide.runner.client.DartiumUtil; import com.jetbrains.lang.dart.ide.runner.server.DartCommandLineRunConfiguration; import com.jetbrains.lang.dart.ide.runner.server.DartCommandLineRunConfigurationType; import com.jetbrains.lang.dart.ide.runner.server.DartCommandLineRunnerParameters; import com.jetbrains.lang.dart.projectWizard.Stagehand.StagehandDescriptor; import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; public abstract class DartProjectTemplate { private static final Stagehand STAGEHAND = new Stagehand(); private static List<DartProjectTemplate> ourTemplateCache; private static final Logger LOG = Logger.getInstance(DartProjectTemplate.class.getName()); @NotNull private final String myName; @NotNull private final String myDescription; public DartProjectTemplate(@NotNull final String name, @NotNull final String description) { myName = name; myDescription = description; } @NotNull public String getName() { return myName; } @NotNull public String getDescription() { return myDescription; } public abstract Collection<VirtualFile> generateProject(@NotNull final String sdkRoot, @NotNull final Module module, @NotNull final VirtualFile baseDir) throws IOException; /** * Must be called in pooled thread without read action; <code>templatesConsumer</code> will be invoked in EDT */ public static void loadTemplatesAsync(final String sdkRoot, @NotNull final Consumer<List<DartProjectTemplate>> templatesConsumer) { if (ApplicationManager.getApplication().isReadAccessAllowed()) { LOG.error("DartProjectTemplate.loadTemplatesAsync() must be called in pooled thread without read action"); } final List<DartProjectTemplate> templates = new ArrayList<>(); try { templates.addAll(getStagehandTemplates(sdkRoot)); } finally { if (templates.isEmpty()) { templates.add(new WebAppTemplate()); templates.add(new CmdLineAppTemplate()); } ApplicationManager.getApplication().invokeLater(() -> templatesConsumer.consume(templates), ModalityState.any()); } } @NotNull private static List<DartProjectTemplate> getStagehandTemplates(@NotNull final String sdkRoot) { if (ourTemplateCache != null) { return ourTemplateCache; } STAGEHAND.install(sdkRoot); final List<StagehandDescriptor> templates = STAGEHAND.getAvailableTemplates(sdkRoot); ourTemplateCache = new ArrayList<>(); for (StagehandDescriptor template : templates) { ourTemplateCache.add(new StagehandTemplate(STAGEHAND, template)); } return ourTemplateCache; } static void createWebRunConfiguration(final @NotNull Module module, final @NotNull VirtualFile htmlFile) { DartModuleBuilder.runWhenNonModalIfModuleNotDisposed(() -> { final WebBrowser dartium = DartiumUtil.getDartiumBrowser(); if (dartium == null) return; final Url url = WebBrowserServiceImpl.getDebuggableUrl(PsiManager.getInstance(module.getProject()).findFile(htmlFile)); if (url == null) return; final RunManager runManager = RunManager.getInstance(module.getProject()); try { final RunnerAndConfigurationSettings settings = runManager.createRunConfiguration("", JavascriptDebugConfigurationType.getTypeInstance().getFactory()); ((JavaScriptDebugConfiguration)settings.getConfiguration()).setUri(url.toDecodedForm()); ((JavaScriptDebugConfiguration)settings.getConfiguration()).setEngineId(dartium.getId().toString()); settings.setName(((JavaScriptDebugConfiguration)settings.getConfiguration()).suggestedName()); runManager.addConfiguration(settings, false); runManager.setSelectedConfiguration(settings); } catch (Throwable t) {/* ClassNotFound in IDEA Community or if JS Debugger plugin disabled */} }, module); } static void createCmdLineRunConfiguration(final @NotNull Module module, final @NotNull VirtualFile mainDartFile) { DartModuleBuilder.runWhenNonModalIfModuleNotDisposed(() -> { final RunManager runManager = RunManager.getInstance(module.getProject()); final RunnerAndConfigurationSettings settings = runManager.createRunConfiguration("", DartCommandLineRunConfigurationType.getInstance().getConfigurationFactories()[0]); final DartCommandLineRunConfiguration runConfiguration = (DartCommandLineRunConfiguration)settings.getConfiguration(); runConfiguration.getRunnerParameters().setFilePath(mainDartFile.getPath()); runConfiguration.getRunnerParameters() .setWorkingDirectory(DartCommandLineRunnerParameters.suggestDartWorkingDir(module.getProject(), mainDartFile)); settings.setName(runConfiguration.suggestedName()); runManager.addConfiguration(settings, false); runManager.setSelectedConfiguration(settings); }, module); } }