1 11 12 package org.eclipse.osgi.framework.eventmgr; 13 14 19 public class EventListeners { 20 24 private static final ListElement[] emptyArray = new ListElement[0]; 25 26 29 private final int initialCapacity; 30 31 40 private ListElement[] list = null; 41 42 47 private int size = 0; 48 49 54 private boolean copyOnWrite = false; 55 56 60 public EventListeners() { 61 this(10); 62 } 63 64 72 public EventListeners(int capacity) { 73 if (capacity < 1) 74 throw new IllegalArgumentException (); 75 this.initialCapacity = capacity; 76 } 77 78 88 public synchronized void addListener(Object listener, Object listenerObject) { 89 if (listener == null) { 90 throw new IllegalArgumentException (); 91 } 92 93 if (size == 0) { 94 list = new ListElement[initialCapacity]; 95 } 96 else { 97 if (copyOnWrite) { 99 copyList(size); 100 copyOnWrite = false; 101 } 102 103 for (int i = 0; i < size; i++) { 105 if (list[i].primary == listener) { 106 list[i] = new ListElement(listener, listenerObject); 107 return; 108 } 109 } 110 111 if (size == list.length) { 115 copyList(size); 116 } 117 } 118 119 list[size] = new ListElement(listener, listenerObject); 120 size++; 121 } 122 123 129 public synchronized void removeListener(Object listener) { 130 if (listener == null) { 131 throw new IllegalArgumentException (); 132 } 133 134 for (int i = 0; i < size; i++) { 135 if (list[i].primary == listener) { 136 size--; 137 if (size == 0) { 138 list = null; 139 return; 140 } 141 if (copyOnWrite) { 142 copyList(i); 143 copyOnWrite = false; 144 } 145 else { 146 System.arraycopy(list, i + 1, list, i, size - i); 147 list[size] = null; 148 } 149 return; 150 } 151 } 152 } 153 154 157 public synchronized void removeAllListeners() { 158 159 list = null; 160 size = 0; 161 } 162 163 177 synchronized ListElement[] getListeners() { 178 if (size == 0) { 179 return emptyArray; 180 } 181 copyOnWrite = true; 182 return list; 183 } 184 185 191 private void copyList(int i) { 192 if (i > size) { 193 throw new IndexOutOfBoundsException (); 194 } 195 int capacity = (size * 3) / 2 + 1; 196 if (capacity < initialCapacity) { 197 capacity = initialCapacity; 198 } 199 ListElement[] newList = new ListElement[capacity]; 200 System.arraycopy(list, 0, newList, 0, i); 201 if (i < size) { 202 System.arraycopy(list, i + 1, newList, i, size - i); 203 } 204 list = newList; 205 } 206 207 213 static class ListElement { 214 217 final Object primary; 218 219 222 final Object companion; 223 224 229 ListElement(final Object primary, final Object companion) { 230 this.primary = primary; 231 this.companion = companion; 232 } 233 } 234 } 235 | Popular Tags |