1 package org.opendaylight.controller.md.sal.common.impl.util;
3 import java.util.concurrent.locks.Lock;
4 import java.util.concurrent.locks.ReadWriteLock;
5 import java.util.concurrent.locks.ReentrantLock;
6 import java.util.concurrent.locks.ReentrantReadWriteLock;
7 import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
8 import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
10 import org.opendaylight.yangtools.concepts.Delegator;
12 import com.google.common.base.Preconditions;
14 public class AbstractLockableDelegator<T> implements Delegator<T> {
16 private final ReentrantReadWriteLock delegateLock = new ReentrantReadWriteLock();
17 private final ReadLock delegateReadLock = delegateLock.readLock();
18 private final WriteLock delegateWriteLock = delegateLock.writeLock();
21 protected Lock getDelegateReadLock() {
22 return delegateReadLock;
27 public AbstractLockableDelegator() {
31 public AbstractLockableDelegator(T initialDelegate) {
32 delegate = initialDelegate;
36 public T getDelegate() {
38 delegateReadLock.lock();
41 delegateReadLock.unlock();
45 public T retrieveDelegate() {
47 delegateReadLock.lock();
48 Preconditions.checkState(delegate != null,"Delegate is null");
51 delegateReadLock.unlock();
60 public final T changeDelegate(T newDelegate) {
62 delegateWriteLock.lock();
63 T oldDelegate = delegate;
64 delegate = newDelegate;
65 onDelegateChanged(oldDelegate, newDelegate);
68 delegateWriteLock.unlock();
73 protected void onDelegateChanged(T oldDelegate, T newDelegate) {
74 // NOOP in abstract calss;