blob: f8cdb6b93b378e55f7f86e4a50078d400e1aaee1 [file] [log] [blame]
tom64b7aac2014-08-26 00:18:21 -07001package org.onlab.onos.net.provider;
2
tom132b58a2014-08-28 16:11:28 -07003import com.google.common.collect.ImmutableSet;
4
tom64b7aac2014-08-26 00:18:21 -07005import java.util.HashMap;
6import java.util.Map;
tom132b58a2014-08-28 16:11:28 -07007import java.util.Set;
tom64b7aac2014-08-26 00:18:21 -07008
tom64b7aac2014-08-26 00:18:21 -07009import static com.google.common.base.Preconditions.checkNotNull;
tom132b58a2014-08-28 16:11:28 -070010import static com.google.common.base.Preconditions.checkState;
tom64b7aac2014-08-26 00:18:21 -070011
12/**
tom96dfcab2014-08-28 09:26:03 -070013 * Base implementation of provider registry.
tom64b7aac2014-08-26 00:18:21 -070014 *
15 * @param <P> type of the information provider
16 * @param <S> type of the provider service
17 */
tom96dfcab2014-08-28 09:26:03 -070018public abstract class AbstractProviderRegistry<P extends Provider, S extends ProviderService<P>>
19 implements ProviderRegistry<P, S> {
tom64b7aac2014-08-26 00:18:21 -070020
tome5ec3fd2014-09-04 15:18:06 -070021 private final Map<ProviderId, P> providers = new HashMap<>();
tom64b7aac2014-08-26 00:18:21 -070022 private final Map<ProviderId, S> services = new HashMap<>();
23
24 /**
25 * Creates a new provider service bound to the specified provider.
26 *
27 * @param provider provider
28 * @return provider service
29 */
30 protected abstract S createProviderService(P provider);
31
32 @Override
33 public synchronized S register(P provider) {
34 checkNotNull(provider, "Provider cannot be null");
tom132b58a2014-08-28 16:11:28 -070035 checkState(!services.containsKey(provider.id()), "Provider %s already registered", provider.id());
tom64b7aac2014-08-26 00:18:21 -070036 S service = createProviderService(provider);
37 services.put(provider.id(), service);
tome5ec3fd2014-09-04 15:18:06 -070038 providers.put(provider.id(), provider);
tom64b7aac2014-08-26 00:18:21 -070039 return service;
40 }
41
42 @Override
43 public synchronized void unregister(P provider) {
44 checkNotNull(provider, "Provider cannot be null");
tom132b58a2014-08-28 16:11:28 -070045 S service = services.get(provider.id());
tomb1260e42014-08-26 18:39:57 -070046 if (service != null && service instanceof AbstractProviderService) {
tom64b7aac2014-08-26 00:18:21 -070047 ((AbstractProviderService) service).invalidate();
tom132b58a2014-08-28 16:11:28 -070048 services.remove(provider.id());
tome5ec3fd2014-09-04 15:18:06 -070049 providers.remove(provider.id());
tom64b7aac2014-08-26 00:18:21 -070050 }
tom64b7aac2014-08-26 00:18:21 -070051 }
tom132b58a2014-08-28 16:11:28 -070052
53 @Override
54 public synchronized Set<ProviderId> getProviders() {
55 return ImmutableSet.copyOf(services.keySet());
56 }
57
tome5ec3fd2014-09-04 15:18:06 -070058 /**
59 * Returns the provider registered with the specified provider ID.
60 *
61 * @param providerId provider identifier
62 * @return provider
63 */
64 protected synchronized P getProvider(ProviderId providerId) {
65 return providers.get(providerId);
66 }
67
tom64b7aac2014-08-26 00:18:21 -070068}