1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.config.registry.decoration;
35
36 import info.magnolia.config.registry.DefinitionProvider;
37
38 import com.google.common.base.Objects;
39
40
41
42
43
44
45
46 public class CachingDefinitionDecorator<T> implements DefinitionDecorator<T> {
47
48 private DefinitionDecorator<T> delegate;
49
50 private DefinitionProvider<T> decorationResult;
51
52 private DefinitionProvider<T> decoratedDefinitionProvider;
53
54 private long lastDecorationTimestamp = -1;
55
56 public CachingDefinitionDecorator(DefinitionDecorator<T> delegate) {
57 this.delegate = delegate;
58 }
59
60 @Override
61 public DefinitionDecoratorMetadata metadata() {
62 return delegate.metadata();
63 }
64
65 @Override
66 public boolean appliesTo(DefinitionProvider<T> definitionProvider) {
67 return delegate.appliesTo(definitionProvider);
68 }
69
70 @Override
71 public DefinitionProvider<T> decorate(DefinitionProvider<T> definitionProvider) {
72 if (!definitionProvider.equals(decoratedDefinitionProvider) || definitionProvider.getLastModified() > lastDecorationTimestamp) {
73 this.decoratedDefinitionProvider = definitionProvider;
74 this.decorationResult = delegate.decorate(definitionProvider);
75 this.lastDecorationTimestamp = System.currentTimeMillis();
76 }
77
78 return decorationResult;
79 }
80
81 @Override
82 public String toString() {
83 return this.delegate.toString();
84 }
85
86 @Override
87 public boolean equals(Object o) {
88 if (this == o) return true;
89
90 if (!(o instanceof DefinitionDecorator)) {
91 return false;
92 }
93
94 DefinitionDecorator other = (DefinitionDecorator) o;
95 if (other instanceof CachingDefinitionDecorator) {
96 other = ((CachingDefinitionDecorator)other).delegate;
97 }
98
99 return Objects.equal(this.delegate, other);
100 }
101
102 @Override
103 public int hashCode() {
104 return Objects.hashCode(delegate);
105 }
106 }