package org.freeplane.core.extension;
import java.util.Iterator;
import java.util.Map;
/**
* Contains an extension map and utility methods to handle them.
*
* @author robert.ladstaetter
*/
public class ExtensionContainer {
private final Map<Class<? extends IExtension>, IExtension> extensions;
public ExtensionContainer(final Map<Class<? extends IExtension>, IExtension> extensions) {
super();
this.extensions = extensions;
}
public void addExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
assert(clazz.isAssignableFrom(extension.getClass()));
final IExtension oldExtension = getExtensions().put(clazz, extension);
if (oldExtension != null && !oldExtension.equals(extension)) {
getExtensions().put(clazz, oldExtension);
throw new RuntimeException("extension of class " + clazz.getName() + " already registered");
}
}
public void addExtension(final IExtension extension) {
addExtension(extension.getClass(), extension);
}
public IExtension putExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
final IExtension oldExtension = getExtensions().put(clazz, extension);
return oldExtension;
}
public IExtension putExtension(final IExtension extension) {
return putExtension(extension.getClass(), extension);
}
public boolean containsExtension(final Class<? extends IExtension> clazz) {
return extensions.containsKey(clazz);
}
public Iterator<IExtension> extensionIterator() {
return getExtensions().values().iterator();
}
@SuppressWarnings("unchecked")
public <T extends IExtension> T getExtension(final Class<T> clazz) {
return (T) getExtensions().get(clazz);
}
public Map<Class<? extends IExtension>, IExtension> getExtensions() {
return extensions;
}
@SuppressWarnings("unchecked")
public <T extends IExtension> T removeExtension(final Class<T> clazz) {
return (T) getExtensions().remove(clazz);
}
public boolean removeExtension(final IExtension extension) {
return getExtensions().remove(extension.getClass()) != null;
}
}