require 'net/http' require 'rexml/document' module ActiveMessaging module Adapters module REST class Connection include ActiveMessaging::Adapter register :rest @@keep_alive = {"Connection" => "keep-alive", "Keep-Alive" => 300.to_s} def initialize(cfg) @user_agent = {"User-Agent" => self.class.to_s + " [a13g]"} @host = cfg.key?(:host) ? cfg[:host] : "127.0.0.1" @port = cfg.key?(:port) ? cfg[:port] : 8161.to_s @app = cfg.key?(:app) ? cfg[:app] : '/demo/amq' end def disconnect(headers = {}) end def unsubscribe(name, headers = {}) end def received arg end def subscribe(name, headers = {}) req = Net::HTTP::Post.new(@app, @user_agent) res = Net::HTTP.new(@host, @port).request(req, "destination=" + name + "&message=chat&type=listen") fields = res.get_fields('set-cookie') # assumes JSESSIONID from Servlet container, need be more defensive here @session_id = fields[0].split(';')[0].split('=')[1] puts "Subscribed to " + name.to_s + ", using session id of " + @session_id.to_s end def send destination, message, headers={} req = Net::HTTP::Post.new(@app, @user_agent.merge({"destination" => destination.to_s})) data = "message=" + message.to_s + "&type=send" # needs error handling Net::HTTP.new(@host, @port).request(req, data) end def receive begin # needs better error handling req = Net::HTTP::Get.new(@app, @@keep_alive.merge(@user_agent.merge({"Cookie" => "JSESSIONID=" + @session_id.to_s}))) res = Net::HTTP.new(@host, @port).request(req) parser = ResponseParser::new res.body return parser.messages.size == 0 ? nil : parser.messages[0] rescue puts $! raise $! end end end # ssalc class ResponseParser include REXML attr_reader :messages def initialize response @messages = [] parse response end def parse response return if response.nil? _parse response end private def _parse response doc = Document.new(response) doc.root.elements.each do |e| # this needs to be more defensive headers = {"destination" => e.attributes['destination']} message = e.elements['message'] @messages << Message.new(headers, message.text) unless message.nil? end end end class Message attr_accessor :headers, :body, :command def initialize headers, body, command='MESSAGE' @headers, @body, @command = headers, body, command end def to_s "" end end end end end