@@ -32,13 +32,14 @@ const (
3232)
3333
3434type Kernel struct {
35- config * viper.Viper
36- container * gioc.Container
37- routes map [string ]* Route
38- eventsRegistry * event_bus.EventsRegistry
39- eventBus event_bus.EventBus
40- templates * template.Template
41- httpServer * http.Server
35+ config * viper.Viper
36+ container * gioc.Container
37+ routes map [string ]* Route
38+ notFoundHandlerEventBus event_bus.EventBus // Event bus for request level events for 404 not found case. Filled with event listeners common for all routes.
39+ eventsRegistry * event_bus.EventsRegistry
40+ applicationEventBus event_bus.EventBus // Event bus for application level events
41+ templates * template.Template
42+ httpServer * http.Server
4243}
4344
4445func (k * Kernel ) GetContainer () * gioc.Container {
@@ -64,7 +65,7 @@ func (k *Kernel) GetHttpServer() *http.Server {
6465}
6566
6667func (k * Kernel ) RegisterListener (eventObj event.Event , listenerFunc interface {}, priority int ) error {
67- return k .eventBus .AppendListener (eventObj , listenerFunc , priority )
68+ return k .applicationEventBus .AppendListener (eventObj , listenerFunc , priority )
6869}
6970
7071func (k * Kernel ) RegisterListenerForRoute (routeName string , eventObj event.Event , listenerFunc interface {}, priority int ) error {
@@ -131,10 +132,10 @@ func (k *Kernel) Run() {
131132 vestigo .CustomNotFoundHandlerFunc (k .createNotFoundHandler ())
132133
133134 // Processing of application-level events
134- k .eventBus .Dispatch (event .NewApplicationLaunched (k ))
135+ k .applicationEventBus .Dispatch (event .NewApplicationLaunched (k ))
135136
136137 terminationErrors := make ([]error , 0 )
137- defer k .eventBus .Dispatch (event .NewApplicationTermination (k , & terminationErrors ))
138+ defer k .applicationEventBus .Dispatch (event .NewApplicationTermination (k , & terminationErrors ))
138139
139140 // HTTP Server setup
140141 k .httpServer .Handler = router
@@ -169,6 +170,15 @@ func (k *Kernel) readConfig() {
169170 panic ("failed to read routing common listeners config: " + commonListenersConfigErr .Error ())
170171 }
171172
173+ // Register events listeners for 404 Not Found handler
174+ for _ , listenerConfig := range commonListenersConfig {
175+ eventObj , listenerFunc := k .extractHandlerFromListenerConfig (listenerConfig )
176+ listenerError := k .notFoundHandlerEventBus .AppendListener (eventObj , listenerFunc , listenerConfig .Priority )
177+ if nil != listenerError {
178+ panic ("failed to register routes common event listener, error: " + listenerError .Error ())
179+ }
180+ }
181+
172182 for routeName := range k .config .GetStringMap ("routing.routes" ) {
173183 routeConfig := & config.RouteConfig {}
174184 routeConfigErr := k .config .UnmarshalKey ("routing.routes." + routeName , routeConfig )
@@ -189,21 +199,18 @@ func (k *Kernel) readConfig() {
189199 Url : routeConfig .Url ,
190200 Methods : routeConfig .Methods ,
191201 Controller : controller ,
202+ eventBus : event_bus .NewEventBus (),
192203 })
193204
194205 // Registering route's event listeners
195206 fullPackOfEventListenersConfig := append (routeConfig .EventListeners , commonListenersConfig ... )
196207 for _ , listenerConfig := range fullPackOfEventListenersConfig {
197- listenerObj := k .GetContainer ().GetByAlias (listenerConfig .ListenerAlias ())
198- eventObj , eventRegistryError := k .eventsRegistry .GetEventByName (listenerConfig .EventName )
199- if nil != eventRegistryError {
200- panic ("failed to register event listener to route " + routeName + ", error: " + eventRegistryError .Error ())
201- }
208+ eventObj , listenerFunc := k .extractHandlerFromListenerConfig (listenerConfig )
202209
203210 listenerError := k .RegisterListenerForRoute (
204211 routeName ,
205212 eventObj ,
206- reflect . ValueOf ( listenerObj ). MethodByName ( listenerConfig . ListenerMethod ()). Interface () ,
213+ listenerFunc ,
207214 listenerConfig .Priority ,
208215 )
209216 if nil != listenerError {
@@ -251,25 +258,31 @@ func (k *Kernel) readConfig() {
251258 }
252259}
253260
254- func (k * Kernel ) createRouteHandler ( route * Route ) http. HandlerFunc {
255- var eventBus event_bus. EventBus
256- // If route has listeners - use that listeners, if no - use global listeners from Kernel
257- if nil != route . eventBus {
258- eventBus = route . eventBus
259- } else {
260- eventBus = k . eventBus
261+ func (k * Kernel ) extractHandlerFromListenerConfig ( listenerConfig config. EventListenerConfig ) ( eventObj event. Event , listenerFunc interface {}) {
262+ var eventRegistryError error
263+
264+ listenerObj := k . GetContainer (). GetByAlias ( listenerConfig . ListenerAlias ())
265+ eventObj , eventRegistryError = k . eventsRegistry . GetEventByName ( listenerConfig . EventName )
266+ if nil != eventRegistryError {
267+ panic ( "failed to extract event handler from event listener config, error: " + eventRegistryError . Error ())
261268 }
262269
270+ listenerFunc = reflect .ValueOf (listenerObj ).MethodByName (listenerConfig .ListenerMethod ()).Interface ()
271+
272+ return
273+ }
274+
275+ func (k * Kernel ) createRouteHandler (route * Route ) http.HandlerFunc {
263276 return func (responseWriter http.ResponseWriter , requestObj * http.Request ) {
264- RequestContextAppend (requestObj , requestCtxEventBusKey , eventBus )
277+ RequestContextAppend (requestObj , requestCtxEventBusKey , route . eventBus )
265278 responseObj := k .runRequestProcessingFlow (responseWriter , requestObj , route .Controller )
266279 k .runSendResponse (responseWriter , requestObj , responseObj )
267280 }
268281}
269282
270283func (k * Kernel ) createNotFoundHandler () http.HandlerFunc {
271284 return func (responseWriter http.ResponseWriter , requestObj * http.Request ) {
272- RequestContextAppend (requestObj , requestCtxEventBusKey , k .eventBus )
285+ RequestContextAppend (requestObj , requestCtxEventBusKey , k .notFoundHandlerEventBus )
273286 responseObj := k .runNotFoundFlow (responseWriter , requestObj )
274287 k .runSendResponse (responseWriter , requestObj , responseObj )
275288 }
@@ -474,6 +487,14 @@ func (k *Kernel) runNotFoundFlow(responseWriter http.ResponseWriter, requestObj
474487 responseObj = defaultResponseObj
475488 }
476489
490+ // If returned response is view - set templates to it
491+ switch typedResponse := responseObj .(type ) {
492+ case * response.ViewResponse :
493+ if nil == typedResponse .Template {
494+ typedResponse .SetTemplate (k .templates )
495+ }
496+ }
497+
477498 return
478499}
479500
@@ -569,13 +590,14 @@ func NewKernel(configPath string) (*Kernel, error) {
569590
570591 // Creating kernel obj
571592 kernel := & Kernel {
572- config : viper .New (),
573- container : gioc .NewContainer (),
574- routes : make (map [string ]* Route , 0 ),
575- eventsRegistry : event_bus .NewDefaultRegistry (),
576- eventBus : event_bus .NewEventBus (),
577- templates : template .New ("root" ),
578- httpServer : & http.Server {},
593+ config : viper .New (),
594+ container : gioc .NewContainer (),
595+ routes : make (map [string ]* Route , 0 ),
596+ notFoundHandlerEventBus : event_bus .NewEventBus (),
597+ eventsRegistry : event_bus .NewDefaultRegistry (),
598+ applicationEventBus : event_bus .NewEventBus (),
599+ templates : template .New ("root" ),
600+ httpServer : & http.Server {},
579601 }
580602
581603 // Copy known config parts to kernel's viper object
0 commit comments