Skip to content

Commit eccb0bd

Browse files
committed
https://ortussolutions.atlassian.net/browse/COLDBOX-1397
1 parent 47dcb0c commit eccb0bd

4 files changed

Lines changed: 84 additions & 27 deletions

File tree

system/web/context/EventHandlerBean.cfc

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,16 @@ component accessors="true" {
6666
*/
6767
property name="fullEvent";
6868

69+
/**
70+
* Precalculated default event string
71+
*/
72+
property name="defaultEvent";
73+
74+
/**
75+
* Registered handler source
76+
*/
77+
property name="handlerSource";
78+
6979
/************************************** CONSTRUCTOR *********************************************/
7080

7181
/**
@@ -86,6 +96,8 @@ component accessors="true" {
8696
variables.handlerRecord = {}
8797
variables.runnable = ""
8898
variables.fullEvent = ""
99+
variables.defaultEvent = ""
100+
variables.handlerSource = ""
89101

90102
return this
91103
}
@@ -193,7 +205,7 @@ component accessors="true" {
193205
variables.invocationPath = arguments.invocationPath
194206
variables.runnable = ""
195207

196-
return this;
208+
return this
197209
}
198210

199211
/**
@@ -208,7 +220,7 @@ component accessors="true" {
208220
variables.runnable = ""
209221
variables.fullEvent = ""
210222

211-
return this;
223+
return this
212224
}
213225

214226
/**
@@ -222,7 +234,7 @@ component accessors="true" {
222234
variables.method = arguments.method
223235
variables.fullEvent = ""
224236

225-
return this;
237+
return this
226238
}
227239

228240
/**
@@ -236,7 +248,7 @@ component accessors="true" {
236248
variables.module = arguments.module
237249
variables.fullEvent = ""
238250

239-
return this;
251+
return this
240252
}
241253

242254
/**
@@ -263,6 +275,18 @@ component accessors="true" {
263275
variables.runnable = ""
264276
}
265277

278+
if ( structKeyExists( arguments.handlerRecord, "defaultEvent" ) ) {
279+
variables.defaultEvent = arguments.handlerRecord.defaultEvent
280+
} else {
281+
variables.defaultEvent = ""
282+
}
283+
284+
if ( structKeyExists( arguments.handlerRecord, "source" ) ) {
285+
variables.handlerSource = arguments.handlerRecord.source
286+
} else {
287+
variables.handlerSource = ""
288+
}
289+
266290
variables.fullEvent = ""
267291

268292
return this

system/web/services/HandlerService.cfc

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ component extends="coldbox.system.web.services.BaseService" accessors="true" {
137137
*/
138138
function getHandler( required ehBean, required requestContext ){
139139
var oRequestContext = arguments.requestContext;
140-
var oEventURLFacade = variables.templateCache.getEventURLFacade();
141140

142141
// Create Runnable Object via WireBox
143142
var oEventHandler = newHandler( arguments.ehBean );
@@ -197,7 +196,7 @@ component extends="coldbox.system.web.services.BaseService" accessors="true" {
197196
structAppend( eventCachingData, eventDictionaryEntry, true );
198197

199198
// Create the Cache Key to save
200-
eventCachingData.cacheKey = oEventURLFacade.buildEventKey(
199+
eventCachingData.cacheKey = variables.templateCache.getEventURLFacade().buildEventKey(
201200
targetEvent = arguments.ehBean.getFullEvent(),
202201
targetContext = oRequestContext,
203202
eventDictionary = eventDictionaryEntry
@@ -342,30 +341,27 @@ component extends="coldbox.system.web.services.BaseService" accessors="true" {
342341

343342
// Module Check?
344343
if ( find( ":", currentEvent ) ) {
345-
var module = listFirst( currentEvent, ":" );
344+
var separatorIndex = find( ":", currentEvent );
345+
var module = left( currentEvent, separatorIndex - 1 );
346346
if ( structKeyExists( modulesConfig, module ) ) {
347347
// Get module's handler struct for O(1) lookup
348348
var moduleHandlers = modulesConfig[ module ].registeredHandlers ?: {};
349-
var handlerKey = reReplaceNoCase( currentEvent, "^([^:.]*):", "" );
349+
var handlerKey = mid( currentEvent, separatorIndex + 1, len( currentEvent ) );
350350
if ( structKeyExists( moduleHandlers, handlerKey ) ) {
351-
// Append the default event action
352-
currentEvent = currentEvent & "." & variables.eventAction;
353351
// Save it as the current Event
354-
event.setValue( variables.eventName, currentEvent );
352+
event.setValue( variables.eventName, moduleHandlers[ handlerKey ].defaultEvent );
355353
}
356354
}
357355
return this;
358356
}
359357

360358
// O(1) struct lookup for default action test
361-
if (
362-
structKeyExists( variables.registeredHandlers, currentEvent ) OR
363-
structKeyExists( variables.registeredExternalHandlers, currentEvent )
364-
) {
365-
// Append the default event action
366-
currentEvent = currentEvent & "." & variables.eventAction;
359+
if ( structKeyExists( variables.registeredHandlers, currentEvent ) ) {
367360
// Save it as the current Event now with the default action
368-
event.setValue( variables.eventName, currentEvent );
361+
event.setValue( variables.eventName, variables.registeredHandlers[ currentEvent ].defaultEvent );
362+
} else if ( structKeyExists( variables.registeredExternalHandlers, currentEvent ) ) {
363+
// Save it as the current Event now with the default action
364+
event.setValue( variables.eventName, variables.registeredExternalHandlers[ currentEvent ].defaultEvent );
369365
}
370366

371367
return this;
@@ -592,16 +588,18 @@ component extends="coldbox.system.web.services.BaseService" accessors="true" {
592588
// Convert windows \ to java /
593589
arguments.directory = replace( arguments.directory, "\", "/", "all" )
594590

595-
var util = variables.controller.getUtil()
596-
597-
return directoryList(
591+
var util = variables.controller.getUtil()
592+
var handlerList = {}
593+
var files = directoryList(
598594
arguments.directory,
599595
true,
600596
"array",
601597
"*.cfc|*.bx"
602-
).reduce( ( accumulator, item ) => {
603-
var thisAbsolutePath = replace( arguments.item, "\", "/", "all" )
604-
var cleanHandler = replaceNoCase( thisAbsolutePath, directory, "", "all" )
598+
)
599+
600+
for ( var item in files ) {
601+
var thisAbsolutePath = replace( item, "\", "/", "all" )
602+
var cleanHandler = replaceNoCase( thisAbsolutePath, arguments.directory, "", "all" )
605603
// Clean OS separators to dot notation.
606604
cleanHandler = removeChars(
607605
replaceNoCase( cleanHandler, "/", ".", "all" ),
@@ -614,18 +612,21 @@ component extends="coldbox.system.web.services.BaseService" accessors="true" {
614612
var extension = listLast( cleanHandler, "." )
615613
// Build runnable path if invocationPath provided
616614
var runnable = len( invocationPath ) ? invocationPath & "." & handlerName : ""
615+
var defaultEvent = len( moduleName ) ? moduleName & ":" & handlerName & "." & variables.eventAction : handlerName & "." & variables.eventAction
617616
// Store in struct with metadata
618-
arguments.accumulator[ handlerName ] = {
617+
handlerList[ handlerName ] = {
619618
handler : handlerName,
620619
path : thisAbsolutePath,
621620
extension : extension,
622621
invocationPath : invocationPath,
623622
runnable : runnable,
623+
defaultEvent : defaultEvent,
624624
source : source,
625625
moduleName : moduleName
626626
}
627-
return arguments.accumulator
628-
}, {} )
627+
}
628+
629+
return handlerList
629630
}
630631

631632
/************************************ PRIVATE ************************************/

tests/specs/web/context/eventhandlerBeanTest.cfc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
handler : "recorded",
8888
invocationPath : "app.handlers",
8989
runnable : "app.handlers.recorded",
90+
defaultEvent : "recorded.index",
9091
source : "conventions"
9192
};
9293

@@ -99,6 +100,8 @@
99100
assertEquals( this.ehBean.getInvocationPath(), "app.handlers" );
100101
assertEquals( this.ehBean.getRunnable(), "app.handlers.recorded" );
101102
assertEquals( this.ehBean.getFullEvent(), "recorded.show" );
103+
assertEquals( this.ehBean.getDefaultEvent(), "recorded.index" );
104+
assertEquals( this.ehBean.getHandlerSource(), "conventions" );
102105
expect( this.ehBean.getHandlerRecord() ).toBe( handlerRecord );
103106
</cfscript>
104107
</cffunction>

tests/specs/web/services/HandlerServiceTest.cfc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ component extends="tests.resources.BaseIntegrationTest" {
3131
var mainHandler = registered[ "main" ];
3232
expect( mainHandler ).toHaveKey( "invocationPath" );
3333
expect( mainHandler ).toHaveKey( "runnable" );
34+
expect( mainHandler ).toHaveKey( "defaultEvent" );
3435
expect( mainHandler ).toHaveKey( "source" );
3536
expect( mainHandler ).toHaveKey( "moduleName" );
3637

3738
expect( mainHandler.source ).toBe( "conventions" );
3839
expect( mainHandler.moduleName ).toBe( "" );
3940
expect( mainHandler.runnable ).toInclude( "main" );
41+
expect( mainHandler.defaultEvent ).toBe( "main.index" );
4042
} );
4143

4244
it( "external handlers include enrichment metadata", () => {
@@ -48,11 +50,13 @@ component extends="tests.resources.BaseIntegrationTest" {
4850
var ehTestHandler = external[ "ehTest" ];
4951
expect( ehTestHandler ).toHaveKey( "invocationPath" );
5052
expect( ehTestHandler ).toHaveKey( "runnable" );
53+
expect( ehTestHandler ).toHaveKey( "defaultEvent" );
5154
expect( ehTestHandler ).toHaveKey( "source" );
5255
expect( ehTestHandler ).toHaveKey( "moduleName" );
5356

5457
expect( ehTestHandler.source ).toBe( "external" );
5558
expect( ehTestHandler.moduleName ).toBe( "" );
59+
expect( ehTestHandler.defaultEvent ).toBe( "ehTest.index" );
5660
} );
5761

5862
it( "module handlers include enrichment metadata", () => {
@@ -66,12 +70,14 @@ component extends="tests.resources.BaseIntegrationTest" {
6670
var homeHandler = moduleHandlers[ "Home" ];
6771
expect( homeHandler ).toHaveKey( "invocationPath" );
6872
expect( homeHandler ).toHaveKey( "runnable" );
73+
expect( homeHandler ).toHaveKey( "defaultEvent" );
6974
expect( homeHandler ).toHaveKey( "source" );
7075
expect( homeHandler ).toHaveKey( "moduleName" );
7176

7277
expect( homeHandler.source ).toBe( "module" );
7378
expect( homeHandler.moduleName ).toBe( "resourcesTest" );
7479
expect( homeHandler.runnable ).toInclude( "Home" );
80+
expect( homeHandler.defaultEvent ).toBe( "resourcesTest:Home.index" );
7581
} );
7682

7783
it( "can recurse handler listings", () =>{
@@ -101,6 +107,23 @@ component extends="tests.resources.BaseIntegrationTest" {
101107
expect( handlers[ "main" ].handler ).toBe( "main" );
102108
expect( handlers[ "main" ].path ).toInclude( "main.cfc" );
103109
expect( handlers[ "main" ].extension ).toBe( "cfc" );
110+
expect( handlers[ "main" ].defaultEvent ).toBe( "main.index" );
111+
} );
112+
113+
it( "uses registered handler default events for default action checks", () =>{
114+
var context = getRequestContext();
115+
116+
context.setValue( context.getEventName(), "main" );
117+
variables.handlerService.defaultActionCheck( context );
118+
expect( context.getCurrentEvent() ).toBe( "main.index" );
119+
120+
context.setValue( context.getEventName(), "ehTest" );
121+
variables.handlerService.defaultActionCheck( context );
122+
expect( context.getCurrentEvent() ).toBe( "ehTest.index" );
123+
124+
context.setValue( context.getEventName(), "resourcesTest:Home" );
125+
variables.handlerService.defaultActionCheck( context );
126+
expect( context.getCurrentEvent() ).toBe( "resourcesTest:Home.index" );
104127
} );
105128

106129
it( "configures REST handler annotations as virtual inheritance", () =>{
@@ -134,6 +157,8 @@ component extends="tests.resources.BaseIntegrationTest" {
134157
expect( results.getHandler() ).toBe( "main" );
135158
expect( results.getFullEvent() ).toBe( "main.index" );
136159
expect( results.getRunnable() ).toBe( results.getHandlerRecord().runnable );
160+
expect( results.getDefaultEvent() ).toBe( results.getHandlerRecord().defaultEvent );
161+
expect( results.getHandlerSource() ).toBe( "conventions" );
137162
expect( variables.handlerService.getHandlerBeanCacheDictionary() ).toHaveKey( "main.index" );
138163
} );
139164

@@ -143,6 +168,8 @@ component extends="tests.resources.BaseIntegrationTest" {
143168
expect( results.getHandler() ).toBe( "ehTest" );
144169
expect( results.getFullEvent() ).toBe( "ehTest.dspExternal" );
145170
expect( results.getRunnable() ).toBe( results.getHandlerRecord().runnable );
171+
expect( results.getDefaultEvent() ).toBe( results.getHandlerRecord().defaultEvent );
172+
expect( results.getHandlerSource() ).toBe( "external" );
146173
expect( variables.handlerService.getHandlerBeanCacheDictionary() ).toHaveKey( "ehTest.dspExternal" );
147174
} );
148175

@@ -153,6 +180,8 @@ component extends="tests.resources.BaseIntegrationTest" {
153180
expect( results.getModule() ).toBe( "resourcesTest" );
154181
expect( results.getFullEvent() ).toBe( "resourcesTest:Home.index" );
155182
expect( results.getRunnable() ).toBe( results.getHandlerRecord().runnable );
183+
expect( results.getDefaultEvent() ).toBe( results.getHandlerRecord().defaultEvent );
184+
expect( results.getHandlerSource() ).toBe( "module" );
156185
expect( variables.handlerService.getHandlerBeanCacheDictionary() ).toHaveKey(
157186
"resourcesTest:Home.index"
158187
);

0 commit comments

Comments
 (0)