package org.deephacks.confit;
import com.google.common.base.Optional;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import java.util.ArrayList;
import java.util.Collection;
public class ConfigChanges {
private Multimap<Class<?>, ConfigChange<Object>> changes = ArrayListMultimap.create();
public ConfigChanges() {
}
public void add(ConfigChange change) {
changes.put(change.getChangeClass(), change);
}
public Collection<ConfigChange<Object>> getChanges() {
Collection<ConfigChange<Object>> result = new ArrayList<>();
for (ConfigChange<?> change : changes.values()) {
result.add((ConfigChange<Object>) change);
}
return result;
}
public <T> Collection<ConfigChange<T>> getChanges(Class<T> cls) {
Collection<ConfigChange<T>> result = new ArrayList<>();
for (ConfigChange<?> change : changes.get(cls)) {
result.add((ConfigChange<T>) change);
}
return result;
}
public int size() {
return changes.values().size();
}
public static class ConfigChange<T> {
private Optional<T> before;
private Optional<T> after;
private Class<?> changeClass;
private ConfigChange(Optional<T> before, Optional<T> after){
this.before = before;
this.after = after;
if (before().isPresent()) {
changeClass = before().get().getClass();
} else {
changeClass = after().get().getClass();
}
}
public Class<?> getChangeClass() {
return changeClass;
}
public static <T> ConfigChange created(T after) {
return new ConfigChange(Optional.absent(), Optional.of(after));
}
public static <T> ConfigChange<T> deleted(T before) {
return new ConfigChange(Optional.of(before), Optional.absent());
}
public static <T> ConfigChange<T> updated(T before, T after) {
return new ConfigChange(Optional.of(before), Optional.of(after));
}
public Optional<T> before() {
return before;
}
public Optional<T> after() {
return after;
}
}
}