Skip to content

Instantly share code, notes, and snippets.

@aarongreenlee
Created January 14, 2012 00:27
Show Gist options
  • Save aarongreenlee/1609535 to your computer and use it in GitHub Desktop.
Save aarongreenlee/1609535 to your computer and use it in GitHub Desktop.
ColdBox: processColdBoxRequest() - Trying to diagnose Event Cache Bug
<cffunction name="processColdBoxRequest" access="public" returntype="void" hint="Process a Coldbox Request" output="true" >
<cfset var cbController = 0>
<cfset var event = 0>
<cfset var exceptionService = 0>
<cfset var exceptionBean = 0>
<cfset var renderedContent = "">
<cfset var eventCacheEntry = 0>
<cfset var interceptorData = structnew()>
<cfset var renderData = structnew()>
<cfset var refResults = structnew()>
<cfset var debugPanel = "">
<cfset var interceptorService = "">
<cfset var debugMode = false>
<!--- Start Application Requests --->
<cflock type="readonly" name="#instance.appHash#" timeout="#instance.lockTimeout#" throwontimeout="true">
<cfset cbController = application[locateAppKey()]>
</cflock>
<!--- Setup Local Vars --->
<cfset interceptorService = cbController.getInterceptorService()>
<cfset debugMode = cbController.getDebuggerService().getDebugMode()>
<cfset templateCache = cbController.getColdboxOCM("template")>
<cftry>
<!--- set request time --->
<cfset request.fwExecTime = getTickCount()>
<!--- Create Request Context & Capture Request --->
<cfset event = cbController.getRequestService().requestCapture()>
<!--- Debugging Monitors & Commands Check --->
<cfif debugMode>
<!--- ColdBox Command Executions --->
<cfset coldboxCommands(cbController,event)>
<!--- Debug Panel rendering --->
<cfset debugPanel = event.getValue("debugPanel","")>
<cfswitch expression="#debugPanel#">
<cfcase value="cache">
<cfoutput>#cbController.getDebuggerService().renderCachePanel(monitor=true)#</cfoutput>
</cfcase>
<cfcase value="cacheReport">
<cfoutput>#cbController.getDebuggerService().renderCacheReport(cacheName=event.getTrimValue("cbox_cacheName","default"))#</cfoutput>
</cfcase>
<cfcase value="cacheContentReport">
<cfoutput>#cbController.getDebuggerService().renderCacheContentReport(cacheName=event.getTrimValue("cbox_cacheName","default"))#</cfoutput>
</cfcase>
<cfcase value="cacheViewer">
<cfoutput>#cbController.getDebuggerService().renderCacheDumper(cacheName=event.getTrimValue("cbox_cacheName","default"))#</cfoutput>
</cfcase>
<cfcase value="profiler">
<cfoutput>#cbController.getDebuggerService().renderProfiler()#</cfoutput>
</cfcase>
</cfswitch>
<!--- Stop Processing, we are rendering a debugger panel --->
<cfif len(debugPanel)>
<cfsetting showdebugoutput="false">
<cfreturn>
</cfif>
</cfif>
<!--- Execute preProcess Interception --->
<cfset interceptorService.processState("preProcess")>
<!--- IF Found in config, run onRequestStart Handler --->
<cfif len(cbController.getSetting("RequestStartHandler"))>
<cfset cbController.runEvent(cbController.getSetting("RequestStartHandler"),true)>
</cfif>
<!--- Before Any Execution, do we have cached content to deliver --->
<cfset writeDump(var=event.getEventCacheableEntry(),top=3,abort=false,output="#expandPath('/atvlogs/debugging.log')#") />
<cfif event.isEventCacheable() AND templateCache.lookupQuiet(event.getEventCacheableEntry())>
<cfset renderedContent = templateCache.get(event.getEventCacheableEntry())>
<cfoutput>#renderedContent#</cfoutput>
<cfset writeDump(var='Cached Content: #hash(renderedContent,'sha')#',top=3,abort=false,output="#expandPath('/atvlogs/debugging.log')#") />
<cfelse>
<!--- Run Default/Set Event not executing an event --->
<cfif NOT event.isNoExecution()>
<cfset refResults.results = cbController.runEvent(default=true)>
</cfif>
<!--- No Render Test --->
<cfif not event.isNoRender()>
<!--- Execute preLayout Interception --->
<cfset interceptorService.processState("preLayout")>
<!--- Check for Marshalling and data render --->
<cfset renderData = event.getRenderData()>
<cfif isStruct(renderData) and not structisEmpty(renderData)>
<cfset renderedContent = cbController.getPlugin("Utilities").marshallData(argumentCollection=renderData)>
<!--- Check for Event Handler return results --->
<cfelseif structKeyExists(refResults,"results")>
<cfset renderedContent = refResults.results>
<cfelse>
<!--- Render Layout/View pair via set variable to eliminate whitespace--->
<cfset renderedContent = cbController.getPlugin("Renderer").renderLayout()>
</cfif>
<!--- PreRender Data:--->
<cfset interceptorData.renderedContent = renderedContent>
<!--- Execute preRender Interception --->
<cfset interceptorService.processState("preRender",interceptorData)>
<!--- Replace back Content --->
<cfset renderedContent = interceptorData.renderedContent>
<!--- Check if caching the event, this is a cacheable event? --->
<cfif event.isEventCacheable()>
<cfset eventCacheEntry = event.getEventCacheableEntry()>
<!--- Cache the content of the event --->
<cfset templateCache.set(eventCacheEntry.cacheKey,
renderedContent,
eventCacheEntry.timeout,
eventCacheEntry.lastAccessTimeout)>
</cfif>
<!--- Render Content Type if using Render Data --->
<cfif isStruct(renderData) and not structisEmpty(renderData)>
<!--- Status Codes --->
<cfheader statuscode="#renderData.statusCode#" statustext="#renderData.statusText#" >
<!--- Render the Data Content Type --->
<cfcontent type="#renderData.contentType#; charset=#renderData.encoding#" reset="true">
<!--- Remove panels --->
<cfsetting showdebugoutput="false">
<cfset event.showDebugPanel(false)>
</cfif>
<!--- Render the Content --->
<cfoutput>#renderedContent#</cfoutput>
<!--- Execute postRender Interception --->
<cfset interceptorService.processState("postRender")>
</cfif>
<!--- End else if not cached event --->
</cfif>
<!--- If Found in config, run onRequestEnd Handler --->
<cfif len(cbController.getSetting("RequestEndHandler"))>
<cfset cbController.runEvent(cbController.getSetting("RequestEndHandler"),true)>
</cfif>
<!--- Execute postProcess Interception --->
<cfset interceptorService.processState("postProcess")>
<!--- Trap Application Errors --->
<cfcatch type="any">
<!--- Get Exception Service --->
<cfset exceptionService = cbController.getExceptionService()>
<!--- Intercept The Exception --->
<cfset interceptorData = structnew()>
<cfset interceptorData.exception = cfcatch>
<cfset interceptorService.processState("onException",interceptorData)>
<!--- Handle The Exception --->
<cfset ExceptionBean = exceptionService.ExceptionHandler(cfcatch,"application","Application Execution Exception")>
<!--- Render The Exception --->
<cfoutput>#exceptionService.renderBugReport(ExceptionBean)#</cfoutput>
</cfcatch>
</cftry>
<!--- Time the request --->
<cfset request.fwExecTime = getTickCount() - request.fwExecTime>
<!--- DebugMode Routines --->
<cfif debugMode>
<!--- Record Profilers --->
<cfset cbController.getDebuggerService().recordProfiler()>
<!--- Render DebugPanel --->
<cfif event.getDebugPanelFlag()>
<!--- Render Debug Log --->
<cfoutput>#interceptorService.processState("beforeDebuggerPanel")##cbController.getDebuggerService().renderDebugLog()##interceptorService.processState("afterDebuggerPanel")#</cfoutput>
</cfif>
</cfif>
</cffunction>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment