package com.google.jstestdriver.idea.config;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.jstestdriver.FileInfo;
import com.google.jstestdriver.FlagsImpl;
import com.google.jstestdriver.PathResolver;
import com.google.jstestdriver.config.Configuration;
import com.google.jstestdriver.config.ConfigurationSource;
import com.google.jstestdriver.config.UserConfigurationSource;
import com.google.jstestdriver.config.YamlParser;
import com.google.jstestdriver.hooks.FileParsePostProcessor;
import com.google.jstestdriver.util.DisplayPathSanitizer;
import com.intellij.openapi.diagnostic.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
public class JstdConfigStructure {
private static final Logger LOG = Logger.getInstance(JstdConfigStructure.class);
private final File myJstdConfigFile;
private final File myBasePath;
private final Set<File> myLoadFiles;
private final Set<File> myTestFiles;
private JstdConfigStructure(@NotNull File jstdConfigFile, @NotNull File basePath,
@NotNull Collection<File> loadFiles,
@NotNull Collection<File> testFiles) {
myJstdConfigFile = jstdConfigFile;
myBasePath = basePath;
myLoadFiles = map2CanonicalFiles(loadFiles);
myTestFiles = map2CanonicalFiles(testFiles);
}
@NotNull
private static Set<File> map2CanonicalFiles(@NotNull Collection<File> files) {
Set<File> canonicalFiles = Sets.newHashSet();
for (File file : files) {
try {
canonicalFiles.add(file.getCanonicalFile());
} catch (IOException e) {
LOG.warn(e);
}
}
return canonicalFiles;
}
@NotNull
public File getJstdConfigFile() {
return myJstdConfigFile;
}
@NotNull
public File getBasePath() {
return myBasePath;
}
@NotNull
public Set<File> getLoadFiles() {
return myLoadFiles;
}
@NotNull
public Set<File> getTestFiles() {
return myTestFiles;
}
@Nullable
public File findLoadFile(@NotNull String filePath) {
File file = new File(myBasePath, filePath);
if (!file.isFile()) {
File absoluteFile = new File(filePath);
if (absoluteFile.isAbsolute() && absoluteFile.isFile()) {
file = absoluteFile;
}
}
if (file.isFile()) {
try {
File canonicalFile = file.getCanonicalFile();
if (myLoadFiles.contains(canonicalFile) || myTestFiles.contains(canonicalFile)) {
return file;
}
} catch (IOException ignored) {
}
}
return null;
}
public static JstdConfigStructure newConfigStructure(@NotNull File jstdConfigFile) {
Configuration resolvedConfiguration = resolveConfiguration(jstdConfigFile);
Collection<File> loadFiles = mapFileInfos2Files(resolvedConfiguration.getFilesList());
Collection<File> testFiles = mapFileInfos2Files(resolvedConfiguration.getTests());
return new JstdConfigStructure(jstdConfigFile, resolvedConfiguration.getBasePath(), loadFiles, testFiles);
}
private static List<File> mapFileInfos2Files(Collection<FileInfo> fileInfos) {
List<File> files = Lists.newArrayList();
for (FileInfo fileInfo : fileInfos) {
File file = fileInfo.toFile(null);
files.add(file);
}
return files;
}
private static Configuration resolveConfiguration(File jstdConfigFile) {
FlagsImpl flags = new FlagsImpl();
flags.setServer("test:1");
try {
ConfigurationSource confSrc = new UserConfigurationSource(jstdConfigFile);
File initialBasePath = jstdConfigFile.getParentFile();
Configuration parsedConf = confSrc.parse(initialBasePath, new YamlParser());
File resolvedBasePath = parsedConf.getBasePath().getCanonicalFile();
PathResolver pathResolver = new PathResolver(
resolvedBasePath,
Collections.<FileParsePostProcessor>emptySet(),
new DisplayPathSanitizer(resolvedBasePath)
);
return parsedConf.resolvePaths(pathResolver, flags);
} catch (IOException e) {
throw new RuntimeException("Failed to read settings file " + jstdConfigFile, e);
}
}
}