1 package com.atlassian.cache.impl;
2
3 import com.atlassian.cache.CachedReferenceListener;
4 import com.atlassian.util.concurrent.LazyReference;
5
6 public class LazyCachedReferenceListenerSupport<V> implements CachedReferenceListenerSupport<V>
7 {
8 private final LazyReference<CachedReferenceListenerSupport<V>> lazyListenerSupport =
9 new LazyReference<CachedReferenceListenerSupport<V>>()
10 {
11 @Override
12 protected CachedReferenceListenerSupport<V> create() throws Exception
13 {
14 init();
15 return createDelegate();
16 }
17 };
18
19 protected void init()
20 {
21 }
22
23 protected CachedReferenceListenerSupport<V> createDelegate()
24 {
25 return new DefaultCachedReferenceListenerSupport<V>();
26 }
27
28 private CachedReferenceListenerSupport<V> loadDelegate()
29 {
30 return lazyListenerSupport.get();
31 }
32
33 private CachedReferenceListenerSupport<V> getDelegate()
34 {
35 if (lazyListenerSupport.isInitialized())
36 {
37 return lazyListenerSupport.get();
38 }
39 else
40 {
41 return CachedReferenceListenerSupport.EMPTY;
42 }
43 }
44
45 @Override
46 public void add(CachedReferenceListener<V> listener, boolean includeValues)
47 {
48 loadDelegate().add(listener, includeValues);
49 }
50
51 @Override
52 public void remove(CachedReferenceListener<V> listener)
53 {
54 getDelegate().remove(listener);
55 }
56
57 @Override
58 public void notifyEvict(V oldValue)
59 {
60 getDelegate().notifyEvict(oldValue);
61 }
62
63 @Override
64 public void notifySet(V value)
65 {
66 getDelegate().notifySet(value);
67 }
68
69 @Override
70 public void notifyReset(V oldValue)
71 {
72 getDelegate().notifyReset(oldValue);
73 }
74 }