61abe664aa9408226a9a30186f0dc0f2c75f71be
[controller.git] / opendaylight / md-sal / sal-common-impl / src / main / java / org / opendaylight / controller / md / sal / common / impl / util / AbstractLockableDelegator.java
1 package org.opendaylight.controller.md.sal.common.impl.util;
2
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;
9
10 import org.opendaylight.yangtools.concepts.Delegator;
11
12 import com.google.common.base.Preconditions;
13
14 public class AbstractLockableDelegator<T> implements Delegator<T> {
15
16     private final ReentrantReadWriteLock delegateLock = new ReentrantReadWriteLock();
17     private final ReadLock delegateReadLock = delegateLock.readLock();
18     private final WriteLock delegateWriteLock = delegateLock.writeLock();
19     
20     
21     protected Lock getDelegateReadLock() {
22         return delegateReadLock;
23     }
24
25     private T delegate;
26
27     public AbstractLockableDelegator() {
28         // NOOP
29     }
30
31     public AbstractLockableDelegator(T initialDelegate) {
32         delegate = initialDelegate;
33     }
34
35     @Override
36     public T getDelegate() {
37         try {
38             delegateReadLock.lock();
39             return delegate;
40         } finally {
41             delegateReadLock.unlock();
42         }
43     }
44
45     public T retrieveDelegate() {
46         try {
47             delegateReadLock.lock();
48             Preconditions.checkState(delegate != null,"Delegate is null");
49             return delegate;
50         } finally {
51             delegateReadLock.unlock();
52         }
53     }
54
55     /**
56      * 
57      * @param newDelegate
58      * @return oldDelegate
59      */
60     public final T changeDelegate(T newDelegate) {
61         try {
62             delegateWriteLock.lock();
63             T oldDelegate = delegate;
64             delegate = newDelegate;
65             onDelegateChanged(oldDelegate, newDelegate);
66             return oldDelegate;
67         } finally {
68             delegateWriteLock.unlock();
69         }
70     }
71     
72     
73     protected void onDelegateChanged(T oldDelegate, T newDelegate) {
74         // NOOP in abstract calss;
75     }
76 }