package com.googlecode.totallylazy;
import com.googlecode.totallylazy.functions.Curried2;
import com.googlecode.totallylazy.functions.Function1;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.NoSuchElementException;
import static com.googlecode.totallylazy.Sequences.sequence;
import static java.lang.String.format;
public class Properties {
public static java.util.Properties properties(InputStream stream) throws IOException {
java.util.Properties properties = new java.util.Properties();
try {
properties.load(stream);
} finally {
stream.close();
}
return properties;
}
public static java.util.Properties properties(String values) {
java.util.Properties properties = new java.util.Properties();
try {
properties.load(new ByteArrayInputStream(values.getBytes()));
} catch (IOException e) {
throw new RuntimeException("This should be impossible", e);
}
return properties;
}
public static java.util.Properties properties(Iterable<Pair<String, String>> values) {
java.util.Properties properties = new java.util.Properties();
for (Pair<String, String> value : values) {
properties.setProperty(value.first(), value.second());
}
return properties;
}
@SafeVarargs
public static java.util.Properties properties(Pair<String, String>... values) {
return properties(sequence(values));
}
public static java.util.Properties copy(Map properties) {
return properties(pairs(properties));
}
public static Sequence<Pair<String, String>> pairs(Map properties){
return Maps.pairs(Unchecked.<Map<String, String>>cast(properties));
}
public static java.util.Properties compose(java.util.Properties... properties) {
return compose(sequence(properties));
}
public static java.util.Properties compose(Iterable<java.util.Properties> propertiesSequence) {
return sequence(propertiesSequence)
.flatMap(Maps.entries())
.fold(new java.util.Properties(), setProperty());
}
public static Curried2<java.util.Properties, Map.Entry<Object, Object>, java.util.Properties> setProperty() {
return (properties, property) -> {
properties.put(property.getKey(), property.getValue());
return properties;
};
}
public static Curried2<java.util.Properties, java.util.Properties, java.util.Properties> compose() {
return (soFar, nextProperties) -> compose(soFar, nextProperties);
}
public static String asString(java.util.Properties properties) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
properties.store(out, "");
} catch (IOException e) {
throw new RuntimeException("Problem writing to ByteArrayOutputStream. This should never happen", e);
}
return out.toString();
}
public static Function1<String, java.util.Properties> propertiesFromString() {
return Properties::properties;
}
public static String expectProperty(java.util.Properties properties, String name) {
if (!properties.containsKey(name)) {
throw new NoSuchElementException(format("Expected property '%s' to be defined", name));
}
return properties.getProperty(name);
}
}