c3s 0.4.2 → 0.4.3a
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/Manifest +0 -18
- data/Rakefile +1 -1
- data/c3s.gemspec +2 -2
- data/lib/c3s.rb +1 -1
- data/lib/component.rb +10 -5
- data/lib/model.rb +35 -1
- data/lib/pubsub/subscriber.rb +31 -4
- data/lib/republisher.rb +33 -30
- metadata +5 -5
data/Manifest
CHANGED
@@ -12,22 +12,4 @@ lib/pubsub/nodetracker.rb
|
|
12
12
|
lib/pubsub/publisher.rb
|
13
13
|
lib/pubsub/subscriber.rb
|
14
14
|
lib/republisher.rb
|
15
|
-
pkg/c3s-0.4.1.gem
|
16
|
-
pkg/c3s-0.4.1.tar.gz
|
17
|
-
pkg/c3s-0.4.1/Manifest
|
18
|
-
pkg/c3s-0.4.1/README.rdoc
|
19
|
-
pkg/c3s-0.4.1/Rakefile
|
20
|
-
pkg/c3s-0.4.1/c3s.gemspec
|
21
|
-
pkg/c3s-0.4.1/lib/c3s.rb
|
22
|
-
pkg/c3s-0.4.1/lib/c3s_logger.rb
|
23
|
-
pkg/c3s-0.4.1/lib/component.rb
|
24
|
-
pkg/c3s-0.4.1/lib/component_connection.rb
|
25
|
-
pkg/c3s-0.4.1/lib/configreader.rb
|
26
|
-
pkg/c3s-0.4.1/lib/databaseadapter.rb
|
27
|
-
pkg/c3s-0.4.1/lib/model.rb
|
28
|
-
pkg/c3s-0.4.1/lib/pubsub/node.rb
|
29
|
-
pkg/c3s-0.4.1/lib/pubsub/nodetracker.rb
|
30
|
-
pkg/c3s-0.4.1/lib/pubsub/publisher.rb
|
31
|
-
pkg/c3s-0.4.1/lib/pubsub/subscriber.rb
|
32
|
-
pkg/c3s-0.4.1/lib/republisher.rb
|
33
15
|
Manifest
|
data/Rakefile
CHANGED
data/c3s.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{c3s}
|
5
|
-
s.version = "0.4.
|
5
|
+
s.version = "0.4.3a"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Ricardo Otero"]
|
9
|
-
s.date = %q{2010-
|
9
|
+
s.date = %q{2010-11-10}
|
10
10
|
s.description = %q{C3s library gem.}
|
11
11
|
s.email = %q{oterosantos@gmail.com}
|
12
12
|
s.extra_rdoc_files = ["README.rdoc", "lib/c3s.rb", "lib/c3s_logger.rb", "lib/component.rb", "lib/component_connection.rb", "lib/configreader.rb", "lib/databaseadapter.rb", "lib/model.rb", "lib/pubsub/node.rb", "lib/pubsub/nodetracker.rb", "lib/pubsub/publisher.rb", "lib/pubsub/subscriber.rb", "lib/republisher.rb"]
|
data/lib/c3s.rb
CHANGED
data/lib/component.rb
CHANGED
@@ -125,12 +125,17 @@ module C3s
|
|
125
125
|
end
|
126
126
|
|
127
127
|
changed = true
|
128
|
-
|
128
|
+
if self.is_a?(ActiveRecord::Base)
|
129
|
+
object = self.model.find_by_jid(data[:jid]) || self.model.new
|
129
130
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
131
|
+
$LOG.info "Saving #{config['name']} context for #{data[:jid]} #{data.inspect}"
|
132
|
+
object.update_attributes(data)
|
133
|
+
changed = object.changed?
|
134
|
+
object.save!
|
135
|
+
else
|
136
|
+
object = self.model.new
|
137
|
+
object.update_attributes(data)
|
138
|
+
end
|
134
139
|
|
135
140
|
if object.errors.count == 0
|
136
141
|
$LOG.info "Publishing data to node #{config['name']}:#{data[:jid]} (data changed: #{changed})"
|
data/lib/model.rb
CHANGED
@@ -1,10 +1,44 @@
|
|
1
1
|
require 'active_record'
|
2
2
|
|
3
3
|
module C3sModel
|
4
|
+
def self.included(base)
|
5
|
+
if !base.ancestors.include?(ActiveRecord::Base)
|
6
|
+
base.class_eval do
|
7
|
+
cattr_accessor :attrs
|
8
|
+
def attributes
|
9
|
+
attr_hash = {}
|
10
|
+
attrs.each do |a|
|
11
|
+
attr_hash[a.to_s] = self.send(a.to_s) if self.respond_to?(a.to_s)
|
12
|
+
end
|
13
|
+
attr_hash
|
14
|
+
end
|
15
|
+
|
16
|
+
def attributes=(att, guard_protected_attributes)
|
17
|
+
att.each do |key, val|
|
18
|
+
self.attrs << key.to_s
|
19
|
+
self.send("#{key.to_s}=", val) if self.respond_to?(key.to_s)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
base.extend(ClassMethods)
|
25
|
+
end
|
26
|
+
|
27
|
+
module ClassMethods
|
28
|
+
def attribute(attribute)
|
29
|
+
self.attrs ||= []
|
30
|
+
self.attrs << attribute.to_s
|
31
|
+
attr_accessor attribute
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
4
35
|
##
|
5
36
|
# Attributes ignored and not included on model xml by default
|
6
37
|
IGNORE_ATTR = ["created_at", "updated_at", "id", "jid"]
|
7
38
|
|
39
|
+
def is_AR?
|
40
|
+
end
|
41
|
+
|
8
42
|
##
|
9
43
|
# Updates multiple attributes at once
|
10
44
|
# attributes:: [Hash] the attributes hash
|
@@ -57,6 +91,6 @@ module C3sModel
|
|
57
91
|
##
|
58
92
|
# Returns a default namespace based on class name
|
59
93
|
def xmlns
|
60
|
-
"http://c3s.
|
94
|
+
"http://c3s.av.it.pt/#{self._class_name}"
|
61
95
|
end
|
62
96
|
end
|
data/lib/pubsub/subscriber.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'xmpp4r/pubsub'
|
2
|
+
require 'xmpp4r/pubsub/iq/pubsub'
|
2
3
|
require 'pubsub/nodetracker'
|
3
4
|
|
4
5
|
module C3s
|
@@ -15,16 +16,42 @@ module C3s
|
|
15
16
|
end
|
16
17
|
|
17
18
|
##
|
18
|
-
# Subscribes to collection node.
|
19
|
+
# Subscribes to a collection node.
|
19
20
|
# nodename:: [String] the node name
|
20
21
|
def subscribe_collection(nodename, options={})
|
21
|
-
|
22
|
-
|
22
|
+
$LOG.info "Going to subscribe #{nodename}"
|
23
|
+
iq = basic_pubsub_query(:set)
|
24
|
+
sub = REXML::Element.new('subscribe')
|
25
|
+
sub.attributes['node'] = nodename
|
26
|
+
sub.attributes['jid'] = @client.config['jid']
|
27
|
+
iq.pubsub.add(sub)
|
28
|
+
|
29
|
+
# Set the options to subscribe collection node
|
23
30
|
options = {
|
24
31
|
'pubsub#subscription_type' => options[:subscription_type] || 'items',
|
25
32
|
'pubsub#subscription_depth' => options[:subscription_depth] || 'all'
|
26
33
|
}
|
27
|
-
|
34
|
+
iq.pubsub.add(Jabber::PubSub::SubscriptionConfig.new(nodename, @client.jid, options))
|
35
|
+
|
36
|
+
res = nil
|
37
|
+
@client.send_with_id(iq) do |reply|
|
38
|
+
pubsubanswer = reply.pubsub
|
39
|
+
if pubsubanswer.first_element('subscription')
|
40
|
+
res = PubSub::Subscription.import(pubsubanswer.first_element('subscription'))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
res
|
44
|
+
end
|
45
|
+
|
46
|
+
def basic_pubsub_query(type,ownerusecase = false)
|
47
|
+
iq = Jabber::Iq.new(type, @client.config['pubsub'])
|
48
|
+
if ownerusecase
|
49
|
+
iq.add(Jabber::PubSub::IqPubSubOwner.new)
|
50
|
+
else
|
51
|
+
iq.add(Jabber::PubSub::IqPubSub.new)
|
52
|
+
end
|
53
|
+
iq.from = @client.jid
|
54
|
+
iq
|
28
55
|
end
|
29
56
|
|
30
57
|
##
|
data/lib/republisher.rb
CHANGED
@@ -12,6 +12,14 @@ module C3s
|
|
12
12
|
super()
|
13
13
|
end
|
14
14
|
|
15
|
+
##
|
16
|
+
# When connects our republisher must subscribe nodes from which
|
17
|
+
# will receive context.
|
18
|
+
def connect
|
19
|
+
super
|
20
|
+
#subscribe_nodes()
|
21
|
+
end
|
22
|
+
|
15
23
|
##
|
16
24
|
# Block the set iqs because this provider doesn't receive iq's
|
17
25
|
# directly to set the information.
|
@@ -27,50 +35,45 @@ module C3s
|
|
27
35
|
|
28
36
|
##
|
29
37
|
# Subscribes to all nodes
|
30
|
-
#
|
31
38
|
def subscribe_nodes
|
32
39
|
@subscribing_nodes.each do |node|
|
33
40
|
begin
|
34
41
|
@subscriber.subscribe_collection(node)
|
35
42
|
rescue Exception => e
|
36
|
-
$LOG.error "Could not subscribe to node #{node}"
|
43
|
+
$LOG.error "Could not subscribe to node #{node} (#{e.inspect})"
|
37
44
|
next
|
38
45
|
end
|
39
46
|
end
|
40
47
|
end
|
41
48
|
|
42
49
|
##
|
43
|
-
# Handles messages.
|
50
|
+
# Handles messages. I only deal with pubsub messages (publication notify)
|
44
51
|
# and pubsub events (most likely).
|
52
|
+
# msg:: The message received
|
45
53
|
def handle_msg(msg)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
# This must be implemented on the republisher
|
66
|
-
# because the strategy may vary from component to component.
|
67
|
-
republish(c3snode, item)
|
68
|
-
end
|
69
|
-
t.join
|
70
|
-
rescue Exception => e
|
71
|
-
$LOG.error "Error on published item: #{e}"
|
72
|
-
end
|
54
|
+
event = msg.first_element("event")
|
55
|
+
return if !event.kind_of?(Jabber::PubSub::Event)
|
56
|
+
event.each_element("//items/") do |items|
|
57
|
+
c3snode = C3s::Node.new(items.attributes['node'])
|
58
|
+
next unless c3snode
|
59
|
+
handle_items_publication(items)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# Handles the publicated items and the republishing on new node(s)
|
65
|
+
def handle_items_publication(items)
|
66
|
+
items.each_element("//item/") do |item|
|
67
|
+
begin
|
68
|
+
c3snode.provider = config['name'] # TODO - assuming that provider_name.eql?(pubsub_root_nodes)
|
69
|
+
t = Thread.new do
|
70
|
+
# This must be implemented on the republisher
|
71
|
+
# because the strategy may vary from component to component.
|
72
|
+
republish(c3snode, item)
|
73
73
|
end
|
74
|
+
t.join
|
75
|
+
rescue Exception => e
|
76
|
+
$LOG.error "Error on published item: #{e}"
|
74
77
|
end
|
75
78
|
end
|
76
79
|
rescue Exception => e
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: c3s
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 3450203
|
5
|
+
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 3a
|
10
|
+
version: 0.4.3a
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ricardo Otero
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-11-10 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|