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.

ListenerList.java 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright (C) 2010, Google Inc. and others
  3. *
  4. * This program and the accompanying materials are made available under the
  5. * terms of the Eclipse Distribution License v. 1.0 which is available at
  6. * https://www.eclipse.org/org/documents/edl-v10.php.
  7. *
  8. * SPDX-License-Identifier: BSD-3-Clause
  9. */
  10. package org.eclipse.jgit.events;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.concurrent.ConcurrentHashMap;
  14. import java.util.concurrent.CopyOnWriteArrayList;
  15. /**
  16. * Manages a thread-safe list of {@link org.eclipse.jgit.events.RepositoryListener}s.
  17. */
  18. public class ListenerList {
  19. private final Map<Class<? extends RepositoryListener>, CopyOnWriteArrayList<ListenerHandle>> lists = new ConcurrentHashMap<>();
  20. /**
  21. * Register a {@link org.eclipse.jgit.events.WorkingTreeModifiedListener}.
  22. *
  23. * @param listener
  24. * the listener implementation.
  25. * @return handle to later remove the listener.
  26. * @since 4.9
  27. */
  28. public ListenerHandle addWorkingTreeModifiedListener(
  29. WorkingTreeModifiedListener listener) {
  30. return addListener(WorkingTreeModifiedListener.class, listener);
  31. }
  32. /**
  33. * Register an IndexChangedListener.
  34. *
  35. * @param listener
  36. * the listener implementation.
  37. * @return handle to later remove the listener.
  38. */
  39. public ListenerHandle addIndexChangedListener(IndexChangedListener listener) {
  40. return addListener(IndexChangedListener.class, listener);
  41. }
  42. /**
  43. * Register a RefsChangedListener.
  44. *
  45. * @param listener
  46. * the listener implementation.
  47. * @return handle to later remove the listener.
  48. */
  49. public ListenerHandle addRefsChangedListener(RefsChangedListener listener) {
  50. return addListener(RefsChangedListener.class, listener);
  51. }
  52. /**
  53. * Register a ConfigChangedListener.
  54. *
  55. * @param listener
  56. * the listener implementation.
  57. * @return handle to later remove the listener.
  58. */
  59. public ListenerHandle addConfigChangedListener(
  60. ConfigChangedListener listener) {
  61. return addListener(ConfigChangedListener.class, listener);
  62. }
  63. /**
  64. * Add a listener to the list.
  65. *
  66. * @param type
  67. * type of listener being registered.
  68. * @param listener
  69. * the listener instance.
  70. * @return a handle to later remove the registration, if desired.
  71. */
  72. public <T extends RepositoryListener> ListenerHandle addListener(
  73. Class<T> type, T listener) {
  74. ListenerHandle handle = new ListenerHandle(this, type, listener);
  75. add(handle);
  76. return handle;
  77. }
  78. /**
  79. * Dispatch an event to all interested listeners.
  80. * <p>
  81. * Listeners are selected by the type of listener the event delivers to.
  82. *
  83. * @param event
  84. * the event to deliver.
  85. */
  86. @SuppressWarnings("unchecked")
  87. public void dispatch(RepositoryEvent event) {
  88. List<ListenerHandle> list = lists.get(event.getListenerType());
  89. if (list != null) {
  90. for (ListenerHandle handle : list)
  91. event.dispatch(handle.listener);
  92. }
  93. }
  94. private void add(ListenerHandle handle) {
  95. List<ListenerHandle> list = lists.get(handle.type);
  96. if (list == null) {
  97. CopyOnWriteArrayList<ListenerHandle> newList;
  98. newList = new CopyOnWriteArrayList<>();
  99. list = lists.putIfAbsent(handle.type, newList);
  100. if (list == null)
  101. list = newList;
  102. }
  103. list.add(handle);
  104. }
  105. void remove(ListenerHandle handle) {
  106. List<ListenerHandle> list = lists.get(handle.type);
  107. if (list != null)
  108. list.remove(handle);
  109. }
  110. }