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

com.syntaxphoenix.syntaxapi.event.EventCall Maven / Gradle / Ivy

package com.syntaxphoenix.syntaxapi.event;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;

import com.syntaxphoenix.syntaxapi.utils.general.Status;
import com.syntaxphoenix.syntaxapi.utils.java.Exceptions;

public final class EventCall {

    private final List executors;
    private final EventManager manager;
    private final Event event;

    public EventCall(EventManager manager, Event event, List executors) {
        this.executors = executors;
        this.manager = manager;
        this.event = event;

        Collections.sort(executors);
    }

    public final EventManager getManager() {
        return manager;
    }

    public final Event getEvent() {
        return event;
    }

    public final List getExecutors() {
        return executors;
    }

    public Status execute() {
        int count = 0;
        if (executors.isEmpty()) {
            Status status = new Status(count);
            status.done();
            return status;
        }
        LinkedHashMap> listeners = new LinkedHashMap<>();
        for (EventPriority priority : EventPriority.values()) {
            ArrayList methods = new ArrayList<>();
            for (EventExecutor executor : executors) {
                methods.addAll(executor.getMethodsByPriority(priority));
            }
            count += methods.size();
            listeners.put(priority, methods);
        }
        Status result = new Status(count);
        return event instanceof Cancelable ? callCancelable(result, listeners) : call(result, listeners);
    }

    public Status executeAsync(ExecutorService service) {
        int count = 0;
        if (executors.isEmpty()) {
            Status status = new Status(count);
            status.done();
            return status;
        }
        LinkedHashMap> listeners = new LinkedHashMap<>();
        for (EventPriority priority : EventPriority.values()) {
            ArrayList methods = new ArrayList<>();
            for (EventExecutor executor : executors) {
                methods.addAll(executor.getMethodsByPriority(priority));
            }
            count += methods.size();
            listeners.put(priority, methods);
        }

        Status result = new Status(count);
        service.submit(() -> {
            if (event instanceof Cancelable) {
                callCancelable(result, listeners);
            } else {
                call(result, listeners);
            }
        });
        return result;
    }

    private Status callCancelable(Status result, LinkedHashMap> listeners) {
        Cancelable cancel = (Cancelable) event;
        for (EventPriority priority : EventPriority.ORDERED_VALUES) {
            ArrayList methods = listeners.get(priority);
            if (methods.isEmpty()) {
                continue;
            }
            for (EventMethod method : methods) {
                if (cancel.isCancelled() && !method.ignoresCancel()) {
                    result.cancel();
                    continue;
                }
                try {
                    method.execute(event);
                    result.success();
                } catch (Throwable throwable) {
                    result.failed();
                    if (manager.hasLogger()) {
                        manager.getLogger().log(throwable);
                    } else {
                        System.out.println(Exceptions.stackTraceToString(throwable));
                    }
                }
            }
        }
        result.done();
        return result;
    }

    private Status call(Status result, LinkedHashMap> listeners) {
        for (EventPriority priority : EventPriority.ORDERED_VALUES) {
            ArrayList methods = listeners.get(priority);
            if (methods.isEmpty()) {
                continue;
            }
            for (EventMethod method : methods) {
                try {
                    method.execute(event);
                    result.success();
                } catch (Throwable throwable) {
                    result.failed();
                    if (manager.hasLogger()) {
                        manager.getLogger().log(throwable);
                    } else {
                        System.out.println(Exceptions.stackTraceToString(throwable));
                    }
                }
            }
        }
        result.done();
        return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy