BUG-2976: Resolve clash between current and feature cfg pusher
[controller.git] / opendaylight / config / config-persister-file-xml-adapter / src / main / java / org / opendaylight / controller / config / persist / storage / file / xml / XmlFileStorageAdapter.java
index 8bd420865cea058b89d141883028c70db1882925..a714fdc9d27dd4c1901fa1f0ef25045b82cb138b 100644 (file)
@@ -16,6 +16,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import java.util.SortedSet;
 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
 import org.opendaylight.controller.config.persist.api.Persister;
@@ -38,8 +39,23 @@ public class XmlFileStorageAdapter implements StorageAdapter, Persister {
     private static Integer numberOfStoredBackups;
     private File storage;
 
+    private static volatile XmlFileStorageAdapter instance;
+    private volatile ConfigSnapshot lastCfgSnapshotCache;
+    private volatile Optional<FeatureListProvider> featuresService = Optional.absent();
+
+    @VisibleForTesting
+    public void reset() {
+        instance = null;
+        lastCfgSnapshotCache = null;
+        featuresService = null;
+    }
+
     @Override
     public Persister instantiate(PropertiesProvider propertiesProvider) {
+        if(instance != null) {
+            return instance;
+        }
+
         File storage = extractStorageFileFromProperties(propertiesProvider);
         LOG.debug("Using file {}", storage.getAbsolutePath());
         // Create file if it does not exist
@@ -64,9 +80,23 @@ public class XmlFileStorageAdapter implements StorageAdapter, Persister {
                     + " property should be either set to positive value, or ommited. Can not be set to 0.");
         }
         setFileStorage(storage);
+
+        instance = this;
         return this;
     }
 
+    public static Optional<XmlFileStorageAdapter> getInstance() {
+        return Optional.fromNullable(instance);
+    }
+
+    public Set<String> getPersistedFeatures() {
+        return lastCfgSnapshotCache == null ? Collections.<String>emptySet() : lastCfgSnapshotCache.getFeatures();
+    }
+
+    public void setFeaturesService(final FeatureListProvider featuresService) {
+        this.featuresService = Optional.of(featuresService);
+    }
+
     @VisibleForTesting
     public void setFileStorage(File storage) {
         this.storage = storage;
@@ -95,8 +125,13 @@ public class XmlFileStorageAdapter implements StorageAdapter, Persister {
     public void persistConfig(ConfigSnapshotHolder holder) throws IOException {
         Preconditions.checkNotNull(storage, "Storage file is null");
 
+        Set<String> installedFeatureIds = Collections.emptySet();
+        if(featuresService.isPresent()) {
+            installedFeatureIds = featuresService.get().listFeatures();
+        }
+
         Config cfg = Config.fromXml(storage);
-        cfg.addConfigSnapshot(ConfigSnapshot.fromConfigSnapshot(holder), numberOfStoredBackups);
+        cfg.addConfigSnapshot(ConfigSnapshot.fromConfigSnapshot(holder, installedFeatureIds), numberOfStoredBackups);
         cfg.toXml(storage);
     }
 
@@ -111,7 +146,8 @@ public class XmlFileStorageAdapter implements StorageAdapter, Persister {
         Optional<ConfigSnapshot> lastSnapshot = Config.fromXml(storage).getLastSnapshot();
 
         if (lastSnapshot.isPresent()) {
-            return Lists.newArrayList(toConfigSnapshot(lastSnapshot.get()));
+            lastCfgSnapshotCache = lastSnapshot.get();
+            return Lists.newArrayList(toConfigSnapshot(lastCfgSnapshotCache));
         } else {
             return Collections.emptyList();
         }