1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.onami.factoryannotation;
20
21 import java.lang.annotation.Annotation;
22 import java.util.HashMap;
23 import java.util.Map;
24
25 import com.google.inject.Key;
26 import com.google.inject.TypeLiteral;
27
28 class ProvisionCacheIdentityProviderFacade<T, A extends Annotation>
29 implements FactoryAnnotationProvider<T, A>
30 {
31
32 private final Map<Key<T>, T> provisionCache = new HashMap<Key<T>, T>();
33
34 private final FactoryAnnotationProvider<T, A> factoryAnnotationProvider;
35
36 private final TypeLiteral<T> typeLiteral;
37
38 public ProvisionCacheIdentityProviderFacade( final FactoryAnnotationProvider<T, A> factoryAnnotationProvider,
39 final TypeLiteral<T> typeLiteral )
40 {
41
42 this.factoryAnnotationProvider = factoryAnnotationProvider;
43 this.typeLiteral = typeLiteral;
44 }
45
46 public Class<T> getInjectionType()
47 {
48 return factoryAnnotationProvider.getInjectionType();
49 }
50
51 public T buildValue( A annotation )
52 {
53 final Key<T> key = buildCacheKey( typeLiteral, annotation );
54
55 if ( provisionCache.containsKey( key ) )
56 {
57 return provisionCache.get( key );
58 }
59
60 final T value = factoryAnnotationProvider.buildValue( annotation );
61 provisionCache.put( key, value );
62
63 return value;
64 }
65
66 private Key<T> buildCacheKey( final TypeLiteral<T> typeLiteral, final A annotation )
67 {
68
69 return Key.get( typeLiteral, annotation );
70 }
71
72 }