package sharpen.xobotos.config.xstream;
import sharpen.xobotos.config.ConfigurationException;
import java.util.HashMap;
import java.util.Map;
public final class Environment {
private final Map<Class<?>, Object> _variables;
public Environment(Object... variables) {
_variables = new HashMap<Class<?>, Object>();
for (final Object obj : variables) {
Class<?> klass = obj.getClass();
if (_variables.containsKey(klass))
throw new ConfigurationException("Duplicate instance of class '%s'", klass);
_variables.put(obj.getClass(), obj);
}
}
public <T> T provide(Class<T> klass) {
for (final Class<?> type : _variables.keySet()) {
if (klass.isAssignableFrom(type))
return klass.cast(_variables.get(type));
}
throw new ConfigurationException("No instance of class '%s' available in current environment", klass);
}
public Environment clone(Object... variables) {
Environment e = new Environment();
for (final Class<?> klass : _variables.keySet())
e.add(_variables.get(klass), klass);
for (final Object var : variables)
e.add(var);
return e;
}
protected void add(Object variable) {
add(variable, variable.getClass());
}
protected <T> void add(Object variable, Class<T> klass) {
if (_variables.containsKey(klass))
throw new ConfigurationException(
"Current environment already contains an instance of class '%s'", klass);
_variables.put(klass, klass.cast(variable));
}
}