ruby/lib/handler/adapter.rb (44 lines of code) (raw):

# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. # @private module Qpid::Proton module Handler def self.handler_method?(method) /^on_/ =~ name; end # Handler for an array of handlers of uniform type, with non-conflicting options class ArrayHandler def initialize(handlers) raise "empty handler array" if handlers.empty? adapters = (handlers.map { |h| Adapter.adapter(h) }).uniq raise "handler array not uniform, adapters requested: #{adapters}" if adapters.size > 1 @proton_adapter_class = adapters[0] @methods = Set.new handlers.each do |h| @methods.merge(h.methods.select { |m| handler_method? m }) # Collect handler methods end end attr_reader :options, :proton_adapter_class def method_missing(name, *args) if respond_to_missing?(name) @adapters.each { |a| a.__send__(name, *args) if a.respond_to? name} else super end end def respond_to_missing?(name, private=false); @methods.include?(name); end def respond_to?(name, all=false) super || respond_to_missing?(name); end # For ruby < 1.9.2 end # Base adapter for raw proton events class Adapter def initialize(h) @handler = h; end # Create and return an adapter for handler, or return h if it does not need adapting. def self.adapt(handler) return unless handler a = Array(handler) h = (a.size == 1) ? a[0] : ArrayHandler.new(a) ac = adapter(h) ac ? ac.new(h) : h end # Adapter class if requested by handler, else default to MessagingHandler def self.adapter(handler) handler.respond_to?(:proton_adapter_class) ? handler.proton_adapter_class : MessagingAdapter end def proton_adapter_class() nil; end # Adapters don't need adapting def forward(method, *args) (@handler.__send__(method, *args); true) if @handler.respond_to? method end end end end