blob: 0879f0fcd15305da5ee9c2d085573aa1f0fd5d74 [file] [log] [blame]
#--
# 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.
#++
module Qpid
module Messaging
# Address represents an address to which messages can be sent or from
# which they can be received.
#
# == The +Address+ String
#
# An +Address+ can be described using the following pattern:
#
# <address> [ / <subject> ] ; [ { <key> : <value> , ... } ]
#
# where *address* is a simple name and *subject* is a subject or subject
# pattern.
#
# === Options
#
# The options, enclosed in curly braces, are key:value pairs delimited by
# a comma. The values can be nested maps also enclosed in curly braces.
# Or they can be lists of values, where they are contained within square
# brackets but still comma delimited, such as:
#
# [value1,value2,value3]
#
# The following are the list of supported options:
#
# [create]
# Indicates if the address should be created; values are *always*,
# *never*, *sender* or *reciever*.
#
# [assert]
# Indicates whether or not to assert any specified node properties;
# values are *always*, *never*, *sender* or *receiver*.
#
# [delete]
# Indicates whether or not to delete the addressed node when a sender
# or receiver is cancelled; values are *always*, *never*, *sender* or
# *receiver*.
#
# [node]
# A nested map describing properties for the addressed node. Properties
# are *type* (*topic* or *queue*), *durable* (a boolean), *x-declare*
# (a nested map of amqp 0.10-specific options) and *x-bindings* (nested
# list which specifies a queue, exchange or a binding key and arguments).
#
# [link]
# A nested map through which properties of the link can be specified;
# properties are *durable*, *reliability*, *x-declare*, *x-subscribe*
# and *x-bindings*.
#
# [mode]
# (*For receivers only*) indicates whether the receiver should consume
# or browse messages; values are *consume* (the default) and *browse*.
class Address
# Creates a new +Address+ from an address string.
#
# ==== Attributes
#
# * +address+ - the address string
#
# ==== Examples
#
# # create a new address for a queue named "my-queue" that will
# # be created if it doesn't already exist
# addr = Qpid::Messaging::Address.new "my-queue;{create:always}"
#
def initialize(address, address_impl = nil)
@address_impl = address_impl || Cqpid::Address.new(address)
end
def address_impl # :nodoc:
@address_impl
end
# Returns the name for the +Address+.
#
# ==== Examples
#
# # display the name of the address
# addr = Qpid::Messaging::Address.new "foo;{create:always}"
# # outputs the word 'foo'
# puts addr.name
#
def name; @address_impl.getName; end
# Sets the name for the +Address+.
#
# ==== Examples
#
# # create a new address with the name "my-queue"
# addr = Qpid::Messaging::Address.new "my-queue/my-subject;{create:always}"
# # changes the name to "my-new-queue"
# addr.name = "my-new-queue"
#
def name=(name); @address_impl.setName name; end
# Returns the subject for the +Address+.
#
# ==== Examples
#
# # creates a new address with the subject "bar"
# addr = Qpid::Messaging::Address.new "my-queue/bar;{create:always}"
#
def subject; @address_impl.getSubject; end
# Sets the subject for the +Address+.
#
# ==== Examples
#
# # creates an address with the subject "example"
# addr = Qpid::Messaging::Address.new "my-queue/example;{create:always}"
# # changes the subject to "test"
# addr.subject = "test"
#
def subject=(subject); @address_impl.setSubject(subject); end
# Returns the type for the +Address+.
#--
# We cannot use "type" since that clashes with the Ruby object.type
# identifier.
#++
def address_type; @address_impl.getType; end
# Sets the type for the +Address+.
#
# The type of the address determines how +Sender+ and +Receiver+ objects
# are constructed for it. It also affects how a reply-to address is
# encoded.
#
# If no type is specified then it will be determined by querying the
# broker. Explicitly setting the type prevents this.
#
# Values are either *queue* or *topic*.
#
# ==== Options
#
# * +type+ - the address type
#
# ==== Examples
#
# # creates an queue address
# addr = Qpid::Messaging::Address.new "my-queue;{create:always}"
# addr.address_type = "queue"
#
def address_type=(type); @address_impl.setType(type); end
# Returns the options.
def options; @address_impl.getOptions; end
# Sets the options for the address.
#
# *NOTE:* See the class documentation for more details on options.
#
# ==== Examples
#
# addr.options = :create => :always
# addr.options = :create => :always, :delete => :always
#
def options=(options = {}); @address_impl.setOptions(convert_options(options)); end
def to_s # :nodoc:
@address_impl.str
end
private
def convert_options(options)
result = {}
options.each_pair {|key, value| result[key.to_s] = value.to_s}
return result
end
end
end
end