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