Skip to content

Commit d48d990

Browse files
committed
1 parent cb987f3 commit d48d990

5 files changed

Lines changed: 79 additions & 34 deletions

File tree

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package act.controller.meta;
22

3+
import act.Act;
34
import act.app.App;
5+
import act.app.AppClassLoader;
6+
import act.app.event.AppEventId;
47
import act.asm.Type;
5-
import act.util.AsmTypes;
8+
import act.util.ClassInfoRepository;
9+
import act.util.ClassNode;
610
import act.util.DestroyableBase;
711
import org.osgl.util.C;
812

913
import javax.enterprise.context.ApplicationScoped;
1014
import javax.inject.Inject;
11-
import java.util.List;
1215
import java.util.Map;
1316

1417
import static act.Destroyable.Util.destroyAll;
@@ -17,52 +20,28 @@
1720
public class ControllerClassMetaInfoManager extends DestroyableBase {
1821

1922
private Map<String, ControllerClassMetaInfo> controllers = C.newMap();
20-
private Map<Type, List<ControllerClassMetaInfo>> subTypeInfo = C.newMap();
21-
private App app;
2223

2324
@Inject
2425
public ControllerClassMetaInfoManager(App app) {
25-
this.app = app;
26+
app.jobManager().on(AppEventId.APP_CODE_SCANNED, new Runnable() {
27+
@Override
28+
public void run() {
29+
buildControllerHierarchies();
30+
}
31+
});
2632
}
2733

2834
@Override
2935
protected void releaseResources() {
3036
destroyAll(controllers.values(), ApplicationScoped.class);
3137
controllers.clear();
32-
for (List<ControllerClassMetaInfo> l : subTypeInfo.values()) {
33-
destroyAll(l);
34-
}
35-
subTypeInfo.clear();
3638
super.releaseResources();
3739
}
3840

3941
public void registerControllerMetaInfo(ControllerClassMetaInfo metaInfo) {
4042
String className = Type.getObjectType(metaInfo.className()).getClassName();
4143
controllers.put(className, metaInfo);
42-
if (metaInfo.isController()) {
43-
Type superType = metaInfo.superType();
44-
if (!AsmTypes.OBJECT_TYPE.equals(superType)) {
45-
ControllerClassMetaInfo superInfo = controllerMetaInfo(superType.getClassName());
46-
if (null != superInfo) {
47-
metaInfo.parent(superInfo);
48-
}
49-
List<ControllerClassMetaInfo> subTypes = subTypeInfo.get(superType);
50-
if (null == subTypes) {
51-
subTypes = C.newList();
52-
subTypeInfo.put(superType, subTypes);
53-
}
54-
subTypes.add(metaInfo);
55-
}
56-
}
57-
List<ControllerClassMetaInfo> subTypes = subTypeInfo.get(metaInfo.type());
58-
if (null != subTypes) {
59-
for (ControllerClassMetaInfo subTypeInfo : subTypes) {
60-
subTypeInfo.parent(metaInfo);
61-
}
62-
subTypeInfo.remove(metaInfo.type());
63-
}
64-
app.eventBus().trigger(new ControllerMetaInfoRegistered(metaInfo));
65-
App.logger.trace("Controller meta info registered for: %s", className);
44+
App.LOGGER.trace("Controller meta info registered for: %s", className);
6645
}
6746

6847
public ControllerClassMetaInfo controllerMetaInfo(String className) {
@@ -75,4 +54,31 @@ public void mergeActionMetaInfo(App app) {
7554
}
7655
}
7756

57+
public void buildControllerHierarchies() {
58+
AppClassLoader cl = Act.app().classLoader();
59+
ControllerClassMetaInfoManager manager = cl.controllerClassMetaInfoManager();
60+
ClassInfoRepository repo = cl.classInfoRepository();
61+
for (ControllerClassMetaInfo info : manager.controllers.values()) {
62+
buildSuperClassMetaInfo(info, manager, repo);
63+
}
64+
}
65+
66+
private static void buildSuperClassMetaInfo(ControllerClassMetaInfo info, ControllerClassMetaInfoManager manager, ClassInfoRepository repo) {
67+
String className = info.className();
68+
ClassNode node = repo.node(className);
69+
if (null == node) {
70+
return;
71+
}
72+
ClassNode parent = node.parent();
73+
final String OBJECT = Object.class.getName();
74+
while (null != parent && !OBJECT.equals(parent.name())) {
75+
ControllerClassMetaInfo parentInfo = manager.controllerMetaInfo(parent.name());
76+
if (null != parentInfo) {
77+
info.parent(parentInfo);
78+
break;
79+
}
80+
parent = parent.parent();
81+
}
82+
}
83+
7884
}

src/test/java/act/controller/bytecode/ControllerByteCodeScannerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ public void verifyWithAppContextStaticNoReturnNoParam() {
166166
}
167167

168168
@Test
169+
@Ignore // moved to testapp
169170
public void testInheritedInterceptor() throws Exception {
170171
scan(ControllerWithInheritedInterceptor.class);
171172

@@ -214,6 +215,7 @@ private void scan(Class<?> c) {
214215
classLoader.preloadClassFile(base, file);
215216
}
216217
classLoader.scan();
218+
classLoader.controllerClassMetaInfoManager().buildControllerHierarchies();
217219
infoSrc.mergeActionMetaInfo(mockApp);
218220
}
219221

testapp/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<properties>
5050
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
5151
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
52-
<act.version>[1.0.1, 2.0.0)</act.version>
52+
<act.version>[1.0.1, 1.0.100)</act.version>
5353
<act.storage.version>[0.7.0, 2.0.0)</act.storage.version>
5454
<act.morphia.version>[1.0.0, 2.0.0)</act.morphia.version>
5555
<app.entry>testapp.TestApp</app.entry>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package testapp.endpoint;
2+
3+
import act.controller.Controller;
4+
import org.osgl.mvc.annotation.GetAction;
5+
6+
@Controller("/cht")
7+
public class ContextHierarchiTestBed {
8+
9+
public static class IntermediateController extends ContextHierarchiTestBed {
10+
11+
}
12+
13+
public static class Endpoint extends IntermediateController {
14+
15+
@GetAction("cht_test")
16+
public void test() {
17+
}
18+
19+
}
20+
21+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package testapp.endpoint;
2+
3+
import org.junit.Test;
4+
5+
/**
6+
* Refer to https://github.com/actframework/actframework/issues/88
7+
*/
8+
public class ContextHierarchiTest extends EndpointTester {
9+
10+
@Test
11+
public void test() throws Exception {
12+
url("/cht/cht_test");
13+
checkRespCode();
14+
}
15+
16+
}

0 commit comments

Comments
 (0)