package com.intellij.javascript.karma.execution; import com.intellij.execution.configuration.EnvironmentVariablesData; import com.intellij.javascript.karma.scope.KarmaScopeKind; import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreterRef; import com.intellij.javascript.nodejs.util.NodePackage; import com.intellij.openapi.util.JDOMExternalizerUtil; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import org.jdom.Attribute; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; public class KarmaRunSettingsSerializationUtil { private static final String CONFIG_FILE = "config-file"; private static final String KARMA_PACKAGE_DIR = "karma-package-dir"; private static final String BROWSERS = "browsers"; private static final String NODE_INTERPRETER = "node-interpreter"; private static final String SCOPE_KIND = "scope-kind"; private static final String TEST_NAMES = "test-names"; private static final String TEST_NAME = "test-name"; private KarmaRunSettingsSerializationUtil() {} public static KarmaRunSettings readXml(@NotNull Element element) { KarmaRunSettings.Builder builder = new KarmaRunSettings.Builder(); String configFilePath = JDOMExternalizerUtil.getFirstChildValueAttribute(element, CONFIG_FILE); if (configFilePath == null) { configFilePath = getAttrValue(element, CONFIG_FILE); } builder.setConfigPath(FileUtil.toSystemDependentName(StringUtil.notNullize(configFilePath))); String browsers = JDOMExternalizerUtil.getFirstChildValueAttribute(element, BROWSERS); if (browsers == null) { browsers = getAttrValue(element, BROWSERS); } if (browsers != null) { builder.setBrowsers(browsers); } String karmaPackageDir = JDOMExternalizerUtil.getFirstChildValueAttribute(element, KARMA_PACKAGE_DIR); if (karmaPackageDir != null) { builder.setKarmaPackage(new NodePackage(karmaPackageDir)); } String interpreterRefName = JDOMExternalizerUtil.getFirstChildValueAttribute(element, NODE_INTERPRETER); builder.setInterpreterRef(interpreterRefName == null ? NodeJsInterpreterRef.createProjectRef() : NodeJsInterpreterRef.create(interpreterRefName)); EnvironmentVariablesData envData = EnvironmentVariablesData.readExternal(element); builder.setEnvData(envData); KarmaScopeKind scopeKind = readScopeKind(element); builder.setScopeKind(scopeKind); if (scopeKind == KarmaScopeKind.SUITE || scopeKind == KarmaScopeKind.TEST) { builder.setTestNames(readTestNames(element)); } return builder.build(); } @NotNull private static KarmaScopeKind readScopeKind(@NotNull Element element) { String value = JDOMExternalizerUtil.getFirstChildValueAttribute(element, SCOPE_KIND); if (StringUtil.isNotEmpty(value)) { try { return KarmaScopeKind.valueOf(value); } catch (IllegalArgumentException ignored) { } } return KarmaScopeKind.ALL; } @NotNull private static List<String> readTestNames(@NotNull Element parent) { Element testNamesElement = parent.getChild(TEST_NAMES); if (testNamesElement == null) { return Collections.emptyList(); } return JDOMExternalizerUtil.getChildrenValueAttributes(testNamesElement, TEST_NAME); } @Nullable private static String getAttrValue(@NotNull Element element, @NotNull String attrKey) { Attribute attribute = element.getAttribute(attrKey); return attribute != null ? attribute.getValue() : null; } public static void writeXml(@NotNull Element element, @NotNull KarmaRunSettings settings) { JDOMExternalizerUtil.addElementWithValueAttribute(element, CONFIG_FILE, settings.getConfigSystemIndependentPath()); if (StringUtil.isNotEmpty(settings.getBrowsers())) { JDOMExternalizerUtil.addElementWithValueAttribute(element, BROWSERS, settings.getBrowsers()); } if (settings.getKarmaPackage() != null) { JDOMExternalizerUtil.addElementWithValueAttribute(element, KARMA_PACKAGE_DIR, settings.getKarmaPackage().getSystemIndependentPath()); } JDOMExternalizerUtil.addElementWithValueAttribute(element, NODE_INTERPRETER, settings.getInterpreterRef().getReferenceName()); settings.getEnvData().writeExternal(element); KarmaScopeKind scopeKind = settings.getScopeKind(); if (scopeKind != KarmaScopeKind.ALL) { JDOMExternalizerUtil.addElementWithValueAttribute(element, SCOPE_KIND, scopeKind.name()); } if (scopeKind == KarmaScopeKind.SUITE || scopeKind == KarmaScopeKind.TEST) { Element testNamesElement = new Element(TEST_NAMES); if (!settings.getTestNames().isEmpty()) { JDOMExternalizerUtil.addChildrenWithValueAttribute(testNamesElement, TEST_NAME, settings.getTestNames()); } element.addContent(testNamesElement); } } }