1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.plugins.guice;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import javax.servlet.ServletContext;
22
23 import org.seasar.cubby.plugin.AbstractPlugin;
24 import org.seasar.cubby.spi.BeanDescProvider;
25 import org.seasar.cubby.spi.ContainerProvider;
26 import org.seasar.cubby.spi.ConverterProvider;
27 import org.seasar.cubby.spi.PathResolverProvider;
28 import org.seasar.cubby.spi.Provider;
29 import org.seasar.cubby.spi.RequestParserProvider;
30
31 import com.google.inject.Guice;
32 import com.google.inject.Injector;
33 import com.google.inject.Module;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 public class GuicePlugin extends AbstractPlugin {
68
69
70 public static final String MODULE_INIT_PARAM_NAME = "cubby.guice.module";
71
72
73 private Injector injector;
74
75
76
77
78 public GuicePlugin() {
79 support(BeanDescProvider.class);
80 support(ContainerProvider.class);
81 support(RequestParserProvider.class);
82 support(PathResolverProvider.class);
83 support(ConverterProvider.class);
84 }
85
86
87
88
89 @Override
90 public void initialize(final ServletContext servletContext)
91 throws Exception {
92 super.initialize(servletContext);
93 final String moduleClassNames = servletContext
94 .getInitParameter(MODULE_INIT_PARAM_NAME);
95 if (moduleClassNames == null) {
96 throw new IllegalModuleException("No context parameter \""
97 + MODULE_INIT_PARAM_NAME + "\", please set Module FQCN");
98 }
99
100 final List<Module> modules = new ArrayList<Module>();
101 for (final String moduleClassName : moduleClassNames.split(",")) {
102 final Module module = createModule(moduleClassName.trim());
103 modules.add(module);
104 }
105 this.injector = Guice.createInjector(modules);
106 }
107
108
109
110
111 public <S extends Provider> S getProvider(final Class<S> service) {
112 if (this.isSupport(service)) {
113 return service.cast(injector.getInstance(service));
114 } else {
115 return null;
116 }
117 }
118
119
120
121
122
123
124
125
126 protected Module createModule(final String moduleClassName) {
127 final ClassLoader loader = Thread.currentThread()
128 .getContextClassLoader();
129 try {
130 final Class<?> clazz = Class.forName(moduleClassName, true, loader);
131 final Module module = Module.class.cast(clazz.newInstance());
132 return module;
133 } catch (final ClassNotFoundException e) {
134 throw new IllegalArgumentException("Illegal module "
135 + moduleClassName, e);
136 } catch (final InstantiationException e) {
137 throw new IllegalArgumentException("Illegal module "
138 + moduleClassName, e);
139 } catch (final IllegalAccessException e) {
140 throw new IllegalArgumentException("Illegal module "
141 + moduleClassName, e);
142 }
143 }
144
145
146
147
148
149
150 public Injector getInjector() {
151 return injector;
152 }
153
154 }