package jalse.actions;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* This is a simple yet fully-featured implementation of {@link ActionBindings}.<br>
* <br>
* Keys cannot be null or empty.
*
* @author Elliot Ford
*
*/
@SuppressWarnings("unchecked")
public class DefaultActionBindings implements ActionBindings {
private static void validateKey(final String key) {
if (key == null) {
throw new NullPointerException();
} else if (key.length() == 0) {
throw new IllegalArgumentException();
}
}
private final ConcurrentMap<String, Object> bindings;
/**
* Creates a new instance of DefaultActionBindings.
*/
public DefaultActionBindings() {
bindings = new ConcurrentHashMap<>();
}
/**
* Creates a new instance of DefaultActionBindings with the supplied source bindings.
*
* @param sourceBindings
* Source bindings to shallow copy.
*/
public DefaultActionBindings(final ActionBindings sourceBindings) {
this(sourceBindings.toMap());
}
/**
* Creates a new instance of DefaultActionBindings with the supplied key-value pairs.
*
* @param map
* Key-value pairs to add.
*
*/
public DefaultActionBindings(final Map<String, ?> map) {
this();
putAll(map);
}
@Override
public <T> T get(final String key) {
validateKey(key);
return (T) bindings.get(key);
}
@Override
public <T> T put(final String key, final T value) {
validateKey(key);
return (T) bindings.put(key, Objects.requireNonNull(value));
}
@Override
public void putAll(final Map<String, ?> map) {
map.entrySet().forEach(e -> {
put(e.getKey(), e.getValue());
});
}
@Override
public <T> T remove(final String key) {
validateKey(key);
return (T) bindings.remove(key);
}
@Override
public void removeAll() {
bindings.clear();
}
@Override
public Map<String, ?> toMap() {
return new HashMap<>(bindings);
}
@Override
public String toString() {
return "DefaultActionBindings [" + bindings + "]";
}
}