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

net.mostlyoriginal.api.event.dispatcher.BasicEventDispatcher Maven / Gradle / Ivy

package net.mostlyoriginal.api.event.dispatcher;

import com.artemis.utils.Bag;
import com.artemis.utils.ImmutableBag;
import com.artemis.utils.reflect.ClassReflection;

import net.mostlyoriginal.api.event.common.Event;
import net.mostlyoriginal.api.event.common.EventDispatchStrategy;
import net.mostlyoriginal.api.event.common.EventListener;
import net.mostlyoriginal.api.utils.ReflectionHelper;
import net.mostlyoriginal.api.utils.BagUtils;

/**
 * Basic Listener registration and event dispatch.
 *
 * Horribly inefficient, brute force proof of concept
 * event dispatcher. Don't actually use this unless
 * you fire one event per hour!
 *
 * @author Daan van Yperen
 */
public class BasicEventDispatcher implements EventDispatchStrategy {

    final Bag listeners = new Bag<>(128);
	private boolean sortDirty = false;

	/** Subscribe listener to events. */
    @Override
    public void register( EventListener listener )
    {
        if ( !listeners.contains(listener) ) {
	        listeners.add(listener);
	        sortDirty =true;
        }
    }

    /**
     * Dispatch event to registered listeners.
     * Events are called on the call stack, avoid deeply nested or circular event calls.
     */
    @Override
    public void dispatch( Event event )
    {
        if ( event == null ) throw new NullPointerException("Event required.");

        // fetch relevant listeners, sorted by order.
        final ImmutableBag relevantListeners = getRelevantListeners(event);

        // iterate over applicable listeners.
        for(int i=0, s=relevantListeners.size(); i T dispatch(Class type) {
		throw new UnsupportedOperationException("This dispatcher doesn't dispatch events by type!");
	}

	@Override
	public void process() {
		// not interested in this stuff
	}

    /** Get listeners that are subscribed to the event. */
    protected ImmutableBag getRelevantListeners(Event event) {

        final Bag relevantListeners = new Bag<>();

	    // resort listeners when we need to.
	    if (sortDirty) {
		    sortDirty=false;
		    BagUtils.sort(listeners);
	    }

	    // who needs efficiency! not us!
        for(int i=0, s=listeners.size(); i




© 2015 - 2025 Weber Informatics LLC | Privacy Policy