11package act .controller .meta ;
22
3+ import act .Act ;
34import act .app .App ;
5+ import act .app .AppClassLoader ;
6+ import act .app .event .AppEventId ;
47import act .asm .Type ;
5- import act .util .AsmTypes ;
8+ import act .util .ClassInfoRepository ;
9+ import act .util .ClassNode ;
610import act .util .DestroyableBase ;
711import org .osgl .util .C ;
812
913import javax .enterprise .context .ApplicationScoped ;
1014import javax .inject .Inject ;
11- import java .util .List ;
1215import java .util .Map ;
1316
1417import static act .Destroyable .Util .destroyAll ;
1720public 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}
0 commit comments