From: Maros Marsalek Date: Mon, 7 Apr 2014 12:48:15 +0000 (+0200) Subject: BUG-672 Add includeExtensions property to Xml directory persister adapter. X-Git-Tag: autorelease-tag-v20140601202136_82eb3f9~273^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=3999de580c783bb7a8b139780dbc6c9b6704b7c1 BUG-672 Add includeExtensions property to Xml directory persister adapter. This property allows to filter initial config files by extension. Property supports multiple extensions separated by ','. This property is optional, and if not present, all files are picked up regardless of their extension. Change-Id: I6029bd48fa3b576006a4409d8f19e0c4956de036 Signed-off-by: Maros Marsalek --- diff --git a/opendaylight/config/config-persister-directory-xml-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/xml/XmlDirectoryPersister.java b/opendaylight/config/config-persister-directory-xml-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/xml/XmlDirectoryPersister.java index 0ca47edf0e..ebba716e5a 100644 --- a/opendaylight/config/config-persister-directory-xml-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/xml/XmlDirectoryPersister.java +++ b/opendaylight/config/config-persister-directory-xml-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/xml/XmlDirectoryPersister.java @@ -7,6 +7,8 @@ */ package org.opendaylight.controller.config.persist.storage.directory.xml; +import com.google.common.base.Optional; +import com.google.common.io.Files; import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder; import org.opendaylight.controller.config.persist.api.Persister; import org.opendaylight.controller.config.persist.storage.file.xml.model.ConfigSnapshot; @@ -17,11 +19,13 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.File; +import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.SortedSet; import static com.google.common.base.Preconditions.checkArgument; @@ -30,10 +34,26 @@ public class XmlDirectoryPersister implements Persister { private static final Logger logger = LoggerFactory.getLogger(XmlDirectoryPersister.class); private final File storage; + private final Optional extensionsFilter; + /** + * Creates XmlDirectoryPersister that picks up all files in specified folder + */ public XmlDirectoryPersister(File storage) { + this(storage, Optional.absent()); + } + + /** + * Creates XmlDirectoryPersister that picks up files only with specified file extension + */ + public XmlDirectoryPersister(File storage, Set fileExtensions) { + this(storage, Optional.of(getFilter(fileExtensions))); + } + + private XmlDirectoryPersister(File storage, Optional extensionsFilter) { checkArgument(storage.exists() && storage.isDirectory(), "Storage directory does not exist: " + storage); this.storage = storage; + this.extensionsFilter = extensionsFilter; } @Override @@ -43,7 +63,7 @@ public class XmlDirectoryPersister implements Persister { @Override public List loadLastConfigs() throws IOException { - File[] filesArray = storage.listFiles(); + File[] filesArray = extensionsFilter.isPresent() ? storage.listFiles(extensionsFilter.get()) : storage.listFiles(); if (filesArray == null || filesArray.length == 0) { return Collections.emptyList(); } @@ -96,6 +116,17 @@ public class XmlDirectoryPersister implements Persister { }; } + private static FilenameFilter getFilter(final SetfileExtensions) { + checkArgument(fileExtensions.isEmpty() == false, "No file extension provided", fileExtensions); + + return new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + String ext = Files.getFileExtension(name); + return fileExtensions.contains(ext); + } + }; + } @Override public void close() { diff --git a/opendaylight/config/config-persister-directory-xml-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/xml/XmlDirectoryStorageAdapter.java b/opendaylight/config/config-persister-directory-xml-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/xml/XmlDirectoryStorageAdapter.java index ab6fb1577c..40f8c283dd 100644 --- a/opendaylight/config/config-persister-directory-xml-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/xml/XmlDirectoryStorageAdapter.java +++ b/opendaylight/config/config-persister-directory-xml-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/xml/XmlDirectoryStorageAdapter.java @@ -9,6 +9,8 @@ package org.opendaylight.controller.config.persist.storage.directory.xml; import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import com.google.common.collect.Sets; import org.opendaylight.controller.config.persist.api.Persister; import org.opendaylight.controller.config.persist.api.PropertiesProvider; import org.opendaylight.controller.config.persist.api.StorageAdapter; @@ -16,6 +18,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.util.Set; /** * StorageAdapter that retrieves initial configuration from a directory. If multiple files are present, snapshot and @@ -25,6 +28,8 @@ public class XmlDirectoryStorageAdapter implements StorageAdapter { private static final Logger logger = LoggerFactory.getLogger(XmlDirectoryStorageAdapter.class); public static final String DIRECTORY_STORAGE_PROP = "directoryStorage"; + public static final String INCLUDE_EXT_PROP = "includeExtensions"; + private static final char EXTENSIONS_SEPARATOR = ','; @Override @@ -32,8 +37,21 @@ public class XmlDirectoryStorageAdapter implements StorageAdapter { String fileStorageProperty = propertiesProvider.getProperty(DIRECTORY_STORAGE_PROP); Preconditions.checkNotNull(fileStorageProperty, "Unable to find " + propertiesProvider.getFullKeyForReporting(DIRECTORY_STORAGE_PROP)); File storage = new File(fileStorageProperty); - logger.debug("Using {}", storage); - return new XmlDirectoryPersister(storage); + String fileExtensions = propertiesProvider.getProperty(INCLUDE_EXT_PROP); + + logger.debug("Using storage: {}", storage); + + if(fileExtensions != null) { + logger.debug("Using extensions: {}", fileExtensions); + return new XmlDirectoryPersister(storage, splitExtensions(fileExtensions)); + } else { + return new XmlDirectoryPersister(storage); + } + } + + private Set splitExtensions(String fileExtensions) { + return Sets.newHashSet(Splitter.on(EXTENSIONS_SEPARATOR).trimResults().omitEmptyStrings() + .split(fileExtensions)); } } diff --git a/opendaylight/config/config-persister-directory-xml-adapter/src/test/java/org/opendaylight/controller/config/persist/storage/directory/xml/DirectoryStorageAdapterTest.java b/opendaylight/config/config-persister-directory-xml-adapter/src/test/java/org/opendaylight/controller/config/persist/storage/directory/xml/DirectoryStorageAdapterTest.java index 8e34bc7990..b9711cb70b 100644 --- a/opendaylight/config/config-persister-directory-xml-adapter/src/test/java/org/opendaylight/controller/config/persist/storage/directory/xml/DirectoryStorageAdapterTest.java +++ b/opendaylight/config/config-persister-directory-xml-adapter/src/test/java/org/opendaylight/controller/config/persist/storage/directory/xml/DirectoryStorageAdapterTest.java @@ -12,6 +12,8 @@ import java.io.File; import java.util.Collections; import java.util.List; import java.util.SortedSet; + +import com.google.common.base.Optional; import org.junit.Test; import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder; import org.opendaylight.controller.config.persist.api.Persister; @@ -26,13 +28,21 @@ public class DirectoryStorageAdapterTest { Persister tested; Logger logger = LoggerFactory.getLogger(DirectoryStorageAdapterTest.class.toString()); - private Persister instantiatePersisterFromAdapter(File file){ + private Persister instantiatePersisterFromAdapter(File file, Optional extensions){ PropertiesProviderTest pp = new PropertiesProviderTest(); - pp.addProperty("directoryStorage",file.getPath()); + pp.addProperty(XmlDirectoryStorageAdapter.DIRECTORY_STORAGE_PROP,file.getPath()); + if(extensions.isPresent()) { + pp.addProperty(XmlDirectoryStorageAdapter.INCLUDE_EXT_PROP, extensions.get()); + } + XmlDirectoryStorageAdapter dsa = new XmlDirectoryStorageAdapter(); return dsa.instantiate(pp); } + private Persister instantiatePersisterFromAdapter(File file){ + return instantiatePersisterFromAdapter(file, Optional.absent()); + } + @Test public void testEmptyDirectory() throws Exception { File folder = new File("target/emptyFolder"); @@ -69,15 +79,22 @@ public class DirectoryStorageAdapterTest { @Test public void testOneFile() throws Exception { File folder = getFolder("oneFile"); - tested = instantiatePersisterFromAdapter(folder); + tested = instantiatePersisterFromAdapter(folder, Optional.of("xml")); - logger.info("Testing : "+tested.toString()); + logger.info("Testing : " + tested.toString()); List results = tested.loadLastConfigs(); assertEquals(1, results.size()); ConfigSnapshotHolder result = results.get(0); assertResult(result, "1", "cap1&rev", "cap2", "capa a"); } + @Test + public void testOneFileWrongExtension() throws Exception { + File folder = getFolder("oneFile"); + tested = instantiatePersisterFromAdapter(folder, Optional.of("aa, bb")); + logger.info("Testing : " + tested.toString()); + } + private void assertResult(ConfigSnapshotHolder result, String s, String... caps) { assertEquals(s, result.getConfigSnapshot().replaceAll("\\s", "")); int i = 0; @@ -87,16 +104,34 @@ public class DirectoryStorageAdapterTest { } @Test - public void testTwoFiles() throws Exception { + public void testTwoFilesAllExtensions() throws Exception { File folder = getFolder("twoFiles"); tested = instantiatePersisterFromAdapter(folder); - logger.info("Testing : "+tested.toString()); + logger.info("Testing : " + tested.toString()); List results = tested.loadLastConfigs(); assertEquals(2, results.size()); assertResult(results.get(0), "1", "cap1-a", "cap2-a", "capa a-a"); assertResult(results.get(1), "2", "cap1-b", "cap2-b", "capa a-b"); + } + + @Test + public void testTwoFilesTwoExtensions() throws Exception { + File folder = getFolder("twoFiles"); + tested = instantiatePersisterFromAdapter(folder, Optional.of("xml, xml2")); + logger.info("Testing : " + tested.toString()); + assertEquals(2, tested.loadLastConfigs().size()); + } + @Test + public void testTwoFilesOnlyOneExtension() throws Exception { + File folder = getFolder("twoFiles"); + tested = instantiatePersisterFromAdapter(folder, Optional.of("xml")); + logger.info("Testing : " + tested.toString()); + List results = tested.loadLastConfigs(); + assertEquals(1, results.size()); + + assertResult(results.get(0), "1", "cap1-a", "cap2-a", "capa a-a"); } } diff --git a/opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles/controller.config2.xml b/opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles/controller.config2.xml2 similarity index 100% rename from opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles/controller.config2.xml rename to opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles/controller.config2.xml2 diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini b/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini index ea2955e34e..e91a13b9f2 100644 --- a/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini @@ -28,6 +28,8 @@ netconf.config.persister.active=1,2 # read startup configuration netconf.config.persister.1.storageAdapterClass=org.opendaylight.controller.config.persist.storage.directory.xml.XmlDirectoryStorageAdapter netconf.config.persister.1.properties.directoryStorage=configuration/initial/ +# include only xml files, files with other extensions will be skipped, multiple extensions are permitted e.g. netconf.config.persister.1.properties.includeExtensions=xml,cfg,config +netconf.config.persister.1.properties.includeExtensions=xml netconf.config.persister.1.readonly=true netconf.config.persister.2.storageAdapterClass=org.opendaylight.controller.config.persist.storage.file.xml.XmlFileStorageAdapter