Module | Response |
In: |
lib/violet/response.rb
|
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 393 393: def Response.parse raw 394: tmp = Base::ServerRsp.new raw # we shouldn't create ServerRsp instances, but act as if you didn't see ;) 395: klassname = if raw =~ %r|<rsp>\s*</rsp>|i 396: 'EmptyServerRsp' 397: elsif tmp.has_message? 398: /^#{tmp.message}$/i 399: else 400: /^#{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 401: end 402: 403: klass = nil 404: begin 405: klass = Helpers.constantize "#{self}::#{Response.constants.grep(klassname).first}" 406: raise if klass.nil? 407: rescue 408: raise ProtocolExcepion.new("unknown server's response : #{raw}") 409: end 410: 411: klass.new raw 412: end