blob: a4095ea787e2dec992da0b534380f2256ddcf6ea [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);
Yuta HIGUCHI73be8452014-09-21 17:04:16 -070041 // FIXME populate scheme look-up
tom64b7aac2014-08-26 00:18:21 -070042 return service;
43 }
44
45 @Override
46 public synchronized void unregister(P provider) {
47 checkNotNull(provider, "Provider cannot be null");
tom132b58a2014-08-28 16:11:28 -070048 S service = services.get(provider.id());
tomb1260e42014-08-26 18:39:57 -070049 if (service != null && service instanceof AbstractProviderService) {
tom64b7aac2014-08-26 00:18:21 -070050 ((AbstractProviderService) service).invalidate();
tom132b58a2014-08-28 16:11:28 -070051 services.remove(provider.id());
tome5ec3fd2014-09-04 15:18:06 -070052 providers.remove(provider.id());
tom64b7aac2014-08-26 00:18:21 -070053 }
tom64b7aac2014-08-26 00:18:21 -070054 }
tom132b58a2014-08-28 16:11:28 -070055
56 @Override
57 public synchronized Set<ProviderId> getProviders() {
58 return ImmutableSet.copyOf(services.keySet());
59 }
60
tome5ec3fd2014-09-04 15:18:06 -070061 /**
62 * Returns the provider registered with the specified provider ID.
63 *
64 * @param providerId provider identifier
65 * @return provider
66 */
67 protected synchronized P getProvider(ProviderId providerId) {
68 return providers.get(providerId);
69 }
70
tom7e02cda2014-09-18 12:05:46 -070071 /**
72 * Returns the provider for the specified device ID based on URI scheme.
73 *
74 * @param deviceId device identifier
75 * @return provider bound to the URI scheme
76 */
77 protected synchronized P getProvider(DeviceId deviceId) {
78 return providersByScheme.get(deviceId.uri().getScheme());
79 }
80
tom64b7aac2014-08-26 00:18:21 -070081}