import javax.annotation.Nonnull;
import javax.annotation.concurrent.GuardedBy;
import org.opendaylight.controller.cluster.databroker.actors.dds.DataStoreClient;
-import org.opendaylight.controller.cluster.datastore.DistributedDataStore;
+import org.opendaylight.controller.cluster.datastore.AbstractDataStore;
import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.mdsal.dom.api.DOMDataTreeShard;
import org.opendaylight.mdsal.dom.spi.shard.WriteableDOMDataTreeShard;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final Map<DOMDataTreeIdentifier, ChildShardContext> childShards = new HashMap<>();
@GuardedBy("this")
private final List<ShardProxyProducer> producers = new ArrayList<>();
- private final DistributedDataStore distributedDataStore;
- DistributedShardFrontend(final DistributedDataStore distributedDataStore,
+ private final DistributedShardChangePublisher publisher;
+
+ DistributedShardFrontend(final AbstractDataStore distributedDataStore,
final DataStoreClient client,
final DOMDataTreeIdentifier shardRoot) {
- this.distributedDataStore = Preconditions.checkNotNull(distributedDataStore);
this.client = Preconditions.checkNotNull(client);
this.shardRoot = Preconditions.checkNotNull(shardRoot);
+
+ publisher = new DistributedShardChangePublisher(client, Preconditions.checkNotNull(distributedDataStore),
+ shardRoot, childShards);
}
@Override
public synchronized DOMDataTreeShardProducer createProducer(final Collection<DOMDataTreeIdentifier> paths) {
for (final DOMDataTreeIdentifier prodPrefix : paths) {
- Preconditions.checkArgument(paths.contains(prodPrefix), "Prefix %s is not contained under shard root",
+ Preconditions.checkArgument(shardRoot.contains(prodPrefix), "Prefix %s is not contained under shard root",
prodPrefix, paths);
}
continue;
}
- SubshardProducerSpecification spec = affectedSubshards.get(maybeAffected.getPrefix());
- if (spec == null) {
- spec = new SubshardProducerSpecification(maybeAffected);
- affectedSubshards.put(maybeAffected.getPrefix(), spec);
- }
+ SubshardProducerSpecification spec = affectedSubshards.computeIfAbsent(maybeAffected.getPrefix(),
+ k -> new SubshardProducerSpecification(maybeAffected));
spec.addPrefix(bindPath);
}
}
@Nonnull
@Override
- @SuppressWarnings("unchecked")
public <L extends DOMDataTreeChangeListener> ListenerRegistration<L> registerTreeChangeListener(
final YangInstanceIdentifier treeId, final L listener) {
-
- final List<PathArgument> toStrip = new ArrayList<>(shardRoot.getRootIdentifier().getPathArguments());
- final List<PathArgument> stripFrom = new ArrayList<>(treeId.getPathArguments());
-
- while (!toStrip.isEmpty()) {
- stripFrom.remove(0);
- toStrip.remove(0);
- }
-
- return (ListenerRegistration<L>) new ProxyRegistration(distributedDataStore
- .registerProxyListener(treeId, YangInstanceIdentifier.create(stripFrom), listener), listener);
+ return publisher.registerTreeChangeListener(treeId, listener);
}
-
- private static class ProxyRegistration implements ListenerRegistration<DOMDataTreeChangeListener> {
-
- private ListenerRegistration<org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener> proxy;
- private DOMDataTreeChangeListener listener;
-
- private ProxyRegistration(
- final ListenerRegistration<
- org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener> proxy,
- final DOMDataTreeChangeListener listener) {
- this.proxy = proxy;
- this.listener = listener;
- }
-
- @Override
- public DOMDataTreeChangeListener getInstance() {
- return listener;
- }
-
- @Override
- public void close() {
- proxy.close();
- }
- }
-
}