Test IRC client using RX Java and Java FX
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

ObservableParser.java 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package com.dmdirc.x.parser;
  2. import com.dmdirc.parser.events.ParserEvent;
  3. import com.dmdirc.parser.interfaces.Parser;
  4. import io.reactivex.Observable;
  5. import io.reactivex.ObservableEmitter;
  6. import net.engio.mbassy.listener.Handler;
  7. import net.engio.mbassy.listener.Listener;
  8. import net.engio.mbassy.listener.References;
  9. import org.apache.logging.log4j.LogManager;
  10. import org.apache.logging.log4j.Logger;
  11. public class ObservableParser {
  12. private static final Logger logger = LogManager.getLogger(ObservableParser.class);
  13. private final Parser parser;
  14. private Observable<ParserEvent> observable;
  15. public ObservableParser(final Parser parser) {
  16. this.parser = parser;
  17. }
  18. public Observable<ParserEvent> eventObservable() {
  19. if (observable == null) {
  20. observable = Observable.create(e -> {
  21. logger.info("Creating new observable!");
  22. CallbackListener listener = new CallbackListener(e);
  23. parser.getCallbackManager().subscribe(listener);
  24. e.setCancellable(() -> parser.getCallbackManager().unsubscribe(listener));
  25. });
  26. }
  27. return observable;
  28. }
  29. @Listener(references = References.Strong)
  30. private static final class CallbackListener {
  31. private final ObservableEmitter<ParserEvent> emitter;
  32. private CallbackListener(final ObservableEmitter<ParserEvent> emitter) {
  33. this.emitter = emitter;
  34. }
  35. @Handler
  36. public void handleEvent(final ParserEvent parserEvent) {
  37. logger.trace("Emitting event of type {}", parserEvent.getClass().getSimpleName());
  38. emitter.onNext(parserEvent);
  39. }
  40. }
  41. }