package com.intellij.javascript.karma;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.webcore.util.JsonUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
public class KarmaConfig {
private static final Logger LOG = Logger.getInstance(KarmaConfig.class);
private static final String AUTO_WATCH = "autoWatch";
private static final String BASE_PATH = "basePath";
private static final String BROWSERS = "browsers";
private static final String HOST_NAME = "hostname";
private static final String URL_ROOT = "urlRoot";
private static final String WEBPACK = "webpack";
private final boolean myAutoWatch;
private final List<String> myBrowsers;
private final String myBasePath;
private final String myHostname;
private final String myUrlRoot;
private final boolean myWebpack;
public KarmaConfig(boolean autoWatch,
@NotNull String basePath,
@NotNull List<String> browsers,
@NotNull String hostname,
@NotNull String urlRoot,
boolean webpack) {
myAutoWatch = autoWatch;
myBasePath = basePath;
myBrowsers = ImmutableList.copyOf(browsers);
myHostname = hostname;
myUrlRoot = urlRoot;
myWebpack = webpack;
}
public boolean isAutoWatch() {
return myAutoWatch;
}
@NotNull
public String getBasePath() {
return myBasePath;
}
@NotNull
public List<String> getBrowsers() {
return myBrowsers;
}
@NotNull
public String getHostname() {
return myHostname;
}
@NotNull
public String getUrlRoot() {
return myUrlRoot;
}
public boolean isWebpack() {
return myWebpack;
}
@Nullable
public static KarmaConfig parseFromJson(@NotNull JsonElement jsonElement,
@NotNull File configurationFileDir) {
if (jsonElement.isJsonObject()) {
JsonObject rootObject = jsonElement.getAsJsonObject();
boolean autoWatch = JsonUtil.getChildAsBoolean(rootObject, AUTO_WATCH, false);
List<String> browsers = parseBrowsers(rootObject);
String basePath = parseBasePath(jsonElement, rootObject, configurationFileDir);
String hostname = parseHostname(jsonElement, rootObject);
String urlRoot = parseUrlRoot(jsonElement, rootObject);
boolean webpack = JsonUtil.getChildAsBoolean(rootObject, WEBPACK, false);
return new KarmaConfig(autoWatch, basePath, browsers, hostname, urlRoot, webpack);
}
return null;
}
@NotNull
private static String parseBasePath(@NotNull JsonElement all,
@NotNull JsonObject obj,
@NotNull File configurationFileDir) {
String basePath = JsonUtil.getChildAsString(obj, BASE_PATH);
if (basePath == null) {
LOG.warn("Can not parse Karma config.basePath from " + all.toString());
basePath = configurationFileDir.getAbsolutePath();
}
return basePath;
}
private static String parseUrlRoot(@NotNull JsonElement all, @NotNull JsonObject obj) {
String urlRoot = JsonUtil.getChildAsString(obj, URL_ROOT);
if (urlRoot == null) {
LOG.warn("Can not parse Karma config.urlRoot from " + all.toString());
urlRoot = "/";
}
if (!urlRoot.startsWith("/")) {
urlRoot = "/" + urlRoot;
}
if (urlRoot.length() > 1 && urlRoot.endsWith("/")) {
urlRoot = urlRoot.substring(0, urlRoot.length() - 1);
}
return urlRoot;
}
private static String parseHostname(@NotNull JsonElement all, @NotNull JsonObject obj) {
String hostname = JsonUtil.getChildAsString(obj, HOST_NAME);
if (hostname == null) {
LOG.warn("Can not parse Karma config.hostname from " + all.toString());
hostname = "localhost";
}
hostname = hostname.toLowerCase(Locale.ENGLISH);
return hostname;
}
@NotNull
private static List<String> parseBrowsers(@NotNull JsonObject obj) {
JsonElement browsersElement = obj.get(BROWSERS);
if (browsersElement != null && browsersElement.isJsonArray()) {
JsonArray browsersArray = browsersElement.getAsJsonArray();
List<String> browsers = Lists.newArrayList();
for (JsonElement browserElement : browsersArray) {
String browser = JsonUtil.getString(browserElement);
if (browser != null) {
browsers.add(browser);
}
}
return browsers;
}
return Collections.emptyList();
}
}