Remove yang-test
[controller.git] / opendaylight / config / config-persister-directory-xml-adapter / src / main / java / org / opendaylight / controller / config / persist / storage / directory / xml / XmlDirectoryPersister.java
index 92bf080662b1bc0ecc89e6427b5a0ad1cb8f63ce..da4fbfbd2303b9749b186ae86d2fdf0529d1c454 100644 (file)
@@ -8,8 +8,10 @@
 package org.opendaylight.controller.config.persist.storage.directory.xml;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.base.Optional;
 import com.google.common.io.Files;
+
 import java.io.File;
 import java.io.FilenameFilter;
 import java.io.IOException;
@@ -19,9 +21,15 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.SortedSet;
+
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.stream.StreamSource;
+
 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;
@@ -35,14 +43,14 @@ public class XmlDirectoryPersister implements Persister {
     private final Optional<FilenameFilter> extensionsFilter;
 
     /**
-     * Creates XmlDirectoryPersister that picks up all files in specified folder
+     * Creates XmlDirectoryPersister that picks up all files in specified folder.
      */
     public XmlDirectoryPersister(final File storage) {
         this(storage, Optional.<FilenameFilter>absent());
     }
 
     /**
-     * Creates XmlDirectoryPersister that picks up files only with specified file extension
+     * Creates XmlDirectoryPersister that picks up files only with specified file extension.
      */
     public XmlDirectoryPersister(final File storage, final Set<String> fileExtensions) {
         this(storage, Optional.of(getFilter(fileExtensions)));
@@ -61,7 +69,8 @@ public class XmlDirectoryPersister implements Persister {
 
     @Override
     public List<ConfigSnapshotHolder> loadLastConfigs() throws IOException {
-        File[] filesArray = extensionsFilter.isPresent() ? storage.listFiles(extensionsFilter.get()) : storage.listFiles();
+        File[] filesArray =
+                extensionsFilter.isPresent() ? storage.listFiles(extensionsFilter.get()) : storage.listFiles();
         if (filesArray == null || filesArray.length == 0) {
             return Collections.emptyList();
         }
@@ -73,13 +82,13 @@ public class XmlDirectoryPersister implements Persister {
         List<ConfigSnapshotHolder> result = new ArrayList<>();
         for (File file : sortedFiles) {
             LOG.trace("Adding file '{}' to combined result", file);
-            Optional<ConfigSnapshotHolder> h = fromXmlSnapshot(file);
+            Optional<ConfigSnapshotHolder> configSnapshotHolderOptional = fromXmlSnapshot(file);
             // Ignore non valid snapshot
-            if(h.isPresent() == false) {
+            if (!configSnapshotHolderOptional.isPresent()) {
                 continue;
             }
 
-            result.add(h.get());
+            result.add(configSnapshotHolderOptional.get());
         }
         return result;
     }
@@ -87,13 +96,16 @@ public class XmlDirectoryPersister implements Persister {
     private Optional<ConfigSnapshotHolder> fromXmlSnapshot(final File file) {
         try {
             return Optional.of(loadLastConfig(file));
-        } catch (JAXBException e) {
+        } catch (final JAXBException e) {
             // In case of parse error, issue a warning, ignore and continue
             LOG.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. " +
+                    "Unable to parse configuration snapshot from {}. "
+                            + "Initial config from {} will be IGNORED in this run. ",
+                    file, file);
+            LOG.warn(
+                    "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);
+                    e);
         }
 
         return Optional.absent();
@@ -102,8 +114,15 @@ public class XmlDirectoryPersister implements Persister {
     public static ConfigSnapshotHolder loadLastConfig(final File file) throws JAXBException {
         JAXBContext jaxbContext = JAXBContext.newInstance(ConfigSnapshot.class);
         Unmarshaller um = jaxbContext.createUnmarshaller();
-
-        return asHolder((ConfigSnapshot) um.unmarshal(file));
+        XMLInputFactory xif = XMLInputFactory.newFactory();
+        xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
+        xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
+        try {
+            XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource(file));
+            return asHolder((ConfigSnapshot) um.unmarshal(xsr));
+        } catch (final XMLStreamException e) {
+            throw new JAXBException(e);
+        }
     }
 
     private static ConfigSnapshotHolder asHolder(final ConfigSnapshot unmarshalled) {
@@ -125,28 +144,21 @@ public class XmlDirectoryPersister implements Persister {
         };
     }
 
-    private static FilenameFilter getFilter(final Set<String>fileExtensions) {
-        checkArgument(fileExtensions.isEmpty() == false, "No file extension provided", fileExtensions);
+    private static FilenameFilter getFilter(final Set<String> fileExtensions) {
+        checkArgument(!fileExtensions.isEmpty(), "No file extension provided", fileExtensions);
 
-        return new FilenameFilter() {
-            @Override
-            public boolean accept(final File dir, final String name) {
-                String ext = Files.getFileExtension(name);
-                return fileExtensions.contains(ext);
-            }
+        return (dir, name) -> {
+            String ext = Files.getFileExtension(name);
+            return fileExtensions.contains(ext);
         };
     }
 
     @Override
     public void close() {
-
     }
 
     @Override
     public String toString() {
-        final StringBuffer sb = new StringBuffer("XmlDirectoryPersister{");
-        sb.append("storage=").append(storage);
-        sb.append('}');
-        return sb.toString();
+        return "XmlDirectoryPersister{storage=" + storage + "}";
     }
 }
\ No newline at end of file