Skip to content

Commit 06797fd

Browse files
committed
* (Possible breaking change !!!) Separation of application level event processing and request level events processing.
Before this commit request processing logic used application level event listeners in case when no event listeners were set for route. Now in this case request processing logic will not call application level events listeners in any case. * Event bus for 404 not found handler
1 parent cbbf51e commit 06797fd

1 file changed

Lines changed: 54 additions & 32 deletions

File tree

‎kernel.go‎

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,14 @@ const (
3232
)
3333

3434
type 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

4445
func (k *Kernel) GetContainer() *gioc.Container {
@@ -64,7 +65,7 @@ func (k *Kernel) GetHttpServer() *http.Server {
6465
}
6566

6667
func (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

7071
func (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

270283
func (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

Comments
 (0)