bug fix : if register same config factory twice (igmp and olt app will do that), and remove one, will make another factory unavailable. add a referance counter to fix it
Change-Id: I00a98f228791138fa13705bd3547a1340f4772d8
diff --git a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
index 02434b5..600b703 100644
--- a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
+++ b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
@@ -66,6 +66,7 @@
// Inventory of configuration factories
private final Map<ConfigKey, ConfigFactory> factories = Maps.newConcurrentMap();
+ private final Map<ConfigKey, Integer> factoryCounters = Maps.newConcurrentMap();
// Secondary indices to retrieve subject and config classes by keys
private final Map<String, SubjectFactory> subjectClasses = Maps.newConcurrentMap();
@@ -97,24 +98,36 @@
@SuppressWarnings("unchecked")
public void registerConfigFactory(ConfigFactory configFactory) {
checkNotNull(configFactory, NULL_FACTORY_MSG);
- factories.put(key(configFactory), configFactory);
- configClasses.put(identifier(configFactory), configFactory.configClass());
+ if (factoryCounters.containsKey(key(configFactory))) {
+ factoryCounters.replace(key(configFactory), (factoryCounters.get(key(configFactory)) + 1));
+ } else {
+ factories.put(key(configFactory), configFactory);
+ factoryCounters.put(key(configFactory), 1);
- SubjectFactory subjectFactory = configFactory.subjectFactory();
- subjectClasses.putIfAbsent(subjectFactory.subjectClassKey(), subjectFactory);
- subjectClassKeys.putIfAbsent(subjectFactory.subjectClass(), subjectFactory);
+ configClasses.put(identifier(configFactory), configFactory.configClass());
- store.addConfigFactory(configFactory);
+ SubjectFactory subjectFactory = configFactory.subjectFactory();
+ subjectClasses.putIfAbsent(subjectFactory.subjectClassKey(), subjectFactory);
+ subjectClassKeys.putIfAbsent(subjectFactory.subjectClass(), subjectFactory);
+
+ store.addConfigFactory(configFactory);
+ }
}
@Override
public void unregisterConfigFactory(ConfigFactory configFactory) {
checkNotNull(configFactory, NULL_FACTORY_MSG);
- factories.remove(key(configFactory));
- configClasses.remove(identifier(configFactory));
+ Integer factoryCounter = factoryCounters.get(key(configFactory));
+ if (factoryCounter > 1) {
+ factoryCounters.replace(key(configFactory), (factoryCounter - 1));
+ } else {
+ factoryCounters.remove(key(configFactory));
+ factories.remove(key(configFactory));
+ configClasses.remove(identifier(configFactory));
- // Note that we are deliberately not removing subject factory key bindings.
- store.removeConfigFactory(configFactory);
+ // Note that we are deliberately not removing subject factory key bindings.
+ store.removeConfigFactory(configFactory);
+ }
}
@Override