Fix a few deprecation warnings
[bgpcep.git] / config-loader / protocols-config-loader / src / main / java / org / opendaylight / bgpcep / config / loader / protocols / ProtocolsConfigFileProcessor.java
index e7c750bb1dbf596e88f4635a176c325cd3e20f0e..9e63a2b4e027970fa4c3acc8cf87d96119c7533a 100644 (file)
  */
 package org.opendaylight.bgpcep.config.loader.protocols;
 
-import static java.util.Objects.requireNonNull;
-
 import com.google.common.annotations.VisibleForTesting;
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import com.google.common.util.concurrent.FluentFuture;
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.bgpcep.config.loader.spi.AbstractConfigFileProcessor;
 import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.WriteTransaction;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
-import org.opendaylight.yangtools.concepts.AbstractRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
-public final class ProtocolsConfigFileProcessor implements ConfigFileProcessor, AutoCloseable {
+@Singleton
+public final class ProtocolsConfigFileProcessor extends AbstractConfigFileProcessor {
+    private static final QName NAME = QName.create(NetworkInstance.QNAME, "name").intern();
 
+    // TODO: isn't there a better place where we can get this?
     @VisibleForTesting
-    static final InstanceIdentifier<Protocols> BGP_PROTOCOLS_IID =
-            InstanceIdentifier.create(NetworkInstances.class)
-                    .child(NetworkInstance.class, new NetworkInstanceKey("global-bgp")).child(Protocols.class);
-    private static final Logger LOG = LoggerFactory.getLogger(ProtocolsConfigFileProcessor.class);
-    private static final SchemaPath PROTOCOLS_SCHEMA_PATH = SchemaPath
-            .create(true, NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME);
-    private final BindingNormalizedNodeSerializer bindingSerializer;
-    private final YangInstanceIdentifier protocolYIId;
-    private final DataBroker dataBroker;
-    private final ConfigLoader configLoader;
-    private AbstractRegistration registration;
+    static final String GLOBAL_BGP_NAME = "global-bgp";
 
-    public ProtocolsConfigFileProcessor(final ConfigLoader configLoader, final DataBroker dataBroker) {
-        requireNonNull(configLoader);
-        this.dataBroker = requireNonNull(dataBroker);
-        this.configLoader = requireNonNull(configLoader);
-        this.bindingSerializer = configLoader.getBindingNormalizedNodeSerializer();
-        this.protocolYIId = this.bindingSerializer
-                .toYangInstanceIdentifier(BGP_PROTOCOLS_IID.child(Protocol.class));
-    }
+    private static final @NonNull NodeIdentifierWithPredicates GLOBAL_BGP =
+        NodeIdentifierWithPredicates.of(NetworkInstance.QNAME, NAME, GLOBAL_BGP_NAME);
+    private static final @NonNull YangInstanceIdentifier GLOBAL_BGP_PATH = YangInstanceIdentifier.of(
+        NodeIdentifier.create(NetworkInstances.QNAME), NodeIdentifier.create(NetworkInstance.QNAME), GLOBAL_BGP);
 
-    private static void processProtocol(final Protocol protocol, final WriteTransaction wtx) {
-        final KeyedInstanceIdentifier<Protocol, ProtocolKey> topologyIIdKeyed =
-                BGP_PROTOCOLS_IID.child(Protocol.class, protocol.key());
-        wtx.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, topologyIIdKeyed, protocol);
+    @Inject
+    public ProtocolsConfigFileProcessor(final ConfigLoader configLoader, final DOMDataBroker dataBroker) {
+        super("Protocols", configLoader, dataBroker);
     }
 
-    public synchronized void init() {
-        this.registration = configLoader.registerConfigFile(this);
-        LOG.info("Protocols Loader service initiated");
+    @PostConstruct
+    public void init() {
+        start();
     }
 
+    @PreDestroy
     @Override
-    public SchemaPath getSchemaPath() {
-        return PROTOCOLS_SCHEMA_PATH;
+    public void close() {
+        stop();
     }
 
     @Override
-    public synchronized void loadConfiguration(final NormalizedNode<?, ?> dto) {
-        final ContainerNode protocolsContainer = (ContainerNode) dto;
-        final MapNode protocolList = (MapNode) protocolsContainer
-                .getChild(protocolYIId.getLastPathArgument()).get();
-        final Collection<MapEntryNode> protocolsCollection = protocolList.getValue();
-        final WriteTransaction wtx = this.dataBroker.newWriteOnlyTransaction();
-        for (final MapEntryNode protocolEntry : protocolsCollection) {
-            final Map.Entry<InstanceIdentifier<?>, DataObject> bi = this.bindingSerializer
-                    .fromNormalizedNode(this.protocolYIId, protocolEntry);
-            if (bi != null) {
-                final Protocol protocol = (Protocol) bi.getValue();
-                processProtocol(protocol, wtx);
-            }
-        }
-        try {
-            wtx.commit().get();
-        } catch (final ExecutionException | InterruptedException e) {
-            LOG.warn("Failed to create Protocol", e);
-        }
+    public Absolute fileRootSchema() {
+        return Absolute.of(NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME);
     }
 
     @Override
-    public synchronized void close() {
-        if (this.registration != null) {
-            this.registration.close();
-            this.registration = null;
+    protected FluentFuture<? extends CommitInfo> loadConfiguration(final DOMDataBroker dataBroker,
+            final NormalizedNode dto) {
+        final ContainerNode protocolsContainer = (ContainerNode) dto;
+        final MapNode protocols = (MapNode) protocolsContainer.childByArg(new NodeIdentifier(Protocol.QNAME));
+        if (protocols == null) {
+            return CommitInfo.emptyFluentFuture();
         }
+
+        final DOMDataTreeWriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
+
+        // Ensure global-bgp exists
+        wtx.merge(LogicalDatastoreType.CONFIGURATION, GLOBAL_BGP_PATH, ImmutableNodes.newMapEntryBuilder()
+            .withNodeIdentifier(GLOBAL_BGP)
+            .withChild(ImmutableNodes.leafNode(NAME, GLOBAL_BGP_NAME))
+            .build());
+        wtx.merge(LogicalDatastoreType.CONFIGURATION,
+            GLOBAL_BGP_PATH.node(Protocols.QNAME).node(protocols.name()), protocols);
+        return wtx.commit();
     }
 }