From ec4f22051dc6a102e5760a8d680f75805d4d3be6 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 22 Mar 2018 13:34:56 +0100 Subject: [PATCH] Remove AbstractRegistrationTree This class has been deprecated in favor of the MDSAL version, remove it. Change-Id: I28af7908969d7969f864a4e04d454270f948a807 Signed-off-by: Robert Varga --- .../sal/dom/spi/AbstractRegistrationTree.java | 104 ------------- .../md/sal/dom/spi/RegistrationTreeNode.java | 141 ------------------ .../sal/dom/spi/RegistrationTreeSnapshot.java | 48 ------ .../sal/dom/store/impl/tree/ListenerNode.java | 2 +- .../dom/store/impl/tree/ListenerWalker.java | 2 +- 5 files changed, 2 insertions(+), 295 deletions(-) delete mode 100644 opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/AbstractRegistrationTree.java delete mode 100644 opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/RegistrationTreeNode.java delete mode 100644 opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/RegistrationTreeSnapshot.java diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/AbstractRegistrationTree.java b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/AbstractRegistrationTree.java deleted file mode 100644 index 61e8e3a939..0000000000 --- a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/AbstractRegistrationTree.java +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.md.sal.dom.spi; - -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import javax.annotation.Nonnull; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; - -/** - * An abstract tree of registrations. Allows a read-only snapshot to be taken. - * - * @param Type of registered object - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.spi.AbstractRegistrationTree} instead. - */ -@Deprecated -public abstract class AbstractRegistrationTree { - private final ReadWriteLock rwLock = new ReentrantReadWriteLock(true); - private final RegistrationTreeNode rootNode = new RegistrationTreeNode<>(null, null); - - protected AbstractRegistrationTree() { - - } - - /** - * Acquire the read-write lock. This should be done before invoking {@link #findNodeFor(Iterable)}. - */ - protected final void takeLock() { - rwLock.writeLock().lock(); - } - - /** - * Release the read-write lock. This should be done after invocation of {@link #findNodeFor(Iterable)} - * and modification of the returned node. Note that callers should do so in a finally block. - */ - protected final void releaseLock() { - rwLock.writeLock().unlock(); - } - - /** - * Find an existing, or allocate a fresh, node for a particular path. Must be called with the - * read-write lock held. - * - * @param path Path to find a node for - * @return A registration node for the specified path - */ - @Nonnull protected final RegistrationTreeNode findNodeFor(@Nonnull final Iterable path) { - RegistrationTreeNode walkNode = rootNode; - for (final PathArgument arg : path) { - walkNode = walkNode.ensureChild(arg); - } - - return walkNode; - } - - /** - * Add a registration to a particular node. The node must have been returned via {@link #findNodeFor(Iterable)} - * and the lock must still be held. - * - * @param node Tree node - * @param registration Registration instance - */ - protected final void addRegistration(@Nonnull final RegistrationTreeNode node, @Nonnull final T registration) { - node.addRegistration(registration); - } - - /** - * Remove a registration from a particular node. This method must not be called while the read-write lock - * is held. - * - * @param node Tree node - * @param registration Registration instance - */ - protected final void removeRegistration(@Nonnull final RegistrationTreeNode node, - @Nonnull final T registration) { - // Take the write lock - rwLock.writeLock().lock(); - try { - node.removeRegistration(registration); - } finally { - // Always release the lock - rwLock.writeLock().unlock(); - } - } - - /** - * Obtain a tree snapshot. This snapshot ensures a consistent view of - * registrations. The snapshot should be closed as soon as it is not required, - * because each unclosed instance blocks modification of this tree. - * - * @return A snapshot instance. - */ - @Nonnull public final RegistrationTreeSnapshot takeSnapshot() { - final RegistrationTreeSnapshot ret = new RegistrationTreeSnapshot<>(rwLock.readLock(), rootNode); - rwLock.readLock().lock(); - return ret; - } -} diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/RegistrationTreeNode.java b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/RegistrationTreeNode.java deleted file mode 100644 index 178bbe2463..0000000000 --- a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/RegistrationTreeNode.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.md.sal.dom.spi; - -import com.google.common.base.MoreObjects; -import com.google.common.base.Preconditions; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Nonnull; -import org.opendaylight.yangtools.concepts.Identifiable; -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.YangInstanceIdentifier.NodeWithValue; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This is a single node within the registration tree. Note that the data returned from - * and instance of this class is guaranteed to have any relevance or consistency - * only as long as the {@link RegistrationTreeSnapshot} instance through which it is reached - * remains unclosed. - * - * @param registration type - * @author Robert Varga - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.spi.RegistrationTreeNode} instead. - */ -@Deprecated -public final class RegistrationTreeNode implements Identifiable { - private static final Logger LOG = LoggerFactory.getLogger(RegistrationTreeNode.class); - - private final Map> children = new HashMap<>(); - private final Collection registrations = new ArrayList<>(2); - private final Collection publicRegistrations = Collections.unmodifiableCollection(registrations); - private final Reference> parent; - private final PathArgument identifier; - - RegistrationTreeNode(final RegistrationTreeNode parent, final PathArgument identifier) { - this.parent = new WeakReference<>(parent); - this.identifier = identifier; - } - - @Override - public PathArgument getIdentifier() { - return identifier; - } - - /** - * Return the child matching a {@link PathArgument} specification. - * - * @param arg Child identifier - * @return Child matching exactly, or null. - */ - public RegistrationTreeNode getExactChild(@Nonnull final PathArgument arg) { - return children.get(Preconditions.checkNotNull(arg)); - } - - /** - * Return a collection children which match a {@link PathArgument} specification inexactly. - * This explicitly excludes the child returned by {@link #getExactChild(PathArgument)}. - * - * @param arg Child identifier - * @return Collection of children, guaranteed to be non-null. - */ - public @Nonnull Collection> getInexactChildren(@Nonnull final PathArgument arg) { - Preconditions.checkNotNull(arg); - if (arg instanceof NodeWithValue || arg instanceof NodeIdentifierWithPredicates) { - /* - * TODO: This just all-or-nothing wildcards, which we have historically supported. Given - * that the argument is supposed to have all the elements filled out, we could support - * partial wildcards by iterating over the registrations and matching the maps for - * partial matches. - */ - final RegistrationTreeNode child = children.get(new NodeIdentifier(arg.getNodeType())); - if (child == null) { - return Collections.emptyList(); - } else { - return Collections.singletonList(child); - } - } else { - return Collections.emptyList(); - } - } - - public Collection getRegistrations() { - return publicRegistrations; - } - - RegistrationTreeNode ensureChild(@Nonnull final PathArgument child) { - RegistrationTreeNode potential = children.get(Preconditions.checkNotNull(child)); - if (potential == null) { - potential = new RegistrationTreeNode<>(this, child); - children.put(child, potential); - } - return potential; - } - - void addRegistration(@Nonnull final T registration) { - registrations.add(Preconditions.checkNotNull(registration)); - LOG.debug("Registration {} added", registration); - } - - void removeRegistration(@Nonnull final T registration) { - registrations.remove(Preconditions.checkNotNull(registration)); - LOG.debug("Registration {} removed", registration); - - // We have been called with the write-lock held, so we can perform some cleanup. - removeThisIfUnused(); - } - - private void removeThisIfUnused() { - final RegistrationTreeNode p = parent.get(); - if (p != null && registrations.isEmpty() && children.isEmpty()) { - p.removeChild(identifier); - } - } - - private void removeChild(final PathArgument arg) { - children.remove(arg); - removeThisIfUnused(); - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this) - .add("identifier", identifier) - .add("registrations", registrations.size()) - .add("children", children.size()).toString(); - } -} diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/RegistrationTreeSnapshot.java b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/RegistrationTreeSnapshot.java deleted file mode 100644 index d3cbdad959..0000000000 --- a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/RegistrationTreeSnapshot.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.md.sal.dom.spi; - -import com.google.common.base.Preconditions; -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.concurrent.locks.Lock; - -/** - * A stable read-only snapshot of a {@link AbstractRegistrationTree}. - * - * @author Robert Varga - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.spi.RegistrationTreeSnapshot} instead. - */ -@Deprecated -public final class RegistrationTreeSnapshot implements AutoCloseable { - @SuppressWarnings("rawtypes") - private static final AtomicIntegerFieldUpdater CLOSED_UPDATER = - AtomicIntegerFieldUpdater.newUpdater(RegistrationTreeSnapshot.class, "closed"); - private final RegistrationTreeNode node; - private final Lock lock; - - // Used via CLOSED_UPDATER - @SuppressWarnings("unused") - private volatile int closed = 0; - - RegistrationTreeSnapshot(final Lock lock, final RegistrationTreeNode node) { - this.lock = Preconditions.checkNotNull(lock); - this.node = Preconditions.checkNotNull(node); - } - - public RegistrationTreeNode getRootNode() { - return node; - } - - @Override - public void close() { - if (CLOSED_UPDATER.compareAndSet(this, 0, 1)) { - lock.unlock(); - } - } -} diff --git a/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ListenerNode.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ListenerNode.java index 00be7d68b7..fd16117cde 100644 --- a/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ListenerNode.java +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ListenerNode.java @@ -10,8 +10,8 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree; import com.google.common.base.Preconditions; import java.util.Collection; import java.util.Optional; -import org.opendaylight.controller.md.sal.dom.spi.RegistrationTreeNode; import org.opendaylight.controller.md.sal.dom.store.impl.DataChangeListenerRegistration; +import org.opendaylight.mdsal.dom.spi.RegistrationTreeNode; import org.opendaylight.yangtools.concepts.Identifiable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.tree.StoreTreeNode; diff --git a/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ListenerWalker.java b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ListenerWalker.java index f8169c4e48..7b8add9037 100644 --- a/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ListenerWalker.java +++ b/opendaylight/md-sal/sal-inmemory-datastore/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/ListenerWalker.java @@ -8,8 +8,8 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree; import com.google.common.base.Preconditions; -import org.opendaylight.controller.md.sal.dom.spi.RegistrationTreeSnapshot; import org.opendaylight.controller.md.sal.dom.store.impl.DataChangeListenerRegistration; +import org.opendaylight.mdsal.dom.spi.RegistrationTreeSnapshot; /** * A walking context, pretty much equivalent to an iterator, but it -- 2.36.6