All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.holoeverywhere.addon.IAddonBasicAttacher Maven / Gradle / Ivy

The newest version!

package org.holoeverywhere.addon;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import org.holoeverywhere.addon.IAddon.Addon;

public final class IAddonBasicAttacher, Z> implements IAddonAttacher {
    private final class AddonComparator implements Comparator {
        @Override
        public int compare(V lhs, V rhs) {
            final int i1 = getWeight(lhs.getParent());
            final int i2 = getWeight(rhs.getParent());
            return i1 > i2 ? 1 : i1 < i2 ? -1 : 0;
        }

        private int getWeight(IAddon addon) {
            if (addon.getClass().isAnnotationPresent(Addon.class)) {
                return addon.getClass().getAnnotation(Addon.class).weight();
            }
            return -1;
        }
    }

    private final Map, V> mAddons = new HashMap, V>();
    private final Set mAddonsList = new TreeSet(new AddonComparator());
    private boolean mLockAttaching = false;
    private Z mObject;

    public IAddonBasicAttacher(Z object) {
        mObject = object;
    }

    @Override
    @SuppressWarnings("unchecked")
    public  T addon(Class 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(Collection> classes) {
        if (classes == null) {
            return;
        }
        for (Class clazz : classes) {
            addon(clazz);
        }
    }

    @Override
    public  T addon(String classname) {
        return addon(IAddon.makeAddonClass(classname));
    }

    public void inhert(Collection> sourceClasses) {
        if (sourceClasses == null || sourceClasses.size() == 0) {
            return;
        }
        List> classes = new ArrayList>();
        for (Class clazz : sourceClasses) {
            if (!clazz.isAnnotationPresent(Addon.class)) {
                continue;
            }
            Addon addon = clazz.getAnnotation(Addon.class);
            if (addon.inhert()) {
                classes.add(clazz);
            }
        }
        addon(classes);
    }

    public void inhert(IAddonAttacher attacher) {
        inhert(attacher == null ? null : attacher.obtainAddonsList());
    }

    @Override
    public boolean isAddonAttached(Class clazz) {
        return mAddons.containsKey(clazz);
    }

    @Override
    public void lockAttaching() {
        mLockAttaching = true;
    }

    @Override
    public Collection> obtainAddonsList() {
        return new ArrayList>(mAddons.keySet());
    }

    @Override
    public boolean performAddonAction(AddonCallback callback) {
        if (mAddons.size() == 0) {
            return false;
        }
        callback.pre();
        boolean result = false;
        for (V addon : mAddonsList) {
            result = callback.performAction(addon);
            if (callback.mStopped) {
                return result;
            }
        }
        return callback.post();
    }

    public void reset() {
        mAddons.clear();
        mAddonsList.clear();
        mLockAttaching = false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy