Skip to content

Commit 31051cd

Browse files
committed
automatically register genie module for public classes that name ends with Module
1 parent e520c1b commit 31051cd

File tree

5 files changed

+66
-19
lines changed

5 files changed

+66
-19
lines changed

src/main/java/act/app/App.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import act.inject.DependencyInjectionBinder;
2626
import act.inject.DependencyInjector;
2727
import act.inject.genie.GenieInjector;
28+
import act.inject.genie.GenieModuleScanner;
2829
import act.inject.param.JsonDTOClassManager;
2930
import act.inject.param.ParamValueLoaderManager;
3031
import act.job.AppJobManager;
@@ -862,6 +863,7 @@ private void loadActScanners() {
862863
}
863864

864865
private void loadBuiltInScanners() {
866+
scannerManager.register(new GenieModuleScanner());
865867
scannerManager.register(new ClassInfoByteCodeScanner());
866868
scannerManager.register(new ClassFinderByteCodeScanner());
867869
scannerManager.register(new ControllerByteCodeScanner());

src/main/java/act/inject/genie/GenieInjector.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import act.Act;
44
import act.app.App;
5+
import act.app.conf.AppConfigurator;
56
import act.app.event.AppEventId;
67
import act.controller.ActionMethodParamAnnotationHandler;
78
import act.inject.ActProviders;
@@ -45,12 +46,13 @@ protected void configure() {
4546
};
4647

4748
private volatile Genie genie;
48-
private List<Object> modules;
49+
private Set<Object> modules;
4950
private Set<Class<? extends Annotation>> injectTags = new HashSet<Class<? extends Annotation>>();
5051

5152
public GenieInjector(App app) {
5253
super(app);
53-
modules = factories().append(SCOPE_MODULE);
54+
modules = factories();
55+
modules.add(SCOPE_MODULE);
5456
}
5557

5658
@Override
@@ -106,18 +108,18 @@ public boolean subjectToInject(BeanSpec spec) {
106108
return genie().subjectToInject(spec);
107109
}
108110

109-
private C.List<Object> factories() {
111+
private C.Set<Object> factories() {
110112
Set<String> factories = GenieFactoryFinder.factories();
111113
int len = factories.size();
112-
C.List<Object> list = C.newSizedList(factories.size());
114+
C.Set<Object> set = C.newSet();
113115
if (0 == len) {
114-
return list;
116+
return set;
115117
}
116118
ClassLoader cl = App.instance().classLoader();
117119
for (String className : factories) {
118-
list.add($.classForName(className, cl));
120+
set.add($.classForName(className, cl));
119121
}
120-
return list;
122+
return set;
121123
}
122124

123125
private Genie genie() {
@@ -158,22 +160,26 @@ public Void apply(Class aClass, Provider provider) throws NotAppliedException, O
158160

159161
@SubClassFinder(callOn = AppEventId.DEPENDENCY_INJECTOR_LOADED)
160162
public static void foundModule(Class<? extends Module> moduleClass) {
161-
if (!isModuleAllowed(moduleClass)) {
162-
return;
163-
}
164-
App app = App.instance();
165-
GenieInjector genieInjector = app.injector();
166-
genieInjector.addModule($.newInstance(moduleClass));
163+
addModuleClass(moduleClass);
164+
}
165+
166+
@SubClassFinder(callOn = AppEventId.DEPENDENCY_INJECTOR_LOADED)
167+
public static void foundConfigurator(Class<? extends AppConfigurator> configurator) {
168+
addModuleClass(configurator);
167169
}
168170

169171
@AnnotatedClassFinder(value = ModuleTag.class, callOn = AppEventId.DEPENDENCY_INJECTOR_LOADED, noAbstract = false)
170172
public static void foundTaggedModule(Class<?> taggedModuleClass) {
171-
if (!isModuleAllowed(taggedModuleClass)) {
173+
addModuleClass(taggedModuleClass);
174+
}
175+
176+
public static void addModuleClass(Class<?> moduleClass) {
177+
if (!isModuleAllowed(moduleClass)) {
172178
return;
173179
}
174180
App app = App.instance();
175181
GenieInjector genieInjector = app.injector();
176-
genieInjector.addModule(taggedModuleClass);
182+
genieInjector.addModule(moduleClass);
177183
}
178184

179185
@AnnotatedClassFinder(value = LoadValue.class, noAbstract = false, callOn = AppEventId.DEPENDENCY_INJECTOR_LOADED)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package act.inject.genie;
2+
3+
import act.app.AppByteCodeScannerBase;
4+
import act.app.event.AppEventId;
5+
import act.util.ByteCodeVisitor;
6+
import org.osgl.$;
7+
8+
/**
9+
* Find all classes that ends with `Module`, try to register it as
10+
* Genie module
11+
*/
12+
public class GenieModuleScanner extends AppByteCodeScannerBase {
13+
14+
private boolean shouldRegister;
15+
16+
@Override
17+
public ByteCodeVisitor byteCodeVisitor() {
18+
return new ByteCodeVisitor() {
19+
@Override
20+
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
21+
super.visit(version, access, name, signature, superName, interfaces);
22+
shouldRegister = isPublic(access);
23+
}
24+
};
25+
}
26+
27+
@Override
28+
public void scanFinished(final String className) {
29+
if (shouldRegister) {
30+
app().jobManager().on(AppEventId.DEPENDENCY_INJECTOR_LOADED, new Runnable() {
31+
@Override
32+
public void run() {
33+
GenieInjector.addModuleClass($.classForName(className, app().classLoader()));
34+
}
35+
});
36+
}
37+
}
38+
39+
@Override
40+
protected boolean shouldScan(final String className) {
41+
return className.endsWith("Module");
42+
}
43+
}

src/main/java/act/inject/param/JsonDTO.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
*/
1010
public abstract class JsonDTO {
1111

12-
public static final String CTX_KEY = "__json_dto__";
13-
1412
private Map<String, Object> beans = new HashMap<String, Object>();
1513

1614
/**

src/main/java/act/inject/param/JsonParamValueLoader.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
class JsonParamValueLoader implements ParamValueLoader {
1919

20-
private static final String KEY_JSON_DTO = JsonDTO.CTX_KEY;
2120
private static final Provider NULL_PROVIDER = new Provider() {
2221
@Override
2322
public Object get() {
@@ -51,7 +50,6 @@ public Object load(Object bean, ActContext<?> context, boolean noDefaultValue) {
5150
if (null == dto) {
5251
return this.fallBack.load(bean, context, noDefaultValue);
5352
} else {
54-
context.attribute(KEY_JSON_DTO, dto);
5553
Object o = dto.get(spec.name());
5654
return null != o ? o : defValProvider.get();
5755
}

0 commit comments

Comments
 (0)