Switch initial config files format to xml and add autodetect adapter for config persi...
[controller.git] / opendaylight / config / config-persister-directory-adapter / src / main / java / org / opendaylight / controller / config / persist / storage / directory / DirectoryPersister.java
index cf4ef98bdc95ecc95700d18191135191660052c1..eb8ef8cddf46c98511db67e0423b23db38893f3f 100644 (file)
@@ -8,10 +8,10 @@
 package org.opendaylight.controller.config.persist.storage.directory;
 
 import com.google.common.base.Charsets;
-import com.google.common.base.Optional;
 import com.google.common.io.Files;
 import org.apache.commons.io.IOUtils;
 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
+import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolderImpl;
 import org.opendaylight.controller.config.persist.api.Persister;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,21 +33,23 @@ public class DirectoryPersister implements Persister {
     private static final Logger logger = LoggerFactory.getLogger(DirectoryPersister.class);
     private static final Charset ENCODING = Charsets.UTF_8;
 
-    static final String MODULES_START = "//MODULES START";
+    public static final String MODULES_START = "//MODULES START";
     static final String SERVICES_START = "//SERVICES START";
     static final String CAPABILITIES_START = "//CAPABILITIES START";
 
 
     private final File storage;
-    private final String header, middle, footer;
+    private static final String header, middle, footer;
 
-    public DirectoryPersister(File storage) {
-        checkArgument(storage.exists() && storage.isDirectory(), "Storage directory does not exist: " + storage);
-        this.storage = storage;
+    static {
         header = readResource("header.txt");
         middle = readResource("middle.txt");
         footer = readResource("footer.txt");
+    }
 
+    public DirectoryPersister(File storage) {
+        checkArgument(storage.exists() && storage.isDirectory(), "Storage directory does not exist: " + storage);
+        this.storage = storage;
     }
 
     private static String readResource(String resource) {
@@ -64,30 +66,30 @@ public class DirectoryPersister implements Persister {
     }
 
     @Override
-    public Optional<ConfigSnapshotHolder> loadLastConfig() throws IOException {
+    public List<ConfigSnapshotHolder> loadLastConfigs() throws IOException {
         File[] filesArray = storage.listFiles();
-        if (filesArray.length == 0) {
-            return Optional.absent();
+        if (filesArray == null || filesArray.length == 0) {
+            return Collections.emptyList();
         }
         List<File> sortedFiles = new ArrayList<>(Arrays.asList(filesArray));
         Collections.sort(sortedFiles);
         // combine all found files
+        logger.debug("Reading files in following order: {}", sortedFiles);
 
-        SortedSet<String> combinedCapabilities = new TreeSet<>();
-        StringBuilder modulesBuilder = new StringBuilder(), servicesBuilder = new StringBuilder();
+        List<ConfigSnapshotHolder> result = new ArrayList<>();
         for (File file : sortedFiles) {
             logger.trace("Adding file '{}' to combined result", file);
 
-            final MyLineProcessor lineProcessor = new MyLineProcessor();
-            Files.readLines(file, ENCODING, lineProcessor);
-
-            modulesBuilder.append(lineProcessor.getModules());
-            servicesBuilder.append(lineProcessor.getServices());
-            combinedCapabilities.addAll(lineProcessor.getCapabilities());
+            ConfigSnapshotHolder configSnapshotHolder = loadLastConfig(file);
+            result.add(configSnapshotHolder);
         }
-        String combinedSnapshot = header + modulesBuilder.toString() + middle + servicesBuilder.toString() + footer;
-        ConfigSnapshotHolder result = new ConfigSnapshotHolderImpl(combinedSnapshot, combinedCapabilities);
-        return Optional.of(result);
+        return result;
+    }
+
+    public static ConfigSnapshotHolder loadLastConfig(File file) throws IOException {
+        final MyLineProcessor lineProcessor = new MyLineProcessor(file.getAbsolutePath());
+        Files.readLines(file, ENCODING, lineProcessor);
+        return lineProcessor.getConfigSnapshotHolder(header, middle, footer);
     }
 
 
@@ -103,11 +105,16 @@ public class DirectoryPersister implements Persister {
 }
 
 class MyLineProcessor implements com.google.common.io.LineProcessor<String> {
+    private final String fileNameForReporting;
 
     private boolean inModules, inServices, inCapabilities;
     private final StringBuffer modulesBuffer = new StringBuffer(), servicesBuilder = new StringBuffer();
     private final SortedSet<String> caps = new TreeSet<>();
 
+    MyLineProcessor(String fileNameForReporting) {
+        this.fileNameForReporting = fileNameForReporting;
+    }
+
     @Override
     public String getResult() {
         return null;
@@ -138,40 +145,33 @@ class MyLineProcessor implements com.google.common.io.LineProcessor<String> {
         return true;
     }
 
+    private void checkFileConsistency(){
+        checkState(inCapabilities, "File %s is missing delimiters in this order: %s", fileNameForReporting,
+                Arrays.asList(DirectoryPersister.MODULES_START,
+                        DirectoryPersister.SERVICES_START,
+                        DirectoryPersister.CAPABILITIES_START));
+    }
+
     String getModules() {
-        checkState(inCapabilities);
+        checkFileConsistency();
         return modulesBuffer.toString();
     }
 
     String getServices() {
-        checkState(inCapabilities);
+        checkFileConsistency();
         return servicesBuilder.toString();
     }
 
     SortedSet<String> getCapabilities() {
-        checkState(inCapabilities);
+        checkFileConsistency();
         return caps;
     }
 
-}
-
-class ConfigSnapshotHolderImpl implements ConfigSnapshotHolder {
-
-    private final String snapshot;
-    private final SortedSet<String> caps;
-
-    public ConfigSnapshotHolderImpl(String configSnapshot, SortedSet<String> capabilities) {
-        this.snapshot = configSnapshot;
-        this.caps = capabilities;
-    }
-
-    @Override
-    public String getConfigSnapshot() {
-        return snapshot;
+    ConfigSnapshotHolder getConfigSnapshotHolder(String header, String middle, String footer) {
+        String combinedSnapshot = header + getModules() + middle + getServices() + footer;
+        ConfigSnapshotHolder result = new ConfigSnapshotHolderImpl(combinedSnapshot, getCapabilities(), fileNameForReporting);
+        return result;
     }
 
-    @Override
-    public SortedSet<String> getCapabilities() {
-        return caps;
-    }
 }
+