package sk.stuba.fiit.perconik.core.services.listeners;
import java.util.Set;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import sk.stuba.fiit.perconik.core.IllegalListenerClassException;
import sk.stuba.fiit.perconik.core.Listener;
import sk.stuba.fiit.perconik.utilities.reflect.accessor.StaticAccessor;
final class SuperListenerProvider extends AbstractListenerProvider {
private static final ListenerProvider instance = new SuperListenerProvider();
private final BiMap<String, Class<? extends Listener>> nameToImplementation;
private SuperListenerProvider() {
this.nameToImplementation = HashBiMap.create();
}
static ListenerProvider getInstance() {
return instance;
}
@Override
protected ClassLoader loader() {
return ClassLoader.getSystemClassLoader();
}
public <L extends Listener> L forClass(final Class<L> implementation) {
if (!this.nameToImplementation.containsValue(implementation)) {
cast(implementation);
}
try {
return StaticAccessor.ofEnumConstant(implementation, "INSTANCE").get();
} catch (Exception e) {
throw new IllegalListenerClassException(e);
}
}
public Class<? extends Listener> loadClass(final String name) throws ClassNotFoundException {
Class<? extends Listener> type = this.nameToImplementation.get(name);
if (type != null) {
return type;
}
type = cast(this.load(name));
this.nameToImplementation.put(name, type);
return type;
}
public Set<Class<? extends Listener>> classes() {
return this.nameToImplementation.values();
}
public ListenerProvider parent() {
return null;
}
}