BGPCEP-710: Create Network Topology Loader
[bgpcep.git] / config-loader / config-loader-impl / src / main / java / org / opendaylight / bgpcep / config / loader / impl / ConfigLoaderImpl.java
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.protocol.bgp.config.loader.impl;
+package org.opendaylight.bgpcep.config.loader.impl;
 
 import static java.util.Objects.requireNonNull;
 
@@ -15,6 +15,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URISyntaxException;
+import java.nio.file.ClosedWatchServiceException;
 import java.nio.file.WatchEvent;
 import java.nio.file.WatchKey;
 import java.nio.file.WatchService;
@@ -26,9 +27,9 @@ import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigFileProcessor;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader;
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
@@ -57,12 +58,14 @@ public final class ConfigLoaderImpl implements ConfigLoader, AutoCloseable {
     private boolean closed = false;
 
     public ConfigLoaderImpl(final SchemaContext schemaContext, final BindingNormalizedNodeSerializer bindingSerializer,
-            final String path, final WatchService watchService) {
+            final FileWatcher fileWatcher) {
         this.schemaContext = requireNonNull(schemaContext);
         this.bindingSerializer = requireNonNull(bindingSerializer);
-        this.path = requireNonNull(path);
-        requireNonNull(watchService);
-        this.watcherThread = new Thread(new ConfigLoaderImplRunnable(watchService));
+        this.path = requireNonNull(fileWatcher.getPathFile());
+        this.watcherThread = new Thread(new ConfigLoaderImplRunnable(requireNonNull(fileWatcher.getWatchService())));
+    }
+
+    public void init() {
         this.watcherThread.start();
         LOG.info("Config Loader service initiated");
     }
@@ -85,13 +88,18 @@ public final class ConfigLoaderImpl implements ConfigLoader, AutoCloseable {
         final NormalizedNodeResult result = new NormalizedNodeResult();
         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
 
-        final InputStream resourceAsStream = new FileInputStream(new File(this.path, filename));
-        final XMLInputFactory factory = XMLInputFactory.newInstance();
-        final XMLStreamReader reader = factory.createXMLStreamReader(resourceAsStream);
-
-        final SchemaNode schemaNode = SchemaContextUtil.findDataSchemaNode(this.schemaContext, config.getSchemaPath());
-        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, this.schemaContext, schemaNode);
-        xmlParser.parse(reader);
+        try (InputStream resourceAsStream = new FileInputStream(new File(this.path, filename))) {
+            final XMLInputFactory factory = XMLInputFactory.newInstance();
+            final XMLStreamReader reader = factory.createXMLStreamReader(resourceAsStream);
+
+            final SchemaNode schemaNode = SchemaContextUtil
+                    .findDataSchemaNode(this.schemaContext, config.getSchemaPath());
+            final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, this.schemaContext, schemaNode);
+            xmlParser.parse(reader);
+            resourceAsStream.close();
+            reader.close();
+            xmlParser.close();
+        }
 
         return result.getResult();
     }
@@ -154,7 +162,7 @@ public final class ConfigLoaderImpl implements ConfigLoader, AutoCloseable {
             final WatchKey key;
             try {
                 key = watchService.take();
-            } catch (final InterruptedException e) {
+            } catch (final InterruptedException | ClosedWatchServiceException e) {
                 if (!ConfigLoaderImpl.this.closed) {
                     LOG.warn(INTERRUPTED, e);
                     Thread.currentThread().interrupt();