ProjectEventHolder.java 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package jnpf.event;
  2. import jnpf.consts.ProjectEventConst;
  3. import jnpf.module.ProjectEvent;
  4. import java.util.*;
  5. import java.util.function.Consumer;
  6. /**
  7. * 自定义事件注册
  8. */
  9. public class ProjectEventHolder {
  10. private ProjectEventHolder() {
  11. }
  12. /**
  13. * {topic:{keymatcher:consumer}}
  14. */
  15. private static final Map<String, Map<ProjectEventKeyMatcher, Consumer<ProjectEvent>>> events = new HashMap<>();
  16. /**
  17. * 添加事件处理器, 默认主题
  18. */
  19. public static void addEventListener(ProjectEventKeyMatcher keyMatcher, Consumer<ProjectEvent> consumer) {
  20. addEventListener(ProjectEventConst.DEFAULT_TOPIC_NAME, keyMatcher, consumer);
  21. }
  22. /**
  23. * 添加事件处理器
  24. */
  25. public static void addEventListener(String topic, ProjectEventKeyMatcher keyMatcher, Consumer<ProjectEvent> consumer) {
  26. Map<ProjectEventKeyMatcher, Consumer<ProjectEvent>> topicEvents = events.computeIfAbsent(topic, k -> new HashMap<>());
  27. topicEvents.put(keyMatcher, consumer);
  28. }
  29. /**
  30. * 获取事件匹配的处理器, 默认主题
  31. */
  32. public static List<Consumer<ProjectEvent>> getEventListener(ProjectEvent event) {
  33. return getEventListener(ProjectEventConst.DEFAULT_TOPIC_NAME, event);
  34. }
  35. /**
  36. * 获取事件匹配的处理器
  37. */
  38. public static List<Consumer<ProjectEvent>> getEventListener(String topic, ProjectEvent event) {
  39. Map<ProjectEventKeyMatcher, Consumer<ProjectEvent>> topicEvents = events.getOrDefault(topic, Collections.emptyMap());
  40. List<Consumer<ProjectEvent>> consumers = new ArrayList<>();
  41. for (Map.Entry<ProjectEventKeyMatcher, Consumer<ProjectEvent>> entry : topicEvents.entrySet()) {
  42. if(entry.getKey().isMatch(event)){
  43. consumers.add(entry.getValue());
  44. }
  45. }
  46. return consumers;
  47. }
  48. }