1 package com.atlassian.cache.impl;
2
3 import com.atlassian.cache.CachedReferenceListener;
4 import io.atlassian.util.concurrent.LazyReference;
5
6 public class ValueCachedReferenceListenerSupport<V> implements CachedReferenceListenerSupport<V>
7 {
8 private final LazyReference<Void> initReference = new LazyReference<Void>()
9 {
10 @Override
11 protected Void create() throws Exception
12 {
13 init(ValueCachedReferenceListenerSupport.this);
14 return null;
15 }
16 };
17
18 private final CachedReferenceListenerSupport<V> valueListenerSupport =
19 new LazyCachedReferenceListenerSupport<V>()
20 {
21 @Override
22 protected void init()
23 {
24 initReference.get();
25 initValue(this);
26 }
27 };
28
29 private final CachedReferenceListenerSupport<V> valuelessListenerSupport =
30 new LazyCachedReferenceListenerSupport<V>()
31 {
32 @Override
33 protected void init()
34 {
35 initReference.get();
36 initValueless(this);
37 }
38 };
39
40 protected void init(CachedReferenceListenerSupport<V> actualListenerSupport)
41 {
42 }
43
44 protected void initValue(CachedReferenceListenerSupport<V> actualListenerSupport)
45 {
46 }
47
48 protected void initValueless(CachedReferenceListenerSupport<V> actualListenerSupport)
49 {
50 }
51
52 @Override
53 public void add(final CachedReferenceListener<V> listener, final boolean includeValues)
54 {
55 if (includeValues)
56 {
57 valueListenerSupport.add(listener, true);
58 }
59 else
60 {
61 valuelessListenerSupport.add(listener, false);
62 }
63 }
64
65 @Override
66 public void remove(final CachedReferenceListener<V> listener)
67 {
68 valueListenerSupport.remove(listener);
69 valuelessListenerSupport.remove(listener);
70 }
71
72 @Override
73 public void notifyEvict(final V oldValue)
74 {
75 valueListenerSupport.notifyEvict(oldValue);
76 valuelessListenerSupport.notifyEvict(null);
77 }
78
79 @Override
80 public void notifySet(final V value)
81 {
82 valueListenerSupport.notifySet(value);
83 valuelessListenerSupport.notifySet(null);
84 }
85
86 @Override
87 public void notifyReset(final V oldValue)
88 {
89 valueListenerSupport.notifyReset(oldValue);
90 valuelessListenerSupport.notifyReset(null);
91 }
92 }