1
2
3
4
5
6
7
8
9
10 package org.mule.module.guice;
11
12 import org.mule.api.MuleContext;
13 import org.mule.api.config.ConfigurationException;
14 import org.mule.config.builders.AbstractConfigurationBuilder;
15 import org.mule.config.i18n.CoreMessages;
16 import org.mule.util.ClassUtils;
17 import org.mule.util.scan.ClasspathScanner;
18
19 import com.google.inject.Guice;
20 import com.google.inject.Injector;
21 import com.google.inject.Module;
22 import com.google.inject.Stage;
23
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.List;
27 import java.util.Set;
28
29 import org.guiceyfruit.mule.MuleModule;
30
31
32
33
34
35
36
37
38
39
40 public class GuiceConfigurationBuilder extends AbstractConfigurationBuilder
41 {
42 public static final String DEFAULT_PACKAGE = "";
43
44 protected String basepath = DEFAULT_PACKAGE;
45
46 protected Module[] modules = null;
47
48 protected Stage stage;
49
50 protected ClassLoader classLoader;
51
52 public GuiceConfigurationBuilder()
53 {
54 super();
55 classLoader = Thread.currentThread().getContextClassLoader();
56 }
57
58 public GuiceConfigurationBuilder(ClassLoader classLoader)
59 {
60 this.classLoader = classLoader;
61 }
62
63 public GuiceConfigurationBuilder(String basepath)
64 {
65 this();
66 this.basepath = basepath;
67 }
68
69 public GuiceConfigurationBuilder(String basepath, ClassLoader classLoader)
70 {
71 this.basepath = basepath;
72 this.classLoader = classLoader;
73 }
74
75 public GuiceConfigurationBuilder(Module... modules)
76 {
77 this.modules = modules;
78 }
79
80 public GuiceConfigurationBuilder(Stage stage, Module... modules)
81 {
82 this.stage = stage;
83 this.modules = modules;
84 }
85
86 @Override
87 protected void doConfigure(MuleContext muleContext) throws Exception
88 {
89
90 List<Module> allModules = getSystemModules(muleContext);
91
92 Injector injector;
93 if (basepath != null && basepath.startsWith("/"))
94 {
95 basepath = basepath.substring(1);
96 }
97
98
99
100 if (modules == null)
101 {
102 ClasspathScanner scanner = new ClasspathScanner(classLoader, basepath);
103 Set<Class<Module>> classes = scanner.scanFor(Module.class);
104 Set<Class<GuiceModuleFactory>> factories = scanner.scanFor(GuiceModuleFactory.class);
105
106 if (classes.size() == 0 && factories.size() == 0)
107 {
108 try
109 {
110 basepath = getClass().getClassLoader().getResources(basepath).toString();
111 }
112 catch (Exception e)
113 {
114 basepath = (basepath.equals("") ? "/" : basepath);
115 }
116
117 logger.warn(new ConfigurationException(CoreMessages.createStaticMessage("There are no Guice modules or module factories on the classpath under: " + basepath)));
118 return;
119 }
120
121 for (Class<Module> moduleClass : classes)
122 {
123 allModules.add(ClassUtils.instanciateClass(moduleClass, ClassUtils.NO_ARGS));
124 }
125 for (Class<GuiceModuleFactory> factoryClass : factories)
126 {
127 GuiceModuleFactory factory = ClassUtils.instanciateClass(factoryClass, ClassUtils.NO_ARGS);
128 allModules.add(factory.createModule());
129 }
130 }
131 else
132 {
133 allModules.addAll(Arrays.asList(modules));
134 }
135
136 for (Module module : allModules)
137 {
138 if (module instanceof AbstractMuleGuiceModule)
139 {
140 ((AbstractMuleGuiceModule) module).setMuleContext(muleContext);
141 }
142 }
143
144 if (stage != null)
145 {
146 injector = Guice.createInjector(stage, allModules);
147 }
148 else
149 {
150 injector = Guice.createInjector(allModules);
151 }
152
153 GuiceRegistry registry = new GuiceRegistry(injector, muleContext);
154 registry.initialise();
155 muleContext.addRegistry(registry);
156 }
157
158 protected List<Module> getSystemModules(MuleContext muleContext)
159 {
160 List<Module> systemModules = new ArrayList<Module>();
161
162 systemModules.add(new MuleModule());
163 systemModules.add(new MuleSupportModule(muleContext));
164 return systemModules;
165 }
166 }