package org.holoeverywhere.addon;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class IAddonBasicAttacher<V extends IAddonBase<Z>, Z> implements IAddonAttacher<V> {
private final Map<Class<? extends IAddon>, V> mAddons = new HashMap<Class<? extends IAddon>, V>();
private final List<V> mAddonsList = new ArrayList<V>();
private boolean mLockAttaching = false;
private Z mObject;
public IAddonBasicAttacher(Z object) {
mObject = object;
}
@Override
@SuppressWarnings("unchecked")
public <T extends V> T addon(Class<? extends IAddon> clazz) {
T addon = (T) mAddons.get(clazz);
if (addon == null) {
if (mLockAttaching) {
throw new AttachException(mObject, clazz);
}
addon = IAddon.obtain(clazz, mObject);
if (addon == null) {
return null;
}
mAddons.put(clazz, addon);
mAddonsList.add(addon);
}
return addon;
}
@Override
public void addon(List<Class<? extends IAddon>> classes) {
if (classes == null) {
return;
}
for (int i = 0; i < classes.size(); i++) {
addon(classes.get(i));
}
}
@Override
public <T extends V> T addon(String classname) {
return addon(IAddon.makeAddonClass(classname));
}
@Override
public boolean isAddonAttached(Class<? extends IAddon> clazz) {
return mAddons.containsKey(clazz);
}
@Override
public void lockAttaching() {
mLockAttaching = true;
}
@Override
public List<Class<? extends IAddon>> obtainAddonsList() {
return new ArrayList<Class<? extends IAddon>>(mAddons.keySet());
}
@Override
public boolean performAddonAction(AddonCallback<V> callback) {
if (mAddons.size() == 0) {
return false;
}
final int size = mAddonsList.size();
callback.pre();
boolean result = false;
for (int i = 0; i < size; i++) {
result = callback.performAction(mAddonsList.get(i));
if (callback.mStopped) {
return result;
}
}
return callback.post();
}
public void reset() {
mAddons.clear();
mAddonsList.clear();
mLockAttaching = false;
}
}