1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.shiro.guice;
20
21 import com.google.inject.TypeLiteral;
22 import com.google.inject.matcher.Matcher;
23 import com.google.inject.spi.InjectionListener;
24 import com.google.inject.spi.TypeEncounter;
25 import com.google.inject.spi.TypeListener;
26 import org.apache.shiro.util.Destroyable;
27 import org.apache.shiro.util.Initializable;
28
29
30 class LifecycleTypeListener implements TypeListener {
31 public static final Matcher<TypeLiteral> MATCHER = InitializableInjectionListener.MATCHER.or(DestroyableInjectionListener.MATCHER);
32 private DestroyableInjectionListener.DestroyableRegistry registry;
33
34 public LifecycleTypeListener(DestroyableInjectionListener.DestroyableRegistry registry) {
35 this.registry = registry;
36 }
37
38 public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
39 if (InitializableInjectionListener.MATCHER.matches(type)) {
40 encounter.register(this.<I>castListener(new InitializableInjectionListener<Initializable>()));
41 }
42 if (DestroyableInjectionListener.MATCHER.matches(type)) {
43 encounter.register(this.<I>castListener(new DestroyableInjectionListener<Destroyable>(registry)));
44 }
45 }
46
47 @SuppressWarnings({"unchecked"})
48 private <I> InjectionListener<? super I> castListener(InjectionListener<?> listener) {
49 return (InjectionListener<? super I>) listener;
50 }
51 }