blob: 6cf91a6d9c2c03ce1d968925aaf8699dc22c176e [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;
tom7e02cda2014-09-18 12:05:46 -07004import org.onlab.onos.net.DeviceId;
tom132b58a2014-08-28 16:11:28 -07005
tom64b7aac2014-08-26 00:18:21 -07006import java.util.HashMap;
7import java.util.Map;
tom132b58a2014-08-28 16:11:28 -07008import java.util.Set;
tom64b7aac2014-08-26 00:18:21 -07009
tom64b7aac2014-08-26 00:18:21 -070010import static com.google.common.base.Preconditions.checkNotNull;
tom132b58a2014-08-28 16:11:28 -070011import static com.google.common.base.Preconditions.checkState;
tom64b7aac2014-08-26 00:18:21 -070012
13/**
tom96dfcab2014-08-28 09:26:03 -070014 * Base implementation of provider registry.
tom64b7aac2014-08-26 00:18:21 -070015 *
16 * @param <P> type of the information provider
17 * @param <S> type of the provider service
18 */
tom96dfcab2014-08-28 09:26:03 -070019public abstract class AbstractProviderRegistry<P extends Provider, S extends ProviderService<P>>
20 implements ProviderRegistry<P, S> {
tom64b7aac2014-08-26 00:18:21 -070021
tome5ec3fd2014-09-04 15:18:06 -070022 private final Map<ProviderId, P> providers = new HashMap<>();
tom64b7aac2014-08-26 00:18:21 -070023 private final Map<ProviderId, S> services = new HashMap<>();
tom7e02cda2014-09-18 12:05:46 -070024 private final Map<String, P> providersByScheme = new HashMap<>();
tom64b7aac2014-08-26 00:18:21 -070025
26 /**
27 * Creates a new provider service bound to the specified provider.
28 *
29 * @param provider provider
30 * @return provider service
31 */
32 protected abstract S createProviderService(P provider);
33
34 @Override
35 public synchronized S register(P provider) {
36 checkNotNull(provider, "Provider cannot be null");
tom132b58a2014-08-28 16:11:28 -070037 checkState(!services.containsKey(provider.id()), "Provider %s already registered", provider.id());
tom64b7aac2014-08-26 00:18:21 -070038 S service = createProviderService(provider);
39 services.put(provider.id(), service);
tome5ec3fd2014-09-04 15:18:06 -070040 providers.put(provider.id(), provider);
tom64b7aac2014-08-26 00:18:21 -070041 return service;
42 }
43
44 @Override
45 public synchronized void unregister(P provider) {
46 checkNotNull(provider, "Provider cannot be null");
tom132b58a2014-08-28 16:11:28 -070047 S service = services.get(provider.id());
tomb1260e42014-08-26 18:39:57 -070048 if (service != null && service instanceof AbstractProviderService) {
tom64b7aac2014-08-26 00:18:21 -070049 ((AbstractProviderService) service).invalidate();
tom132b58a2014-08-28 16:11:28 -070050 services.remove(provider.id());
tome5ec3fd2014-09-04 15:18:06 -070051 providers.remove(provider.id());
tom64b7aac2014-08-26 00:18:21 -070052 }
tom64b7aac2014-08-26 00:18:21 -070053 }
tom132b58a2014-08-28 16:11:28 -070054
55 @Override
56 public synchronized Set<ProviderId> getProviders() {
57 return ImmutableSet.copyOf(services.keySet());
58 }
59
tome5ec3fd2014-09-04 15:18:06 -070060 /**
61 * Returns the provider registered with the specified provider ID.
62 *
63 * @param providerId provider identifier
64 * @return provider
65 */
66 protected synchronized P getProvider(ProviderId providerId) {
67 return providers.get(providerId);
68 }
69
tom7e02cda2014-09-18 12:05:46 -070070 /**
71 * Returns the provider for the specified device ID based on URI scheme.
72 *
73 * @param deviceId device identifier
74 * @return provider bound to the URI scheme
75 */
76 protected synchronized P getProvider(DeviceId deviceId) {
77 return providersByScheme.get(deviceId.uri().getScheme());
78 }
79
tom64b7aac2014-08-26 00:18:21 -070080}