You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by mc...@apache.org on 2014/11/18 23:13:50 UTC

[2/3] qpid-proton git commit: PROTON-747: Around wrappers for Ruby Messenger methods that raise errors

PROTON-747: Around wrappers for Ruby Messenger methods that raise errors

Each method that could potentially raise an exception in
Qpid::Proton::Message is now wrapped by a method which checks for, and
then raises, the appropriate runtime error based on the error code.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/66150aa7
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/66150aa7
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/66150aa7

Branch: refs/heads/master
Commit: 66150aa7a845c2210ab7c1b0c0e011988a60de2e
Parents: 0d1b8a8
Author: Darryl L. Pierce <mc...@gmail.com>
Authored: Fri Nov 14 09:45:17 2014 -0500
Committer: Darryl L. Pierce <mc...@gmail.com>
Committed: Tue Nov 18 09:34:43 2014 -0500

----------------------------------------------------------------------
 .../ruby/lib/qpid_proton/exception_handling.rb  | 43 +++++++++++++++++
 .../bindings/ruby/lib/qpid_proton/messenger.rb  | 50 ++++++++++++++------
 2 files changed, 79 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/66150aa7/proton-c/bindings/ruby/lib/qpid_proton/exception_handling.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/exception_handling.rb b/proton-c/bindings/ruby/lib/qpid_proton/exception_handling.rb
index f8ac8c6..4dce3ef 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/exception_handling.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/exception_handling.rb
@@ -25,6 +25,49 @@ module Qpid
     #
     module ExceptionHandling
 
+      def self.included(base)
+        base.extend(self)
+
+        unless defined? base.to_be_wrapped
+          class << base
+            @@to_be_wrapped = []
+          end
+        end
+
+        define_method :method_added do |name|
+          if (!@@to_be_wrapped.nil?) && (@@to_be_wrapped.include? name)
+            @@to_be_wrapped.delete name
+            create_exception_handler_wrapper(name)
+          end
+        end
+      end
+
+      def can_raise_exception(method_names)
+        # coerce the names to be an array
+        Array(method_names).each do |method_name|
+          # if the method doesn't already exist then queue this aliasing
+          unless self.method_defined? method_name
+            @@to_be_wrapped ||= []
+            @@to_be_wrapped << method_name
+          else
+            create_exception_handler_wrapper(method_name)
+          end
+        end
+      end
+
+      def create_exception_handler_wrapper(method_name)
+        original_method_name = method_name.to_s
+        wrapped_method_name = "_excwrap_#{original_method_name}"
+        alias_method wrapped_method_name, original_method_name
+        define_method original_method_name do |*args, &block|
+          # need to get a reference to the method object itself since
+          # calls to Class.send interfere with Messenger.send
+          method = self.method(wrapped_method_name.to_sym)
+          rc = method.call(*args, &block)
+          check_for_error(rc)
+        end
+      end
+
       # Raises an Proton-specific error if a return code is non-zero.
       #
       # Expects the class to provide an +error+ method.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/66150aa7/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb b/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb
index 044a3ad..66a2f93 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb
@@ -59,6 +59,11 @@ module Qpid
 
       include Qpid::Proton::ExceptionHandling
 
+      can_raise_exception [:send, :receive, :password=, :start, :stop,
+                           :perform_put, :perform_get, :interrupt,
+                           :route, :rewrite, :accept, :reject,
+                           :incoming_window=, :outgoing_window=]
+
       # Creates a new +Messenger+.
       #
       # The +name+ parameter is optional. If one is not provided then
@@ -94,7 +99,7 @@ module Qpid
       # * password - the password
       #
       def password=(password)
-        check_for_error(Cproton.pn_messenger_set_password(@impl, password))
+        Cproton.pn_messenger_set_password(@impl, password)
       end
 
       # Returns the password property for the Messenger.private_key file.
@@ -193,14 +198,14 @@ module Qpid
       # before starting the +Messenger+.
       #
       def start
-        check_for_error(Cproton.pn_messenger_start(@impl))
+        Cproton.pn_messenger_start(@impl)
       end
 
       # Stops the +Messenger+, preventing it from sending or receiving
       # any more messages.
       #
       def stop
-        check_for_error(Cproton.pn_messenger_stop(@impl))
+        Cproton.pn_messenger_stop(@impl)
       end
 
       # Returns true iff a Messenger is in the stopped state.
@@ -313,10 +318,19 @@ module Qpid
         raise ArgumentError.new("invalid message type: #{message.class}") unless message.kind_of?(Message)
         # encode the message first
         message.pre_encode
-        check_for_error(Cproton.pn_messenger_put(@impl, message.impl))
+        perform_put(message)
         return outgoing_tracker
       end
 
+      private
+
+      def perform_put(message) # :nodoc:
+        Cproton.pn_messenger_put(@impl, message.impl)
+      end
+
+      public
+
+
       # This call will block until the indicated number of messages
       # have been sent, or until the operation times out.
       # If n is -1 this call will block until all outgoing messages
@@ -324,7 +338,7 @@ module Qpid
       # it can without blocking.
       #
       def send(n = -1)
-        check_for_error(Cproton.pn_messenger_send(@impl, n))
+        Cproton.pn_messenger_send(@impl, n)
       end
 
       # Moves the message from the head of the incoming message queue into
@@ -348,11 +362,19 @@ module Qpid
         else
           msg_impl = msg.impl
         end
-        check_for_error(Cproton.pn_messenger_get(@impl, msg_impl))
+        perform_get(msg_impl)
         msg.post_decode unless msg.nil?
         return incoming_tracker
       end
 
+      private
+
+      def perform_get(msg) # :nodoc:
+        Cproton.pn_messenger_get(@impl, msg)
+      end
+
+      public
+
       # Receives up to limit messages into the incoming queue.  If no value
       # for limit is supplied, this call will receive as many messages as it
       # can buffer internally.  If the Messenger is in blocking mode, this
@@ -364,7 +386,7 @@ module Qpid
       # * limit - the maximum number of messages to receive
       #
       def receive(limit = -1)
-        check_for_error(Cproton.pn_messenger_recv(@impl, limit))
+        Cproton.pn_messenger_recv(@impl, limit)
       end
 
       def receiving
@@ -384,7 +406,7 @@ module Qpid
       # originated the interrupt.
       #
       def interrupt
-        check_for_error(Cproton.pn_messenger_interrupt(@impl))
+        Cproton.pn_messenger_interrupt(@impl)
       end
 
       # Sends or receives any outstanding messages queued for a Messenger.
@@ -472,7 +494,7 @@ module Qpid
       #   messenger.route("*", "amqp://user:password@broker/$1")
       #
       def route(pattern, address)
-        check_for_error(Cproton.pn_messenger_route(@impl, pattern, address))
+        Cproton.pn_messenger_route(@impl, pattern, address)
       end
 
       # Similar to #route, except that the destination of
@@ -494,7 +516,7 @@ module Qpid
       # * address - the target address
       #
       def rewrite(pattern, address)
-        check_for_error(Cproton.pn_messenger_rewrite(@impl, pattern, address))
+        Cproton.pn_messenger_rewrite(@impl, pattern, address)
       end
 
       def selectable
@@ -548,7 +570,7 @@ module Qpid
         else
           flag = 0
         end
-        check_for_error(Cproton.pn_messenger_accept(@impl, tracker.impl, flag))
+        Cproton.pn_messenger_accept(@impl, tracker.impl, flag)
       end
 
       # Rejects the incoming message identified by the tracker.
@@ -568,7 +590,7 @@ module Qpid
         else
           flag = 0
         end
-        check_for_error(Cproton.pn_messenger_reject(@impl, tracker.impl, flag))
+        Cproton.pn_messenger_reject(@impl, tracker.impl, flag)
       end
 
       # Gets the last known remote state of the delivery associated with
@@ -624,7 +646,7 @@ module Qpid
       #
       def incoming_window=(window)
         raise TypeError.new("invalid window: #{window}") unless valid_window?(window)
-        check_for_error(Cproton.pn_messenger_set_incoming_window(@impl, window))
+        Cproton.pn_messenger_set_incoming_window(@impl, window)
       end
 
       # Returns the incoming window.
@@ -648,7 +670,7 @@ module Qpid
       #
       def outgoing_window=(window)
         raise TypeError.new("invalid window: #{window}") unless valid_window?(window)
-        check_for_error(Cproton.pn_messenger_set_outgoing_window(@impl, window))
+        Cproton.pn_messenger_set_outgoing_window(@impl, window)
       end
 
       # Returns the outgoing window.


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org