Module | Response |
In: |
lib/violet/response.rb
|
this module handle servers messages. Main method/class are Response.parse and Response::Base::ServerRsp (well documented).
you should only use Response.parse with the server‘s message (xml) as argument, it returns a ServerRsp instance from the corresponding class (see all the ServerRsp subclass). with a ServerRsp instance you can use :
>> rsp = Response.parse('<?xml version="1.0" encoding="UTF-8"?><rsp><blacklist nb="2"/><pseudo name="toto"/><pseudo name="titi"/></rsp>') => #<Response::Blacklist:0x2acd8c08f2f8 @xml=<UNDEFINED> ... </>> >> rsp.good? => true >> rsp.has_message? => false >> rsp.message NameError: undefined local variable or method message for #<Response::Blacklist:0x2b1f056afdc0 @xml=<UNDEFINED> ... </>> >> rsp.has_blacklist? => true >> rsp.blacklist => {:nb=>"2"} >> rsp.pseudo => {:name=>"toto"} >> rsp.has_many_pseudos? => true >> rsp.pseudos => [{:name=>"toto"}, {:name=>"titi"}]
if you want to access to the REXML::Document object of a ServerRsp you can either use rsp.xml or use ServerRsp#get_all method.
parse given raw (xml text) and return a new ServerRsp from the corresponding class.
Violet messages aren‘t easy to identify, because there is not id. So we have to study the xml content if there are no message element (easier to detect the response type).
the xml response of the Violet Server.
this method raise a ProtocolExcepion if it‘s fail to detect the kind of the server‘s response.
>> rsp = Response.parse('<?xml version="1.0" encoding="UTF-8"?><rsp><rabbitSleep>YES</rabbitSleep></rsp>') => #<Response::RabbitSleep:0x2b16c5e476e8 @xml=<UNDEFINED> ... </>> >> rsp.class => Response::RabbitSleep >> rsp = Response.parse('<?xml version="1.0" encoding="UTF-8"?><rsp><rabbitVersion>V1</rabbitVersion></rsp>') => #<Response::RabbitVersion:0x2b16c5e154b8 @xml=<UNDEFINED> ... </>> >> rsp.class => Response::RabbitVersion
# File lib/violet/response.rb, line 390 390: def Response.parse raw 391: tmp = Base::ServerRsp.new raw # we shouldn't create ServerRsp instances, but act as if you didn't see ;) 392: klassname = if raw =~ %r|<rsp>\s*</rsp>|i 393: 'EmptyServerRsp' 394: elsif tmp.has_message? 395: /^#{tmp.message}$/i 396: else 397: /^#{tmp.xml.root.elements[1].name}$/i # REXML::Elements#[] has index 1-based and not 0-based, so we really fetch the first element's name 398: end 399: 400: klass = nil 401: begin 402: klass = Helpers.constantize "#{self}::#{Response.constants.grep(klassname).first}" 403: raise if klass.nil? 404: rescue 405: raise ProtocolExcepion.new("unknown server's response : #{raw}") 406: end 407: 408: klass.new raw 409: end