package com.github.agiledon.sisyphus.util;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.List;
import static com.github.agiledon.sisyphus.util.ResourceFilePath.compensatePath;
import static com.github.agiledon.sisyphus.util.ResourceFilePath.getAbsolutePath;
import static com.google.common.collect.Lists.newArrayList;
public final class ResourceLoader {
private ResourceLoader() {}
private static Logger logger = LoggerFactory.getLogger(ResourceLoader.class);
private static final String COMMENT_INDICATOR = "#";
private static final String SECTION_INDICATOR = "///";
public static String loadResource(String resourceName) {
List<String> resource = loadResourceAsLines(resourceName);
return Joiner.on("\n").join(resource);
}
public static List<String> loadResourceAsLines(String resourceName) {
try {
File file = new File(getAbsolutePath(compensatePath(resourceName)));
List<String> strings = Files.readLines(file, Charsets.UTF_8);
return filterInvalidLines(strings);
} catch (IOException e) {
return logAndReturnEmptyList(resourceName);
} catch (Exception e) {
return logAndReturnEmptyList(resourceName);
}
}
public static List<List<String>> loadResources(String resourceName) {
return ListUtil.partition(loadResourceAsLines(resourceName), new Predicates<String>() {
@Override
public boolean apply(String element) {
return element.trim().startsWith(SECTION_INDICATOR);
}
});
}
private static List<String> logAndReturnEmptyList(String resourceName) {
logger.warn("Failed to read file {}.", resourceName);
return newArrayList();
}
private static List<String> filterInvalidLines(Iterable<String> lines) {
Iterable<String> filteredLines = Iterables.filter(lines, new Predicate<String>() {
@Override
public boolean apply(String line) {
return notSpaceLine(line) && notComment(line);
}
});
return Lists.newArrayList(filteredLines);
}
private static boolean notComment(String line) {
return !line.trim().startsWith(COMMENT_INDICATOR);
}
private static boolean notSpaceLine(String line) {
return !Strings.isNullOrEmpty(line.trim());
}
}