EventManager

Package: MachII.framework
Inherits from: framework.CommandLoaderBase
Manages registered EventHandlers for the framework.
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=""], [string eventType="MachII.framework.Event"])

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:   createCommand , setupEventArg , setupAnnounce , setupEventBean , setupViewPage , setupFilter , setupRedirect , setupDefault , setupEventMapping , setupNotify , setupExecute
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 AND isEventDefined(arguments.eventName)>
			<cfthrow type="MachII.framework.EventHandlerAlreadyDefined"
				message="An EventHandler with name '#arguments.eventName#' is already registered." />
		<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, 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, 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=""], [string eventType="MachII.framework.Event"] )

Creates an Event instance.

Parameters:
string moduleName
string eventName
[struct eventArgs="#StructNew()#"]
[string requestName=""]
[string requestModuleName=""]
[string eventType="MachII.framework.Event"]

Code:

	<cffunction name="createEvent" access="public" returntype="MachII.framework.Event" output="true"
		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="eventType" type="string" required="false" default="MachII.framework.Event" />
		
		<cfset var event = "" />
		
		<cfif isEventDefined(arguments.eventName, true, arguments.moduleName)>
			<cfset event = CreateObject("component", arguments.eventType).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"
		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>
		
		<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 commandNode = "" />
		<cfset var eventNodes = "" />
		<cfset var eventHandler = "" />
		<cfset var eventAccess = "" />
		<cfset var eventName = "" />
		<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) />
					<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>