From: Maros Marsalek Date: Mon, 7 Apr 2014 15:28:36 +0000 (+0200) Subject: BUG-672 Make Xml directory adapter skip initial config files with invalid xml. X-Git-Tag: autorelease-tag-v20140601202136_82eb3f9~272^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=f0e885e5c9c39ffd530156460900f19fca477a39 BUG-672 Make Xml directory adapter skip initial config files with invalid xml. Issue a warning and continue to next file. Change-Id: I1950eddc80b958f5887458ebeaa53b590506c31c 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 ebba716e5a..7f8ebd7fdd 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 @@ -75,19 +75,30 @@ public class XmlDirectoryPersister implements Persister { List result = new ArrayList<>(); for (File file : sortedFiles) { logger.trace("Adding file '{}' to combined result", file); - ConfigSnapshotHolder h = fromXmlSnapshot(file); - result.add(h); + Optional h = fromXmlSnapshot(file); + // Ignore non valid snapshot + if(h.isPresent() == false) { + continue; + } + + result.add(h.get()); } return result; } - private ConfigSnapshotHolder fromXmlSnapshot(File file) { + private Optional fromXmlSnapshot(File file) { try { - return loadLastConfig(file); + return Optional.of(loadLastConfig(file)); } catch (JAXBException e) { - logger.warn("Unable to restore configuration snapshot from {}", file, e); - throw new IllegalStateException("Unable to restore configuration snapshot from " + file, e); + // In case of parse error, issue a warning, ignore and continue + logger.warn( + "Unable to parse configuration snapshot from {}. Initial config from {} will be IGNORED in this run. " + + "Note that subsequent config files may fail due to this problem. " + + "Xml markup in this file needs to be fixed, for detailed information see enclosed exception.", + file, file, e); } + + return Optional.absent(); } public static ConfigSnapshotHolder loadLastConfig(File file) throws JAXBException { 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 b9711cb70b..da442ef4b2 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 @@ -134,4 +134,15 @@ public class DirectoryStorageAdapterTest { assertResult(results.get(0), "1", "cap1-a", "cap2-a", "capa a-a"); } + @Test + public void testTwoFilesOneInvalid() throws Exception { + File folder = getFolder("twoFiles_corrupt"); + 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_corrupt/controller.config1.xml b/opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles_corrupt/controller.config1.xml new file mode 100644 index 0000000000..28f112e4fa --- /dev/null +++ b/opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles_corrupt/controller.config1.xml @@ -0,0 +1,10 @@ + + + cap1-a + cap2-a + capa a-a + + + 1 + + \ No newline at end of file diff --git a/opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles_corrupt/controller.config2.xml b/opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles_corrupt/controller.config2.xml new file mode 100644 index 0000000000..ed781d5ee2 --- /dev/null +++ b/opendaylight/config/config-persister-directory-xml-adapter/src/test/resources/twoFiles_corrupt/controller.config2.xml @@ -0,0 +1,10 @@ + + + cap1-b + cap2-b + capa a-b + + + 2 + + \ No newline at end of file