2323package org .mangorage .eventbus ;
2424
2525import it .unimi .dsi .fastutil .objects .Object2ObjectArrayMap ;
26+ import org .mangorage .eventbus .annotations .SubscribeEvent ;
2627import org .mangorage .eventbus .event .core .Event ;
28+ import org .mangorage .eventbus .event .core .GenericEvent ;
29+ import org .mangorage .eventbus .interfaces .IEvent ;
2730import org .mangorage .eventbus .interfaces .IEventBus ;
2831import org .mangorage .eventbus .interfaces .IEventType ;
32+ import org .mangorage .eventbus .interfaces .IEventTypeHandler ;
2933import org .mangorage .eventbus .interfaces .IGenericEvent ;
3034
35+ import java .lang .reflect .InvocationTargetException ;
36+ import java .lang .reflect .Method ;
37+ import java .lang .reflect .Modifier ;
3138import java .util .Map ;
32- import java .util .concurrent .Semaphore ;
3339import java .util .function .Consumer ;
3440
35- public final class EventBus <F extends IEventType <F >> implements IEventBus <F > {
41+ public final class EventBus <EE extends IEvent & IEventType < F >, GG extends IGenericEvent <?> & IEventType < F >, F extends IEventType <F >> implements IEventBus <F > {
3642
37- public static <F extends IEventType <F >> IEventBus <F > create () {
38- return new EventBus <>();
43+ public static <E extends IEvent & IEventType < F >, G extends IGenericEvent <?> & IEventType <F >, F extends IEventType < F >> IEventBus <F > create (IEventTypeHandler < E , G , F > handler , Class < F > flagType ) {
44+ return new EventBus <>(handler , flagType );
3945 }
4046
41-
4247 private final Map <EventKey <?, ?>, ListenerList <?>> LISTENERS = new Object2ObjectArrayMap <>();
43- private final Semaphore writeLock = new Semaphore (1 , true );
48+ private final IEventTypeHandler <EE , GG , F > handler ;
49+ private final Class <F > flagType ;
4450
45- private EventBus () {
51+ private EventBus (IEventTypeHandler <EE , GG , F > handler , Class <F > flagType ) {
52+ this .handler = handler ;
53+ this .flagType = flagType ;
4654 }
4755
56+
4857 @ Override
49- public <E extends Event & IEventType <F >> void addListener (int priority , Class <E > eventClass , Consumer <E > consumer ) {
58+ public <E extends IEvent & IEventType <F >> void addListener (int priority , Class <E > eventClass , Consumer <E > consumer ) {
5059 var list = getListenerList (eventClass , null );
5160 if (list != null ) list .register (priority , consumer );
5261 }
5362
5463 @ Override
55- public <E extends Event & IGenericEvent <G > & IEventType <F >, G > void addGenericListener (int priority , Class <G > baseFilterClass , Class <E > eventClass , Consumer <E > consumer ) {
64+ public <E extends IEvent & IGenericEvent <G > & IEventType <F >, G > void addGenericListener (int priority , Class <G > baseFilterClass , Class <E > eventClass , Consumer <E > consumer ) {
5665 var list = getListenerList (eventClass , baseFilterClass );
5766 if (list != null ) list .register (priority , consumer );
5867 }
5968
69+
70+ private <E extends IEvent & IGenericEvent <G > & IEventType <F >, G > void addGenericListenerCast (int priority , Class <G > baseFilterClass , Class <?> eventClass , Consumer <?> consumer ) {
71+ addGenericListener (
72+ priority ,
73+ baseFilterClass ,
74+ (Class <E >) eventClass ,
75+ (Consumer <E >) consumer
76+ );
77+ }
78+
79+
6080 @ Override
6181 public void registerClass (Class <?> clazz ) {
6282 register (clazz , null );
@@ -70,7 +90,6 @@ public void registerObject(Object object) {
7090 @ SuppressWarnings ("unchecked" )
7191 private void register (Class <?> clazz , Object instance ) {
7292 // TODO: FIX LATER
73- /**
7493 for (Method method : clazz .getDeclaredMethods ()) {
7594 var subscribeEvent = method .getDeclaredAnnotation (SubscribeEvent .class );
7695
@@ -94,9 +113,9 @@ private void register(Class<?> clazz, Object instance) {
94113 }
95114
96115 var eventClass = (Class <Event >) params [0 ].getType ();
97- if (IGenericEvent.class.isAssignableFrom(eventClass)) {
98- var genericClass = (Class<GenericEvent<Object>>) params[0].getType();
116+ if (handler .canHandle (eventClass , ListenerType .GENERIC )) {
99117 var genericType = subscribeEvent .genericType ();
118+ var genericClass = handler .castGenericClass (params [0 ].getType (), genericType );
100119 if (genericType == SubscribeEvent .NullClass .class ) {
101120 throw new IllegalStateException ("Cannot Register a GenericListener due to no GenericType being defined..." );
102121 }
@@ -109,8 +128,13 @@ private void register(Class<?> clazz, Object instance) {
109128 }
110129 };
111130
112- addGenericListener(subscribeEvent.priority(), (Class<Object>) genericType, genericClass, consumer);
113- } else {
131+ addGenericListenerCast (
132+ subscribeEvent .priority (),
133+ (Class <Object >) genericType ,
134+ genericClass ,
135+ consumer
136+ );
137+ } else if (handler .canHandle (eventClass , ListenerType .NORMAL )) {
114138 Consumer <Event > consumer = e -> {
115139 try {
116140 method .invoke (instance , e );
@@ -119,14 +143,19 @@ private void register(Class<?> clazz, Object instance) {
119143 }
120144 };
121145
122- addListener(subscribeEvent.priority(), eventClass, consumer);
146+ addListener (
147+ subscribeEvent .priority (),
148+ handler .castNormalClass (eventClass ),
149+ handler .castNormalConsumer (consumer )
150+ );
151+ } else {
152+ throw new IllegalStateException ("Cannot register Method %s with EventType of %s needs to implement %s" .formatted (method , eventClass , flagType ));
123153 }
124154 }
125- **/
126155 }
127156
128157 @ SuppressWarnings ("unchecked" )
129- private <E extends Event > ListenerList <E > getListenerList (Class <E > eventClass , Class <?> genericType ) {
158+ private <E extends IEvent > ListenerList <E > getListenerList (Class <E > eventClass , Class <?> genericType ) {
130159 var key = new EventKey <>(eventClass , genericType );
131160 var list = LISTENERS .get (key );
132161
@@ -143,7 +172,7 @@ private <E extends Event> ListenerList<E> getListenerList(Class<E> eventClass, C
143172
144173 @ Override
145174 @ SuppressWarnings ("unchecked" )
146- public <E extends Event & IEventType <F >> void post (E event ) {
175+ public <E extends IEvent & IEventType <F >> void post (E event ) {
147176 Class <?> genericType = null ;
148177 if (event instanceof IGenericEvent <?> genericEvent )
149178 genericType = genericEvent .getGenericType ();
0 commit comments