Class | OpenWFE::ParticipantMap |
In: |
lib/openwfe/participants/participantmap.rb
|
Parent: | Service |
A very simple directory of participants
participants | [RW] |
# File lib/openwfe/participants/participantmap.rb, line 58 58: def initialize (service_name, application_context) 59: 60: super 61: 62: @participants = [] 63: @observers = {} 64: end
Dispatches to the given participant (participant name (string) or The workitem will be fed to the consume() method of that participant. If it‘s a cancelitem and the participant has a cancel() method, it will get called instead.
# File lib/openwfe/participants/participantmap.rb, line 194 194: def dispatch (participant, participant_name, workitem) 195: 196: unless participant 197: 198: participant = lookup_participant participant_name 199: 200: raise "there is no participant named '#{participant_name}'" \ 201: unless participant 202: end 203: 204: workitem.participant_name = participant_name 205: 206: return cancel(participant, workitem) \ 207: if workitem.is_a?(CancelItem) 208: 209: onotify :dispatch, :before_consume, workitem 210: 211: workitem.dispatch_time = Time.now 212: 213: participant.consume workitem 214: 215: onotify :dispatch, :after_consume, workitem 216: end
Looks up a participant given a participant_name. Will return the first participant whose name matches.
# File lib/openwfe/participants/participantmap.rb, line 160 160: def lookup_participant (participant_name) 161: 162: #ldebug { "lookup_participant() '#{participant_name}'" } 163: 164: participant_name = participant_name.to_s 165: 166: @participants.each do |tuple| 167: return tuple[1] if tuple[0].match(participant_name) 168: end 169: 170: nil 171: end
Adds a participant to this map. This method is called by the engine‘s own register_participant() method.
The participant instance is returned by this method call.
The know params are :participant (a participant instance or class) and :position (which can be null or :first).
By default (if :position is not set to :first), the participant will appear at the bottom of the participant list.
# File lib/openwfe/participants/participantmap.rb, line 87 87: def register_participant (regex, params, &block) 88: 89: participant = params[:participant] 90: position = params[:position] 91: 92: if not participant 93: 94: raise "please provide a participant instance or a block" \ 95: if not block 96: 97: participant = BlockParticipant.new block 98: end 99: 100: ldebug do 101: "register_participant() "+ 102: "participant class is #{participant.class}" 103: end 104: 105: if participant.is_a?(Class) 106: 107: ldebug { "register_participant() class #{participant}" } 108: 109: begin 110: 111: participant = participant.new(regex, @application_context) 112: 113: rescue Exception => e 114: #ldebug do 115: # "register_participant() " + 116: # "falling back to no param constructor because of \n" + 117: # OpenWFE::exception_to_s(e) 118: #end 119: 120: participant = participant.new 121: end 122: end 123: 124: original_string = regex.to_s 125: 126: unless regex.kind_of?(Regexp) 127: 128: regex = regex.to_s 129: regex = "^" + regex unless regex[0, 1] == "^" 130: regex = regex + "$" unless regex[-1, 1] == "$" 131: 132: ldebug { "register_participant() '#{regex}'" } 133: 134: regex = Regexp.new(regex) 135: end 136: 137: class << regex 138: attr_reader :original_string 139: end 140: regex.instance_variable_set '@original_string', original_string 141: 142: participant.application_context = @application_context \ 143: if participant.respond_to?(:application_context=) 144: 145: # now add the participant to the list 146: 147: entry = [ regex, participant ] 148: 149: index = (position == :first) ? 0 : -1 150: 151: @participants.insert index, entry 152: 153: participant 154: end
Returns how many participants are currently registered here.
# File lib/openwfe/participants/participantmap.rb, line 69 69: def size 70: 71: @participants.size 72: end
Deletes the first participant matching the given name.
# File lib/openwfe/participants/participantmap.rb, line 176 176: def unregister_participant (participant_name) 177: 178: participant_name = participant_name.to_s 179: 180: p = @participants.find do |tuple| 181: tuple[0].original_string == participant_name 182: end 183: @participants.delete(p) if p 184: 185: (p != nil) 186: end
Will call the cancel method of the participant if it has one, or will simply discard the cancel item else.
# File lib/openwfe/participants/participantmap.rb, line 231 231: def cancel (participant, cancel_item) 232: 233: participant.cancel(cancel_item) \ 234: if participant.respond_to?(:cancel) 235: 236: onotify :dispatch, :cancel, cancel_item 237: # 238: # maybe it'd be better to specifically log that 239: # a participant has no cancel() method, but it's OK 240: # like that for now. 241: end