package com.jetbrains.lang.dart.ide.runner.server; import com.intellij.execution.ExecutionException; import com.intellij.execution.Executor; import com.intellij.execution.configuration.EmptyRunProfileState; import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.configurations.RuntimeConfigurationError; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.RunConfigurationWithSuppressedDefaultRunAction; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; import com.intellij.util.xmlb.XmlSerializer; import com.jetbrains.lang.dart.ide.runner.server.ui.DartRemoteDebugConfigurationEditor; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class DartRemoteDebugConfiguration extends RunConfigurationBase implements RunConfigurationWithSuppressedDefaultRunAction { @NotNull DartRemoteDebugParameters myParameters = new DartRemoteDebugParameters(); protected DartRemoteDebugConfiguration(@NotNull final Project project, @NotNull final DartRemoteDebugConfigurationType configType, @NotNull final String name) { super(project, configType.getConfigurationFactories()[0], name); } @NotNull public DartRemoteDebugParameters getParameters() { return myParameters; } public void checkConfiguration() throws RuntimeConfigurationError { final String path = myParameters.getDartProjectPath(); if (path.isEmpty()) { throw new RuntimeConfigurationError("Dart project path is not specified"); } final VirtualFile dir = LocalFileSystem.getInstance().findFileByPath(path); if (dir == null || !dir.isDirectory()) { throw new RuntimeConfigurationError("Folder not found: " + FileUtil.toSystemDependentName(path)); } if (!ProjectRootManager.getInstance(getProject()).getFileIndex().isInContent(dir)) { throw new RuntimeConfigurationError("Folder is not in project content: " + FileUtil.toSystemDependentName(path)); } } @Override public DartRemoteDebugConfiguration clone() { final DartRemoteDebugConfiguration clone = (DartRemoteDebugConfiguration)super.clone(); clone.myParameters = myParameters.clone(); return clone; } @NotNull @Override public SettingsEditor<DartRemoteDebugConfiguration> getConfigurationEditor() { return new DartRemoteDebugConfigurationEditor(getProject()); } @Nullable @Override public RunProfileState getState(@NotNull final Executor executor, @NotNull final ExecutionEnvironment environment) throws ExecutionException { try { checkConfiguration(); } catch (RuntimeConfigurationError e) { throw new ExecutionException(e.getMessage()); } return EmptyRunProfileState.INSTANCE; } @Override public void writeExternal(final Element element) throws WriteExternalException { super.writeExternal(element); XmlSerializer.serializeInto(myParameters, element, new SkipDefaultValuesSerializationFilters()); } @Override public void readExternal(final Element element) throws InvalidDataException { super.readExternal(element); XmlSerializer.deserializeInto(myParameters, element); } }