package gutenberg.util; import com.google.common.base.Optional; import com.google.common.collect.Maps; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class SimpleKeyValues implements KeyValues { private final List<KeyValues> delegates = new ArrayList<KeyValues>(); private final Map<Object, Object> context = Maps.newHashMap(); @Override public void delegateTo(KeyValues delegate) { delegates.add(delegate); } @Override public void declare(Object key, Object value) { context.put(key, value); } @Override public Map<Object, Object> asMap() { Map<Object, Object> map = new HashMap<Object, Object>(); map.putAll(context); // add in reverse order, since last delegate can override previous one for (int i = delegates.size() - 1; i >= 0; i--) { map.putAll(delegates.get(i).asMap()); } return map; } @SuppressWarnings("unchecked") @Override public <T> Optional<T> getNullable(Object key) { for (KeyValues delegate : delegates) { Optional<T> opt = delegate.getNullable(key); if (opt.isPresent()) return opt; } if (context.containsKey(key)) return Optional.of((T) context.get(key)); return Optional.absent(); } @Override public Optional<String> getString(Object key) { return getNullable(key); } @Override public String getString(Object key, String defaultValue) { return getString(key).or(defaultValue); } @Override public Optional<Boolean> getBoolean(Object key) { return getNullable(key); } @Override public boolean getBoolean(Object key, boolean defaultValue) { return getBoolean(key).or(defaultValue); } @Override public Optional<Integer> getInteger(Object key) { return getNullable(key); } @Override public int getInteger(String key, int defaultValue) { return getInteger(key).or(defaultValue); } }