riddl 0.99.105
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/AUTHORS +1 -0
- data/COPYING +165 -0
- data/INSTALL +24 -0
- data/README.rdoc +2 -0
- data/Rakefile +17 -0
- data/TODO +17 -0
- data/contrib/riddl.jpg +0 -0
- data/contrib/riddl.png +0 -0
- data/contrib/riddl.svg +138 -0
- data/lib/riddl/client.rb +423 -0
- data/lib/riddl/commonlogger.rb +16 -0
- data/lib/riddl/constants.rb +5 -0
- data/lib/riddl/error.rb +8 -0
- data/lib/riddl/handlers.rb +14 -0
- data/lib/riddl/handlers/oauth.rb +19 -0
- data/lib/riddl/handlers/plain-type.rb +21 -0
- data/lib/riddl/handlers/relaxng.rb +16 -0
- data/lib/riddl/handlers/xmlschema.rb +16 -0
- data/lib/riddl/header.rb +9 -0
- data/lib/riddl/implementation.rb +57 -0
- data/lib/riddl/ns/common-patterns/addon-security/request.xml +25 -0
- data/lib/riddl/ns/common-patterns/addon-security/response.xml +25 -0
- data/lib/riddl/ns/common-patterns/downloadify/1.0/downloadify.xml +18 -0
- data/lib/riddl/ns/common-patterns/notifications-consumer/1.0/consumer.xml +100 -0
- data/lib/riddl/ns/common-patterns/notifications-producer/1.0/producer.xml +204 -0
- data/lib/riddl/ns/common-patterns/properties/1.0/properties.schema.schema +140 -0
- data/lib/riddl/ns/common-patterns/properties/1.0/properties.schema.xsl +89 -0
- data/lib/riddl/ns/common-patterns/properties/1.0/properties.xml +150 -0
- data/lib/riddl/ns/common/datatypes-1_0.rng +79 -0
- data/lib/riddl/ns/common/relaxng-modular.rng +330 -0
- data/lib/riddl/ns/common/relaxng.rng +10 -0
- data/lib/riddl/ns/declaration/1.0/declaration.rng +114 -0
- data/lib/riddl/ns/description/1.0/description.rng +302 -0
- data/lib/riddl/option.rb +9 -0
- data/lib/riddl/parameter.rb +54 -0
- data/lib/riddl/protocols/http/generator.rb +121 -0
- data/lib/riddl/protocols/http/parser.rb +199 -0
- data/lib/riddl/protocols/websocket.rb +103 -0
- data/lib/riddl/protocols/xmpp/generator.rb +176 -0
- data/lib/riddl/protocols/xmpp/parser.rb +118 -0
- data/lib/riddl/roles.rb +15 -0
- data/lib/riddl/roles/http%3A%2F%2Foauth.net%2F1.0%2Faccess_token.rb +30 -0
- data/lib/riddl/roles/http%3A%2F%2Foauth.net%2F1.0%2Fon_behalf.rb +22 -0
- data/lib/riddl/roles/http%3A%2F%2Foauth.net%2F1.0%2Frequest_token.rb +30 -0
- data/lib/riddl/roles/http%3A%2F%2Foauth.net%2F1.0/base.rb +67 -0
- data/lib/riddl/server.rb +519 -0
- data/lib/riddl/utils/description.rb +29 -0
- data/lib/riddl/utils/downloadify.rb +14 -0
- data/lib/riddl/utils/erbserve.rb +23 -0
- data/lib/riddl/utils/fileserve.rb +31 -0
- data/lib/riddl/utils/notifications_producer.rb +310 -0
- data/lib/riddl/utils/properties.rb +474 -0
- data/lib/riddl/utils/xsloverlay.rb +21 -0
- data/lib/riddl/wrapper.rb +280 -0
- data/lib/riddl/wrapper/declaration.rb +103 -0
- data/lib/riddl/wrapper/declaration/facade.rb +94 -0
- data/lib/riddl/wrapper/declaration/interface.rb +34 -0
- data/lib/riddl/wrapper/declaration/tile.rb +107 -0
- data/lib/riddl/wrapper/description.rb +69 -0
- data/lib/riddl/wrapper/description/access.rb +108 -0
- data/lib/riddl/wrapper/description/message_and_transformation.rb +131 -0
- data/lib/riddl/wrapper/description/resource.rb +271 -0
- data/lib/riddl/wrapper/layerchecker.rb +33 -0
- data/lib/riddl/wrapper/messageparser.rb +221 -0
- data/lib/riddl/wrapper/resourcechecker.rb +98 -0
- data/ns/common-patterns/addon-security/request.xml +25 -0
- data/ns/common-patterns/addon-security/response.xml +25 -0
- data/ns/common-patterns/downloadify/1.0/downloadify.xml +18 -0
- data/ns/common-patterns/notifications-consumer/1.0/consumer.xml +100 -0
- data/ns/common-patterns/notifications-producer/1.0/producer.xml +204 -0
- data/ns/common-patterns/properties/1.0/properties.schema.schema +140 -0
- data/ns/common-patterns/properties/1.0/properties.schema.xsl +89 -0
- data/ns/common-patterns/properties/1.0/properties.xml +150 -0
- data/ns/common/datatypes-1_0.rng +79 -0
- data/ns/common/relaxng-modular.rng +330 -0
- data/ns/common/relaxng.rng +10 -0
- data/ns/declaration/1.0/declaration.rng +114 -0
- data/ns/description/1.0/description.rng +302 -0
- data/riddl.gemspec +33 -0
- data/test/smartrunner.rb +48 -0
- data/test/tc_declaration-distributed.rb +79 -0
- data/test/tc_declaration-hybrid.rb +71 -0
- data/test/tc_declaration-local.rb +47 -0
- data/test/tc_helloworld.rb +17 -0
- data/test/tc_producer.rb +54 -0
- data/test/tc_properties.rb +72 -0
- data/tools/flash-policy-server.rb +12 -0
- data/tools/riddlcheck +36 -0
- data/tools/riddlcheck-1_0 +36 -0
- data/tools/riddlprocess +51 -0
- data/tools/riddlprocess-1_0 +51 -0
- metadata +291 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Riddl
|
|
2
|
+
module Utils
|
|
3
|
+
|
|
4
|
+
class XSLOverlay < Riddl::Implementation
|
|
5
|
+
def response
|
|
6
|
+
doc = if @p[0].value.class == String
|
|
7
|
+
XML::Smart::string(@p[0].value)
|
|
8
|
+
elsif @p[0].value.respond_to?(:read)
|
|
9
|
+
XML::Smart::string(@p[0].value.read)
|
|
10
|
+
else
|
|
11
|
+
nil
|
|
12
|
+
end
|
|
13
|
+
unless doc.nil?
|
|
14
|
+
doc.root.add_before "?xml-stylesheet", "href='#{@a[0]}' type='text/xsl'"
|
|
15
|
+
Riddl::Parameter::Complex.new("content",@p[0].mimetype,doc.to_s)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'open-uri'
|
|
3
|
+
gem 'xml-smart', '>= 0.3.0'
|
|
4
|
+
require 'xml/smart'
|
|
5
|
+
|
|
6
|
+
module Riddl
|
|
7
|
+
class Wrapper
|
|
8
|
+
class WrapperUtils
|
|
9
|
+
def get_resource_deep(path,pres)
|
|
10
|
+
#{{{
|
|
11
|
+
path.split('/').each do |pa|
|
|
12
|
+
next if pa == ""
|
|
13
|
+
if pres.resources.has_key?(pa)
|
|
14
|
+
pres = pres.resources[pa]
|
|
15
|
+
else
|
|
16
|
+
return nil
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
pres
|
|
20
|
+
#}}}
|
|
21
|
+
end
|
|
22
|
+
def rpaths(res,what)
|
|
23
|
+
#{{{
|
|
24
|
+
what += what == '' ? '/' : res.path
|
|
25
|
+
ret = [[what,res.recursive]]
|
|
26
|
+
res.resources.each do |name,r|
|
|
27
|
+
ret += rpaths(r,what == '/' ? what : what + '/')
|
|
28
|
+
end
|
|
29
|
+
ret.sort!
|
|
30
|
+
ret
|
|
31
|
+
#}}}
|
|
32
|
+
end
|
|
33
|
+
protected :rpaths, :get_resource_deep
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
require File.expand_path(File.dirname(__FILE__) + '/wrapper/description')
|
|
39
|
+
require File.expand_path(File.dirname(__FILE__) + '/wrapper/declaration')
|
|
40
|
+
require File.expand_path(File.dirname(__FILE__) + '/wrapper/messageparser')
|
|
41
|
+
require File.expand_path(File.dirname(__FILE__) + '/wrapper/resourcechecker')
|
|
42
|
+
require File.expand_path(File.dirname(__FILE__) + '/wrapper/layerchecker')
|
|
43
|
+
require File.expand_path(File.dirname(__FILE__) + '/error')
|
|
44
|
+
require File.expand_path(File.dirname(__FILE__) + '/handlers')
|
|
45
|
+
require File.expand_path(File.dirname(__FILE__) + '/roles')
|
|
46
|
+
|
|
47
|
+
module Riddl
|
|
48
|
+
class Wrapper
|
|
49
|
+
#{{{
|
|
50
|
+
VERSION_MAJOR = 1
|
|
51
|
+
VERSION_MINOR = 0
|
|
52
|
+
VERSION = "#{VERSION_MAJOR}.#{VERSION_MINOR}"
|
|
53
|
+
DESCRIPTION = "http://riddl.org/ns/description/#{VERSION}"
|
|
54
|
+
DECLARATION = "http://riddl.org/ns/declaration/#{VERSION}"
|
|
55
|
+
XINCLUDE = "http://www.w3.org/2001/XInclude"
|
|
56
|
+
DESCRIPTION_FILE = "#{File.dirname(__FILE__)}/ns/description/#{VERSION_MAJOR}.#{VERSION_MINOR}/description.rng"
|
|
57
|
+
DECLARATION_FILE = "#{File.dirname(__FILE__)}/ns/declaration/#{VERSION_MAJOR}.#{VERSION_MINOR}/declaration.rng"
|
|
58
|
+
COMMON = "datatypeLibrary=\"http://www.w3.org/2001/XMLSchema-datatypes\" xmlns=\"#{DESCRIPTION}\" xmlns:xi=\"http://www.w3.org/2001/XInclude\""
|
|
59
|
+
CHECK = "<element name=\"check\" datatypeLibrary=\"http://www.w3.org/2001/XMLSchema-datatypes\" xmlns=\"http://relaxng.org/ns/structure/1.0\"><data/></element>"
|
|
60
|
+
#}}}
|
|
61
|
+
|
|
62
|
+
def initialize(name,get_description=false)
|
|
63
|
+
#{{{
|
|
64
|
+
@doc = nil
|
|
65
|
+
|
|
66
|
+
fpath = nil
|
|
67
|
+
if name.is_a?(XML::Smart::Dom)
|
|
68
|
+
@doc = name
|
|
69
|
+
else
|
|
70
|
+
begin
|
|
71
|
+
fh = name.respond_to?(:read) ? name : open(name)
|
|
72
|
+
@doc = XML::Smart.string(fh.read)
|
|
73
|
+
fh.close
|
|
74
|
+
fpath = File.dirname(fh.path) if fh.is_a?(File) || fh.is_a?(Tempfile)
|
|
75
|
+
rescue
|
|
76
|
+
begin
|
|
77
|
+
@doc = XML::Smart.string(name)
|
|
78
|
+
rescue
|
|
79
|
+
raise SpecificationError, "#{name.inspect} is no RIDDL description or declaration (neither a file, url or string)."
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
@doc.register_namespace 'x', XINCLUDE
|
|
84
|
+
@doc.find('//x:include/@href').each do |i|
|
|
85
|
+
if i.value =~ /^http:\/\/(www\.)?riddl\.org(\/ns\/common-patterns\/.*)/
|
|
86
|
+
t = File.expand_path(File.dirname(__FILE__)) + $2
|
|
87
|
+
i.value = t if File.exists?(t)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
fpath.nil? ? @doc.xinclude! : @doc.xinclude!(fpath)
|
|
91
|
+
@doc.register_namespace 'des', DESCRIPTION
|
|
92
|
+
@doc.register_namespace 'dec', DECLARATION
|
|
93
|
+
qname = @doc.root.qname
|
|
94
|
+
@is_description = qname.href == DESCRIPTION && qname.name == 'description'
|
|
95
|
+
@is_declaration = qname.href == DECLARATION && qname.name == 'declaration'
|
|
96
|
+
|
|
97
|
+
if @is_description && get_description
|
|
98
|
+
n = @doc.root.children
|
|
99
|
+
if n.empty?
|
|
100
|
+
@doc.root.add("message",:name=>"riddl-description-request").add("parameter",:name=>"riddl-description",:type=>"string")
|
|
101
|
+
@doc.root.add("message",:name=>"riddl-description-response").add("parameter",:name=>"riddl-description",:mimetype=>"text/xml")
|
|
102
|
+
else
|
|
103
|
+
n.first.add_before("message",:name=>"riddl-description-response").add("parameter",:name=>"riddl-description",:mimetype=>"text/xml")
|
|
104
|
+
n.first.add_before("message",:name=>"riddl-description-request").add("parameter",:name=>"riddl-description",:type=>"string")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
r = @doc.find("/des:description/des:resource")
|
|
108
|
+
unless r.empty?
|
|
109
|
+
n = r.first.children
|
|
110
|
+
if n.empty?
|
|
111
|
+
r.add("get",:in=>'riddl-description-request',:out=>'riddl-description-response')
|
|
112
|
+
else
|
|
113
|
+
n.first.add_before("get",:in=>'riddl-description-request',:out=>'riddl-description-response')
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
@declaration = @description = nil
|
|
118
|
+
#}}}
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def declaration
|
|
122
|
+
#{{{
|
|
123
|
+
if @is_declaration
|
|
124
|
+
@declaration = Riddl::Wrapper::Declaration.new(@doc)
|
|
125
|
+
end
|
|
126
|
+
@declaration
|
|
127
|
+
#}}}
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def description
|
|
131
|
+
#{{{
|
|
132
|
+
if @is_description
|
|
133
|
+
@description = Riddl::Wrapper::Description.new(@doc)
|
|
134
|
+
end
|
|
135
|
+
@description
|
|
136
|
+
#}}}
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def role(path) #{{{
|
|
140
|
+
description
|
|
141
|
+
declaration
|
|
142
|
+
return @description.get_resource(path).role if @is_description
|
|
143
|
+
return @declaration.get_resource(path).role if @is_declaration
|
|
144
|
+
nil
|
|
145
|
+
end #}}}
|
|
146
|
+
|
|
147
|
+
def io_messages(path,operation,params,headers)
|
|
148
|
+
#{{{
|
|
149
|
+
description
|
|
150
|
+
declaration
|
|
151
|
+
|
|
152
|
+
req = @description.get_resource(path).access_methods if @is_description
|
|
153
|
+
req = @declaration.get_resource(path).composition if @is_declaration
|
|
154
|
+
|
|
155
|
+
mp = MessageParser.new(params,headers)
|
|
156
|
+
if req.has_key?(operation)
|
|
157
|
+
if @is_description
|
|
158
|
+
r = req[operation][0]
|
|
159
|
+
r.select{|o|o.class==Riddl::Wrapper::Description::RequestInOut}.each do |o|
|
|
160
|
+
return IOMessages.new(o.in, o.out) if mp.check(o.in)
|
|
161
|
+
end
|
|
162
|
+
r.select{|o|o.class==Riddl::Wrapper::Description::RequestTransformation}.each do |o|
|
|
163
|
+
# TODO guess structure from input, create new output structure
|
|
164
|
+
return IOMessages.new(Riddl::Wrapper::Description::Star.new, Riddl::Wrapper::Description::Star.new)
|
|
165
|
+
end
|
|
166
|
+
r.select{|o|o.class==Riddl::Wrapper::Description::RequestStarOut}.each do |o|
|
|
167
|
+
return IOMessages.new(Riddl::Wrapper::Description::Star.new, o.out)
|
|
168
|
+
end
|
|
169
|
+
r.select{|o|o.class==Riddl::Wrapper::Description::RequestPass}.each do |o|
|
|
170
|
+
return IOMessages.new(Riddl::Wrapper::Description::Star.new, Riddl::Wrapper::Description::Star.new)
|
|
171
|
+
end
|
|
172
|
+
r.select{|o|o.class==Riddl::Wrapper::Description::WebSocket}.each do |o|
|
|
173
|
+
return IOMessages.new(nil,nil,nil,o.result.interface)
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
if @is_declaration
|
|
177
|
+
r = req[operation]
|
|
178
|
+
r.select{|o|o.result.class==Riddl::Wrapper::Description::RequestInOut}.each do |o|
|
|
179
|
+
return IOMessages.new(o.result.in, o.result.out, o.route, o.result.interface) if mp.check(o.result.in)
|
|
180
|
+
end
|
|
181
|
+
r.select{|o|o.result.class==Riddl::Wrapper::Description::RequestTransformation}.each do |o|
|
|
182
|
+
# TODO guess structure from input, create new output structure
|
|
183
|
+
return IOMessages.new(Riddl::Wrapper::Description::Star.new, Riddl::Wrapper::Description::Star.new, o.route, o.result.interface)
|
|
184
|
+
end
|
|
185
|
+
r.select{|o|o.result.class==Riddl::Wrapper::Description::RequestStarOut}.each do |o|
|
|
186
|
+
return IOMessages.new(Riddl::Wrapper::Description::Star.new, o.result.out, o.route, o.result.interface)
|
|
187
|
+
end
|
|
188
|
+
r.select{|o|o.result.class==Riddl::Wrapper::Description::RequestPass}.each do |o|
|
|
189
|
+
return IOMessages.new(Riddl::Wrapper::Description::Star.new, Riddl::Wrapper::Description::Star.new, o.route, o.result.interface)
|
|
190
|
+
end
|
|
191
|
+
r.select{|o|o.result.class==Riddl::Wrapper::Description::WebSocket}.each do |o|
|
|
192
|
+
return IOMessages.new(nil,nil,nil,o.result.interface)
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
return nil
|
|
197
|
+
#}}}
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def check_message(params,headers,message)
|
|
201
|
+
description
|
|
202
|
+
declaration
|
|
203
|
+
#{{{
|
|
204
|
+
return true if message.class == Riddl::Wrapper::Description::Star
|
|
205
|
+
return true if message.nil? && params == []
|
|
206
|
+
mp = MessageParser.new(params,headers)
|
|
207
|
+
mp.check(message,true)
|
|
208
|
+
#}}}
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def validate!
|
|
212
|
+
#{{{
|
|
213
|
+
if @is_description
|
|
214
|
+
xval = @doc.validate_against(XML::Smart.open_unprotected(DESCRIPTION_FILE))
|
|
215
|
+
xchk = ResourceChecker.new(@doc).check
|
|
216
|
+
puts xchk.join("\n") unless xchk.empty?
|
|
217
|
+
return xval && xchk.empty?
|
|
218
|
+
end
|
|
219
|
+
if @is_declaration
|
|
220
|
+
xval = @doc.validate_against(XML::Smart.open_unprotected(DECLARATION_FILE))
|
|
221
|
+
xchk = LayerChecker.new(@doc).check
|
|
222
|
+
puts xchk.join("\n") unless xchk.empty?
|
|
223
|
+
return xval && xchk.empty?
|
|
224
|
+
end
|
|
225
|
+
nil
|
|
226
|
+
#}}}
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def load_necessary_handlers!
|
|
230
|
+
#{{{
|
|
231
|
+
@doc.find("//des:parameter/@handler").map{|h|h.to_s}.uniq.each do |h|
|
|
232
|
+
if File.exists?(File.dirname(__FILE__) + '/handlers/' + File.basename(h) + ".rb")
|
|
233
|
+
require File.expand_path(File.dirname(__FILE__) + '/handlers/' + File.basename(h))
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
#}}}
|
|
237
|
+
end
|
|
238
|
+
def load_necessary_roles!
|
|
239
|
+
#{{{
|
|
240
|
+
@doc.find("//des:resource/@role").map{|h|h.to_s}.uniq.each do |h|
|
|
241
|
+
h = Protocols::HTTP::Generator::escape(h)
|
|
242
|
+
if File.exists?(File.dirname(__FILE__) + '/roles/' + h + '.rb')
|
|
243
|
+
require File.expand_path(File.dirname(__FILE__) + '/roles/' + h)
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
#}}}
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def paths
|
|
250
|
+
#{{{
|
|
251
|
+
description
|
|
252
|
+
declaration
|
|
253
|
+
tmp = []
|
|
254
|
+
tmp = @description.paths if @is_description
|
|
255
|
+
tmp = @declaration.paths if @is_declaration
|
|
256
|
+
tmp.map do |t|
|
|
257
|
+
[t[0],Regexp.new("^" + t[0].gsub(/\{\}/,"[^/]+") + (t[1] ? '\/?' : '\/?$'))]
|
|
258
|
+
end
|
|
259
|
+
#}}}
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
class IOMessages
|
|
263
|
+
#{{{
|
|
264
|
+
def initialize(min,mout,route=nil,interface=nil)
|
|
265
|
+
@in = min
|
|
266
|
+
@out = mout
|
|
267
|
+
@route = route
|
|
268
|
+
@interface = interface
|
|
269
|
+
end
|
|
270
|
+
def route?
|
|
271
|
+
!(route.nil? || route.empty?)
|
|
272
|
+
end
|
|
273
|
+
attr_reader :in, :out, :route, :interface
|
|
274
|
+
#}}}
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def declaration?; @is_declaration; end
|
|
278
|
+
def description?; @is_description; end
|
|
279
|
+
end
|
|
280
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/description')
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/declaration/tile')
|
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/declaration/facade')
|
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/declaration/interface')
|
|
5
|
+
|
|
6
|
+
module Riddl
|
|
7
|
+
class Wrapper
|
|
8
|
+
class Declaration < WrapperUtils
|
|
9
|
+
|
|
10
|
+
def get_resource(path)
|
|
11
|
+
get_resource_deep(path,@facade.resource)
|
|
12
|
+
end
|
|
13
|
+
def paths
|
|
14
|
+
rpaths(@facade.resource,'')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def description_xml
|
|
18
|
+
@facade.description_xml
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def description
|
|
22
|
+
Riddl::Wrapper.new(@facade.description_xml)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def visualize_tiles_and_layers
|
|
26
|
+
#{{{
|
|
27
|
+
@tiles.each_with_index do |til,index|
|
|
28
|
+
puts "### Tile #{index} " + ("#" * 60)
|
|
29
|
+
til.visualize :layers
|
|
30
|
+
end
|
|
31
|
+
#}}}
|
|
32
|
+
end
|
|
33
|
+
def visualize_tiles_and_compositions
|
|
34
|
+
#{{{
|
|
35
|
+
@tiles.each_with_index do |til,index|
|
|
36
|
+
puts "### Tile #{index} " + ("#" * 60)
|
|
37
|
+
til.visualize :composition
|
|
38
|
+
end
|
|
39
|
+
#}}}
|
|
40
|
+
end
|
|
41
|
+
def visualize_facade(res=@facade.resource,what='')
|
|
42
|
+
#{{{
|
|
43
|
+
what += res.path
|
|
44
|
+
puts what
|
|
45
|
+
res.composition.each do |k,v|
|
|
46
|
+
puts " #{k.to_s.upcase}:"
|
|
47
|
+
v.each do |r|
|
|
48
|
+
puts " #{r.result.class.name.gsub(/[^\:]+::/,'')}: #{r.result.visualize}"
|
|
49
|
+
r.route.each do |ritem|
|
|
50
|
+
puts " #{ritem.class.name.gsub(/[^\:]+::/,'')}: #{ritem.visualize}"
|
|
51
|
+
end unless r.route.nil?
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
res.resources.each do |key,r|
|
|
55
|
+
visualize_facade(r,what + (what == '/' ? '' : '/'))
|
|
56
|
+
end
|
|
57
|
+
#}}}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def initialize(riddl)
|
|
61
|
+
@facade = Riddl::Wrapper::Declaration::Facade.new
|
|
62
|
+
#{{{
|
|
63
|
+
### create single tiles
|
|
64
|
+
@tiles = []
|
|
65
|
+
@interfaces = {}
|
|
66
|
+
riddl.find("/dec:declaration/dec:interface").each do |int|
|
|
67
|
+
@interfaces[int.attributes['name']] = [int.attributes['location'],int.find("des:description").first]
|
|
68
|
+
end
|
|
69
|
+
riddl.find("/dec:declaration/dec:facade/dec:tile").each do |tile|
|
|
70
|
+
@tiles << (til = Tile.new)
|
|
71
|
+
res = til.base_path(tile.attributes['path'] || '/')
|
|
72
|
+
# res.clean! # for overlapping tiles, each tile gets an empty path TODO
|
|
73
|
+
tile.find("dec:layer").each_with_index do |layer,index|
|
|
74
|
+
apply_to = layer.find("dec:apply-to")
|
|
75
|
+
block = layer.find("dec:block")
|
|
76
|
+
|
|
77
|
+
lname = layer.attributes['name']
|
|
78
|
+
lpath, des = @interfaces[lname]
|
|
79
|
+
desres = des.find("des:resource").first
|
|
80
|
+
if apply_to.empty?
|
|
81
|
+
int = Interface.new(lname,"/",lpath,"/",des)
|
|
82
|
+
rec = desres.attributes['recursive']
|
|
83
|
+
til.add_description(des,desres,"/",index,int,block,rec)
|
|
84
|
+
else
|
|
85
|
+
apply_to.each do |at|
|
|
86
|
+
int = Interface.new(lname,at.to_s,lpath,"/",des)
|
|
87
|
+
til.add_description(des,desres,at.to_s,index,int,block)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
til.compose!
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
### merge tiles into a facade
|
|
95
|
+
@tiles.each do |til|
|
|
96
|
+
@facade.merge_tiles(til.resource)
|
|
97
|
+
end
|
|
98
|
+
#}}}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
module Riddl
|
|
2
|
+
class Wrapper
|
|
3
|
+
class Declaration < WrapperUtils
|
|
4
|
+
|
|
5
|
+
class Facade
|
|
6
|
+
def initialize
|
|
7
|
+
@resource = Riddl::Wrapper::Description::Resource.new("/")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def description_xml
|
|
11
|
+
#{{{
|
|
12
|
+
result = ""
|
|
13
|
+
messages = {}
|
|
14
|
+
names = []
|
|
15
|
+
messages_result = ""
|
|
16
|
+
description_result = ""
|
|
17
|
+
description_xml_priv(result,messages,0)
|
|
18
|
+
messages.each do |hash,mess|
|
|
19
|
+
t = mess.content.dup
|
|
20
|
+
name = mess.name
|
|
21
|
+
name += '_' while names.include?(name)
|
|
22
|
+
t.root.attributes['name'] = name
|
|
23
|
+
messages_result << t.root.dump + "\n"
|
|
24
|
+
end
|
|
25
|
+
XML::Smart.string("<description #{Riddl::Wrapper::COMMON}>\n\n" + description_result + messages_result.gsub(/^/,' ') + "\n" + result + "\n</description>").to_s
|
|
26
|
+
#}}}
|
|
27
|
+
end
|
|
28
|
+
def description_xml_priv(result,messages,level,res=@resource)
|
|
29
|
+
#{{{
|
|
30
|
+
s = " " * (level + 1)
|
|
31
|
+
t = " " * (level + 2)
|
|
32
|
+
result << s + "<resource#{res.path != '/' && res.path != '{}' ? " relative=\"#{res.path}\"" : ''}#{res.recursive ? " recursive=\"true\"" : ''}>\n"
|
|
33
|
+
res.composition.each do |k,v|
|
|
34
|
+
v.each do |m|
|
|
35
|
+
m = m.result
|
|
36
|
+
if %w{get post put delete websocket}.include?(k)
|
|
37
|
+
result << t + "<#{k} "
|
|
38
|
+
else
|
|
39
|
+
result << t + "<request method=\"#{k}\" "
|
|
40
|
+
end
|
|
41
|
+
case m
|
|
42
|
+
when Riddl::Wrapper::Description::RequestInOut
|
|
43
|
+
messages[m.in.hash] ||= m.in
|
|
44
|
+
result << "in=\"#{messages[m.in.hash].name}\""
|
|
45
|
+
unless m.out.nil?
|
|
46
|
+
messages[m.out.hash] ||= m.out
|
|
47
|
+
result << " out=\"#{messages[m.out.hash].name}\""
|
|
48
|
+
end
|
|
49
|
+
when Riddl::Wrapper::Description::RequestStarOut
|
|
50
|
+
result << "in=\"*\""
|
|
51
|
+
unless m.out.nil?
|
|
52
|
+
messages[m.out.hash] ||= m.out
|
|
53
|
+
result << " out=\"#{messages[m.out.hash].name}\""
|
|
54
|
+
end
|
|
55
|
+
when Riddl::Wrapper::Description::RequestPass
|
|
56
|
+
messages[m.pass.hash] ||= m.pass
|
|
57
|
+
result << "pass=\"#{messages[m.pass.hash].name}\""
|
|
58
|
+
when Riddl::Wrapper::Description::RequestTransformation
|
|
59
|
+
messages[m.trans.hash] ||= m.trans
|
|
60
|
+
result << "transformation=\"#{messages[m.trans.hash].name}\""
|
|
61
|
+
end
|
|
62
|
+
result << "/>\n"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
res.resources.each do |k,v|
|
|
66
|
+
description_xml_priv(result,messages,level+1,v)
|
|
67
|
+
end
|
|
68
|
+
""
|
|
69
|
+
result << s + "</resource>\n"
|
|
70
|
+
#}}}
|
|
71
|
+
end
|
|
72
|
+
private :description_xml_priv
|
|
73
|
+
|
|
74
|
+
def merge_tiles(res,fac=@resource)
|
|
75
|
+
#{{{
|
|
76
|
+
res.composition.each do |method,s|
|
|
77
|
+
fac.composition[method] ||= []
|
|
78
|
+
fac.composition[method] += s
|
|
79
|
+
end
|
|
80
|
+
res.resources.each do |path,r|
|
|
81
|
+
unless fac.resources.has_key?(path)
|
|
82
|
+
fac.resources[path] = Riddl::Wrapper::Description::Resource.new(path,r.recursive)
|
|
83
|
+
end
|
|
84
|
+
merge_tiles(r,fac.resources[path])
|
|
85
|
+
end
|
|
86
|
+
#}}}
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
attr_reader :resource
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|