* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
package org.opendaylight.controller.cluster.sharding;
-import com.google.common.base.Preconditions;
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
import java.util.ArrayList;
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.checkerframework.checker.lock.qual.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);
+ this.client = requireNonNull(client);
+ this.shardRoot = requireNonNull(shardRoot);
+
+ publisher = new DistributedShardChangePublisher(client, requireNonNull(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",
- prodPrefix, paths);
+ checkArgument(shardRoot.contains(prodPrefix), "Prefix %s is not contained under shard root", prodPrefix,
+ paths);
}
final ShardProxyProducer ret =
@Override
public synchronized void onChildAttached(final DOMDataTreeIdentifier prefix, final DOMDataTreeShard child) {
LOG.debug("{} : Child shard attached at {}", shardRoot, prefix);
- Preconditions.checkArgument(child != this, "Attempted to attach child %s onto self", this);
+ checkArgument(child != this, "Attempted to attach child %s onto self", this);
addChildShard(prefix, child);
updateProducers();
}
}
private void addChildShard(final DOMDataTreeIdentifier prefix, final DOMDataTreeShard child) {
- Preconditions.checkArgument(child instanceof WriteableDOMDataTreeShard);
+ checkArgument(child instanceof WriteableDOMDataTreeShard);
childShards.put(prefix, new ChildShardContext(prefix, (WriteableDOMDataTreeShard) child));
}
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();
- }
- }
-
}