| Package: MachII.framework |
| Inherits from: framework.CommandLoaderBase |
| Manages registered EventHandlers for the framework. |
<!--- License: Copyright 2008 GreatBizTools, LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Copyright: GreatBizTools, LLC Author: Ben Edwards (ben@ben-edwards.com) $Id: EventManager.cfc 1133 2008-11-09 23:03:29Z kurtwiersma $ Created version: 1.0.0 Updated version: 1.6.0 Notes: ---> |
| Method Summary | |
|---|---|
| public EventManager |
init(AppManager appManager, [any parentEventManager=""])
Initialization function called by the framework. |
| public void |
addEventHandler(string eventName, EventHandler eventHandler, [boolean overrideCheck="false"])
Registers an EventHandler by name. |
| public void |
configure()
Configures the EventManager and checks if default and exception are defined as required. |
| public Event |
createEvent(string moduleName, string eventName, [struct eventArgs="#StructNew()#"], [string requestName=""], [string requestModuleName=""], [boolean checkIfEventDefined="true"])
Creates an Event instance. |
| public AppManager | getAppManager() |
| public EventHandler |
getEventHandler(string eventName, [string moduleName=""])
Returns the EventHandler for the named Event. |
| public array |
getEventNames()
Returns an array of event-handler names. |
| public any |
getParent()
Sets the parent EventManager instance this EventManager belongs to. It will return empty string if no parent is defined. |
| public boolean |
isEventDefined(string eventName, [boolean checkParent="false"], [string moduleName=""])
Returns true if an EventHandler for the named Event is defined; otherwise false. |
| public boolean |
isEventPublic(string eventName, [boolean checkParent="false"])
Returns true if the EventHandler for the named Event is publicly accessible; otherwise false. |
| public void |
loadXml(string configXML, [boolean override="false"])
Loads xml for the manager. |
| public void |
removeEvent(string eventName)
Removes an event-handler. Does NOT remove from parent. |
| public void | setAppManager(AppManager appManager) |
| public void |
setParent(EventManager parentEventManager)
Returns the parent EventManager instance this EventManager belongs to. |
| Methods inherited from framework.CommandLoaderBase: setupCache , setupPublish , setupRedirect , setupFilter , setupExecute , setupEventArg , setupAnnounce , createCommand , setupViewPage , setupDefault , setupCacheClear , setupNotify , setupEventMapping , setupEventBean |
|---|
| Method Detail |
|---|
| addEventHandler |
|---|
public void addEventHandler( string eventName, EventHandler eventHandler, [boolean overrideCheck="false"] )
Registers an EventHandler by name.
Parameters:
| string eventName |
| EventHandler eventHandler |
| [boolean overrideCheck="false"] |
Code:
<cffunction name="addEventHandler" access="public" returntype="void" output="false" hint="Registers an EventHandler by name."> <cfargument name="eventName" type="string" required="true" /> <cfargument name="eventHandler" type="MachII.framework.EventHandler" required="true" /> <cfargument name="overrideCheck" type="boolean" required="false" default="false" /> <cfif NOT arguments.overrideCheck> <cftry> <cfset StructInsert(variables.handlers, arguments.eventName, arguments.eventHandler, false) /> <cfcatch type="any"> <cfthrow type="MachII.framework.EventHandlerAlreadyDefined" message="An EventHandler with name '#arguments.eventName#' is already registered." /> </cfcatch> </cftry> <cfelse> <cfset variables.handlers[arguments.eventName] = arguments.eventHandler /> </cfif> </cffunction>
| configure |
|---|
public void configure( )
Configures the EventManager and checks if default and exception are defined as required.
Parameters:
Code:
<cffunction name="configure" access="public" returntype="void" output="false"
hint="Configures the EventManager and checks if default and exception are defined as required.">
<cfset var defaultEvent = "" />
<cfset var exceptionEvent = "" />
<cfif NOT IsObject(getAppManager().getParent())>
<cfset defaultEvent = getAppManager().getPropertyManager().getProperty("defaultEvent") />
<cfif NOT isEventDefined(defaultEvent, false)>
<cfthrow type="MachII.framework.noDefaultEvent"
message="A default event named '#defaultEvent#' has been not defined in the base app, but is required. Please create one." />
</cfif>
<cfset exceptionEvent = getAppManager().getPropertyManager().getProperty("exceptionEvent") />
<cfif NOT isEventDefined(exceptionEvent, false)>
<cfthrow type="MachII.framework.noExceptionEvent"
message="A exception event named '#exceptionEvent#' has been not defined in the base app, but is required. Please create one." />
</cfif>
<cfelse>
<cfif getAppManager().getPropertyManager().isPropertyDefined("defaultEvent")>
<cfset defaultEvent = getAppManager().getPropertyManager().getProperty("defaultEvent") />
<cfif NOT isEventDefined(defaultEvent, true)>
<cfthrow type="MachII.framework.noDefaultEvent"
message="A default event named '#defaultEvent#' has been defined for this module ('#getAppManager().getModuleName()#'), but no event-handler can be found in this module or parent. Please create one." />
</cfif>
</cfif>
<cfif getAppManager().getPropertyManager().isPropertyDefined("exceptionEvent")>
<cfset exceptionEvent = getAppManager().getPropertyManager().getProperty("exceptionEvent") />
<cfif NOT isEventDefined(exceptionEvent, true)>
<cfthrow type="MachII.framework.noExceptionEvent"
message="A exception event named '#exceptionEvent#' has been defined for this module ('#getAppManager().getModuleName()#'), but no event-handler can be found in this module or parent." />
</cfif>
</cfif>
</cfif>
</cffunction>
| createEvent |
|---|
public Event createEvent( string moduleName, string eventName, [struct eventArgs="#StructNew()#"], [string requestName=""], [string requestModuleName=""], [boolean checkIfEventDefined="true"] )
Creates an Event instance.
Parameters:
| string moduleName |
| string eventName |
| [struct eventArgs="#StructNew()#"] |
| [string requestName=""] |
| [string requestModuleName=""] |
| [boolean checkIfEventDefined="true"] |
Code:
<cffunction name="createEvent" access="public" returntype="MachII.framework.Event" output="false"
hint="Creates an Event instance.">
<cfargument name="moduleName" type="string" required="true" />
<cfargument name="eventName" type="string" required="true" />
<cfargument name="eventArgs" type="struct" required="false" default="#StructNew()#" />
<cfargument name="requestName" type="string" required="false" default="" />
<cfargument name="requestModuleName" type="string" required="false" default="" />
<cfargument name="checkIfEventDefined" type="boolean" required="false" default="true" />
<cfset var event = "" />
<cfif NOT arguments.checkIfEventDefined OR isEventDefined(arguments.eventName, true, arguments.moduleName)>
<cfset event = CreateObject("component", "MachII.framework.Event").init(arguments.eventName, arguments.eventArgs, arguments.requestName, arguments.requestModuleName, arguments.moduleName) />
<cfelse>
<cfthrow type="MachII.framework.EventHandlerNotDefined"
message="EventHandler for event '#arguments.eventName#' in module '#arguments.moduleName#' is not defined." />
</cfif>
<cfreturn event />
</cffunction>
| getAppManager |
|---|
public AppManager getAppManager( )
Parameters:
Code:
<cffunction name="getAppManager" access="public" returntype="MachII.framework.AppManager" output="false"> <cfreturn variables.appManager /> </cffunction>
| getEventHandler |
|---|
public EventHandler getEventHandler( string eventName, [string moduleName=""] )
Returns the EventHandler for the named Event.
Parameters:
| string eventName |
| [string moduleName=""] |
Code:
<cffunction name="getEventHandler" access="public" returntype="MachII.framework.EventHandler" output="false" hint="Returns the EventHandler for the named Event."> <cfargument name="eventName" type="string" required="true" hint="The name of the Event to handle." /> <cfargument name="moduleName" type="string" required="false" default="" /> <cfset var moduleEventManager = 0 /> <cfset var moduleManager = 0 /> <cfif arguments.moduleName neq ""> <cfif NOT IsObject(getAppManager().getParent())> <cfset moduleManager = getAppManager().getModuleManager() /> <cfelse> <cfset moduleManager = getAppManager().getParent().getModuleManager() /> </cfif> <cfset moduleEventManager = moduleManager.getModule(arguments.moduleName).getModuleAppManager().getEventManager() /> <cfreturn moduleEventManager.getEventHandler(arguments.eventName) /> <cfelseif isEventDefined(arguments.eventName)> <cfreturn variables.handlers[arguments.eventName] /> <cfelseif IsObject(getParent()) AND getParent().isEventDefined(arguments.eventName)> <cfreturn getParent().getEventHandler(arguments.eventName) /> <cfelse> <cfthrow type="MachII.framework.EventHandlerNotDefined" message="EventHandler for event '#arguments.eventName#' is not defined." /> </cfif> </cffunction>
| getEventNames |
|---|
public array getEventNames( )
Returns an array of event-handler names.
Parameters:
Code:
<cffunction name="getEventNames" access="public" returntype="array" output="false" hint="Returns an array of event-handler names."> <cfreturn StructKeyArray(variables.handlers) /> </cffunction>
| getParent |
|---|
public any getParent( )
Sets the parent EventManager instance this EventManager belongs to. It will return empty string if no parent is defined.
Parameters:
Code:
<cffunction name="getParent" access="public" returntype="any" output="false" hint="Sets the parent EventManager instance this EventManager belongs to. It will return empty string if no parent is defined."> <cfreturn variables.parentEventManager /> </cffunction>
| init |
|---|
public EventManager init( AppManager appManager, [any parentEventManager=""] )
Initialization function called by the framework.
Parameters:
| AppManager appManager |
| [any parentEventManager=""] |
Code:
<cffunction name="init" access="public" returntype="EventManager" output="false" hint="Initialization function called by the framework."> <cfargument name="appManager" type="MachII.framework.AppManager" required="true" /> <cfargument name="parentEventManager" type="any" required="false" default="" hint="Optional argument for a parent event manager. If there isn't one default to empty string." /> <cfset setAppManager(arguments.appManager) /> <cfif IsObject(arguments.parentEventManager)> <cfset setParent(arguments.parentEventManager) /> </cfif> <cfset super.init() /> <cfreturn this /> </cffunction>
| isEventDefined |
|---|
public boolean isEventDefined( string eventName, [boolean checkParent="false"], [string moduleName=""] )
Returns true if an EventHandler for the named Event is defined; otherwise false.
Parameters:
| string eventName |
| [boolean checkParent="false"] |
| [string moduleName=""] |
Code:
<cffunction name="isEventDefined" access="public" returntype="boolean" output="false" hint="Returns true if an EventHandler for the named Event is defined; otherwise false."> <cfargument name="eventName" type="string" required="true" hint="The name of the Event to handle." /> <cfargument name="checkParent" type="boolean" required="false" default="false" hint="Allows you to check the parent to see if the event is in there" /> <cfargument name="moduleName" type="string" required="false" default="" hint="Allows you to check in a specific module for an event" /> <cfset var moduleManager = "" /> <cfset var moduleEventManager = "" /> <cfif arguments.moduleName neq ""> <cfif NOT IsObject(getAppManager().getParent())> <cfset moduleManager = getAppManager().getModuleManager() /> <cfelse> <cfset moduleManager = getAppManager().getParent().getModuleManager() /> </cfif> <cfif moduleManager.isModuleDefined(arguments.moduleName)> <cfset moduleEventManager = moduleManager.getModule(arguments.moduleName).getModuleAppManager().getEventManager() /> <cfif moduleEventManager.isEventDefined(arguments.eventName, true)> <cfreturn true /> <cfelse> <cfreturn false /> </cfif> <cfelse> <cfreturn false /> </cfif> <cfelse> <cfif StructKeyExists(variables.handlers, arguments.eventName)> <cfreturn true /> <cfelseif arguments.checkParent AND IsObject(getParent())> <cfreturn getParent().isEventDefined(arguments.eventName, false, arguments.moduleName) /> <cfelse> <cfreturn false /> </cfif> </cfif> </cffunction>
| isEventPublic |
|---|
public boolean isEventPublic( string eventName, [boolean checkParent="false"] )
Returns true if the EventHandler for the named Event is publicly accessible; otherwise false.
Parameters:
| string eventName |
| [boolean checkParent="false"] |
Code:
<cffunction name="isEventPublic" access="public" returntype="boolean" output="false" hint="Returns true if the EventHandler for the named Event is publicly accessible; otherwise false."> <cfargument name="eventName" type="string" required="true" /> <cfargument name="checkParent" type="boolean" required="false" default="false" /> <cfset var eventHandler = "" /> <cfif isEventDefined(arguments.eventName)> <cfset eventHandler = getEventHandler(arguments.eventName) /> <cfelseif arguments.checkParent AND IsObject(getParent()) AND getParent().isEventDefined(arguments.eventName)> <cfset eventHandler = getParent().getEventHandler(arguments.eventName) /> <cfelse> <cfreturn false /> </cfif> <cfreturn eventHandler.getAccess() EQ "public" /> </cffunction>
| loadXml |
|---|
public void loadXml( string configXML, [boolean override="false"] )
Loads xml for the manager.
Parameters:
| string configXML |
| [boolean override="false"] |
Code:
<cffunction name="loadXml" access="public" returntype="void" output="false"
hint="Loads xml for the manager.">
<cfargument name="configXML" type="string" required="true" />
<cfargument name="override" type="boolean" required="false" default="false" />
<cfset var eventNodes = ArrayNew(1) />
<cfset var eventHandler = "" />
<cfset var eventAccess = "" />
<cfset var eventName = "" />
<cfset var commandNode = "" />
<cfset var command = "" />
<cfset var hasParent = IsObject(getParent()) />
<cfset var mapping = "" />
<cfset var i = 0 />
<cfset var j = 0 />
<cfif NOT arguments.override>
<cfset eventNodes = XMLSearch(arguments.configXML, "mach-ii/event-handlers/event-handler") />
<cfelse>
<cfset eventNodes = XMLSearch(arguments.configXML, ".//event-handlers/event-handler") />
</cfif>
<cfloop from="1" to="#ArrayLen(eventNodes)#" index="i">
<cfset eventName = eventNodes[i].xmlAttributes["event"] />
<cfif hasParent AND arguments.override AND StructKeyExists(eventNodes[i].xmlAttributes, "overrideAction")>
<cfif eventNodes[i].xmlAttributes["overrideAction"] EQ "useParent">
<cfset removeEvent(eventName) />
<cfelseif eventNodes[i].xmlAttributes["overrideAction"] EQ "addFromParent">
<cfif StructKeyExists(eventNodes[i].xmlAttributes, "mapping")>
<cfset mapping = eventNodes[i].xmlAttributes["mapping"] />
<cfelse>
<cfset mapping = eventName />
</cfif>
<cfif NOT getParent().isEventDefined(mapping)>
<cfthrow type="MachII.framework.overrideEventHandlerNotDefined"
message="An event-handler named '#mapping#' cannot be found in the parent event manager for the override named '#eventName#' in module '#getAppManager().getModuleName()#'." />
</cfif>
<cfset addEventHandler(eventName, getParent().getEventHandler(mapping), arguments.override) />
</cfif>
<cfelse>
<cfif StructKeyExists(eventNodes[i].xmlAttributes, "access")>
<cfset eventAccess = eventNodes[i].xmlAttributes["access"] />
<cfelse>
<cfset eventAccess = "public" />
</cfif>
<cfset eventHandler = CreateObject("component", "MachII.framework.EventHandler").init(eventAccess) />
<cfloop from="1" to="#ArrayLen(eventNodes[i].XMLChildren)#" index="j">
<cfset commandNode = eventNodes[i].XMLChildren[j] />
<cfset command = createCommand(commandNode, eventName, "event", arguments.override) />
<cfset eventHandler.addCommand(command) />
</cfloop>
<cfset addEventHandler(eventName, eventHandler, arguments.override) />
</cfif>
</cfloop>
</cffunction>
| removeEvent |
|---|
public void removeEvent( string eventName )
Removes an event-handler. Does NOT remove from parent.
Parameters:
| string eventName |
Code:
<cffunction name="removeEvent" access="public" returntype="void" output="false" hint="Removes an event-handler. Does NOT remove from parent."> <cfargument name="eventName" type="string" required="true" hint="The name of the Event to handle." /> <cfset StructDelete(variables.handlers, arguments.eventName, false) /> </cffunction>
| setAppManager |
|---|
public void setAppManager( AppManager appManager )
Parameters:
| AppManager appManager |
Code:
<cffunction name="setAppManager" access="public" returntype="void" output="false"> <cfargument name="appManager" type="MachII.framework.AppManager" required="true" /> <cfset variables.appManager = arguments.appManager /> </cffunction>
| setParent |
|---|
public void setParent( EventManager parentEventManager )
Returns the parent EventManager instance this EventManager belongs to.
Parameters:
| EventManager parentEventManager |
Code:
<cffunction name="setParent" access="public" returntype="void" output="false" hint="Returns the parent EventManager instance this EventManager belongs to."> <cfargument name="parentEventManager" type="MachII.framework.EventManager" required="true" /> <cfset variables.parentEventManager = arguments.parentEventManager /> </cffunction>