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
68
69
70 public class GuicePlugin extends AbstractPlugin {
71
72
73 public static final String MODULE_INIT_PARAM_NAME = "cubby.guice.module";
74
75
76 private Injector injector;
77
78
79
80
81 public GuicePlugin() {
82 support(BeanDescProvider.class);
83 support(ContainerProvider.class);
84 support(RequestParserProvider.class);
85 support(PathResolverProvider.class);
86 support(ConverterProvider.class);
87 }
88
89
90
91
92 @Override
93 public void initialize(final ServletContext servletContext) {
94 final String moduleClassNames = servletContext
95 .getInitParameter(MODULE_INIT_PARAM_NAME);
96 if (moduleClassNames == null) {
97 throw new IllegalModuleException("No context parameter \""
98 + MODULE_INIT_PARAM_NAME + "\", please set Module FQCN");
99 }
100
101 final List<Module> modules = new ArrayList<Module>();
102 for (final String moduleClassName : moduleClassNames.split(",")) {
103 final Module module = createModule(moduleClassName.trim());
104 modules.add(module);
105 }
106 this.injector = Guice.createInjector(modules.toArray(new Module[0]));
107 }
108
109
110
111
112 public <S extends Provider> S getProvider(final Class<S> service) {
113 if (this.isSupport(service)) {
114 return service.cast(injector.getInstance(service));
115 } else {
116 return null;
117 }
118 }
119
120
121
122
123
124
125
126 public void setInjector(final Injector injector) {
127 this.injector = injector;
128 }
129
130
131
132
133
134
135
136
137 protected Module createModule(final String moduleClassName) {
138 final ClassLoader loader = Thread.currentThread()
139 .getContextClassLoader();
140 try {
141 final Class<?> clazz = Class.forName(moduleClassName, true, loader);
142 final Module module = Module.class.cast(clazz.newInstance());
143 return module;
144 } catch (final ClassNotFoundException e) {
145 throw new IllegalArgumentException("Illegal module "
146 + moduleClassName, e);
147 } catch (final InstantiationException e) {
148 throw new IllegalArgumentException("Illegal module "
149 + moduleClassName, e);
150 } catch (final IllegalAccessException e) {
151 throw new IllegalArgumentException("Illegal module "
152 + moduleClassName, e);
153 }
154 }
155
156 }