import static java.util.Objects.requireNonNull;
-import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
-import javax.annotation.Nonnull;
-import javax.annotation.concurrent.GuardedBy;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.checkerframework.checker.lock.qual.GuardedBy;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgpcep.data.change.counter.config.rev170424.DataChangeCounterConfig;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class TopologyDataChangeCounterDeployer implements DataTreeChangeListener<DataChangeCounterConfig>,
- AutoCloseable {
+@Singleton
+@Component(service = { })
+public final class TopologyDataChangeCounterDeployer implements DataTreeChangeListener<DataChangeCounterConfig>,
+ AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(TopologyDataChangeCounterDeployer.class);
private static final InstanceIdentifier<DataChangeCounterConfig> DATA_CHANGE_COUNTER_IID =
- InstanceIdentifier.builder(DataChangeCounterConfig.class).build();
- private final DataBroker dataBroker;
+ InstanceIdentifier.builder(DataChangeCounterConfig.class).build();
+
+ private final @NonNull DataBroker dataBroker;
@GuardedBy("this")
private final Map<String, TopologyDataChangeCounter> counters = new HashMap<>();
- private ListenerRegistration<TopologyDataChangeCounterDeployer> registration;
+ @GuardedBy("this")
+ private Registration registration;
- public TopologyDataChangeCounterDeployer(final DataBroker dataBroker) {
+ @Inject
+ @Activate
+ public TopologyDataChangeCounterDeployer(@Reference final DataBroker dataBroker) {
this.dataBroker = requireNonNull(dataBroker);
+ registration = dataBroker.registerTreeChangeListener(
+ DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, DATA_CHANGE_COUNTER_IID), this);
+ LOG.info("Data change counter Deployer started");
}
- public synchronized void register() {
- this.registration = this.dataBroker.registerDataTreeChangeListener(
- new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, DATA_CHANGE_COUNTER_IID), this);
- LOG.info("Data change counter Deployer initiated");
+ @Deactivate
+ @PreDestroy
+ @Override
+ public synchronized void close() {
+ if (registration != null) {
+ registration.close();
+ registration = null;
+ }
+ counters.values().forEach(TopologyDataChangeCounter::close);
+ counters.clear();
+ LOG.info("Data change counter Deployer stopped");
}
-
@Override
- public synchronized void onDataTreeChanged(@Nonnull final Collection<DataTreeModification<DataChangeCounterConfig>> changes) {
- for (final DataTreeModification<DataChangeCounterConfig> dataTreeModification : changes) {
- final DataObjectModification<DataChangeCounterConfig> rootNode = dataTreeModification.getRootNode();
- switch (dataTreeModification.getRootNode().getModificationType()) {
+ public synchronized void onDataTreeChanged(final List<DataTreeModification<DataChangeCounterConfig>> changes) {
+ for (var change : changes) {
+ final var rootNode = change.getRootNode();
+ switch (rootNode.modificationType()) {
case DELETE:
- deleteCounterChange(rootNode.getDataBefore().getCounterId());
+ deleteCounterChange(rootNode.dataBefore().getCounterId());
break;
case SUBTREE_MODIFIED:
case WRITE:
- final DataChangeCounterConfig change = rootNode.getDataAfter();
- chandleCounterChange(change.getCounterId(), change.getTopologyName());
+ final var counterConfig = rootNode.dataAfter();
+ handleCounterChange(counterConfig.getCounterId(), counterConfig.getTopologyName());
+ break;
+ default:
+ LOG.error("Unhandled modification Type: {}", rootNode.modificationType());
break;
}
}
}
- public synchronized void deleteCounterChange(final String counterId) {
- final TopologyDataChangeCounter oldCounter = this.counters.remove(counterId);
+ private synchronized void deleteCounterChange(final String counterId) {
+ final var oldCounter = counters.remove(counterId);
if (oldCounter != null) {
LOG.info("Data change counter Deployer deleted: {}", counterId);
oldCounter.close();
}
}
- public synchronized void chandleCounterChange(final String counterId, final String topologyName) {
+ private synchronized void handleCounterChange(final String counterId, final String topologyName) {
deleteCounterChange(counterId);
LOG.info("Data change counter Deployer created: {} / {}", counterId, topologyName);
-
- final TopologyDataChangeCounter counter = new TopologyDataChangeCounter(this.dataBroker, counterId, topologyName);
- this.counters.put(counterId, counter);
- }
-
- @Override
- public synchronized void close() throws Exception {
- LOG.info("Closing Data change counter Deployer");
-
- if (this.registration != null) {
- this.registration.close();
- this.registration = null;
- }
+ counters.put(counterId, new TopologyDataChangeCounter(dataBroker, counterId, topologyName));
}
}