1 package org.bukkit.plugin;
3 import org.bukkit.Bukkit;
4 import org.bukkit.event.server.ServiceRegisterEvent;
5 import org.bukkit.event.server.ServiceUnregisterEvent;
7 import com.google.common.collect.ImmutableList;
8 import com.google.common.collect.ImmutableSet;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashMap;
13 import java.util.Iterator;
15 import java.util.List;
16 import java.util.NoSuchElementException;
27 private final Map<Class<?>, List<RegisteredServiceProvider<?>>> providers =
new HashMap<Class<?>, List<RegisteredServiceProvider<?>>>();
40 synchronized (providers) {
41 List<RegisteredServiceProvider<?>> registered = providers.get(service);
42 if (registered == null) {
43 registered =
new ArrayList<RegisteredServiceProvider<?>>();
44 providers.put(service, registered);
50 int position = Collections.binarySearch(registered, registeredProvider);
52 registered.add(-(position + 1), registeredProvider);
54 registered.add(position, registeredProvider);
67 ArrayList<ServiceUnregisterEvent> unregisteredEvents =
new ArrayList<ServiceUnregisterEvent>();
68 synchronized (providers) {
69 Iterator<Map.Entry<Class<?>, List<RegisteredServiceProvider<?>>>> it = providers.entrySet().iterator();
72 while (it.hasNext()) {
73 Map.Entry<Class<?>, List<RegisteredServiceProvider<?>>> entry = it.next();
74 Iterator<RegisteredServiceProvider<?>> it2 = entry.getValue().iterator();
79 while (it2.hasNext()) {
80 RegisteredServiceProvider<?> registered = it2.next();
82 if (registered.getPlugin().equals(plugin)) {
87 }
catch (NoSuchElementException e) {
91 if (entry.getValue().size() == 0) {
95 }
catch (NoSuchElementException e) {}
109 ArrayList<ServiceUnregisterEvent> unregisteredEvents =
new ArrayList<ServiceUnregisterEvent>();
110 synchronized (providers) {
111 Iterator<Map.Entry<Class<?>, List<RegisteredServiceProvider<?>>>> it = providers.entrySet().iterator();
114 while (it.hasNext()) {
115 Map.Entry<Class<?>, List<RegisteredServiceProvider<?>>> entry = it.next();
118 if (entry.getKey() != service) {
122 Iterator<RegisteredServiceProvider<?>> it2 = entry.getValue().iterator();
127 while (it2.hasNext()) {
128 RegisteredServiceProvider<?> registered = it2.next();
130 if (registered.getProvider() == provider) {
135 }
catch (NoSuchElementException e) {
139 if (entry.getValue().size() == 0) {
143 }
catch (NoSuchElementException e) {}
156 ArrayList<ServiceUnregisterEvent> unregisteredEvents =
new ArrayList<ServiceUnregisterEvent>();
157 synchronized (providers) {
158 Iterator<Map.Entry<Class<?>, List<RegisteredServiceProvider<?>>>> it = providers.entrySet().iterator();
161 while (it.hasNext()) {
162 Map.Entry<Class<?>, List<RegisteredServiceProvider<?>>> entry = it.next();
163 Iterator<RegisteredServiceProvider<?>> it2 = entry.getValue().iterator();
168 while (it2.hasNext()) {
169 RegisteredServiceProvider<?> registered = it2.next();
171 if (registered.getProvider().equals(provider)) {
176 }
catch (NoSuchElementException e) {
180 if (entry.getValue().size() == 0) {
184 }
catch (NoSuchElementException e) {}
199 public <T> T load(Class<T> service) {
200 synchronized (providers) {
201 List<RegisteredServiceProvider<?>> registered = providers.get(service);
203 if (registered == null) {
208 return service.cast(registered.get(0).getProvider());
220 @SuppressWarnings(
"unchecked")
221 public <T> RegisteredServiceProvider<T> getRegistration(Class<T> service) {
222 synchronized (providers) {
223 List<RegisteredServiceProvider<?>> registered = providers.get(service);
225 if (registered == null) {
230 return (RegisteredServiceProvider<T>) registered.get(0);
241 ImmutableList.Builder<RegisteredServiceProvider<?>> ret = ImmutableList.<RegisteredServiceProvider<?>>builder();
242 synchronized (providers) {
243 for (List<RegisteredServiceProvider<?>> registered : providers.values()) {
244 for (RegisteredServiceProvider<?> provider : registered) {
245 if (provider.getPlugin().equals(plugin)) {
262 @SuppressWarnings(
"unchecked")
263 public <T> List<RegisteredServiceProvider<T>>
getRegistrations(Class<T> service) {
265 synchronized (providers) {
266 List<RegisteredServiceProvider<?>> registered = providers.get(service);
268 if (registered == null) {
272 ret = ImmutableList.<RegisteredServiceProvider<T>>builder();
274 for (RegisteredServiceProvider<?> provider : registered) {
275 ret.add((RegisteredServiceProvider<T>) provider);
289 synchronized (providers) {
290 return ImmutableSet.<Class<?>>copyOf(providers.keySet());
301 public <T>
boolean isProvidedFor(Class<T> service) {
302 synchronized (providers) {
303 return providers.containsKey(service);