Skip to content

Commit 1146331

Browse files
authored
Merge pull request #467 from AlumnIQ/overridable-session-access
Refactor session scope usage into a series of overridable methods
2 parents 3f3db94 + 492723e commit 1146331

File tree

1 file changed

+58
-31
lines changed

1 file changed

+58
-31
lines changed

framework/one.cfc

Lines changed: 58 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,9 @@ component {
307307
public void function frameworkTrace( string message ) {
308308
if ( request._fw1.doTrace ) {
309309
try {
310-
if ( isDefined( 'session._fw1_trace' ) &&
311-
structKeyExists( session, '_fw1_trace' ) ) {
312-
request._fw1.trace = session._fw1_trace;
313-
structDelete( session, '_fw1_trace' );
310+
if ( sessionHas( '_fw1_trace' ) ) {
311+
request._fw1.trace = sessionRead( '_fw1_trace' );
312+
sessionDelete( '_fw1_trace' );
314313
}
315314
} catch ( any _ ) {
316315
// ignore if session is not enabled
@@ -1118,7 +1117,7 @@ component {
11181117
if ( request._fw1.doTrace ) {
11191118
internalFrameworkTrace( 'redirecting to #targetURL# (#statusCode#)' );
11201119
try {
1121-
session._fw1_trace = request._fw1.trace;
1120+
sessionWrite( '_fw1_trace', request._fw1.trace );
11221121
} catch ( any _ ) {
11231122
// ignore exception if session is not enabled
11241123
}
@@ -1157,7 +1156,7 @@ component {
11571156
if ( request._fw1.doTrace ) {
11581157
internalFrameworkTrace( 'redirecting to #targetURL# (#statusCode#)' );
11591158
try {
1160-
session._fw1_trace = request._fw1.trace;
1159+
sessionWrite( '_fw1_trace', request._fw1.trace );
11611160
} catch ( any _ ) {
11621161
// ignore exception if session is not enabled
11631162
}
@@ -1229,6 +1228,32 @@ component {
12291228
return builder;
12301229
}
12311230

1231+
public void function sessionDefault( string keyname, string defaultValue ) {
1232+
param name="session['#keyname#']" default="#defaultValue#";
1233+
}
1234+
1235+
public void function sessionDelete( string keyname ) {
1236+
structDelete( session, keyname );
1237+
}
1238+
1239+
public boolean function sessionHas( string keyname ) {
1240+
return isDefined( 'session.#keyname#' ) && structKeyExists( session, keyname );
1241+
}
1242+
1243+
public void function sessionLock( required function callback ) {
1244+
lock scope="session" type="exclusive" timeout="30" {
1245+
callback();
1246+
}
1247+
}
1248+
1249+
public any function sessionRead( string keyname ) {
1250+
return session[ keyname ];
1251+
}
1252+
1253+
public void function sessionWrite( string keyname, any keyvalue ) {
1254+
session[ keyname ] = keyvalue;
1255+
}
1256+
12321257
/*
12331258
* call this from your setupApplication() method to tell the framework
12341259
* about your bean factory - only assumption is that it supports:
@@ -1803,26 +1828,24 @@ component {
18031828
var nextPreserveKey = '';
18041829
var oldKeyToPurge = '';
18051830
try {
1806-
if ( variables.framework.maxNumContextsPreserved > 1 ) {
1807-
lock scope="session" type="exclusive" timeout="30" {
1808-
param name="session.__fw1NextPreserveKey" default="1";
1809-
nextPreserveKey = session.__fw1NextPreserveKey;
1810-
session.__fw1NextPreserveKey = session.__fw1NextPreserveKey + 1;
1811-
}
1812-
oldKeyToPurge = nextPreserveKey - variables.framework.maxNumContextsPreserved;
1813-
} else {
1814-
lock scope="session" type="exclusive" timeout="30" {
1815-
session.__fw1PreserveKey = '';
1816-
nextPreserveKey = session.__fw1PreserveKey;
1831+
sessionLock(function(){
1832+
if ( variables.framework.maxNumContextsPreserved > 1 ) {
1833+
sessionDefault( '__fw1NextPreserveKey', 1 );
1834+
nextPreserveKey = sessionRead( '__fw1NextPreserveKey' );
1835+
sessionWrite( '__fw1NextPreserveKey', nextPreserveKey + 1 );
1836+
oldKeyToPurge = nextPreserveKey - variables.framework.maxNumContextsPreserved;
1837+
} else {
1838+
nextPreserveKey = '';
1839+
sessionWrite( '__fw1PreserveKey', nextPreserveKey );
1840+
oldKeyToPurge = '';
18171841
}
1818-
oldKeyToPurge = '';
1819-
}
1842+
});
18201843
} catch ( any e ) {
18211844
// ignore - assume session scope is disabled
18221845
}
18231846
var key = getPreserveKeySessionKey( oldKeyToPurge );
1824-
if ( structKeyExists( session, key ) ) {
1825-
structDelete( session, key );
1847+
if ( sessionHas( key ) ) {
1848+
sessionDelete( key );
18261849
}
18271850
return nextPreserveKey;
18281851
}
@@ -1861,10 +1884,9 @@ component {
18611884
private void function internalFrameworkTrace( string message, string subsystem = '', string section = '', string item = '', string traceType = 'INFO' ) {
18621885
if ( request._fw1.doTrace ) {
18631886
try {
1864-
if ( isDefined( 'session._fw1_trace' ) &&
1865-
structKeyExists( session, '_fw1_trace' ) ) {
1866-
request._fw1.trace = session._fw1_trace;
1867-
structDelete( session, '_fw1_trace' );
1887+
if ( sessionHas( '_fw1_trace' ) ) {
1888+
request._fw1.trace = sessionRead( '_fw1_trace' );
1889+
sessionDelete( '_fw1_trace' );
18681890
}
18691891
} catch ( any _ ) {
18701892
// ignore if session is not enabled
@@ -2293,16 +2315,16 @@ component {
22932315
var preserveKeySessionKey = getPreserveKeySessionKey( '' );
22942316
}
22952317
try {
2296-
if ( structKeyExists( session, preserveKeySessionKey ) ) {
2297-
structAppend( request.context, session[ preserveKeySessionKey ], false );
2318+
if ( sessionHas( preserveKeySessionKey ) ) {
2319+
structAppend( request.context, sessionRead( preserveKeySessionKey ), false );
22982320
if ( variables.framework.maxNumContextsPreserved == 1 ) {
22992321
/*
23002322
When multiple contexts are preserved, the oldest context is purged
23012323
within getNextPreserveKeyAndPurgeOld once the maximum is reached.
23022324
This allows for a browser refresh after the redirect to still receive
23032325
the same context.
23042326
*/
2305-
structDelete( session, preserveKeySessionKey );
2327+
sessionDelete( preserveKeySessionKey );
23062328
}
23072329
}
23082330
} catch ( any e ) {
@@ -2313,17 +2335,22 @@ component {
23132335
private string function saveFlashContext( string keys ) {
23142336
var curPreserveKey = getNextPreserveKeyAndPurgeOld();
23152337
var preserveKeySessionKey = getPreserveKeySessionKey( curPreserveKey );
2338+
var tmpSession = '';
23162339
try {
2317-
param name="session.#preserveKeySessionKey#" default="#{ }#";
2340+
sessionDefault( preserveKeySessionKey, {} );
23182341
if ( keys == 'all' ) {
2319-
structAppend( session[ preserveKeySessionKey ], request.context );
2342+
tmpSession = sessionRead( preserveKeySessionKey );
2343+
structAppend( tmpSession, request.context );
2344+
sessionWrite( preserveKeySessionKey, tmpSession );
23202345
} else {
23212346
var key = 0;
23222347
var keyNames = listToArray( keys );
23232348
for ( key in keyNames ) {
23242349
key = trim( key );
23252350
if ( structKeyExists( request.context, key ) ) {
2326-
session[ preserveKeySessionKey ][ key ] = request.context[ key ];
2351+
tmpSession = sessionRead( preserveKeySessionKey );
2352+
tmpSession[ key ] = request.context[ key ];
2353+
sessionWrite( preserveKeySessionKey, tmpSession);
23272354
} else {
23282355
internalFrameworkTrace( message = 'key "#key#" does not exist in RC, cannot preserve.', traceType = 'WARNING' );
23292356
}

0 commit comments

Comments
 (0)