adaptation 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +7 -0
- data/bin/mom +7 -16
- data/bin/publish +8 -0
- data/configs/mom.yml +16 -3
- data/configs/settings.yml +4 -4
- data/lib/adaptation/adaptor.rb +5 -2
- data/lib/adaptation/druby_subscriber.rb +36 -42
- data/lib/adaptation/mom.rb +6 -4
- data/lib/adaptation/xmlblaster/xmlblaster_callback_client.rb +141 -0
- data/lib/adaptation/xmlblaster/xmlblaster_callback_server.rb +79 -0
- data/lib/adaptation/xmlblaster/xmlblaster_client.rb +122 -0
- data/{dispatches → lib/commands}/publish.rb +12 -8
- data/lib/commands/subscribe.rb +66 -9
- data/lib/rails_generator/generators/applications/app/app_generator.rb +2 -3
- metadata +8 -3
data/CHANGELOG
CHANGED
@@ -39,3 +39,10 @@
|
|
39
39
|
will send messages to other subscribers.
|
40
40
|
* 0.1.3
|
41
41
|
- solved loop that comsuned lots of cpu in mom command
|
42
|
+
* 0.1.4
|
43
|
+
- subscribers with a message buffer too; mom just delivers messages without waiting
|
44
|
+
subscriber to finnish oprocessing it
|
45
|
+
- if when subscribing desired address is in use just log it and return
|
46
|
+
- settings.yml template improved
|
47
|
+
- added support to subscribe/publish to Xmlblaster (http://www.xmlblaster.org)
|
48
|
+
via XML-RPC
|
data/bin/mom
CHANGED
@@ -24,25 +24,16 @@ if %w(--file -f).include? ARGV.first
|
|
24
24
|
file = ARGV[1]
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
# environment = ARGV[1]
|
29
|
-
#end
|
30
|
-
environment = "development"
|
27
|
+
mom = "druby"
|
31
28
|
|
32
29
|
if file.nil?
|
33
|
-
config = {"mom" => {"
|
30
|
+
config = {"mom" => {"host" => DEFAULT_HOST, "port" => DEFAULT_PORT, "topics" => "all"}}
|
34
31
|
else
|
35
|
-
config = YAML::load(File.open(file))[
|
32
|
+
config = YAML::load(File.open(file))[mom]
|
36
33
|
end
|
37
34
|
|
38
|
-
Signal.trap("INT") { puts "Shutting down MOM server (#{
|
35
|
+
Signal.trap("INT") { puts "Shutting down MOM server (#{mom})"; exit }
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
mom = Adaptation::Mom::Mom.new mom_uri
|
44
|
-
mom.start
|
45
|
-
#when "xmlblaster"
|
46
|
-
else
|
47
|
-
puts "Unknown MOM server type: #{config["mom"]["type"]}"
|
48
|
-
end
|
37
|
+
mom_uri = "druby://#{config["mom"]["host"]}:#{config["mom"]["port"]}"
|
38
|
+
mom = Adaptation::Mom::Mom.new mom_uri
|
39
|
+
mom.start
|
data/bin/publish
ADDED
data/configs/mom.yml
CHANGED
@@ -1,10 +1,23 @@
|
|
1
|
-
|
1
|
+
druby:
|
2
2
|
mom:
|
3
|
-
type: druby
|
4
3
|
port: 8080
|
5
4
|
host: 127.0.0.1
|
6
5
|
subscriber:
|
7
|
-
type: druby
|
8
6
|
port: 8081
|
9
7
|
host: 127.0.0.1
|
10
8
|
topics: all
|
9
|
+
|
10
|
+
xmlblaster:
|
11
|
+
mom:
|
12
|
+
port: 8080
|
13
|
+
host: 127.0.0.1
|
14
|
+
publish_user: publisher
|
15
|
+
publish_password: secret
|
16
|
+
subscriber:
|
17
|
+
port: 8081
|
18
|
+
host: 127.0.0.1
|
19
|
+
public_host:
|
20
|
+
public_port:
|
21
|
+
topics: TOPIC1, TOPIC2
|
22
|
+
subscriber_user: subscriber
|
23
|
+
subscriber_password: secret
|
data/configs/settings.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
development:
|
2
|
-
|
3
|
-
|
2
|
+
# setting: value
|
3
|
+
# The line above makes possible to access the setting
|
4
|
+
# in the Adaptor class with: $config["setting"]
|
4
5
|
test:
|
5
|
-
|
6
|
-
application: APPLICATION_ID
|
6
|
+
# setting: test value
|
data/lib/adaptation/adaptor.rb
CHANGED
@@ -29,9 +29,12 @@ module Adaptation
|
|
29
29
|
end
|
30
30
|
|
31
31
|
xml = message_object.to_xml.to_s.gsub("'", "\"")
|
32
|
-
|
33
|
-
|
32
|
+
publish_method = $config["oappublish"] || "#{ADAPTOR_ROOT}/script/publish"
|
33
|
+
topic = $config["application"] || "ADAPTATION"
|
34
|
+
unless system("#{publish_method} '#{$config["application"]}' '#{xml}'")
|
35
|
+
logger.error "Problem publishing: #{xml}"
|
34
36
|
end
|
37
|
+
|
35
38
|
end
|
36
39
|
|
37
40
|
def self.get_class_object(adaptor_class) # nodoc
|
@@ -7,39 +7,33 @@ module Adaptation
|
|
7
7
|
|
8
8
|
class DrubySubscriber
|
9
9
|
|
10
|
+
# constructor, called from the subscribe command
|
10
11
|
def initialize subscriber_uri, mom_uri, topics
|
11
12
|
@subscriber_uri = subscriber_uri
|
12
13
|
@mom_uri = mom_uri
|
13
14
|
@topics = topics
|
14
|
-
@
|
15
|
+
@messages = []
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
puts "
|
18
|
+
# method to receive messages, called from the mom
|
19
|
+
def send_message message, topic
|
20
|
+
# Insert message into messages buffer, and awake
|
21
|
+
# message processor (@sleeper) if paused
|
22
|
+
puts "-----------------------------------"
|
23
|
+
puts "Received message in topic: #{topic}"
|
24
|
+
puts "#{message}"
|
25
|
+
puts "-----------------------------------"
|
26
|
+
@messages << {:message => message, :topic => topic}
|
27
|
+
@sleeper.run if @sleeper.stop?
|
22
28
|
end
|
23
|
-
|
29
|
+
|
24
30
|
def subscription_result subscribed
|
25
31
|
if subscribed
|
26
32
|
puts "Subscribed to mom (#{@mom_uri}). Listening at #{@subscriber_uri}"
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
|
-
# TODO: Think what exactly is this subscriber:
|
31
|
-
# - path to file
|
32
|
-
# - combination of a path and a set of conditions <- looks better...
|
33
|
-
# - ...
|
34
|
-
def note_me_down adaptor
|
35
|
-
unless @adaptors_list.include? adaptor
|
36
|
-
@adaptors_list << adaptor
|
37
|
-
puts "Added adaptor: #{adaptor}"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
36
|
def start
|
42
|
-
uri_owner = false
|
43
37
|
begin
|
44
38
|
# try to start the subscriber service,
|
45
39
|
# using the uri specified in config/mom.yml
|
@@ -48,33 +42,33 @@ module Adaptation
|
|
48
42
|
# subscribe that uri to the mom
|
49
43
|
mom = DRbObject.new(nil, @mom_uri)
|
50
44
|
mom.subscribe @subscriber_uri
|
51
|
-
uri_owner = true
|
52
45
|
rescue Exception => e
|
53
|
-
# desired uri already in use
|
54
|
-
|
55
|
-
|
56
|
-
uri_owner = false
|
46
|
+
# desired uri already in use
|
47
|
+
puts "Couldn't start subscriber at #{@subscriber_uri}. Address already in use?"
|
48
|
+
return
|
57
49
|
end
|
50
|
+
|
51
|
+
@sleeper = Thread.new{
|
52
|
+
loop do
|
58
53
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
# the process using @subscriber_uri is not
|
69
|
-
# an instance of DrubySubsciber...
|
70
|
-
puts "Couldn't start or find subscriber at #{@subscriber_uri}:"
|
71
|
-
puts "#{e}"
|
72
|
-
return
|
73
|
-
end
|
54
|
+
# process all messages
|
55
|
+
while !@messages.empty?
|
56
|
+
@messages.each do |message|
|
57
|
+
if ( (@topics.include?(message[:topic])) or (@topics.include?("all")) )
|
58
|
+
system("ruby public/dispatch.rb '#{message[:message]}'")
|
59
|
+
end
|
60
|
+
@messages.delete message
|
61
|
+
end
|
62
|
+
end
|
74
63
|
|
75
|
-
|
76
|
-
|
77
|
-
|
64
|
+
# go to sleep
|
65
|
+
Thread.stop
|
66
|
+
|
67
|
+
end
|
68
|
+
}
|
69
|
+
|
70
|
+
@sleeper.join
|
71
|
+
Drb.thread.join
|
78
72
|
|
79
73
|
end
|
80
74
|
|
data/lib/adaptation/mom.rb
CHANGED
@@ -16,13 +16,15 @@ module Adaptation
|
|
16
16
|
unless get_subscribers.include?(drb_uri)
|
17
17
|
add_subscriber drb_uri
|
18
18
|
puts "Added new subscriber: #{drb_uri}"
|
19
|
-
oapdaemon = DRbObject.new(nil, drb_uri)
|
20
|
-
oapdaemon.subscription_result true
|
21
19
|
end
|
20
|
+
|
21
|
+
oapdaemon = DRbObject.new(nil, drb_uri)
|
22
|
+
oapdaemon.subscription_result(true)
|
22
23
|
end
|
23
24
|
|
24
25
|
def publish message, topic
|
25
|
-
|
26
|
+
# Insert message into messages buffer, and awake
|
27
|
+
# deliverer process (@sleeper) if paused
|
26
28
|
puts "-----------------------------------"
|
27
29
|
puts "Received message in topic: #{topic}"
|
28
30
|
puts "#{message}"
|
@@ -46,7 +48,7 @@ module Adaptation
|
|
46
48
|
puts "Calling #{uri}"
|
47
49
|
DRb.start_service
|
48
50
|
oapdaemon = DRbObject.new(nil, uri)
|
49
|
-
oapdaemon.
|
51
|
+
oapdaemon.send_message message[0], message[1]
|
50
52
|
rescue
|
51
53
|
puts "Couldn't send message to subscriber: #{uri}"
|
52
54
|
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require "adaptation/xmlblaster/xmlblaster_client.rb"
|
2
|
+
require "adaptation/xmlblaster/xmlblaster_callback_server.rb"
|
3
|
+
|
4
|
+
class XmlblasterCallbackClient < XmlblasterClient
|
5
|
+
|
6
|
+
attr_reader :callback_server
|
7
|
+
|
8
|
+
def initialize( xmlblaster_ip = nil, xmlblaster_port = "8080", callback_ip = "127.0.0.1", callback_port = "8081", callback_public_ip = nil, callback_public_port = nil, audit = nil)
|
9
|
+
super xmlblaster_ip, xmlblaster_port, audit
|
10
|
+
@xmlblaster_ip = xmlblaster_ip
|
11
|
+
@xmlblaster_port = xmlblaster_port
|
12
|
+
@callback_ip = callback_ip
|
13
|
+
@callback_port = callback_port
|
14
|
+
@callback_public_ip = callback_public_ip || @callback_ip
|
15
|
+
@callback_public_port = callback_public_port || @callback_port
|
16
|
+
@callback_server = nil
|
17
|
+
@audit = audit
|
18
|
+
|
19
|
+
begin
|
20
|
+
@callback_server = XmlblasterCallbackServer.new( @callback_ip, @callback_port, @callback_public_ip, @callback_public_port, self, @audit )
|
21
|
+
rescue => e
|
22
|
+
@audit.warn( "XMLBlasterCallbackClient: Could not create CallbackServer" )
|
23
|
+
raise e
|
24
|
+
end
|
25
|
+
|
26
|
+
begin
|
27
|
+
@callback_server.start()
|
28
|
+
rescue => e
|
29
|
+
@audit.warn( "XMLBlasterCallbackClient: Error creating XMLRPC Server" )
|
30
|
+
raise e
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def login( username='guest', password='guest' )
|
35
|
+
qos = "<qos>
|
36
|
+
<securityService type='htpasswd' version='1.0'>
|
37
|
+
<![CDATA[
|
38
|
+
<user>#{username}</user>
|
39
|
+
<passwd>#{password}</passwd>
|
40
|
+
]]>
|
41
|
+
</securityService>
|
42
|
+
<session name ='#{username}/1' timeout='0' maxSessions='1' clearSessions='true' />
|
43
|
+
<persistent/>
|
44
|
+
<callback type='XMLRPC' retries='-1' delay='60000'>#{@callback_server.callback_url}</callback>
|
45
|
+
</qos>"
|
46
|
+
@audit.debug( "XmlblasterCallbackClient: authenticate.connect QoS = #{qos}" )
|
47
|
+
returnQos = @proxy.call("authenticate.connect", qos)
|
48
|
+
@audit.debug( "XmlblasterCallbackClient: authenticate.connect returnQos = #{returnQos}" )
|
49
|
+
xml = REXML::Document.new(returnQos)
|
50
|
+
@sessionId = xml.elements["//session"].attributes["sessionId"]
|
51
|
+
end
|
52
|
+
|
53
|
+
def subscribe( xmlKey, qos )
|
54
|
+
begin
|
55
|
+
returnValue = @proxy.call("xmlBlaster.subscribe", @sessionId, xmlKey, qos )
|
56
|
+
puts "Subscribed to mom (xmlblaster at #{@xmlblaster_ip}:#{@xmlblaster_port}). Listening at #{@callback_public_ip || @callback_ip}:#{@callback_public_port || @callback_port}"
|
57
|
+
@audit.info( "==> ::SUBSCRIBE:: <== Success subscribing with sessionID #{@sessionId}" )
|
58
|
+
rescue => e
|
59
|
+
@audit.warn( "XMLBlasterClient: Error subscribing to MOM: #{e}" )
|
60
|
+
raise e
|
61
|
+
end
|
62
|
+
return returnValue
|
63
|
+
end
|
64
|
+
|
65
|
+
def unsubscribe( xmlKey, qos )
|
66
|
+
begin
|
67
|
+
returnValue = @proxy.call("xmlBlaster.unSubscribe", @sessionId, xmlKey, qos )
|
68
|
+
@audit.info( "==> ::UNSUBSCRIBE:: <== Success unSubscribing with sessionID #{@sessionId}" )
|
69
|
+
rescue => e
|
70
|
+
@audit.warn( "XMLBlasterClient: Error unsubscribing from MOM: #{e}" )
|
71
|
+
raise e
|
72
|
+
end
|
73
|
+
return true
|
74
|
+
end
|
75
|
+
|
76
|
+
def update( *args )
|
77
|
+
key =args[0]
|
78
|
+
content = args[1]
|
79
|
+
qos = args[2]
|
80
|
+
@audit.info( "XMLBlasterCallbackClient: Received UPDATE." )
|
81
|
+
|
82
|
+
begin
|
83
|
+
qos_xml = REXML::Document.new args[2]
|
84
|
+
rescue => e
|
85
|
+
@audit.warn( "XMLBlasterCallbackClient: Could not open QOS of message." )
|
86
|
+
end
|
87
|
+
|
88
|
+
if qos_xml.elements['qos'].elements['state'] != nil then
|
89
|
+
begin
|
90
|
+
value = qos_xml.elements['qos'].elements['state'].attributes['id'].to_s
|
91
|
+
if value == "ERASED" then
|
92
|
+
@audit.debug( "XMLBlasterCallbackClient: TOPIC GOT ERASED" )
|
93
|
+
else
|
94
|
+
@audit.debug( "XMLBlasterCallbackClient: SOMETHING STRANGE" )
|
95
|
+
end
|
96
|
+
rescue => e
|
97
|
+
@audit.warn( "XMLBlasterCallbackClient: Error: #{e}" )
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
begin
|
102
|
+
key_xml = REXML::Document.new key
|
103
|
+
topic = key_xml.elements['key'].attributes["oid"]
|
104
|
+
@audit.debug( "Topic #{topic}" )
|
105
|
+
puts "-----------------------------------"
|
106
|
+
puts "Received message in topic: #{topic}"
|
107
|
+
puts "#{content}"
|
108
|
+
puts "-----------------------------------"
|
109
|
+
# process message
|
110
|
+
Adaptation::Base.new.process content
|
111
|
+
rescue => e
|
112
|
+
@audit.warn( "XMLBlasterCallbackClient: Could not access content of message." )
|
113
|
+
end
|
114
|
+
|
115
|
+
return "<qos><state>OK</state></qos>"
|
116
|
+
end
|
117
|
+
|
118
|
+
def ping( *args )
|
119
|
+
@audit.debug( "XMLBlasterClient: received PING - PONG" )
|
120
|
+
return "<qos><state>OK</state></qos>"
|
121
|
+
end
|
122
|
+
|
123
|
+
def logout
|
124
|
+
super
|
125
|
+
if @callback_server then
|
126
|
+
begin
|
127
|
+
@callback_server.shutdown()
|
128
|
+
rescue => e
|
129
|
+
@audit.warn( "XMLBlasterCallbackClient: Error could not stop CallbackServer" )
|
130
|
+
raise e
|
131
|
+
end
|
132
|
+
else
|
133
|
+
return false
|
134
|
+
end
|
135
|
+
return true
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'xmlrpc/server'
|
2
|
+
require 'socket'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
class XmlblasterCallbackServer
|
6
|
+
|
7
|
+
attr_reader :thread
|
8
|
+
attr_reader :callback_url
|
9
|
+
|
10
|
+
def initialize( ip, port, public_ip, public_port, callbackInstance, audit = nil )
|
11
|
+
if audit == nil then
|
12
|
+
@audit = Logger.new($stdout)
|
13
|
+
else
|
14
|
+
@audit = audit
|
15
|
+
end
|
16
|
+
@thread = nil
|
17
|
+
@callback_server = nil
|
18
|
+
@callback_url = "http://#{public_ip}:#{public_port}/RPC2"
|
19
|
+
@port = port
|
20
|
+
@ip = ip
|
21
|
+
@callback_instance = callbackInstance
|
22
|
+
end
|
23
|
+
|
24
|
+
def start
|
25
|
+
|
26
|
+
begin
|
27
|
+
@callback_server = XMLRPC::Server.new( @port, @ip, 4, @audit, false )
|
28
|
+
@audit.debug( "CallBackServer started")
|
29
|
+
rescue => e
|
30
|
+
msg = e.message + ": " + e.backtrace.join("\n")
|
31
|
+
@audit.error( "CallBackServer: Could not create XMLRPC Server: " + msg)
|
32
|
+
return false
|
33
|
+
end
|
34
|
+
|
35
|
+
@thread = Thread.new( @port, @callback_instance ) { | port, callback_instance |
|
36
|
+
Thread.current['name'] = "MOM-CallbackServer"
|
37
|
+
STDOUT.sync = true
|
38
|
+
|
39
|
+
|
40
|
+
if @callback_server then
|
41
|
+
|
42
|
+
@audit.debug( "MOM-CallBackServer: " + @callback_url )
|
43
|
+
|
44
|
+
@callback_server.add_handler("ping") do |name, *args|
|
45
|
+
@callback_instance.ping( *args )
|
46
|
+
end
|
47
|
+
|
48
|
+
@callback_server.add_handler("update") do |name, *args|
|
49
|
+
@callback_instance.update( *args )
|
50
|
+
end
|
51
|
+
|
52
|
+
@callback_server.set_default_handler do |name, *args|
|
53
|
+
raise XMLRPC::FaultException.new(-99, "MOM-CallBackServer: Method #{name} missing or wrong number of parameters!")
|
54
|
+
end
|
55
|
+
|
56
|
+
# listening
|
57
|
+
@audit.debug( "MOM-CallBackServer: XMLRPC Server serving." )
|
58
|
+
@callback_server.serve()
|
59
|
+
|
60
|
+
else
|
61
|
+
return false
|
62
|
+
end
|
63
|
+
|
64
|
+
}
|
65
|
+
|
66
|
+
return true
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def shutdown
|
71
|
+
if @callback_server then
|
72
|
+
@callback_server.shutdown()
|
73
|
+
@thread.kill
|
74
|
+
end
|
75
|
+
return true
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'xmlrpc/client'
|
2
|
+
require 'rexml/document'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
# Implements http://www.xmlblaster.org/xmlBlaster/doc/requirements/interface.html
|
6
|
+
|
7
|
+
class XmlblasterClient
|
8
|
+
|
9
|
+
attr_reader :xmlblaster_ip
|
10
|
+
|
11
|
+
def initialize( xmlblaster_ip = nil, xmlblaster_port = nil, audit = nil )
|
12
|
+
|
13
|
+
if audit == nil then
|
14
|
+
@audit = Logger.new(STDOUT)
|
15
|
+
@audit.level = Logger::INFO
|
16
|
+
else
|
17
|
+
@audit = audit
|
18
|
+
end
|
19
|
+
|
20
|
+
@xmlblaster_ip = xmlblaster_ip
|
21
|
+
@xmlblaster_port = xmlblaster_port
|
22
|
+
|
23
|
+
@proxy = nil
|
24
|
+
@sessionId = nil
|
25
|
+
|
26
|
+
if @xmlblaster_ip then
|
27
|
+
begin
|
28
|
+
self.connect(@xmlblaster_ip, @xmlblaster_port)
|
29
|
+
rescue => e
|
30
|
+
@audit.warn( "XMLBlasterClient: Error connecting to XMLBlasterServer." )
|
31
|
+
raise e
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def connect( ip, port )
|
38
|
+
rpc="/RPC2"
|
39
|
+
begin
|
40
|
+
@proxy = XMLRPC::Client.new( ip, rpc, port, nil, nil, nil, nil, nil,nil)
|
41
|
+
rescue => e
|
42
|
+
@audit.warn( "XMLBlasterClient: new XMLRPC client creation failed.")
|
43
|
+
raise e
|
44
|
+
end
|
45
|
+
@audit.debug( "XMLBlasterClient: XMLBlaster client to http://#{ip}:#{port}#{rpc}")
|
46
|
+
return true
|
47
|
+
end
|
48
|
+
|
49
|
+
def login( username='guest', password='guest')
|
50
|
+
qos = "<qos>
|
51
|
+
<securityService type='htpasswd' version='1.0'>
|
52
|
+
<![CDATA[
|
53
|
+
<user>#{username}</user>
|
54
|
+
<passwd>#{password}</passwd>
|
55
|
+
]]>
|
56
|
+
</securityService>
|
57
|
+
<session timeout='30000' maxSessions='99' clearSessions='false' />
|
58
|
+
</qos>"
|
59
|
+
@audit.debug( "XmlbasterClient: authenticate.connect QoS = #{qos}" )
|
60
|
+
returnQos = @proxy.call("authenticate.connect", qos)
|
61
|
+
@audit.debug( "XmlblasterClient:: authenticate.connect returnQos = #{returnQos}" )
|
62
|
+
xml = REXML::Document.new(returnQos)
|
63
|
+
@sessionId = xml.elements["//session"].attributes["sessionId"]
|
64
|
+
end
|
65
|
+
|
66
|
+
def logout
|
67
|
+
begin
|
68
|
+
returnValue = @proxy.call("authenticate.logout", @sessionId)
|
69
|
+
@audit.info( "==> ::LOGOUT:: <== Success with sessionID #{@sessionId}, return Value: #{returnValue.to_s}" )
|
70
|
+
rescue => e
|
71
|
+
@audit.warn( "XMLBlasterClient: Error logging out: #{e}" )
|
72
|
+
raise e
|
73
|
+
end
|
74
|
+
return true
|
75
|
+
end
|
76
|
+
|
77
|
+
def publish( xmlKey, content, qos )
|
78
|
+
begin
|
79
|
+
returnValue = @proxy.call("xmlBlaster.publish", @sessionId, xmlKey, content, qos )
|
80
|
+
@audit.info( "==> ::PUBLISH:: <== Success publishing with sessionID #{@sessionId}")
|
81
|
+
rescue => e
|
82
|
+
@audit.warn( "XMLBlasterClient: Error publishing to MOM: #{e}" )
|
83
|
+
raise e
|
84
|
+
end
|
85
|
+
return true
|
86
|
+
end
|
87
|
+
|
88
|
+
def get( xmlKey, qos )
|
89
|
+
begin
|
90
|
+
returnValue = @proxy.call("xmlBlaster.get", @sessionId, xmlKey, qos )
|
91
|
+
@audit.info( "==> ::GET:: <== Success get with sessionID #{@sessionId}" )
|
92
|
+
rescue => e
|
93
|
+
@audit.warn( "XMLBlasterClient: Error get from MOM: #{e}" )
|
94
|
+
raise e
|
95
|
+
end
|
96
|
+
return returnValue
|
97
|
+
end
|
98
|
+
|
99
|
+
def erase( xmlKey, qos )
|
100
|
+
begin
|
101
|
+
returnValue = @proxy.call("xmlBlaster.erase", @sessionId, xmlKey, qos )
|
102
|
+
@audit.info( "==> ::ERASE:: <== Success get with sessionID #{@sessionId}" )
|
103
|
+
rescue XMLRPC::FaultException => e
|
104
|
+
@audit.warn( "XMLBlasterClient: Error erase from MOM: #{e}" )
|
105
|
+
raise e
|
106
|
+
end
|
107
|
+
return true
|
108
|
+
end
|
109
|
+
|
110
|
+
def printMessage( messages )
|
111
|
+
@audit.info( "Received #{messages.length} messages.")
|
112
|
+
messages.each{ | message |
|
113
|
+
key = message[0]
|
114
|
+
content = message[1]
|
115
|
+
qos = message[2]
|
116
|
+
@audit.info " Key = " + key.to_s
|
117
|
+
@audit.info " Content = " + content.lenght + " bytes"
|
118
|
+
@audit.info " QOS = " + qos.to_s
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -4,17 +4,19 @@ unless defined? ADAPTOR_ROOT
|
|
4
4
|
ADAPTOR_ROOT = File.expand_path(File.dirname(__FILE__) + '/..')
|
5
5
|
end
|
6
6
|
|
7
|
-
|
7
|
+
args = ARGV
|
8
|
+
mom = "druby"
|
8
9
|
ARGV.each do |arg|
|
9
|
-
if arg[0..
|
10
|
-
|
10
|
+
if arg[0..3] == "MOM="
|
11
|
+
mom = arg[4..arg.length]
|
12
|
+
args = ARGV.reject{|p| p == "MOM=#{mom}"}
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
16
|
require 'yaml'
|
15
|
-
config = YAML::load(File.open("#{ADAPTOR_ROOT}/config/mom.yml"))[
|
17
|
+
config = YAML::load(File.open("#{ADAPTOR_ROOT}/config/mom.yml"))[mom]
|
16
18
|
|
17
|
-
case
|
19
|
+
case mom
|
18
20
|
when "druby"
|
19
21
|
require 'drb'
|
20
22
|
|
@@ -25,11 +27,13 @@ case config["mom"]["type"]
|
|
25
27
|
|
26
28
|
when "xmlblaster"
|
27
29
|
require "rubygems"
|
28
|
-
require "adaptation
|
30
|
+
require "adaptation"
|
31
|
+
require "adaptation/xmlblaster/xmlblaster_client"
|
29
32
|
|
30
33
|
xbc = XmlblasterClient.new(config["mom"]["host"], config["mom"]["port"])
|
31
|
-
xbc.login( "
|
32
|
-
|
34
|
+
xbc.login( config["mom"]["publish_user"], config["mom"]["publish_password"] )
|
35
|
+
puts args
|
36
|
+
xbc.publish( "<key oid='#{args[0]}' contentMime='text/xml'/>", args[1] , "<qos></qos>" )
|
33
37
|
xbc.logout
|
34
38
|
end
|
35
39
|
|
data/lib/commands/subscribe.rb
CHANGED
@@ -1,25 +1,82 @@
|
|
1
1
|
require 'adaptation'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
args = ARGV
|
4
|
+
mom = "druby"
|
5
|
+
ARGV.each do |arg|
|
6
|
+
if arg[0..3] == "MOM="
|
7
|
+
mom = arg[4..arg.length]
|
8
|
+
args = ARGV.reject{|p| p == "MOM=#{mom}"}
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
config = YAML::load(File.open("config/mom.yml"))[mom]
|
5
13
|
|
6
|
-
case
|
14
|
+
case mom
|
7
15
|
when "druby"
|
8
16
|
require 'adaptation/druby_subscriber'
|
9
17
|
|
10
18
|
mom_uri = "druby://#{config["mom"]["host"]}:#{config["mom"]["port"]}"
|
11
19
|
subscriber_uri = "druby://#{config["subscriber"]["host"]}:#{config["subscriber"]["port"]}"
|
12
|
-
topics = config["subscriber"]["topics"].split('
|
20
|
+
topics = config["subscriber"]["topics"].gsub(" ", "").split(',')
|
13
21
|
|
14
|
-
Signal.trap("INT") { puts "Shutting down subscriber (#{
|
22
|
+
Signal.trap("INT") { puts "Shutting down subscriber (#{mom})"; exit }
|
15
23
|
|
16
24
|
oapdaemon = Adaptation::Mom::DrubySubscriber.new subscriber_uri, mom_uri, topics
|
17
25
|
oapdaemon.start
|
18
26
|
|
19
|
-
|
20
|
-
|
27
|
+
when "xmlblaster"
|
28
|
+
require 'adaptation/xmlblaster/xmlblaster_callback_client'
|
29
|
+
|
30
|
+
xbcc = XmlblasterCallbackClient.new(
|
31
|
+
config["mom"]["host"],
|
32
|
+
config["mom"]["port"],
|
33
|
+
config["subscriber"]["host"],
|
34
|
+
config["subscriber"]["port"],
|
35
|
+
config["subscriber"]["public_host"],
|
36
|
+
config["subscriber"]["public_port"],
|
37
|
+
Logger.new("#{ADAPTOR_ROOT}/log/subscriber.log")
|
38
|
+
)
|
39
|
+
|
40
|
+
Signal.trap("INT") {
|
41
|
+
puts "Shutting down subscriber (#{mom})"
|
42
|
+
begin
|
43
|
+
xbcc.unsubscribe(
|
44
|
+
"<key oid='#{topic}'/>",
|
45
|
+
"<qos><persistent/><initialUpdate>false</initialUpdate>
|
46
|
+
<duplicateUpdates>false</duplicateUpdates><multiSubscribe>false</multiSubscribe>
|
47
|
+
<history numEntries='1'/></qos>"
|
48
|
+
)
|
49
|
+
rescue
|
50
|
+
end
|
51
|
+
xbcc.logout
|
52
|
+
exit
|
53
|
+
}
|
54
|
+
|
55
|
+
user = config["subscriber"]["subscriber_user"].nil? ? config["subscriber"]["host"] : config["subscriber"]["subscriber_user"]
|
56
|
+
password = config["subscriber"]["subscriber_password"].nil? ? "empty" : config["subscriber"]["subscriber_password"]
|
57
|
+
xbcc.login(user, password)
|
58
|
+
|
59
|
+
topics = (config["subscriber"]["topics"].nil? or config["subscriber"]["topics"] == "all") ? nil : config["subscriber"]["topics"].gsub(" ","").split(',')
|
60
|
+
if topics.nil?
|
61
|
+
xbcc.subscribe(
|
62
|
+
"<key oid='' queryType='XPATH'> /xmlBlaster/key[starts-with(@oid,'.')] </key>",
|
63
|
+
"<qos><persistent/><initialUpdate>false</initialUpdate>
|
64
|
+
<duplicateUpdates>false</duplicateUpdates><multiSubscribe>false</multiSubscribe>
|
65
|
+
<history numEntries='1'/></qos>"
|
66
|
+
)
|
67
|
+
else
|
68
|
+
topics.each do |topic|
|
69
|
+
xbcc.subscribe(
|
70
|
+
"<key oid='#{topic}'/>",
|
71
|
+
"<qos><persistent/><initialUpdate>false</initialUpdate>
|
72
|
+
<duplicateUpdates>false</duplicateUpdates><multiSubscribe>false</multiSubscribe>
|
73
|
+
<history numEntries='1'/></qos>"
|
74
|
+
)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
sleep
|
21
79
|
|
22
80
|
else
|
23
|
-
puts "Unknown MOM server type: #{
|
81
|
+
puts "Unknown MOM server type: #{mom}"
|
24
82
|
end
|
25
|
-
|
@@ -58,19 +58,18 @@ class AppGenerator < Rails::Generator::Base
|
|
58
58
|
#m.file "environments/test.rb", "config/environments/test.rb"
|
59
59
|
|
60
60
|
# Scripts
|
61
|
-
%w( generate destroy about subscribe breakpointer console ).each do |file|
|
61
|
+
%w( generate destroy about publish subscribe breakpointer console ).each do |file|
|
62
62
|
m.file "bin/#{file}", "script/#{file}", script_options
|
63
63
|
end
|
64
64
|
|
65
65
|
# Dispatches
|
66
66
|
m.file "dispatches/dispatch.rb", "public/dispatch.rb", script_options
|
67
|
-
m.file "dispatches/publish.rb", "public/publish.rb", script_options
|
68
67
|
|
69
68
|
# Docs
|
70
69
|
m.file "doc/README_FOR_APP", "doc/README_FOR_APP"
|
71
70
|
|
72
71
|
# Logs
|
73
|
-
%w(
|
72
|
+
%w(subscriber development test).each { |file|
|
74
73
|
m.file "configs/empty.log", "log/#{file}.log", :chmod => 0666
|
75
74
|
}
|
76
75
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adaptation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Xavi Vila Morell
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-01-
|
12
|
+
date: 2009-01-27 00:00:00 +01:00
|
13
13
|
default_executable: adaptation
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- bin/breakpointer
|
48
48
|
- bin/about
|
49
49
|
- bin/adaptation
|
50
|
+
- bin/publish
|
50
51
|
- bin/generate
|
51
52
|
- bin/console
|
52
53
|
- bin/mom
|
@@ -58,6 +59,10 @@ files:
|
|
58
59
|
- lib/adaptation/mom.rb
|
59
60
|
- lib/adaptation/message.rb
|
60
61
|
- lib/adaptation/adaptor.rb
|
62
|
+
- lib/adaptation/xmlblaster
|
63
|
+
- lib/adaptation/xmlblaster/xmlblaster_client.rb
|
64
|
+
- lib/adaptation/xmlblaster/xmlblaster_callback_server.rb
|
65
|
+
- lib/adaptation/xmlblaster/xmlblaster_callback_client.rb
|
61
66
|
- lib/adaptation/druby_subscriber.rb
|
62
67
|
- lib/adaptation/test
|
63
68
|
- lib/adaptation/test/fake_fixtures.rb
|
@@ -117,6 +122,7 @@ files:
|
|
117
122
|
- lib/commands/subscribe.rb
|
118
123
|
- lib/commands/destroy.rb
|
119
124
|
- lib/commands/generate.rb
|
125
|
+
- lib/commands/publish.rb
|
120
126
|
- helpers/application.rb
|
121
127
|
- helpers/test.rb
|
122
128
|
- helpers/publish.rb
|
@@ -129,7 +135,6 @@ files:
|
|
129
135
|
- configs/empty.log
|
130
136
|
- configs/boot.rb
|
131
137
|
- dispatches/dispatch.rb
|
132
|
-
- dispatches/publish.rb
|
133
138
|
- README
|
134
139
|
- CHANGELOG
|
135
140
|
- fresh_rakefile
|