Created
January 14, 2012 00:27
-
-
Save aarongreenlee/1609535 to your computer and use it in GitHub Desktop.
ColdBox: processColdBoxRequest() - Trying to diagnose Event Cache Bug
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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