package ameba.feature; import ameba.container.event.ShutdownEvent; import ameba.event.Event; import ameba.event.EventBus; import ameba.event.Listener; import ameba.event.SystemEventBus; import ameba.lib.LoggerOwner; import org.glassfish.hk2.api.ServiceLocator; import javax.inject.Inject; import javax.ws.rs.core.Feature; /** * <p>Abstract AmebaFeature class.</p> * * @author icode * */ public abstract class AmebaFeature extends LoggerOwner implements Feature { private static EventBus EVENT_BUS; static { init(); } @Inject private ServiceLocator locator; private static void init() { EVENT_BUS = EventBus.createMix(); SystemEventBus.subscribe(ShutdownEvent.class, event -> { synchronized (AmebaFeature.class) { EVENT_BUS = null; } }); } private static EventBus getEventBus() { if (EVENT_BUS == null) { synchronized (AmebaFeature.class) { if (EVENT_BUS == null) { init(); } } } return EVENT_BUS; } /** * <p>publishEvent.</p> * * @param event a {@link ameba.event.Event} object. */ public static void publishEvent(Event event) { getEventBus().publish(event); } private <E extends Event> void subscribe(Class<E> eventClass, final Listener<E> listener) { getEventBus().subscribe(eventClass, listener); } /** * <p>subscribeEvent.</p> * * @param object a {@link java.lang.Object} object. * @since 0.1.6e */ public void subscribeEvent(Object object) { if (object instanceof Class) { object = locator.createAndInitialize((Class) object); } else { locator.inject(object); locator.postConstruct(object); } getEventBus().subscribe(object); } /** * <p>subscribeEvent.</p> * * @param eventClass a {@link java.lang.Class} object. * @param listener a {@link ameba.event.Listener} object. * @param <E> a E object. */ protected <E extends Event> void subscribeEvent(Class<E> eventClass, final Listener<E> listener) { locator.inject(listener); locator.postConstruct(listener); subscribe(eventClass, listener); } /** * <p>subscribeEvent.</p> * * @param eventClass a {@link java.lang.Class} object. * @param listenerClass a {@link java.lang.Class} object. * @return a {@link ameba.event.Listener} object. * @since 0.1.6e * @param <E> a E object. */ protected <E extends Event> Listener subscribeEvent(Class<E> eventClass, final Class<? extends Listener<E>> listenerClass) { Listener<E> listener = locator.createAndInitialize(listenerClass); subscribe(eventClass, listener); return listener; } /** * <p>unsubscribeEvent.</p> * * @param eventClass a {@link java.lang.Class} object. * @param listener a {@link ameba.event.Listener} object. * @param <E> a E object. */ protected <E extends Event> void unsubscribeEvent(Class<E> eventClass, final Listener<E> listener) { locator.preDestroy(listener); getEventBus().unsubscribe(eventClass, listener); } /** * <p>subscribeSystemEvent.</p> * * @param eventClass a {@link java.lang.Class} object. * @param listener a {@link ameba.event.Listener} object. * @since 0.1.6e * @param <E> a E object. */ protected <E extends Event> void subscribeSystemEvent(Class<E> eventClass, final Listener<E> listener) { locator.inject(listener); locator.postConstruct(listener); SystemEventBus.subscribe(eventClass, listener); } /** * <p>unsubscribeSystemEvent.</p> * * @param eventClass a {@link java.lang.Class} object. * @param listener a {@link ameba.event.Listener} object. * @since 0.1.6e * @param <E> a E object. */ protected <E extends Event> void unsubscribeSystemEvent(Class<E> eventClass, final Listener<E> listener) { locator.preDestroy(listener); SystemEventBus.unsubscribe(eventClass, listener); } /** * <p>subscribeSystemEvent.</p> * * @param eventClass a {@link java.lang.Class} object. * @param listenerClass a {@link java.lang.Class} object. * @return a {@link ameba.event.Listener} object. * @since 0.1.6e * @param <E> a E object. */ protected <E extends Event> Listener subscribeSystemEvent(Class<E> eventClass, final Class<? extends Listener<E>> listenerClass) { Listener<E> listener = locator.createAndInitialize(listenerClass); SystemEventBus.subscribe(eventClass, listener); return listener; } }