package io.airlift.airship.cli;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.Iterables;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.io.Files;
import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
public class Config
implements Iterable<Entry<String, Collection<String>>>
{
private final LinkedListMultimap<String, String> configuration;
private final File file;
public static Config loadConfig(File file)
throws IOException
{
LinkedListMultimap<String, String> config = LinkedListMultimap.create();
if (file.exists()) {
Splitter commentSplitter = Splitter.on('#').limit(2);
Splitter keyValueSplitter = Splitter.on('=').trimResults().limit(2);
for (String line : Files.readLines(file, Charsets.UTF_8)) {
line = Iterables.getFirst(commentSplitter.split(line), "");
List<String> keyValue = ImmutableList.copyOf(keyValueSplitter.split(line));
if (keyValue.size() != 2) {
continue;
}
config.put(keyValue.get(0), keyValue.get(1));
}
}
return new Config(config, file);
}
@VisibleForTesting
public Config()
{
this.configuration = LinkedListMultimap.create();
this.file = null;
}
public Config(LinkedListMultimap<String, String> configuration, File file)
{
this.configuration = configuration;
this.file = file;
}
@Override
public Iterator<Entry<String, Collection<String>>> iterator()
{
return ImmutableListMultimap.copyOf(configuration).asMap().entrySet().iterator();
}
public String get(String key)
{
return Iterables.getFirst(configuration.get(key), null);
}
public List<String> getAll(String key)
{
return configuration.get(key);
}
public void set(String key, @Nullable String value)
{
configuration.replaceValues(key, ImmutableList.of(value));
}
public void unset(String key)
{
configuration.removeAll(key);
}
public void add(String key, String value)
{
configuration.put(key, value);
}
public void save()
throws IOException
{
if (file != null) {
file.getAbsoluteFile().getParentFile().mkdirs();
String data = Joiner.on('\n').withKeyValueSeparator(" = ").useForNull("").join(configuration.entries()) + "\n";
Files.write(data, file, Charsets.UTF_8);
}
}
@Override
public String toString()
{
return configuration.toString();
}
}