You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2009/08/26 20:44:14 UTC
svn commit: r808155 - /qpid/trunk/qpid/cpp/bindings/qmf/ruby/qmf.rb
Author: tross
Date: Wed Aug 26 18:44:14 2009
New Revision: 808155
URL: http://svn.apache.org/viewvc?rev=808155&view=rev
Log:
Purely cosmetic changes, no functional change.
- Changed indentation
- Re-ordered class definitions for more logical grouping
Modified:
qpid/trunk/qpid/cpp/bindings/qmf/ruby/qmf.rb
Modified: qpid/trunk/qpid/cpp/bindings/qmf/ruby/qmf.rb
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/bindings/qmf/ruby/qmf.rb?rev=808155&r1=808154&r2=808155&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/bindings/qmf/ruby/qmf.rb (original)
+++ qpid/trunk/qpid/cpp/bindings/qmf/ruby/qmf.rb Wed Aug 26 18:44:14 2009
@@ -23,547 +23,567 @@
module Qmf
- # Pull all the TYPE_* constants into Qmf namespace. Maybe there's an easier way?
- Qmfengine.constants.each do |c|
- if c.index('TYPE_') == 0 or c.index('ACCESS_') == 0 or c.index('DIR_') == 0
- const_set(c, Qmfengine.const_get(c))
- end
+ # Pull all the TYPE_* constants into Qmf namespace. Maybe there's an easier way?
+ Qmfengine.constants.each do |c|
+ if c.index('TYPE_') == 0 or c.index('ACCESS_') == 0 or c.index('DIR_') == 0
+ const_set(c, Qmfengine.const_get(c))
end
+ end
- class ConnectionSettings
- attr_reader :impl
+ ##==============================================================================
+ ## CONNECTION
+ ##==============================================================================
- def initialize(url = nil)
- if url
- @impl = Qmfengine::ConnectionSettings.new(url)
- else
- @impl = Qmfengine::ConnectionSettings.new()
- end
- end
-
- def set_attr(key, val)
- if val.class == String
- v = Qmfengine::Value.new(TYPE_LSTR)
- v.setString(val)
- elsif val.class == TrueClass or val.class == FalseClass
- v = Qmfengine::Value.new(TYPE_BOOL)
- v.setBool(val)
- elsif val.class == Fixnum
- v = Qmfengine::Value.new(TYPE_UINT32)
- v.setUint(val)
- else
- raise ArgumentError, "Value for attribute '#{key}' has unsupported type: #{val.class}"
- end
+ class ConnectionSettings
+ attr_reader :impl
- @impl.setAttr(key, v)
+ def initialize(url = nil)
+ if url
+ @impl = Qmfengine::ConnectionSettings.new(url)
+ else
+ @impl = Qmfengine::ConnectionSettings.new()
end
end
- class ConnectionHandler
- def conn_event_connected(); end
- def conn_event_disconnected(error); end
- def sess_event_session_closed(context, error); end
- def sess_event_recv(context, message); end
+ def set_attr(key, val)
+ if val.class == String
+ v = Qmfengine::Value.new(TYPE_LSTR)
+ v.setString(val)
+ elsif val.class == TrueClass or val.class == FalseClass
+ v = Qmfengine::Value.new(TYPE_BOOL)
+ v.setBool(val)
+ elsif val.class == Fixnum
+ v = Qmfengine::Value.new(TYPE_UINT32)
+ v.setUint(val)
+ else
+ raise ArgumentError, "Value for attribute '#{key}' has unsupported type: #{val.class}"
+ end
+
+ @impl.setAttr(key, v)
end
+ end
- class Query
- attr_reader :impl
- def initialize(i)
- @impl = i
- end
+ class ConnectionHandler
+ def conn_event_connected(); end
+ def conn_event_disconnected(error); end
+ def sess_event_session_closed(context, error); end
+ def sess_event_recv(context, message); end
+ end
- def package_name
- @impl.getPackage
- end
+ class Query
+ attr_reader :impl
+ def initialize(i)
+ @impl = i
+ end
- def class_name
- @impl.getClass
- end
+ def package_name
+ @impl.getPackage
+ end
- def object_id
- objid = @impl.getObjectId
- if objid.class == NilClass
- return nil
- end
- return ObjectId.new(objid)
+ def class_name
+ @impl.getClass
+ end
+
+ def object_id
+ objid = @impl.getObjectId
+ if objid.class == NilClass
+ return nil
end
+ return ObjectId.new(objid)
end
+ end
- class Connection
- attr_reader :impl
+ class Connection
+ attr_reader :impl
- def initialize(settings)
- @impl = Qmfengine::ResilientConnection.new(settings.impl)
- @sockEngine, @sock = Socket::socketpair(Socket::PF_UNIX, Socket::SOCK_STREAM, 0)
- @impl.setNotifyFd(@sockEngine.fileno)
- @new_conn_handlers = Array.new
- @conn_handlers = Array.new
- @sess_handlers = Array.new
+ def initialize(settings)
+ @impl = Qmfengine::ResilientConnection.new(settings.impl)
+ @sockEngine, @sock = Socket::socketpair(Socket::PF_UNIX, Socket::SOCK_STREAM, 0)
+ @impl.setNotifyFd(@sockEngine.fileno)
+ @new_conn_handlers = Array.new
+ @conn_handlers = Array.new
+ @sess_handlers = Array.new
- @thread = Thread.new do
- run
- end
+ @thread = Thread.new do
+ run
end
+ end
- def add_conn_handler(handler)
- @new_conn_handlers.push(handler)
- @sockEngine.write("x")
- end
+ def add_conn_handler(handler)
+ @new_conn_handlers.push(handler)
+ @sockEngine.write("x")
+ end
- def add_sess_handler(handler)
- @sess_handlers.push(handler)
- end
+ def add_sess_handler(handler)
+ @sess_handlers.push(handler)
+ end
- def run()
- event = Qmfengine::ResilientConnectionEvent.new
- connected = nil
- while :true
- @sock.read(1)
+ def run()
+ event = Qmfengine::ResilientConnectionEvent.new
+ connected = nil
+ while :true
+ @sock.read(1)
- @new_conn_handlers.each do |nh|
- @conn_handlers.push(nh)
- nh.conn_event_connected() if connected
- end
- @new_conn_handlers = Array.new
+ @new_conn_handlers.each do |nh|
+ @conn_handlers.push(nh)
+ nh.conn_event_connected() if connected
+ end
+ @new_conn_handlers = Array.new
- valid = @impl.getEvent(event)
- while valid
- begin
- case event.kind
- when Qmfengine::ResilientConnectionEvent::CONNECTED
- connected = :true
- @conn_handlers.each { |h| h.conn_event_connected() }
- when Qmfengine::ResilientConnectionEvent::DISCONNECTED
- connected = nil
- @conn_handlers.each { |h| h.conn_event_disconnected(event.errorText) }
- when Qmfengine::ResilientConnectionEvent::SESSION_CLOSED
- event.sessionContext.handler.sess_event_session_closed(event.sessionContext, event.errorText)
- when Qmfengine::ResilientConnectionEvent::RECV
- event.sessionContext.handler.sess_event_recv(event.sessionContext, event.message)
- end
- rescue Exception => ex
- puts "Event Exception: #{ex}"
- puts ex.backtrace
+ valid = @impl.getEvent(event)
+ while valid
+ begin
+ case event.kind
+ when Qmfengine::ResilientConnectionEvent::CONNECTED
+ connected = :true
+ @conn_handlers.each { |h| h.conn_event_connected() }
+ when Qmfengine::ResilientConnectionEvent::DISCONNECTED
+ connected = nil
+ @conn_handlers.each { |h| h.conn_event_disconnected(event.errorText) }
+ when Qmfengine::ResilientConnectionEvent::SESSION_CLOSED
+ event.sessionContext.handler.sess_event_session_closed(event.sessionContext, event.errorText)
+ when Qmfengine::ResilientConnectionEvent::RECV
+ event.sessionContext.handler.sess_event_recv(event.sessionContext, event.message)
end
- @impl.popEvent
- valid = @impl.getEvent(event)
+ rescue Exception => ex
+ puts "Event Exception: #{ex}"
+ puts ex.backtrace
end
+ @impl.popEvent
+ valid = @impl.getEvent(event)
end
end
end
+ end
- class Session
- attr_reader :handle, :handler
+ class Session
+ attr_reader :handle, :handler
- def initialize(conn, label, handler)
- @conn = conn
- @label = label
- @handler = handler
- @handle = Qmfengine::SessionHandle.new
- @conn.add_sess_handler(@handler)
- result = @conn.impl.createSession(label, self, @handle)
- end
+ def initialize(conn, label, handler)
+ @conn = conn
+ @label = label
+ @handler = handler
+ @handle = Qmfengine::SessionHandle.new
+ @conn.add_sess_handler(@handler)
+ result = @conn.impl.createSession(label, self, @handle)
end
+ end
- class ObjectId
- attr_reader :impl
- def initialize(impl=nil)
- if impl
- @impl = impl
- else
- @impl = Qmfengine::ObjectId.new
- end
- end
+ ##==============================================================================
+ ## OBJECTS
+ ##==============================================================================
- def object_num_high
- return @impl.getObjectNumHi
- end
+ class QmfObject
+ attr_reader :impl, :object_class
+ def initialize(cls)
+ @object_class = cls
+ @impl = Qmfengine::Object.new(@object_class.impl)
+ end
- def object_num_low
- return @impl.getObjectNumLo
- end
+ def destroy
+ @impl.destroy
+ end
- def ==(other)
- return (@impl.getObjectNumHi == other.impl.getObjectNumHi) &&
- (@impl.getObjectNumLo == other.impl.getObjectNumLo)
- end
+ def object_id
+ return ObjectId.new(@impl.getObjectId)
end
- class Arguments
- attr_reader :map
- def initialize(map)
- @map = map
- @by_hash = {}
- key_count = @map.keyCount
- a = 0
- while a < key_count
- @by_hash[@map.key(a)] = by_key(@map.key(a))
- a += 1
- end
- end
+ def set_object_id(oid)
+ @impl.setObjectId(oid.impl)
+ end
- def [] (key)
- return @by_hash[key]
+ def get_attr(name)
+ val = value(name)
+ case val.getType
+ when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
+ when TYPE_UINT64 then val.asUint64
+ when TYPE_SSTR, TYPE_LSTR then val.asString
+ when TYPE_ABSTIME then val.asInt64
+ when TYPE_DELTATIME then val.asUint64
+ when TYPE_REF then val.asObjectId
+ when TYPE_BOOL then val.asBool
+ when TYPE_FLOAT then val.asFloat
+ when TYPE_DOUBLE then val.asDouble
+ when TYPE_UUID then val.asUuid
+ when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
+ when TYPE_INT64 then val.asInt64
+ when TYPE_MAP
+ when TYPE_OBJECT
+ when TYPE_LIST
+ when TYPE_ARRAY
end
+ end
- def []= (key, value)
- @by_hash[key] = value
- set(key, value)
- end
-
- def each
- @by_hash.each { |k, v| yield(k, v) }
- end
-
- def by_key(key)
- val = @map.byKey(key)
- case val.getType
- when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
- when TYPE_UINT64 then val.asUint64
- when TYPE_SSTR, TYPE_LSTR then val.asString
- when TYPE_ABSTIME then val.asInt64
- when TYPE_DELTATIME then val.asUint64
- when TYPE_REF then val.asObjectId
- when TYPE_BOOL then val.asBool
- when TYPE_FLOAT then val.asFloat
- when TYPE_DOUBLE then val.asDouble
- when TYPE_UUID then val.asUuid
- when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
- when TYPE_INT64 then val.asInt64
- when TYPE_MAP
- when TYPE_OBJECT
- when TYPE_LIST
- when TYPE_ARRAY
- end
+ def set_attr(name, v)
+ val = value(name)
+ case val.getType
+ when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(v)
+ when TYPE_UINT64 then val.setUint64(v)
+ when TYPE_SSTR, TYPE_LSTR then v ? val.setString(v) : val.setString('')
+ when TYPE_ABSTIME then val.setInt64(v)
+ when TYPE_DELTATIME then val.setUint64(v)
+ when TYPE_REF then val.setObjectId(v.impl)
+ when TYPE_BOOL then v ? val.setBool(v) : val.setBool(0)
+ when TYPE_FLOAT then val.setFloat(v)
+ when TYPE_DOUBLE then val.setDouble(v)
+ when TYPE_UUID then val.setUuid(v)
+ when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(v)
+ when TYPE_INT64 then val.setInt64(v)
+ when TYPE_MAP
+ when TYPE_OBJECT
+ when TYPE_LIST
+ when TYPE_ARRAY
end
+ end
- def set(key, value)
- val = @map.byKey(key)
- case val.getType
- when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(value)
- when TYPE_UINT64 then val.setUint64(value)
- when TYPE_SSTR, TYPE_LSTR then value ? val.setString(value) : val.setString('')
- when TYPE_ABSTIME then val.setInt64(value)
- when TYPE_DELTATIME then val.setUint64(value)
- when TYPE_REF then val.setObjectId(value.impl)
- when TYPE_BOOL then value ? val.setBool(value) : val.setBool(0)
- when TYPE_FLOAT then val.setFloat(value)
- when TYPE_DOUBLE then val.setDouble(value)
- when TYPE_UUID then val.setUuid(value)
- when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(value)
- when TYPE_INT64 then val.setInt64(value)
- when TYPE_MAP
- when TYPE_OBJECT
- when TYPE_LIST
- when TYPE_ARRAY
- end
- end
+ def [](name)
+ get_attr(name)
end
- class AgentHandler
- def get_query(context, query, userId); end
- def method_call(context, name, object_id, args, userId); end
+ def []=(name, value)
+ set_attr(name, value)
end
- class Agent < ConnectionHandler
- def initialize(handler, label="")
- if label == ""
- @agentLabel = "rb-%s.%d" % [Socket.gethostname, Process::pid]
- else
- @agentLabel = label
- end
- @conn = nil
- @handler = handler
- @impl = Qmfengine::AgentEngine.new(@agentLabel)
- @event = Qmfengine::AgentEvent.new
- @xmtMessage = Qmfengine::Message.new
- end
+ def inc_attr(name, by=1)
+ set_attr(name, get_attr(name) + by)
+ end
- def set_connection(conn)
- @conn = conn
- @conn.add_conn_handler(self)
- end
+ def dec_attr(name, by=1)
+ set_attr(name, get_attr(name) - by)
+ end
- def register_class(cls)
- @impl.registerClass(cls.impl)
+ private
+ def value(name)
+ val = @impl.getValue(name.to_s)
+ if val.nil?
+ raise ArgumentError, "Attribute '#{name}' not defined for class #{@object_class.impl.getName}"
end
+ return val
+ end
+ end
- def alloc_object_id(low = 0, high = 0)
- ObjectId.new(@impl.allocObjectId(low, high))
+ class ObjectId
+ attr_reader :impl
+ def initialize(impl=nil)
+ if impl
+ @impl = impl
+ else
+ @impl = Qmfengine::ObjectId.new
end
+ end
- def query_response(context, object)
- @impl.queryResponse(context, object.impl)
- end
+ def object_num_high
+ return @impl.getObjectNumHi
+ end
- def query_complete(context)
- @impl.queryComplete(context)
- end
+ def object_num_low
+ return @impl.getObjectNumLo
+ end
- def method_response(context, status, text, arguments)
- @impl.methodResponse(context, status, text, arguments.map)
- end
+ def ==(other)
+ return (@impl.getObjectNumHi == other.impl.getObjectNumHi) &&
+ (@impl.getObjectNumLo == other.impl.getObjectNumLo)
+ end
+ end
- def do_agent_events()
- count = 0
- valid = @impl.getEvent(@event)
- while valid
- count += 1
- case @event.kind
- when Qmfengine::AgentEvent::GET_QUERY
- @handler.get_query(@event.sequence, Query.new(@event.query), @event.authUserId)
- when Qmfengine::AgentEvent::START_SYNC
- when Qmfengine::AgentEvent::END_SYNC
- when Qmfengine::AgentEvent::METHOD_CALL
- args = Arguments.new(@event.arguments)
- @handler.method_call(@event.sequence, @event.name, ObjectId.new(@event.objectId),
- args, @event.authUserId)
- when Qmfengine::AgentEvent::DECLARE_QUEUE
- @conn.impl.declareQueue(@session.handle, @event.name)
- when Qmfengine::AgentEvent::DELETE_QUEUE
- @conn.impl.deleteQueue(@session.handle, @event.name)
- when Qmfengine::AgentEvent::BIND
- @conn.impl.bind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
- when Qmfengine::AgentEvent::UNBIND
- @conn.impl.unbind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
- when Qmfengine::AgentEvent::SETUP_COMPLETE
- @impl.startProtocol()
- end
- @impl.popEvent
- valid = @impl.getEvent(@event)
- end
- return count
+ class Arguments
+ attr_reader :map
+ def initialize(map)
+ @map = map
+ @by_hash = {}
+ key_count = @map.keyCount
+ a = 0
+ while a < key_count
+ @by_hash[@map.key(a)] = by_key(@map.key(a))
+ a += 1
end
+ end
- def do_agent_messages()
- count = 0
- valid = @impl.getXmtMessage(@xmtMessage)
- while valid
- count += 1
- @conn.impl.sendMessage(@session.handle, @xmtMessage)
- @impl.popXmt
- valid = @impl.getXmtMessage(@xmtMessage)
- end
- return count
- end
+ def [] (key)
+ return @by_hash[key]
+ end
- def do_events()
- begin
- ecnt = do_agent_events
- mcnt = do_agent_messages
- end until ecnt == 0 and mcnt == 0
- end
+ def []= (key, value)
+ @by_hash[key] = value
+ set(key, value)
+ end
- def conn_event_connected()
- puts "Agent Connection Established..."
- @session = Session.new(@conn, "qmfa-%s.%d" % [Socket.gethostname, Process::pid], self)
- @impl.newSession
- do_events
- end
+ def each
+ @by_hash.each { |k, v| yield(k, v) }
+ end
- def conn_event_disconnected(error)
- puts "Agent Connection Lost"
+ def by_key(key)
+ val = @map.byKey(key)
+ case val.getType
+ when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
+ when TYPE_UINT64 then val.asUint64
+ when TYPE_SSTR, TYPE_LSTR then val.asString
+ when TYPE_ABSTIME then val.asInt64
+ when TYPE_DELTATIME then val.asUint64
+ when TYPE_REF then val.asObjectId
+ when TYPE_BOOL then val.asBool
+ when TYPE_FLOAT then val.asFloat
+ when TYPE_DOUBLE then val.asDouble
+ when TYPE_UUID then val.asUuid
+ when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
+ when TYPE_INT64 then val.asInt64
+ when TYPE_MAP
+ when TYPE_OBJECT
+ when TYPE_LIST
+ when TYPE_ARRAY
end
+ end
- def sess_event_session_closed(context, error)
- puts "Agent Session Lost"
+ def set(key, value)
+ val = @map.byKey(key)
+ case val.getType
+ when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(value)
+ when TYPE_UINT64 then val.setUint64(value)
+ when TYPE_SSTR, TYPE_LSTR then value ? val.setString(value) : val.setString('')
+ when TYPE_ABSTIME then val.setInt64(value)
+ when TYPE_DELTATIME then val.setUint64(value)
+ when TYPE_REF then val.setObjectId(value.impl)
+ when TYPE_BOOL then value ? val.setBool(value) : val.setBool(0)
+ when TYPE_FLOAT then val.setFloat(value)
+ when TYPE_DOUBLE then val.setDouble(value)
+ when TYPE_UUID then val.setUuid(value)
+ when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(value)
+ when TYPE_INT64 then val.setInt64(value)
+ when TYPE_MAP
+ when TYPE_OBJECT
+ when TYPE_LIST
+ when TYPE_ARRAY
end
+ end
+ end
- def sess_event_recv(context, message)
- @impl.handleRcvMessage(message)
- do_events
- end
+ ##==============================================================================
+ ## SCHEMA
+ ##==============================================================================
+
+ class SchemaArgument
+ attr_reader :impl
+ def initialize(name, typecode, kwargs={})
+ @impl = Qmfengine::SchemaArgument.new(name, typecode)
+ @impl.setDirection(kwargs[:dir]) if kwargs.include?(:dir)
+ @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit)
+ @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
end
+ end
- class SchemaArgument
- attr_reader :impl
- def initialize(name, typecode, kwargs={})
- @impl = Qmfengine::SchemaArgument.new(name, typecode)
- @impl.setDirection(kwargs[:dir]) if kwargs.include?(:dir)
- @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit)
- @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
- end
+ class SchemaMethod
+ attr_reader :impl
+ def initialize(name, kwargs={})
+ @impl = Qmfengine::SchemaMethod.new(name)
+ @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
+ @arguments = []
end
- class SchemaMethod
- attr_reader :impl
- def initialize(name, kwargs={})
- @impl = Qmfengine::SchemaMethod.new(name)
- @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
- @arguments = []
- end
+ def add_argument(arg)
+ @arguments << arg
+ @impl.addArgument(arg.impl)
+ end
+ end
- def add_argument(arg)
- @arguments << arg
- @impl.addArgument(arg.impl)
- end
+ class SchemaProperty
+ attr_reader :impl
+ def initialize(name, typecode, kwargs={})
+ @impl = Qmfengine::SchemaProperty.new(name, typecode)
+ @impl.setAccess(kwargs[:access]) if kwargs.include?(:access)
+ @impl.setIndex(kwargs[:index]) if kwargs.include?(:index)
+ @impl.setOptional(kwargs[:optional]) if kwargs.include?(:optional)
+ @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit)
+ @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
end
- class SchemaProperty
- attr_reader :impl
- def initialize(name, typecode, kwargs={})
- @impl = Qmfengine::SchemaProperty.new(name, typecode)
- @impl.setAccess(kwargs[:access]) if kwargs.include?(:access)
- @impl.setIndex(kwargs[:index]) if kwargs.include?(:index)
- @impl.setOptional(kwargs[:optional]) if kwargs.include?(:optional)
- @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit)
- @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
- end
+ def name
+ @impl.getName
+ end
+ end
- def name
- @impl.getName
- end
+ class SchemaStatistic
+ attr_reader :impl
+ def initialize(name, typecode, kwargs={})
+ @impl = Qmfengine::SchemaStatistic.new(name, typecode)
+ @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit)
+ @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
end
+ end
- class SchemaStatistic
- attr_reader :impl
- def initialize(name, typecode, kwargs={})
- @impl = Qmfengine::SchemaStatistic.new(name, typecode)
- @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit)
- @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
- end
+ class SchemaObjectClass
+ attr_reader :impl
+ def initialize(package, name, kwargs={})
+ @impl = Qmfengine::SchemaObjectClass.new(package, name)
+ @properties = []
+ @statistics = []
+ @methods = []
+ end
+
+ def add_property(prop)
+ @properties << prop
+ @impl.addProperty(prop.impl)
+ end
+
+ def add_statistic(stat)
+ @statistics << stat
+ @impl.addStatistic(stat.impl)
+ end
+
+ def add_method(meth)
+ @methods << meth
+ @impl.addMethod(meth.impl)
+ end
+
+ def name
+ @impl.getName
end
- class SchemaObjectClass
- attr_reader :impl
- def initialize(package, name, kwargs={})
- @impl = Qmfengine::SchemaObjectClass.new(package, name)
+ def properties
+ unless @properties
@properties = []
- @statistics = []
- @methods = []
+ @impl.getPropertyCount.times do |i|
+ @properties << @impl.getProperty(i)
+ end
end
+ return @properties
+ end
+ end
- def add_property(prop)
- @properties << prop
- @impl.addProperty(prop.impl)
- end
+ class SchemaEventClass
+ attr_reader :impl
+ def initialize(package, name, kwargs={})
+ @impl = Qmfengine::SchemaEventClass.new(package, name)
+ @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
+ @arguments = []
+ end
- def add_statistic(stat)
- @statistics << stat
- @impl.addStatistic(stat.impl)
- end
+ def add_argument(arg)
+ @arguments << arg
+ @impl.addArgument(arg.impl)
+ end
+ end
- def add_method(meth)
- @methods << meth
- @impl.addMethod(meth.impl)
- end
+ ##==============================================================================
+ ## CONSOLE
+ ##==============================================================================
- def name
- @impl.getName
- end
+ ##==============================================================================
+ ## AGENT
+ ##==============================================================================
- def properties
- unless @properties
- @properties = []
- @impl.getPropertyCount.times do |i|
- @properties << @impl.getProperty(i)
- end
- end
- return @properties
+ class AgentHandler
+ def get_query(context, query, userId); end
+ def method_call(context, name, object_id, args, userId); end
+ end
+
+ class Agent < ConnectionHandler
+ def initialize(handler, label="")
+ if label == ""
+ @agentLabel = "rb-%s.%d" % [Socket.gethostname, Process::pid]
+ else
+ @agentLabel = label
end
+ @conn = nil
+ @handler = handler
+ @impl = Qmfengine::AgentEngine.new(@agentLabel)
+ @event = Qmfengine::AgentEvent.new
+ @xmtMessage = Qmfengine::Message.new
end
- class SchemaEventClass
- attr_reader :impl
- def initialize(package, name, kwargs={})
- @impl = Qmfengine::SchemaEventClass.new(package, name)
- @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
- @arguments = []
- end
+ def set_connection(conn)
+ @conn = conn
+ @conn.add_conn_handler(self)
+ end
- def add_argument(arg)
- @arguments << arg
- @impl.addArgument(arg.impl)
- end
+ def register_class(cls)
+ @impl.registerClass(cls.impl)
end
- class QmfObject
- attr_reader :impl, :object_class
- def initialize(cls)
- @object_class = cls
- @impl = Qmfengine::Object.new(@object_class.impl)
- end
+ def alloc_object_id(low = 0, high = 0)
+ ObjectId.new(@impl.allocObjectId(low, high))
+ end
- def destroy
- @impl.destroy
- end
+ def query_response(context, object)
+ @impl.queryResponse(context, object.impl)
+ end
- def object_id
- return ObjectId.new(@impl.getObjectId)
- end
+ def query_complete(context)
+ @impl.queryComplete(context)
+ end
- def set_object_id(oid)
- @impl.setObjectId(oid.impl)
- end
+ def method_response(context, status, text, arguments)
+ @impl.methodResponse(context, status, text, arguments.map)
+ end
- def get_attr(name)
- val = value(name)
- case val.getType
- when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
- when TYPE_UINT64 then val.asUint64
- when TYPE_SSTR, TYPE_LSTR then val.asString
- when TYPE_ABSTIME then val.asInt64
- when TYPE_DELTATIME then val.asUint64
- when TYPE_REF then val.asObjectId
- when TYPE_BOOL then val.asBool
- when TYPE_FLOAT then val.asFloat
- when TYPE_DOUBLE then val.asDouble
- when TYPE_UUID then val.asUuid
- when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
- when TYPE_INT64 then val.asInt64
- when TYPE_MAP
- when TYPE_OBJECT
- when TYPE_LIST
- when TYPE_ARRAY
+ def do_agent_events()
+ count = 0
+ valid = @impl.getEvent(@event)
+ while valid
+ count += 1
+ case @event.kind
+ when Qmfengine::AgentEvent::GET_QUERY
+ @handler.get_query(@event.sequence, Query.new(@event.query), @event.authUserId)
+ when Qmfengine::AgentEvent::START_SYNC
+ when Qmfengine::AgentEvent::END_SYNC
+ when Qmfengine::AgentEvent::METHOD_CALL
+ args = Arguments.new(@event.arguments)
+ @handler.method_call(@event.sequence, @event.name, ObjectId.new(@event.objectId),
+ args, @event.authUserId)
+ when Qmfengine::AgentEvent::DECLARE_QUEUE
+ @conn.impl.declareQueue(@session.handle, @event.name)
+ when Qmfengine::AgentEvent::DELETE_QUEUE
+ @conn.impl.deleteQueue(@session.handle, @event.name)
+ when Qmfengine::AgentEvent::BIND
+ @conn.impl.bind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
+ when Qmfengine::AgentEvent::UNBIND
+ @conn.impl.unbind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
+ when Qmfengine::AgentEvent::SETUP_COMPLETE
+ @impl.startProtocol()
end
+ @impl.popEvent
+ valid = @impl.getEvent(@event)
end
+ return count
+ end
- def set_attr(name, v)
- val = value(name)
- case val.getType
- when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(v)
- when TYPE_UINT64 then val.setUint64(v)
- when TYPE_SSTR, TYPE_LSTR then v ? val.setString(v) : val.setString('')
- when TYPE_ABSTIME then val.setInt64(v)
- when TYPE_DELTATIME then val.setUint64(v)
- when TYPE_REF then val.setObjectId(v.impl)
- when TYPE_BOOL then v ? val.setBool(v) : val.setBool(0)
- when TYPE_FLOAT then val.setFloat(v)
- when TYPE_DOUBLE then val.setDouble(v)
- when TYPE_UUID then val.setUuid(v)
- when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(v)
- when TYPE_INT64 then val.setInt64(v)
- when TYPE_MAP
- when TYPE_OBJECT
- when TYPE_LIST
- when TYPE_ARRAY
- end
+ def do_agent_messages()
+ count = 0
+ valid = @impl.getXmtMessage(@xmtMessage)
+ while valid
+ count += 1
+ @conn.impl.sendMessage(@session.handle, @xmtMessage)
+ @impl.popXmt
+ valid = @impl.getXmtMessage(@xmtMessage)
end
+ return count
+ end
- def [](name)
- get_attr(name)
- end
+ def do_events()
+ begin
+ ecnt = do_agent_events
+ mcnt = do_agent_messages
+ end until ecnt == 0 and mcnt == 0
+ end
- def []=(name, value)
- set_attr(name, value)
- end
+ def conn_event_connected()
+ puts "Agent Connection Established..."
+ @session = Session.new(@conn, "qmfa-%s.%d" % [Socket.gethostname, Process::pid], self)
+ @impl.newSession
+ do_events
+ end
- def inc_attr(name, by=1)
- set_attr(name, get_attr(name) + by)
- end
+ def conn_event_disconnected(error)
+ puts "Agent Connection Lost"
+ end
- def dec_attr(name, by=1)
- set_attr(name, get_attr(name) - by)
- end
+ def sess_event_session_closed(context, error)
+ puts "Agent Session Lost"
+ end
- private
- def value(name)
- val = @impl.getValue(name.to_s)
- if val.nil?
- raise ArgumentError, "Attribute '#{name}' not defined for class #{@object_class.impl.getName}"
- end
- return val
- end
+ def sess_event_recv(context, message)
+ @impl.handleRcvMessage(message)
+ do_events
end
+ end
end
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org