DRSchlaubi/regnum

View on GitHub
client/src/main/kotlin/cc/hawkbot/regnum/client/event/impl/InterfacedEventManager.kt

Summary

Maintainability
A
1 hr
Test Coverage
/*
 * Regnum - A Discord bot clustering system made for Hawk
 *
 * Copyright (C) 2019  Michael Rittmeister
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see https://www.gnu.org/licenses/.
 */

package cc.hawkbot.regnum.client.event.impl

import cc.hawkbot.regnum.util.DefaultThreadFactory
import cc.hawkbot.regnum.util.logging.Logger
import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors

class InterfacedEventManager(
        override val executor: ExecutorService = Executors.newCachedThreadPool(DefaultThreadFactory("EventListeningPool"))
) : AbstractEventManager() {

    override val listeners = CopyOnWriteArrayList<Any>()
    override val registeredListeners: List<Any>
        // Make that list immutable
        get() = listeners.toList()

    override fun register(listener: Any) {
        if (listener !is EventListener) {
            throw IllegalArgumentException("Interfaced event manager only accepts EventListener implementing classes")
        }
        super.register(listener)
    }

    override fun unregister(listener: Any) {
        if (listener !is EventListener) {
            throw IllegalArgumentException("Interfaced event manager only accepts EventListener implementing classes")
        }
        super.unregister(listener)
    }

    override fun fireEvent(event: Any) {
        registeredListeners.asSequence().forEach {
            fireEvent {
                (it as EventListener).onEvent(event)
            }
        }
    }
}