package com.google.jstestdriver.idea.execution.settings;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import com.google.jstestdriver.idea.util.EnumUtils;
import com.google.jstestdriver.idea.util.ObjectUtils;
import com.intellij.openapi.util.JDOMExternalizer;
public class JstdRunSettingsSerializationUtils {
private enum Key {
TEST_TYPE("configLocationType"),
JSTD_CONFIG_FILE("settingsFile"),
ALL_IN_DIRECTORY("allInDirectory"),
CONFIG_TYPE("configType"),
JS_FILE("jsFile"),
TEST_CASE("testCase"),
TEST_METHOD("testMethod"),
SERVER_ADDRESS("serverAddress"),
SERVER_TYPE("serverType");
private final String key;
Key(String key) {
this.key = key;
}
public String getKey() {
return key;
}
}
private JstdRunSettingsSerializationUtils() {}
public static JstdRunSettings readFromJDomElement(Element element) {
JstdRunSettings.Builder builder = new JstdRunSettings.Builder();
TestType testType = readEnumByName(element, Key.TEST_TYPE, TestType.CONFIG_FILE);
builder.setTestType(testType);
if (testType == TestType.ALL_CONFIGS_IN_DIRECTORY) {
String directory = readString(element, Key.ALL_IN_DIRECTORY, "");
builder.setDirectory(directory);
} else if (testType == TestType.CONFIG_FILE) {
String configFile = readString(element, Key.JSTD_CONFIG_FILE, "");
builder.setConfigFile(configFile);
} else if (testType == TestType.JS_FILE) {
readJsFile(builder, element);
} else if (testType == TestType.TEST_CASE) {
readTestCase(builder, element);
} else if (testType == TestType.TEST_METHOD) {
readTestMethod(builder, element);
}
ServerType serverType = readEnumByName(element, Key.SERVER_TYPE, ServerType.INTERNAL);
builder.setServerType(serverType);
if (serverType == ServerType.EXTERNAL) {
String serverAddress = readString(element, Key.SERVER_ADDRESS, "");
builder.setServerAddress(serverAddress);
}
return builder.build();
}
private static void readTestMethod(JstdRunSettings.Builder builder, Element element) {
readTestCase(builder, element);
String testMethodName = readString(element, Key.TEST_METHOD, "");
builder.setTestMethodName(testMethodName);
}
private static void readTestCase(JstdRunSettings.Builder builder, Element element) {
readJsFile(builder, element);
String testCaseName = readString(element, Key.TEST_CASE, "");
builder.setTestCaseName(testCaseName);
}
private static void readJsFile(JstdRunSettings.Builder builder, Element element) {
JstdConfigType configType = readEnumByName(element, Key.CONFIG_TYPE, JstdConfigType.GENERATED);
builder.setConfigType(configType);
if (configType == JstdConfigType.FILE_PATH) {
String configFile = readString(element, Key.JSTD_CONFIG_FILE, "");
builder.setConfigFile(configFile);
}
String jsFile = readString(element, Key.JS_FILE, "");
builder.setJSFilePath(jsFile);
}
public static void writeFromJDomElement(Element element, JstdRunSettings runSettings) {
TestType testType = runSettings.getTestType();
writeString(element, Key.TEST_TYPE, testType.name());
if (testType == TestType.ALL_CONFIGS_IN_DIRECTORY) {
writeString(element, Key.ALL_IN_DIRECTORY, runSettings.getDirectory());
} else if (testType == TestType.CONFIG_FILE) {
writeString(element, Key.JSTD_CONFIG_FILE, runSettings.getConfigFile());
} else if (testType == TestType.JS_FILE) {
writeJsFile(element, runSettings);
} else if (testType == TestType.TEST_CASE) {
writeTestCase(runSettings, element);
} else if (testType == TestType.TEST_METHOD) {
writeTestMethod(runSettings, element);
}
writeString(element, Key.SERVER_TYPE, runSettings.getServerType().name());
if (runSettings.getServerType() == ServerType.EXTERNAL) {
writeString(element, Key.SERVER_ADDRESS, runSettings.getServerAddress());
}
}
private static void writeTestMethod(JstdRunSettings runSettings, Element element) {
writeTestCase(runSettings, element);
writeString(element, Key.TEST_METHOD, runSettings.getTestMethodName());
}
private static void writeTestCase(JstdRunSettings runSettings, Element element) {
writeJsFile(element, runSettings);
writeString(element, Key.TEST_CASE, runSettings.getTestCaseName());
}
private static void writeJsFile(Element element, JstdRunSettings runSettings) {
JstdConfigType configType = runSettings.getConfigType();
writeString(element, Key.CONFIG_TYPE, configType.name());
if (configType == JstdConfigType.FILE_PATH) {
writeString(element, Key.JSTD_CONFIG_FILE, runSettings.getConfigFile());
}
writeString(element, Key.JS_FILE, runSettings.getJsFilePath());
}
@SuppressWarnings({"unchecked"})
@NotNull
private static <E extends Enum<E>> E readEnumByName(Element element, Key key, @NotNull E defaultValue) {
String str = readString(element, key, "");
E enumConstant = EnumUtils.findEnum(defaultValue.getDeclaringClass(), str);
return ObjectUtils.notNull(enumConstant, defaultValue);
}
private static void writeString(Element element, Key key, String value) {
JDOMExternalizer.write(element, key.getKey(), value);
}
@NotNull
private static String readString(Element element, Key key, @NotNull String defaultValue) {
String value = JDOMExternalizer.readString(element, key.getKey());
return value != null ? value : defaultValue;
}
}