blob: a783fec7256bd15220bd9e5cc3e84591c348c18f [file] [log] [blame]
tom64b7aac2014-08-26 00:18:21 -07001package org.onlab.onos.net.provider;
2
3import java.util.HashMap;
4import java.util.Map;
5
6import static com.google.common.base.Preconditions.checkArgument;
7import static com.google.common.base.Preconditions.checkNotNull;
8
9/**
10 * Base implementation of provider broker.
11 *
12 * @param <P> type of the information provider
13 * @param <S> type of the provider service
14 */
tomd7356722014-08-26 01:07:39 -070015public abstract class AbstractProviderBroker<P extends Provider, S extends ProviderService<P>>
tom64b7aac2014-08-26 00:18:21 -070016 implements ProviderBroker<P, S> {
17
18 private final Map<ProviderId, S> services = new HashMap<>();
19
20 /**
21 * Creates a new provider service bound to the specified provider.
22 *
23 * @param provider provider
24 * @return provider service
25 */
26 protected abstract S createProviderService(P provider);
27
28 @Override
29 public synchronized S register(P provider) {
30 checkNotNull(provider, "Provider cannot be null");
31 checkArgument(!services.containsKey(provider), "Provider %s already registered", provider.id());
32 S service = createProviderService(provider);
33 services.put(provider.id(), service);
34 return service;
35 }
36
37 @Override
38 public synchronized void unregister(P provider) {
39 checkNotNull(provider, "Provider cannot be null");
40 S service = services.get(provider);
41 checkArgument(service != null, "Provider %s not registered", provider.id());
42 if (service instanceof AbstractProviderService) {
43 ((AbstractProviderService) service).invalidate();
44 }
45 services.remove(provider);
46 }
47}