lib/openwfe/participants/participantmap.rb in ruote-0.9.18 vs lib/openwfe/participants/participantmap.rb in ruote-0.9.19
- old
+ new
@@ -1,34 +1,34 @@
#
#--
# Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
+#
+# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
-#
+#
# . Redistributions of source code must retain the above copyright notice, this
-# list of conditions and the following disclaimer.
-#
-# . Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
+# list of conditions and the following disclaimer.
+#
+# . Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
-#
+#
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#++
#
#
@@ -43,207 +43,207 @@
require 'openwfe/participants/participants'
module OpenWFE
- #
- # A very simple directory of participants
- #
- class ParticipantMap < Service
- include OwfeObservable
+ #
+ # A very simple directory of participants
+ #
+ class ParticipantMap < Service
+ include OwfeObservable
- attr_accessor :participants
+ attr_accessor :participants
- def initialize (service_name, application_context)
+ def initialize (service_name, application_context)
- super
+ super
- @participants = []
- @observers = {}
- end
+ @participants = []
+ @observers = {}
+ end
- #
- # Returns how many participants are currently registered here.
- #
- def size
+ #
+ # Returns how many participants are currently registered here.
+ #
+ def size
- @participants.size
- end
+ @participants.size
+ 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.
- #
- def register_participant (regex, params, &block)
+ #
+ # 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.
+ #
+ def register_participant (regex, params, &block)
- participant = params[:participant]
- position = params[:position]
+ participant = params[:participant]
+ position = params[:position]
- if not participant
+ if not participant
- raise "please provide a participant instance or a block" \
- if not block
+ raise "please provide a participant instance or a block" \
+ if not block
- participant = BlockParticipant.new block
- end
+ participant = BlockParticipant.new block
+ end
- ldebug do
- "register_participant() "+
- "participant class is #{participant.class}"
- end
+ ldebug do
+ "register_participant() "+
+ "participant class is #{participant.class}"
+ end
- if participant.is_a?(Class)
+ if participant.is_a?(Class)
- ldebug { "register_participant() class #{participant}" }
+ ldebug { "register_participant() class #{participant}" }
- begin
+ begin
- participant = participant.new(regex, @application_context)
+ participant = participant.new(regex, @application_context)
- rescue Exception => e
- #ldebug do
- # "register_participant() " +
- # "falling back to no param constructor because of \n" +
- # OpenWFE::exception_to_s(e)
- #end
+ rescue Exception => e
+ #ldebug do
+ # "register_participant() " +
+ # "falling back to no param constructor because of \n" +
+ # OpenWFE::exception_to_s(e)
+ #end
- participant = participant.new
- end
- end
+ participant = participant.new
+ end
+ end
- original_string = regex.to_s
+ original_string = regex.to_s
- unless regex.kind_of?(Regexp)
+ unless regex.kind_of?(Regexp)
- regex = regex.to_s
- regex = "^" + regex unless regex[0, 1] == "^"
- regex = regex + "$" unless regex[-1, 1] == "$"
+ regex = regex.to_s
+ regex = "^" + regex unless regex[0, 1] == "^"
+ regex = regex + "$" unless regex[-1, 1] == "$"
- ldebug { "register_participant() '#{regex}'" }
+ ldebug { "register_participant() '#{regex}'" }
- regex = Regexp.new(regex)
- end
-
- class << regex
- attr_reader :original_string
- end
- regex.instance_variable_set '@original_string', original_string
+ regex = Regexp.new(regex)
+ end
- participant.application_context = @application_context \
- if participant.respond_to?(:application_context=)
+ class << regex
+ attr_reader :original_string
+ end
+ regex.instance_variable_set '@original_string', original_string
- # now add the participant to the list
+ participant.application_context = @application_context \
+ if participant.respond_to?(:application_context=)
- entry = [ regex, participant ]
+ # now add the participant to the list
- index = (position == :first) ? 0 : -1
+ entry = [ regex, participant ]
- @participants.insert index, entry
+ index = (position == :first) ? 0 : -1
- participant
- end
+ @participants.insert index, entry
- #
- # Looks up a participant given a participant_name.
- # Will return the first participant whose name matches.
- #
- def lookup_participant (participant_name)
+ participant
+ end
- #ldebug { "lookup_participant() '#{participant_name}'" }
+ #
+ # Looks up a participant given a participant_name.
+ # Will return the first participant whose name matches.
+ #
+ def lookup_participant (participant_name)
- participant_name = participant_name.to_s
+ #ldebug { "lookup_participant() '#{participant_name}'" }
- @participants.each do |tuple|
- return tuple[1] if tuple[0].match(participant_name)
- end
+ participant_name = participant_name.to_s
- nil
- end
+ @participants.each do |tuple|
+ return tuple[1] if tuple[0].match(participant_name)
+ end
- #
- # Deletes the first participant matching the given name.
- #
- # If 'participant_name' is an integer, will remove the participant
- # at that position in the participant list.
- #
- def unregister_participant (participant_name)
+ nil
+ end
- return (@participants.delete_at(participant_name) != nil) \
- if participant_name.is_a?(Integer)
+ #
+ # Deletes the first participant matching the given name.
+ #
+ # If 'participant_name' is an integer, will remove the participant
+ # at that position in the participant list.
+ #
+ def unregister_participant (participant_name)
- participant_name = participant_name.to_s
+ return (@participants.delete_at(participant_name) != nil) \
+ if participant_name.is_a?(Integer)
- p = @participants.find do |tuple|
- tuple[0].original_string == participant_name
- end
- @participants.delete(p) if p
-
- (p != nil)
- end
+ participant_name = participant_name.to_s
- #
- # 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.
- #
- def dispatch (participant, participant_name, workitem)
+ p = @participants.find do |tuple|
+ tuple[0].original_string == participant_name
+ end
+ @participants.delete(p) if p
- unless participant
+ (p != nil)
+ end
- participant = lookup_participant participant_name
+ #
+ # 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.
+ #
+ def dispatch (participant, participant_name, workitem)
- raise "there is no participant named '#{participant_name}'" \
- unless participant
- end
+ unless participant
- workitem.participant_name = participant_name
+ participant = lookup_participant participant_name
- return cancel(participant, workitem) \
- if workitem.is_a?(CancelItem)
+ raise "there is no participant named '#{participant_name}'" \
+ unless participant
+ end
- onotify :dispatch, :before_consume, workitem
+ workitem.participant_name = participant_name
- workitem.dispatch_time = Time.now
+ return cancel(participant, workitem) \
+ if workitem.is_a?(CancelItem)
- participant.consume workitem
+ onotify :dispatch, :before_consume, workitem
- onotify :dispatch, :after_consume, workitem
- end
+ workitem.dispatch_time = Time.now
- #
- # The method onotify (from Osbservable) is made public so that
- # ParticipantExpression instances may notify the pmap of applies
- # and replies.
- #
- public :onotify
+ participant.consume workitem
- protected
+ onotify :dispatch, :after_consume, workitem
+ end
- #
- # Will call the cancel method of the participant if it has
- # one, or will simply discard the cancel item else.
- #
- def cancel (participant, cancel_item)
+ #
+ # The method onotify (from Osbservable) is made public so that
+ # ParticipantExpression instances may notify the pmap of applies
+ # and replies.
+ #
+ public :onotify
- participant.cancel(cancel_item) \
- if participant.respond_to?(:cancel)
+ protected
- onotify :dispatch, :cancel, cancel_item
- #
- # maybe it'd be better to specifically log that
- # a participant has no cancel() method, but it's OK
- # like that for now.
- end
- end
+ #
+ # Will call the cancel method of the participant if it has
+ # one, or will simply discard the cancel item else.
+ #
+ def cancel (participant, cancel_item)
+
+ participant.cancel(cancel_item) \
+ if participant.respond_to?(:cancel)
+
+ onotify :dispatch, :cancel, cancel_item
+ #
+ # maybe it'd be better to specifically log that
+ # a participant has no cancel() method, but it's OK
+ # like that for now.
+ end
+ end
end